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

📄 oob.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	}
	else if(entity->IsTaskForce())
	{
		builder=BuildNavalUnitInfo((Unit)entity);
		if(builder)
		{
			((C_Entity*)builder)->SetCallback(SelectOOBEntityCB);
			return(builder);
		}
	}
	else if(entity->IsObjective())
	{
		builder=BuildObjectiveInfo((Objective)entity);
		if(builder)
		{
			((C_Entity*)builder)->SetCallback(SelectOOBEntityCB);
			return(builder);
		}
	}
	return(NULL);
}

C_Entity *BuildCategory(long Type)
{
	C_Entity *newinfo;
	_TCHAR buffer[200];
	IMAGE_RSC *img;
	int i;

	// This type DOESN'T have the BLACK & BLUE Background

	// Create new parent class
	newinfo=new C_Entity;
	newinfo->Setup(Type,0);
	newinfo->SetWH(320,22);
	newinfo->InitEntity();

	if(Type & OOB_AIRFORCE)
	{
		img=gImageMgr->GetImage(SMALL_AF);
		if(img)
			i=img->Header->h;
		else
			i=20;
		if(i > 20)
			newinfo->SetH(i+2);
		newinfo->SetIcon(15,static_cast<short>(i/2),SMALL_AF);
		if(TheCampaign.Flags & CAMP_TACTICAL)
			_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_AIRFORCES),TeamInfo[(Type & OOB_TEAM_MASK) >> 24]->GetName());
		else
			_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_AIRFORCES),gStringMgr->GetString(TeamNameIDs[(Type & OOB_TEAM_MASK) >> 24]));
	}
	else if(Type & OOB_ARMY)
	{
		img=gImageMgr->GetImage(SMALL_AF);
		if(img)
			i=img->Header->h;
		else
			i=20;
		if(i > 20)
			newinfo->SetH(i+2);

		newinfo->SetIcon(15,static_cast<short>(i/2),SMALL_ARMY);
		if(TheCampaign.Flags & CAMP_TACTICAL)
			_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_ARMY),TeamInfo[(Type & OOB_TEAM_MASK) >> 24]->GetName());
		else
			_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_ARMY),gStringMgr->GetString(TeamNameIDs[(Type & OOB_TEAM_MASK) >> 24]));
	}
	else if(Type & OOB_NAVY)
	{
		img=gImageMgr->GetImage(SMALL_AF);
		if(img)
			i=img->Header->h;
		else
			i=20;
		if(i > 20)
			newinfo->SetH(i+2);
		newinfo->SetIcon(15,static_cast<short>(i/2),SMALL_NAVY);
		if(TheCampaign.Flags & CAMP_TACTICAL)
			_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_NAVALFORCES),TeamInfo[(Type & OOB_TEAM_MASK) >> 24]->GetName());
		else
			_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_NAVALFORCES),gStringMgr->GetString(TeamNameIDs[(Type & OOB_TEAM_MASK) >> 24]));
	}
	else if(Type & OOB_OBJECTIVE)
	{
		img=gImageMgr->GetImage(SMALL_AF);
		if(img)
			i=img->Header->h;
		else
			i=20;
		if(i > 20)
			newinfo->SetH(i+2);
		newinfo->SetIcon(15,static_cast<short>(i/2),SMALL_OBJ);
		if(TheCampaign.Flags & CAMP_TACTICAL)
			_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_OBJECTIVES),TeamInfo[(Type & OOB_TEAM_MASK) >> 24]->GetName());
		else
			_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_OBJECTIVES),gStringMgr->GetString(TeamNameIDs[(Type & OOB_TEAM_MASK) >> 24]));
	}

	// Set Name
	newinfo->SetName(35,0,gStringMgr->GetText(gStringMgr->AddText(buffer)));

	return(newinfo);
}

// This basically changes the team name
void UpdateCategory(C_Entity *category)
{
	long Type;
	_TCHAR buffer[200];

	if(!category)
		return;

	Type=category->GetID();

	if(Type & OOB_AIRFORCE)
	{
		_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_AIRFORCES),TeamInfo[(Type & OOB_TEAM_MASK) >> 24]->GetName());
	}
	else if(Type & OOB_ARMY)
	{
		_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_ARMY),TeamInfo[(Type & OOB_TEAM_MASK) >> 24]->GetName());
	}
	else if(Type & OOB_NAVY)
	{
		_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_NAVALFORCES),TeamInfo[(Type & OOB_TEAM_MASK) >> 24]->GetName());
	}
	else if(Type & OOB_OBJECTIVE)
	{
		_stprintf(buffer,"%s : %s",gStringMgr->GetString(TXT_OBJECTIVES),TeamInfo[(Type & OOB_TEAM_MASK) >> 24]->GetName());
	}
	category->SetName(35,0,gStringMgr->GetText(gStringMgr->AddText(buffer)));
}

C_Entity *AddDivisionToOOB(Division div)
{
	TREELIST *Team_Cat=NULL,*item=NULL;
	Unit un;
	C_Entity *oobitem=NULL;
	long TeamID,Cat;

	if(!div)
		return(NULL);

	un=div->GetFirstUnitElement();
	if(!un)
		return(NULL);

	while(un && un->GetSType() != div->type)
		un=div->GetNextUnitElement();

	if(!un)
		un=div->GetFirstUnitElement();

	TeamID=(un->GetTeam() << 24);
	Cat=FindUnitCategory(un);
	if(!Cat)
		return(NULL);

	TeamID |= Cat;
	Team_Cat=gOOBTree->Find(TeamID);
	if(Team_Cat)
	{
		item=gOOBTree->Find((un->GetTeam() << 24) | div->nid | UR_DIVISION);
		if(item)
			return((C_Entity *)item->Item_);
		oobitem=BuildDivisionInfo(div,un);
		if(oobitem)
		{
			oobitem->SetCallback(SelectOOBEntityCB);
			item=gOOBTree->CreateItem(oobitem->GetID(),/* oobitem->GetType()*/ C_TYPE_ITEM,oobitem);
			if(item)
			{
				if(oobitem->_GetCType_() == _CNTL_ENTITY_)
					((C_Entity*)oobitem)->SetOwner(item);
				else if(oobitem->_GetCType_() == _CNTL_SQUAD_)
					((C_Squadron*)oobitem)->SetOwner(item);
				oobitem->SetFont(gOOBTree->GetFont());
				gOOBTree->AddChildItem(Team_Cat,item);
			}
			else
			{
				oobitem->Cleanup();
				delete oobitem;
				oobitem=NULL;
			}
		}
	}
	return(oobitem);
}

C_Base *AddItemToOOB(CampEntity entity)
{
	TREELIST *Team_Cat,*item,*subcat;
	CampEntity Base;
	C_Entity  *BaseInfo;
	C_Base *oobitem=NULL;
	C_Text *txt;
	Unit upar;
	long TeamID,Cat,Type,idx,DivID;

	TeamID=(entity->GetTeam() << 24);
	if(entity->IsUnit())
		Cat=FindUnitCategory((Unit)entity);
	else if(entity->IsObjective())
		Cat=GetObjectiveCategory((Objective)entity);
	else
		Cat=0;

	if(!Cat)
		return(NULL);

	TeamID |= Cat;
	Team_Cat=gOOBTree->Find(TeamID);
	if(Team_Cat)
	{
		item=gOOBTree->Find(entity->GetCampID());
		if(item)
			return(item->Item_);
		oobitem=BuildOOBItem(entity);
		if(oobitem)
		{
			if(gOOB_Visible[entity->GetOwner()]) // MUST be GetOwner not GetTeam
				oobitem->SetFlagBitOff(C_BIT_INVISIBLE);
			else
				oobitem->SetFlagBitOn(C_BIT_INVISIBLE);

			if(Cat != OOB_OBJECTIVE)
			{
				if(entity->IsSquadron())
				{
					BaseInfo=NULL;
					Base=((Squadron)entity)->GetUnitAirbase();
					if(Base && Base != entity)
					{
						subcat=gOOBTree->Find(Base->GetCampID());
						if(!subcat)
						{
							BaseInfo=(C_Entity*)AddItemToOOB(Base);
							if(BaseInfo)
								subcat=BaseInfo->GetOwner();
							else
							{
								oobitem->Cleanup();
								delete oobitem;
								return(NULL);
							}
						}
					}
					else
						subcat=Team_Cat;
				}
				else if(entity->IsBattalion())
				{
					upar=((Unit)entity)->GetUnitParent();
					if(upar)
					{
						subcat=gOOBTree->Find(upar->GetCampID());
						if(!subcat)
						{
							BaseInfo=(C_Entity*)AddItemToOOB(upar);
							if(BaseInfo)
								subcat=BaseInfo->GetOwner();
							else
							{
								oobitem->Cleanup();
								delete oobitem;
								return(NULL);
							}
						}
					}
					else
					{
						DivID=((Unit)entity)->GetUnitDivision();
						if(DivID)
						{
							subcat=gOOBTree->Find((entity->GetTeam() << 24) | DivID | UR_DIVISION);
							if(!subcat)
							{
								BaseInfo=AddDivisionToOOB(GetDivisionByUnit((Unit)entity));
								if(BaseInfo)
									subcat=BaseInfo->GetOwner();
								else
								{
									oobitem->Cleanup();
									delete oobitem;
									return(NULL);
								}
							}
						}
						else
							subcat=Team_Cat;
					}
				}
				else if(entity->IsBrigade())
				{
					DivID=((Unit)entity)->GetUnitDivision();
					if(DivID)
					{
						subcat=gOOBTree->Find((entity->GetTeam() << 24) | DivID | UR_DIVISION);
						if(!subcat)
						{
							BaseInfo=AddDivisionToOOB(GetDivisionByUnit((Unit)entity));
							if(BaseInfo)
								subcat=BaseInfo->GetOwner();
							else
							{
								oobitem->Cleanup();
								delete oobitem;
								return(NULL);
							}
						}
					}
					else
						subcat=Team_Cat;
				}
				else
					subcat=Team_Cat;
			}
			else if(Cat == OOB_OBJECTIVE)
			{
				idx=FindObjectiveIndex((Objective)entity);
				if(idx >= 0)
				{
					Type=ObjectiveFilters[idx].UIType;
					subcat=gOOBTree->Find((entity->GetTeam() << 24) | Type);
					if(!subcat)
					{
						txt=new C_Text;
						txt->Setup(Type,0);
						txt->SetFont(gOOBTree->GetFont());
						txt->SetText(ObjectiveCategoryNames[FindTypeIndex(Type,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_)]);
						subcat=gOOBTree->CreateItem((entity->GetTeam() << 24) | Type,C_TYPE_MENU,txt);
						gOOBTree->AddChildItem(Team_Cat,subcat);
					}
				}
				else
					subcat=Team_Cat;
			}
			else
				subcat=Team_Cat;

			item=gOOBTree->CreateItem(oobitem->GetID(),/* oobitem->GetType() */ C_TYPE_ITEM,oobitem);
			if(item)
			{
				if(oobitem->_GetCType_() == _CNTL_ENTITY_)
				{
					((C_Entity*)oobitem)->SetOwner(item);
					((C_Entity*)oobitem)->SetFont(gOOBTree->GetFont());
				}
				else if(oobitem->_GetCType_() == _CNTL_SQUAD_)
				{
					((C_Squadron*)oobitem)->SetOwner(item);
					((C_Squadron*)oobitem)->SetFont(gOOBTree->GetFont());
				}
				gOOBTree->AddChildItem(subcat,item);
			}
			else
			{
				oobitem->Cleanup();
				delete oobitem;
				oobitem=NULL;
			}
		}
	}
	return(oobitem);
}

void MoveOOBSquadron(Squadron sqd,C_Squadron *Squadron)
{
	TREELIST *item=NULL;
	TREELIST *newloc=NULL;
	CampEntity Base=NULL;
	C_Entity *BaseInfo=NULL;
	F4CSECTIONHANDLE *Leave;


	item=Squadron->GetOwner();
	if(!item)
		return;

	Leave=UI_Enter(gOOBTree->GetParent());

	Base=sqd->GetUnitAirbase();
	if(Base)
	{
		newloc=gOOBTree->Find(Base->GetCampID());
		if(!newloc)
		{
			BaseInfo=(C_Entity*)AddItemToOOB(Base);
			if(BaseInfo)
				newloc=BaseInfo->GetOwner();
			else
				newloc=gOOBTree->Find((sqd->GetTeam() << 24) | OOB_AIRFORCE);
		}
	}
	else
		newloc=gOOBTree->Find((sqd->GetTeam() << 24) | OOB_AIRFORCE);

	if(newloc && newloc != item->Parent)
	{
		gOOBTree->MoveChildItem(newloc,item);
		if(BaseInfo)
			Squadron->SetBaseID(BaseInfo->GetID());
		else
			Squadron->SetBaseID(0);
	}
	UI_Leave(Leave);
}

void FindIcon(UI_Refresher *urec)
{
	if(urec->MapItem_)
	{
		gMapMgr->AddToCurIcons(urec->MapItem_);
		gMapMgr->CenterOnIcon(urec->MapItem_);
	}
}

void FindMapIcon(long CampID)
{
	UI_Refresher *urec;

	urec=(UI_Refresher *)gGps->Find(CampID);
	if(urec)
		FindIcon(urec);
}

void OOBFindCB(long,short hittype,C_Base *)
{
	CampEntity ent;
	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if(gSelectedEntity != FalconNullId)
	{
		ent=(CampEntity)vuDatabase->Find(gSelectedEntity);
		if(ent)
		{
			if(ent->IsSquadron())
			{
				FindMapIcon(ent->GetCampID());
			}
			else if(ent->IsObjective())
			{
				FindMapIcon(ent->GetCampID());
			}
			else if(ent->IsTaskForce())
			{
				FindMapIcon(ent->GetCampID());
			}
			else if(ent->IsUnit())
			{
				FindMapIcon(ent->GetCampID());
			}
		}
	}
	else if(gSelectedDivision)
	{
		UI_Refresher *urec;
		urec=(UI_Refresher *)gGps->Find(gSelectedDivision & 0x00ffffff); // strip off team (incase it is a division)
		if(urec->GetType() == GPS_DIVISION)
			FindIcon(urec); // Map & Tree save team # in top 8 bits (Needed to find division by team)
	}
}

void OOBInfoCB(long,short hittype,C_Base *)
{
	CampEntity ent;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if(gSelectedEntity != FalconNullId)
	{
		ent=(CampEntity)vuDatabase->Find(gSelectedEntity);
		if(ent)
		{
			if(ent->IsSquadron())
			{
				SetupSquadronInfoWindow(gSelectedEntity);
			}
			else if(ent->IsObjective())
			{
				BuildSpecificTargetList(gSelectedEntity);
			}
			else if(ent->IsTaskForce())
			{
				BuildSpecificTargetList(gSelectedEntity);
			}
			else if(ent->IsUnit())
			{
				SetupUnitInfoWindow(gSelectedEntity);
			}
		}
	}
	else if(gSelectedDivision)
	{
		UI_Refresher *urec;
		urec=(UI_Refresher *)gGps->Find(gSelectedDivision & 0x00ffffff); // strip off team (incase it is a division)
		if(urec->GetType() == GPS_DIVISION)
			SetupDivisionInfoWindow(urec->GetDivID(),urec->GetSide()); // Map & Tree save team # in top 8 bits (Needed to find division by team)
	}
}

⌨️ 快捷键说明

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