1 /**
2  * @file
3  * @brief Header file for airfights
4  */
5 
6 /*
7 Copyright (C) 2002-2013 UFO: Alien Invasion.
8 
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2
12 of the License, or (at your option) any later version.
13 
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 
18 See the GNU General Public License for more details.
19 
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23 
24 */
25 
26 #pragma once
27 
28 #define BULLETS_PER_SHOT	1
29 #define MAX_MULTIPLE_PROJECTILES	10
30 
31 /**
32  * @note 0 if the weapon can shoot
33  * @note -1 if it can't shoot atm
34  * @note -2 if it will never be able to shoot
35  */
36 #define AIRFIGHT_WEAPON_CAN_SHOOT 0
37 #define AIRFIGHT_WEAPON_CAN_NOT_SHOOT_AT_THE_MOMENT -1
38 #define AIRFIGHT_WEAPON_CAN_NEVER_SHOOT -2
39 
40 #define AIRFIGHT_BASE_CAN_T_FIRE -1
41 
42 /** @brief projectile used during fight between two or more aircraft */
43 typedef struct aircraftProjectile_s {
44 	const objDef_t* aircraftItem;		/**< Corresponding ammo */
45 	int idx;				/**< self link of the idx in ccs.projectiles[] @todo: is this really needed? */
46 	vec3_t pos[MAX_MULTIPLE_PROJECTILES];	/**< array of positions of the projectile (latitude and longitude) - @todo why vec3_t this is long/lat */
47 	vec3_t projectedPos[MAX_MULTIPLE_PROJECTILES];	/**< Array if projected positions of the projectile (latitude and longitude). */
48 	vec3_t oldDrawPos[MAX_MULTIPLE_PROJECTILES];	/**< Array if old draw positions of the projectile (latitude and longitude). */
49 	int numProjectiles;		/**< Number of projectile positions used for this projectile. */
50 	bool hasMoved;			/**< Has the projectile been moved by the CampaignRunProjectiles function */
51 	int numInterpolationPoints;	/**< Number of points drawn so far during interpolation. */
52 	vec3_t idleTarget;		/**< target of the projectile
53 							 ** used only if the projectile will miss its target (that is if aimedAircraft is nullptr) */
54 	aircraft_t* attackingAircraft;	/**< Aircraft which shot the projectile. nullptr if aircraft is destroyed or base is shooting */
55 	vec3_t attackerPos;		/**< position of the attacker.
56 							 ** used only if base or samsite is shooting (attackingAircraft == nullptr) */
57 	aircraft_t* aimedAircraft;	/**< target of the projectile/
58 								 ** used only if the projectile will touch its target (otherwise it's nullptr) */
59 	int time;				/**< time since the projectile has been launched */
60 	float angle;			/**< angle of the missile on the geoscape */
61 	bool bullets;			/**< projectile has active bullets on geoscape */
62 	bool beam;				/**< projectile has an active (laser) beam on geoscape */
63 	bool rocket;
64 } aircraftProjectile_t;
65 
66 void AIRFIGHT_ExecuteActions(const struct campaign_s* campaign, aircraft_t* air, aircraft_t* ufo);
67 void AIRFIGHT_ActionsAfterAirfight(const struct campaign_s* campaign, aircraft_t* shooter, aircraft_t* aircraft, bool phalanxWon);
68 void AIRFIGHT_CampaignRunProjectiles(const struct campaign_s* campaign, int dt);
69 void AIRFIGHT_CampaignRunBaseDefence(int dt);
70 int AIRFIGHT_CheckWeapon(const aircraftSlot_t* slot, float distance);
71 int AIRFIGHT_ChooseWeapon(const aircraftSlot_t* slot, int maxSlot, const vec2_t pos, const vec2_t targetPos);
72 bool AIRFIGHT_BaseCanTargetUFO(const struct base_s* base, const aircraft_t* ufo);
73 void AIRFIGHT_RemoveProjectileAimingAircraft(const aircraft_t* aircraft);
74 
75 bool AIRFIGHT_SaveXML(xmlNode_t* parent);
76 bool AIRFIGHT_LoadXML(xmlNode_t* parent);
77 void AIRFIGHT_InitStartup(void);
78