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

📄 campmenu.cpp

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