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

📄 oob.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*



	The Big OOB (Order of Battle)


*/

#include <windows.h>
#include "unit.h"
#include "campwp.h"
#include "campstr.h"
#include "squadron.h"
#include "flight.h"
#include "team.h"
#include "find.h"
#include "division.h"
#include "misseval.h"
#include "camplist.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "uicomms.h"
#include "userids.h"
#include "textids.h"
#include "classtbl.h"
#include "cmap.h"
#include "gps.h"
#include "logbook.h"
#include "remotelb.h"
#include "msginc\requestlogbook.h"
#include "ui_cmpgn.h"
#include "filters.h"
#include "urefresh.h"
#include "gps.h"
#include "cmap.h"
#include "teamdata.h"

enum
{
	SMALL_AF				=200100,
	SMALL_ARMY				=200101,
	SMALL_NAVY				=200102,
	SMALL_OBJ				=200103,
};

extern C_Handler *gMainHandler;
extern GlobalPositioningSystem *gGps;
C_Base *BuildOOBItem(CampEntity entity);
SQUADRONPLAYER *gPlayerSquadrons=NULL;
VU_ID gSelectedAirbase=FalconNullId;

extern GlobalPositioningSystem *gGps;
extern C_Map *gMapMgr;

static long TeamFlagBtnIDs[NUM_TEAMS]=
{
	GROUP1_FLAG,
	GROUP2_FLAG,
	GROUP3_FLAG,
	GROUP4_FLAG,
	GROUP5_FLAG,
	GROUP6_FLAG,
	GROUP7_FLAG,
	GROUP8_FLAG,
};

static long TeamColorCtrlIDs[NUM_TEAMS]=
{ // C_Line
	GROUP1_COLOR,
	GROUP2_COLOR,
	GROUP3_COLOR,
	GROUP4_COLOR,
	GROUP5_COLOR,
	GROUP6_COLOR,
	GROUP7_COLOR,
	GROUP8_COLOR,
};

static long ObjectiveCategoryNames[]=
{
	0,
	TXT_AIRDEFENSES,
	TXT_AIRFIELDS,
	TXT_ARMY,
	TXT_CCC,
	TXT_INFRASTRUCTURE,
	TXT_LOGISTICS,
	TXT_OTHER,
	TXT_NAVIGATION,
	TXT_POLITICAL,
	TXT_WARPRODUCTION,
	TXT_NAVAL,
	0,
	0,
};

static long SectionFilterBtns[4]=
{
	AF_FILTER,
	ARMY_FILTER,
	NAVY_FILTER,
	OBJECTIVE_FILTER,
};

static long OOBCategories[4]=
{
	OOB_AIRFORCE,
	OOB_ARMY,
	OOB_NAVY,
	OOB_OBJECTIVE,
};

long TeamNameIDs[NUM_TEAMS]=
{
	TXT_NEUTRAL,
	TXT_COMBINEDFORCES,
	TXT_COMBINEDFORCES,
	TXT_JAPAN,
	TXT_CIS,
	TXT_CHINA,
	TXT_DPRK,
	TXT_NEUTRAL,
};

char gOOB_Visible[NUM_TEAMS];

// C_Button OOB_FIND_UNIT
// C_Button OOB_UNIT_INFO

C_TreeList *gOOBTree;
C_Squadron *BuildSquadronInfo(Squadron sqd);
C_Entity *BuildCategory(long Type);
void UpdateCategory(C_Entity *category);
void SetupSquadronInfoWindow(VU_ID TheID);
void SetupUnitInfoWindow(VU_ID TheID);
void SetupDivisionInfoWindow(long DivID,short owner);
void BuildSpecificTargetList(VU_ID targetID);

VU_ID gSelectedEntity;
long gSelectedDivision=0;

void SelectOOBSquadronCB(long,short hittype,C_Base *control)
{
	C_Squadron *squad;
	if(hittype != C_TYPE_LMOUSEUP)
		return;

	gOOBTree->SetAllControlStates(0,gOOBTree->GetRoot());
	squad=(C_Squadron*)control;
	squad->SetState(1);
	squad->Refresh();

	gSelectedEntity=squad->GetVUID();
	gSelectedDivision=0;
}

void SelectOOBEntityCB(long,short hittype,C_Base *control)
{
	C_Entity *ent;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	gOOBTree->SetAllControlStates(0,gOOBTree->GetRoot());
	ent=(C_Entity*)control;
	ent->SetState(1);
	ent->Refresh();

	if(ent->GetID() & UR_DIVISION)
	{
		gSelectedDivision=ent->GetID();
		gSelectedEntity=FalconNullId;
	}
	else
	{
		gSelectedEntity=ent->GetVUID();
		gSelectedDivision=0;
	}
}

void SetupOOBWindow()
{
	C_Window *win;
	long i,j,cat,TeamID;
	C_Button *btn;
	C_Line   *line;
	C_Text *txt;
	TREELIST *team;
	C_Entity *category;
	short idx;

	win=gMainHandler->FindWindow(OOB_WIN);
	if(win)
	{
		idx=0;
		for(i=0;i<NUM_TEAMS;i++)
		{
			if(TeamInfo[i] && ((TeamInfo[i]->flags & TEAM_ACTIVE) || GetTeam(static_cast<uchar>(i)) != i))
			{
				btn=(C_Button*)win->FindControl(TeamFlagBtnIDs[idx]);
				if(btn)
				{
					btn->SetImage(C_STATE_0,FlagImageID[TeamInfo[i]->GetFlag()][BIG_VERT_DARK]);
					btn->SetImage(C_STATE_1,FlagImageID[TeamInfo[i]->GetFlag()][BIG_VERT]);
					btn->SetFlagBitOff(C_BIT_INVISIBLE);
					btn->SetHelpText(gStringMgr->AddText(TeamInfo[i]->GetName()));
					btn->SetUserNumber(0,i);
					if(btn->GetState())
						gOOB_Visible[i]=1;
					else
						gOOB_Visible[i]=0;
				}
				line=(C_Line*)win->FindControl(TeamColorCtrlIDs[idx]);
				if(line)
				{
					if(TeamInfo[GetTeam(static_cast<uchar>(i))] && TeamInfo[GetTeam(static_cast<uchar>(i))]->flags & TEAM_ACTIVE)
						line->SetColor(TeamColorList[TeamInfo[GetTeam(static_cast<uchar>(i))]->GetColor()]);
					else
						line->SetColor(TeamColorList[TeamInfo[i]->GetColor()]);
					line->SetFlagBitOff(C_BIT_INVISIBLE);
				}
				idx++;
			}
			else
				gOOB_Visible[i]=0;
		}
		while(idx < NUM_TEAMS)
		{
			btn=(C_Button*)win->FindControl(TeamFlagBtnIDs[idx]);
			if(btn)
				btn->SetFlagBitOn(C_BIT_INVISIBLE);

			line=(C_Line*)win->FindControl(TeamColorCtrlIDs[idx]);
			if(line)
				line->SetFlagBitOn(C_BIT_INVISIBLE);
			idx++;
		}

		// Setup OOB Team Branches
		if(gOOBTree)
		{
			idx=0;
			for(i=0;i<NUM_TEAMS;i++)
			{
				if(TeamInfo[i] && ((TeamInfo[i]->flags & TEAM_ACTIVE) || GetTeam(static_cast<uchar>(i)) != i))
				{
					for(j=0;j<4;j++)
					{
						btn=(C_Button*)win->FindControl(SectionFilterBtns[j]);
						if(btn && btn->GetState())
							cat=1;
						else
							cat=0;

						TeamID=(i << 24) | OOBCategories[j];

						team=gOOBTree->Find(TeamID);
						if(!team)
						{
							category=BuildCategory(TeamID);
							if(category)
							{
								team=gOOBTree->CreateItem(TeamID,/* category->GetType() */ C_TYPE_MENU,category);
								category->SetOwner(team);
								category->SetFont(gOOBTree->GetParent()->Font_);
								if(gOOB_Visible[i] && cat)
									category->SetFlagBitOff(C_BIT_INVISIBLE);
								else
									category->SetFlagBitOn(C_BIT_INVISIBLE);
							}
							else
							{
								txt=new C_Text;
								txt->Setup(TeamID,0);
								txt->SetText(gStringMgr->GetText(gStringMgr->AddText("Bermuda Triangle")));
								txt->SetFont(gOOBTree->GetParent()->Font_);
								team=gOOBTree->CreateItem(TeamID,C_TYPE_MENU,txt);
								if(gOOB_Visible[i] && cat)
									txt->SetFlagBitOff(C_BIT_INVISIBLE);
								else
									txt->SetFlagBitOn(C_BIT_INVISIBLE);
							}
							gOOBTree->AddItem(gOOBTree->GetRoot(),team);
						}
						else
							UpdateCategory((C_Entity*)team->Item_);
					}
					idx++;
				}
			}
		}
		win->RefreshWindow();
	}
}

BOOL FindChildren(TREELIST *list,short owner)
{
	TREELIST *item;
	if(!list || !owner)
		return(FALSE);

	item=list;
	while(item)
	{
		if(item->Item_->GetUserNumber(0) == owner)
			return(TRUE);
		if(item->Child)
			if(FindChildren(item->Child,owner))
				return(TRUE);
		item=item->Next;
	}
	return(FALSE);
}

BOOL FindOtherChildren(TREELIST *list,short owner)
{
	TREELIST *item;
	if(!list || !owner)
		return(FALSE);

	item=list;
	while(item)
	{
		if(!(item->Item_->GetFlags() & C_BIT_INVISIBLE))
		{
			if(item->Item_->GetUserNumber(0) != owner)
				return(TRUE);
			if(item->Child)
				if(FindOtherChildren(item->Child,owner))
					return(TRUE);
		}
		item=item->Next;
	}
	return(FALSE);
}

void ToggleOOBTeamCB(long,short hittype,C_Base *control)
{
	C_Window *win;
	C_Button *btn;
	long i,j,TeamID;
	short owner;
	BOOL TurnOn,DontTurnOff;
	TREELIST *root,*child;
	F4CSECTIONHANDLE *Leave;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	win=control->GetParent();
	if(!win)
		return;

	Leave=UI_Enter(control->Parent_);

	owner=static_cast<short>(control->GetUserNumber(0));
	TeamID=GetTeam(static_cast<uchar>(owner));

	if(control->GetState())
	{
		gOOB_Visible[owner]=1;
		TurnOn=TRUE;
	}
	else
	{
		gOOB_Visible[owner]=0;
		TurnOn=FALSE;
	}

	if(TurnOn)
	{
		for(i=0;i<4;i++)
		{
			btn=(C_Button*)win->FindControl(SectionFilterBtns[i]);
			if(btn && btn->GetState())
			{
				root=gOOBTree->Find((TeamID << 24) | OOBCategories[i]);
				if(root && root->Item_->GetFlags() & C_BIT_INVISIBLE)
					root->Item_->SetFlagBitOff(C_BIT_INVISIBLE);
			}
		}
	}
	else
	{
		DontTurnOff=FALSE;
		for(i=0;i<NUM_TEAMS;i++)
		{
			btn=(C_Button *)win->FindControl(TeamFlagBtnIDs[i]);
		if(btn && i != owner)
			{
				if((GetTeam(static_cast<uchar>(btn->GetUserNumber(0))) == TeamID) && btn->GetState())
					DontTurnOff=TRUE;
			}
		}
		if(!DontTurnOff)
			for(i=0;i<4;i++)
			{
				root=gOOBTree->Find((TeamID << 24) | OOBCategories[i]);
				if(root)
					root->Item_->SetFlagBitOn(C_BIT_INVISIBLE);
			}
	}

	for(i=0;i<4;i++)
	{
		for(j=0;j<8;j++)
		{
			root=gOOBTree->Find((j << 24) | OOBCategories[i]);
			if(root)
			{
				root=root->Child;
				while(root)
				{
					if(TurnOn)
					{
						if(root->Item_->GetUserNumber(0) == owner || FindChildren(root->Child,owner))
						{
							root->Item_->SetFlagBitOff(C_BIT_INVISIBLE);
							child=root->Child;
							while(child)
							{
								if(child->Item_->GetUserNumber(0) == owner)
									child->Item_->SetFlagBitOff(C_BIT_INVISIBLE);
								child=child->Next;
							}
						}
					}
					else
					{
						if(root->Item_->GetUserNumber(0) == owner && !FindOtherChildren(root->Child,owner))
							root->Item_->SetFlagBitOn(C_BIT_INVISIBLE);
						else
						{
							child=root->Child;
							while(child)
							{
								if(child->Item_->GetUserNumber(0) == owner)
									child->Item_->SetFlagBitOn(C_BIT_INVISIBLE);
								child=child->Next;
							}
						}
					}
					root=root->Next;
				}
			}
		}
	}

	gOOBTree->RecalcSize();
	gOOBTree->Parent_->RefreshClient(gOOBTree->GetClient());
	UI_Leave(Leave);
}

void ToggleOOBFilterCB(long ID,short hittype,C_Base *control)
{
	C_Button *btn=NULL;
	long i,Cat=0,j=0;
	short owner;
	TREELIST *root=NULL,*child=NULL;
	BOOL TurnOn=FALSE;

	F4CSECTIONHANDLE *Leave;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	Leave=UI_Enter(control->Parent_);

	owner=static_cast<short>(control->GetUserNumber(0));

	for(i=0;i<4;i++)
		if(ID == SectionFilterBtns[i])
			Cat=OOBCategories[i];

	if(control->GetState())
		TurnOn=TRUE;
	else
		TurnOn=FALSE;

	if(TurnOn)
	{
		for(i=0;i<8;i++)
		{
			btn=(C_Button*)control->GetParent()->FindControl(TeamFlagBtnIDs[i]);
			if(btn && !(btn->GetFlags() & C_BIT_INVISIBLE) && btn->GetState())
			{
				root=gOOBTree->Find((GetTeam(static_cast<uchar>(i)) << 24) | Cat);
				if(root && root->Item_->GetFlags() & C_BIT_INVISIBLE)
					root->Item_->SetFlagBitOff(C_BIT_INVISIBLE);
			}
		}
	}
	else
	{
		root=gOOBTree->GetRoot();
		while(root)
		{
			if(root->ID_ & Cat)
				root->Item_->SetFlagBitOn(C_BIT_INVISIBLE);
			root=root->Next;
		}
	}

	for(i=0;i<4;i++)
	{
		for(j=0;j<8;j++)

⌨️ 快捷键说明

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