⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 te_map.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// 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 + -