📄 te_units.cpp
字号:
}
}
void SetupPackageControls (C_Window *win, C_Base *caller)
{
C_Button *btn;
C_ListBox *lbox;
C_Clock *clock;
C_Text *txt;
C_EditBox *edit;
int i;
CampaignTime takeoff,tot;
if(!win)
return;
// Initial clock times based off of either current time or actual package statistics
takeoff = TheCampaign.CurrentTime+2*CampaignMinutes;
tot = TheCampaign.CurrentTime+30*CampaignMinutes;
if (new_package && new_package->GetUnitElement(0))
{
// Set times based off of first flight in package
Flight flight = (Flight) new_package->GetUnitElement(0);
WayPoint w = flight->GetFirstUnitWP();
if (w)
takeoff = w->GetWPDepartureTime();
while (w && !(w->GetWPFlags() & WPF_TARGET))
w = w->GetNextWP();
if (w)
tot = w->GetWPArrivalTime();
}
if(!(TheCampaign.Flags & (CAMP_TACTICAL|CAMP_TACTICAL_EDIT)) ||
(EdittingPackage && !(TheCampaign.Flags & CAMP_TACTICAL_EDIT) && takeoff < TheCampaign.CurrentTime))
{
// Disable these controls in campaign, or in run mode if the package has departed
btn=(C_Button*)win->FindControl(ADD_PACKAGE_FLIGHT);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(DELETE_PACKAGE_FLIGHT);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TAKEOFF_LOCK);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TAKEOFF_INC);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TAKEOFF_DEC);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TOT_LOCK);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TOT_INC);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TOT_DEC);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
clock=(C_Clock*)win->FindControl(PAK_TAKEOFF_TIME);
if(clock)
clock->SetFlagBitOff(C_BIT_ENABLED);
clock=(C_Clock*)win->FindControl(PAK_TOT_TIME);
if(clock)
clock->SetFlagBitOff(C_BIT_ENABLED);
}
else
{
// These controls are allowed in tactical engagement unless we're editing a package in run mode
btn=(C_Button*)win->FindControl(ADD_PACKAGE_FLIGHT);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(DELETE_PACKAGE_FLIGHT);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TAKEOFF_LOCK);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TAKEOFF_INC);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TAKEOFF_DEC);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TOT_LOCK);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TOT_INC);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn=(C_Button*)win->FindControl(PAK_TOT_DEC);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
clock=(C_Clock*)win->FindControl(PAK_TAKEOFF_TIME);
if(clock)
clock->SetFlagBitOn(C_BIT_ENABLED);
clock=(C_Clock*)win->FindControl(PAK_TOT_TIME);
if(clock)
clock->SetFlagBitOn(C_BIT_ENABLED);
}
if (!EdittingPackage)
{
// These buttons are only allowed if creating a new package
btn=(C_Button*)win->FindControl(CANCEL_PACK);
if(btn)
btn->SetFlagBitOff(C_BIT_INVISIBLE);
}
else
{
btn=(C_Button*)win->FindControl(CANCEL_PACK);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
}
if (TheCampaign.Flags & CAMP_TACTICAL)
{
// These are allowed always in tactical engagement
lbox=(C_ListBox*)win->FindControl(PACKAGE_PRIORITY_LIST);
if(lbox)
lbox->SetFlagBitOn(C_BIT_ENABLED);
}
else
{
lbox=(C_ListBox*)win->FindControl(PACKAGE_PRIORITY_LIST);
if(lbox)
lbox->SetFlagBitOff(C_BIT_ENABLED);
}
if(EdittingPackage && new_package)
{
_TCHAR buffer[40];
txt=(C_Text*)win->FindControl(PACKAGE_DESIGNATOR);
if(txt)
{
_stprintf(buffer,"%s %1ld",gStringMgr->GetString(TXT_PACKAGE),new_package->GetCampID());
txt->SetText(buffer);
txt->Refresh();
}
}
else
{
txt=(C_Text*)win->FindControl(PACKAGE_DESIGNATOR);
if(txt)
{
txt->SetText(TXT_ADD_PACKAGE_UC);
txt->Refresh();
}
}
// Set Package Type listbox
lbox=(C_ListBox *)win->FindControl(TAC_PACKAGE_TYPE);
if(lbox)
{
for (i=1;i<=ATO_OTHER;i++)
lbox->AddItem(i,C_TYPE_ITEM,AtoMissStr[i]);
}
// Initialize takeoff time to now
clock=(C_Clock*)win->FindControl(PAK_TAKEOFF_TIME);
if (clock)
{
int hr,min,sec;
hr = takeoff / CampaignHours;
hr = hr % 24;
min = (takeoff / CampaignMinutes) % 60;
sec = (takeoff / CampaignSeconds) % 60;
clock->SetHour(hr);
clock->SetMinute(min);
clock->SetSecond(sec);
clock->Refresh ();
}
// Initialize takeoff time to now plus estimated time to target
clock=(C_Clock*)win->FindControl(PAK_TOT_TIME);
if (clock)
{
int hr,min,sec;
hr = tot / CampaignHours;
hr = hr % 24;
min = (tot / CampaignMinutes) % 60;
sec = (tot / CampaignSeconds) % 60;
clock->SetHour(hr);
clock->SetMinute(min);
clock->SetSecond(sec);
clock->Refresh ();
}
// Initial package day edit
edit = (C_EditBox*)win->FindControl(PACKAGE_DAY);
if (edit)
edit->SetText((takeoff / CampaignDay) + 1);
// Initialize priority list box
lbox=(C_ListBox *)win->FindControl(PACKAGE_PRIORITY_LIST);
if (lbox)
{
lbox->AddItem(1,C_TYPE_ITEM,"A");
lbox->AddItem(2,C_TYPE_ITEM,"B");
lbox->AddItem(3,C_TYPE_ITEM,"C");
lbox->AddItem(4,C_TYPE_ITEM,"D");
lbox->AddItem(5,C_TYPE_ITEM,"E");
lbox->AddItem(6,C_TYPE_ITEM,"F");
lbox->SetValue(1);
}
// Setup time lock buttons
btn = (C_Button*)win->FindControl(PAK_TAKEOFF_LOCK);
if (btn)
btn->SetCallback(LockTakeoffTimeCB);
btn = (C_Button*)win->FindControl(PAK_TOT_LOCK);
if (btn)
{
btn->SetCallback(LockTimeOnTargetCB);
if (!btn->GetState())
LockTakeoffTimeCB (0,C_TYPE_LMOUSEUP,NULL);
}
// Setup cancel and ok
btn=(C_Button*)win->FindControl(CANCEL_PACK);
if(btn)
btn->SetCallback(DiscardPackage);
btn=(C_Button*)win->FindControl(OK_PACK);
if(btn)
btn->SetCallback(KeepPackage);
btn=(C_Button*)win->FindControl(PAK_TOT_DEC);
if(btn)
btn->SetCallback(ChangePackTimeCB);
btn=(C_Button*)win->FindControl(PAK_TOT_INC);
if(btn)
btn->SetCallback(ChangePackTimeCB);
btn=(C_Button*)win->FindControl(PAK_TAKEOFF_DEC);
if(btn)
btn->SetCallback(ChangePackTimeCB);
btn=(C_Button*)win->FindControl(PAK_TAKEOFF_INC);
if(btn)
btn->SetCallback(ChangePackTimeCB);
if(caller->_GetCType_() != _CNTL_BUTTON_)
gMainHandler->EnableWindowGroup(win->GetGroup());
}
// KCK: This is called when we've decided to add a package -
// i.e: when we're in package create mode and clicked on the map
void tactical_add_package (VU_ID id,C_Base *caller)
{
C_Window *win=NULL;
C_TreeList *tree=NULL;
CampEntity ent=NULL;
GridIndex x=0,y=0;
float mx,my,maxy,scale;
EdittingPackage=0;
WeAreAddingPackage=1;
if(caller->_GetCType_() == _CNTL_POPUPLIST_)
{
gPopupMgr->GetCurrentXY (&x, &y);
gMapMgr->GetMapRelativeXY (&x, &y);
}
else if(caller->_GetCType_() == _CNTL_MAP_MOVER_)
{
x=static_cast<short>(((C_MapMover*)caller)->GetRelX() + caller->GetX() + caller->Parent_->GetX());
y=static_cast<short>(((C_MapMover*)caller)->GetRelY() + caller->GetY() + caller->Parent_->GetY());
gMapMgr->GetMapRelativeXY (&x, &y);
}
gTakeoffTime = gPackageTOT = 0;
new_package = NULL;
gNewSelectFlight=FalconNullId;
scale = gMapMgr->GetMapScale ();
maxy = gMapMgr->GetMaxY ();
mx = x / scale;
my = maxy - y / scale;
// Determine target (or target location)
ent=(CampEntity) vuDatabase->Find(id);
if (ent)
{
gLastTarget = new_package_target = ent;
new_package_target->GetLocation(&MapX,&MapY);
}
else
{
MapX = SimToGrid (mx);
MapY = SimToGrid (my);
new_package_target = NULL;
}
// Determine default mission type
if (!gLastAircraftType)
gLastAircraftType = GetClassID(DOMAIN_AIR,CLASS_UNIT,TYPE_SQUADRON,STYPE_UNIT_FIGHTER_BOMBER,SPTYPE_F16C,VU_ANY,VU_ANY,VU_ANY) + VU_LAST_ENTITY_TYPE;
gLastRole = GetMissionFromTarget (gSelectedTeam, gLastAircraftType-VU_LAST_ENTITY_TYPE, ent);
win=gMainHandler->FindWindow(PACKAGE_WIN);
if(win)
{
// Clear any old flight trees
tree=(C_TreeList *)win->FindControl(ATO_PACKAGE_TREE);
if(tree)
{
tree->DeleteBranch(tree->GetRoot());
tree->RecalcSize();
tree->Parent_->RefreshClient(tree->GetClient());
}
SetupPackageControls (win, caller);
}
tactical_update_package();
}
void tactical_edit_package (VU_ID id,C_Base *caller)
{
C_Window *win;
C_TreeList *tree;
Flight flight;
new_package = (Package) vuDatabase->Find(id);
if (!new_package)
return;
EdittingPackage=1;
WeAreAddingPackage=1;
gTakeoffTime = gPackageTOT = 0;
gNewSelectFlight=FalconNullId;
gLastTarget = new_package_target = (CampBaseClass*) vuDatabase->Find(new_package->GetMissionRequest()->targetID);
if (new_package_target)
new_package_target->GetLocation(&MapX,&MapY);
else
new_package->GetLocation(&MapX,&MapY);
// Determine default mission type
flight = (Flight)new_package->GetFirstUnitElement();
if (flight)
gLastRole = flight->GetUnitMission();
tactical_update_package();
win=gMainHandler->FindWindow(PACKAGE_WIN);
if(win)
{
// Clear any old flight trees
tree=(C_TreeList *)win->FindControl(ATO_PACKAGE_TREE);
if(tree)
{
C_ATO_Flight *atoflt;
TREELIST *item;
tree->DeleteBranch(tree->GetRoot());
tree->RecalcSize();
tree->Parent_->RefreshClient(tree->GetClient());
tree->SetCallback(tactical_new_flight_select);
// Add current flights
flight = (Flight)new_package->GetFirstUnitElement();
while (flight)
{
atoflt=BuildATOFlightInfo(flight);
if(atoflt)
{
item=tree->CreateItem(flight->GetCampID(),C_TYPE_ITEM,atoflt);
if(item)
tree->AddItem (tree->GetRoot(), item);
}
flight = (Flight)new_package->GetNextUnitElement();
}
tree->RecalcSize();
tree->Parent_->RefreshClient(tree->GetClient());
}
}
SetupPackageControls (win, caller);
}
void Open_Flight_WindowCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
if (new_package_target)
tactical_add_flight(new_package_target->Id(),control);
else
tactical_add_flight(FalconNullId,control);
}
void EditFlightInPackage(long,short hittype,C_Base *)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
}
void DeleteFlightFromPackage(long,short hittype,C_Base *control)
{
Flight flt;
C_TreeList *tree;
if(hittype != C_TYPE_LMOUSEUP)
return;
tree=(C_TreeList*)control->Parent_->FindControl(ATO_PACKAGE_TREE);
if(tree)
{
flt=(Flight)vuDatabase->Find(gNewSelectFlight);
if(flt)
{
tree->DeleteItem(flt->GetCampID());
//flt->DisposeWayPoints();
gMapMgr->SetCurrentWaypointList(flt->Id());
RegroupFlight(flt);
flt->Remove();
gNewSelectFlight=FalconNullId;
tree->RecalcSize();
tree->Parent_->RefreshClient(tree->GetClient());
}
}
}
void DiscardPackage(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
// if(!EdittingPackage)
// {
gNewSelectFlight=FalconNullId;
if (new_package)
{
new_package->KillUnit();
new_package->Remove();
}
// }
EdittingPackage=0;
new_package=NULL;
WeAreAddingPackage=0;
gMainHandler->DisableWindowGroup(control->Parent_->GetGroup());
}
void KeepPackage(long ID,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
if (new_package && !new_package->GetFirstUnitElement())
DiscardPackage(ID,hittype,control);
gNewSelectFlight=FalconNullId;
if(new_package)
{
// If we're a client creating a package on the fly, we need to set the owner
// to the host and send a full update
new_package->SetFinal(1);
if (!FalconLocalGame->IsLocal())
{
FalconSessionEntity *host = (FalconSessionEntity*) vuDatabase->Find(FalconLocalGame->OwnerId());
FalconEntity *element;
new_package->DoFullUpdate();
new_package->FalconEntity::SetOwner(host);
element = (FalconEntity*) new_package->GetFirstUnitElement();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -