📄 campaign.cpp
字号:
/***************************************************************************\
UI_Cmpgn.cpp
Peter Ward
December 3, 1996
Main UI screen stuff for falcon
\***************************************************************************/
#include <windows.h>
#include "falclib.h"
#include "targa.h"
#include "dxutil\ddutil.h"
#include "Graphics\Include\imagebuf.h"
#include "Graphics\Include\matrix.h"
#include "Graphics\Include\drawbsp.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "cmusic.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 "find.h"
#include "cmpclass.h"
#include "division.h"
#include "misseval.h"
#include "campstr.h"
#include "team.h"
#include "history.h"
#include "falcuser.h"
#include "f4find.h"
#include "timerthread.h"
#include "f4error.h"
#include "cmap.h"
#include "uicomms.h"
#include "ui_cmpgn.h"
#include "cstores.h"
#include "cbsplist.h"
#include "c3dview.h"
#include "Graphics\Include\loader.h"
#include "gps.h"
#include "userids.h"
#include "textids.h"
#include "FalcSess.h"
#include "Campaign.h"
#include "Falclib\Include\ui.h"
#include "icondefs.h"
#include "teamdata.h"
#include "DispCfg.h"
#include "ACSelect.h"
#include "playerop.h"
#include "urefresh.h"
#include "teamdata.h"
void CampHackButton1CB(long ID,short hittype,C_Base *control);
void CampHackButton2CB(long ID,short hittype,C_Base *control);
void CampHackButton3CB(long ID,short hittype,C_Base *control);
void CampHackButton4CB(long ID,short hittype,C_Base *control);
void CampHackButton5CB(long ID,short hittype,C_Base *control);
GlobalPositioningSystem *gGps=NULL;
int StupidHackToCloseCSECT=0;
extern C_Handler *gMainHandler;
extern C_Parser *gMainParser;;
extern int MainLastGroup;
extern int CPLoaded,COLoaded;
extern int CampaignLastGroup,TacLastGroup;
extern BOOL gNewMessage;
extern IMAGE_RSC *gOccupationMap;
extern long StopLookingforMission;
extern C_Base *CurMapTool;
extern int gTimeModeServer;
extern OBJECTINFO Recon;
extern long gRefreshScoresList;
extern VU_ID gCurrentFlightID; // Current Mission Flight (Mission Window) Also sets gSelectedFlight
extern VU_ID gPlayerFlightID; // Flight Player is in (NULL) if not in a flight
extern short gPlayerPlane; // Player's current slot
extern VU_ID gActiveFlightID; // Current Selected Waypoint flight
extern short gActiveWPNum; // Current Waypoint
extern VU_ID gSelectedFlightID; // Last flight Selected (in ATO,OOB,Mission etc)
extern VU_ID gLoadoutFlightID; // Currnet flight being Loaded with weapons
extern VU_ID gSelectedEntity;
extern VU_ID gInterceptersId;
extern RulesClass CurrRules;
extern long ShowGameOverWindow;
//LISTBOX *gTaskList=NULL;
VU_ID ReconFlightID=FalconNullId;
int ReconWPNum=0;
int gAWWTimeout = 0;
int gMoveBattalion = FALSE;
C_3dViewer *gUIViewer=NULL;
extern C_TreeList *gATOAll,*gATOPackage,*gOOBTree,*gVCTree;
extern short g3dObjectID;
long LastForceCatID=0;
extern uchar *te_restore_map;
short InCleanup=0;
extern uchar gSelectedTeam;
extern IMAGE_RSC *PAKMap;
#ifdef DEBUG
extern int gPlayerPilotLock;
#endif
// HISTORY (JSTARS) Variables
static long JStarsFirst=0;
static long JStarsLast=0;
static long JStarsCurrent=0;
static long JStarsPrevious=0;
static long JStarsDirection=0;
static long JStarsDelay=0;
void EndGameEvaluation();
void UI_Help_Guide_CB(long ID,short hittype,C_Base *ctrl);
void add_all_vcs_to_ui();
void UpdateSierraHotel();
void PositionCamera(OBJECTINFO *Info,C_Window *win,long client);
void CampaignAutoSave(FalconGameType gametype);
void PlayUIMovie(long ID);
void PlayUIMusic();
void PlayCampaignMusic();
void ViewTimerCB(long ID,short hittype,C_Base *control);
void ViewObjectCB(long ID,short hittype,C_Base *control);
void MoveViewTimerCB(long ID,short hittype,C_Base *control);
void PositionSlider(C_Slider *slider,long value,long minv,long maxv);
void ClearMapToolStates(long ID);
void CheckCampaignFlyButton();
void DisplayView(long ID,short hittype,C_Base *control);
static void HookupCampaignControls(long ID);
void RemoveMissionCB(TREELIST *item);
static void MapMgrDrawCB(long ID,short hittype,C_Base *control);
static void MapMgrMoveCB(long ID,short hittype,C_Base *control);
void GotoPrevWaypointCB(long ID,short hittype,C_Base *control);
void GotoNextWaypointCB(long ID,short hittype,C_Base *control);
void UpdateWaypointWindowInfo(C_Window *win,WayPoint wp,int wpnum, int flag=TRUE);
void Uni_Float(_TCHAR *buffer);
void DelSTRFileCB(long ID,short hittype,C_Base *control);
void DelDFSFileCB(long ID,short hittype,C_Base *control);
void DelLSTFileCB(long ID,short hittype,C_Base *control);
void DelCamFileCB(long ID,short hittype,C_Base *control);
void DelTacFileCB(long ID,short hittype,C_Base *control);
void DelTGAFileCB(long ID,short hittype,C_Base *control);
void DelVHSFileCB(long ID,short hittype,C_Base *control);
void DelKeyFileCB(long ID,short hittype,C_Base *control);
void SetDeleteCallback(void (*cb)(long,short,C_Base*));
void CampaignSoundEventCB();
void CampaignListCB();
void TacEngListCB();
void ACMIButtonCB(long ID,short hittype,C_Base *control);
void SetupOOBWindow();
void CleanupTacticalEngagementUI(void);
void UpdateIntelBarCB(long ID,short hittype,C_Base *control);
void MakeOccupationMap(IMAGE_RSC *Map);
void UpdateIntel(long ID);
short GetFlightStatusID(Flight element);
void RefreshEventList();
void FindMissionInBriefing(long ID);
void RefreshMapEventList(long winID, long client);
void do_tactical_debrief();
void SelectMissionSortCB(long ID,short hittype,C_Base *control);
void SetSingle_Comms_Ctrls();
void SelectScenarioCB(long ID,short hittype,C_Base *control);
void OpenLogBookCB(long ID,short hittype,C_Base *control);
void LoadCommsWindows();
void GenericTimerCB(long ID,short hittype,C_Base *control);
void RefreshGameListCB(long ID,short hittype,C_Base *control);
void BlinkCommsButtonTimerCB(long ID,short hittype,C_Base *control);
void LoadCommonWindows();
long gLastUpdateGround=0l,gLastUpdateAir=0;
extern int mcnt,atocnt,uintcnt;
void OpenMunitionsWindowCB(long ID,short hittype,C_Base *control);
void OpenSetupCB(long ID,short hittype,C_Base *control);
void SaveAFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*));
void UpdateMissionList(long ID,VU_ID squadronID);
void TallyPlayerSquadrons();
void SetupUnitInfoWindow(VU_ID unitID);
void SetBullsEye(C_Window *);
void SetSlantRange(C_Window *);
void ACMIButtonCB(long ID,short hittype,C_Base *control);
void OpenTacticalReferenceCB(long ID,short hittype,C_Base *control);
void Cancel_Scramble_CB(long ID, short hittype, C_Base *control);
void LoadTroopMovementHistory();
void LoadForceLevelHistory();
void SetupSquadronInfoWindow(VU_ID TheID);
void PriorityTabsCB(long ID,short hittype,C_Base *control);
void UsePriotityCB(long ID,short hittype,C_Base *control);
void ResetPriorityCB(long ID,short hittype,C_Base *control);
void CancelPriorityCB(long ID,short hittype,C_Base *control);
void MapSelectPAKCB(long ID,short hittype,C_Base *control);
void SelectPAKCB(long ID,short hittype,C_Base *control);
void SetPAKPriorityCB(long ID,short hittype,C_Base *control);
void InitPAKNames();
BOOL PAKMapTimerCB(C_Base *me);
void SetCampaignPrioritiesCB(long ID,short hittype,C_Base *base);
void OpenPriorityCB(long ID,short hittype,C_Base *control);
static void OpenCampaignCB(long ID,short hittype,C_Base *control);
void ShutdownCampaign (void);
void gMapMgr_TACmover (long ID,short hittype,C_Base *control);
void SetupTacEngMenus(short Mode);
void SetupCampaignMenus();
void SetMapSettings();
void ValidateWayPoints (Flight flt);
void InitVCArgLists();
void CleanupVCArgLists();
void CloseWindowCB(long ID,short hittype,C_Base *control);
void InitTimeCompressionBox(long compression);
void AreYouSure(long TitleID,long MessageID,void (*OkCB)(long,short,C_Base*),void (*CancelCB)(long,short,C_Base*));
void AreYouSure(long TitleID,_TCHAR *text,void (*OkCB)(long,short,C_Base*),void (*CancelCB)(long,short,C_Base*));
BOOL CheckExclude(_TCHAR *filename,_TCHAR *directory,_TCHAR *ExcludeList[],_TCHAR *extension);
void VerifyDelete(long TitleID, void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*));
UI_Refresher *FindMissionItem(Flight flight);
void MakeTacEngScoreList();
void UpdateRemoteCompression();
static void CloseCampaignWindowCB(long ID,short hittype,C_Base *control);
int tactical_is_training (void);
void UpdateVCs();
_TCHAR *CampExcludeList[]=
{
"Save0",
"Save1",
"Save2",
"Instant",
NULL,
};
void OpenHistoryWindowCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
LoadTroopMovementHistory();
gMainHandler->EnableWindowGroup(control->GetGroup());
}
void OpenForceLevelsWindowCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
LoadForceLevelHistory();
gMainHandler->EnableWindowGroup(control->GetGroup());
}
void ActivateCampMissionSchedule()
{
C_Window *win;
C_Button *btn;
win=gMainHandler->FindWindow(CB_MAIN_SCREEN);
if(win)
{
btn=(C_Button*)win->FindControl(MISSION_MAIN_CTRL);
if(btn)
OpenCampaignCB(btn->GetID(),C_TYPE_LMOUSEUP,btn);
}
}
void OpenOOBWindowCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
SetCursor(gCursors[CRSR_WAIT]);
gMainHandler->EnableWindowGroup(control->GetGroup());
gGps->SetAllowed(gGps->GetAllowed() | UR_OOB);
long curtime=GetCurrentTime();
gGps->Update();
MonoPrint("GPS: OOB Allow time = %1ld\n",GetCurrentTime() - curtime);
SetCursor(gCursors[CRSR_F16]);
}
void OpenSquadronWindowCB(long,short hittype,C_Base *)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
SetupSquadronInfoWindow(FalconLocalSession->GetPlayerSquadronID());
}
void OpenSierraHotelCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
UpdateSierraHotel();
gMainHandler->EnableWindowGroup(control->GetGroup());
}
void BuildCampBrief (C_Window *win);
void BuildCampDebrief (C_Window *win);
void DeleteGroupList(long ID);
void UpdateMissionWindow(long ID);
void CreateATOList(long ID);
void PickCampaignPlaneCB(long ID,short hittype,C_Base *control);
int CompressCampaignUntilTakeoff (Flight flight);
void CancelCampaignCompression (void);
extern void SetTimeCompression (int newComp);
BOOL ReadyToPlayMovie=FALSE;
BOOL MovieQInUse=FALSE;
_TCHAR *OrdinalString(long value);
C_Map *gMapMgr=NULL;
extern CampaignTime gOldCompressTillTime;
extern CampaignTime gOldCompressionRatio;
extern int targetCompressionRatio;
extern CampaignTime gCompressTillTime;
enum
{
SND_SCREAM =500005,
SND_BAD1 =500006,
SND_SECOND =500007,
SND_FIRST =500008,
SND_NICE =500009,
SND_BAD2 =500010,
SND_YOUSUCK =500011,
SND_TAKEOFF =500023,
SND_CAMPAIGN =500024,
SND_LIBYA =500025,
SND_AMBIENT =500033,
CSM1 =400134,
};
long CampEventSoundID;
enum
{
MOVIE_Q_SIZE=15,
};
long MovieQTime[MOVIE_Q_SIZE];
long MovieQ[MOVIE_Q_SIZE];
_TCHAR MovieQDesc[MOVIE_Q_SIZE][80];
long MovieCount=0;
short MovieY=5;
static BOOL NewEvents=FALSE;
void ViewTimerCB(long,short,C_Base *control)
{
if(control->GetFlags() & C_BIT_ABSOLUTE)
{
control->Parent_->RefreshWindow();
}
else
control->Parent_->RefreshClient(control->GetClient());
}
void ViewTimerAnimCB(long,short,C_Base *control)
{
if(control->GetUserNumber(_UI95_TIMER_COUNTER_) < 1)
{
if(control->GetFlags() & C_BIT_ABSOLUTE)
{
control->Parent_->RefreshWindow();
}
else
control->Parent_->RefreshClient(control->GetClient());
control->SetUserNumber(_UI95_TIMER_COUNTER_,control->GetUserNumber(_UI95_TIMER_DELAY_));
}
control->SetUserNumber(_UI95_TIMER_COUNTER_,control->GetUserNumber(_UI95_TIMER_COUNTER_)-1);
}
void UI_UpdateEventList()
{
if(gMainHandler)
NewEvents=TRUE;
}
void StartMovieQ()
{
if(gMainHandler && ReadyToPlayMovie && !MovieQInUse)
if(MovieCount > 0)
PostMessage(gMainHandler->GetAppWnd(),FM_PLAY_UI_MOVIE,0,0);
}
void StartAMovieCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
PostMessage(gMainHandler->GetAppWnd(),FM_REPLAY_UI_MOVIE,0,control->GetUserNumber(0));
}
void InitNewFlash()
{
C_Window *win;
C_Button *btn;
DeleteGroupList(NEWS_FLASH_WIN);
win=gMainHandler->FindWindow(CP_SUA);
if(win)
{
btn=(C_Button*)win->FindControl(NEWS_FLASH);
if(btn)
{
btn->Refresh();
btn->SetFlagBitOn(C_BIT_INVISIBLE);
}
}
}
void AddToNewsWindow(long timestamp,_TCHAR *desc,long MovieID)
{
_TCHAR buffer[100];
C_Window *win;
C_Button *btn;
if(!gMainHandler)
return;
win=gMainHandler->FindWindow(NEWS_FLASH_WIN);
if(win)
{
_stprintf(buffer,"%02ld:%02ld %s",(timestamp/(60*60*1000))%24,(timestamp/(60*1000))%60,desc);
btn=new C_Button;
btn->Setup(C_DONT_CARE,C_TYPE_NORMAL,5,MovieY);
btn->SetText(C_STATE_0,buffer);
btn->SetText(C_STATE_1,buffer);
btn->SetColor(C_STATE_0,0xeeeeee);
btn->SetColor(C_STATE_1,0x00ff00);
btn->SetFont(win->Font_);
btn->SetFlagBitOn(C_BIT_USELINE);
btn->SetClient(1);
btn->SetUserNumber(0,MovieID);
btn->SetCallback(StartAMovieCB);
btn->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
win->AddControl(btn);
win->ScanClientArea(1);
win->RefreshClient(1);
MovieY=static_cast<short>(MovieY + btn->GetH()+2);
}
win=gMainHandler->FindWindow(CP_SUA);
if(win)
{
btn=(C_Button*)win->FindControl(NEWS_FLASH);
if(btn)
{
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn->Refresh();
}
}
}
void PlayUIMovieQ()
{
int i;
if(gMainHandler && ReadyToPlayMovie && !MovieQInUse)
{
MovieQInUse=1;
while(MovieCount > 0)
{
TheCampaign.Suspend();
PlayUIMovie(MovieQ[0]);
TheCampaign.Resume();
AddToNewsWindow(MovieQTime[0],MovieQDesc[0],MovieQ[0]);
for(i=1;i<MovieCount;i++)
{
MovieQTime[i-1]=MovieQTime[i];
MovieQ[i-1]=MovieQ[i];
memcpy(MovieQDesc[i-1],MovieQDesc[i],80*sizeof(_TCHAR));
}
MovieQTime[i-1]=0;
MovieQ[i-1]=0;
memset(MovieQDesc[i-1],0,80*sizeof(_TCHAR));
MovieCount--;
}
// KCK: When we're done playing the last movie, exit the campaign
if (TheCampaign.EndgameResult)
PostMessage(FalconDisplay.appWin,FM_CAMPAIGN_OVER,TheCampaign.EndgameResult,0);
MovieQInUse=0;
}
}
void ReplayUIMovie(long MovieID)
{
if(gMainHandler && ReadyToPlayMovie && !MovieQInUse)
{
MovieQInUse=1;
TheCampaign.Suspend();
PlayUIMovie(MovieID);
TheCampaign.Resume();
MovieQInUse=0;
}
}
// KCK: This timer will close the Attack Warning Window after a few minutes
void CloseAWWWindowTimer (void)
{
gAWWTimeout -= UI_TIMER_INTERVAL;
Flight interceptors = (Flight) vuDatabase->Find(gInterceptersId);
// KCK: Close the window on timeout, interceptor death, or interceptor takeoff
if (gAWWTimeout < 0 || !interceptors) // || interceptors->Moving())
{
Cancel_Scramble_CB(0, C_TYPE_LMOUSEUP, NULL);
}
}
void UI_HandleAirbaseDestroyed()
{
C_Window *win;
SetTimeCompression(1);
UpdateRemoteCompression();
win=gMainHandler->FindWindow(CP_COUNTDOWN_WIN);
if(win)
gMainHandler->HideWindow(win);
}
void UI_HandleFlightCancel()
{
C_Window *win;
SetTimeCompression(1);
UpdateRemoteCompression();
win=gMainHandler->FindWindow(CP_COUNTDOWN_WIN);
if(win)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -