📄 te_units.cpp
字号:
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// 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 + -