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

📄 general.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/***************************************************************************\
    ui_gen.cpp
    Peter Ward
	July 15, 1996

    This code contains a bunch of generic routines
\***************************************************************************/
#include <windows.h>
#include "f4version.h"
#include <ddraw.h>
#include "unit.h"
#include "team.h"
#include "CmpGlobl.h"
#include "CampCell.h"
#include "CampTerr.h"
#include "Listadt.h"
#include "objectiv.h"
#include "Campaign.h"
#include "campmap.h"
#include "campwp.h"
#include "campstr.h"
#include "squadron.h"
#include "feature.h"
#include "pilot.h"
#include "f4find.h"
#include "find.h"
#include "misseval.h"
#include "cmpclass.h"
#include "ui95_dd.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "AirUnit.h"
#include "uicomms.h"
#include "userids.h"
#include "textids.h"
#include "classtbl.h"
#include "brief.h"
#include "teamdata.h"
#include "division.h"
#include "cmap.h"
#include "gps.h"
#include "urefresh.h"
#include "credits.h"

#pragma warning(disable:4244) // for +=

extern C_Handler *gMainHandler;
extern C_Parser *gMainParser;
extern VU_ID gCurrentFlightID;
extern GlobalPositioningSystem *gGps;

// ALL RESMGR CODE ADDITIONS START HERE
#define _USE_RES_MGR_ 1

#ifndef _USE_RES_MGR_ // DON'T USE RESMGR

	#define UI_HANDLE FILE *
	#define UI_OPEN   fopen
	#define UI_READ   fread
	#define UI_CLOSE  fclose
	#define UI_SEEK   fseek
	#define UI_TELL   ftell

#else // USE RESMGR

	#include "cmpclass.h"
	extern "C"
	{
		#include "codelib\resources\reslib\src\resmgr.h"
	}

	#define UI_HANDLE FILE *
	#define UI_OPEN   RES_FOPEN
	#define UI_READ   RES_FREAD
	#define UI_CLOSE  RES_FCLOSE
	#define UI_SEEK   RES_FSEEK
	#define UI_TELL   RES_FTELL

#endif
// ALL RESMGR CODE ADDITIONS AND END HERE

enum
{
	BLUE_TEAM_ICONS				=565120000,
	BLUE_TEAM_ICONS_W			=565120001,
	CAMP_AIR_BASE_ICON          =10003,
};

void DeleteGroupList(long ID);

#define COLLECTABLE_HP_OBJECTIVES		5
int GetTopPriorityObjectives(int team, _TCHAR* buffers[COLLECTABLE_HP_OBJECTIVES]);
int GetTeamSituation (Team t);
BOOL AddWordWrapTextToWindow(C_Window *win,short *x,short *y,short startcol,short endcol,COLORREF color,_TCHAR *str,long Client=0);
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);

_TCHAR LoadSaveFilename[MAX_PATH+1];
void LoadAFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*));
void SaveAFile(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[],void (*VirtualCB)(long,short,C_Base*));
void EncryptBuffer(uchar startkey,uchar *buffer,long length);
extern IMAGE_RSC *gOccupationMap;

_TCHAR VirtualFileList[200][64];

static long Ordinals[]=
{
	TXT_ORD_0,
	TXT_ORD_1,
	TXT_ORD_2,
	TXT_ORD_3,
	TXT_ORD_4,
	TXT_ORD_5,
	TXT_ORD_6,
	TXT_ORD_7,
	TXT_ORD_8,
	TXT_ORD_9,
};

char *DontDeleteList[]=
{
	"keystrokes.key",
	"laptop.key",
	NULL,
};

_TCHAR *OrdinalString(long value)
{
	long ordinal;
	static _TCHAR buffer[20];

	if (gLangIDNum == F4LANG_FRENCH)
	{
		if(value == 1)
		{
			_stprintf(buffer,"%1ld%s",value,gStringMgr->GetString(Ordinals[1]));
		}
		else
		{
			_stprintf(buffer,"%1ld%s",value,gStringMgr->GetString(Ordinals[2]));
		}
	}
	else
	{
		ordinal=value % 10;
		if(ordinal < 0) ordinal=-ordinal;
		_stprintf(buffer,"%1ld%s",value,gStringMgr->GetString(Ordinals[ordinal]));
	}
	return(&buffer[0]);
}

void Uni_Float(_TCHAR *buffer)
{
	short i;
	_TCHAR *decimal;

	decimal=gStringMgr->GetString(TXT_DECIMAL_PLACE);
	if(!decimal || !buffer)
		return;

	i=0;
	while(buffer[i] && i < 20)
	{
		if(buffer[i] == '.')
			buffer[i]=decimal[0];
		i++;
	}
}

// This function work JUST LIKE strtok :)
static _TCHAR *WordWrap=NULL;
static _TCHAR *WordPtr=NULL;
static _TCHAR *NextPtr=NULL;
_TCHAR *UI_WordWrap(C_Window *win,_TCHAR *str,long fontid,short width,BOOL *status)
{
	_TCHAR *space;
	short i,done;
	short w;

	if(!win || (str == NULL && (WordWrap == NULL || WordPtr == NULL)))
		return(NULL);

	if(str)
	{
		if(WordWrap)
			delete WordWrap;
		WordWrap=new _TCHAR[_tcslen(str)+1];
		_tcscpy(WordWrap,str);
		WordPtr=WordWrap;
		NextPtr=NULL;
	}
	else
	{
		if(NextPtr == NULL)
		{
			delete WordWrap;
			WordWrap=NULL;
			WordPtr=NULL;
			NextPtr=NULL;
			return(NULL);
		}
		WordPtr=NextPtr;
		if(WordPtr)
		{
			if(!_tcslen(WordPtr))
			{
				delete WordWrap;
				WordWrap=NULL;
				WordPtr=NULL;
				NextPtr=NULL;
				return(NULL);
			}
		}
	}
	i=0;
	done=0;
	space=NULL;

	while(!done)
	{
		// find a space
		while(WordPtr[i] != ' ' && (WordPtr[i] > 31))
			i++;
		if(i)
		{
			w=static_cast<short>(gFontList->StrWidth(fontid,WordPtr,i));
			if(w > width)
			{
				if(space == NULL)
				{
					*status=FALSE;
					NextPtr=&WordPtr[i];
					done=1;
				}
				else
				{
					NextPtr=space+1;
					*space=0;
					*status=TRUE;
					done=1;
				}
			}
			else
			{
				if(WordPtr[i] == ' ')
					space=&WordPtr[i++];
				else
				{
					*status=TRUE;
					NextPtr=NULL;
					done=1;
				}
			}
		}
		else
			i++;
	}
	return(WordPtr);
}

// Returns TRUE if I want to insert newitem before list item
BOOL FileNameSortCB(TREELIST *list,TREELIST *newitem)
{
	_TCHAR *first,*second;
	C_Button *btn1,*btn2;
	if(!list || !newitem)
		return(FALSE);

	btn1=(C_Button*)list->Item_;
	btn2=(C_Button*)newitem->Item_;

	if(!btn1 || !btn2)
		return(FALSE);

	first=btn1->GetText(0);
	second=btn2->GetText(0);

	if(!first || !second)
		return(FALSE);
	if(_tcsicmp(second,first) < 0)
		return(TRUE);
	return(FALSE);
}

void GetVirtualFileList(C_Window *win,_TCHAR virtlist[200][64],long client,long group,long cluster,void (*cb)(long,short,C_Base*),long *startx,long *starty)
{
	C_Button *btn;
	C_EditBox *ebox;
	short i,half;
	
	if(!virtlist || !win)
		return;

	half=static_cast<short>((win->ClientArea_[client].right - win->ClientArea_[client].left)/2);
	if(half < 150)
		half=0;

	i=0;
	while(virtlist[i][0] && i < 200)
	{
		btn=new C_Button;
		btn->Setup(C_DONT_CARE,C_TYPE_RADIO,*startx,*starty);
		btn->SetFont(win->Font_);
		btn->SetText(C_STATE_0,virtlist[i]);
		btn->SetText(C_STATE_1,virtlist[i]);
		btn->SetText(C_STATE_DISABLED,virtlist[i]);
		btn->SetFgColor(C_STATE_0,0xcccccc);
		btn->SetFgColor(C_STATE_1,0x00ff00);
		btn->SetFgColor(C_STATE_DISABLED,0x808080);
		btn->SetCallback(cb);
		btn->SetClient(static_cast<short>(client));
		btn->SetGroup(group);
		btn->SetCluster(cluster);
		btn->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
		btn->SetUserNumber(0,1234); // Virtual
		win->AddControl(btn);

		if(!(*starty) && !(*startx))
		{
			ebox=(C_EditBox*)win->FindControl(FILE_NAME);
			if(ebox)
				ebox->SetText(virtlist[i]);
		}
		if(!(*startx) && half)
			(*startx)+=half;
		else
		{
			(*startx)=0;
			(*starty)+=gFontList->GetHeight(win->Font_);
		}
		i++;
	}
	win->ScanClientArea(client);
}

void GetVirtualFileListTree(C_TreeList *tree,_TCHAR virtlist[200][64],long group)
{
	C_Button *btn;
	TREELIST *item;
	short i,UniqueID;
	
	if(!virtlist || !tree)
		return;

	UniqueID=static_cast<short>(tree->GetUserNumber(0));
	if(!UniqueID)
		UniqueID++;

	i=0;
	while(virtlist[i][0] && i < 200)
	{
		btn=new C_Button;
		if(btn)
		{
			btn->Setup(UniqueID,C_TYPE_CUSTOM,0,0);
			btn->SetFont(tree->GetFont());
			btn->SetText(C_STATE_0,virtlist[i]);
			btn->SetText(C_STATE_1,virtlist[i]);
			btn->SetText(C_STATE_DISABLED,virtlist[i]);
			btn->SetFgColor(C_STATE_0,0xcccccc);
			btn->SetFgColor(C_STATE_1,0x00ff00);
			btn->SetFgColor(C_STATE_DISABLED,0x808080);
			btn->SetUserNumber(0,1234); // Virtual
			btn->SetCursorID(tree->GetCursorID());
			btn->SetDragCursorID(tree->GetDragCursorID());

			item=tree->CreateItem(UniqueID++,group,btn);
			if(item)
				tree->AddItem(tree->GetRoot(),item);
		}
		i++;
	}
	tree->SetUserNumber(0,UniqueID);
}

void GetFileList(C_Window *win,_TCHAR *fspec,_TCHAR *excludelist[],long client,long group,long cluster,void (*cb)(long,short,C_Base*),BOOL cutext,long *startx,long *starty)
{
	C_Button *btn;
	C_EditBox *ebox;
	WIN32_FIND_DATA filedata;
	HANDLE ffhnd;
	BOOL last,ignore;
	long i;
	_TCHAR	*ptr, *extension;

	if(!win || !cb) return;

	ffhnd=FindFirstFile(fspec,&filedata);
	last=(ffhnd != INVALID_HANDLE_VALUE);
	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)
		{
			btn=new C_Button;
			btn->Setup(C_DONT_CARE,C_TYPE_RADIO,*startx,*starty);
			btn->SetFont(win->Font_);
			btn->SetText(C_STATE_0,filedata.cFileName);
			btn->SetText(C_STATE_1,filedata.cFileName);
			btn->SetText(C_STATE_DISABLED,filedata.cFileName);
			btn->SetFgColor(C_STATE_0,0xcccccc);
			btn->SetFgColor(C_STATE_1,0x00ff00);
			btn->SetFgColor(C_STATE_DISABLED,0x808080);
			btn->SetCallback(cb);
			btn->SetClient(static_cast<short>(client));
			btn->SetGroup(group);
			btn->SetCluster(cluster);
			btn->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
			btn->SetUserNumber(0,0); // Non virtual
			win->AddControl(btn);

			if(!(*starty))
			{
				ebox=(C_EditBox*)win->FindControl(FILE_NAME);
				if(ebox)
					ebox->SetText(btn->GetText(C_STATE_0));
			}
			(*starty)+=gFontList->GetHeight(win->Font_);
		}
		last= FindNextFile(ffhnd,&filedata);
	}
	win->ScanClientArea(client);
}

void SetDeleteCallback(void (*cb)(long,short,C_Base*))
{
	C_PopupList *popup;

	popup = gPopupMgr->GetMenu (DELETE_FILE_POPUP);
	if (popup)
	{
		popup->SetCallback (LIST_DELETE, cb);
	}
}

void GetFileListTree(C_TreeList *tree,_TCHAR *fspec,_TCHAR *excludelist[],long group,BOOL cutext,long UseMenu)
{
	C_Button *btn;
	TREELIST *item;
	WIN32_FIND_DATA filedata;
	HANDLE ffhnd;
	BOOL last,ignore;
	long i,UniqueID;
	_TCHAR	*ptr, *extension;

	if(!tree) return;

	UniqueID=tree->GetUserNumber(0);
	if(!UniqueID)
		UniqueID++;

	ffhnd=FindFirstFile(fspec,&filedata);
	last=(ffhnd != INVALID_HANDLE_VALUE);
	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)
		{
			btn=new C_Button;
			if(btn)
			{
				btn->Setup(UniqueID,C_TYPE_CUSTOM,0,0);
				btn->SetFont(tree->GetFont());
				btn->SetText(C_STATE_0,filedata.cFileName);
				btn->SetText(C_STATE_1,filedata.cFileName);
				btn->SetText(C_STATE_DISABLED,filedata.cFileName);
				btn->SetFgColor(C_STATE_0,0xcccccc);
				btn->SetFgColor(C_STATE_1,0x00ff00);
				btn->SetFgColor(C_STATE_DISABLED,0x808080);
				btn->SetUserNumber(0,0);
				btn->SetCursorID(tree->GetCursorID());
				btn->SetDragCursorID(tree->GetDragCursorID());
				btn->SetMenu(UseMenu);

				item=tree->CreateItem(UniqueID++,group,btn);
				if(item)
					tree->AddItem(tree->GetRoot(),item);
			}
		}
		last= FindNextFile(ffhnd,&filedata);
	}
	tree->SetUserNumber(0,UniqueID);
}


static void LoadSaveSelectFileCB(long,short hittype,C_Base *control)
{
	C_TreeList *tree;
	C_EditBox *ebox;
	C_Button *btn;
	C_Window *win;
	TREELIST *item;

	if(hittype == C_TYPE_LMOUSEUP)
	{
		if(control)
		{
			tree=(C_TreeList*)control;
			item=tree->GetLastItem();
			if(item)
			{
				tree->SetAllControlStates(0,tree->GetRoot());
				btn=(C_Button*)item->Item_;
				if(btn)
				{
					btn->SetState(1);
					btn->Refresh();
					ebox=(C_EditBox*)btn->Parent_->FindControl(FILE_NAME);
					if(ebox)
					{
						ebox->Refresh();
						ebox->SetText(btn->GetText(C_STATE_0));
						ebox->Refresh();
					}
				}
			}
			tree->Refresh();
		}
	}
	else if(hittype == C_TYPE_LMOUSEDBLCLK)
	{
		if(control)
		{
			win=control->Parent_;
			if(win)
			{
				btn=(C_Button*)win->FindControl(LOAD);
				if(btn && !(btn->GetFlags() & C_BIT_INVISIBLE))
				{
					if(btn->GetCallback())
					{
						btn->GetCallback()(btn->GetID(),C_TYPE_LMOUSEUP,btn);
					}
					return;
				}
				btn=(C_Button*)win->FindControl(LOAD_VIRTUAL);
				if(btn && !(btn->GetFlags() & C_BIT_INVISIBLE))
				{
					if(btn->GetCallback())
					{
						btn->GetCallback()(btn->GetID(),C_TYPE_LMOUSEUP,btn);
					}
					return;
				}
				btn=(C_Button*)win->FindControl(SAVE);
				if(btn && !(btn->GetFlags() & C_BIT_INVISIBLE))
				{
					if(btn->GetCallback())
					{
						btn->GetCallback()(btn->GetID(),C_TYPE_LMOUSEUP,btn);
					}
					return;
				}
			}
		}
	}
}

static void LoadVirtualSelectFileCB(long,short hittype,C_Base *control)
{
	C_TreeList *tree;
	C_EditBox *ebox;
	C_Button *btn;
	TREELIST *item;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if(control)
	{
		tree=(C_TreeList*)control;
		item=tree->GetLastItem();
		if(item)
		{
			tree->SetAllControlStates(0,tree->GetRoot());
			btn=(C_Button*)item->Item_;
			if(btn)
			{
				btn->SetState(1);
				ebox=(C_EditBox*)btn->Parent_->FindControl(FILE_NAME);
				if(ebox)
				{
					ebox->Refresh();
					ebox->SetText(btn->GetText(C_STATE_0));
					ebox->Refresh();
					if(btn->GetUserNumber(0))
					{
						btn=(C_Button*)control->Parent_->FindControl(LOAD);
						if(btn)
							btn->SetFlagBitOn(C_BIT_INVISIBLE);
						btn=(C_Button*)control->Parent_->FindControl(LOAD_VIRTUAL);
						if(btn)
						{
							btn->SetFlagBitOff(C_BIT_INVISIBLE);
							btn->Refresh();
						}
					}
					else
					{
						btn=(C_Button*)control->Parent_->FindControl(LOAD_VIRTUAL);
						if(btn)
							btn->SetFlagBitOn(C_BIT_INVISIBLE);
						btn=(C_Button*)control->Parent_->FindControl(LOAD);
						if(btn)
						{
							btn->SetFlagBitOff(C_BIT_INVISIBLE);
							btn->Refresh();
						}
					}
				}
			}

⌨️ 快捷键说明

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