300 lines
12 KiB
C
300 lines
12 KiB
C
#pragma once
|
|
#include "physics.h"
|
|
#include "ship.h"
|
|
#include "ai.h"
|
|
#include "outfit.h"
|
|
#include "faction.h"
|
|
#include "sound.h"
|
|
#include "economy.h"
|
|
|
|
#define PLAYER_ID 1 /**< Player pilot ID. */
|
|
|
|
/* Hyperspace parameters. */
|
|
#define HYPERSPACE_ENGINE_DELAY 3000 /**< Warm up the engines. */
|
|
#define HYPERSPACE_FLY_DELAY 5000 /**< Time taken to hyperspace. */
|
|
#define HYPERSPACE_STARS_BLUR 2000 /**< Time stars blur. */
|
|
#define HYPERSPACE_STARS_LENGTH 1000 /**< Length the stars blur to at max. */
|
|
#define HYPERSPACE_FADEOUT 1000 /**< Time fadeout. */
|
|
#define HYPERSPACE_FUEL 100 /**< Amount of fuel taken. */
|
|
#define HYPERSPACE_THRUST 2000. /**< How much thrust you use in hyperspace. */
|
|
#define HYPERSPACE_VEL HYPERSPACE_THRUST*(HYPERSPACE_FLY_DELAY/1000) /**< Vel at hyp.*/
|
|
#define HYPERSPACE_ENTER_MIN HYPERSPACE_VEL*0.5 /**< Min entering distance. */
|
|
#define HYPERSPACE_ENTER_MAX HYPERSPACE_VEL*0.6 /**< Max entering distance. */
|
|
#define HYPERSPACE_EXIT_MIN 1500. /**< Min distance to begin jumping. */
|
|
|
|
/* Aproximation for pilot size. */
|
|
#define PILOT_SIZE_APROX 0.8 /**< Approximation for pilot size. */
|
|
#define PILOT_DISABLED_ARMOUR 0.3 /**< Armour % that makes it disabled. */
|
|
|
|
/* Hooks. */
|
|
#define PILOT_HOOKS 4 /**< Max number of hooks a pilot can have. */
|
|
#define PILOT_HOOK_NONE 0 /**< No hook. */
|
|
#define PILOT_HOOK_DEATH 1 /**< Pilot died. */
|
|
#define PILOT_HOOK_BOARD 2 /**< Pilot got boarded. */
|
|
#define PILOT_HOOK_DISABLE 3 /**< Pilot got disabled. */
|
|
#define PILOT_HOOK_JUMP 4 /**< Pilot jumped. */
|
|
|
|
/* Flags. */
|
|
#define pilot_isFlag(p,f) (p->flags & (f)) /**< Check if flag f is set on pilot p. */
|
|
#define pilot_setFlag(p,f) (p->flags |= (f)) /**< Set flag f on pilot p. */
|
|
#define pilot_rmFlag(p,f) ((p)->flags &= ~(f)) /**< Remove flag f on pilot p. */
|
|
/* Creation. */
|
|
#define PILOT_PLAYER (1<<0) /**< Pilot is a player. */
|
|
#define PILOT_ESCORT (1<<1) /**< Pilot is an escort. */
|
|
#define PILOT_CARRIED (1<<2) /**< Pilot usually resides in a fighter bay. */
|
|
#define PILOT_EMPTY (1<<5) /**< Do not add pilot to stack. */
|
|
#define PILOT_NO_OUTFITS (1<<6) /**< Do not create the pilot with outfits. */
|
|
#define PILOT_HASTURRET (1<<9) /**< Pilot has turrets. */
|
|
#define PILOT_HASBEAMS (1<<10) /**< Pilot has beam weapons. */
|
|
/* Dynamic. */
|
|
#define PILOT_HOSTILE (1<<11) /**< Pilot is hostile to the player. */
|
|
#define PILOT_COMBAT (1<<12) /**< Pilot is engaged in combat. */
|
|
#define PILOT_AFTERBURNER (1<<13) /**< Pilot has her afterburner activated. */
|
|
#define PILOT_HYP_PREP (1<<15) /**< Pilot is getting ready for hyperspace. */
|
|
#define PILOT_HYP_BEGIN (1<<16) /**< Pilot is starting engines. */
|
|
#define PILOT_HYPERSPACE (1<<17) /**< Pilot is in hyperspace. */
|
|
#define PILOT_HYP_END (1<<18) /**< Pilot is exiting hyperspace. */
|
|
#define PILOT_BOARDED (1<<20) /**< Pilot has been boarded already! */
|
|
#define PILOT_BRIBED (1<<21) /**< Pilot has been bribed already. */
|
|
#define PILOT_DISABLED (1<<26) /**< Pilot is disabled. */
|
|
#define PILOT_DEAD (1<<27) /**< Pilot is on it's death bed. */
|
|
#define PILOT_DEATH_SOUND (1<<28) /**< Pilot just did death explosion. */
|
|
#define PILOT_EXPLODED (1<<29) /**< Pilot did final death explosion. */
|
|
#define PILOT_DELETE (1<<30) /**< Pilot will get delete asap. */
|
|
|
|
/* Just makes life simpler. */
|
|
#define pilot_isPlayer(p) pilot_isFlag(p, PILOT_PLAYER) /**< Check if pilot is a player. */
|
|
#define pilot_isDisabled(p) pilot_isFlag(p, PILOT_DISABLED) /**< Check if pilot is disabled. */
|
|
|
|
/**
|
|
* @enum PilotOutfitState
|
|
*
|
|
* @brief Contains the state of the outfit.
|
|
*
|
|
* Currently only applicable to beam weapons.
|
|
*/
|
|
typedef enum PilotOutfitState_ {
|
|
PILOT_OUTFIT_OFF, /**< Normal state. */
|
|
PILOT_OUTFIT_WARMUP, /**< Outfit is starting to warm up. */
|
|
PILOT_OUTFIT_ON /**< Outfit is activated and running. */
|
|
} PilotOutfitState;
|
|
|
|
/**
|
|
* @struct PilotOutfit
|
|
*
|
|
* @brief Store an outfit the pilot has.
|
|
*/
|
|
typedef struct PilotOutfit_ {
|
|
Outfit* outfit; /**< Associated outfit. */
|
|
int quantity; /**< Number of outfits of this type that the pilot has. */
|
|
PilotOutfitState state; /**< State of the outfit. */
|
|
int beamid; /**< ID of the beam used in this outfit, only for beams. */
|
|
double timer; /**< Used to store last used weapon time. */
|
|
} PilotOutfit;
|
|
|
|
/**
|
|
* @struct PilotCommodity
|
|
*
|
|
* @brief Store a pilot commodity.
|
|
*/
|
|
typedef struct PilotCommodity_ {
|
|
Commodity* commodity; /**< Assotiated commodity. */
|
|
int quantity; /**< Amount player has. */
|
|
unsigned int id; /**< Special mission id for cargo, 0 means none. */
|
|
} PilotCommodity;
|
|
|
|
/**
|
|
* @struct Pilot
|
|
*
|
|
* @brief The representation of an ingame pilot.
|
|
*/
|
|
typedef struct Pilot_ {
|
|
unsigned int id; /**< Pilots id. */
|
|
char* name; /**< Pilot's name (if unique). */
|
|
char* title; /**< Title - Usuall indicating special properties - @todo. */
|
|
|
|
int faction; /**< Pilot faction. */
|
|
|
|
/* Object characteristics. */
|
|
Ship* ship; /**< Pilots ship. */
|
|
Solid* solid; /**< Associated solid (physics). */
|
|
int tsx; /**< Current sprite x position, calculated on update. */
|
|
int tsy; /**< Current sprite y position, calculated on update. */
|
|
|
|
double thrust; /**< Pilots thrust. */
|
|
double turn; /**< Pilots turn. */
|
|
double speed; /**< Pilots speed. */
|
|
|
|
/* Current health. */
|
|
double armour; /**< Current armour. */
|
|
double shield; /**< Current shield. */
|
|
double energy; /**< Current energy. */
|
|
double fuel; /**< Current fuel. */
|
|
double armour_max; /**< Max armour. */
|
|
double shield_max; /**< Max shield. */
|
|
double energy_max; /**< Max energy. */
|
|
double fuel_max; /**< Max fuel. */
|
|
double armour_regen; /**< Armour regeneration rate (per second). */
|
|
double shield_regen; /**< Shield regeneration rate (per second). */
|
|
double energy_regen; /**< Energy regeneration rate (per second). */
|
|
|
|
void (*think)(struct Pilot_*); /**< AI thinking for the pilot. */
|
|
void (*update)(struct Pilot_*, const double); /**< Update the pilot. */
|
|
void (*render)(struct Pilot_*); /**< Rendering the pilot. */
|
|
|
|
/* Outfit management. */
|
|
PilotOutfit* outfits; /**< Pilot outfit stack. */
|
|
int noutfits; /**< Pilot number of outfits. */
|
|
PilotOutfit* secondary; /**< Secondary weapon. */
|
|
PilotOutfit* ammo; /**< Secondary ammo (if needed). */
|
|
PilotOutfit* afterburner; /**< The afterburner. */
|
|
|
|
/* Jamming. */
|
|
double jam_range; /**< Range at wich pilot starts jamming. */
|
|
double jam_chance; /**< Jam chance. */
|
|
|
|
/* Cargo. */
|
|
unsigned int credits; /**< Moniez the pilot has. */
|
|
PilotCommodity* commodities; /**< Commodity and quantity. */
|
|
int ncommodities; /**< Number of commodies. */
|
|
int cargo_free; /**< Free commodity space. */
|
|
|
|
/* Weapon Properties. */
|
|
double weap_range; /**< Average range of primary weapons. */
|
|
double weap_speed; /**< Average speed of primary weapons. */
|
|
|
|
/* Misc. */
|
|
uint32_t flags; /**< Used for AI etc. */
|
|
unsigned int ptimer; /**< Generic timer for internal pilot use. */
|
|
int lockons; /**< Stores how many seeking weapons are targetting pilot. */
|
|
|
|
/* Hook attached to the pilot. */
|
|
int hook_type[PILOT_HOOKS]; /**< Type of the hook atached to the pilot. */
|
|
int hook[PILOT_HOOKS]; /**< Hook id. */
|
|
|
|
/* Escort stuff. */
|
|
unsigned int parent; /**< Pilots parent. */
|
|
unsigned int* escorts; /**< Pilots escorts. */
|
|
int nescorts; /**< Number of pilot escorts. */
|
|
|
|
/* AI. */
|
|
unsigned int target; /**< AI target. */
|
|
AI_Profile* ai; /**< Ai personality profile. */
|
|
unsigned int tcontrol; /**< Timer for control tick. */
|
|
unsigned int timer[MAX_AI_TIMERS]; /**< Timers for AI. */
|
|
Task* task; /**< Current action. */
|
|
} Pilot;
|
|
|
|
/**
|
|
* @struct FleetPilot
|
|
*
|
|
* @brief Represents a pilot in a fleet.
|
|
*
|
|
* @sa Fleet
|
|
* @sa Pilot
|
|
*/
|
|
typedef struct FleetPilot_ {
|
|
Ship* ship; /**< Ship that the pilot is flying. */
|
|
char* name; /**< For special 'unique' names. */
|
|
int chance; /**< Chance of this pilot appearing in the fleet. */
|
|
char* ai; /**< Ai difference of fleet's global ai. */
|
|
} FleetPilot;
|
|
|
|
/**
|
|
* @struct Fleet
|
|
*
|
|
* @brief Represents a fleet.
|
|
*
|
|
* Fleets are used to create pilots, both from being in a system and from
|
|
* mission triggers.
|
|
*
|
|
* @sa FleetPilot
|
|
*/
|
|
typedef struct Fleet_ {
|
|
char* name; /**< Fleet name, used as an identifier. */
|
|
int faction; /**< Faction of the fleet. */
|
|
|
|
char* ai; /**< AI profile to use. */
|
|
|
|
FleetPilot* pilots; /**< The pilots in the fleet. */
|
|
int npilots; /**< Total number of pilots. */
|
|
} Fleet;
|
|
|
|
/* Grabing pilot crap. */
|
|
extern Pilot* player; /* The player. */
|
|
Pilot* pilot_get(unsigned int id);
|
|
unsigned int pilot_getNextID(const unsigned int id);
|
|
unsigned int pilot_getPrevID(const unsigned int id);
|
|
unsigned int pilot_getNearestEnemy(const Pilot* p);
|
|
unsigned int pilot_getNearestHostile(void); /* Only for the player. */
|
|
unsigned int pilot_getNearestPilot(const Pilot* p);
|
|
Fleet* fleet_get(const char* name);
|
|
int pilot_getJumps(const Pilot* p);
|
|
|
|
/* Misc. */
|
|
void pilot_shoot(Pilot* p, const int secondary);
|
|
void pilot_shootStop(Pilot* p, const int secondary);
|
|
void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter,
|
|
const DamageType dtype, const double damage);
|
|
double pilot_face(Pilot* p, const double dir);
|
|
void pilot_hyperspaceAbort(Pilot* p);
|
|
/* Special outfit stuff. */
|
|
void pilot_switchSecondary(Pilot* p, int i);
|
|
void pilot_setSecondary(Pilot* p, const char* secondary);
|
|
void pilot_setAmmo(Pilot* p);
|
|
int pilot_getAmmo(Pilot* p, Outfit* o);
|
|
void pilot_setAfterburner(Pilot* p);
|
|
/* Escort stuff. */
|
|
int pilot_dock(Pilot* p, Pilot* target);
|
|
/* Explosion. */
|
|
void pilot_explode(double x, double y, double radius,
|
|
DamageType dtype, double damage, unsigned int parent);
|
|
/* Outfits. */
|
|
int pilot_freeSpace(Pilot* p); /* Pilot space. */
|
|
int pilot_addOutfit(Pilot* pilot, Outfit* outfit, int quantity);
|
|
int pilot_rmOutfit(Pilot* pilot, Outfit* outfit, int quantity);
|
|
char* pilot_getOutfits(Pilot* pilot);
|
|
void pilot_calcStats(Pilot* pilot);
|
|
int pilot_oquantity(Pilot* p, PilotOutfit* w);
|
|
/* Normal cargo. */
|
|
int pilot_cargoUsed(Pilot* pilot); /* Get amount of cargo onboard. */
|
|
int pilot_cargoFree(Pilot* p); /* Cargo space. */
|
|
int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity);
|
|
int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity);
|
|
int pilot_moveCargo(Pilot* dest, Pilot* src);
|
|
/* Mission cargo - Not to be confused with normal cargo. */
|
|
unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity);
|
|
int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id, int jettison);
|
|
|
|
|
|
/* Creation. */
|
|
void pilot_init(Pilot* dest, Ship* ship, char* name, int faction,
|
|
char* ai, const double dir, const Vec2* pos,
|
|
const Vec2* vel, const unsigned int flags);
|
|
|
|
unsigned int pilot_create(Ship* ship, char* name, int faction,
|
|
char* ai, const double dir, const Vec2* pos,
|
|
const Vec2* vel, const unsigned int flags);
|
|
|
|
Pilot* pilot_createEmpty(Ship* ship, char* name,
|
|
int faction, char* ai, const unsigned int flags);
|
|
|
|
Pilot* pilot_copy(Pilot* src);
|
|
|
|
/* Init/Cleanup. */
|
|
void pilot_destroy(Pilot* p);
|
|
void pilots_free(void);
|
|
void pilots_clean(void);
|
|
void pilots_cleanAll(void);
|
|
void pilot_free(Pilot* p);
|
|
int fleet_load(void);
|
|
void fleet_free(void);
|
|
|
|
/* Update. */
|
|
void pilots_update(double dt);
|
|
void pilots_render(void);
|
|
|
|
void pilot_addHook(Pilot* pilot, int type, int hook);
|
|
void pilot_runHook(Pilot* p, int hook_type);
|
|
|