UFO: Alien Invasion
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
cp_auto_mission.cpp File Reference

single player automatic (quick, simulated) missions, without going to the battlescape. More...

#include "../../cl_shared.h"
#include "../../cl_inventory.h"
#include "cp_auto_mission.h"
#include "cp_campaign.h"
#include "cp_character.h"
#include "cp_geoscape.h"
#include "cp_missions.h"
#include "cp_mission_triggers.h"
#include "../../../shared/mathlib_extra.h"
#include "math.h"
#include "cp_mission_callbacks.h"

Go to the source code of this file.

Data Structures

struct  autoUnit_s
 One unit (soldier/alien/civilian) of the autobattle. More...
 
struct  autoMissionBattle_s
 Data structure for a simulated or auto mission. More...
 

Macros

#define MAX_SOLDIERS_AUTOMISSION   MAX_TEAMS * AUTOMISSION_TEAM_TYPE_MAX
 
#define SKILL_AWARD_SCALE   0.3f
 Constants for automission experience gain factors. More...
 
#define ABILITY_AWARD_SCALE   0.06f
 
#define AM_IsPlayer(type)   ((type) == AUTOMISSION_TEAM_TYPE_PLAYER)
 
#define AM_IsAlien(type)   ((type) == AUTOMISSION_TEAM_TYPE_ALIEN)
 
#define AM_IsCivilian(type)   ((type) == AUTOMISSION_TEAM_TYPE_CIVILIAN)
 
#define AM_SetHostile(battle, team, otherTeam, value)   (battle)->isHostile[(team)][(otherTeam)] = (value)
 
#define AM_IsHostile(battle, team, otherTeam)   ((battle)->isHostile[(team)][(otherTeam)])
 
#define AM_GetUnit(battle, teamIdx, unitIdx)   (&battle->units[teamIdx][unitIdx])
 
#define AM_IsUnitActive(unit)   (((unit)->chr->HP > 0) && ((unit)->chr->HP > (unit)->chr->STUN))
 

Typedefs

typedef enum autoMission_teamType_s autoMissionTeamType_t
 Possible types of teams that can fight in an auto mission battle. More...
 
typedef struct autoUnit_s autoUnit_t
 One unit (soldier/alien/civilian) of the autobattle. More...
 
typedef struct autoMissionBattle_s autoMissionBattle_t
 Data structure for a simulated or auto mission. More...
 

Enumerations

enum  autoMission_teamType_s { AUTOMISSION_TEAM_TYPE_PLAYER, AUTOMISSION_TEAM_TYPE_ALIEN, AUTOMISSION_TEAM_TYPE_CIVILIAN, AUTOMISSION_TEAM_TYPE_MAX }
 Possible types of teams that can fight in an auto mission battle. More...
 

Functions

static void AM_ClearBattle (autoMissionBattle_t *battle)
 Clears, initializes, or resets a single auto mission, sets default values. More...
 
static void AM_FillTeamFromAircraft (autoMissionBattle_t *battle, const autoMissionTeamType_t teamNum, const aircraft_t *aircraft, const campaign_t *campaign)
 Adds team data for a specified team in an auto-mission object, from a (player) aircraft. More...
 
static void AM_CreateUnitChr (autoUnit_t *unit, const teamDef_t *teamDef, const equipDef_t *ed)
 Create character for a Unit. More...
 
static void AM_DestroyUnitChr (autoUnit_t *unit)
 Destroys character of a Unit. More...
 
static void AM_FillTeamFromBattleParams (autoMissionBattle_t *battle, const battleParam_t *missionParams)
 Creates team data for alien and civilian teams based on the mission parameters data. More...
 
static void AM_SetDefaultHostilities (autoMissionBattle_t *battle, const bool civsInfected)
 Run this on an auto mission battle before the battle is actually simulated, to set default values for who will attack which team. If you forget to do this before battle simulation, all teams will default to "free for all" (Everyone will try to kill everyone else). More...
 
static void AM_CalculateTeamScores (autoMissionBattle_t *battle)
 Calcuates Team strength scores for autobattle. More...
 
static int AM_GetRandomTeam (autoMissionBattle_t *battle, int currTeam, bool enemy)
 returns a randomly selected active team More...
 
static autoUnit_tAM_GetRandomActiveUnitOfTeam (autoMissionBattle_t *battle, int team)
 returns a randomly selected alive unit from a team More...
 
static autoUnit_tAM_GetRandomActiveUnit (autoMissionBattle_t *battle, int currTeam, bool enemy)
 returns a randomly selected active unit More...
 
static bool AM_CheckFire (autoMissionBattle_t *battle, autoUnit_t *currUnit, autoUnit_t *eUnit, const double effective)
 Check and do attack on a team. More...
 
static bool AM_UnitAttackEnemy (autoMissionBattle_t *battle, autoUnit_t *currUnit, const double effective)
 Make Unit attack his enemies (or friends) More...
 
static void AM_DoFight (autoMissionBattle_t *battle)
 Main Battle loop function. More...
 
static void AM_DisplayResults (const autoMissionBattle_t *battle)
 This will display on-screen, for the player, results of the auto mission. More...
 
static void AM_MoveCharacterInventoryIntoItemCargo (aircraft_t *aircraft, character_t *chr)
 Move equipment carried by the soldier/alien to the aircraft's itemcargo bay. More...
 
static void AM_AlienCollect (aircraft_t *aircraft, const autoMissionBattle_t *battle)
 Collect alien bodies and items after battle. More...
 
static void AM_UpdateSurivorsAfterBattle (const autoMissionBattle_t *battle, struct aircraft_s *aircraft)
 This looks at a finished auto battle, and uses values from it to kill or lower health of surviving soldiers on a mission drop ship as appropriate. It also hands out some experience to soldiers that survive. More...
 
static void AM_CleanBattleParameters (autoMissionBattle_t *battle)
 Clean up alien and civilian teams. More...
 
void AM_Go (mission_t *mission, aircraft_t *aircraft, const campaign_t *campaign, const battleParam_t *battleParameters, missionResults_t *results)
 Handles the auto mission. More...
 
void AM_InitStartup (void)
 Init actions for automission-subsystem. More...
 
void AM_Shutdown (void)
 Closing actions for automission-subsystem. More...
 

Detailed Description

single player automatic (quick, simulated) missions, without going to the battlescape.

Definition in file cp_auto_mission.cpp.

Macro Definition Documentation

#define ABILITY_AWARD_SCALE   0.06f

Definition at line 87 of file cp_auto_mission.cpp.

Referenced by AM_UpdateSurivorsAfterBattle().

#define AM_GetUnit (   battle,
  teamIdx,
  unitIdx 
)    (&battle->units[teamIdx][unitIdx])
#define AM_IsAlien (   type)    ((type) == AUTOMISSION_TEAM_TYPE_ALIEN)

Definition at line 90 of file cp_auto_mission.cpp.

Referenced by AM_SetDefaultHostilities().

#define AM_IsCivilian (   type)    ((type) == AUTOMISSION_TEAM_TYPE_CIVILIAN)

Definition at line 91 of file cp_auto_mission.cpp.

Referenced by AM_SetDefaultHostilities().

#define AM_IsHostile (   battle,
  team,
  otherTeam 
)    ((battle)->isHostile[(team)][(otherTeam)])

Definition at line 93 of file cp_auto_mission.cpp.

Referenced by AM_CheckFire(), AM_GetRandomActiveUnit(), and AM_GetRandomTeam().

#define AM_IsPlayer (   type)    ((type) == AUTOMISSION_TEAM_TYPE_PLAYER)

Definition at line 89 of file cp_auto_mission.cpp.

Referenced by AM_SetDefaultHostilities().

#define AM_IsUnitActive (   unit)    (((unit)->chr->HP > 0) && ((unit)->chr->HP > (unit)->chr->STUN))
#define AM_SetHostile (   battle,
  team,
  otherTeam,
  value 
)    (battle)->isHostile[(team)][(otherTeam)] = (value)

Definition at line 92 of file cp_auto_mission.cpp.

Referenced by AM_SetDefaultHostilities().

#define MAX_SOLDIERS_AUTOMISSION   MAX_TEAMS * AUTOMISSION_TEAM_TYPE_MAX

Definition at line 48 of file cp_auto_mission.cpp.

Referenced by AM_FillTeamFromAircraft(), and AM_UpdateSurivorsAfterBattle().

#define SKILL_AWARD_SCALE   0.3f

Constants for automission experience gain factors.

Todo:
make these scripted in campaign definitions maybe

Definition at line 86 of file cp_auto_mission.cpp.

Referenced by AM_UpdateSurivorsAfterBattle().

Typedef Documentation

Data structure for a simulated or auto mission.

Possible types of teams that can fight in an auto mission battle.

typedef struct autoUnit_s autoUnit_t

One unit (soldier/alien/civilian) of the autobattle.

Todo:
add attack and defence scores

Enumeration Type Documentation

Possible types of teams that can fight in an auto mission battle.

Enumerator
AUTOMISSION_TEAM_TYPE_PLAYER 

Human player-controlled team. Includes soldiers as well as downed pilots.

AUTOMISSION_TEAM_TYPE_ALIEN 

AI-controlled alien team.

AUTOMISSION_TEAM_TYPE_CIVILIAN 

AI-controlled civilians that can be healthy or infected.

AUTOMISSION_TEAM_TYPE_MAX 

Definition at line 40 of file cp_auto_mission.cpp.

Function Documentation

static void AM_AlienCollect ( aircraft_t aircraft,
const autoMissionBattle_t battle 
)
static

Collect alien bodies and items after battle.

Parameters
[out]aircraftMission aircraft that will bring stuff home
[in]battleThe battle we fought

Definition at line 781 of file cp_auto_mission.cpp.

References _, AL_AddAlienTypeToAircraftCargo(), AM_GetUnit, AM_IsUnitActive, AM_MoveCharacterInventoryIntoItemCargo(), AUTOMISSION_TEAM_TYPE_ALIEN, autoUnit_s::chr, character_s::HP, MS_AddNewMessage(), autoMissionBattle_s::nUnits, and character_s::teamDef.

Referenced by AM_Go().

static void AM_CalculateTeamScores ( autoMissionBattle_t battle)
static
static void AM_CleanBattleParameters ( autoMissionBattle_t battle)
static

Clean up alien and civilian teams.

Parameters
[in,out]battleThe common autobattle descriptor structure

Definition at line 863 of file cp_auto_mission.cpp.

References AM_DestroyUnitChr(), AM_GetUnit, AUTOMISSION_TEAM_TYPE_ALIEN, AUTOMISSION_TEAM_TYPE_CIVILIAN, and autoMissionBattle_s::nUnits.

Referenced by AM_Go().

static void AM_ClearBattle ( autoMissionBattle_t battle)
static

Clears, initializes, or resets a single auto mission, sets default values.

Parameters
[in,out]battleThe battle that should be initialized to defaults

Definition at line 102 of file cp_auto_mission.cpp.

References AUTOMISSION_TEAM_TYPE_MAX, autoMissionBattle_s::isHostile, OBJZERO, autoMissionBattle_s::results, autoMissionBattle_s::scoreTeamDifficulty, autoMissionBattle_s::scoreTeamEquipment, autoMissionBattle_s::scoreTeamSkill, and autoMissionBattle_s::winningTeam.

Referenced by AM_Go().

static void AM_CreateUnitChr ( autoUnit_t unit,
const teamDef_t teamDef,
const equipDef_t ed 
)
static

Create character for a Unit.

Parameters
[out]unitThe unit to create character for
[in]teamDefThe team definition of the unit
[in]edThe equipment to use
See also
AM_DestroyUnitChr

Definition at line 213 of file cp_auto_mission.cpp.

References cgi, autoUnit_s::chr, cp_campaignPool, teamDef_s::id, Mem_PoolAllocType, teamDef_s::onlyWeapon, and character_s::teamDef.

Referenced by AM_FillTeamFromBattleParams().

static void AM_DestroyUnitChr ( autoUnit_t unit)
static

Destroys character of a Unit.

Parameters
[out]unitThe unit to create character for
See also
AM_CreateUnitChr

Definition at line 226 of file cp_auto_mission.cpp.

References cgi, autoUnit_s::chr, and character_s::inv.

Referenced by AM_CleanBattleParameters().

static void AM_DisplayResults ( const autoMissionBattle_t battle)
static

This will display on-screen, for the player, results of the auto mission.

Parameters
[in]battleAutobattle structure with the results
Todo:
results should be set in missionResult and this code should be merged with manual mission result screen code, possibly in a new file: cp_mission_callbacks.c/h

Definition at line 734 of file cp_auto_mission.cpp.

References _, AUTOMISSION_TEAM_TYPE_ALIEN, AUTOMISSION_TEAM_TYPE_PLAYER, cgi, MS_AddNewMessage(), autoMissionBattle_s::results, missionResults_s::state, autoMissionBattle_s::teamAccomplishment, and WON.

Referenced by AM_Go().

static void AM_FillTeamFromAircraft ( autoMissionBattle_t battle,
const autoMissionTeamType_t  teamNum,
const aircraft_t aircraft,
const campaign_t campaign 
)
static

Adds team data for a specified team in an auto-mission object, from a (player) aircraft.

Parameters
[in,out]battleThe auto mission battle to add team data to
[in]teamNumThe team number in the auto mission instance to update
[in]aircraftThe aircraft to get data from
[in]campaignThe current campaign (for retrieving difficulty level)
Note
This function actually gets the data from the campaign object, using the aircraft data to find out which of all the employees are on the aircraft (in the mission)

Definition at line 132 of file cp_auto_mission.cpp.

References aircraft_s::acTeam, autoMissionBattle_s::actUnits, AM_GetUnit, AUTOMISSION_TEAM_TYPE_MAX, cgi, autoUnit_s::chr, DEBUG_CLIENT, campaign_s::difficulty, autoUnit_s::idx, LIST_Foreach, MAX_SOLDIERS_AUTOMISSION, autoMissionBattle_s::nUnits, autoMissionBattle_s::scoreTeamDifficulty, and autoUnit_s::team.

Referenced by AM_Go().

static void AM_FillTeamFromBattleParams ( autoMissionBattle_t battle,
const battleParam_t missionParams 
)
static
static autoUnit_t* AM_GetRandomActiveUnit ( autoMissionBattle_t battle,
int  currTeam,
bool  enemy 
)
static

returns a randomly selected active unit

Parameters
[in]battleThe battle we fight
[in]currTeamCurrent team we search for
[in]enemyIf the team should be enemy or friendly

Definition at line 511 of file cp_auto_mission.cpp.

References autoMissionBattle_s::actUnits, AM_GetRandomActiveUnitOfTeam(), AM_GetRandomTeam(), AM_IsHostile, and AUTOMISSION_TEAM_TYPE_MAX.

Referenced by AM_UnitAttackEnemy().

static autoUnit_t* AM_GetRandomActiveUnitOfTeam ( autoMissionBattle_t battle,
int  team 
)
static

returns a randomly selected alive unit from a team

Parameters
[in]battleThe battle we fight
[in]teamTeam to get unit from

Definition at line 471 of file cp_auto_mission.cpp.

References autoMissionBattle_s::actUnits, AM_GetUnit, AM_IsUnitActive, AUTOMISSION_TEAM_TYPE_MAX, and autoMissionBattle_s::nUnits.

Referenced by AM_GetRandomActiveUnit().

static int AM_GetRandomTeam ( autoMissionBattle_t battle,
int  currTeam,
bool  enemy 
)
static

returns a randomly selected active team

Parameters
[in]battleThe battle we fight
[in]currTeamCurrent team we search for
[in]enemyIf the team should be enemy or friendly

Definition at line 441 of file cp_auto_mission.cpp.

References autoMissionBattle_s::actUnits, AM_IsHostile, and AUTOMISSION_TEAM_TYPE_MAX.

Referenced by AM_GetRandomActiveUnit().

void AM_Go ( mission_t mission,
aircraft_t aircraft,
const campaign_t campaign,
const battleParam_t battleParameters,
missionResults_t results 
)
void AM_InitStartup ( void  )

Init actions for automission-subsystem.

Definition at line 938 of file cp_auto_mission.cpp.

Referenced by CP_InitStartup().

static void AM_MoveCharacterInventoryIntoItemCargo ( aircraft_t aircraft,
character_t chr 
)
static

Move equipment carried by the soldier/alien to the aircraft's itemcargo bay.

Parameters
[in,out]aircraftThe craft with the team (and thus equipment) onboard.
[in,out]chrThe character whose inventory should be moved

Definition at line 756 of file cp_auto_mission.cpp.

References AII_CollectItem(), Item::ammoDef(), Item::def(), Item::getAmmoLeft(), Inventory::getNextCont(), Container::getNextItem(), and character_s::inv.

Referenced by AM_AlienCollect(), and AM_UpdateSurivorsAfterBattle().

static void AM_SetDefaultHostilities ( autoMissionBattle_t battle,
const bool  civsInfected 
)
static

Run this on an auto mission battle before the battle is actually simulated, to set default values for who will attack which team. If you forget to do this before battle simulation, all teams will default to "free for all" (Everyone will try to kill everyone else).

Parameters
[in,out]battleThe battle to set up team hostility values for.
[in]civsInfectedSet to true if civs have XVI influence, otherwise false for a normal mission.

Definition at line 282 of file cp_auto_mission.cpp.

References autoMissionBattle_s::actUnits, AM_IsAlien, AM_IsCivilian, AM_IsPlayer, AM_SetHostile, AUTOMISSION_TEAM_TYPE_MAX, AUTOMISSION_TEAM_TYPE_PLAYER, and i.

Referenced by AM_Go().

void AM_Shutdown ( void  )

Closing actions for automission-subsystem.

Definition at line 945 of file cp_auto_mission.cpp.

Referenced by CP_Shutdown().

static bool AM_UnitAttackEnemy ( autoMissionBattle_t battle,
autoUnit_t currUnit,
const double  effective 
)
static

Make Unit attack his enemies (or friends)

Parameters
[in,out]battleThe battle we fight
[in]currUnitUnit that attacks
[in]effectiveEffectiveness of the attack

Definition at line 651 of file cp_auto_mission.cpp.

References AM_CheckFire(), AM_GetRandomActiveUnit(), and autoUnit_s::team.

Referenced by AM_DoFight().

static void AM_UpdateSurivorsAfterBattle ( const autoMissionBattle_t battle,
struct aircraft_s aircraft 
)
static

This looks at a finished auto battle, and uses values from it to kill or lower health of surviving soldiers on a mission drop ship as appropriate. It also hands out some experience to soldiers that survive.

Parameters
[in]battleThe battle we fought
[in,out]aircraftDropship soldiers are on

Definition at line 809 of file cp_auto_mission.cpp.

References ABILITY_AWARD_SCALE, ABILITY_NUM_TYPES, aircraft_s::acTeam, AM_MoveCharacterInventoryIntoItemCargo(), AUTOMISSION_TEAM_TYPE_PLAYER, cgi, CHAR_GetMaxExperiencePerMission(), CHAR_UpdateSkills(), DEBUG_CLIENT, E_RemoveInventoryFromStorage(), chrScoreGlobal_s::experience, frand(), character_s::HP, LIST_Foreach, MAX_SOLDIERS_AUTOMISSION, character_s::name, autoMissionBattle_s::results, character_s::score, SKILL_AWARD_SCALE, SKILL_NUM_TYPES, missionResults_s::state, autoMissionBattle_s::teamAccomplishment, and WON.

Referenced by AM_Go().