Lephisto/src/space.h

171 lines
6.2 KiB
C

#pragma once
#include "faction.h"
#include "opengl.h"
#include "economy.h"
#include "pilot.h"
#define MIN_HYPERSPACE_DIST 1500 /**< Minimum distance to initiate hyperspace. */
#define MAX_HYPERSPACE_VEL 25 /**< Speed to brake to before jumping. */
#define PLANET_TECH_MAX 8 /**< Amount of special techs a planet can have. */
/**
* @enum PlanetClass
*
* @brief Different planet classes.
*/
typedef enum PlanetClass_ {
PLANET_CLASS_NULL = 0, /**< Null/Not defined. */
PLANET_CLASS_A, /**< Geothermal. */
PLANET_CLASS_B, /**< Geomorteus. */
PLANET_CLASS_C, /**< Geoinactive. */
PLANET_CLASS_D, /**< Asteroid/Moon. */
PLANET_CLASS_E, /**< Geoplastic. */
PLANET_CLASS_F, /**< Geometallic. */
PLANET_CLASS_G, /**< GroCrystaline. */
PLANET_CLASS_H, /**< Desert. */
PLANET_CLASS_I, /**< Gas Supergiant. */
PLANET_CLASS_J, /**< Gas Giant. */
PLANET_CLASS_K, /**< Adaptable. */
PLANET_CLASS_L, /**< Marginal. */
PLANET_CLASS_M, /**< Terrestrial. */
PLANET_CLASS_N, /**< Reducing. */
PLANET_CLASS_O, /**< Pelagic. */
PLANET_CLASS_P, /**< Glaciated. */
PLANET_CLASS_Q, /**< Variable. */
PLANET_CLASS_R, /**< Rogue. */
PLANET_CLASS_S, /**< Ultragiant. */
PLANET_CLASS_T, /**< Ultragiant. */
PLANET_CLASS_X, /**< Demon. */
PLANET_CLASS_Y, /**< Demon. */
PLANET_CLASS_Z, /**< Demon. */
STATION_CLASS_A, /**< Civilian station. */
STATION_CLASS_B, /**< Military station. */
STATION_CLASS_C, /**< Interfactional station. */
STATION_CLASS_D, /**< Robotoc station. */
} PlanetClass;
/* Planet services. */
#define PLANET_SERVICE_LAND (1<<0) /**< Can we land? */
#define PLANET_SERVICE_BASIC (1<<1) /**< Refueling, spaceport bar, new. */
#define PLANET_SERVICE_COMMODITY (1<<2) /**< Can trade commodities. */
#define PLANET_SERVICE_OUTFITS (1<<3) /**< Can trade outfits. */
#define PLANET_SERVICE_SHIPYARD (1<<4) /**< Can trade ships. */
#define planet_hasService(p,s) ((p)->services & s) /**< Check if planet has service. */
/**
* @struct Planet
*
* @brief Represents a planet.
*/
typedef struct Planet_ {
char* name; /**< Planet name */
Vec2 pos; /**< Position in star system. */
PlanetClass class; /**< Planet type. */
int faction; /**< Planet faction. */
char* description; /**< Planet description. */
char* bar_description; /**< Spaceport bar description. */
unsigned int services; /**< Offered services. */
Commodity** commodities; /**< Commodities sold. */
int ncommodities; /**< Amount in stock. */
int tech[PLANET_TECH_MAX]; /**< tech[0] stores the global tech level
(everything that and below) while
tech[1-PLANET_TECH_MAX] store the
"unique" tech levels (only matches) */
glTexture* gfx_space; /**< Graphics in space. */
char* gfx_exterior; /**< Don't actually load the texture. */
} Planet;
/* Star system flags. */
#define SYSTEM_KNOWN (1<<0) /**< System is known. */
#define SYSTEM_MARKED (1<<1) /**< System is marked by a mission. */
#define sys_isFlag(s,f) ((s)->flags & (f)) /**< Check system flag. */
#define sys_setFlag(s,f) if(!sys_isFlag(s,f)) (s)->flags |= (f) /**< Set a system flag. */
#define sys_rmFlag(s,f) if(sys_isFlag(s,f)) (s)->flags ^= (f) /**< Remove a system flag. */
#define sys_isKnown(s) sys_isFlag(s, SYSTEM_KNOWN) /**< Check if system is known. */
#define sys_isMarked(s) sys_isFlag(s, SYSTEM_MARKED) /**< Check if system is marked. */
/**
* @struct SystemFleet
*
* @brief Represents a fleet that can appear in the system.
*/
typedef struct SystemFleet_ {
Fleet* fleet; /**< Fleet to appear. */
int chance; /**< Chance of fleet appearing in the system. */
} SystemFleet;
/**
* @struct StarSystem
*
* @brief Represents a star system.
*
* The star system is the basic setting in Lephisto.
*/
typedef struct StarSystem_ {
char* name; /**< Star system identifier. */
Vec2 pos; /**< Position. */
int stars; /**< Ammount of "stars" it has. */
int asteroids; /**< @todo Implement asteroids. */
double interference; /**< in % @todo Implement interference. */
int faction; /**< Overall faction. */
Planet** planets; /**< Planets. */
int nplanets; /**< Total number of planets. */
SystemFleet* fleets; /**< Fleets that can appear in the current system. */
int nfleets; /**< Total number of fleets. */
int* jumps; /**< Adjacent star system index number. */
int njumps; /**< Number of adjacent jumps. */
double nebu_density; /**< Nebulae density (0. - 1000.).*/
double nebu_volatility; /**< Nebulae volatility (0. - 1000.). */
unsigned int flags; /**< Flags for system properties. */
} StarSystem;
extern StarSystem* cur_system; /**< Current star system. */
extern int space_spawn; /**< 1 if spawning is enabled. */
/* Load/Exit. */
void space_init(const char* sysname);
int space_load(void);
void space_exit(void);
/* Planet stuff. */
char* planet_getSystem(char* planetname);
Planet* planet_get(char* planetname);
char planet_getClass(Planet* p);
/* System adding/removing stuff. */
int system_addPlanet(StarSystem* sys, char* planetname);
int system_rmPlanet(StarSystem* sys, char* planetname);
int system_addFleet(StarSystem* sys, SystemFleet* fleet);
int system_rmFleet(StarSystem* sys, SystemFleet* fleet);
/* Render. */
void space_render(const double dt);
void space_renderOverlay(const double dt);
void planets_render(void);
/* Update. */
void space_update(const double dt);
/* Misc. */
StarSystem* system_get(const char* sysname);
int space_canHyperspace(Pilot* p);
int space_hyperspace(Pilot* p);
int space_sysReachable(StarSystem* sys);
char** space_getFactionPlanet(int* nplanets, int* factions, int nfactions);
char* space_getRndPlanet(void);
void space_clearKnown(void);
void space_clearMarkers(void);
extern char* stardate;