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

📄 instant.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************\
	instant.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 "Mesg.h"
#include "MsgInc\DamageMsg.h"
#include "MsgInc\WeaponFireMsg.h"
#include "MsgInc\DeathMessage.h"
#include "MsgInc\MissileEndMsg.h"
#include "MsgInc\LandingMessage.h"
#include "MsgInc\EjectMsg.h"
#include "falcuser.h"
#include "falclib\include\f4find.h"
#include "f4error.h"
#include "uicomms.h"
#include "ui_ia.h"
#include "userids.h"
#include "textids.h"
#include "CmpClass.h"
#include "ThreadMgr.h"
#include "PlayerOp.h"
#include "classtbl.h"
#include "iaction.h"

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

enum // Instant action scoring stuff
{
	_A_LOW_SCORE_			=250000,
	_A_MEDIUM_SCORE_		=500000,
};

static IDirectDraw *DDraw;
IDirectDrawSurface *UI95_CreateDDSurface(IDirectDraw *DD,DWORD width,DWORD height);
void ProcessEventList(C_Window *win,long client);
void SetSingle_Comms_Ctrls();
void RemoveWeaponUsageList();
extern C_Handler *gMainHandler;
extern char gUI_CampaignFile[];
void UI_Help_Guide_CB(long ID,short hittype,C_Base *ctrl);
void EncryptBuffer(uchar startkey,uchar *buffer,long length);
void DecryptBuffer(uchar startkey,uchar *buffer,long length);

char *gUBuffer;

C_SoundBite *gInstantBites=NULL;


// Parameters for Instant Action
UI_IA InstantActionSettings=
{
	_MISSION_AIR_TO_AIR_,
	_PILOT_LEVEL_NOVICE_,
	_NO_SAM_SITES_,
	_NO_AAA_SITES_,
};

long TotalScore=0;
long Bonus=0;
long Penalty=0;
long LandingBonus=0;
long LivingBonus=0;

kill_list *WeaponUsage=NULL;
kill_list *AircraftKills=NULL;
kill_list *ObjectKills=NULL;
kill_list *BonusList=NULL;

VU_ID IAPlayerID=FalconNullId;

HighScoreList Scores;

extern C_Parser *gMainParser;
extern int MainLastGroup;
extern int IALoaded;

void CloseWindowCB(long ID,short hittype,C_Base *control);
static void HookupIAControls(long ID);
static void SetupInstantAction();
static void InsertScoreCB(long ID,short hittype,C_Base *control);
static void OpenIAMunitionsCB (long ID, short hittype, C_Base *control);
void OpenMunitionsWindowCB(long ID,short hittype,C_Base *control);

_TCHAR *AddCommas(_TCHAR *buf)
{
	int i,j,k,len;
	_TCHAR newbuf[25];
	_TCHAR *comma;

	comma=gStringMgr->GetString(TXT_COMMA_PLACE);
	if(!comma)
		return(buf);
	j=0;
	k=0;
	len=_tcsclen(buf);
	i=len;
	if(buf[0] == '-')
	{
		i--;
		len--;
		newbuf[j++]=buf[k++];
	}
	while(i)
	{
		if((i % 3) == 0 && i > 1 && i < len)
			newbuf[j++]=comma[0];
		newbuf[j++]=buf[k++];
		i--;
	}
	newbuf[j++]=0;
	_tcscpy(buf,newbuf);
	return(buf);
}

void GetHighScores()
{
#if _USE_REGISTRY_
	DWORD type, size;
	HKEY theKey;
	long retval;
#else
	HANDLE fp;
	DWORD br;
#endif

#if _USE_REGISTRY_
	size = sizeof (HighScoreList);
	retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, FALCON_REGISTRY_KEY, 0, KEY_ALL_ACCESS, &theKey);
	retval = RegQueryValueEx(theKey, "initData", 0, &type, (LPBYTE)&Scores, &size);
	RegCloseKey(theKey);
	if (retval != ERROR_SUCCESS)
	{
//		ShiAssert(strcmp("Failed Reg Load,I would Clear Here","But Not this time") == 0);
//		memset(&Scores[0],0,size);
		return;
	}
#else

	fp=CreateFile("highscore.bin",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(fp == INVALID_HANDLE_VALUE)
		return;

	ReadFile(fp,&Scores,sizeof(HighScoreList),&br,NULL);
	CloseHandle(fp);

#endif
	DecryptBuffer(0x38,(uchar*)&Scores,sizeof(HighScoreList));
	if(Scores.CheckSum) // Someone tampered with data... reset it
		memset(&Scores,0,sizeof(HighScoreList));
}

void SaveHighScores()
{
#if _USE_REGISTRY_
	DWORD size;
	HKEY theKey;
	long retval;
#else
	HANDLE fp;
	DWORD br;
#endif

	EncryptBuffer(0x38,(uchar*)&Scores,sizeof(HighScoreList));

#if _USE_REGISTRY_
	size = sizeof (HighScoreList);
	retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, FALCON_REGISTRY_KEY, 0, KEY_ALL_ACCESS, &theKey);
	if(retval == ERROR_SUCCESS)
		retval = RegSetValueEx  (theKey, "initData", 0, REG_BINARY, (LPBYTE)&Scores, size);	
	RegCloseKey(theKey);
#else

	fp=CreateFile("highscore.bin",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	if(fp == INVALID_HANDLE_VALUE)
		return;

	WriteFile(fp,&Scores,sizeof(HighScoreList),&br,NULL);
	CloseHandle(fp);
#endif
	DecryptBuffer(0x38,(uchar*)&Scores,sizeof(HighScoreList));
}

int VisualIDCost[][2]=
{
	{ VIS_AIM120, 1000 },
	{ VIS_AIM9M,   100 },
	{ VIS_AIM7,    200 },

	{ VIS_AGM65B,   50 },
	{ VIS_AGM65D,   50 },
	{ VIS_AGM65G,   50 },
	{ VIS_AGM88,    50 },

	{ VIS_IL28,   1000 },
	{ VIS_TU16N,  2000 },
	{ VIS_SU25,   2500 },
	{ VIS_MIG19,  5000 },
	{ VIS_MIG21, 10000 },
	{ VIS_MIG23, 10000 },
	{ VIS_MIG25, 15000 },
	{ VIS_MIG29, 15000 },
	{ VIS_SU27,  20000 },
	
	{ VIS_F14,  -50000 },
	{ VIS_F15C,  -50000 },
	{ VIS_F16C,  -50000 },
	{ VIS_F18A,  -50000 },
	{ VIS_F18D,  -50000 },
	{ VIS_B52G,  -50000 },
	{ VIS_KC10, -50000 },
	{ VIS_A10,  -50000 },
	{ 0,0 },
};

int FindCost(int ID)
{
	int i;

	i=0;
	while(VisualIDCost[i][0] != 0)
	{
		if(VisualIDCost[i][0] == ID)
			return(VisualIDCost[i][1]);
		i++;
	}
	return(500);
}

int AddWeaponToUsageList(int ID)
{
	kill_list *cur,*newwp;
	int COST;
	short visID;

	visID=Falcon4ClassTable[ID].visType[0];
	COST=FindCost(visID);
	COST/=4;	// ECTS HACK

	cur=WeaponUsage;
	while(cur)
	{
		if(cur->id == ID)
		{
			cur->num ++;
			cur->points-=COST;
			return -COST;
		}
		cur=cur->next;
	}

	newwp=new kill_list;
	newwp->id=ID;
	newwp->num=1;
	newwp->points=-COST;
	newwp->next=NULL;

	if(WeaponUsage == NULL)
	{
		WeaponUsage=newwp;
	}
	else
	{
		cur=WeaponUsage;
		while(cur->next)
			cur=cur->next;
		cur->next=newwp;
	}

	return -COST;
}

int AddAircraftToKillsList(int ID)
{
	kill_list *cur,*newwp;
	int COST;
	short visID;

	visID=Falcon4ClassTable[ID].visType[0];
	COST=FindCost(visID);

	cur=AircraftKills;
	while(cur)
	{
		if(cur->id == ID)
		{
			cur->num ++;
			cur->points+=COST;
			return COST;
		}
		cur=cur->next;
	}

	newwp=new kill_list;
	newwp->id=ID;
	newwp->num=1;
	newwp->points=COST;
	newwp->next=NULL;

	if(AircraftKills== NULL)
	{
		AircraftKills=newwp;
	}
	else
	{
		cur=AircraftKills;
		while(cur->next)
			cur=cur->next;
		cur->next=newwp;
	}

	return COST;
}

int AddObjectToKillsList(int ID)
{
	kill_list *cur,*newwp;
	int COST;
	short visID;

	visID=Falcon4ClassTable[ID].visType[0];
	COST=FindCost(visID);

	cur=ObjectKills;
	while(cur)
	{
		if(cur->id == ID)
		{
			cur->num ++;
			cur->points+=COST;
			return COST;
		}
		cur=cur->next;
	}

	newwp=new kill_list;
	newwp->id=ID;
	newwp->num=1;
	newwp->points=COST;
	newwp->next=NULL;

	if(ObjectKills== NULL)
	{
		ObjectKills=newwp;
	}
	else
	{
		cur=ObjectKills;
		while(cur->next)
			cur=cur->next;
		cur->next=newwp;
	}

	return COST;
}

int score_player_ejected (void)
{
	kill_list *newwp;
	
	newwp=new kill_list;
	newwp->id = 0;
	newwp->num = 0;
	newwp->points = 0;
	newwp->next = NULL;

	if (BonusList)
	{
		BonusList->next = newwp;
	}
	else
	{
		BonusList = newwp;
	}

	return 0;
}

void RemoveBonusList()
{
	kill_list *cur,*prev;

	cur=BonusList;
	while(cur)
	{
		prev=cur;
		cur=cur->next;
		delete prev;
	}
	BonusList=NULL;
}

void RemoveWeaponUsageList()
{
	kill_list *cur,*prev;

	cur=WeaponUsage;
	while(cur)
	{
		prev=cur;
		cur=cur->next;
		delete prev;
	}
	WeaponUsage=NULL;
}

void RemoveAircraftKillsList()
{
	kill_list *cur,*prev;

	cur=AircraftKills;
	while(cur)
	{
		prev=cur;
		cur=cur->next;
		delete prev;
	}
	AircraftKills=NULL;
}

void RemoveObjectKillsList()
{
	kill_list *cur,*prev;

	cur=ObjectKills;
	while(cur)
	{
		prev=cur;
		cur=cur->next;
		delete prev;
	}
	ObjectKills=NULL;
}

void AddIAVehicleKill(VU_ID,VU_ID Victim,VehicleClassDataType *)
{ // Don't care... Leon does this
	if(Victim == IAPlayerID)
		Penalty+=2000;
}

void CheckEject(VU_ID Pilot,float damage,float fuel)
{
	if(Pilot == IAPlayerID)
	{
		if(damage > 80.0f && fuel > 100.0f)
			LivingBonus=-50000;
		else
			LivingBonus=50000;
	}
}

void CheckLanding(VU_ID Pilot,float damage,float fuel)
{
	if(Pilot == IAPlayerID)
	{
		LandingBonus=50000;
		if(damage < 50.0f || fuel == 0.0f)
			LandingBonus=150000;
	}
}

void LoadInstantActionWindows()
{
	long ID;
	C_Window *win;
	C_Button *ctrl;

	if(IALoaded) return;

	if( _LOAD_ART_RESOURCES_)
		gMainParser->LoadImageList("art\\ia_res.lst");
	else
		gMainParser->LoadImageList("art\\ia_art.lst");
	gMainParser->LoadSoundList("art\\ia_snd.lst");
	if(!gInstantBites)
		gInstantBites=gMainParser->ParseSoundBite("art\\instant\\uidia.scf");

	gMainParser->LoadWindowList("art\\ia_scf.lst");

	ID=gMainParser->GetFirstWindowLoaded();
	while(ID)
	{
		HookupIAControls(ID);
		ID=gMainParser->GetNextWindowLoaded();
	}

	SetSingle_Comms_Ctrls();
	win=gMainHandler->FindWindow(IA_HS_WIN);
	if(win)
	{
		ctrl=(C_Button *)win->FindControl(CLOSE_WINDOW);
		if(ctrl)
			ctrl->SetCallback(InsertScoreCB);
	}
	SetupInstantAction();
	IALoaded++;
}

static void InstantActionFlyCB(long,short hittype,C_Base *)
{
	C_Window *win;
	C_Button *btn;
	C_Cursor *crsr;
	C_Clock *clk;
	float XPos,YPos;
	if(hittype != C_TYPE_LMOUSEUP)
		return;

	win=gMainHandler->FindWindow(IA_SETTINGS_WIN);
	if(win)
	{
		InstantActionSettings.MissionType=_MISSION_AIR_TO_AIR_;
		instant_action::set_start_mode ('f');

		btn=(C_Button *)win->FindControl(IA_MIS_MUD_CTRL);
		if(btn)
		{
			if(btn->GetState())
			{
				InstantActionSettings.MissionType=_MISSION_AIR_TO_GROUND_;
				instant_action::set_start_mode ('m');
			}
		}

		InstantActionSettings.PilotLevel=_PILOT_LEVEL_NOVICE_;;
		btn=(C_Button *)win->FindControl(IA_LVL_CADET_CTRL);
		if(btn)
		{
			if(btn->GetState())
				InstantActionSettings.PilotLevel=_PILOT_LEVEL_CADET_;
		}
		btn=(C_Button *)win->FindControl(IA_LVL_ROOKIE_CTRL);
		if(btn)
		{
			if(btn->GetState())
				InstantActionSettings.PilotLevel=_PILOT_LEVEL_ROOKIE_;
		}
		btn=(C_Button *)win->FindControl(IA_LVL_VETERAN_CTRL);
		if(btn)
		{

⌨️ 快捷键说明

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