📄 dogfight.cpp
字号:
/***************************************************************************\
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 + -