📄 cpselect.cpp
字号:
/***************************************************************************\
UI_cpsel.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 "ui95_dd.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 "falcsess.h"
#include "squadron.h"
#include "cmpclass.h"
#include "campmap.h"
#include "CampJoin.h"
#include "division.h"
#include "campstr.h"
#include "find.h"
#include "playerop.h"
#include "options.h"
#include "falcuser.h"
#include "falclib\include\f4find.h"
#include "f4error.h"
#include "uicomms.h"
#include "cmap.h"
#include "gps.h"
#include "ui_cmpgn.h"
#include "userids.h"
#include "textids.h"
#include "teamdata.h"
#include "UI.h"
#include "comms\capi.h"
#include "Dispcfg.h"
#pragma warning(disable: 4244)
// This is a list for GetFileList... files which WON'T show up in the list window
// MUST be NULL terminated
extern _TCHAR *CampExcludeList[];
extern uchar max_veh[5];
extern C_Handler *gMainHandler;
extern C_Parser *gMainParser;;
extern C_Music *gMusic;
extern int CPSelectLoaded;
extern int PlannerLoaded;
extern int CampaignLastGroup;
extern C_Map *gMapMgr;
extern GlobalPositioningSystem *gGps;
extern long gDFTeamID;
extern long _IsF16_;
extern int gCampDataVersion,gCurrentDataVersion;
IMAGE_RSC *gOccupationMap=NULL;
int CampSelMode=0;
extern long gLastUpdateGround,gLastUpdateAir;
extern short ConvertDFIDtoTeam(long ID);
extern void EnableCampaignMenus (void);
extern void create_tactical_scenario_info (void);
void CommsErrorDialog(long TitleID,long MessageID,void (*OKCB)(long,short,C_Base*),void (*CancelCB)(long,short,C_Base*));
void SetupInfoWindow(void (*tOkCB)(), void (*tCancelCB)());
void InfoButtonCB(long ID,short hittype,C_Base *control);
void CancelJoinCB();
void RedrawTreeWindowCB(long ID,short hittype,C_Base *control);
static void HookupCampaignSelectControls(long ID);
void StartCampaignGame (int local, int game_type);
void UI_Help_Guide_CB(long ID,short hittype,C_Base *ctrl);
void CleanupView();
void CreateGameList(long ID,uchar gamemask,void (*gcb)(long,short,C_Base *),void (*pcb)(long,short,C_Base *),long Client);
void CloseWindowCB(long ID,short hittype,C_Base *control);
void SetSingle_Comms_Ctrls();
void CampaignListCB();
void CampaignSoundEventCB();
void CampaignUpdateMapCB();
void LoadCampaignWindows();
void LoadPlannerWindows();
void MakeOccupationMap(IMAGE_RSC *Map);
void ToggleATOInfoCB(long ID,short hittype,C_Base *control);
void SetupMapSquadronWindow(int x,int y);
void GenericTimerCB(long ID,short hittype,C_Base *control);
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 GetFileListTree(C_TreeList *tree,_TCHAR *fspec,_TCHAR *excludelist[],long group,BOOL cutext,long UseMenu);
_TCHAR *OrdinalString(long value);
void PlayUIMovie(long ID);
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 EnableScenarioInfo(long ID);
void DisableScenarioInfo();
void SelectScenarioCB(long ID,short hittype,C_Base *control);
static void PickSquadronCB(long ID,short hittype,C_Base *control);
static void PickAirbaseCB(long ID,short hittype,C_Base *control);
void DisplayJoinStatusWindow (int);
void MinMaxWindowCB(long ID,short hittype,C_Base *control);
void CopySettingsToTemp (void);
BOOL FileNameSortCB(TREELIST *list,TREELIST *newitem);
extern BOOL AddWordWrapTextToWindow(C_Window *win,short *x,short *y,short startcol,short endcol,COLORREF color,_TCHAR *str,long Client=0);
char gUI_CampaignFile[MAX_PATH];
_TCHAR gUI_ScenarioName[64];
_TCHAR gLastCampFilename[MAX_PATH];
static int gSelectedSquadronID=-1;
void DeleteGroupList(long ID);
VU_ID gPlayerSquadronId;
extern C_TreeList *CampaignGames;
extern int mcnt;
extern int atocnt;
extern int uintcnt;
enum
{
SND_SCREAM =500005,
SND_BAD1 =500006,
SND_SECOND =500007,
SND_FIRST =500008,
SND_NICE =500009,
SND_BAD2 =500010,
SND_YOUSUCK =500011,
SND_AMBIENT =500033,
SND_CAMPAIGNMUSIC =500050,
};
enum
{
BLUE_TEAM_ICONS =565120000,
BLUE_TEAM_ICONS_W =565120001,
CAMP_AIR_BASE_ICON =10003,
};
typedef struct
{
uchar Challenge;
uchar PilotSkill;
uchar SAMSkill;
uchar AirForces;
uchar AirDefenses;
uchar GroundForces;
uchar NavalForces;
} CampaignSettings;
static CampaignSettings TEMP_Settings;
void LoadCampaignSelectWindows()
{
long ID;
if(CPSelectLoaded) return;
if( _LOAD_ART_RESOURCES_)
gMainParser->LoadImageList("art\\cs_res.lst");
else
gMainParser->LoadImageList("art\\cs_art.lst");
gMainParser->LoadSoundList("art\\cs_snd.lst");
gMainParser->LoadWindowList("art\\cs_scf.lst");
ID=gMainParser->GetFirstWindowLoaded();
while(ID)
{
HookupCampaignSelectControls(ID);
ID=gMainParser->GetNextWindowLoaded();
}
CPSelectLoaded++;
SetSingle_Comms_Ctrls();
if(!PlannerLoaded)
LoadPlannerWindows();
CampSelMode=0;
}
long SituationStr[]=
{
TXT_SIT_BAD,
TXT_SIT_POOR,
TXT_SIT_AVERAGE,
TXT_SIT_GOOD,
TXT_SIT_GREAT,
};
long SpecialtyStr[]=
{
TXT_GENERAL,
TXT_AIR_TO_AIR,
TXT_AIR_TO_GROUND,
};
IMAGE_RSC *CreateOccupationMap(long ID,long w,long h,long palsize)
{
IMAGE_RSC *rsc;
C_Resmgr *res;
unsigned char *data8;
long size;
WORD r_mask;
WORD r_shift;
WORD g_mask;
WORD g_shift;
WORD b_mask;
WORD b_shift;
if(palsize > 256)
return(NULL);
size=w*h+palsize*2;
data8=new unsigned char[size];
if(!data8)
return(NULL);
res=new C_Resmgr;
res->Setup(ID);
res->SetColorKey(UI95_RGB24Bit(0x00ff00ff));
//! UI95_GetScreenColorInfo(&r_mask,&r_shift,&g_mask,&g_shift,&b_mask,&b_shift);
UI95_GetScreenColorInfo(r_mask,r_shift,g_mask,g_shift,b_mask,b_shift);
res->SetScreenFormat(r_shift,g_shift,b_shift);
rsc=new IMAGE_RSC;
rsc->ID=ID;
rsc->Header=new ImageHeader;
rsc->Header->Type=_RSC_IS_IMAGE_;
rsc->Header->ID[0]=0;
rsc->Header->flags=_RSC_8_BIT_;
rsc->Header->w=static_cast<short>(w);
rsc->Header->h=static_cast<short>(h);
rsc->Header->centerx=0;
rsc->Header->centery=0;
rsc->Header->imageoffset=0;
rsc->Header->paletteoffset=w*h;
rsc->Header->palettesize=palsize;
rsc->Owner=res;
res->AddIndex(ID,rsc);
res->SetData((char*)data8);
memset(data8,0,size);
return(rsc);
}
void SetupMapWindow()
{
C_Window *win;
C_Bitmap *bmp;
win=gMainHandler->FindWindow(CS_MAP_WIN);
if(win)
{
DeleteGroupList(CS_MAP_WIN);
// Create Occupation Map
bmp=(C_Bitmap *)win->FindControl(CS_MAP_WIN);
if(bmp)
{
if(gOccupationMap == NULL && (TheCampaign.TheaterSizeX && TheCampaign.TheaterSizeY))
{
// Create Occupation map...
gOccupationMap=CreateOccupationMap(1,TheCampaign.TheaterSizeX/MAP_RATIO,TheCampaign.TheaterSizeY/MAP_RATIO,16);
bmp->SetImage(gOccupationMap);
}
if(gOccupationMap)
MakeOccupationMap(gOccupationMap);
}
}
}
void AddSquadronsToMap()
{
C_Window *win;
C_Button *btn;
C_Resmgr *res,*res_w;
IMAGE_RSC *rsc;
int i;//! was uint
long IconID;
int savex=-1,savey=-1;
float x,y;
float maxy;
maxy=(float)(TheCampaign.TheaterSizeY)*FEET_PER_KM;
win=gMainHandler->FindWindow(CS_MAP_WIN);
if(win)
{
// This should be found based on your team...
// NOT hard coded
res=gImageMgr->GetImageRes(BLUE_TEAM_ICONS);
res_w=gImageMgr->GetImageRes(BLUE_TEAM_ICONS_W);
DeleteGroupList(CS_MAP_WIN);
// Add all the F16 Squadron Patches into the map
for(i=0;i<TheCampaign.NumAvailSquadrons;i++)
{
if (TheCampaign.IsValidSquadron(i) || _IsF16_)
{
x=TheCampaign.CampaignSquadronData[i].y; // real world x & y are y & x
y=TheCampaign.CampaignSquadronData[i].x;
x=x/(FEET_PER_KM * MAP_RATIO);
y=(maxy-y)/(FEET_PER_KM * MAP_RATIO);
IconID=TheCampaign.CampaignSquadronData[i].airbaseIcon;
IconID=10003;
if (i == gSelectedSquadronID || savex == -1 || savey == -1)
{
savex=static_cast<int>(x);
savey=static_cast<int>(y);
}
btn=new C_Button;
btn->Setup(((long)x << 16) | (long)y,C_TYPE_RADIO,(int)x,(int)y);
btn->SetFlagBitOn(C_BIT_HCENTER|C_BIT_VCENTER);
btn->SetGroup(-100);
btn->SetCluster(i+1);
if(res)
{
rsc=(IMAGE_RSC*)res->Find(IconID);
if(rsc && rsc->Header->Type == _RSC_IS_IMAGE_)
btn->SetImage(C_STATE_0,rsc);
}
if(res_w)
{
rsc=(IMAGE_RSC*)res_w->Find(IconID);
if(rsc && rsc->Header->Type == _RSC_IS_IMAGE_)
btn->SetImage(C_STATE_1,rsc);
}
btn->SetCallback(PickAirbaseCB);
btn->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
btn->SetHelpText(HELP_PICK_AIRBASE);
btn->SetCursorID(CRSR_F16_ON);
if(gSelectedSquadronID == i)
btn->SetState(1);
win->AddControl(btn);
}
}
win->RefreshWindow();
SetupMapSquadronWindow(savex,savey);
}
}
void SetupMapSquadronWindow(int airbasex,int airbasey)
{
C_Window *win;
C_Button *btn;
C_Text *txt;
int i;//! was uint
int icony;
float x,y;
float maxy;
short NameShown=0;
SquadUIInfoClass *SquadPtr;
_TCHAR buffer[30];
maxy=(float)(TheCampaign.TheaterSizeY)*FEET_PER_KM;
win=gMainHandler->FindWindow(CS_SUA_WIN);
if(win)
{
DeleteGroupList(CS_SUA_WIN);
icony=40;
txt=new C_Text;
txt->Setup(C_DONT_CARE,C_TYPE_LEFT);
txt->SetText(TXT_CHOOSE_SQUADRON);
txt->SetXY(10,icony);
txt->SetFont(win->Font_);
txt->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
txt->SetFlagBitOn(C_BIT_LEFT);
txt->SetFGColor(0x00e0e0e0);
win->AddControl(txt);
icony+=gFontList->GetHeight(win->Font_)+4;
for(i=0;i<TheCampaign.NumAvailSquadrons;i++)
{
if (TheCampaign.IsValidSquadron(i) || _IsF16_)
{
x=TheCampaign.CampaignSquadronData[i].y; // real world x & y are y & x
y=TheCampaign.CampaignSquadronData[i].x;
x=x/(FEET_PER_KM * MAP_RATIO);
y=(maxy-y)/(FEET_PER_KM * MAP_RATIO);
if((int)x == airbasex && (int)y == airbasey)
{
SquadPtr=&TheCampaign.CampaignSquadronData[i];
if(!NameShown && SquadPtr)
{ // Airbase Name
txt=new C_Text;
txt->Setup(C_DONT_CARE,C_TYPE_LEFT);
txt->SetXY(10,icony);
txt->SetFont(win->Font_);
txt->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
txt->SetFlagBitOn(C_BIT_LEFT|C_BIT_WORDWRAP);
txt->SetW(123);
txt->SetFGColor(0x00e0e0e0);
txt->SetText(SquadPtr->airbaseName);
win->AddControl(txt);
icony+=txt->GetH();
NameShown=1;
}
_stprintf(buffer,"%s %s",OrdinalString(SquadPtr->nameId),gStringMgr->GetString(TXT_SQUADRON));
btn=new C_Button;
btn->Setup(i+1,C_TYPE_RADIO,20,icony);
btn->SetGroup(-200);
btn->SetFont(win->Font_);
btn->SetText(C_STATE_0,buffer);
btn->SetText(C_STATE_1,buffer);
btn->SetColor(C_STATE_0,0xe0e0e0);
btn->SetColor(C_STATE_1,0x00ff00);
btn->SetFlagBitOn(C_BIT_LEFT|C_BIT_USELINE);
btn->SetCallback(PickSquadronCB);
btn->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_); // used in DeleteGameList to find records to remove
btn->SetHelpText(HELP_PICK_SQUADRON);
btn->SetCursorID(CRSR_F16_ON);
win->AddControl(btn);
if(i == gSelectedSquadronID || gSelectedSquadronID < 0)
{
gSelectedSquadronID=i;
btn->SetState(1);
PickSquadronCB(i+1,C_TYPE_LMOUSEUP,btn);
}
icony+=(btn->GetH()+2);
}
}
}
win->RefreshWindow();
}
}
void LoadSquadronInfo()
{
C_Window *win;
C_Text *txt;
C_Bitmap *bmp;
SquadUIInfoClass *SquadPtr;
_TCHAR buffer[60];
win=gMainHandler->FindWindow(CS_PUA_WIN);
if(win)
{
// Need squadron info now
if(gSelectedSquadronID < 0 || gSelectedSquadronID >= TheCampaign.NumAvailSquadrons)
{
// KCK: Pick a valid squadron with the lowest id.
gSelectedSquadronID = -1;
for (int i=0; i<TheCampaign.NumAvailSquadrons; i++)
{
if ((TheCampaign.IsValidSquadron(i) || _IsF16_) && (gSelectedSquadronID < 0 || TheCampaign.CampaignSquadronData[i].id.num_ < TheCampaign.CampaignSquadronData[gSelectedSquadronID].id.num_))
gSelectedSquadronID=i;
}
}
if (gSelectedSquadronID < 0)
return;
SquadPtr=&TheCampaign.CampaignSquadronData[gSelectedSquadronID];
if(SquadPtr)
{
UnitClassDataType* uc = (UnitClassDataType*)(Falcon4ClassTable[SquadPtr->dIndex].dataPtr);
VehicleClassDataType* vc = (VehicleClassDataType*)(Falcon4ClassTable[uc->VehicleType[0]].dataPtr);
// Specialty
txt=(C_Text *)win->FindControl(SPEC_FIELD);
if(txt)
{
txt->SetText(SpecialtyStr[SquadPtr->specialty%3]);
}
// status (# humans,%strength)
txt=(C_Text *)win->FindControl(STATUS_FIELD);
if(txt)
{
if (CampSelMode == 2 && gCommsMgr && gCommsMgr->GetTargetGame())
{
// Online game - Count # of players
int players = 0;
FalconSessionEntity *session;
VuSessionsIterator sit(gCommsMgr->GetTargetGame());
session = (FalconSessionEntity*) sit.GetFirst();
while (session)
{
players++;
session = (FalconSessionEntity*) sit.GetNext();
}
_stprintf(buffer,"%1d %s, %1d %s",players,gStringMgr->GetString(TXT_PLAYERS),SquadPtr->currentStrength,vc->Name);
}
else if (!CampSelMode)
{
// # of aircraft based on ratio setting for new games
int aircraft = 0,mv,i;
mv = max_veh[PlayerOptions.CampAirRatio];
for (i=0; i<mv; i++)
aircraft += uc->NumElements[i];
_stprintf(buffer,"%d %s",aircraft,vc->Name);
}
else
_stprintf(buffer,"%d %s",SquadPtr->currentStrength,vc->Name);
txt->SetText(buffer);
txt->Refresh();
}
txt=(C_Text *)win->FindControl(SQUAD_NAME);
if(txt)
{
_stprintf(buffer,"%s %s",OrdinalString(SquadPtr->nameId),gStringMgr->GetString(TXT_FS));
txt->SetText(buffer);
}
txt=(C_Text *)win->FindControl(AIRBASE_NAME);
if(txt)
{
_stprintf(buffer,"%s",SquadPtr->airbaseName);
txt->SetText(buffer);
}
bmp=(C_Bitmap *)win->FindControl(PATCH);
if(bmp)
{
if(!SquadPtr->squadronPatch)
{
SquadPtr->squadronPatch=AssignUISquadronID(SquadPtr->nameId);
}
bmp->SetImage(SquadronMatchIDs[SquadPtr->squadronPatch][0]);
}
}
win->RefreshWindow();
}
}
static void CalcChallengeLevel()
{
C_Window *win;
C_ListBox *lb;
// Joes Equation Goes HERE
TEMP_Settings.Challenge=TEMP_Settings.PilotSkill;
TEMP_Settings.Challenge+=TEMP_Settings.SAMSkill;
TEMP_Settings.Challenge+=(4-TEMP_Settings.AirForces);
TEMP_Settings.Challenge+=(4-TEMP_Settings.AirDefenses);
TEMP_Settings.Challenge+=(4-TEMP_Settings.GroundForces);
TEMP_Settings.Challenge+=(4-TEMP_Settings.NavalForces);
TEMP_Settings.Challenge /= 6;
win=gMainHandler->FindWindow(CHALLENGE_WIN);
if(win)
{
lb=(C_ListBox *)win->FindControl(CHALLENGE_LIST);
if(lb)
{
lb->Refresh();
switch(TEMP_Settings.Challenge)
{
case 1:
lb->SetValue(CADET_LEVEL);
break;
case 2:
lb->SetValue(ROOKIE_LEVEL);
break;
case 3:
lb->SetValue(VETERAN_LEVEL);
break;
case 4:
lb->SetValue(ACE_LEVEL);
break;
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -