#pragma once #include "opengl.h" #include "sound.h" #define outfit_isProp(o,p) ((o)->properties & p) // Property flags. #define OUTFIT_PROP_WEAP_SECONDARY (1<<0) // Outfit types. typedef enum OutfitType_ { OUTFIT_TYPE_NULL = 0, OUTFIT_TYPE_BOLT = 1, OUTFIT_TYPE_BEAM = 2, OUTFIT_TYPE_MISSILE_DUMB = 3, OUTFIT_TYPE_MISSILE_DUMB_AMMO = 4, OUTFIT_TYPE_MISSILE_SEEK = 5, OUTFIT_TYPE_MISSILE_SEEK_AMMO = 6, OUTFIT_TYPE_MISSILE_SEEK_SMART = 7, OUTFIT_TYPE_MISSILE_SEEK_SMART_AMMO = 8, OUTFIT_TYPE_MISSILE_SWARM = 9, OUTFIT_TYPE_MISSILE_SWARM_AMMO = 10, OUTFIT_TYPE_MISSILE_SWARM_SMART = 11, OUTFIT_TYPE_MISSILE_SWARM_SMART_AMMO = 12, OUTFIT_TYPE_TURRET_BOLT = 13, OUTFIT_TYPE_TURRET_BEAM = 14, OUTFIT_TYPE_MODIFICATION = 15, OUTFIT_TYPE_AFTERBURNER = 16 } OutfitType; typedef enum DamageType_ { DAMAGE_TYPE_NULL = 0, DAMAGE_TYPE_ENERGY = 1, DAMAGE_TYPE_KINETIC = 2 } DamageType; // An outfit depends a lot on the type. typedef struct Outfit_ { char* name; // General specs. int max; int tech; int mass; // Store stuff. unsigned int price; char* description; glTexture* gfx_store; // Store graphic. int properties; // Properties stored bitwise. // Type dependant. OutfitType type; union { struct { // Bolt. unsigned int delay; // Delay between shots. double speed; // Speed of shot. (not applicable to beam. double range; double accuracy; // Desviation accuracy. double energy; // Energy usage. DamageType dtype; // Damage type. double damage; // Damage. glTexture* gfx_space; ALuint sound; // Sound to play. int spfx; // Special effect on hit. } blt; struct { // Beam. double range; // Distance it travels. glColour colour; // Beam colour. double energy; // Energy drained. double damage_armour, damage_shield; // Damage. } bem; struct { // Launcher. unsigned int delay; // Delay between shots. char* ammo; } lau; struct { // Ammo. unsigned int duration; // Duration. double speed; // Max speed. double turn; // Turn vel. double thrust; // Acceleration. double energy; // Energy usage. DamageType dtype; // Damage type. double damage; // Damage. glTexture* gfx_space; ALuint sound; // Sound to play. int spfx; // Special effect on hit. unsigned int lockon; // Time taken to lock on the target. } amm; struct { // Modification. // Movement. double thrust, turn, speed; // Health. double armour, armour_regen; double shield, shield_regen; double energy, energy_regen; double fuel; // Misc. int cargo; // Cargo space to add. } mod; struct { // Afterburner. double rumble; // Percent of rumble. double thrust_perc, thrust_abs; // Percent and absolute thrust bonus. double speed_perc, speed_abs; // Percent and absolute speed bonus. double energy; // Energy used while active. } afb; } u; } Outfit; // Misc. void outfit_calcDamage(double* dshield, double* darmour, DamageType dtype, double dmg); // Get. Outfit* outfit_get(const char* name); char** outfit_getTech(int* n, const int* tech, const int techmax); // Outfit types. int outfit_isWeapon(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); 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); double outfit_energy(const Outfit* o); // Load/free outfit stack. int outfit_load(void); void outfit_free(void);