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

📄 ui_tacref.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <windows.h>
#include "Graphics\Include\TimeMgr.h"
#include "Graphics\Include\imagebuf.h"
#include "dxutil\ddutil.h"
#include "dispcfg.h"
#include "Graphics\Include\renderow.h"
#include "Graphics\Include\RViewPnt.h"
#include "Graphics\Include\drawbsp.h"
#include "unit.h"
#include "classtbl.h"
#include "cmpclass.h"
#include "chandler.h"
#include "cbsplist.h"
#include "Graphics\Include\loader.h"
#include "c3dview.h"
#include "soundfx.h"
#include "fsound.h"
#include "tacref.h"
#include "userids.h"
#include "textids.h"

enum
{
	TACREF_BITMAP_ID=999888777,
};

extern C_Handler *gMainHandler;
extern C_Parser *gMainParser;
extern int TACREFLoaded;

TacticalReference *Reference=NULL;
C_3dViewer *TAC_Viewer=NULL;
long CurrentModel=0;
long CurrentWeapon=0;
long CurrentEntity=0;
BOOL Helicopter=FALSE;
float BladeAngle=0.0f;
int LastRWRTone=-1;
int LastLockTone=-1;

OBJECTINFO TACREF_Object;

void UI_Help_Guide_CB(long ID,short hittype,C_Base *control);
void CloseWindowCB(long ID,short hittype,C_Base *control);
void FindCameraDeltas(OBJECTINFO *Info);
void UnloadObject();
void TacRef_Cleanup();
void PositandOrientSetData (float x, float y, float z, float pitch, float roll, float yaw,
                            Tpoint* simView, Trotation* viewRotation);

enum
{
	GROUP_COUNT=3,
	SUBGROUP_COUNT=18,
};

static long GroupButtonID[GROUP_COUNT]=
{
	CAT_AIRCRAFT,
	CAT_VEHICLES,
	CAT_MUNITIONS,
};

static long SubGroupButtonID[SUBGROUP_COUNT]=
{
	SUB_CAT_AIRCRAFT_FIGHTERS,
	SUB_CAT_AIRCRAFT_ATTACK,
	SUB_CAT_AIRCRAFT_BOMBERS,
	SUB_CAT_AIRCRAFT_HELICOPTERS,
	SUB_CAT_AIRCRAFT_SUPPORT,
	SUB_CAT_AIRCRAFT_EW,
	SUB_CAT_VEHICLES_TANKS,
	SUB_CAT_VEHICLES_IFVS,
	SUB_CAT_VEHICLES_ARTILLERY,
	SUB_CAT_VEHICLES_AIRDEFENSE,
	SUB_CAT_VEHICLES_SUPPORT,
	SUB_CAT_VEHICLES_SHIPS,
	SUB_CAT_MUNITIONS_AAM,
	SUB_CAT_MUNITIONS_AGM,
	SUB_CAT_MUNITIONS_ARM,
	SUB_CAT_MUNITIONS_BOMBS,
	SUB_CAT_MUNITIONS_STORES,
	SUB_CAT_MUNITIONS_GROUND,
};

void TACMoveRendererCB(C_Window *win)
{
	if(TAC_Viewer)
		TAC_Viewer->Viewport(win,0);
}	
		
void TACREF_ViewBSPObjectCB(long,short,C_Base *control)
{
	F4CSECTIONHANDLE *Leave;

	if (TAC_Viewer)	
	{
		Leave=UI_Enter(control->Parent_);
		TheLoader.WaitForLoader();
		TAC_Viewer->View3d(CurrentModel);
		UI_Leave(Leave);
	}
}

void StopRWRSounds()
{
	C_Window *win;
	C_Button *btn;

	if(LastLockTone != -1)
	{
		F4StopSound (SFX_DEF[LastLockTone].handle);
		LastLockTone=-1;
	}
	if(LastRWRTone != -1)
	{
		F4StopSound (SFX_DEF[LastRWRTone].handle);
		LastLockTone=-1;
	}

	win=gMainHandler->FindWindow(TAC_REF_WIN);
	if(win)
	{
		btn=(C_Button *)win->FindControl(PLAY_SEARCH_TONE);
		if(btn)
		{
			btn->SetState(0);
			btn->Refresh();
		}
																		
		btn=(C_Button *)win->FindControl(PLAY_LOCK_TONE);
		if(btn)
		{
			btn->SetState(0);
			btn->Refresh();
		}
	}
}

void TACREFCloseWindowCB(long ID,short hittype,C_Base *control)
{
	if(hittype != C_TYPE_LMOUSEUP)
		return;

	StopRWRSounds();
	CloseWindowCB(ID,hittype,control);
	TacRef_Cleanup();
}

void TACREF_PositionCamera(OBJECTINFO *Info,C_Window *win,long client)
{
	if(!TAC_Viewer || !Info || !win)
		return;

	FindCameraDeltas(Info);

	TAC_Viewer->SetCamera(Info->DeltaX,Info->DeltaY,Info->DeltaZ,Info->Heading,-Info->Pitch,0.0f);
	win->RefreshClient(client);
}

static void TACREF_PannerCB(long,short hittype,C_Base *control)
{
	float dx,dy;
	C_Panner *pnr;

	if(hittype != C_TYPE_LMOUSEUP && hittype != C_TYPE_REPEAT)
		return;

	pnr = static_cast<C_Panner *>(control);
	dx  = static_cast<float>(pnr->GetHRange());
	dy  = static_cast<float>(pnr->GetVRange());

	TACREF_Object.Heading+=dx;
	TACREF_Object.Pitch+=dy;
	if(TACREF_Object.Heading < 0) TACREF_Object.Heading+=360;
	if(TACREF_Object.Heading > 360) TACREF_Object.Heading-=360;
	if(TACREF_Object.CheckPitch)
	{
		if(TACREF_Object.Pitch < TACREF_Object.MinPitch) TACREF_Object.Pitch=TACREF_Object.MinPitch;
		if(TACREF_Object.Pitch > TACREF_Object.MaxPitch) TACREF_Object.Pitch=TACREF_Object.MaxPitch;
	}
	else
	{
		if(TACREF_Object.Pitch < 0) TACREF_Object.Pitch+=360;
		if(TACREF_Object.Pitch > 360) TACREF_Object.Pitch-=360;
	}
	TACREF_PositionCamera(&TACREF_Object,control->Parent_,control->GetClient());
}

static void TACREF_ZoomCB(long,short hittype,C_Base *control)
{
	float dy;
	C_Panner *pnr;

	if(hittype != C_TYPE_LMOUSEUP && hittype != C_TYPE_REPEAT)
		return;

	pnr=(C_Panner*)control;
	dy=static_cast<float>(pnr->GetVRange());

	TACREF_Object.Distance+=dy;
	if(TACREF_Object.Distance < TACREF_Object.MinDistance) TACREF_Object.Distance=TACREF_Object.MinDistance;
	if(TACREF_Object.Distance > TACREF_Object.MaxDistance) TACREF_Object.Distance=TACREF_Object.MaxDistance;

	TACREF_PositionCamera(&TACREF_Object,control->Parent_,control->GetClient());
}

void TACREF_ViewTimerAnimCB(long,short,C_Base *control)
{
	BSPLIST *obj;
	if(control->GetUserNumber(_UI95_TIMER_COUNTER_) < 1)
	{
		if(Helicopter)
		{
			obj=TAC_Viewer->Find(CurrentModel);
			if(obj)
			{
				BladeAngle += PI * 0.2f;
				if(BladeAngle > (PI*2.0f))
					BladeAngle -= PI*2.0f;

				((DrawableBSP*)obj->object)->SetDOFangle(2,BladeAngle);
				((DrawableBSP*)obj->object)->SetDOFangle(4,BladeAngle);
			}
		}

		if(control->GetFlags() & C_BIT_ABSOLUTE)
		{
			control->Parent_->RefreshWindow();
		}
		else
			control->Parent_->RefreshClient(control->GetClient());
		control->SetUserNumber(_UI95_TIMER_COUNTER_,control->GetUserNumber(_UI95_TIMER_DELAY_));
	}
	control->SetUserNumber(_UI95_TIMER_COUNTER_,control->GetUserNumber(_UI95_TIMER_COUNTER_)-1);
}

void TACREF_ViewTimerCB(long,short,C_Base *control)
{
	control->Parent_->RefreshClient(0);
}

static void BuildCatTree(Category *cat,C_TreeList *tree,TREELIST *parent)
{
	C_Text *txt;
	TREELIST *item;
	CatText *cattext;
	long textval=0;

	cattext=cat->GetFirst(&textval);
	while(cattext)
	{
		txt=new C_Text;
		txt->Setup(C_DONT_CARE,0);
		txt->SetFixedWidth(cattext->length);
		txt->SetText(cattext->String);
		txt->SetFont(tree->GetFont());

		item=tree->CreateItem(C_DONT_CARE,C_TYPE_ITEM,txt);
		if(item)
			tree->AddChildItem(parent,item);

		cattext=cat->GetNext(&textval);
	}
}

static void BuildStatsTree(Statistics *stats,C_TreeList *tree)
{
	C_Text *txt;
	Category *cat;
	TREELIST *par;
	long catval=0; // internal... don't use for anything
	long UniqueID=1;

	if(!stats || !tree)
		return;

	tree->Parent_->ScanClientArea(tree->GetClient());
	cat=stats->GetFirst(&catval);
	while(cat)
	{
		txt=new C_Text;
		txt->Setup(C_DONT_CARE,0);
		txt->SetFixedWidth(40);
		txt->SetFont(tree->GetFont());
		txt->SetText(cat->Name);

		par=tree->CreateItem(UniqueID++,C_TYPE_MENU,txt);
		if(par)
		{
			tree->AddItem(tree->GetRoot(),par);
			BuildCatTree(cat,tree,par);
		}
		cat=stats->GetNext(&catval);
	}
	tree->RecalcSize();
	tree->Parent_->ScanClientArea(tree->GetClient());
	tree->Parent_->RefreshClient(tree->GetClient());
}

static void BuildDescTree(Description *desc,C_TreeList *tree)
{
	C_Text *txt;
	TREELIST *item;
	TextString *desctext;
	long textval=0;
	long UniqueID=1;

	if(!desc || !tree)
		return;

	tree->Parent_->ScanClientArea(tree->GetClient());
	desctext=desc->GetFirst(&textval);
	while(desctext)
	{
		txt=new C_Text;
		txt->Setup(UniqueID,0);
		txt->SetW(tree->Parent_->ClientArea_[tree->GetClient()].right-tree->Parent_->ClientArea_[tree->GetClient()].left-10 - tree->GetX());
		txt->SetFlagBitOn(C_BIT_WORDWRAP);
		txt->SetFont(tree->GetFont());
		txt->SetFixedWidth(desctext->length);
		txt->SetText(desctext->String);

		item=tree->CreateItem(UniqueID++,C_TYPE_ITEM,txt);
		if(item)
			tree->AddItem(tree->GetRoot(),item);

		desctext=desc->GetNext(&textval);
	}
	tree->RecalcSize();
	tree->Parent_->ScanClientArea(tree->GetClient());
	tree->Parent_->RefreshClient(tree->GetClient());
}

void SelectRWR(long ID)
{
	C_Window *win;
	C_ListBox *lbox;
	C_Button *btn;
	LISTBOX *item;

	win=gMainHandler->FindWindow(TAC_REF_WIN);
	if(win)
	{
		lbox=(C_ListBox*)win->FindControl(RWR_LIST);
		if(lbox)
		{
			item=lbox->FindID(ID);
			if(item)
			{
				btn=(C_Button*)win->FindControl(PLAY_LOCK_TONE);
				if(btn)
					btn->SetUserNumber(0,item->Label_->GetUserNumber(3));

				btn=(C_Button*)win->FindControl(LOCK_ICON);
				if(btn)
				{
					btn->Refresh();
					btn->SetState(static_cast<short>(item->Label_->GetUserNumber(1)));
					btn->Refresh();
				}
			}
			else
			{
				btn=(C_Button*)win->FindControl(PLAY_LOCK_TONE);
				if(btn)
					btn->SetUserNumber(0,-1);

				btn=(C_Button*)win->FindControl(LOCK_ICON);
				if(btn)
				{
					btn->Refresh();
					btn->SetState(0);
					btn->Refresh();
				}
			}
		}
	}
}

static void BuildRWRList(RWR *rwr,C_ListBox *listbox)
{
	Radar *radar;
	long rwrval=0;
	long UniqueID=1;

	if(!rwr || !listbox)
		return;

	radar=rwr->GetFirst(&rwrval);
	if(radar)
	{
		while(radar)
		{
			listbox->AddItem(UniqueID,C_TYPE_ITEM,radar->Name);
			listbox->SetItemUserData(UniqueID,0,radar->SearchState);
			listbox->SetItemUserData(UniqueID,1,radar->LockState);
			listbox->SetItemUserData(UniqueID,2,radar->SearchTone);
			listbox->SetItemUserData(UniqueID,3,radar->LockTone);
			UniqueID++;
			radar=rwr->GetNext(&rwrval);
		}
	}
	else
	{
		listbox->AddItem(1,C_TYPE_ITEM,TXT_NO_RADAR);
		listbox->SetItemUserData(1,0,0);
		listbox->SetItemUserData(1,1,0);
		listbox->SetItemUserData(1,2,-1);
		listbox->SetItemUserData(1,3,-1);
	}
	listbox->SetValue(1);
}

⌨️ 快捷键说明

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