26#include "../client/DateTime.h"
27#include "../client/client.h"
28#include "../client/cl_lua.h"
29#include "../client/cgame/cl_game.h"
30#include "../client/renderer/r_state.h"
31#include "../client/ui/ui_main.h"
32#include "../client/cgame/campaign/cp_campaign.h"
33#include "../client/cgame/campaign/cp_geoscape.h"
34#include "../client/cgame/campaign/cp_hospital.h"
35#include "../client/cgame/campaign/cp_missions.h"
36#include "../client/cgame/campaign/cp_nation.h"
37#include "../client/cgame/campaign/cp_overlay.h"
38#include "../client/cgame/campaign/cp_ufo.h"
39#include "../client/cgame/campaign/cp_time.h"
40#include "../client/cgame/campaign/cp_alien_interest.h"
41#include "../client/cgame/campaign/cp_auto_mission.h"
42#include "../client/cgame/campaign/itemcargo.h"
43#include "../client/cgame/campaign/missions/cp_mission_intercept.h"
44#include "../shared/parse.h"
45#include "../shared/images.h"
160 const vec2_t destination = { 10, 10 };
170 base =
CreateBase(
"unittestaircraft", destination);
171 ASSERT_TRUE(
nullptr != base);
175 ASSERT_TRUE(
nullptr != aircraft);
178 aircraftTemplate = aircraft->
tpl;
179 ASSERT_TRUE(
nullptr != aircraftTemplate);
181 firstIdx = aircraft->
idx;
187 ASSERT_EQ(
count, initialCount - 1);
191 ASSERT_TRUE(
nullptr != newAircraft);
193 ASSERT_EQ(
count, initialCount);
196 ASSERT_EQ(newAircraft->
homebase, base);
201 ASSERT_NE(firstIdx, a->idx);
203 if (a->idx == newAircraft->
idx)
207 ASSERT_EQ(newFound, 1);
214 ASSERT_TRUE(
nullptr == aircraft);
233 ASSERT_TRUE(
nullptr != e);
246 const int amount = 3;
247 for (
i = 0;
i < amount;
i++) {
249 ASSERT_TRUE(
nullptr != e);
258 ASSERT_EQ(cnt, amount);
272 ASSERT_TRUE(
nullptr != e);
278 for (
i = 0;
i < 512;
i++) {
280 ASSERT_TRUE(
nullptr != e);
283 ASSERT_EQ(cnt,
i + 1);
316 const vec2_t pos = {-73.2, 18.5};
325 ASSERT_TRUE(campaign !=
nullptr);
333 base =
CreateBase(
"unittestautomission", pos);
334 ASSERT_TRUE(
nullptr != base);
343 ASSERT_TRUE(
nullptr != aircraft);
350 ASSERT_TRUE(
nullptr != mission);
353 AM_Go(mission, aircraft, campaign, &battleParameters, &result);
361 const vec2_t pos = {0, 0};
362 const vec2_t posTarget = {51, 0};
366 ASSERT_TRUE(
nullptr != base);
367 base_t* targetBase =
CreateBase(
"unittesttransferitemtargetbase", posTarget,
true);
368 ASSERT_TRUE(
nullptr != targetBase);
372 ASSERT_TRUE(
nullptr != od);
381 ASSERT_TRUE(
nullptr != transfer);
403 ASSERT_TRUE(
nullptr != transfer);
415 ASSERT_TRUE(
nullptr != transfer);
436 const vec2_t pos = {0, 0};
443 ASSERT_TRUE(
nullptr != ufo);
450 storedUFO =
US_StoreUFO(ufo, installation, date, 1.0);
451 ASSERT_TRUE(
nullptr != storedUFO);
482 ASSERT_TRUE(
nullptr != laserTech);
484 ASSERT_TRUE(
nullptr != otherLaserTech);
486 const vec2_t pos = {0, 0};
493 ASSERT_EQ(laserTech->
base, base);
500 for (
int i = 0;
i < n;
i++) {
502 ASSERT_EQ(finished, 0) <<
"Did not expect to finish a research (#" << finished <<
", i:" <<
i <<
")";
519 const vec2_t pos = {0, 0};
536 ASSERT_TRUE(
nullptr != od);
541 ASSERT_TRUE(
nullptr != prod);
546 for (
i = 0;
i < n;
i++) {
562 const vec2_t pos = {0, 0};
579 ASSERT_TRUE(
nullptr != aircraft);
586 ASSERT_TRUE(
nullptr != aircraft);
589 ASSERT_TRUE(
nullptr != prod);
594 for (
i = 0;
i < n;
i++) {
610 const vec2_t pos = {0, 0};
628 ASSERT_TRUE(
nullptr != ufo);
633 ASSERT_TRUE(
nullptr != storedUFO);
637 ASSERT_TRUE(
nullptr != prod);
643 for (
i = 0;
i < n;
i++) {
678 const vec2_t destination = { 10, 10 };
681 const int deltaTime = 1000;
686 ASSERT_TRUE(
nullptr != base);
695 ASSERT_TRUE(
nullptr != aircraft);
703 ASSERT_TRUE(
nullptr != ufoTemplate);
708 ASSERT_TRUE(
nullptr != mission);
715 ASSERT_TRUE(
nullptr != ufo);
758 const vec2_t destination = { 10, 10 };
770 base->
radar.ufoDetectionProbability = 1.0;
785 ASSERT_TRUE(
nullptr != nation);
809 const vec2_t pos = {0, 0};
847 ASSERT_STREQ(base->
name,
"unittestbase");
867 const vec2_t pos = {0, 0};
871 ASSERT_TRUE(
nullptr != nation);
873 const int employees = 10000;
874 for (
int i = 0;
i < employees;
i++) {
899 const vec2_t destination = { 10, 10 };
912 for (
int i = 0;
i < seconds;
i++) {
959 ASSERT_FALSE(date <=
ccs.
date);
969 ASSERT_FALSE(date <=
ccs.
date);
980 const vec2_t destination = { 10, 10 };
982 base =
CreateBase(
"unittestcampaigntime", destination);
1009 const vec2_t destination = { 10, 10 };
1012 base =
CreateBase(
"unittesthospital", destination);
1019 if (!employee->isHired())
1021 employee->chr.HP = employee->chr.maxHP - 10;
1032 if (!employee->isHired())
1034 ASSERT_NE(employee->chr.HP, employee->chr.maxHP - 10) << employee->chr.HP <<
"/" << employee->chr.maxHP;
1046 const vec2_t pos = {0, 0};
1050 building_t* entrance, *building1, *building2;
1055 base =
CreateBase(
"unittestbuildingconstruction1", pos);
1056 ASSERT_TRUE(
nullptr != base);
1057 base =
CreateBase(
"unittestbuildingconstruction2", pos);
1058 ASSERT_TRUE(
nullptr != base);
1066 ASSERT_TRUE(
nullptr != buildingTemplate);
1069 x = entrance->
pos[0];
1070 y = entrance->
pos[1];
1080 ASSERT_TRUE(
nullptr == building1);
1083 x = (x + entrance->
pos[0]) /2;
1086 ASSERT_TRUE(
nullptr != building1);
1089 if (x < entrance->pos[0])
1094 ASSERT_TRUE(
nullptr == building2);
1108 ASSERT_TRUE(
nullptr != building2);
1114 ASSERT_TRUE(
nullptr != building2);
1137 const char* error =
nullptr;
1141 ASSERT_TRUE(success) << error;
1146 const char* map = md->
id;
1159 for (
i = 0;
i < ufoIdsNum;
i++) {
1173 ASSERT_TRUE(
CP_ChooseMap(&mission, city->
pos)) <<
"could not find a map for city " << city->id;
1178 ASSERT_NE(0, numUfoTypes);
1179 for (
i = 0;
i < numUfoTypes;
i++) {
1186 ASSERT_TRUE(
nullptr != ufo);
1190 mission.
mapDef =
nullptr;
1192 ASSERT_TRUE(
CP_ChooseMap(&mission, city->
pos)) <<
"could not find map for city " << city->
id <<
" with ufo: " << ufo->
id;
1211 for (
i = 0;
i < numUfoTypes;
i++) {
1226 ASSERT_TRUE(
va(
"%s wasn't used", md->
id));
1240 ASSERT_TRUE(result) <<
"could not find a mission for mapdef " << md->
id;
1254 for (
int i = 0;
i < 60;
i++) {
1261 event->active =
true;
1264 event->command =
Mem_StrDup(
"test_eventtrigger");
1265 event->require =
Mem_StrDup(
"ufo[craft_ufo_harvester]");
1283 const int expected = 22;
1285 ASSERT_TRUE(maxSize >= expected);
1287 const vec2_t destination = { 10, 10 };
1289 ASSERT_TRUE(
nullptr != base);
1293 ASSERT_TRUE(
B_AssembleMap(maps,
sizeof(maps), coords,
sizeof(coords), base));
1294 const char* str = coords;
1295 int coordsAmount = 0;
1300 }
while (str !=
nullptr);
1308 }
while (str !=
nullptr);
1311 ASSERT_EQ(coordsAmount / 3, expected) <<
"coords have " << coordsAmount <<
" entries: '" << coords <<
"'";
1312 ASSERT_EQ(mapsAmount, expected) <<
"maps have " << mapsAmount <<
" entries: '"<< maps <<
"'";
1317 const char* types[] = {
"terrain",
"culture",
"population",
"nations",
nullptr};
1323 for (
const char **t = types; *t; ++t) {
1324 const char *image =
va(
"pics/geoscape/%s_%s", c.
map, *t);
1326 ASSERT_TRUE(surf !=
nullptr);
1327 const int w = surf->w;
1328 const int h = surf->h;
1333 SDL_FreeSurface(surf);
1344 ASSERT_FALSE(exists);
1345 ASSERT_EQ(0,
count);
1350 const vec2_t pos = {1, -89};
1354 ASSERT_NE(
nullptr, alienBase);
1357 ASSERT_EQ(50.f, alienBase->
stealth);
1358 ASSERT_EQ(0, alienBase->
supply);
1359 ASSERT_EQ(1, alienBase->
pos[0]);
1360 ASSERT_EQ(-89, alienBase->
pos[1]);
1365 const vec2_t phalanxPos = {0, 0};
1369 const vec2_t alienPos = {0, -89};
1376 ASSERT_NE(
nullptr, alienBase);
1377 ASSERT_GT(0.0f, alienBase->
stealth);
1379 ASSERT_NE(
nullptr, mission);
void GAME_InitStartup(void)
void CL_InitLua(void)
Initializes the ui-lua interfacing environment.
memPool_t * vid_imagePool
void CL_SetClientState(connstate_t state)
Sets the client state.
memPool_t * cl_genericPool
mapDef_t * Com_GetMapDefinitionByID(const char *mapDefID)
#define MapDef_ForeachSingleplayerCampaign(var)
static void TearDownTestCase()
static void SetUpTestCase()
Class describing a point of time.
static const int SECONDS_PER_DAY
int getDateAsDays() const
Return the date part of the DateTime as days.
void initInventory(const char *name, const csi_t *csi, const inventoryImport_t *import)
Initializes the inventory definition by linking the ->next pointers properly.
void destroyInventoryInterface(void)
virtual bool add(const objDef_t *od, int amount, int looseAmount)
Add items to the cargo.
void Cmd_ExecuteString(const char *text,...)
A complete command line has been parsed, so try to execute it.
void Cmd_RemoveCommand(const char *cmdName)
Removes a command from script interface.
void Cmd_Dummy_f(void)
Dummy binding if you don't want unknown commands forwarded to the server.
void Cmd_AddCommand(const char *cmdName, xcommand_t function, const char *desc)
Add a new command to the script interface.
memPool_t * com_genericPool
void AIR_DeleteAircraft(aircraft_t *aircraft)
Removes an aircraft from its base and the game.
int AIR_BaseCountAircraft(const base_t *base)
Returns the number of aircraft on the given base.
aircraft_t * AIR_NewAircraft(base_t *base, const aircraft_t *aircraftTemplate)
Places a new aircraft in the given base.
bool AIR_IsAircraftOnGeoscape(const aircraft_t *aircraft)
Checks whether given aircraft is on geoscape.
int AIR_GetTeamSize(const aircraft_t *aircraft)
Counts the number of soldiers in given aircraft.
const aircraft_t * AIR_GetAircraft(const char *name)
Searches the global array of aircraft types for a given aircraft.
aircraft_t * AIR_GetFirstFromBase(const base_t *b)
Iterates through the aircraft of a base.
#define AIR_Foreach(var)
iterates trough all aircraft
#define AIR_ForeachFromBase(var, base)
iterates trough all aircraft from a specific homebase
void AIRFIGHT_CampaignRunProjectiles(const campaign_t *campaign, int dt)
Update values of projectiles.
void INT_ResetAlienInterest(void)
Initialize alien interest values and mission cycle.
@ INTERESTCATEGORY_TERROR_ATTACK
@ INTERESTCATEGORY_INTERCEPT
int AB_GetAlienBaseNumber(void)
Check number of alien bases.
alienBase_t * AB_BuildBase(const vec2_t pos)
Build a new alien base.
void AB_BaseSearchedByNations(void)
Nations help in searching alien base.
void AM_Go(mission_t *mission, aircraft_t *aircraft, const campaign_t *campaign, const battleParam_t *battleParameters, missionResults_t *results)
Handles the auto mission.
bool B_BuildingDestroy(building_t *building)
Removes a building from the given base.
building_t * B_BuildBuilding(base_t *base, const building_t *buildingTemplate, int col, int row)
Build a new building to the base.
bool B_AssembleMap(char *maps, size_t mapsLength, char *coords, size_t coordsLength, const base_t *base)
Perform the base assembling in case of an alien attack.
int B_GetInstallationLimit(void)
Counts the actual installation count limit.
void B_SetName(base_t *base, const char *name)
Set the base name.
void B_Destroy(base_t *base)
Destroy a base.
void B_UpdateBuildingConstructions(void)
Updates base data.
bool B_GetBuildingStatus(const base_t *const base, const buildingType_t buildingType)
Get the status associated to a building.
base_t * B_Build(const campaign_t *campaign, const vec2_t pos, const char *name, bool fillBase)
Build new base, uses template for the first base.
void B_SetUpFirstBase(const campaign_t *campaign, base_t *base)
Setup aircraft and equipment for first base. Uses the campaign scriptable equipmentlist.
bool PR_ProductionAllowed(const base_t *base)
Returns true if the current base is able to produce items.
#define B_AtLeastOneExists()
building_t * B_GetBuildingTemplate(const char *buildingName)
Returns the building in the global building-types list that has the unique name buildingID.
@ B_STATUS_UNDER_CONSTRUCTION
memPool_t * cp_campaignPool
void CP_ResetCampaignData(void)
Will clear most of the parsed singleplayer data.
void CP_CampaignRun(campaign_t *campaign, float secondsSinceLastFrame)
Called every frame when we are in geoscape view.
campaign_t * CP_GetCampaign(const char *name)
Returns the campaign pointer from global campaign array.
void CP_UpdateCredits(int credits)
Sets credits and update mn_credits cvar.
void CP_ParseCampaignData(void)
Read the data for campaigns.
void CP_ReadCampaignData(const campaign_t *campaign)
int CAP_GetFreeCapacity(const base_t *base, baseCapacities_t capacityType)
Returns the free capacity of a type.
#define CAP_GetCurrent(base, capacity)
bool E_DeleteEmployee(Employee *employee)
Removes the employee completely from the game (buildings + global list).
void E_InitialEmployees(const campaign_t *campaign)
Create initial hireable employees.
Employee * E_CreateEmployee(employeeType_t type, const nation_t *nation, const ugv_t *ugvType)
Creates an entry of a new employee in the global list and assignes it to no building/base.
void E_DeleteAllEmployees(base_t *base)
Removes all employees completely from the game (buildings + global list) from a given base.
int E_CountHired(const base_t *const base, employeeType_t type)
Counts hired employees of a given type in a given base.
bool E_HireEmployee(base_t *base, Employee *employee)
Hires the employee in a base.
int E_CountUnhired(employeeType_t type)
Counts unhired employees of a given type in a given base.
employeeType_t
The types of employees.
#define E_Foreach(employeeType, var)
void CP_TriggerEvent(campaignTriggerEventType_t type, const void *userdata)
Triggers a campaign event with a special type.
void GEO_Init(const char *map)
bool CP_GetRandomPosOnGeoscapeWithParameters(vec2_t pos, const linkedList_t *terrainTypes, const linkedList_t *cultureTypes, const linkedList_t *populationTypes, const linkedList_t *nations)
Determines a random position on geoscape that fulfills certain criteria given via parameters.
const byte * GEO_GetColor(const vec2_t pos, mapType_t type, bool *coast)
Returns the color value from geoscape of a certain mask (terrain, culture or population) at a given p...
#define MapIsWater(color)
void HOS_HospitalRun(void)
Checks health status of all employees in all bases.
installation_t * INS_Build(const installationTemplate_t *installationTemplate, const vec2_t pos, const char *name)
Build a new installation.
const installationTemplate_t * INS_GetInstallationTemplateByType(installationType_t type)
Returns the installation Template for a given installation type.
void INS_UpdateInstallationData(void)
Check if some installation are build.
#define MAX_INSTALLATIONS_PER_BASE
void BS_InitMarket(const campaign_t *campaign)
sets market prices at start of the game
void CP_CampaignRunMarket(campaign_t *campaign)
make number of items change every day.
void CP_InterceptNextStage(mission_t *mission)
Determine what action should be performed when a Intercept mission stage ends.
void CP_CreateBattleParameters(mission_t *mission, battleParam_t *param, const aircraft_t *aircraft)
Create parameters needed for battle. This is the data that is used for starting the tactical part of ...
mission_t * CP_CreateNewMission(interestCategory_t category, bool beginNow)
Create a new mission of given category.
bool CP_ChooseMap(mission_t *mission, const vec2_t pos)
Choose a map for given mission.
mission_t * MIS_GetByIdx(int id)
Find mission corresponding to idx.
void NAT_HandleBudget(const campaign_t *campaign)
Update the nation data from all parsed nation each month.
nation_t * NAT_GetNationByID(const char *nationID)
Return a nation-pointer by the nations id.
void PR_ProductionRun(void)
Checks whether an item is finished.
int PR_WorkersAvailable(const base_t *base)
Returns the numer of workers available to produce an item.
production_t * PR_QueueNew(base_t *base, const productionData_t *data, signed int amount)
Add a new item to the bottom of the production queue.
int PR_GetRemainingMinutes(const production_t *prod)
Calculates the remaining time for a technology in minutes.
int PR_GetRemainingHours(const production_t *prod)
Calculates the remaining hours for a technology.
@ PRODUCTION_TYPE_DISASSEMBLY
@ PRODUCTION_TYPE_AIRCRAFT
#define PR_SetData(dataPtr, typeVal, ptr)
bool RADAR_CheckUFOSensored(radar_t *radar, const vec2_t posRadar, const aircraft_t *ufo, bool detected)
Check if the specified UFO is inside the sensor range of the given radar.
void RS_MarkOneResearchable(technology_t *tech)
Marks one tech as researchable.
technology_t * RS_GetTechForItem(const objDef_t *item)
Returns technology entry for an item.
technology_t * RS_GetTechByID(const char *id)
return a pointer to the technology identified by given id string
void RS_AssignScientist(technology_t *tech, base_t *base, Employee *employee)
Assigns scientist to the selected research-project.
int RS_ResearchRun(void)
Checks the research status.
void RS_MarkResearchable(const base_t *base, bool init)
Marks all the techs that can be researched. Automatically researches 'free' techs such as ammo for a ...
void RS_InitTree(const campaign_t *campaign, bool load)
Gets all needed names/file-paths/etc... for each technology entry. Should be executed after the parsi...
bool SAV_GameLoad(const char *file, const char **error)
Loads the given savegame from an xml File.
void SAV_Init(void)
Register all save-subsystems and init some cvars and commands.
void CP_UpdateTime(void)
Updates date/time and timescale (=timelapse) on the geoscape menu.
bool CP_IsTimeStopped(void)
Check if time is stopped.
transfer_t * TR_TransferStart(base_t *srcBase, transfer_t &transData)
Starts a transfer.
void TR_TransferRun(void)
Checks whether given transfer should be processed.
void UFO_CampaignRunUFOs(const campaign_t *campaign, int deltaTime)
Make the UFOs run.
void UFO_SendToDestination(aircraft_t *ufo, const vec2_t dest)
Make the specified UFO go to destination.
void UFO_CheckShootBack(const campaign_t *campaign, aircraft_t *ufo, aircraft_t *phalanxAircraft)
Check if the ufo can shoot back at phalanx aircraft.
const aircraft_t * UFO_GetByType(const ufoType_t type)
Get the aircraft template for a given UFO type.
aircraft_t * UFO_AddToGeoscape(ufoType_t ufoType, const vec2_t destination, mission_t *mission)
Add a UFO to geoscape.
aircraft_t * UFO_GetNextOnGeoscape(aircraft_t *lastUFO)
int UFO_GetAvailableUFOsForMission(const interestCategory_t missionType, ufoType_t *ufoTypes, bool checkInterest)
Fill an array with available UFOs for the mission type.
void UFO_RemoveFromGeoscape(aircraft_t *ufo)
Remove the specified ufo from geoscape.
storedUFO_t * US_StoreUFO(const aircraft_t *ufoTemplate, installation_t *installation, DateTime &date, float condition)
Adds an UFO to the storage.
void UR_ProcessActive(void)
Function to process active recoveries.
cvar_t * Cvar_Set(const char *varName, const char *value,...)
Sets a cvar value.
cvar_t * Cvar_Get(const char *var_name, const char *var_value, int flags, const char *desc)
Init or return a cvar.
SDL_Surface * Img_LoadImage(char const *name)
Loads the specified image from the game filesystem and populates the provided SDL_Surface.
const objDef_t * INVSH_GetItemByID(const char *id)
Returns the item that belongs to the given id or nullptr if it wasn't found.
int LIST_Count(const linkedList_t *list)
bool LIST_IsEmpty(const linkedList_t *list)
Checks whether the given list is empty.
const linkedList_t * LIST_ContainsString(const linkedList_t *list, const char *string)
Searches for the first occurrence of a given string.
#define LIST_Foreach(list, type, var)
Iterates over a linked list, it's safe to delete the returned entry from the list while looping over ...
#define Mem_CreatePool(name)
#define Mem_FreeTag(pool, tagNum)
#define Mem_PoolAlloc(size, pool, tagNum)
const char * Com_Parse(const char *data_p[], char *target, size_t size, bool replaceWhitespaces)
Parse a token out of a string.
QGL_EXTERN void(APIENTRY *qglActiveTexture)(GLenum texture)
QGL_EXTERN GLsizei const GLvoid * data
QGL_EXTERN GLint GLenum type
QGL_EXTERN GLuint GLsizei GLsizei GLint GLenum GLchar * name
void Com_ParseScripts(bool onlyServer)
const ugv_t * Com_GetUGVByID(const char *ugvID)
Searches an UGV definition by a given script id and returns the pointer to the global data.
short Com_GetUfoIdsNum(void)
const char * va(const char *format,...)
does a varargs printf into a temp buffer, so I don't need to have varargs versions of all text functi...
An aircraft with all it's data.
aircraftSlot_t weapons[MAX_AIRCRAFTSLOT]
struct aircraft_s * aircraftTarget
int ufoInterestOnGeoscape
struct mission_s * mission
struct technology_s * tech
A base with all it's data.
baseBuildingTile_t map[BASE_SIZE][BASE_SIZE]
A building with all it's data.
buildingStatus_t buildingStatus
building_t buildings[MAX_BASES][MAX_BUILDINGS]
int numCampaignTriggerEvents
campaign_t campaigns[MAX_CAMPAIGNS]
campaignTriggerEvent_t campaignTriggerEvents[MAX_CAMPAIGN_TRIGGER_EVENTS]
int numBuildings[MAX_BASES]
int numItems[MAX_OBJDEFS]
A installation with all it's data.
const installationTemplate_t * installationTemplate
linkedList_t * populations
Structure with mission info needed to create results summary at menu won.
union mission_t::missionData_t data
Defines all attributes of objects used in the inventory.
Holds all information for the production of one item-type.
gltexunit_t * active_texunit
gltexunit_t texunits[MAX_GL_TEXUNITS]
Structure for stored UFOs.
struct components_s * comp
This is the technology parsed from research.ufo.
researchStatus_t statusResearch
Transfer information (they are being stored in ccs.transfers).
class ItemCargo * itemCargo
Defines a type of UGV/Robot.
int Sys_Milliseconds(void)
static void ResetInventoryList(void)
static bool testEventTriggerCalled
static const int TAG_INVENTORY
static void * AllocInventoryMemory(size_t size)
static base_t * CreateBase(const char *name, const vec2_t pos, bool fillBase=false)
static void testEventTrigger_f(void)
static void FreeAllInventory(void)
TEST_F(CampaignTest, testAircraftHandling)
static installation_t * CreateInstallation(const char *name, const vec2_t pos)
static bool skipTest(const mapDef_t *md)
static campaign_t * GetCampaign(void)
static void FreeInventory(void *data)
static const inventoryImport_t inventoryImport
#define VectorEqual(a, b)
#define Vector2Set(v, x, y)
#define Vector2Copy(src, dest)