//Copyright Paul Reiche, Fred Ford. 1992-2002

/*
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef UQM_RACES_H_
#define UQM_RACES_H_

#include "types.h"
#include "libs/compiler.h"
#include "units.h"
#include "displist.h"

typedef struct STARSHIP STARSHIP;
typedef HLINK HSTARSHIP;

#include "element.h"
#include "libs/sndlib.h"
#include "libs/reslib.h"

#if defined(__cplusplus)
extern "C" {
#endif


// TODO: remove RACES_PER_PLAYER remnant of SC1
#define RACES_PER_PLAYER 7
#define MAX_SHIPS_PER_SIDE 14

/* SHIP_INFO.ship_flags - ship specific flags */
/* bits 0 and 1 are now available */
#define SEEKING_WEAPON    (1 << 2)
#define SEEKING_SPECIAL   (1 << 3)
#define POINT_DEFENSE     (1 << 4)
		/* Ship has some point-defense capabilities */
#define IMMEDIATE_WEAPON  (1 << 5)
#define CREW_IMMUNE       (1 << 6)
#define FIRES_FORE        (1 << 7)
#define FIRES_RIGHT       (1 << 8)
#define FIRES_AFT         (1 << 9)
#define FIRES_LEFT        (1 << 10)
#define SHIELD_DEFENSE    (1 << 11)
#define DONT_CHASE        (1 << 12)
#define PLAYER_CAPTAIN    (1 << 13)
		/* The protagonist himself is on board. He gets a different color. */

typedef UWORD STATUS_FLAGS;

/* STATUS_FLAGS - heat of battle specific flags */
#define LEFT                   (1 << 0)
#define RIGHT                  (1 << 1)
#define THRUST                 (1 << 2)
#define WEAPON                 (1 << 3)
#define SPECIAL                (1 << 4)
#define LOW_ON_ENERGY          (1 << 5)
#define SHIP_BEYOND_MAX_SPEED  (1 << 6)
#define SHIP_AT_MAX_SPEED      (1 << 7)
#define SHIP_IN_GRAVITY_WELL   (1 << 8)
#define PLAY_VICTORY_DITTY     (1 << 9)

/* These track the old resource package orderings for the ship resource indices */
typedef enum
{
	NO_ID,
	ARILOU_ID,
	CHMMR_ID,
	EARTHLING_ID,
	ORZ_ID,
	PKUNK_ID,
	SHOFIXTI_ID,
	SPATHI_ID,
	SUPOX_ID,
	THRADDASH_ID,
	UTWIG_ID,
	VUX_ID,
	YEHAT_ID,
	MELNORME_ID,
	DRUUGE_ID,
	ILWRATH_ID,
	MYCON_ID,
	SLYLANDRO_ID,
	UMGAH_ID,
	UR_QUAN_ID,
	ZOQFOTPIK_ID,
	SYREEN_ID,
	KOHR_AH_ID,
	ANDROSYNTH_ID,
	CHENJESU_ID,
	MMRNMHRM_ID,
	LAST_MELEE_ID = MMRNMHRM_ID,
	SIS_SHIP_ID,
	SA_MATRA_ID,
	UR_QUAN_PROBE_ID,
	NUM_SPECIES_ID
} SPECIES_ID;

typedef struct captain_stuff
{
	RESOURCE captain_rsc;
	FRAME background;
	FRAME turn;
	FRAME thrust;
	FRAME weapon;
	FRAME special;
} CAPTAIN_STUFF;

typedef enum
{
	PURSUE = 0,
	AVOID,
	ENTICE,
	NO_MOVEMENT
} MOVEMENT_STATE;

typedef struct
{
	ELEMENT *ObjectPtr;
	COUNT facing;
	COUNT which_turn;
	MOVEMENT_STATE MoveState;
} EVALUATE_DESC;

typedef void (IntelligenceFunc) (ELEMENT *ShipPtr,
		EVALUATE_DESC *ObjectsOfConcern, COUNT ConcernCounter);
typedef struct
{
	COUNT ManeuverabilityIndex;
	COUNT WeaponRange;
	IntelligenceFunc *intelligence_func;
} INTEL_STUFF;

typedef struct
{
	COUNT max_thrust;
	COUNT thrust_increment;
	BYTE energy_regeneration;
	BYTE weapon_energy_cost;
	BYTE special_energy_cost;
	BYTE energy_wait;
	BYTE turn_wait;
	BYTE thrust_wait;
	BYTE weapon_wait;
	BYTE special_wait;
	BYTE ship_mass;
} CHARACTERISTIC_STUFF;

typedef struct
{
	UWORD ship_flags;
	BYTE ship_cost;
	
	COUNT crew_level;
	COUNT max_crew;
	BYTE energy_level;
	BYTE max_energy;

	RESOURCE race_strings_rsc;
	RESOURCE icons_rsc;
	RESOURCE melee_icon_rsc;

	STRING race_strings;
	FRAME icons;
	FRAME melee_icon;
} SHIP_INFO;

typedef struct
{
	COUNT strength;
	POINT known_loc;

#define INFINITE_RADIUS ((COUNT) ~0)
} FLEET_STUFF;

typedef struct
{
	RESOURCE ship_rsc[NUM_VIEWS];
	RESOURCE weapon_rsc[NUM_VIEWS];
	RESOURCE special_rsc[NUM_VIEWS];
	CAPTAIN_STUFF captain_control;
	RESOURCE victory_ditty_rsc;
	RESOURCE ship_sounds_rsc;

	FRAME ship[NUM_VIEWS];
	FRAME weapon[NUM_VIEWS];
	FRAME special[NUM_VIEWS];
	MUSIC_REF victory_ditty;
	SOUND ship_sounds;
} DATA_STUFF;


typedef struct race_desc RACE_DESC;

typedef void (PREPROCESS_FUNC) (ELEMENT *ElementPtr);
typedef void (POSTPROCESS_FUNC) (ELEMENT *ElementPtr);
typedef COUNT (INIT_WEAPON_FUNC) (ELEMENT *ElementPtr, HELEMENT Weapon[]);
typedef void (UNINIT_FUNC) (RACE_DESC *pRaceDesc);

struct race_desc
{
	SHIP_INFO ship_info _ALIGNED_ANY;
	FLEET_STUFF fleet _ALIGNED_ANY;
	CHARACTERISTIC_STUFF characteristics _ALIGNED_ANY;
	DATA_STUFF ship_data _ALIGNED_ANY;
	INTEL_STUFF cyborg_control _ALIGNED_ANY;

	UNINIT_FUNC *uninit_func;
	PREPROCESS_FUNC *preprocess_func;
	POSTPROCESS_FUNC *postprocess_func;
	INIT_WEAPON_FUNC *init_weapon_func;

	void* data;  // private ship data, ship code owns this

	void *CodeRef;
};

#define SHIP_BASE_COMMON \
	/* LINK elements; must be first */ \
	HLINK pred; \
	HLINK succ; \
	\
	SPECIES_ID SpeciesID; \
	BYTE captains_name_index \
			/* Also used in full-game to detect if a STARSHIP is an escort
			 * or the flagship (captains_name_index == 0) */

typedef struct
{
	SHIP_BASE_COMMON;
} SHIP_BASE;


struct STARSHIP
{
	SHIP_BASE_COMMON;
	
	RACE_DESC *RaceDescPtr;

	// Ship information
	COUNT crew_level;
			// In full-game battles: crew left
			// In SuperMelee: irrelevant
	COUNT max_crew;
	BYTE ship_cost;
			// In Super Melee ship queue: ship cost
			// In full-game: irrelevant
	COUNT index;
			// original queue index
	STRING race_strings;
	FRAME icons;

	// Battle states
	BYTE weapon_counter;
			// In battle: frames left before primary weapon can be used
	BYTE special_counter;
			// In battle: frames left before special can be used
	BYTE energy_counter;
			// In battle: frames left before energy regeneration

	BYTE ship_input_state;
	STATUS_FLAGS cur_status_flags;
	STATUS_FLAGS old_status_flags;

	HELEMENT hShip;
	COUNT ShipFacing;

	SIZE playerNr;
			//  0: bottom player; In full-game: the human player (RPG)
			//  1: top player; In full-game: the NPC opponent
			// -1: neutral; this should currently never happen (asserts)
	BYTE control;
			// HUMAN, COMPUTER or NETWORK control flags, see intel.h
};

#define RPG_PLAYER_NUM  0
#define NPC_PLAYER_NUM  1

static inline STARSHIP *
LockStarShip (const QUEUE *pq, HSTARSHIP h)
{
	assert (GetLinkSize (pq) == sizeof (STARSHIP));
	return (STARSHIP *) LockLink (pq, h);
}

#define UnlockStarShip(pq, h)  UnlockLink (pq, h)
#define FreeStarShip(pq, h)    FreeLink (pq, h)


typedef HLINK HSHIPFRAG;

typedef struct
{
	SHIP_BASE_COMMON;

	BYTE race_id;
	BYTE index;
	COUNT crew_level;
			/* For ships in npc_built_ship_q, the value INFINITE_FLEET for
			 * crew_level indicates an infinite number of ships. */
	COUNT max_crew;
	
	BYTE energy_level;
	BYTE max_energy;
			// XXX: energy_level and max_energy are unused. We save and load
			//   them, but otherwise nothing needs them atm.

	STRING race_strings;
	FRAME icons;
	FRAME melee_icon;  /* Only used by Shipyard */

#define INFINITE_FLEET ((COUNT) ~0)
} SHIP_FRAGMENT;

static inline SHIP_FRAGMENT *
LockShipFrag (const QUEUE *pq, HSHIPFRAG h)
{
	assert (GetLinkSize (pq) == sizeof (SHIP_FRAGMENT));
	return (SHIP_FRAGMENT *) LockLink (pq, h);
}

#define UnlockShipFrag(pq, h)  UnlockLink (pq, h)
#define FreeShipFrag(pq, h)    FreeLink (pq, h)


typedef HLINK HFLEETINFO;

typedef struct
{
	// LINK elements; must be first
	HFLEETINFO pred;
	HFLEETINFO succ;

	SPECIES_ID SpeciesID;

	UWORD allied_state; /* GOOD_GUY, BAD_GUY or DEAD_GUY */
	BYTE days_left;   /* Days left before the fleet reachers 'dest_loc'. */
	BYTE growth_fract;
	COUNT crew_level;
	COUNT max_crew;
	BYTE growth;
	BYTE max_energy;
	POINT loc;        /* Location of the fleet (center) */

	STRING race_strings;
			/* Race specific strings, see doc/devel/racestrings. */
	FRAME icons;
	FRAME melee_icon;

	COUNT actual_strength;
			/* Measure for the size of the sphere of influence.
			 * 0 if there is none and no ships will be generated.
	         * '(COUNT) ~0' if there is none, and the ship generation
			 * is handled separately. */
	COUNT known_strength;
			/* Measure for the size of the sphere of influence when last
			 * checked the starmap.
			 * 0 if the race's SoI is not known. */
	POINT known_loc;
			/* Location of the SoI (center) when last checked
			 * the starmap. */

	BYTE growth_err_term;
	BYTE func_index;
			/* Function index defined in clock.h (the same as in SetEvent())
			 * for the function to call when the fleet reaches 'dest_loc'.
			 * '(BYTE) ~0' means no function to call. */
	POINT dest_loc;
			/* Location to which the fleet (center) is moving. */

} FLEET_INFO;

// Values for FLEET_INFO.allied_state
enum
{
	DEAD_GUY = 0,  // Race is extinct
	GOOD_GUY,      // Race is allied with the player
	BAD_GUY,       // Race is not allied with the player
};

static inline FLEET_INFO *
LockFleetInfo (const QUEUE *pq, HFLEETINFO h)
{
	assert (GetLinkSize (pq) == sizeof (FLEET_INFO));
	return (FLEET_INFO *) LockLink (pq, h);
}

#define UnlockFleetInfo(pq, h) UnlockLink (pq, h)

enum
{
	ARILOU_SHIP,
	CHMMR_SHIP,
	HUMAN_SHIP,
	ORZ_SHIP,
	PKUNK_SHIP,
	SHOFIXTI_SHIP,
	SPATHI_SHIP,
	SUPOX_SHIP,
	THRADDASH_SHIP,
	UTWIG_SHIP,
	VUX_SHIP,
	YEHAT_SHIP,
	MELNORME_SHIP,
	DRUUGE_SHIP,
	ILWRATH_SHIP,
	MYCON_SHIP,
	SLYLANDRO_SHIP,
	UMGAH_SHIP,
	URQUAN_SHIP,
	ZOQFOTPIK_SHIP,

	SYREEN_SHIP,
	BLACK_URQUAN_SHIP,
	YEHAT_REBEL_SHIP,
	URQUAN_DRONE_SHIP,
	SAMATRA_SHIP = URQUAN_DRONE_SHIP,

	NUM_AVAILABLE_RACES
};

#define RACE_COMMUNICATION \
		ARILOU_CONVERSATION,       /* ARILOU_SHIP */ \
		CHMMR_CONVERSATION,        /* CHMMR_SHIP */ \
		INVALID_CONVERSATION,      /* HUMAN_SHIP */ \
		ORZ_CONVERSATION,          /* ORZ_SHIP */ \
		PKUNK_CONVERSATION,        /* PKUNK_SHIP */ \
		SHOFIXTI_CONVERSATION,     /* SHOFIXTI_SHIP */ \
		SPATHI_CONVERSATION,       /* SPATHI_SHIP */ \
		SUPOX_CONVERSATION,        /* SUPOX_SHIP */ \
		THRADD_CONVERSATION,       /* THRADDASH_SHIP */ \
		UTWIG_CONVERSATION,        /* UTWIG_SHIP */ \
		VUX_CONVERSATION,          /* VUX_SHIP */ \
		YEHAT_CONVERSATION,        /* YEHAT_SHIP */ \
		MELNORME_CONVERSATION,     /* MELNORME_SHIP */ \
		DRUUGE_CONVERSATION,       /* DRUUGE_SHIP */ \
		ILWRATH_CONVERSATION,      /* ILWRATH_SHIP */ \
		MYCON_CONVERSATION,        /* MYCON_SHIP */ \
		SLYLANDRO_CONVERSATION,    /* SLYLANDRO_SHIP */ \
		UMGAH_CONVERSATION,        /* UMGAH_SHIP */ \
		URQUAN_CONVERSATION,       /* URQUAN_SHIP */ \
		ZOQFOTPIK_CONVERSATION,    /* ZOQFOTPIK_SHIP */ \
		INVALID_CONVERSATION,      /* SYREEN_SHIP */ \
		BLACKURQ_CONVERSATION,     /* BLACK_URQUAN_SHIP */ \
		YEHAT_REBEL_CONVERSATION,  /* YEHAT_REBEL_SHIP */ \
		URQUAN_DRONE_CONVERSATION, /* URQUAN_DRONE_SHIP */

#define RACE_SHIP_FOR_COMM \
	ARILOU_SHIP,       /* ARILOU_CONVERSATION */ \
	CHMMR_SHIP,        /* CHMMR_CONVERSATION */ \
	HUMAN_SHIP,        /* COMMANDER_CONVERSATION */ \
	ORZ_SHIP,          /* ORZ_CONVERSATION */ \
	PKUNK_SHIP,        /* PKUNK_CONVERSATION */ \
	SHOFIXTI_SHIP,     /* SHOFIXTI_CONVERSATION */ \
	SPATHI_SHIP,       /* SPATHI_CONVERSATION */ \
	SUPOX_SHIP,        /* SUPOX_CONVERSATION */ \
	THRADDASH_SHIP,    /* THRADD_CONVERSATION */ \
	UTWIG_SHIP,        /* UTWIG_CONVERSATION */ \
	VUX_SHIP,          /* VUX_CONVERSATION */ \
	YEHAT_SHIP,        /* YEHAT_CONVERSATION */ \
	MELNORME_SHIP,     /* MELNORME_CONVERSATION */ \
	DRUUGE_SHIP,       /* DRUUGE_CONVERSATION */ \
	ILWRATH_SHIP,      /* ILWRATH_CONVERSATION */ \
	MYCON_SHIP,        /* MYCON_CONVERSATION */ \
	SLYLANDRO_SHIP,    /* SLYLANDRO_CONVERSATION */ \
	UMGAH_SHIP,        /* UMGAH_CONVERSATION */ \
	URQUAN_SHIP,       /* URQUAN_CONVERSATION */ \
	ZOQFOTPIK_SHIP,    /* ZOQFOTPIK_CONVERSATION */ \
	SYREEN_SHIP,       /* SYREEN_CONVERSATION */ \
	BLACK_URQUAN_SHIP, /* BLACKURQ_CONVERSATION */ \
	UMGAH_SHIP,        /* TALKING_PET_CONVERSATION */ \
	SLYLANDRO_SHIP,    /* SLYLANDRO_HOME_CONVERSATION */ \
	URQUAN_DRONE_SHIP, /* URQUAN_DRONE_CONVERSATION */ \
	YEHAT_SHIP,        /* YEHAT_REBEL_CONVERSATION */ \
	HUMAN_SHIP         /* INVALID_CONVERSATION */
 
#define RACE_SHIP_COST \
		1600,  /* ARILOU_SHIP */ \
		3000,  /* CHMMR_SHIP */ \
		1100,  /* HUMAN_SHIP */ \
		2300,  /* ORZ_SHIP */ \
		2000,  /* PKUNK_SHIP */ \
		 500,  /* SHOFIXTI_SHIP */ \
		1800,  /* SPATHI_SHIP */ \
		1600,  /* SUPOX_SHIP */ \
		1000,  /* THRADDASH_SHIP */ \
		2200,  /* UTWIG_SHIP */ \
		1200,  /* VUX_SHIP */ \
		2300,  /* YEHAT_SHIP */ \
		3600,  /* MELNORME_SHIP */ \
		1700,  /* DRUUGE_SHIP */ \
		1000,  /* ILWRATH_SHIP */ \
		2100,  /* MYCON_SHIP */ \
		4400,  /* SLYLANDRO_SHIP */ \
		 700,  /* UMGAH_SHIP */ \
		3000,  /* URQUAN_SHIP */ \
		 600,  /* ZOQFOTPIK_SHIP */ \
		1300,  /* SYREEN_SHIP */ \
		3000,  /* BLACK_URQUAN_SHIP */ \
		2300,  /* YEHAT_REBEL_SHIP */

#define LOG_TO_IP(s) ((s) << 1)
#define RACE_IP_SPEED \
		LOG_TO_IP (40),  /* ARILOU_SHIP */ \
		LOG_TO_IP (27),  /* CHMMR_SHIP */ \
		LOG_TO_IP (24),  /* HUMAN_SHIP */ \
		LOG_TO_IP (40),  /* ORZ_SHIP */ \
		LOG_TO_IP (40),  /* PKUNK_SHIP */ \
		LOG_TO_IP (35),  /* SHOFIXTI_SHIP */ \
		LOG_TO_IP (48),  /* SPATHI_SHIP */ \
		LOG_TO_IP (40),  /* SUPOX_SHIP */ \
		LOG_TO_IP (28),  /* THRADDASH_SHIP */ \
		LOG_TO_IP (30),  /* UTWIG_SHIP */ \
		LOG_TO_IP (21),  /* VUX_SHIP */ \
		LOG_TO_IP (30),  /* YEHAT_SHIP */ \
		LOG_TO_IP (40),  /* MELNORME_SHIP */ \
		LOG_TO_IP (20),  /* DRUUGE_SHIP */ \
		LOG_TO_IP (25),  /* ILWRATH_SHIP */ \
		LOG_TO_IP (27),  /* MYCON_SHIP */ \
		LOG_TO_IP (60),  /* SLYLANDRO_SHIP */ \
		LOG_TO_IP (18),  /* UMGAH_SHIP */ \
		LOG_TO_IP (30),  /* URQUAN_SHIP */ \
		LOG_TO_IP (40),  /* ZOQFOTPIK_SHIP */ \
		LOG_TO_IP (36),  /* SYREEN_SHIP */ \
		LOG_TO_IP (30),  /* BLACK_URQUAN_SHIP */ \
		LOG_TO_IP (30),  /* YEHAT_REBEL_SHIP */ \
		LOG_TO_IP (90),  /* URQUAN_DRONE_SHIP */

#define LOG_TO_HYPER(s) (WORLD_TO_VELOCITY (s) >> 1)
#define RACE_HYPER_SPEED \
		LOG_TO_HYPER (40),  /* ARILOU_SHIP */ \
		LOG_TO_HYPER (27),  /* CHMMR_SHIP */ \
		LOG_TO_HYPER (24),  /* HUMAN_SHIP */ \
		LOG_TO_HYPER (40),  /* ORZ_SHIP */ \
		LOG_TO_HYPER (40),  /* PKUNK_SHIP */ \
		LOG_TO_HYPER (35),  /* SHOFIXTI_SHIP */ \
		LOG_TO_HYPER (48),  /* SPATHI_SHIP */ \
		LOG_TO_HYPER (40),  /* SUPOX_SHIP */ \
		LOG_TO_HYPER (50),  /* THRADDASH_SHIP */ \
		LOG_TO_HYPER (30),  /* UTWIG_SHIP */ \
		LOG_TO_HYPER (21),  /* VUX_SHIP */ \
		LOG_TO_HYPER (30),  /* YEHAT_SHIP */ \
		LOG_TO_HYPER (40),  /* MELNORME_SHIP */ \
		LOG_TO_HYPER (20),  /* DRUUGE_SHIP */ \
		LOG_TO_HYPER (25),  /* ILWRATH_SHIP */ \
		LOG_TO_HYPER (27),  /* MYCON_SHIP */ \
		LOG_TO_HYPER (60),  /* SLYLANDRO_SHIP */ \
		LOG_TO_HYPER (18),  /* UMGAH_SHIP */ \
		LOG_TO_HYPER (30),  /* URQUAN_SHIP */ \
		LOG_TO_HYPER (40),  /* ZOQFOTPIK_SHIP */ \
		LOG_TO_HYPER (36),  /* SYREEN_SHIP */ \
		LOG_TO_HYPER (30),  /* BLACK_URQUAN_SHIP */ \
		LOG_TO_HYPER (30),  /* YEHAT_REBEL_SHIP */

#define RACE_HYPERSPACE_PERCENT \
		20,  /* ARILOU_SHIP */ \
		 0,  /* CHMMR_SHIP */ \
		 0,  /* HUMAN_SHIP */ \
		20,  /* ORZ_SHIP */ \
		40,  /* PKUNK_SHIP */ \
		 0,  /* SHOFIXTI_SHIP */ \
		20,  /* SPATHI_SHIP */ \
		40,  /* SUPOX_SHIP */ \
		60,  /* THRADDASH_SHIP */ \
		40,  /* UTWIG_SHIP */ \
		40,  /* VUX_SHIP */ \
		60,  /* YEHAT_SHIP */ \
		 0,  /* MELNORME_SHIP */ \
		30,  /* DRUUGE_SHIP */ \
		60,  /* ILWRATH_SHIP */ \
		40,  /* MYCON_SHIP */ \
		 2,  /* SLYLANDRO_SHIP */ \
		30,  /* UMGAH_SHIP */ \
		70,  /* URQUAN_SHIP */ \
		 0,  /* ZOQFOTPIK_SHIP */ \
		 0,  /* SYREEN_SHIP */ \
		70,  /* BLACK_URQUAN_SHIP */ \
		60,  /* YEHAT_REBEL_SHIP */ \
		 0,  /* URQUAN_DRONE_SHIP */

#define RACE_INTERPLANETARY_PERCENT \
		 0,  /* ARILOU_SHIP */ \
		 0,  /* CHMMR_SHIP */ \
		 0,  /* HUMAN_SHIP */ \
		20,  /* ORZ_SHIP */ \
		20,  /* PKUNK_SHIP */ \
		 0,  /* SHOFIXTI_SHIP */ \
		10,  /* SPATHI_SHIP */ \
		20,  /* SUPOX_SHIP */ \
		20,  /* THRADDASH_SHIP */ \
		20,  /* UTWIG_SHIP */ \
		20,  /* VUX_SHIP */ \
		40,  /* YEHAT_SHIP */ \
		 0,  /* MELNORME_SHIP */ \
		20,  /* DRUUGE_SHIP */ \
		60,  /* ILWRATH_SHIP */ \
		20,  /* MYCON_SHIP */ \
		 5,  /* SLYLANDRO_SHIP */ \
		20,  /* UMGAH_SHIP */ \
		40,  /* URQUAN_SHIP */ \
		 0,  /* ZOQFOTPIK_SHIP */ \
		 0,  /* SYREEN_SHIP */ \
		40,  /* BLACK_URQUAN_SHIP */ \
		40,  /* YEHAT_REBEL_SHIP */ \
		 0,  /* URQUAN_DRONE_SHIP */

// How many ships will an encounter consist of.
// The first number specifies the minimum, the second the maximum.
// The chance is 50% for each ship past the minimum to be present.
#define RACE_ENCOUNTER_MAKEUP \
		MAKE_BYTE (1, 5),  /* ARILOU_SHIP */ \
		0,                 /* CHMMR_SHIP */ \
		0,                 /* HUMAN_SHIP */ \
		MAKE_BYTE (1, 5),  /* ORZ_SHIP */ \
		MAKE_BYTE (1, 5),  /* PKUNK_SHIP */ \
		0,                 /* SHOFIXTI_SHIP */ \
		MAKE_BYTE (1, 5),  /* SPATHI_SHIP */ \
		MAKE_BYTE (1, 5),  /* SUPOX_SHIP */ \
		MAKE_BYTE (1, 5),  /* THRADDASH_SHIP */ \
		MAKE_BYTE (1, 5),  /* UTWIG_SHIP */ \
		MAKE_BYTE (1, 5),  /* VUX_SHIP */ \
		MAKE_BYTE (1, 5),  /* YEHAT_SHIP */ \
		MAKE_BYTE (1, 1),  /* MELNORME_SHIP */ \
		MAKE_BYTE (1, 5),  /* DRUUGE_SHIP */ \
		MAKE_BYTE (1, 5),  /* ILWRATH_SHIP */ \
		MAKE_BYTE (1, 5),  /* MYCON_SHIP */ \
		MAKE_BYTE (1, 1),  /* SLYLANDRO_SHIP */ \
		MAKE_BYTE (1, 5),  /* UMGAH_SHIP */ \
		MAKE_BYTE (1, 5),  /* URQUAN_SHIP */ \
		MAKE_BYTE (1, 5),  /* ZOQFOTPIK_SHIP */ \
		0,                 /* SYREEN_SHIP */ \
		MAKE_BYTE (1, 5),  /* BLACK_URQUAN_SHIP */ \
		MAKE_BYTE (1, 5),  /* YEHAT_REBEL_SHIP */

#define RACE_COLORS \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x10), 0x53),  /* ARILOU_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00),  /* CHMMR_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x01, 0x1f), 0x4D),  /* HUMAN_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0E, 0x00, 0x0E), 0x36),  /* ORZ_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x06, 0x08), 0x62),  /* PKUNK_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00),  /* SHOFIXTI_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0C, 0x05, 0x00), 0x76),  /* SPATHI_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0C, 0x05, 0x00), 0x76),  /* SUPOX_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x06, 0x08), 0x62),  /* THRADDASH_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x06, 0x08), 0x62),  /* UTWIG_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x10), 0x53),  /* VUX_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0A, 0x00, 0x11), 0x3D),  /* YEHAT_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x06, 0x08), 0x62),  /* MELNORME_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0F, 0x00, 0x00), 0x2D),  /* DRUUGE_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0E, 0x00, 0x0E), 0x36),  /* ILWRATH_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0E, 0x00, 0x0E), 0x36),  /* MYCON_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0C, 0x05, 0x00), 0x76),  /* SLYLANDRO_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0A, 0x00, 0x11), 0x3D),  /* UMGAH_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x08, 0x00), 0x6E),  /* URQUAN_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x0F, 0x00, 0x00), 0x2D),  /* ZOQFOTPIK_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00),  /* SYREEN_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x06, 0x06, 0x06), 0x20),  /* BLACK_URQUAN_SHIP */ \
		BUILD_COLOR (MAKE_RGB15_INIT (0x14, 0x07, 0x1F), 0x39),  /* YEHAT_REBEL_SHIP */

#if defined(__cplusplus)
}
#endif

#endif /* UQM_RACES_H_ */
