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

📄 cpselect.cpp

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