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

Airfight related stuff. More...

#include "../../cl_shared.h"
#include "cp_campaign.h"
#include "cp_mapfightequip.h"
#include "cp_geoscape.h"
#include "cp_ufo.h"
#include "cp_missions.h"
#include "save/save_airfight.h"
#include "../../sound/s_main.h"

Go to the source code of this file.

Macros

#define AIRCRAFT_INVALID   -1
 

Functions

static void AIRFIGHT_RemoveProjectile (aircraftProjectile_t *projectile)
 Remove a projectile from ccs.projectiles. More...
 
static bool AIRFIGHT_AddProjectile (const base_t *attackingBase, const installation_t *attackingInstallation, aircraft_t *attacker, aircraft_t *target, aircraftSlot_t *weaponSlot)
 Add a projectile in ccs.projectiles. More...
 
static void AIRFIGHT_MissTarget (aircraftProjectile_t *projectile)
 Change destination of projectile to an idle point of the map, close to its former target. More...
 
int AIRFIGHT_CheckWeapon (const aircraftSlot_t *slot, float distance)
 Check if the selected weapon can shoot. More...
 
int AIRFIGHT_ChooseWeapon (const aircraftSlot_t *slot, int maxSlot, const vec2_t pos, const vec2_t targetPos)
 Choose the weapon an attacking aircraft will use to fire on a target. More...
 
static float AIRFIGHT_ProbabilityToHit (const aircraft_t *shooter, const aircraft_t *target, const aircraftSlot_t *slot)
 Calculate the probability to hit the enemy. More...
 
void AIRFIGHT_ExecuteActions (const campaign_t *campaign, aircraft_t *shooter, aircraft_t *target)
 Decide what an attacking aircraft can do. More...
 
void AIRFIGHT_RemoveProjectileAimingAircraft (const aircraft_t *aircraft)
 Set all projectile aiming a given aircraft to an idle destination. More...
 
static void AIRFIGHT_UpdateProjectileForDestroyedAircraft (const aircraft_t *aircraft)
 Set all projectile attackingAircraft pointers to nullptr. More...
 
void AIRFIGHT_ActionsAfterAirfight (const campaign_t *campaign, aircraft_t *shooter, aircraft_t *aircraft, bool phalanxWon)
 Actions to execute when a fight is done. More...
 
static bool AIRFIGHT_ProjectileReachedTarget (const aircraftProjectile_t *projectile, float movement)
 Check if some projectiles on geoscape reached their destination. More...
 
static int AIRFIGHT_GetDamage (const objDef_t *od, const aircraft_t *target)
 Calculates the damage value for the airfight. More...
 
static void AIRFIGHT_ProjectileHits (const campaign_t *campaign, aircraftProjectile_t *projectile)
 Solve the result of one projectile hitting an aircraft. More...
 
static void AIRFIGHT_GetNextPointInPathFromVector (const float *movement, const vec2_t originalPoint, const vec3_t orthogonalVector, vec2_t finalPoint)
 Get the next point in the object path based on movement converting the positions from polar coordinates to vector for the calculation and back again to be returned. More...
 
static void AIRFIGHT_GetNextPointInPath (const float *movement, const vec2_t originalPoint, const vec2_t targetPoint, float *angle, vec2_t finalPoint, vec3_t orthogonalVector)
 Get the next point in the object path based on movement. More...
 
void AIRFIGHT_CampaignRunProjectiles (const campaign_t *campaign, int dt)
 Update values of projectiles. More...
 
static void AIRFIGHT_BaseShoot (const base_t *base, baseWeapon_t *weapons, int maxWeapons)
 Check if one type of battery (missile or laser) can shoot now. More...
 
static void AIRFIGHT_InstallationShoot (const installation_t *installation, baseWeapon_t *weapons, int maxWeapons)
 Check if one type of battery (missile or laser) can shoot now. More...
 
void AIRFIGHT_CampaignRunBaseDefence (int dt)
 Run base defences. More...
 
bool AIRFIGHT_SaveXML (xmlNode_t *parent)
 Save callback for savegames in XML Format. More...
 
bool AIRFIGHT_LoadXML (xmlNode_t *parent)
 Load callback for savegames in XML Format. More...
 
void AIRFIGHT_InitStartup (void)
 

Detailed Description

Airfight related stuff.

Todo:
Somehow i need to know which alien race was in the ufo we shoot down I need this info for spawning the crash site
See also
CP_CreateBattleParameters

Definition in file cp_airfight.cpp.

Macro Definition Documentation

#define AIRCRAFT_INVALID   -1

Invalid aircraft index for savegames (global index).

Definition at line 37 of file cp_airfight.cpp.

Referenced by AIRFIGHT_LoadXML().

Function Documentation

void AIRFIGHT_ActionsAfterAirfight ( const campaign_t campaign,
aircraft_t shooter,
aircraft_t aircraft,
bool  phalanxWon 
)

Actions to execute when a fight is done.

Parameters
[in]campaignThe campaign data structure
[in]shooterPointer to the aircraft that fired the projectile.
[in]aircraftPointer to the aircraft which was destroyed (alien or phalanx).
[in]phalanxWontrue if PHALANX won, false if UFO won.
Note
Some of these mission values are redone (and not reloaded) in CP_Load
shooter may be nullptr
See also
UFO_DestroyAllUFOsOnGeoscape_f
CP_Load
CP_SpawnCrashSiteMission

Definition at line 463 of file cp_airfight.cpp.

References _, AIR_DestroyAircraft(), AIR_PilotSurvivedCrash(), AIRFIGHT_RemoveProjectileAimingAircraft(), AIRFIGHT_UpdateProjectileForDestroyedAircraft(), cgi, Employee::chr, CP_MissionIsOverByUFO(), CP_SpawnCrashSiteMission(), CP_SpawnRescueMission(), CP_UFOProceedMission(), cgame_import_s::csi, DEBUG_CLIENT, GEO_GetColor(), TerrainDefs::getTerrainName(), MapIsWater, MAPTYPE_TERRAIN, aircraft_s::maxWeapons, MS_AddNewMessage(), MSG_DEATH, MSG_STANDARD, aircraft_s::pilot, aircraft_s::pos, character_s::score, SKILL_EVADING, SKILL_TARGETING, chrScoreGlobal_s::skills, csi_s::terrainDefs, and UFO_NotifyPhalanxAircraftRemoved().

Referenced by AIRFIGHT_ProjectileHits().

static bool AIRFIGHT_AddProjectile ( const base_t attackingBase,
const installation_t attackingInstallation,
aircraft_t attacker,
aircraft_t target,
aircraftSlot_t weaponSlot 
)
static

Add a projectile in ccs.projectiles.

Parameters
[in]attackingBasethe attacking base in ccs.bases[]. nullptr is the attacker is an aircraft or a samsite.
[in]attackingInstallationthe attacking samsite in ccs.installations[]. nullptr is the attacker is an aircraft or a base.
[in]attackerPointer to the attacking aircraft
[in]targetPointer to the target aircraft
[in]weaponSlotPointer to the weapon slot that fires the projectile.
Note
we already checked in AIRFIGHT_ChooseWeapon that the weapon has still ammo
See also
AIRFIGHT_RemoveProjectile
AII_ReloadWeapon for the aircraft item reload code

Definition at line 61 of file cp_airfight.cpp.

References AII_ReloadWeapon(), aircraftProjectile_s::aimedAircraft, aircraftProjectile_s::aircraftItem, aircraftSlot_s::ammo, aircraftSlot_s::ammoLeft, aircraftProjectile_s::angle, aircraftProjectile_s::attackerPos, aircraftProjectile_s::attackingAircraft, aircraftProjectile_s::beam, craftitem_s::beam, aircraftProjectile_s::bullets, craftitem_s::bullets, ccs, cgi, objDef_s::craftitem, DEBUG_CLIENT, f, aircraftProjectile_s::idleTarget, aircraftSlot_s::item, MAX_PROJECTILESONGEOSCAPE, aircraftProjectile_s::numProjectiles, ccs_s::numProjectiles, aircraftProjectile_s::pos, installation_s::pos, base_s::pos, aircraft_s::pos, ccs_s::projectiles, aircraftProjectile_s::rocket, aircraftProjectile_s::time, and VectorSet.

Referenced by AIRFIGHT_BaseShoot(), AIRFIGHT_ExecuteActions(), and AIRFIGHT_InstallationShoot().

static void AIRFIGHT_BaseShoot ( const base_t base,
baseWeapon_t weapons,
int  maxWeapons 
)
static
int AIRFIGHT_CheckWeapon ( const aircraftSlot_t slot,
float  distance 
)

Check if the selected weapon can shoot.

Parameters
[in]slotPointer to the weapon slot to shoot with.
[in]distancedistance between the weapon and the target.
Returns
0 AIRFIGHT_WEAPON_CAN_SHOOT if the weapon can shoot, -1 AIRFIGHT_WEAPON_CAN_NOT_SHOOT_AT_THE_MOMENT if it can't shoot atm, -2 AIRFIGHT_WEAPON_CAN_NEVER_SHOOT if it will never be able to shoot.

Definition at line 200 of file cp_airfight.cpp.

References AIR_STATS_WRANGE, AIRFIGHT_WEAPON_CAN_NEVER_SHOOT, AIRFIGHT_WEAPON_CAN_NOT_SHOOT_AT_THE_MOMENT, AIRFIGHT_WEAPON_CAN_SHOOT, aircraftSlot_s::ammo, aircraftSlot_s::ammoLeft, objDef_s::craftitem, aircraftSlot_s::delayNextShot, aircraftSlot_s::installationTime, aircraftSlot_s::item, and craftitem_s::stats.

Referenced by AII_WeaponsCanShoot(), AIRFIGHT_BaseShoot(), AIRFIGHT_ChooseWeapon(), AIRFIGHT_InstallationShoot(), and BDEF_AutoTarget().

int AIRFIGHT_ChooseWeapon ( const aircraftSlot_t slot,
int  maxSlot,
const vec2_t  pos,
const vec2_t  targetPos 
)

Choose the weapon an attacking aircraft will use to fire on a target.

Parameters
[in]slotPointer to the first weapon slot of attacking base or aircraft.
[in]maxSlotmaximum number of weapon slots in attacking base or aircraft.
[in]posposition of attacking base or aircraft.
[in]targetPosPointer to the aimed aircraft.
Returns
indice of the slot to use (in array weapons[]), -1 AIRFIGHT_WEAPON_CAN_NOT_SHOOT_AT_THE_MOMENT no weapon to use atm, -2 AIRFIGHT_WEAPON_CAN_NEVER_SHOOT if no weapon to use at all.
See also
AIRFIGHT_CheckWeapon

Definition at line 234 of file cp_airfight.cpp.

References AIRFIGHT_CheckWeapon(), AIRFIGHT_WEAPON_CAN_NEVER_SHOOT, AIRFIGHT_WEAPON_CAN_NOT_SHOOT_AT_THE_MOMENT, AIRFIGHT_WEAPON_CAN_SHOOT, GetDistanceOnGlobe(), and i.

Referenced by AIRFIGHT_ExecuteActions(), CL_DisplayPopupInterceptUFO(), CP_InterceptNextStage(), CP_UFOProceedMission(), and UFO_SendPursuingAircraft().

void AIRFIGHT_ExecuteActions ( const campaign_t campaign,
aircraft_t shooter,
aircraft_t target 
)
static int AIRFIGHT_GetDamage ( const objDef_t od,
const aircraft_t target 
)
static

Calculates the damage value for the airfight.

Parameters
[in]odThe ammo object definition of the craft item
[in]targetThe aircraft the ammo hits
Returns
the damage the hit causes
See also
AII_UpdateAircraftStats
Note
ECM is handled in AIRFIGHT_ProbabilityToHit

Definition at line 582 of file cp_airfight.cpp.

References AIR_STATS_SHIELD, objDef_s::craftitem, aircraft_s::damage, aircraft_s::stats, and craftitem_s::weaponDamage.

Referenced by AIRFIGHT_ProjectileHits().

static void AIRFIGHT_GetNextPointInPath ( const float *  movement,
const vec2_t  originalPoint,
const vec2_t  targetPoint,
float *  angle,
vec2_t  finalPoint,
vec3_t  orthogonalVector 
)
static

Get the next point in the object path based on movement.

Parameters
[in]movementThe distance that the object needs to move.
[in]originalPointThe point from which the object is moving.
[in]targetPointThe final point to which the object is moving.
[out]angleThe direction that the object moving in.
[out]finalPointThe next point from the original point + movement in "angle" direction.
[out]orthogonalVectorThe orthogonal vector.

Definition at line 664 of file cp_airfight.cpp.

References AIRFIGHT_GetNextPointInPathFromVector(), and GEO_AngleOfPath().

Referenced by AIRFIGHT_CampaignRunProjectiles().

static void AIRFIGHT_GetNextPointInPathFromVector ( const float *  movement,
const vec2_t  originalPoint,
const vec3_t  orthogonalVector,
vec2_t  finalPoint 
)
static

Get the next point in the object path based on movement converting the positions from polar coordinates to vector for the calculation and back again to be returned.

Parameters
[in]movementThe distance that the object needs to move.
[in]originalPointThe point from which the object is moving.
[in]orthogonalVectorThe orthogonal vector.
[out]finalPointThe next point from the original point + movement in "angle" direction.

Definition at line 646 of file cp_airfight.cpp.

References PolarToVec(), RotatePointAroundVector(), and VecToPolar().

Referenced by AIRFIGHT_GetNextPointInPath().

void AIRFIGHT_InitStartup ( void  )
See also
UI_InitStartup

Definition at line 997 of file cp_airfight.cpp.

References cgi.

Referenced by CP_InitStartup().

static void AIRFIGHT_InstallationShoot ( const installation_t installation,
baseWeapon_t weapons,
int  maxWeapons 
)
static
static void AIRFIGHT_MissTarget ( aircraftProjectile_t projectile)
static

Change destination of projectile to an idle point of the map, close to its former target.

Parameters
[in]projectileThe projectile to update

Definition at line 159 of file cp_airfight.cpp.

References aircraftProjectile_s::aimedAircraft, f, frand(), GetDistanceOnGlobe(), aircraftProjectile_s::idleTarget, aircraftProjectile_s::pos, aircraft_s::pos, and VectorCopy.

Referenced by AIRFIGHT_BaseShoot(), AIRFIGHT_ExecuteActions(), AIRFIGHT_InstallationShoot(), and AIRFIGHT_RemoveProjectileAimingAircraft().

static float AIRFIGHT_ProbabilityToHit ( const aircraft_t shooter,
const aircraft_t target,
const aircraftSlot_t slot 
)
static

Calculate the probability to hit the enemy.

Parameters
[in]shooterPointer to the attacking aircraft (may be nullptr if a base fires the projectile).
[in]targetPointer to the aimed aircraft (may be nullptr if a target is a base).
[in]slotSlot containing the weapon firing.
Returns
Probability to hit the target (0 when you don't have a chance, 1 (or more) when you're sure to hit).
Note
that modifiers due to electronics, weapons, and shield are already taken into account in AII_UpdateAircraftStats
See also
AII_UpdateAircraftStats
AIRFIGHT_ExecuteActions
AIRFIGHT_ChooseWeapon
Precondition
slotIdx must have a weapon installed, with ammo available (see AIRFIGHT_ChooseWeapon)
Todo:
This probability should also depend on the pilot skills, when they will be implemented.

Targeting skill increases hit chance for shooter With this equation, max increase (0.29) is reached at skill level 70. Any higher skill rating actually reduces the bonus, so a skill cap should be placed at 70 when skill increase is implemented for pilots.

Evasion skill decreases hit chance for shooter With this equation, max decrease (0.29) is reached at skill level 70. Any higher skill rating actually reduces the bonus, so a skill cap should be placed at 70 when skill increase is implemented for pilots.

Definition at line 272 of file cp_airfight.cpp.

References AIR_IsUFO, AIR_STATS_ACCURACY, AIR_STATS_ECM, aircraftSlot_s::ammo, cgi, Employee::chr, objDef_s::craftitem, DEBUG_CLIENT, f, aircraftSlot_s::item, aircraft_s::pilot, character_s::score, SKILL_EVADING, SKILL_TARGETING, chrScoreGlobal_s::skills, aircraft_s::stats, and craftitem_s::stats.

Referenced by AIRFIGHT_BaseShoot(), AIRFIGHT_ExecuteActions(), and AIRFIGHT_InstallationShoot().

static void AIRFIGHT_ProjectileHits ( const campaign_t campaign,
aircraftProjectile_t projectile 
)
static

Solve the result of one projectile hitting an aircraft.

Parameters
[in]campaignThe campaign data structure
[in]projectilePointer to the projectile.
Note
the target loose (base damage - shield of target) hit points

Definition at line 607 of file cp_airfight.cpp.

References aircraftProjectile_s::aimedAircraft, AIR_IsAircraftInBase(), AIR_IsUFO, aircraftProjectile_s::aircraftItem, AIRFIGHT_ActionsAfterAirfight(), AIRFIGHT_GetDamage(), aircraftProjectile_s::attackingAircraft, cgi, aircraft_s::damage, f, and aircraftProjectile_s::rocket.

Referenced by AIRFIGHT_CampaignRunProjectiles().

static bool AIRFIGHT_ProjectileReachedTarget ( const aircraftProjectile_t projectile,
float  movement 
)
static

Check if some projectiles on geoscape reached their destination.

Note
Destination is not necessarily an aircraft, in case the projectile missed its initial target.
Parameters
[in]projectilePointer to the projectile
[in]movementdistance that the projectile will do up to next draw of geoscape
See also
AIRFIGHT_CampaignRunProjectiles

Definition at line 548 of file cp_airfight.cpp.

References aircraftProjectile_s::aimedAircraft, AIR_STATS_WRANGE, aircraftProjectile_s::aircraftItem, objDef_s::craftitem, GetDistanceOnGlobe(), aircraftProjectile_s::idleTarget, aircraftProjectile_s::pos, aircraft_s::pos, SECONDS_PER_HOUR, craftitem_s::stats, aircraftProjectile_s::time, and craftitem_s::weaponSpeed.

Referenced by AIRFIGHT_CampaignRunProjectiles().

static void AIRFIGHT_RemoveProjectile ( aircraftProjectile_t projectile)
static

Remove a projectile from ccs.projectiles.

Parameters
[in]projectileThe projectile to remove
See also
AIRFIGHT_AddProjectile

Definition at line 44 of file cp_airfight.cpp.

References ccs, ccs_s::numProjectiles, ccs_s::projectiles, and REMOVE_ELEM_ADJUST_IDX.

Referenced by AIRFIGHT_CampaignRunProjectiles().

void AIRFIGHT_RemoveProjectileAimingAircraft ( const aircraft_t aircraft)

Set all projectile aiming a given aircraft to an idle destination.

Parameters
[in]aircraftPointer to the aimed aircraft.
Note
This function is called when aircraft is destroyed.
See also
AIRFIGHT_ActionsAfterAirfight

Definition at line 413 of file cp_airfight.cpp.

References aircraftProjectile_s::aimedAircraft, AIR_AircraftReturnToBase(), AIR_IsUFO, AIRFIGHT_MissTarget(), aircraftProjectile_s::attackingAircraft, ccs, aircraft_s::homebase, ccs_s::numProjectiles, and ccs_s::projectiles.

Referenced by AIRFIGHT_ActionsAfterAirfight(), B_AircraftReturnedToHomeBase(), and CP_UFORemoveFromGeoscape().

static void AIRFIGHT_UpdateProjectileForDestroyedAircraft ( const aircraft_t aircraft)
static

Set all projectile attackingAircraft pointers to nullptr.

Parameters
[in]aircraftPointer to the destroyed aircraft.
Note
This function is called when aircraft is destroyed.

Definition at line 438 of file cp_airfight.cpp.

References aircraftProjectile_s::attackingAircraft, ccs, ccs_s::numProjectiles, and ccs_s::projectiles.

Referenced by AIRFIGHT_ActionsAfterAirfight().