📄 campmenu.cpp
字号:
// Campaign Menus
#include <windows.h>
#include "Graphics\Include\matrix.h"
#include "Graphics\Include\drawbsp.h"
#include "Graphics\Include\loader.h"
#include "entity.h"
#include "feature.h"
#include "vehicle.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "find.h"
#include "cmpclass.h"
#include "division.h"
#include "cmap.h"
#include "cbsplist.h"
#include "c3dview.h"
#include "userids.h"
#include "filters.h"
#include "gps.h"
#include "urefresh.h"
#include "CampStr.h"
void DeleteGroupList(long ID);
void AddObjectiveToTargetTree(Objective obj);
void SetBullsEye(C_Window *);
void SetSlantRange(C_Window *);
void SetHeading(C_Window *);
void PositionCamera(OBJECTINFO *Info,C_Window *win,long client);
void SetupUnitInfoWindow(VU_ID Id);
void SetupDivisionInfoWindow(long DivID,short owner);
void GetObjectivesNear(float x,float y,float range);
void GetGroundUnitsNear(float x,float y,float range);
void ReconArea(float x,float y,float range);
void BuildTargetList(float x,float y,float range);
void BuildSpecificTargetList(VU_ID targetID);
void set_waypoint_action (WayPoint wp, int action);
void refresh_waypoint (WayPointClass * wp);
void tactical_add_victory_condition (VU_ID id,C_Base *caller);
void tactical_add_squadron (VU_ID id);
void tactical_add_flight (VU_ID ID,C_Base *caller);
void tactical_add_package (VU_ID ID,C_Base *caller);
void tactical_add_battalion (VU_ID ID,C_Base *control);
void recalculate_waypoints (WayPointClass *wp);
void tactical_edit_package (VU_ID id,C_Base *caller);
void fixup_unit (Unit unit);
void SetupSquadronInfoWindow(VU_ID TheID);
void CloseAllRenderers(long openID);
C_TreeList *TargetTree=NULL;
extern C_Handler *gMainHandler;
extern C_Map *gMapMgr;
extern C_3dViewer *gUIViewer;
extern OBJECTINFO Recon;
extern GlobalPositioningSystem *gGps;
extern VU_ID gActiveFlightID,gCurrentFlightID;
// Used for enabling & disabling menus based on TE/Camp/Edit modes
static long GameType;
static long EditMode;
void MenuToggleObjectiveCB(long ID,short,C_Base *control)
{
switch(ID)
{
case MID_INST_AF:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_AIR_FIELDS);
else
gMapMgr->HideObjectiveType(_OBTV_AIR_FIELDS);
break;
case MID_INST_AD:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_AIR_DEFENSE);
else
gMapMgr->HideObjectiveType(_OBTV_AIR_DEFENSE);
break;
case MID_INST_ARMY:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_ARMY);
else
gMapMgr->HideObjectiveType(_OBTV_ARMY);
break;
case MID_INST_CCC:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_CCC);
else
gMapMgr->HideObjectiveType(_OBTV_CCC);
break;
case MID_INST_POLITICAL:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_POLITICAL);
else
gMapMgr->HideObjectiveType(_OBTV_POLITICAL);
break;
case MID_INST_INFRA:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_INFRASTRUCTURE);
else
gMapMgr->HideObjectiveType(_OBTV_INFRASTRUCTURE);
break;
case MID_INST_LOG:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_LOGISTICS);
else
gMapMgr->HideObjectiveType(_OBTV_LOGISTICS);
break;
case MID_INST_WARPROD:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_WAR_PRODUCTION);
else
gMapMgr->HideObjectiveType(_OBTV_WAR_PRODUCTION);
break;
case MID_INST_NAV:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_NAVIGATION);
else
gMapMgr->HideObjectiveType(_OBTV_NAVIGATION);
break;
case MID_INST_OTHER:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_OTHER);
else
gMapMgr->HideObjectiveType(_OBTV_OTHER);
break;
case MID_INST_NAVAL:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_OBTV_NAVAL);
else
gMapMgr->HideObjectiveType(_OBTV_NAVAL);
break;
case MID_SHOW_VC:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_VC_CONDITION_);
else
gMapMgr->HideObjectiveType(_VC_CONDITION_);
break;
}
gMapMgr->DrawMap();
}
void MenuToggleUnitCB(long ID,short,C_Base *control)
{
switch(ID)
{
case MID_UNITS_DIV:
gMapMgr->SetUnitLevel(0);
break;
case MID_UNITS_BRIG:
gMapMgr->SetUnitLevel(1);
break;
case MID_UNITS_BAT:
gMapMgr->SetUnitLevel(2);
break;
case MID_UNITS_COMBAT:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowUnitType(_UNIT_COMBAT);
else
gMapMgr->HideUnitType(_UNIT_COMBAT);
break;
case MID_UNITS_AD:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowUnitType(_UNIT_AIR_DEFENSE);
else
gMapMgr->HideUnitType(_UNIT_AIR_DEFENSE);
break;
case MID_UNITS_SUPPORT:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowUnitType(_UNIT_SUPPORT);
else
gMapMgr->HideUnitType(_UNIT_SUPPORT);
break;
case MID_UNITS_SQUAD_SQUADRON:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_UNIT_SQUADRON);
else
gMapMgr->HideObjectiveType(_UNIT_SQUADRON);
break;
case MID_UNITS_SQUAD_PACKAGE:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowObjectiveType(_UNIT_PACKAGE);
else
gMapMgr->HideObjectiveType(_UNIT_PACKAGE);
break;
case MID_UNITS_SQUAD_FIGHTER:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowAirUnitType(_UNIT_FIGHTER);
else
gMapMgr->HideAirUnitType(_UNIT_FIGHTER);
break;
case MID_UNITS_SQUAD_ATTACK:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowAirUnitType(_UNIT_ATTACK);
else
gMapMgr->HideAirUnitType(_UNIT_ATTACK);
break;
case MID_UNITS_SQUAD_BOMBER:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowAirUnitType(_UNIT_BOMBER);
else
gMapMgr->HideAirUnitType(_UNIT_BOMBER);
break;
case MID_UNITS_SQUAD_SUPPORT:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowAirUnitType(_UNIT_SUPPORT);
else
gMapMgr->HideAirUnitType(_UNIT_SUPPORT);
break;
case MID_UNITS_SQUAD_HELI:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowAirUnitType(_UNIT_HELICOPTER);
else
gMapMgr->HideAirUnitType(_UNIT_HELICOPTER);
break;
case MID_UNITS_NAVY_COMBAT:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowNavalUnitType(_UNIT_COMBAT);
else
gMapMgr->HideNavalUnitType(_UNIT_COMBAT);
break;
case MID_UNITS_NAVY_SUPPLY:
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->ShowNavalUnitType(_UNIT_SUPPORT);
else
gMapMgr->HideNavalUnitType(_UNIT_SUPPORT);
break;
}
gMapMgr->DrawMap();
}
void MenuToggleNamesCB(long ID,short,C_Base *control)
{
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->TurnOnNames();
else
gMapMgr->TurnOffNames();
gMapMgr->DrawMap();
}
void MenuToggleBullseyeCB(long ID,short,C_Base *control)
{
if(((C_PopupList *)control)->GetItemState(ID))
gMapMgr->TurnOnBullseye();
else
gMapMgr->TurnOffBullseye();
gMapMgr->DrawMap();
}
void MenuSetCirclesCB(long,short,C_Base *)
{
C_PopupList *menu;
menu=gPopupMgr->GetMenu(MAP_POP);
if(menu)
{
if(menu->GetItemState(MID_CIRCLE_SAM_LOW))
gMapMgr->ShowThreatType(_THR_SAM_LOW);
else if(menu->GetItemState(MID_CIRCLE_SAM_HIGH))
gMapMgr->ShowThreatType(_THR_SAM_HIGH);
else if(menu->GetItemState(MID_CIRCLE_RADAR_LOW))
gMapMgr->ShowThreatType(_THR_RADAR_LOW);
else if(menu->GetItemState(MID_CIRCLE_RADAR_HIGH))
gMapMgr->ShowThreatType(_THR_RADAR_HIGH);
else
gMapMgr->HideThreatType(_THR_SAM_LOW|_THR_SAM_HIGH|_THR_RADAR_LOW|_THR_RADAR_HIGH);
gMapMgr->DrawMap();
}
}
void MenuToggleTroupBoundariesCB(long,short,C_Base *)
{
}
void MenuToggleMovementArrowsCB(long,short,C_Base *)
{
}
// THE MAJOR CHANGE to this routine is making it support being called from
// either a C_MapIcon item OR a C_TreeList item
//
void MenuObjReconCB(long,short,C_Base *)
{
Objective objective;
C_Window *win;
C_Base *caller;
C_MapIcon *icon;
C_DrawList *piggy;
C_TreeList *tree;
TREELIST *item;
long iconid;
UI_Refresher *urec=NULL;
gPopupMgr->CloseMenu();
caller=gPopupMgr->GetCallingControl();
if(caller == NULL)
return;
if(caller->_GetCType_() == _CNTL_MAPICON_)
{
icon=(C_MapIcon *)caller;
iconid=icon->GetIconID();
urec=(UI_Refresher *)gGps->Find(iconid);
}
else if(caller->_GetCType_() == _CNTL_DRAWLIST_)
{
piggy=(C_DrawList *)caller;
iconid=piggy->GetIconID();
urec=(UI_Refresher *)gGps->Find(iconid);
}
else if(caller->_GetCType_() == _CNTL_TREELIST_)
{
tree=(C_TreeList *)caller;
item=tree->GetLastItem();
if(item)
urec=(UI_Refresher *)gGps->Find(item->ID_);
}
gPopupMgr->CloseMenu();
SetCursor(gCursors[CRSR_WAIT]);
win=gMainHandler->FindWindow(RECON_WIN);
if(win)
{
CloseAllRenderers(RECON_WIN);
if(TargetTree)
TargetTree->DeleteBranch(TargetTree->GetRoot());
objective=(Objective)vuDatabase->Find(urec->GetID());
if(objective == NULL)
return;
if(!objective->IsObjective())
return;
if(gUIViewer)
{
gUIViewer->Cleanup();
delete gUIViewer;
}
gUIViewer=new C_3dViewer;
gUIViewer->Setup();
gUIViewer->Viewport(win,0); // use client 0 for this window
Recon.Heading=0.0f;
Recon.Pitch=70.0f;
Recon.Distance=1000.0f;
Recon.Direction=0.0f;
Recon.MinDistance=250.0f;
Recon.MaxDistance=30000.0f;
Recon.MinPitch=5;
Recon.MaxPitch=90;
Recon.CheckPitch=TRUE;
Recon.PosX=objective->XPos();
Recon.PosY=objective->YPos();
Recon.PosZ=objective->ZPos();
AddObjectiveToTargetTree (objective);
GetGroundUnitsNear(Recon.PosX,Recon.PosY,10000.0f);
SetBullsEye(win);
SetSlantRange(win);
SetHeading(win);
gUIViewer->SetPosition(Recon.PosX,Recon.PosY,Recon.PosZ);
gUIViewer->InitOTW(30.0f,TRUE);
gUIViewer->AddAllToView();
win->ScanClientAreas();
win->RefreshWindow();
PositionCamera(&Recon,win,0);
TheLoader.WaitForLoader();
PositionCamera(&Recon,win,0);
gMainHandler->ShowWindow(win);
gMainHandler->WindowToFront(win);
}
win=gMainHandler->FindWindow(RECON_LIST_WIN);
if(win)
{
if(TargetTree)
TargetTree->RecalcSize();
gMainHandler->ShowWindow(win);
gMainHandler->WindowToFront(win);
}
SetCursor(gCursors[CRSR_F16]);
}
void MenuAlternateCB(long,short,C_Base *)
{
C_Base *caller;
C_MapIcon *icon;
C_DrawList *piggy;
C_TreeList *tree;
TREELIST *item;
long iconid;
UI_Refresher *urec=NULL;
gPopupMgr->CloseMenu();
caller=gPopupMgr->GetCallingControl();
if(caller == NULL)
return;
if(caller->_GetCType_() == _CNTL_MAPICON_)
{
icon=(C_MapIcon *)caller;
iconid=icon->GetIconID();
urec=(UI_Refresher *)gGps->Find(iconid);
}
else if(caller->_GetCType_() == _CNTL_DRAWLIST_)
{
piggy=(C_DrawList *)caller;
iconid=piggy->GetIconID();
urec=(UI_Refresher *)gGps->Find(iconid);
}
else if(caller->_GetCType_() == _CNTL_TREELIST_)
{
tree=(C_TreeList *)caller;
item=tree->GetLastItem();
if(item)
urec=(UI_Refresher *)gGps->Find(item->ID_);
}
}
WayPointClass* GetSelectedWayPoint (void)
{
C_Base *caller;
C_Base *control;
C_Waypoint *cwp;
VU_ID *tmpID;
Unit unit;
WayPoint wp;
int i;
caller=gPopupMgr->GetCallingControl();
if(caller == NULL)
return NULL;
if (gPopupMgr->GetCallingType() == C_TYPE_CONTROL && caller->_GetCType_() == _CNTL_WAYPOINT_)
{
// Waypoint
cwp = (C_Waypoint *)caller;
if (cwp && cwp->GetLast())
{
control = cwp->GetLast()->Icon;
if (!control)
return NULL;
tmpID=(VU_ID *)control->GetUserPtr(C_STATE_0);
if (!tmpID)
return NULL;
// Check if this is our current waypoint set, and make sure our
// global ids match this information.
if (gMapMgr->GetCurWP() == cwp)
{
VU_ID *tmpID;
tmpID=(VU_ID *)control->GetUserPtr(C_STATE_0);
if (tmpID && *tmpID != gActiveFlightID)
{
gActiveFlightID = *tmpID;
gCurrentFlightID = *tmpID;
}
}
unit = FindUnit(*tmpID);
if (unit && unit->IsFlight())
{
wp = unit->GetFirstUnitWP();
i = 1;
while(i < control->GetUserNumber(C_STATE_1) && wp)
{
wp=wp->GetNextWP();
i++;
}
return wp;
}
}
}
return NULL;
}
void SteerPointMenuOpenCB (C_Base *,C_Base *)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -