⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 campaign.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/***************************************************************************\
	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 + -