UFO: Alien Invasion
Loading...
Searching...
No Matches
cp_airfight.cpp File Reference

Airfight related stuff. More...

#include "../../DateTime.h"
#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"
Include dependency graph for cp_airfight.cpp:

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.
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.
static void AIRFIGHT_MissTarget (aircraftProjectile_t *projectile)
 Change destination of projectile to an idle point of the map, close to its former target.
int AIRFIGHT_CheckWeapon (const aircraftSlot_t *slot, float distance)
 Check if the selected weapon can shoot.
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.
static float AIRFIGHT_ProbabilityToHit (const aircraft_t *shooter, const aircraft_t *target, const aircraftSlot_t *slot)
 Calculate the probability to hit the enemy.
void AIRFIGHT_ExecuteActions (const campaign_t *campaign, aircraft_t *shooter, aircraft_t *target)
 Decide what an attacking aircraft can do.
void AIRFIGHT_RemoveProjectileAimingAircraft (const aircraft_t *aircraft)
 Set all projectile aiming a given aircraft to an idle destination.
static void AIRFIGHT_UpdateProjectileForDestroyedAircraft (const aircraft_t *aircraft)
 Set all projectile attackingAircraft pointers to nullptr.
void AIRFIGHT_ActionsAfterAirfight (const campaign_t *campaign, aircraft_t *shooter, aircraft_t *aircraft, bool phalanxWon)
 Actions to execute when a fight is done.
static bool AIRFIGHT_ProjectileReachedTarget (const aircraftProjectile_t *projectile, float movement)
 Check if some projectiles on geoscape reached their destination.
static int AIRFIGHT_GetDamage (const objDef_t *od, const aircraft_t *target)
 Calculates the damage value for the airfight.
static void AIRFIGHT_ProjectileHits (const campaign_t *campaign, aircraftProjectile_t *projectile)
 Solve the result of one projectile hitting an aircraft.
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.
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.
void AIRFIGHT_CampaignRunProjectiles (const campaign_t *campaign, int dt)
 Update values of projectiles.
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.
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.
void AIRFIGHT_CampaignRunBaseDefence (int dt)
 Run base defences.
bool AIRFIGHT_SaveXML (xmlNode_t *parent)
 Save callback for savegames in XML Format.
bool AIRFIGHT_LoadXML (xmlNode_t *parent)
 Load callback for savegames in XML Format.
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

◆ AIRCRAFT_INVALID

#define AIRCRAFT_INVALID   -1

Invalid aircraft index for savegames (global index).

Definition at line 38 of file cp_airfight.cpp.

Referenced by AIRFIGHT_LoadXML().

Function Documentation

◆ AIRFIGHT_ActionsAfterAirfight()

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 464 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(), DEBUG_CLIENT, GEO_GetColor(), MapIsWater, MAPTYPE_TERRAIN, aircraft_t::maxWeapons, MS_AddNewMessage(), MSG_DEATH, MSG_STANDARD, aircraft_t::pilot, aircraft_t::pos, character_t::score, SKILL_EVADING, SKILL_TARGETING, chrScoreGlobal_t::skills, and UFO_NotifyPhalanxAircraftRemoved().

Referenced by AIRFIGHT_ProjectileHits().

◆ AIRFIGHT_AddProjectile()

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 62 of file cp_airfight.cpp.

References AII_ReloadWeapon(), aircraftProjectile_t::aimedAircraft, aircraftProjectile_t::aircraftItem, aircraftSlot_t::ammo, aircraftSlot_t::ammoLeft, aircraftProjectile_t::angle, aircraftProjectile_t::attackerPos, aircraftProjectile_t::attackingAircraft, aircraftProjectile_t::beam, craftItem::beam, aircraftProjectile_t::bullets, craftItem::bullets, ccs, cgi, objDef_t::craftitem, DEBUG_CLIENT, aircraftProjectile_t::idleTarget, aircraftSlot_t::item, MAX_PROJECTILESONGEOSCAPE, aircraftProjectile_t::numProjectiles, aircraft_t::pos, aircraftProjectile_t::pos, base_t::pos, installation_t::pos, aircraftProjectile_t::rocket, aircraftProjectile_t::time, and VectorSet.

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

◆ AIRFIGHT_BaseShoot()

void AIRFIGHT_BaseShoot ( const base_t * base,
baseWeapon_t * weapons,
int maxWeapons )
static

◆ AIRFIGHT_CampaignRunBaseDefence()

◆ AIRFIGHT_CampaignRunProjectiles()

◆ AIRFIGHT_CheckWeapon()

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 201 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_t::ammo, aircraftSlot_t::ammoLeft, objDef_t::craftitem, aircraftSlot_t::delayNextShot, aircraftSlot_t::installationTime, aircraftSlot_t::item, and craftItem::stats.

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

◆ AIRFIGHT_ChooseWeapon()

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 235 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().

◆ AIRFIGHT_ExecuteActions()

void AIRFIGHT_ExecuteActions ( const campaign_t * campaign,
aircraft_t * shooter,
aircraft_t * target )

◆ AIRFIGHT_GetDamage()

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 583 of file cp_airfight.cpp.

References AIR_STATS_SHIELD, objDef_t::craftitem, aircraft_t::damage, aircraft_t::stats, and craftItem::weaponDamage.

Referenced by AIRFIGHT_ProjectileHits().

◆ AIRFIGHT_GetNextPointInPath()

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 665 of file cp_airfight.cpp.

References AIRFIGHT_GetNextPointInPathFromVector(), and GEO_AngleOfPath().

Referenced by AIRFIGHT_CampaignRunProjectiles().

◆ AIRFIGHT_GetNextPointInPathFromVector()

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 647 of file cp_airfight.cpp.

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

Referenced by AIRFIGHT_GetNextPointInPath().

◆ AIRFIGHT_InitStartup()

void AIRFIGHT_InitStartup ( void )
See also
UI_InitStartup

Definition at line 998 of file cp_airfight.cpp.

References cgi.

Referenced by CP_InitStartup().

◆ AIRFIGHT_InstallationShoot()

void AIRFIGHT_InstallationShoot ( const installation_t * installation,
baseWeapon_t * weapons,
int maxWeapons )
static

Check if one type of battery (missile or laser) can shoot now.

Parameters
[in]installationPointer to the firing intallation.
[in]weaponsThe installation weapons to check and fire.
[in]maxWeaponsThe number of weapons in that installation.

Definition at line 777 of file cp_airfight.cpp.

References AIR_STATS_WRANGE, AIRFIGHT_AddProjectile(), AIRFIGHT_CheckWeapon(), AIRFIGHT_MissTarget(), AIRFIGHT_ProbabilityToHit(), AIRFIGHT_WEAPON_CAN_NEVER_SHOOT, AIRFIGHT_WEAPON_CAN_NOT_SHOOT_AT_THE_MOMENT, aircraftSlot_t::ammo, ccs, objDef_t::craftitem, aircraftSlot_t::delayNextShot, frand(), GetDistanceOnGlobe(), i, aircraftSlot_t::installationTime, aircraft_t::pos, installation_t::pos, baseWeapon_t::slot, craftItem::stats, baseWeapon_t::target, UFO_IsUFOSeenOnGeoscape(), and craftItem::weaponDelay.

Referenced by AIRFIGHT_CampaignRunBaseDefence().

◆ AIRFIGHT_LoadXML()

◆ AIRFIGHT_MissTarget()

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 160 of file cp_airfight.cpp.

References aircraftProjectile_t::aimedAircraft, frand(), GetDistanceOnGlobe(), aircraftProjectile_t::idleTarget, aircraft_t::pos, aircraftProjectile_t::pos, and VectorCopy.

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

◆ AIRFIGHT_ProbabilityToHit()

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 273 of file cp_airfight.cpp.

References AIR_IsUFO, AIR_STATS_ACCURACY, AIR_STATS_ECM, aircraftSlot_t::ammo, cgi, Employee::chr, objDef_t::craftitem, DEBUG_CLIENT, aircraftSlot_t::item, aircraft_t::pilot, character_t::score, SKILL_EVADING, SKILL_TARGETING, chrScoreGlobal_t::skills, aircraft_t::stats, and craftItem::stats.

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

◆ AIRFIGHT_ProjectileHits()

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 608 of file cp_airfight.cpp.

References aircraftProjectile_t::aimedAircraft, AIR_IsAircraftInBase(), AIR_IsUFO, aircraftProjectile_t::aircraftItem, AIRFIGHT_ActionsAfterAirfight(), AIRFIGHT_GetDamage(), aircraftProjectile_t::attackingAircraft, cgi, aircraft_t::damage, and aircraftProjectile_t::rocket.

Referenced by AIRFIGHT_CampaignRunProjectiles().

◆ AIRFIGHT_ProjectileReachedTarget()

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 549 of file cp_airfight.cpp.

References aircraftProjectile_t::aimedAircraft, AIR_STATS_WRANGE, aircraftProjectile_t::aircraftItem, objDef_t::craftitem, GetDistanceOnGlobe(), aircraftProjectile_t::idleTarget, aircraft_t::pos, aircraftProjectile_t::pos, DateTime::SECONDS_PER_HOUR, craftItem::stats, aircraftProjectile_t::time, and craftItem::weaponSpeed.

Referenced by AIRFIGHT_CampaignRunProjectiles().

◆ AIRFIGHT_RemoveProjectile()

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 45 of file cp_airfight.cpp.

References ccs, and REMOVE_ELEM_ADJUST_IDX.

Referenced by AIRFIGHT_CampaignRunProjectiles().

◆ AIRFIGHT_RemoveProjectileAimingAircraft()

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 414 of file cp_airfight.cpp.

References aircraftProjectile_t::aimedAircraft, AIR_AircraftReturnToBase(), AIR_IsUFO, AIRFIGHT_MissTarget(), aircraftProjectile_t::attackingAircraft, ccs, and aircraft_t::homebase.

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

◆ AIRFIGHT_SaveXML()

◆ AIRFIGHT_UpdateProjectileForDestroyedAircraft()

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 439 of file cp_airfight.cpp.

References aircraftProjectile_t::attackingAircraft, and ccs.

Referenced by AIRFIGHT_ActionsAfterAirfight().