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

📄 te_units.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Tactical Engagement - Robin Heydon
//
// Implements the user interface for the tactical engagement section
// of falcon 4.0
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

#include "CmpGlobl.h"
#include "ListADT.h"
#include "APITypes.h"
#include "Objectiv.h"
#include "division.h"
#include "battalion.h"
#include "Find.h"
#include "F4Vu.h"
#include "strategy.h"
#include "Path.h"
#include "Campaign.h"
#include "Update.h"
#include "CampList.h"
#include "squadron.h"
#include "classtbl.h"
#include "vu2.h"
#include "campstr.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "uicomms.h"
#include "userids.h"
#include "textids.h"
#include "tac_class.h"
#include "te_defs.h"
#include "cmap.h"
#include "gps.h"
#include "urefresh.h"
#include "teamdata.h"
#include "brief.h"
#include "shi\float.h"
#include "MsgInc\CampDataMsg.h"

enum
{
	TAC_LOCATION	=10000,
	TAC_NOTARGET	=10001,
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

int FindUnitSupportRole(Unit u);
void MenuToggleUnitCB(long ID,short hittype,C_Base *control);
void SelectATOPackageCB(long ID,short hittype,C_Base *control);
void DeleteFlightFromPackage(long ID,short hittype,C_Base *control);
void FillListBoxWithACTypes(C_ListBox *lbox);
void tac_select_role(long ID,short hittype,C_Base *control);
void tac_select_target(long ID,short hittype,C_Base *control);
void tac_select_squadron(long ID,short hittype,C_Base *control);
void tac_select_squadron_aircraft (long ID,short hittype,C_Base *control);
void tac_select_squadron_airbase (long ID,short hittype,C_Base *control);
void tactical_cancel_package (long ID, short hittype, C_Base *ctrl);
void tactical_make_package (long ID,short hittype,C_Base *control);
void tactical_make_flight (long ID,short hittype,C_Base *control);
void tactical_add_flight (VU_ID id, C_Base *caller);
int IsValidMission (int dindex, int mission);
int IsValidTarget (Team team, int mission, CampEntity target);
int GetMissionFromTarget (Team team, int dindex, CampEntity target);
void AreYouSure(long TitleID,_TCHAR *text,void (*OkCB)(long,short,C_Base*),void (*CancelCB)(long,short,C_Base*));
void AreYouSure(long TitleID,long MessageID,void (*OkCB)(long,short,C_Base*),void (*CancelCB)(long,short,C_Base*));
void DiscardPackage(long ID,short hittype,C_Base *control);
void KeepPackage(long ID,short hittype,C_Base *control);
void SetPackageTimes(Package new_package, CampaignTime takeoffTime, CampaignTime targetTime);
void fixup_unit (Unit unit);
void SetupFlightSpecificControls (Flight flt);
void tac_select_aircraft(long ID,short hittype,C_Base *control);
void tactical_update_package (void);
void ChangePackTimeCB(long ID,short hittype,C_Base *control);
void ChangeTimeCB(long ID,short hittype,C_Base *control);
C_ATO_Flight *BuildATOFlightInfo(Flight fl);

extern GlobalPositioningSystem *gGps;
extern C_Map *gMapMgr;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void RefreshMapOnChange (void)
	{
	gGps->Update();
	gMapMgr->DrawMap();
	}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

enum
{
	ATO_OCA=1,
	ATO_STRIKE,
	ATO_INTERDICTION,
	ATO_SEAD,
	ATO_CAS,
	ATO_DCA,
	ATO_CCCI,
	ATO_MARITIME,
	ATO_SUPPORT,
	ATO_OTHER,
};

static long AtoMissStr[]=
{
	0,
	TXT_OCA,
	TXT_STRIKE,
	TXT_INTERDICTION,
	TXT_SEAD,
	TXT_CAS,
	TXT_DCA,
	TXT_CCCI,
	TXT_MARITIME,
	TXT_SUPPORT,
	TXT_OTHER,
};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

struct
{
	table_of_equipment_manufacturers		side;
	char stype;
	char sptype;
}
	table_of_equipment[] =
	{
		toe_chinese, STYPE_UNIT_ARMOR, SPTYPE_CHINESE_TYPE80,
		toe_chinese, STYPE_UNIT_ARMOR, SPTYPE_CHINESE_TYPE85II,
		toe_chinese, STYPE_UNIT_ARMOR, SPTYPE_CHINESE_TYPE90II,
		toe_chinese, STYPE_UNIT_AIR_DEFENSE, SPTYPE_CHINESE_SA6,
		toe_chinese, STYPE_UNIT_AIR_DEFENSE, SPTYPE_CHINESE_ZU23,
		toe_chinese, STYPE_UNIT_HQ, SPTYPE_CHINESE_HQ,
		toe_chinese, STYPE_UNIT_INFANTRY, SPTYPE_CHINESE_INF,
		toe_chinese, STYPE_UNIT_MECHANIZED, SPTYPE_CHINESE_MECH,
		toe_chinese, STYPE_UNIT_SP_ARTILLERY, SPTYPE_CHINESE_SP,
		toe_chinese, STYPE_UNIT_TOWED_ARTILLERY, SPTYPE_CHINESE_ART,
		toe_dprk, STYPE_UNIT_AIR_DEFENSE, SPTYPE_DPRK_AAA,
		toe_dprk, STYPE_UNIT_AIR_DEFENSE, SPTYPE_DPRK_SA2,
		toe_dprk, STYPE_UNIT_AIR_DEFENSE, SPTYPE_DPRK_SA3,
		toe_dprk, STYPE_UNIT_AIR_DEFENSE, SPTYPE_DPRK_SA5,
		toe_dprk, STYPE_UNIT_AIRMOBILE, SPTYPE_DPRK_AIR_MOBILE,
		toe_dprk, STYPE_UNIT_ARMOR, SPTYPE_DPRK_T55,
		toe_dprk, STYPE_UNIT_ARMOR, SPTYPE_DPRK_T62,
		toe_dprk, STYPE_UNIT_HQ, SPTYPE_DPRK_HQ,
		toe_dprk, STYPE_UNIT_INFANTRY, SPTYPE_DPRK_INF,
		toe_dprk, STYPE_UNIT_MECHANIZED, SPTYPE_DPRK_BMP1,
		toe_dprk, STYPE_UNIT_MECHANIZED, SPTYPE_DPRK_BMP2,
		toe_dprk, STYPE_UNIT_ROCKET, SPTYPE_DPRK_BM21,
		toe_dprk, STYPE_UNIT_SP_ARTILLERY, SPTYPE_DPRK_SP_122,
		toe_dprk, STYPE_UNIT_SP_ARTILLERY, SPTYPE_DPRK_SP_152,
		toe_dprk, STYPE_UNIT_SS_MISSILE, SPTYPE_DPRK_FROG,
		toe_dprk, STYPE_UNIT_SS_MISSILE, SPTYPE_DPRK_SCUD,
		toe_dprk, STYPE_UNIT_TOWED_ARTILLERY, SPTYPE_DPRK_TOW_ART,
		toe_rok, STYPE_UNIT_AIR_DEFENSE, SPTYPE_ROK_AAA,
		toe_rok, STYPE_UNIT_AIR_DEFENSE, SPTYPE_ROK_HAWK,
		toe_rok, STYPE_UNIT_AIR_DEFENSE, SPTYPE_ROK_NIKE,
		toe_rok, STYPE_UNIT_ARMOR, SPTYPE_ROK_M48,
		toe_rok, STYPE_UNIT_HQ, SPTYPE_ROK_HQ,
		toe_rok, STYPE_UNIT_INFANTRY, SPTYPE_ROK_INF,
		toe_rok, STYPE_UNIT_MARINE, SPTYPE_ROK_MARINE,
		toe_rok, STYPE_UNIT_MECHANIZED, SPTYPE_ROK_M113,
		toe_rok, STYPE_UNIT_SP_ARTILLERY, SPTYPE_ROK_SP,
		toe_rok, STYPE_UNIT_TOWED_ARTILLERY, SPTYPE_ROK_M198,
		toe_soviet, STYPE_UNIT_AIR_DEFENSE, SPTYPE_SOVIET_SA15,
		toe_soviet, STYPE_UNIT_AIR_DEFENSE, SPTYPE_SOVIET_SA6,
		toe_soviet, STYPE_UNIT_AIR_DEFENSE, SPTYPE_SOVIET_SA8,
		toe_soviet, STYPE_UNIT_AIRMOBILE, SPTYPE_SOVIET_AIR,
		toe_soviet, STYPE_UNIT_ARMOR, SPTYPE_SOVIET_T72,
		toe_soviet, STYPE_UNIT_ARMOR, SPTYPE_SOVIET_T80,
		toe_soviet, STYPE_UNIT_ARMOR, SPTYPE_SOVIET_T90,
		toe_soviet, STYPE_UNIT_ENGINEER, SPTYPE_SOVIET_ENG,
		toe_soviet, STYPE_UNIT_HQ, SPTYPE_SOVIET_HQ,
		toe_soviet, STYPE_UNIT_INFANTRY, SPTYPE_SOVIET_INF,
		toe_soviet, STYPE_UNIT_MARINE, SPTYPE_SOVIET_MARINE,
		toe_soviet, STYPE_UNIT_MECHANIZED, SPTYPE_SOVIET_MECH,
		toe_soviet, STYPE_UNIT_SS_MISSILE, SPTYPE_SOVIET_SCUD,
		toe_soviet, STYPE_UNIT_SS_MISSILE, SPTYPE_SOVIET_FROG7,
		toe_soviet, STYPE_UNIT_SP_ARTILLERY, SPTYPE_SOVIET_SP,
//		toe_soviet, STYPE_UNIT_SUPPLY, SPTYPE_SOVIET_SUP,
		toe_soviet, STYPE_UNIT_ROCKET, SPTYPE_SOVIET_BM21,
		toe_soviet, STYPE_UNIT_ROCKET, SPTYPE_SOVIET_BM24,
		toe_soviet, STYPE_UNIT_ROCKET, SPTYPE_SOVIET_BM9A52,
		toe_soviet, STYPE_UNIT_TOWED_ARTILLERY, SPTYPE_SOVIET_ART,
		toe_us, STYPE_UNIT_AIR_DEFENSE, SPTYPE_US_PATRIOT,
		toe_us, STYPE_UNIT_AIR_DEFENSE, SPTYPE_US_HAWK,
		toe_us, STYPE_UNIT_AIRMOBILE, SPTYPE_US_AIR,
		toe_us, STYPE_UNIT_ARMOR, SPTYPE_US_M1,
		toe_us, STYPE_UNIT_ARMOR, SPTYPE_US_M60,
		toe_us, STYPE_UNIT_ARMORED_CAV, SPTYPE_US_CAV,
		toe_us, STYPE_UNIT_ENGINEER, SPTYPE_US_ENG,
		toe_us, STYPE_UNIT_HQ, SPTYPE_US_HQ,
		toe_us, STYPE_UNIT_INFANTRY, SPTYPE_US_INF,
		toe_us, STYPE_UNIT_MARINE, SPTYPE_US_LAV25,
		toe_us, STYPE_UNIT_MECHANIZED, SPTYPE_US_M2,
		toe_us, STYPE_UNIT_ROCKET, SPTYPE_US_MLRS,
		toe_us, STYPE_UNIT_SP_ARTILLERY, SPTYPE_US_M109,
//		toe_us, STYPE_UNIT_SUPPLY, SPTYPE_US_SUP,
		toe_unknown, 0, 0
	};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void display_air_units (Unit unit);
void display_land_units (Unit unit);
void tactical_release_flight (long ID, short hittype, C_Base *ctrl);
static void tactical_flight_size (long ID, short hittype, C_Base *ctrl);
static void tactical_create_squadron (long ID, short hittype, C_Base *ctrl);
static void tactical_cancel_squadron (long ID, short hittype, C_Base *ctrl);
static void set_squadron_role (long ID, short hittype, C_Base *ctrl);
static void set_squadron_stype (long ID, short hittype, C_Base *ctrl);
static void set_squadron_sptype (long ID, short hittype, C_Base *ctrl);

static void update_new_battalion_window (void);
void tactical_create_battalion (long ID, short hittype, C_Base *ctrl);
static void tactical_cancel_battalion (long ID, short hittype, C_Base *ctrl);
static void set_battalion_table_of_equipment (long ID, short hittype, C_Base *ctrl);
static void set_battalion_type (long ID, short hittype, C_Base *ctrl);

int MissionToATOMiss (int mistype);

int gATOPackageSelected;
int gATOSquadronSelected;
int gLastAircraftType = 0;
int gLastAirbase = 0;
int gLastRole = 0;
int WeAreAddingPackage=0;
int EdittingPackage=0;
CampEntity gLastTarget = NULL;

VU_ID
	gLastBattalionObjID,
	gLastAirbaseID,
	gNewSelectFlight;

extern VU_ID
	gSelectedATOFlight,
	gSelectedPackage,
	gSelectedSquadron,
	gActiveFlightID,
	gCurrentFlightID,
	gSelectedFlightID;

uchar
	gSelectedTeam=1;

CampEntity
	new_package_target;

CampaignTime
	gPackageTOT = 0,
	gTakeoffTime = 0;

extern GlobalPositioningSystem
	*gGps;

extern C_Map
	*gMapMgr;

GridIndex
	MapX,MapY;

Package
	new_package;

Flight
	new_flight;

static int
	gLastEquipment=0,
	gLastUnitType=-1,
	first_stype = TRUE,
	last_stype = 0,
	gPackagePriority = 0;

extern C_TreeList
	*gATOAll;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void hookup_new_squad_window (C_Window *win)
{
	C_Button		*btn;
	C_ListBox		*lbox;

	if (!win)
		return;

	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;

	// Setup aircraft type listbox
	lbox=(C_ListBox*)win->FindControl(TAC_AIRCRAFT_TYPE);
	if(lbox)
		{
		FillListBoxWithACTypes(lbox);
		// Select last type selected
		lbox->SetValue(gLastAircraftType);
		lbox->SetCallback(tac_select_squadron_aircraft);
		}
		
	// Now setup the airbase list
	lbox=(C_ListBox*)win->FindControl(TAC_AIRBASE_LIST);
	if(lbox)
		lbox->SetCallback(tac_select_squadron_airbase);

	// Setup cancel/ok buttons
	btn = (C_Button *) win->FindControl (CREATE_UNIT);
	if (btn != NULL)
		btn->SetCallback (tactical_create_squadron);
	btn = (C_Button *) win->FindControl (CANCEL_UNIT);
	if (btn != NULL)
		btn->SetCallback (tactical_cancel_squadron);
	btn = (C_Button *) win->FindControl (CLOSE_WINDOW);
	if (btn != NULL)
		btn->SetCallback (tactical_cancel_squadron);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void hookup_new_battalion_window (C_Window *win)
{
	C_Button	*btn;
	C_ListBox	*list;
	_TCHAR		buffer[80];

	btn = (C_Button *) win->FindControl (CREATE_UNIT);
	if (btn != NULL)
		btn->SetCallback (tactical_create_battalion);

	btn = (C_Button *) win->FindControl (CANCEL_UNIT);
	if (btn != NULL)
		btn->SetCallback (tactical_cancel_battalion);

	btn = (C_Button *) win->FindControl (CLOSE_WINDOW);
	if (btn != NULL)
		btn->SetCallback (tactical_cancel_battalion);

	list = (C_ListBox *) win->FindControl (UNIT_TOE);
	if (list)
	{
		list->SetCallback (set_battalion_table_of_equipment);
		list->RemoveAllItems ();
		// Generate list of teams
		buffer[0] = 0;
		AddIndexedStringToBuffer(670, buffer);
		list->AddItem (toe_us, C_TYPE_ITEM, buffer);
		buffer[0] = 0;
		AddIndexedStringToBuffer(671, buffer);
		list->AddItem (toe_soviet, C_TYPE_ITEM, buffer);
		buffer[0] = 0;
		AddIndexedStringToBuffer(672, buffer);
		list->AddItem (toe_chinese, C_TYPE_ITEM, buffer);
		buffer[0] = 0;
		AddIndexedStringToBuffer(673, buffer);
		list->AddItem (toe_rok, C_TYPE_ITEM, buffer);
		buffer[0] = 0;
		AddIndexedStringToBuffer(674, buffer);
		list->AddItem (toe_dprk, C_TYPE_ITEM, buffer);
	}

	list = (C_ListBox *) win->FindControl (UNIT_TYPE);

	if (list)
	{
		list->SetCallback (set_battalion_type);
	}
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void PickTeamColors()
{
	C_Window *win;
	C_Button *btn;
	C_Line *line;

	win=gMainHandler->FindWindow(TAC_EDIT_WIN);
	if(win)
	{
		btn=(C_Button*)win->FindControl(TEAM_SELECTOR);
		if(btn)
		{
			btn->SetState(gSelectedTeam);
			btn->Refresh();
		}
		line=(C_Line*)win->FindControl(TEAM_COLOR);
		if(line)
		{
			line->SetColor(TeamColorList[TeamInfo[gSelectedTeam]->GetColor()]);
			line->Refresh();
		}
	}

	win=gMainHandler->FindWindow(TAC_PUA_MAP);
	if(win)
	{
		btn=(C_Button*)win->FindControl(TEAM_SELECTOR);
		if(btn)
		{
			btn->SetState(gSelectedTeam);
			btn->Refresh();
		}
		line=(C_Line*)win->FindControl(TEAM_COLOR);
		if(line)
		{
			line->SetColor(TeamColorList[TeamInfo[gSelectedTeam]->GetColor()]);
			line->Refresh();
		}
	}

	win=gMainHandler->FindWindow(TAC_FULLMAP_WIN);
	if(win)
	{
		btn=(C_Button*)win->FindControl(TEAM_SELECTOR);
		if(btn)
		{
			btn->SetState(gSelectedTeam);
			btn->Refresh();
		}
		line=(C_Line*)win->FindControl(TEAM_COLOR);
		if(line)
		{
			line->SetColor(TeamColorList[TeamInfo[gSelectedTeam]->GetColor()]);
			line->Refresh();
		}
	}
}

void PickTeamCB(long,short hittype,C_Base *)
{
	short StartTeam;
	if(hittype != C_TYPE_LMOUSEUP)
		return;

	StartTeam=gSelectedTeam;
	do
	{
		gSelectedTeam++;
		if(gSelectedTeam >= NUM_TEAMS)
			gSelectedTeam=1;
	}
	while(!TeamInfo[gSelectedTeam] && gSelectedTeam != StartTeam);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -