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