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