📄 oob.cpp
字号:
}
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 + -