/
rogue25b1/
rogue25b1/space/planets/
rogue25b1/space/prototypes/
rogue25b1/space/ships/
#define TO_SHIP		(1 << 0)
#define TO_COCKPIT	(1 << 1)
#define TO_GUNSEAT	(1 << 2)
#define TO_PILOTSEAT	(1 << 3)

#define SHIP_LIST		SHIP_DIR "ships.lst"
#define SPACE_LIST		PLANET_DIR "space.lst"
#define PLANET_LIST		PLANET_DIR "planet.lst"
#define SPACE_DIR		"../space/planets/"
#define SHIP_DIR		"../space/ships/"
#define PLANET_DIR		"../space/planets/"
#define STARSYSTEM_FILE		SPACE_DIR "space.lst"

#define ROOM_SHIP_LIMBO	5

#define LINK(link, first, last, next, prev)				\
    do {								\
	if (!(first))							\
	    (first) = (link);						\
	else								\
	    (last)->next = (link);					\
	(link)->next = NULL;						\
	(link)->prev = (last);						\
	(last) = (link);						\
    } while(0);

#define UNLINK(link, first, last, next, prev)				\
    do {								\
	if (!(link)->prev)						\
	    (first) = (link)->next;					\
	else								\
	    (link)->prev->next = (link)->next;				\
	if (!(link)->next)						\
	    (last) = (link)->prev;					\
	else								\
	    (link)->next->prev = (link)->prev;				\
    } while(0);

typedef struct	space_data		SPACE_DATA;
typedef struct	guard_data		GUARD_DATA;
typedef struct	planet_data		PLANET_DATA;
typedef struct	hanger_data		HANGER_DATA;
typedef struct	turret_data		TURRET_DATA;
typedef struct	ship_prototype_data	SHIP_PROTOTYPE;
typedef struct	missile_data		MISSILE_DATA;

extern          SHIP_DATA         *     first_ship;
extern          SHIP_DATA         *     last_ship;
extern          SHIP_PROTOTYPE    *     first_ship_prototype;
extern          SHIP_PROTOTYPE    *     last_ship_prototype;
extern          SPACE_DATA        *     first_starsystem;
extern          SPACE_DATA        *     last_starsystem;
extern          PLANET_DATA       *     first_planet;
extern          PLANET_DATA       *     last_planet;

typedef enum {	PLAYER_SHIP, MOB_SHIP} ship_types;

typedef enum {	SHIP_DOCKED, SHIP_READY, SHIP_BUSY, SHIP_BUSY_2,
		SHIP_BUSY_3, SHIP_REFUEL, SHIP_LAUNCH, SHIP_LAUNCH_2,
		SHIP_LAND, SHIP_LAND_2, SHIP_HYPERSPACE,
		SHIP_DISABLED, SHIP_FLYING} ship_states;

typedef enum {	MISSILE_READY, MISSILE_FIRED, MISSILE_RELOAD,
		MISSILE_RELOAD_2, MISSILE_DAMAGED} missile_states;

typedef enum {	SPACECRAFT, SPACE_STATION, AIRCRAFT, BOAT, SUBMARINE,
		LAND_VEHICLE } ship_classes;

typedef enum {	FIGHTER1, SHUTTLE1, TRANSPORT1,
		FIGHTER2, SHUTTLE2, TRANSPORT2,
		CORVETTE, FRIGATE, DESTROYER,
		CRUISER, BATTLESHIP, FLAGSHIP,
		CUSTOM_SHIP, NEWBIE_SHIP } ship_models;

/*
typedef enum {	CORSAIR,	WRAITH,		SCOUT,
		VALKYRIE,	SHUTTLE,	DROPSHIP,
		OVERLORD,	ARBITER,	SCIENCEVESSAL,
		BATTLECRUISER,	CARRIER,	CUSTOM_SHIP } ship_models;
*/

typedef enum {	MOB_PATROL = 0, MOB_DESTROYER = 6, MOB_CRUISER = 8,
		MOB_BATTLESHIP = 10 } mob_ship_models;

#define MAX_PLANET	100
#define MAX_SHIP	1000
#define MAX_SHIP_ROOMS	25
#define MAX_SHIP_MODEL	NEWBIE_SHIP


struct  model_type
{
    char * name;
    sh_int      hyperspeed;
    sh_int      realspeed;
    sh_int      missiles;
    sh_int      lasers;
    sh_int      tractorbeam;
    sh_int      manuever;
    int         energy;
    int         shield;
    int         hull;
    sh_int      rooms;
};

#define LASER_DAMAGED	-1
#define LASER_READY	0

struct space_data {
    SPACE_DATA * next;
    SPACE_DATA * prev;
    SHIP_DATA  * first_ship;
    SHIP_DATA  * last_ship;
    MISSILE_DATA  * first_missile;
    MISSILE_DATA  * last_missile;
    PLANET_DATA * first_planet;
    PLANET_DATA * last_planet;
    char	* filename;
    char	* name;
    char	* star1;
    char	* star2;
    float	s1x, s1y, s1z;
    float	s2x, s2y, s2z;
    SInt32	crash;
};

struct planet_data {
    PLANET_DATA    * next;
    PLANET_DATA    * prev;
    PLANET_DATA    * next_in_system;
    PLANET_DATA    * prev_in_system;
    GUARD_DATA     * first_guard;
    GUARD_DATA     * last_guard;
    SPACE_DATA     * starsystem;
    AREA_DATA      * area;
    char           * name;
    char           * filename;
    char	   * governed_by;
    int              population;
    float            pop_support;
    int              sector;
    float	     x, y, z;
    int              size;
    int              citysize;
    int              wilderness;
    int              wildlife;
    int              farmland;
    int              barracks;
    int              controls;
};

struct ship_prototype_data {
    SHIP_PROTOTYPE * next;
    SHIP_PROTOTYPE * prev;
    char *      filename;
    char *      name;
    char *      description;
    sh_int      shipclass;
    sh_int      model;
    sh_int      hyperspeed;
    sh_int      realspeed;
    sh_int      maxmissiles;
    sh_int      lasers;
    sh_int      tractorbeam;
    sh_int      manuever;
    int         maxenergy;
    int         maxshield;
    int         maxhull;
    sh_int      maxchaff;
};

struct turret_data {
    TURRET_DATA * next;
    TURRET_DATA * prev;
    ROOM_INDEX_DATA *room;
    SHIP_DATA  *target;
    sh_int      laserstate;
};

struct hanger_data {
    HANGER_DATA * next;
    HANGER_DATA * prev;
    ROOM_INDEX_DATA *room;
    bool        vehicle;
    bool        bayopen;
};

struct ship_data {
    SHIP_DATA * next;
    SHIP_DATA * prev;
    SHIP_DATA * next_in_starsystem;
    SHIP_DATA * prev_in_starsystem;
    SHIP_DATA * next_in_room;
    SHIP_DATA * prev_in_room;
    ROOM_INDEX_DATA *in_room;
    ROOM_INDEX_DATA *first_room;
    ROOM_INDEX_DATA *last_room;
    ROOM_INDEX_DATA *pilotseat;
    ROOM_INDEX_DATA *gunseat;
    ROOM_INDEX_DATA *viewscreen;
    ROOM_INDEX_DATA *engine;
    ROOM_INDEX_DATA *entrance;
    SPACE_DATA * starsystem;
    TURRET_DATA *first_turret;
    TURRET_DATA *last_turret;
    HANGER_DATA *first_hanger;
    HANGER_DATA *last_hanger;
    char *      filename;
    char *      name;
    char *      home;
    char *      description[MAX_SHIP_ROOMS];
    char *      owner;
    char *      pilot;
    char *      copilot;
    char *      dest;
    sh_int      type;
    sh_int      shipclass;
    sh_int      model;
    sh_int      hyperspeed;
    int         hyperdistance;
    sh_int      realspeed;
    sh_int      currspeed;
    sh_int      shipstate;
    sh_int      laserstate;
    sh_int      missilestate;
    sh_int      missiles;
    sh_int      maxmissiles;
    sh_int      lasers;
    sh_int      tractorbeam;
    sh_int      manuever;
    bool        hatchopen;
    bool        autorecharge;
    bool        autotrack;
    bool        autospeed;
    float	vx, vy, vz;
    float	hx, hy, hz;
    float	jx, jy, jz;
    int         maxenergy;
    int         energy;
    int         shield;
    int         maxshield;
    int         hull;
    int         maxhull;
    int         location;
    int         lastdoc;
    int         shipyard;
    long        collision;
    SHIP_DATA  *target;
    SPACE_DATA *currjump;
    sh_int      chaff;
    sh_int      maxchaff;
    bool        chaff_released;
    bool        autopilot;
    VNum	clan;
};

struct missile_data {
    MISSILE_DATA * next;
    MISSILE_DATA * prev;
    MISSILE_DATA * next_in_starsystem;
    MISSILE_DATA * prev_in_starsystem;
    SPACE_DATA * starsystem;
    SHIP_DATA * target;
    SHIP_DATA * fired_from;
    char      * fired_by;
    sh_int      age;
    int         speed;
    float	mx, my, mz;
};

SHIP_DATA *ship_in_room(ROOM_INDEX_DATA *room, char *name);
SHIP_DATA *ship_from_entrance(ROOM_INDEX_DATA *room);
bool check_pilot(CHAR_DATA *ch, SHIP_DATA *ship);
void echo_to_room(ROOM_INDEX_DATA *room, char *argument);
void echo_to_ship(Flags type, SHIP_DATA *ship, char *argument, ...) __attribute__ ((format (printf, 3, 4)));
void echo_to_system(SHIP_DATA *ship, SHIP_DATA *ignore, char *argument, ...) __attribute__ ((format (printf, 3, 4)));