#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)));