Lephisto/src/outfit.h

295 lines
10 KiB
C

#pragma once
#include "opengl.h"
#include "sound.h"
#define outfit_isProp(o,p) ((o)->properties & p) /**< Check an outfit for property. */
/* Property flags. */
#define OUTFIT_PROP_WEAP_SECONDARY (1<<0) /**< Is a secondary weapon? */
/**
* @enum OutfitType
*
* @brief Different types of existing outfits.
*
* Outfits are organized by the order here.
*/
typedef enum OutfitType_ {
OUTFIT_TYPE_NULL, /**< NULL type. */
OUTFIT_TYPE_BOLT, /**< Fixed bolt cannon. */
OUTFIT_TYPE_BEAM, /**< Fixed beam cannon. */
OUTFIT_TYPE_TURRET_BOLT, /**< Rotaty bolt turret. */
OUTFIT_TYPE_TURRET_BEAM, /**< Rotary bolt turret. */
OUTFIT_TYPE_MISSILE_DUMB, /**< Dumb missile launcher. */
OUTFIT_TYPE_MISSILE_DUMB_AMMO, /**< Dumb missile ammo. */
OUTFIT_TYPE_MISSILE_SEEK, /**< Seeker missile launcher. */
OUTFIT_TYPE_MISSILE_SEEK_AMMO, /**< Seeker missile ammo. */
OUTFIT_TYPE_MISSILE_SEEK_SMART, /**< ATM equivalent to SEEK. */
OUTFIT_TYPE_MISSILE_SEEK_SMART_AMMO, /**< @todo atm equivalent to SEEK_AMMI. */
OUTFIT_TYPE_MISSILE_SWARM, /**< @todo Swarm missile launcher. */
OUTFIT_TYPE_MISSILE_SWARM_AMMO, /**< @todo Swarm missile ammo. */
OUTFIT_TYPE_MISSILE_SWARM_SMART, /**< @todo Same as SWARM. */
OUTFIT_TYPE_MISSILE_SWARM_SMART_AMMO, /**< @todo Same as SWARM_AMMO. */
OUTFIT_TYPE_MODIFICATION, /**< Modifies the ship afterburn capability. */
OUTFIT_TYPE_AFTERBURNER, /**< Gives the ship afterburn capability. */
OUTFIT_TYPE_JAMMER, /**< Used to nullify seeker missiles. */
OUTFIT_TYPE_FIGHTER_BAY, /**< Contains other ships. */
OUTFIT_TYPE_FIGHTER, /**< Ship contained in FIGHTER BAY. */
OUTFIT_TYPE_MAP, /**< Give the player more knowledge about systems. */
OUTFIT_TYPE_SENTINEL /**< Indicates last type. */
} OutfitType;
/**
* @enum DamageType
*
* @brief Different types of damage.
*/
typedef enum DamageType_ {
DAMAGE_TYPE_NULL, /**< NULL. */
DAMAGE_TYPE_ENERGY, /**< Energy-based weapons. */
DAMAGE_TYPE_KINETIC, /**< Physic impact weapons. */
DAMAGE_TYPE_ION, /**< Ion-based weapons. */
DAMAGE_TYPE_RADIATION /**< Radioactive weapons. */
} DamageType;
/**
* @struct OutfitBoldData
*
* @brief Represents the particular properties of a bolt weapon.
*/
typedef struct OutfitBoltData_ {
unsigned int delay; /**< Delay between shots. */
double speed; /**< How fast it goes (not applicable to beam). */
double range; /**< How far it goes. */
double accuracy; /**< Desviation accuracy. */
double energy; /**< Energy usage. */
DamageType dtype; /**< Damage type. */
double damage; /**< damage. */
/* Sound and graphics. */
glTexture* gfx_space; /**< Graphic. */
int sound; /**< Sound to play. */
int spfx; /**< Special effect on hit. */
} OutfitBoltData;
/**
* @struct OutfitBeamData
*
* @brief Represents the particular properties of a beam weapon.
*/
typedef struct OutfitBeamData_ {
/* Time stuff. */
unsigned int delay; /**< Delay between usage. */
double warmup; /**< How long it takes to warm up. */
double duration; /**< How long the beam lasts active. */
/* Beam properties. */
double range; /**< How far it goes. */
double turn; /**< How fast it can turn. Only for turrets. */
glColour* colour; /**< Beam colour. */
double energy; /**< Amount of energy it drains (per second). */
DamageType dtype; /**< Damage type. */
double damage; /**< Damage amount. */
/* Graphics and sound */
glTexture* gfx; /**< Base texture. */
int spfx; /**< Special effect on hit. */
int sound_warmup; /**< Sound to play when warming up. @todo use. */
int sound; /**< Sound to play. */
int sound_off; /**< Sound to play when turning off. */
} OutfitBeamData;
/**
* @struct OutfitLauncherData
*
* @brief Represents a particular missile launcher.
*
* The properties of the weapon are highly dependant on the ammunition.
*/
typedef struct OutfitLauncherData_ {
unsigned int delay; /**< Delay between shots. */
char* ammo; /**< The ammo to use. */
} OutfitLauncherData;
/**
* @struct OutfitAmmoData
*
* @brief Represents ammunition for a launcher.
*/
typedef struct OutfitAmmoData_ {
double duration; /**< How long the ammo lives. */
double lockon; /**< Time it takes to lock on the target. */
double resist; /**< Lowers chance of jamming by this amount. */
double speed; /**< Max speed. */
double turn; /**< Turn velocity. */
double thrust; /**< Acceleration. */
double energy; /**< Energy usage. */
DamageType dtype; /**< Damage type. */
double damage; /**< Damage. */
glTexture* gfx_space; /**< Graphic. */
int sound; /**< Sound to play. */
int spfx; /**< Special effect on hit. */
} OutfitAmmoData;
/**
* @struct OutfitModificationData
*
* @brief Represents a ship modification.
*
* These modify the ship's basic properties when equipped on a pilot.
*/
typedef struct OutfitModificationData_ {
/* Movement. */
double thrust; /**< Max thrust modifier. */
double turn; /**< Max turn modifier. */
double speed; /**< Max speed modifier. */
/* Health. */
double armour; /**< Max armour modifier. */
double armour_regen; /**< Armour regeneration modifier. */
double shield; /**< Max shield modifier. */
double shield_regen; /**< Shield regeneration modifier. */
double energy; /**< Max energy modifier. */
double energy_regen; /**< Energy regeneration modifier. */
double fuel; /**< Max fuel modifier. */
/* Misc. */
int cargo; /**< Cargo space modifier. */
} OutfitModificationData;
/**
* @struct OutfitAfterburnerData
*
* @brief Represents an afterburner.
*/
typedef struct OutfitAfterburnerData_ {
double rumble; /**< Percent of rumble. */
int sound; /**< Sound of afterburner. */
double thrust_perc; /**< Percent of thrust increase based on ship base. */
double thrust_abs; /**< Fixed absolute thrust increase. */
double speed_perc; /**< Percent of speed to increase based on ship base. */
double speed_abs; /**< Fixed absolulte speed increase. */
double energy; /**< Energy used while active. */
} OutfitAfterburnerData;
/**
* @struct OutfitFighterBayData
*
* @brief Represents a fighter bay.
*/
typedef struct OutfitFighterBayData_ {
char* ammo; /**< Ships to use as ammo. */
double delay; /**< Delay between launches. */
} OutfitFighterBayData;
/**
* @struct OutfitFighterData
*
* @brief Represents a fighter for a fighter bay.
*/
typedef struct OutfitFighterData_ {
char* ship; /**< Ship to use for fighter. */
int sound; /**< Sound to make when launching. */
} OutfitFighterData;
/**
* @struct OutfitMapData
*
* @brief Represents a map, is not actually stored on a ship but put into the
* nav system.
*
* Basically just marks an amount of systems whe the player buys it as known.
*/
typedef struct OutfitMapData_ {
double radius; /**< Number of jumps to add all systems within. */
} OutfitMapData;
/**
* @struct OutfitJammerData
*
* @brief Represents a jammer.
*/
typedef struct OutfitJammerData_ {
double range; /**< Range it starts to do effect. */
double chance; /**< Chance of it nullifying the missile. */
double energy; /**< Energy it uses to run. */
} OutfitJammerData;
/**
* @struct Outfit
*
* @brief A ship outfit, depends radically on the type.
*/
typedef struct Outfit_ {
char* name; /**< Name of the outfit. */
/* General specs. */
int max; /**< Max amount one can own. */
int tech; /**< Tech needed to sell it. */
int mass; /**< How much weapon capacity is needed. */
/* Store stuff. */
unsigned int price; /**< Base sell price. */
char* description; /**< Store description. */
glTexture* gfx_store; /**< Store graphic. */
int properties; /**< Properties stored bitwise. */
/* Type dependant. */
OutfitType type; /**< Properties stored bitwise. */
union {
OutfitBoltData blt; /**< BOLT. */
OutfitBeamData bem; /**< BEAM. */
OutfitLauncherData lau; /**< MISSILE. */
OutfitAmmoData amm; /**< AMMO. */
OutfitModificationData mod; /**< MODIFICATION. */
OutfitAfterburnerData afb; /**< AFTERBURNER. */
OutfitJammerData jam; /**< JAMMER. */
OutfitFighterBayData bay; /**< FIGHTER_BAY. */
OutfitFighterData fig; /**< FIGHTER. */
OutfitMapData map; /**< MAP. */
} u;
} Outfit;
/* Misc. */
void outfit_calcDamage(double* dshield, double* darmour, double* knockback,
DamageType dtype, double dmg);
/* Get. */
Outfit* outfit_get(const char* name);
Outfit** outfit_getTech(int* n, const int* tech, const int techmax);
/* Outfit types. */
int outfit_isWeapon(const Outfit* o);
int outfit_isBolt(const Outfit* o);
int outfit_isBeam(const Outfit* o);
int outfit_isLauncher(const Outfit* o);
int outfit_isAmmo(const Outfit* o);
int outfit_isTurret(const Outfit* o);
int outfit_isMod(const Outfit* o);
int outfit_isAfterburner(const Outfit* o);
int outfit_isJammer(const Outfit* o);
int outfit_isFighterBay(const Outfit* o);
int outfit_isFighter(const Outfit* o);
int outfit_isMap(const Outfit* o);
const char* outfit_getType(const Outfit* o);
const char* outfit_getTypeBroad(const Outfit* o);
/* Get data from outfit. */
glTexture* outfit_gfx(const Outfit* o);
int outfit_spfx(const Outfit* o);
double outfit_damage(const Outfit* o);
DamageType outfit_damageType(const Outfit* o);
int outfit_delay(const Outfit* o);
char* outfit_ammo(const Outfit* o);
double outfit_energy(const Outfit* o);
double outfit_range(const Outfit* o);
double outfit_speed(const Outfit* o);
int outfit_isSeeker(const Outfit* o);
/* Load/free outfit stack. */
int outfit_load(void);
void outfit_free(void);