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

📄 dogfight.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/***************************************************************************\
	UI_dfght.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 "chandler.h"
#include "ui95_ext.h"
#include "entity.h"
#include "feature.h"
#include "vehicle.h"
#include "evtparse.h"
#include "f4vu.h"
#include "falcsess.h"
#include "sim\include\stdhdr.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 "playerop.h"
#include "falcuser.h"
#include "falclib\include\f4find.h"
#include "f4error.h"
#include "team.h"
#include "uicomms.h"
#include "dogfight.h"
#include "userids.h"
#include "iconids.h"
#include "textids.h"
#include "CmpClass.h"
#include "campaign.h"
#include "classtbl.h"
#include "Dispcfg.h"
#include "iconids.h"
#include "logbook.h"
#include "ui_dgfgt.h"
#include "ACSelect.h"
#include "MissEval.h"
#include "Team.h"

#define _USE_REGISTRY_ 1 // 0=No,1=Yes

extern C_Handler *gMainHandler;
extern _TCHAR gUI_ScenarioName[];
extern VU_ID gCurrentFlightID;
extern short gCurrentAircraftNum;
extern int MainLastGroup;
extern int DFLoaded;
extern C_Parser *gMainParser;
extern C_TreeList *DogfightGames;
extern RulesClass CurrRules;

C_Base *gDogfightControl;
C_SoundBite *gDogfightBites=NULL;

// These are prototypes I need since the revision.
extern int CompressCampaignUntilTakeoff (Flight flight);
extern void StartCampaignGame (int local, int game_type);
extern void DisplayJoinStatusWindow (int);

void SetupInfoWindow(void (*tOkCB)(), void (*tCancelCB)());
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*));
void CloseWindowCB(long ID,short hittype,C_Base *control);
void ChangeTimeCB(long ID,short hittype,C_Base *control);
void CheckFlyButton();
void CheckDelButtons();
void GenericTimerCB(long ID,short hittype,C_Base *control);
void BlinkCommsButtonTimerCB(long ID,short hittype,C_Base *control);
void ClearDFTeamLists();
short ConvertDFIDtoTeam(long ID);
uchar GetPlaneListID(long ID);
long GetACIDFromFlight(Flight flight);
void DeleteGroupList(long ID);
void GameOver_WaitForEveryone();
void ProcessEventList(C_Window *win,long client);
void DisplayDogfightResults();
void PlayDogfightBite();
static void HookupDogFightControls(long ID);
static void SelectDFSettingsFileCB(long ID,short hittype,C_Base *control);
void SetSingle_Comms_Ctrls();
TREELIST *StartTreeSearch(VU_ID findme,TREELIST *top,C_TreeList *tree);
void GetFileListTree(C_TreeList *tree,_TCHAR *fspec,_TCHAR *excludelist[],long group,BOOL cutext,long UseMenu);
void LoadAFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*));
void SaveAFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*));
void SaveDogfightResults(char *filename);
void UI_Help_Guide_CB(long ID,short hittype,C_Base *ctrl);
BOOL DateCB(C_Base *me);
BOOL FileNameSortCB(TREELIST *list,TREELIST *newitem);
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 OpenTacticalReferenceCB(long ID,short hittype,C_Base *ctrl);
void OpenLogBookCB(long ID,short hittype,C_Base *ctrl);
void OpenCommsCB(long ID,short hittype,C_Base *ctrl);
void OpenSetupCB(long ID,short hittype,C_Base *ctrl);
void ACMIButtonCB(long ID,short hittype,C_Base *ctrl);

void RebuildGameTree();
void CreateDogfightCB (void);
void CancelDogfightCB (void);
void ReallyJoinDogfightCB (void);
void JoinDogfightCB (long ID,short hittype,C_Base *control);
void CopyDFSettingsToWindow (void);
void AddDogfightPlayerCB (long ID,short hittype,C_Base *control);

void AddDogfightAIPlane (Flight flight, int type, int skill, int team);
void LeaveDogfight (void);
void DogfightMenuSetup();

char gCurDogfightFile[MAX_PATH]="campaign\\save\\New Game.dfs";

_TCHAR *DFExcludeList[]=
{
	"New Game",
	NULL,
};

float MapXtoRatio (C_Cursor* crsr);
float MapYtoRatio (C_Cursor* crsr);
long RatiotoMapX (float ratio, C_Cursor* crsr);
long RatiotoMapY (float ratio, C_Cursor* crsr);

static short AddToTeam=0;

enum
{
	SND_SCREAM        =500005,
	SND_BAD1          =500006,
	SND_SECOND        =500007,
	SND_FIRST         =500008,
	SND_NICE          =500009,
	SND_BAD2          =500010,
	SND_YOUSUCK       =500011,
};

enum // Map Icon Res IDs
{
	BLUE_AIR_NORTH				=565121004,
	BLUE_AIR_NORTH_W			=565121005,
	BROWN_AIR_NORTH				=565121020,
	BROWN_AIR_NORTH_W			=565121021,
	GREEN_AIR_NORTH				=565121036,
	GREEN_AIR_NORTH_W			=565121037,
	GREY_AIR_NORTH				=565121052,
	GREY_AIR_NORTH_W			=565121053,
	ORANGE_AIR_NORTH			=565121068,
	ORANGE_AIR_NORTH_W			=565121069,
	RED_AIR_NORTH				=565121084,
	RED_AIR_NORTH_W				=565121085,
	WHITE_AIR_NORTH				=565121100,
	WHITE_AIR_NORTH_W			=565121101,
	YELLOW_AIR_NORTH			=565121116,
	YELLOW_AIR_NORTH_W			=565121117,
	ICON_F16	 	=10065,
	ICON_A10	 	=10066,
	ICON_AH64	 	=10067,
	ICON_AN2 		=10068,
	ICON_B52 		=10069,
	ICON_C130 		=10070,
	ICON_CH47 		=10071,
	ICON_F111		=10072,
	ICON_F117 		=10073,
	ICON_F14 		=10074,
	ICON_F15C 		=10075,
	ICON_F18 		=10076,
	ICON_F4 		=10077,
	ICON_F5 		=10078,
	ICON_IL28 		=10079,
	ICON_IL76 		=10080,
	ICON_KA50 		=10081,
	ICON_KC10 		=10082,
	ICON_KC135	 	=10083,
	ICON_MD500	 	=10084,
	ICON_MI24 		=10085,
	ICON_MIG19	 	=10086,
	ICON_MIG21	 	=10087,
	ICON_MIG23		=10088,
	ICON_MIG25	 	=10089,
	ICON_MIG29	 	=10090,
	ICON_OH58 		=10091,
	ICON_SU25 		=10092,
	ICON_SU27 		=10093,
	ICON_TU16N	 	=10094,
	ICON_UH1H 		=10095,
	ICON_UH60 		=10096,
	ICON_AN24	 	=10097,
	ICON_E3 		=10098,
	ICON_A50	 	=10099,
	ICON_F22        =10122,
	ICON_EA6B       =10123,
	ICON_TU95       =10124,
	ICON_B1B        =10125,
};

uchar calltable[5][5]=
{
	{   0,   0,   0,   0,   0 }, // UFO (No team)
	{ CRIMSON_CALL_GROUP1,  CRIMSON_CALL_GROUP2, CRIMSON_CALL_GROUP3, CRIMSON_CALL_GROUP4, CRIMSON_CALL_GROUP5 }, // crimson team
	{ SHARK_CALL_GROUP1,  SHARK_CALL_GROUP2, SHARK_CALL_GROUP3, SHARK_CALL_GROUP4, SHARK_CALL_GROUP5 }, // SHARK team
	{ VIPER_CALL_GROUP1,  VIPER_CALL_GROUP2, VIPER_CALL_GROUP3, VIPER_CALL_GROUP4, VIPER_CALL_GROUP5 }, // VIPER team
	{ TIGER_CALL_GROUP1,  TIGER_CALL_GROUP2, TIGER_CALL_GROUP3, TIGER_CALL_GROUP4, TIGER_CALL_GROUP5 }, // TIGER team
};

static long DFTeamIconResID[5][2]=
{
	{ WHITE_AIR_NORTH,WHITE_AIR_NORTH_W }, // UFO Team
	{ RED_AIR_NORTH,RED_AIR_NORTH_W }, // Crimson
	{ BLUE_AIR_NORTH,BLUE_AIR_NORTH_W }, // Shark
	{ WHITE_AIR_NORTH,WHITE_AIR_NORTH_W }, // Falcon Team Team
	{ ORANGE_AIR_NORTH,ORANGE_AIR_NORTH_W }, // Tiger
};

typedef struct
{
	long ID;
	uchar teamid;
	uchar planeid;
} DF_ID_PLANE;

DF_AIRPLANE_TYPE DFAIPlanes[]=
{
	NULL,NULL,NULL,NULL,DF_NO_AC,0,0,
	TYPE_AIRPLANE,  STYPE_AIR_ATTACK,        SPTYPE_A10,       STYPE_UNIT_ATTACK,			DF_AC_A10,         TXT_A10,        ICON_A10,
	TYPE_AIRPLANE,  STYPE_AIR_AWACS,         SPTYPE_A50,       STYPE_UNIT_AWACS,			DF_AC_A50,         TXT_A50,        ICON_A50,
//	TYPE_AIRPLANE,  STYPE_AIR_ATTACK,        SPTYPE_AC130U,    STYPE_UNIT_ATTACK,			DF_AC_AC130U,      TXT_AC130U,     ICON_C130,
	TYPE_HELICOPTER,STYPE_AIR_ATTACK_HELO,   SPTYPE_AH64,      STYPE_UNIT_ATTACK_HELO,		DF_AC_AH64,        TXT_AH64,       ICON_AH64,
	TYPE_HELICOPTER,STYPE_AIR_ATTACK_HELO,   SPTYPE_AH64D,     STYPE_UNIT_ATTACK_HELO,		DF_AC_AH64D,       TXT_AH64D,      ICON_AH64,
	TYPE_AIRPLANE,  STYPE_AIR_TRANSPORT,     SPTYPE_AN2,       STYPE_UNIT_AIR_TRANSPORT,	DF_AC_AN2,         TXT_AN2,        ICON_AN2,
	TYPE_AIRPLANE,  STYPE_AIR_TRANSPORT,     SPTYPE_AN24,      STYPE_UNIT_AIR_TRANSPORT,	DF_AC_AN24,        TXT_AN24,       ICON_AN24,
	TYPE_AIRPLANE,  STYPE_AIR_BOMBER,        SPTYPE_B1B,       STYPE_UNIT_BOMBER,			DF_AC_B1B,         TXT_B1B,        ICON_B1B,
	TYPE_AIRPLANE,  STYPE_AIR_BOMBER,        SPTYPE_B52G,      STYPE_UNIT_BOMBER,			DF_AC_B52G,        TXT_B52G,       ICON_B52,
	TYPE_AIRPLANE,  STYPE_AIR_TRANSPORT,     SPTYPE_C130,      STYPE_UNIT_AIR_TRANSPORT,	DF_AC_C130,        TXT_C130,       ICON_C130,
	TYPE_HELICOPTER,STYPE_AIR_TRANSPORT_HELO,SPTYPE_CH47,      STYPE_UNIT_TRANSPORT_HELO,	DF_AC_CH47,        TXT_CH47,       ICON_CH47,
	TYPE_AIRPLANE,  STYPE_AIR_AWACS,         SPTYPE_E3,        STYPE_UNIT_AWACS,			DF_AC_E3,          TXT_E3,         ICON_E3,
	TYPE_AIRPLANE,  STYPE_AIR_ECM,           SPTYPE_EA6B,      STYPE_UNIT_ECM,				DF_AC_EA6B,        TXT_EA6B,       ICON_F4,
	TYPE_AIRPLANE,  STYPE_AIR_ECM,           SPTYPE_EF111,     STYPE_UNIT_ECM,				DF_AC_EF111,       TXT_EF111,      ICON_F111,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_F4E,       STYPE_UNIT_FIGHTER,			DF_AC_F4E,         TXT_F4E,        ICON_F4,
	TYPE_AIRPLANE,  STYPE_AIR_ATTACK,        SPTYPE_F4G,       STYPE_UNIT_ATTACK,			DF_AC_F4G,         TXT_F4G,        ICON_F4,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_F5E,       STYPE_UNIT_FIGHTER,			DF_AC_F5E,         TXT_F5E,        ICON_F5,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_F14A,      STYPE_UNIT_FIGHTER,			DF_AC_F14A,        TXT_F14A,       ICON_F14,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_F15C,      STYPE_UNIT_FIGHTER,			DF_AC_F15C,        TXT_F15C,       ICON_F15C,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER_BOMBER,SPTYPE_F15E,      STYPE_UNIT_FIGHTER_BOMBER,	DF_AC_F15E,        TXT_F15E,       ICON_F15C,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER_BOMBER,SPTYPE_F16C,      STYPE_UNIT_FIGHTER_BOMBER,	DF_AC_F16C,        TXT_F16C,       ICON_F16,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER_BOMBER,SPTYPE_F18A,      STYPE_UNIT_FIGHTER_BOMBER,	DF_AC_F18A,        TXT_F18A,       ICON_F18,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER_BOMBER,SPTYPE_F18D,      STYPE_UNIT_FIGHTER_BOMBER,	DF_AC_F18D,        TXT_F18D,       ICON_F18,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_F22,       STYPE_UNIT_FIGHTER,			DF_AC_F22,         TXT_F22,        ICON_F22,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER_BOMBER,SPTYPE_F117,      STYPE_UNIT_FIGHTER_BOMBER,	DF_AC_F117,        TXT_F117,       ICON_F117,
	TYPE_AIRPLANE,  STYPE_AIR_ATTACK,        SPTYPE_FB111,     STYPE_UNIT_ATTACK,			DF_AC_FB111,       TXT_FB111,      ICON_F111,
	TYPE_AIRPLANE,  STYPE_AIR_ATTACK,        SPTYPE_IL28,      STYPE_UNIT_ATTACK,			DF_AC_IL28,        TXT_IL28,       ICON_IL28,
	TYPE_AIRPLANE,  STYPE_AIR_TRANSPORT,     SPTYPE_IL76M,     STYPE_UNIT_AIR_TRANSPORT,	DF_AC_IL76M,       TXT_IL76M,      ICON_IL76,
	TYPE_HELICOPTER,STYPE_AIR_ATTACK_HELO,   SPTYPE_KA50,      STYPE_UNIT_ATTACK_HELO,		DF_AC_KA50,        TXT_KA50,       ICON_KA50,
	TYPE_AIRPLANE,  STYPE_AIR_TANKER,        SPTYPE_KC10,      STYPE_UNIT_TANKER,			DF_AC_KC10,        TXT_KC10,       ICON_KC10,
	TYPE_AIRPLANE,  STYPE_AIR_TANKER,        SPTYPE_IL78,      STYPE_UNIT_TANKER,			DF_AC_IL78,        TXT_IL78,       ICON_IL76,
	TYPE_AIRPLANE,  STYPE_AIR_TANKER,        SPTYPE_KC135,     STYPE_UNIT_TANKER,			DF_AC_KC135,       TXT_KC135,      ICON_KC135,
	TYPE_HELICOPTER,STYPE_AIR_RECON_HELO,    SPTYPE_MD500,     STYPE_UNIT_RECON_HELO,		DF_AC_MD500,       TXT_MD500,      ICON_MD500,
	TYPE_HELICOPTER,STYPE_AIR_ATTACK_HELO,   SPTYPE_MI24,      STYPE_UNIT_ATTACK_HELO,		DF_AC_MI24,        TXT_MI24,       ICON_MI24,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_MIG19,     STYPE_UNIT_FIGHTER,			DF_AC_MIG19,       TXT_MIG19,      ICON_MIG19,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_MIG21,     STYPE_UNIT_FIGHTER,			DF_AC_MIG21,       TXT_MIG21,      ICON_MIG21,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_MIG23MS,   STYPE_UNIT_FIGHTER,			DF_AC_MIG23MS,     TXT_MIG23MS,    ICON_MIG23,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_MIG25,     STYPE_UNIT_FIGHTER,			DF_AC_MIG25,       TXT_MIG25,      ICON_MIG25,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_MIG29,     STYPE_UNIT_FIGHTER,			DF_AC_MIG29,       TXT_MIG29,      ICON_MIG29,
	TYPE_HELICOPTER,STYPE_AIR_RECON_HELO,    SPTYPE_OH58D,     STYPE_UNIT_RECON_HELO,		DF_AC_OH58D,       TXT_OH58D,      ICON_OH58,
	TYPE_AIRPLANE,  STYPE_AIR_ATTACK,        SPTYPE_SU25,      STYPE_UNIT_ATTACK,			DF_AC_SU25,        TXT_SU25,       ICON_SU25,
	TYPE_AIRPLANE,  STYPE_AIR_FIGHTER,       SPTYPE_SU27,      STYPE_UNIT_FIGHTER,			DF_AC_SU27,        TXT_SU27,       ICON_SU27,
	TYPE_AIRPLANE,  STYPE_AIR_BOMBER,        SPTYPE_TU16,      STYPE_UNIT_BOMBER,			DF_AC_TU16,        TXT_TU16,       ICON_TU16N,
	TYPE_AIRPLANE,  STYPE_AIR_TANKER,        SPTYPE_TU16N,     STYPE_UNIT_TANKER,			DF_AC_TU16N,       TXT_TU16N,      ICON_TU16N,
	TYPE_AIRPLANE,  STYPE_AIR_BOMBER,        SPTYPE_TU95,      STYPE_UNIT_BOMBER,			DF_AC_TU95,        TXT_TU95,       ICON_TU95,
	TYPE_HELICOPTER,STYPE_AIR_TRANSPORT_HELO,SPTYPE_UH1N,      STYPE_UNIT_TRANSPORT_HELO,	DF_AC_UH1N,        TXT_UH1N,       ICON_UH1H,
	TYPE_HELICOPTER,STYPE_AIR_TRANSPORT_HELO,SPTYPE_UH60L,     STYPE_UNIT_TRANSPORT_HELO,	DF_AC_UH60L,       TXT_UH60L,      ICON_UH60,
	NULL,NULL,NULL,NULL,0,0,0
};

// If we are playing a game... we need this type of squadron... don't make new ones
BOOL FindSquadronType(long ClassID,long teamid)
{
	VuListIterator iter(AllCampList);
	CampEntity entity;

	CampEnterCriticalSection();

	entity=GetFirstEntity(&iter);
	while(entity)
	{
		if(entity->GetTeam() == teamid && entity->IsSquadron() && !entity->IsDead())
		{
			if(entity->Type() == ClassID)
			{
				CampLeaveCriticalSection();
				return(TRUE);
			}
		}
		entity=GetNextEntity(&iter);
	}
	CampLeaveCriticalSection();

	return(FALSE);
}
// This routine is used in TAC_ENG to fill the AC Type listbox in the flight window

void FillListBoxWithACTypes(C_ListBox *lbox)
{
	short i;
	long ID;

	i=1;

	while(DFAIPlanes[i].Type)
	{
		ID = GetClassID(DOMAIN_AIR,CLASS_UNIT,TYPE_SQUADRON,DFAIPlanes[i].UnitSType,DFAIPlanes[i].SPType,VU_ANY,VU_ANY,VU_ANY);
		if(ID)
		{
			ID += VU_LAST_ENTITY_TYPE;

			if(!(TheCampaign.Flags & CAMP_TACTICAL_EDIT))
			{
				if(FindSquadronType(ID,FalconLocalSession->GetTeam()))
					lbox->AddItem(ID,C_TYPE_ITEM,DFAIPlanes[i].TextID);
			}
			else
				lbox->AddItem(ID,C_TYPE_ITEM,DFAIPlanes[i].TextID);
		}
		i++;
	}
}















// =====================================================
// 
// KCK: Join/Host/Leave functions
//
// In dogfight these are horribly intermixed with the
// selection of aircraft.
// What I'm trying to do is separate the two - making
// joining a two step process.
// 
// =====================================================

void SetCurrentGameState(C_TreeList *tree,short state)
{
	TREELIST *group;

	if(gCommsMgr->Online() && tree)
	{
		if(VuLocalGame != vuPlayerPoolGroup)
		{
			group=StartTreeSearch(FalconLocalGame->Id(),tree->GetRoot(),tree);
			if(group && group->Item_)
			{
				group->Item_->SetState(state);
				group->Item_->Refresh();
			}
		}
	}
}

// This is what we call when we want to join an existing game
void JoinDogfightCB (long,short hittype,C_Base *)
{
	FalconGameEntity	*game;
	C_Window			*win;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if(gCommsMgr == NULL)
		return;

	if(!gCommsMgr->Online())
	{
		win=gMainHandler->FindWindow(PB_WIN);
		if(win)
			gMainHandler->EnableWindowGroup(win->GetGroup());
		return;
	}

	game = (FalconGameEntity*)gCommsMgr->GetTargetGame();
	if (!game)
		return;

	win=gMainHandler->FindWindow(INFO_WIN);
	if(win)
	{
		SetupInfoWindow(ReallyJoinDogfightCB,CancelDogfightCB);
	}
}

// These are called as a callback after we've set up our game rules
void CreateDogfightCB (void)
{
	_tcscpy(gUI_ScenarioName,"Instant");
	StartCampaignGame (TRUE, game_Dogfight);
}

void CancelDogfightCB (void)
{
}

void GameHasStarted(void)
{
	AreYouSure(TXT_ERROR,TXT_GAMEHASSTARTED,NULL,CloseWindowCB);
}

void ReallyJoinDogfightCB (void)
{
//	if ((SimDogfight.GetDogfightGameStatus() >= dog_Starting) && (SimDogfight.GetGameType() == dog_TeamMatchplay))
//	{
//		GameHasStarted();
//		return;
//	}

	MonoPrint("Joining Dogfight game.\n"); 

	DisplayJoinStatusWindow (0);

	StartCampaignGame (FALSE, game_Dogfight);
}

static void DogfightBeginCB(long ID, short hittype, C_Base *control)
{
	FalconGameEntity	*game;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if(gCommsMgr == NULL)
		return;

	gDogfightControl = control;

	// This is the callback made by the 2 icons on the LOAD toolbar...
	// Figure out which function to call based upon what the user
	// has done

	// KCK: Really, we shouldn't do anything (except maybe show a 
	// 'connecting to game' dialog for the multiplayer case) UNTIL
	// we've successfully joined/loaded the game.
	game = (FalconGameEntity*)gCommsMgr->GetTargetGame();
	if (game)
	{
		// We've got a game selected, so actually, we're joining
		// Send the join request
		MonoPrint("Joining Dogfight game. \n"); 
		JoinDogfightCB(ID,hittype,control);
	}
	else
	{
		// Either call create dogfight for local case, or pop up
		// a rules dialog and then create a dogfight.
		MonoPrint("Create new Dogfight game. \n"); 
		if(gCommsMgr->Online())
			SetupInfoWindow(CreateDogfightCB,CancelDogfightCB);
		else
			CreateDogfightCB();
	}

	// KCK: Everything else is done as a result of a successfull load,
	// which calls the function below...
}

// KCK: Called as a result of a successfull dogfight game load
void DogfightJoinSuccess (void)
	{
	C_Window
		*win;

	F4CSECTIONHANDLE *Leave;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -