200 lines
7.2 KiB
C
200 lines
7.2 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
|
|
|
|
#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. */
|
|
|
|
/* Aproximation for pilot size. */
|
|
#define PILOT_SIZE_APROX 0.8
|
|
#define PILOT_DISABLED_ARMOUR 0.3 /* Based on armour percentage. */
|
|
|
|
/* Hooks. */
|
|
#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. */
|
|
|
|
/* Flags. */
|
|
#define pilot_isFlag(p,f) (p->flags & (f))
|
|
#define pilot_setFlag(p,f) (p->flags |= (f))
|
|
#define pilot_rmFlag(p,f) (p->flags ^= (f))
|
|
/* Creation. */
|
|
#define PILOT_PLAYER (1<<0) /* Pilot is a player. */
|
|
#define PILOT_HASTURRET (1<<20) /* Pilot has turrets. */
|
|
#define PILOT_NO_OUTFITS (1<<21) /* Do not create the pilot with outfits. */
|
|
#define PILOT_EMPTY (1<<22) /* Do not add pilot to stack. */
|
|
/* Dynamic. */
|
|
#define PILOT_HOSTILE (1<<1) /* Pilot is hostile to the player. */
|
|
#define PILOT_COMBAT (1<<2) /* Pilot is engaged in combat. */
|
|
#define PILOT_AFTERBURNER (1<<3) /* Pilot has her afterburner activated. */
|
|
#define PILOT_HYP_PREP (1<<5) /* Pilot is getting ready for hyperspace. */
|
|
#define PILOT_HYP_BEGIN (1<<6) /* Pilot is starting engines. */
|
|
#define PILOT_HYPERSPACE (1<<7) /* Pilot is in hyperspace. */
|
|
#define PILOT_BOARDED (1<<8) /* Pilot has been boarded already! */
|
|
#define PILOT_DISABLED (1<<9) /* Pilot is disabled. */
|
|
#define PILOT_DEAD (1<<10) /* Pilot is on it's death bed. */
|
|
#define PILOT_EXPLODED (1<<11) /* Pilot did final death explosion. */
|
|
#define PILOT_DELETE (1<<15) /* Pilot will get delete asap. */
|
|
|
|
/* Just makes life simpler. */
|
|
#define pilot_isPlayer(p) ((p)->flags & PILOT_PLAYER)
|
|
#define pilot_isDisabled(p) ((p)->flags & PILOT_DISABLED)
|
|
|
|
typedef struct PilotOutfit_ {
|
|
Outfit* outfit; /* Associated outfit. */
|
|
int quantity; /* Number of outfits of this type that the pilot has. */
|
|
unsigned int timer; /* Used to store last used weapon time. */
|
|
} PilotOutfit;
|
|
|
|
/* Pilot commodity. */
|
|
typedef struct PilotCommodity_ {
|
|
Commodity* commodity;
|
|
int quantity;
|
|
unsigned int id; /* Special mission id for cargo. */
|
|
} PilotCommodity;
|
|
|
|
/* Primary pilot structure. */
|
|
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;
|
|
|
|
/* Object characteristics. */
|
|
Ship* ship; /* Pilots ship. */
|
|
Solid* solid; /* Associated solid (physics). */
|
|
int tsx, tsy; /* Current sprite, calculated on update. */
|
|
|
|
double thrust, turn, speed;
|
|
|
|
/* Current health. */
|
|
double armour, shield, energy, fuel;
|
|
double armour_max, shield_max, energy_max, fuel_max;
|
|
double armour_regen, shield_regen, energy_regen;
|
|
|
|
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;
|
|
int noutfits;
|
|
PilotOutfit* secondary; /* Secondary weapon. */
|
|
PilotOutfit* ammo; /* Secondary ammo (if needed). */
|
|
PilotOutfit* afterburner; /* Ze afterburner. */
|
|
|
|
/* Cargo. */
|
|
int credits; /* Moniez the pilot has. */
|
|
PilotCommodity* commodities; /* Commodity and quantity. */
|
|
int ncommodities;
|
|
int cargo_free;
|
|
|
|
/* 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;
|
|
int hook;
|
|
|
|
/* AI. */
|
|
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;
|
|
|
|
/* Fleets. */
|
|
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. */
|
|
} FleetPilot;
|
|
|
|
typedef struct Fleet_ {
|
|
char* name; /* Fleet name, used as an identifier. */
|
|
int faction; /* Faction of the fleet. */
|
|
|
|
AI_Profile* ai; /* A useable profile. */
|
|
|
|
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_getNext(const unsigned int id);
|
|
unsigned int pilot_getNearest(const Pilot* p);
|
|
unsigned int pilot_getHostile(void); /* Only for the player. */
|
|
Fleet* fleet_get(const char* name);
|
|
int pilot_getJumps(const Pilot* p);
|
|
|
|
/* MISC. */
|
|
void pilot_shoot(Pilot* p, const unsigned int target, const int secondary);
|
|
void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter,
|
|
const DamageType dtype, const double damage);
|
|
void pilot_setSecondary(Pilot* p, const char* secondary);
|
|
void pilot_setAmmo(Pilot* p);
|
|
void pilot_setAfterburner(Pilot* p);
|
|
double pilot_face(Pilot* p, const float dir);
|
|
/* 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);
|
|
/* 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);
|
|
/* 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);
|
|
|
|
|
|
/* Creation. */
|
|
void pilot_init(Pilot* dest, Ship* ship, char* name, int faction,
|
|
AI_Profile* ai, const double dir, const Vec2* pos,
|
|
const Vec2* vel, const int flags);
|
|
|
|
unsigned int pilot_create(Ship* ship, char* name, int faction,
|
|
AI_Profile* ai, const double dir, const Vec2* pos,
|
|
const Vec2* vel, const int flags);
|
|
|
|
Pilot* pilot_createEmpty(Ship* ship, char* name,
|
|
int faction, AI_Profile* ai, const 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); /* TODO */
|
|
void fleet_free(void);
|
|
|
|
/* Update. */
|
|
void pilots_update(double dt);
|
|
void pilots_render(void);
|
|
|
|
void pilot_addHook(Pilot* pilot, int type, int hook);
|
|
|