📄 te_map.cpp
字号:
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Tactical Engagement - Robin Heydon
//
// Implements the user interface for the tactical engagement section
// of falcon 4.0
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#include "falclib.h"
#include "vu2.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "uicomms.h"
#include "userids.h"
#include "textids.h"
#include "unit.h"
#include "team.h"
#include "CmpGlobl.h"
#include "CampCell.h"
#include "CampTerr.h"
#include "find.h"
#include "division.h"
#include "battalion.h"
#include "cmap.h"
#include "flight.h"
#include "campwp.h"
#include "cmpclass.h"
#include "Listadt.h"
#include "objectiv.h"
#include "Campaign.h"
#include "classtbl.h"
#include "falcsess.h"
#include "tac_class.h"
#include "te_defs.h"
#include "teamdata.h"
#include "gps.h"
#include "urefresh.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
extern C_Map
*gMapMgr;
extern GlobalPositioningSystem
*gGps;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
extern long
gLastUpdateGround,
gLastUpdateAir;
extern GridIndex
MapX,MapY;
float SimMapX,SimMapY;
C_Base *CurMapTool=NULL;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void tactical_draw_map (long ID,short hittype,C_Base *control);
static void tactical_maximize_map (long ID, short hittype, C_Base *control);
static void tactical_minimize_map (long ID, short hittype, C_Base *control);
static void gMapMgr_mover (long ID, short hittype, C_Base *control);
static void gMapMgr_zoom_in (long ID, short hittype, C_Base *control);
static void gMapMgr_zoom_out (long ID, short hittype, C_Base *control);
void gMapMgr_menu (long ID, short hittype, C_Base *control);
void tactical_objective_menu (long ID, short hittype, C_Base *control);
void tactical_airbase_menu (long ID, short hittype, C_Base *control);
void SelectToolTypeCB(long ID,short hittype,C_Base *control);
void OpenCrossSectionCB(long ID,short hittype,C_Base *control);
void tactical_add_victory_condition (VU_ID id,C_Base *caller);
void tactical_add_squadron (VU_ID id);
extern void tactical_add_flight (VU_ID ID,C_Base *caller);
extern void tactical_add_package (VU_ID ID,C_Base *caller);
extern void tactical_add_battalion (VU_ID ID,C_Base *control);
static void update_gMapMgr (void);
void PickTeamCB(long ID,short hittype,C_Base *control);
void UnitCB (long ID,short hittype,C_Base *ctrl);
void SelectVCTargetCB(long ID,short hittype,C_Base *control);
void FitFlightPlanCB(long ID,short hittype,C_Base *control);
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void ClearMapToolStates(long ID)
{
C_Window *win;
C_Button *ctrl;
win=gMainHandler->FindWindow(ID);
if(win)
{
ctrl = (C_Button *) win->FindControl (ADD_FLIGHT);
if (ctrl)
{
ctrl->SetState(0);
}
ctrl = (C_Button *) win->FindControl (ADD_PACKAGE);
if (ctrl)
{
ctrl->SetState(0);
}
ctrl = (C_Button *) win->FindControl (ADD_BATTALION);
if (ctrl)
{
ctrl->SetState(0);
}
ctrl = (C_Button *) win->FindControl (ADD_NAVAL);
if (ctrl)
{
ctrl->SetState(0);
}
ctrl = (C_Button *) win->FindControl (ADD_SQUADRON);
if (ctrl)
{
ctrl->SetState(0);
}
ctrl = (C_Button *) win->FindControl (COPY_UNIT);
if (ctrl)
{
ctrl->SetState(0);
}
ctrl = (C_Button *) win->FindControl (DELETE_UNIT);
if (ctrl)
{
ctrl->SetState(0);
}
ctrl = (C_Button *) win->FindControl (EDIT_UNIT);
if (ctrl)
{
ctrl->SetState(0);
}
}
}
void hookup_map_windows (C_Window *win)
{
C_Button
*ctrl;
gMainHandler->AddUserCallback (update_gMapMgr);
ctrl = (C_Button *) win->FindControl (MAP_MAXIMIZE);
if (ctrl)
{
ctrl->SetCallback (tactical_maximize_map);
}
ctrl = (C_Button *) win->FindControl (MAP_MINIMIZE);
if (ctrl)
{
ctrl->SetCallback (tactical_minimize_map);
}
ctrl = (C_Button *) win->FindControl (TAC_ZOOM_IN);
if (ctrl)
{
ctrl->SetCallback (gMapMgr_zoom_in);
}
ctrl = (C_Button *) win->FindControl (TAC_ZOOM_OUT);
if (ctrl)
{
ctrl->SetCallback (gMapMgr_zoom_out);
}
ctrl=(C_Button *)win->FindControl(BI_LIN_CTRL);
if(ctrl)
ctrl->SetCallback(OpenCrossSectionCB);
ctrl=(C_Button *)win->FindControl(BI_LOG_CTRL);
if(ctrl)
ctrl->SetCallback(OpenCrossSectionCB);
ctrl=(C_Button *)win->FindControl(BI_FIT_CTRL);
if(ctrl)
ctrl->SetCallback(FitFlightPlanCB);
ctrl = (C_Button *) win->FindControl (ADD_FLIGHT);
if (ctrl)
{
ctrl->SetCallback (SelectToolTypeCB);
}
ctrl = (C_Button *) win->FindControl (ADD_PACKAGE);
if (ctrl)
{
ctrl->SetCallback (SelectToolTypeCB);
}
ctrl = (C_Button *) win->FindControl (ADD_BATTALION);
if (ctrl)
{
ctrl->SetCallback (SelectToolTypeCB);
}
ctrl = (C_Button *) win->FindControl (ADD_NAVAL);
if (ctrl)
{
ctrl->SetCallback (SelectToolTypeCB);
}
ctrl = (C_Button *) win->FindControl (ADD_SQUADRON);
if (ctrl)
{
ctrl->SetCallback (SelectToolTypeCB);
}
ctrl = (C_Button *) win->FindControl (COPY_UNIT);
if (ctrl)
{
ctrl->SetCallback (SelectToolTypeCB);
}
ctrl = (C_Button *) win->FindControl (DELETE_UNIT);
if (ctrl)
{
ctrl->SetCallback (SelectToolTypeCB);
}
ctrl = (C_Button *) win->FindControl (EDIT_UNIT);
if (ctrl)
{
ctrl->SetCallback (SelectToolTypeCB);
}
ctrl = (C_Button *) win->FindControl (TEAM_SELECTOR);
if (ctrl)
{
ctrl->SetCallback (PickTeamCB);
}
}
static void AddSquadronToAirbaseCB(long ID,short hittype,C_Base *ctrl)
{
C_MapIcon *icon;
UI_Refresher *urec;
VU_ID id;
if(hittype != C_TYPE_LMOUSEUP)
return;
icon=(C_MapIcon*)ctrl;
if(ctrl)
{
ID=icon->GetIconID();
urec=(UI_Refresher*)gGps->Find(ID);
if(urec)
tactical_add_squadron (urec->GetID());
}
}
void SelectTargetCB(long ID,short hittype,C_Base *ctrl)
{
C_MapIcon *icon;
UI_Refresher *urec;
VU_ID id;
if(hittype != C_TYPE_LMOUSEUP)
{
// We're either dragging or mouse down - check to see if we should drag a unit
UnitCB (ID,hittype,ctrl);
return;
}
icon=(C_MapIcon*)ctrl;
if(ctrl)
{
ID=icon->GetIconID();
urec=(UI_Refresher*)gGps->Find(ID);
if(urec)
{
switch(CurMapTool->GetID())
{
case ADD_FLIGHT: // Click anywhere on the map to add a flight
tactical_add_flight(urec->GetID(),ctrl);
break;
case ADD_PACKAGE: // Click anywhere on the map to add a package?
tactical_add_package (urec->GetID(),ctrl);
break;
case ADD_BATTALION: // Click anywhere on the map to add a unit
tactical_add_battalion(urec->GetID(),ctrl);
break;
case ADD_SQUADRON: // Click on an airbase to add a squadron
tactical_add_squadron(urec->GetID());
break;
/* case ADD_TASKFORCE: // Click on an airbase to add a squadron
tactical_add_taskforce(urec->GetID(),ctrl);
break;
*/
default:
break;
}
}
}
}
static void SetToolbarDirections(long textid)
{
C_Window *win;
C_Text *txt;
win=gMainHandler->FindWindow(TAC_FULLMAP_WIN);
if(win)
{
txt=(C_Text*)win->FindControl(HELP_MESSAGE);
if(txt)
{
txt->Refresh();
txt->SetText(textid);
txt->Refresh();
}
}
win=gMainHandler->FindWindow(TAC_EDIT_WIN);
if(win)
{
txt=(C_Text*)win->FindControl(HELP_MESSAGE);
if(txt)
{
txt->Refresh();
txt->SetText(textid);
txt->Refresh();
}
}
win=gMainHandler->FindWindow(TAC_VC_WIN);
if(win)
{
txt=(C_Text*)win->FindControl(VC_HELP_MESSAGE);
if(txt)
{
txt->Refresh();
txt->SetText(textid);
txt->Refresh();
}
}
}
void SelectToolTypeCB(long,short hittype,C_Base *control)
{
if(hittype != C_TYPE_LMOUSEUP)
return;
gMapMgr->SetAllObjCallbacks(NULL);
gMapMgr->SetAllAirUnitCallbacks(UnitCB);
gMapMgr->SetAllGroundUnitCallbacks(UnitCB);
gMapMgr->SetAllNavalUnitCallbacks(UnitCB);
if(CurMapTool && CurMapTool == control)
{
CurMapTool->SetState(0);
CurMapTool->Refresh();
CurMapTool=NULL;
SetToolbarDirections(TXT_SPACE);
}
else if(!control)
{
if(CurMapTool)
{
CurMapTool->SetState(0);
CurMapTool->Refresh();
CurMapTool=NULL;
}
SetToolbarDirections(TXT_SPACE);
}
else
{
CurMapTool=control;
switch(CurMapTool->GetID())
{
case ADD_FLIGHT:
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
gMapMgr->SetAllObjCallbacks(SelectTargetCB);
gMapMgr->SetAllAirUnitCallbacks(SelectTargetCB);
gMapMgr->SetAllGroundUnitCallbacks(SelectTargetCB);
gMapMgr->SetAllNavalUnitCallbacks(SelectTargetCB);
SetToolbarDirections(control->GetUserNumber(1));
}
break;
case ADD_PACKAGE:
gMapMgr->SetAllObjCallbacks(SelectTargetCB);
gMapMgr->SetAllAirUnitCallbacks(SelectTargetCB);
gMapMgr->SetAllGroundUnitCallbacks(SelectTargetCB);
gMapMgr->SetAllNavalUnitCallbacks(SelectTargetCB);
SetToolbarDirections(control->GetUserNumber(1));
break;
case ADD_BATTALION: // Click anywhere on the map to add a unit
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
gMapMgr->SetAllObjCallbacks(SelectTargetCB);
SetToolbarDirections(control->GetUserNumber(1));
}
break;
case ADD_NAVAL: // Click anywhere on the map to add a unit
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
gMapMgr->SetAllObjCallbacks(SelectTargetCB);
SetToolbarDirections(control->GetUserNumber(1));
}
break;
case ADD_SQUADRON: // Click on an airbase to add a squadron
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
gMapMgr->SetAllObjCallbacks(SelectTargetCB);
SetToolbarDirections(control->GetUserNumber(1));
gMapMgr->SetObjCallbacks(1,AddSquadronToAirbaseCB);
}
break;
case COPY_UNIT: // Pick a unit to copy
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
SetToolbarDirections(control->GetUserNumber(1));
}
break;
case DELETE_UNIT: // Pick a unit to delete
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
SetToolbarDirections(control->GetUserNumber(1));
}
break;
case EDIT_UNIT: // Pick a unit to edit
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
SetToolbarDirections(control->GetUserNumber(1));
}
break;
case TARGET_VC:
gMapMgr->SetAllObjCallbacks(SelectVCTargetCB);
gMapMgr->SetAllAirUnitCallbacks(SelectVCTargetCB);
gMapMgr->SetAllGroundUnitCallbacks(SelectVCTargetCB);
gMapMgr->SetAllNavalUnitCallbacks(SelectVCTargetCB);
SetToolbarDirections(control->GetUserNumber(1));
break;
}
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void tactical_draw_map (long,short,C_Base *)
{
// gMapMgr->SetFlags(I_NEED_TO_DRAW_MAP);
if (gMapMgr)
{
gMapMgr->DrawMap();
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
static void tactical_maximize_map (long,short hittype,C_Base *control)
{
C_Window
*win;
if(hittype != C_TYPE_LMOUSEUP)
{
return;
}
win = gMainHandler->FindWindow (TAC_FULLMAP_WIN);
if (win != NULL)
{
gMapMgr->SetWindow (win);
gMapMgr->DrawMap ();
}
win = gMainHandler->FindWindow (TAC_PUA_MAP);
if (win != NULL)
{
gMainHandler->HideWindow (win);
}
gMainHandler->EnableWindowGroup (control->GetGroup ());
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
static void tactical_minimize_map (long,short hittype,C_Base *control)
{
C_Window
*win;
if (hittype != C_TYPE_LMOUSEUP)
{
return;
}
win = gMainHandler->FindWindow (TAC_PUA_MAP);
//MonoPrint ("Minimize %d %08x\n", control->GetGroup (), win);
if (win != NULL)
{
gMapMgr->SetWindow (win);
gMapMgr->DrawMap ();
}
win = gMainHandler->FindWindow (TAC_PUA_MAP);
if (win != NULL)
{
gMainHandler->ShowWindow (win);
}
gMainHandler->DisableWindowGroup (control->GetGroup ());
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void gMapMgr_TACmover (long,short hittype,C_Base *control)
{
C_MapMover
*mm;
float mx,my,scale,maxy;
short x=0,y=0;
mm = (C_MapMover *) control;
if (hittype == C_TYPE_MOUSEMOVE)
{
gMapMgr->MoveCenter (-((C_MapMover *)control)->GetHRange(), -((C_MapMover *)control)->GetVRange ());
control->Parent_->RefreshClient (0);
}
else if(hittype == C_TYPE_LMOUSEUP)
{
if(CurMapTool)
{
if(control->_GetCType_() == _CNTL_POPUPLIST_)
{
gPopupMgr->GetCurrentXY (&x, &y);
gMapMgr->GetMapRelativeXY (&x, &y);
}
else if(control->_GetCType_() == _CNTL_MAP_MOVER_)
{
x=static_cast<short>(((C_MapMover*)control)->GetRelX() + control->GetX() + control->Parent_->GetX());
y=static_cast<short>(((C_MapMover*)control)->GetRelY() + control->GetY() + control->Parent_->GetY());
gMapMgr->GetMapRelativeXY (&x, &y);
}
scale = gMapMgr->GetMapScale ();
maxy = gMapMgr->GetMaxY ();
mx = x / scale;
my = maxy - y / scale;
SimMapX=my;
SimMapY=mx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -