📄 events.cpp
字号:
/***************************************************************************\
UI_IA.cpp
Peter Ward
December 3, 1996
Main UI screen stuff for falcon
\***************************************************************************/
#include <windows.h>
#include "entity.h"
#include "feature.h"
#include "vehicle.h"
#include "evtparse.h"
#include "Mesg.h"
#include "MsgInc\DamageMsg.h"
#include "MsgInc\WeaponFireMsg.h"
#include "MsgInc\DeathMessage.h"
#include "MsgInc\MissileEndMsg.h"
#include "MsgInc\LandingMessage.h"
#include "MsgInc\EjectMsg.h"
#include "MsgInc\PlayerStatusMsg.h"
#include "PlayerOp.h"
#include "classtbl.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "acmi\src\include\acmirec.h"
#include "ui_ia.h"
#include "events.h"
#include "userids.h"
#include "textids.h"
#include "MissEval.h"
#include "CampStr.h"
// External function prototypes
_TCHAR *UI_WordWrap(C_Window *win,_TCHAR *str,long fontid,short width,BOOL *status);
void DeleteGroupList( long ID );
// ==================================
// Global sorted event list
// ==================================
EventElement *SortedEventList=NULL;
// ==================================
// Event list maintenance routines
// ==================================
void AddtoEventList(EventElement *theEvent)
{
EventElement *cur,*last=NULL,*newone;
while (theEvent)
{
newone = new EventElement;
newone->next = NULL;
newone->eventTime = theEvent->eventTime;
newone->vuIdData1 = theEvent->vuIdData1;
newone->vuIdData2 = theEvent->vuIdData2;
strcpy(newone->eventString,theEvent->eventString);
cur = SortedEventList;
while (cur && cur->eventTime < newone->eventTime)
{
last = cur;
cur = cur->next;
}
if (last)
{
newone->next = cur;
last->next = newone;
}
else
{
newone->next = SortedEventList;
SortedEventList = newone;
}
theEvent = theEvent->next;
}
}
void ClearSortedEventList()
{
EventElement *cur,*last;
cur=SortedEventList;
while(cur)
{
last=cur;
cur=cur->next;
delete last;
}
SortedEventList=NULL;
}
// ==================================================
// The thing which makes the list and adds to windows
// ==================================================
static void AddMessageToWindow(C_Window *win, long client, int *y, CampaignTime eventtime, _TCHAR *eventstr)
{
C_Text *txt;
_TCHAR time_str[80];
int wrap_w;
// Add it to window
// Do time string
GetTimeString(eventtime, time_str);
txt=new C_Text;
txt->Setup(C_DONT_CARE,C_TYPE_LEFT);
txt->SetFixedWidth(_tcsclen(time_str)+1);
txt->SetText(time_str);
txt->SetXY(45,*y);
txt->SetFlagBitOn(C_BIT_RIGHT);
txt->SetFGColor(0x00f0f0f0);
txt->SetFont(win->Font_);
txt->SetFlagBitOn(C_BIT_LEFT);
txt->SetClient(static_cast<short>(client));
win->AddControl(txt);
// Do event string
wrap_w = win->ClientArea_[client].right-win->ClientArea_[client].left - 48;
txt=new C_Text;
txt->Setup(C_DONT_CARE,C_TYPE_LEFT);
txt->SetFixedWidth(_tcsclen(eventstr)+1);
txt->SetXY(48,*y);
txt->SetW(wrap_w);
txt->SetFGColor(0x00f0f0f0);
txt->SetFont(win->Font_);
txt->SetFlagBitOn(C_BIT_LEFT|C_BIT_WORDWRAP);
txt->SetClient(static_cast<short>(client));
txt->SetText(eventstr);
win->AddControl(txt);
*y+=txt->GetH();
}
// ProcessEventList now simply builds an ordered event list from the MissionEvaluator
// and add the messages to a window
void ProcessEventList(C_Window *win,long client)
{
EventElement *cur;
FlightDataClass *flight_data;
PilotDataClass *pilot_data;
int i,y=0;
// Build an event list from the MissionEvaluator class
flight_data = TheCampaign.MissionEvaluator->flight_data;
while (flight_data)
{
AddtoEventList(flight_data->root_event);
pilot_data = flight_data->pilot_list;
while (pilot_data)
{
for (i=0;i<pilot_data->weapon_types;i++)
AddtoEventList(pilot_data->weapon_data[i].root_event);
pilot_data = pilot_data->next_pilot;
}
flight_data = flight_data->next_flight;
}
cur=SortedEventList;
while(cur)
{
AddMessageToWindow(win,client,&y,cur->eventTime,cur->eventString);
cur=cur->next;
}
// KCK: Peter suggested we move this to somewhere else
ClearSortedEventList();
win->ScanClientArea(client);
win->RefreshWindow();
}
// ProcessEventList now simply builds an ordered event list from the MissionEvaluator
// and add the messages to a window
// This is called by ACMI Import which is also responible for
// cleaning up the sorted list
EventElement * ProcessEventListForACMI(void)
{
FlightDataClass *flight_data;
PilotDataClass *pilot_data;
int i;//,y=0;
// Build an event list from the MissionEvaluator class
flight_data = TheCampaign.MissionEvaluator->flight_data;
while (flight_data)
{
AddtoEventList(flight_data->root_event);
pilot_data = flight_data->pilot_list;
while (pilot_data)
{
for (i=0;i<pilot_data->weapon_types;i++)
AddtoEventList(pilot_data->weapon_data[i].root_event);
pilot_data = pilot_data->next_pilot;
}
flight_data = flight_data->next_flight;
}
return SortedEventList;
}
/*
** This is called by the ACMI UI where the events are being read off
** the tape as an array, not a linked list
*/
void ProcessEventArray(C_Window *win, void *events, int count )
{
C_Text *txt;
ACMITextEvent *evList,*cur;
_TCHAR *Time_str,*Message_str;
int y,fh,wrap_w;
int i;
evList=(ACMITextEvent *)events;
if(evList == NULL)
return;
DeleteGroupList( win->GetID() );
y=0;
fh=gFontList->GetHeight(win->Font_);
wrap_w=win->ClientArea_[0].right-win->ClientArea_[0].left - 40;
for ( i = 0; i < count; i++ )
{
cur = &evList[i];
Time_str = (_TCHAR *)cur->timeStr;
Message_str = (_TCHAR *)cur->msgStr;
txt=new C_Text;
txt->Setup(C_DONT_CARE,C_TYPE_LEFT);
txt->SetFixedWidth(_tcsclen(Time_str)+1);
txt->SetText(Time_str);
txt->SetXY(0,y);
txt->SetFGColor(0x0000ff00);
txt->SetFont(win->Font_);
txt->SetFlagBitOn(C_BIT_LEFT);
txt->SetUserNumber( 0, cur->intTime );
txt->SetUserNumber( _UI95_DELGROUP_SLOT_, _UI95_DELGROUP_ID_ );
win->AddControl(txt);
txt=new C_Text;
txt->Setup(C_DONT_CARE,C_TYPE_LEFT);
txt->SetFixedWidth(_tcsclen(Message_str)+1);
txt->SetXY(34,y);
txt->SetW(wrap_w);
txt->SetFGColor(0x00f0f0f0);
txt->SetFont(win->Font_);
txt->SetFlagBitOn(C_BIT_LEFT|C_BIT_WORDWRAP);
txt->SetUserNumber( _UI95_DELGROUP_SLOT_, _UI95_DELGROUP_ID_ );
txt->SetText(Message_str);
win->AddControl(txt);
y+=txt->GetH();
}
win->ScanClientArea(0);
win->RefreshWindow();
}
// Everything below here is out of date
#if 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -