📄 ui_lgbk.cpp
字号:
/***************************************************************************\
UI_lgbk.cpp
David Power
July 14,1997
Logbook screen for falcon
\***************************************************************************/
#include <windows.h>
#include <targa.h>
#include "falclib.h"
#include "dxutil\ddutil.h"
#include "Graphics\Include\imagebuf.h"
#include "dispcfg.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 "find.h"
#include "flight.h"
#include "falcuser.h"
#include "f4find.h"
#include "falcsess.h"
#include "f4error.h"
#include "ui_ia.h"
#include "ui_dgfgt.h"
#include "playerop.h"
#include "userids.h"
#include "logbook.h"
#include "userids.h"
#include "cstringrc.h"
#include "textids.h"
//#include "ui_lgbk.h"
#define _USE_REGISTRY_ 1
extern C_Handler *gMainHandler;
extern C_Parser *gMainParser;
static void HookupPWControls(long ID);
static void HookupLBControls(long ID);
void CloseWindowCB(long ID,short hittype,C_Base *control);
void CloseLogWindowCB(long ID,short hittype,C_Base *control);
void UI_Help_Guide_CB(long ID,short hittype,C_Base *ctrl);
void Uni_Float(_TCHAR *buffer);
void LBSetupControls(IMAGE_RSC *Picture = NULL, IMAGE_RSC *Patch = NULL);
int SetImage(long ID,_TCHAR *filename ,long ImageID);
int SetResourceImage(long ID,long ImageID);
void MakeVirtualListFromRsc(long ID,long startid);
void LoadAFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*));
void LoadVirtualFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*),_TCHAR virtuallist[200][64],void (*VirtualCB)(long,short,C_Base*));
void SaveLogBookCB(long ID,short hittype,C_Base *control);
int CheckCallsign(_TCHAR *filename);
void AwardDevices(C_Window *win,long ID, uchar Medal, uchar Number);
int UpdateKeyMapList( char *fname,int flag );
void GetPilotList( C_Window *win, _TCHAR *fspec, _TCHAR *excludelist[],
C_ListBox *lbox, BOOL cutext, BOOL exclude_te);
int SetPilot(_TCHAR *callsign,C_ListBox *lbox);
int SaveControlValues(void);
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*));
//for testing
void AwardWindow(void);
void CourtMartialWindow(void);
void PromotionWindow(void);
void LoadCommonWindows(void);
_TCHAR *UI_WordWrap(C_Window *win,_TCHAR *str,long fontid,short width,BOOL *status);
extern _TCHAR VirtualFileList[200][64];
extern int LBLoaded;
enum{
PW_TITLE_BAR =140002,
};
enum{
DEV_STAR = 0,
DEV_OAK = 1,
};
extern C_String *gStringMgr;
long gFullRanksTxt[NUM_RANKS] = { TXT_SEC_LT,
TXT_LEIUTENANT,
TXT_CAPTAIN,
TXT_MAJOR,
TXT_LT_COL,
TXT_COLONEL,
TXT_BRIG_GEN,
};
long gRanksTxt[NUM_RANKS]=
{
TXT_ABBRV_RANK_SEC_LT,
TXT_ABBRV_RANK_LIEUTENANT,
TXT_ABBRV_RANK_CAPTAIN,
TXT_ABBRV_RANK_MAJOR,
TXT_ABBRV_RANK_LT_COL,
TXT_ABBRV_RANK_COLONEL,
TXT_ABBRV_RANK_BRIG_GEN,
};
int LogState = 0;
long CurControl = 0;
int CurPatch = 0;
int CurPic = 0;
LogBookData UI_logbk;
int PWLoaded = 0;
RECT PicArea;
void F4DialogBox( _TCHAR *string, void (*YesCB)(long,short,C_Base*),
void (*NoCB)(long,short,C_Base*) )
{
C_Window *win;
C_Button *btn;
C_Text *text;
win=gMainHandler->FindWindow(DIALOG_WIN);
if(win)
{
text=(C_Text *)win->FindControl(MESSAGE1);
if(text)
{
text->Refresh();
text->SetText(string);
text->Refresh();
}
#if 0
fontid = text->GetFont();
strptr = UI_WordWrap(win,string,fontid,180,&status);
if(strptr)
{
text->SetText(strptr);
text->Refresh();
}
}
strptr = UI_WordWrap(win,NULL,fontid,180,&status);
if(strptr)
{
text=(C_Text *)win->FindControl(MESSAGE2);
if(text)
{
text->SetText(strptr);
text->Refresh();
}
}
strptr = UI_WordWrap(win,NULL,fontid,180,&status);
if(strptr)
{
text=(C_Text *)win->FindControl(MESSAGE3);
if(text)
{
text->SetText(strptr);
text->Refresh();
}
}
#endif
btn=(C_Button *)win->FindControl(OK);
if(btn)
{
if(YesCB)
btn->SetCallback(YesCB);
else
btn->SetCallback(CloseWindowCB);
if(NoCB)
btn->SetX(btn->GetUserNumber(0));
else
btn->SetX(btn->GetUserNumber(1));
}
btn=(C_Button *)win->FindControl(CLOSE_WINDOW);
if(btn)
{
if(NoCB)
btn->SetCallback(NoCB);
else
btn->SetCallback(CloseWindowCB);
}
btn=(C_Button *)win->FindControl(CANCEL);
if(btn)
{
if(NoCB)
{
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn->SetCallback(NoCB);
}
else
{
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn->SetCallback(CloseWindowCB);
}
}
gMainHandler->ShowWindow(win);
gMainHandler->WindowToFront(win);
}
}
void F4DialogBox( long ID, void (*YesCB)(long,short,C_Base*),
void (*NoCB)(long,short,C_Base*) )
{
F4DialogBox( gStringMgr->GetText(ID), YesCB, NoCB );
}
void ChoosePilotCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_SELECT)
return;
_TCHAR Pilot[MAX_PATH];
_tcscpy(Pilot,((C_ListBox *)control)->GetText());
//return if current logbook is selected
if(!_tcscmp(Pilot,UI_logbk.Callsign()))
return;
UI_logbk.LoadData(Pilot);
LBSetupControls();
}
void PasswordWindow(long TitleID,long MessageID,void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*))
{
C_Window *win;
C_Button *btn;
C_Text *text;
C_ListBox *lbox;
C_EditBox *ebox;
if(!YesCB || !NoCB)
return;
if(LogState & LB_CHECKED)
return;
win=gMainHandler->FindWindow(PASSWORD_WIN);
if(win)
{
lbox = (C_ListBox *)win->FindControl(LOGBOOK_LIST);
if(lbox)
{
_TCHAR buf[MAX_PATH];
if(TitleID == TXT_VERIFY_PASSWORD)
{
lbox->SetCallback(NULL);
lbox->SetFlagBitOff(C_BIT_ENABLED);
lbox->RemoveAllItems();
C_Window *win = gMainHandler->FindWindow(LOG_WIN);
if(win)
ebox=(C_EditBox *)win->FindControl(CALLSIGN_LIST);
else
ebox = NULL;
if(ebox != NULL)
lbox->AddItem(1,C_TYPE_ITEM,ebox->GetText());
else
lbox->AddItem(1,C_TYPE_ITEM,UI_logbk.Callsign());
}
else
{
_stprintf(buf,_T("%s\\config\\*.lbk"),FalconDataDirectory);
GetPilotList( win, buf, NULL, lbox, TRUE, TRUE );
SetPilot(UI_logbk.Callsign(),lbox);
lbox->SetFlagBitOn(C_BIT_ENABLED);
lbox->SetCallback(ChoosePilotCB);
}
}
text=(C_Text *)win->FindControl(MESSAGE1);
if(text)
{
text->Refresh();
text->SetText(MessageID);
text->Refresh();
}
#if 0
fontid = text->GetFont();
strptr = UI_WordWrap(win,mess,fontid,250,&status);
if(strptr)
{
text->SetText(strptr);
}
else
text->SetText(TXT_SPACE);
text->Refresh();
}
text=(C_Text *)win->FindControl(MESSAGE2);
if(text)
{
text->Refresh();
strptr = UI_WordWrap(win,NULL,fontid,250,&status);
if(strptr)
{
text->SetText(strptr);
}
else
text->SetText(TXT_SPACE);
text->Refresh();
}
#endif
text =(C_Text*)win->FindControl(PW_TITLE_BAR);
if(text)
{
text->SetText(TitleID);
text->Refresh();
}
btn=(C_Button *)win->FindControl(OK);
if(btn)
{
btn->SetCallback(YesCB);
}
ebox=(C_EditBox*)win->FindControl(PASSWORD);
if(ebox)
{
win->SetControl(PASSWORD);
}
btn=(C_Button *)win->FindControl(CLOSE_WINDOW);
if(btn)
{
btn->SetCallback(NoCB);
}
btn=(C_Button *)win->FindControl(LOG_NEW);
if(btn)
{
btn->Refresh();
btn->SetCallback(NoCB);
if(TitleID == TXT_VERIFY_PASSWORD)
{
btn->SetLabel(0,TXT_CANCEL);
btn->SetLabel(1,TXT_CANCEL);
}
else
{
btn->SetLabel(0,TXT_NEW);
btn->SetLabel(1,TXT_NEW);
}
btn->Refresh();
}
gMainHandler->ShowWindow(win);
gMainHandler->WindowToFront(win);
}
}
void CheckPasswordCB(long,short hittype,C_Base *control)
{
C_EditBox * ebox;
_TCHAR pwd[MAX_PATH];
if(hittype != C_TYPE_LMOUSEUP)
return;
ebox=(C_EditBox*)control->Parent_->FindControl(PASSWORD);
if(ebox)
{
_tcscpy(pwd,ebox->GetText());
ebox->SetText(_T(""));
ebox->Refresh();
if(UI_logbk.CheckPassword(pwd))
{
LogState |= LB_EDITABLE | LB_CHECKED;
gMainHandler->HideWindow(control->Parent_);
LogBook.LoadData(&UI_logbk.Pilot);
UpdateKeyMapList(PlayerOptions.keyfile,1);
}
}
}
void RealLoadLogbook() // without daves extra garbage
{
long ID;
if(LBLoaded)
return;
if( _LOAD_ART_RESOURCES_)
gMainParser->LoadImageList("art\\lb_res.lst");
else
gMainParser->LoadImageList("art\\lb_art.lst");
gMainParser->LoadSoundList("art\\lb_snd.lst");
gMainParser->LoadWindowList("art\\lb_scf.lst");
ID=gMainParser->GetFirstWindowLoaded();
while(ID)
{
HookupLBControls(ID);
ID=gMainParser->GetNextWindowLoaded();
}
LBLoaded++;
}
void LoadLogBookWindows(LB_PILOT *Pilot = &LogBook.Pilot,int flag = LB_EDITABLE,
IMAGE_RSC *Picture = NULL, IMAGE_RSC *Patch = NULL)
{
UI_logbk.LoadData(Pilot);
LogState |= flag|LB_REFRESH_PILOT;
if(LBLoaded)
{
LBSetupControls(Patch,Picture);
return;
}
C_Window *win = gMainHandler->FindWindow(LOG_WIN);
if(win)
{
C_Box *box = (C_Box *)win->FindControl(50096);//PIC_BOX
if(box)
{
PicArea.left = box->GetX();
PicArea.right = box->GetX() + box->GetW();
PicArea.top = box->GetY();
PicArea.bottom = box->GetY() + box->GetH();
}
}
LBSetupControls(Patch,Picture);
}
void NoPasswordCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
LogBook.Initialize();
UI_logbk.Initialize();
UpdateKeyMapList(PlayerOptions.keyfile,0);
LoadLogBookWindows();
gMainHandler->HideWindow(control->Parent_);
}
int SetPilot(_TCHAR *callsign,C_ListBox *lbox)
{
int i=1;
_TCHAR *CurCallsign;
lbox->SetValue(i);
while(i == lbox->GetTextID())
{
CurCallsign = lbox->GetText();
if(CurCallsign)
{
if(!_tcsicmp(CurCallsign,callsign) )
{
return TRUE;
}
}
lbox->SetValue(++i);
}
return FALSE;
}
void GetPilotList( C_Window *win, _TCHAR *fspec, _TCHAR *excludelist[],
C_ListBox *lbox, BOOL cutext, BOOL exclude_te)
{
char path[100];
WIN32_FIND_DATA filedata;
HANDLE ffhnd;
BOOL last,ignore;
long i; //,y=0;
int items =0;
_TCHAR *dst, *ptr, *extension;
if(!win || !lbox) return;
ffhnd=FindFirstFile(fspec,&filedata);
last=(ffhnd != INVALID_HANDLE_VALUE);
lbox->RemoveAllItems();
if (exclude_te)
{
ptr = fspec;
dst = path;
extension = NULL;
while (*ptr)
{
if (*ptr == '\\')
extension = dst;
*dst = *ptr;
dst ++;
ptr ++;
}
*dst = '\0';
if (extension)
*extension = '\0';
}
while(last)
{
if(cutext)
{
ptr = filedata.cFileName;
extension = NULL;
while (*ptr)
{
if (*ptr == '.')
extension = ptr;
ptr ++;
}
if (extension)
*extension = 0;
}
ignore=FALSE;
if(excludelist)
{
i=0;
while(excludelist[i] && !ignore)
{
if(stricmp(excludelist[i],filedata.cFileName) == 0)
ignore=TRUE;
i++;
}
}
if(!ignore)
{
items++;
lbox->AddItem(items,C_TYPE_ITEM,filedata.cFileName);
}
last= FindNextFile(ffhnd,&filedata);
}
lbox->Refresh();
}
void LBSetupControls(IMAGE_RSC *Picture, IMAGE_RSC *Patch)
{
C_EditBox *ebox;
C_Window *win;
C_Button *button;
C_Text *text;
C_ListBox *lbox;
long imageID;
win=gMainHandler->FindWindow(LOG_WIN);
if(win)
{
button=(C_Button *)win->FindControl(LOG_OK);
if(button != NULL)
{
if(LogState & LB_OPPONENT)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -