1 //Copyright Paul Reiche, Fred Ford. 1992-2002
2 
3 /*
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  */
18 
19 #ifndef UQM_RACES_H_
20 #define UQM_RACES_H_
21 
22 #include "types.h"
23 #include "libs/compiler.h"
24 #include "units.h"
25 #include "displist.h"
26 
27 typedef struct STARSHIP STARSHIP;
28 typedef HLINK HSTARSHIP;
29 
30 #include "element.h"
31 #include "libs/sndlib.h"
32 #include "libs/reslib.h"
33 
34 #if defined(__cplusplus)
35 extern "C" {
36 #endif
37 
38 
39 // TODO: remove RACES_PER_PLAYER remnant of SC1
40 #define RACES_PER_PLAYER 7
41 #define MAX_SHIPS_PER_SIDE 14
42 
43 /* SHIP_INFO.ship_flags - ship specific flags */
44 /* bits 0 and 1 are now available */
45 #define SEEKING_WEAPON    (1 << 2)
46 #define SEEKING_SPECIAL   (1 << 3)
47 #define POINT_DEFENSE     (1 << 4)
48 		/* Ship has some point-defense capabilities */
49 #define IMMEDIATE_WEAPON  (1 << 5)
50 #define CREW_IMMUNE       (1 << 6)
51 #define FIRES_FORE        (1 << 7)
52 #define FIRES_RIGHT       (1 << 8)
53 #define FIRES_AFT         (1 << 9)
54 #define FIRES_LEFT        (1 << 10)
55 #define SHIELD_DEFENSE    (1 << 11)
56 #define DONT_CHASE        (1 << 12)
57 #define PLAYER_CAPTAIN    (1 << 13)
58 		/* The protagonist himself is on board. He gets a different color. */
59 
60 typedef UWORD STATUS_FLAGS;
61 
62 /* STATUS_FLAGS - heat of battle specific flags */
63 #define LEFT                   (1 << 0)
64 #define RIGHT                  (1 << 1)
65 #define THRUST                 (1 << 2)
66 #define WEAPON                 (1 << 3)
67 #define SPECIAL                (1 << 4)
68 #define LOW_ON_ENERGY          (1 << 5)
69 #define SHIP_BEYOND_MAX_SPEED  (1 << 6)
70 #define SHIP_AT_MAX_SPEED      (1 << 7)
71 #define SHIP_IN_GRAVITY_WELL   (1 << 8)
72 #define PLAY_VICTORY_DITTY     (1 << 9)
73 
74 /* These track the old resource package orderings for the ship resource indices */
75 typedef enum
76 {
77 	NO_ID,
78 	ARILOU_ID,
79 	CHMMR_ID,
80 	EARTHLING_ID,
81 	ORZ_ID,
82 	PKUNK_ID,
83 	SHOFIXTI_ID,
84 	SPATHI_ID,
85 	SUPOX_ID,
86 	THRADDASH_ID,
87 	UTWIG_ID,
88 	VUX_ID,
89 	YEHAT_ID,
90 	MELNORME_ID,
91 	DRUUGE_ID,
92 	ILWRATH_ID,
93 	MYCON_ID,
94 	SLYLANDRO_ID,
95 	UMGAH_ID,
96 	UR_QUAN_ID,
97 	ZOQFOTPIK_ID,
98 	SYREEN_ID,
99 	KOHR_AH_ID,
100 	ANDROSYNTH_ID,
101 	CHENJESU_ID,
102 	MMRNMHRM_ID,
103 	LAST_MELEE_ID = MMRNMHRM_ID,
104 	SIS_SHIP_ID,
105 	SA_MATRA_ID,
106 	UR_QUAN_PROBE_ID,
107 	NUM_SPECIES_ID
108 } SPECIES_ID;
109 
110 typedef struct captain_stuff
111 {
112 	RESOURCE captain_rsc;
113 	FRAME background;
114 	FRAME turn;
115 	FRAME thrust;
116 	FRAME weapon;
117 	FRAME special;
118 } CAPTAIN_STUFF;
119 
120 typedef enum
121 {
122 	PURSUE = 0,
123 	AVOID,
124 	ENTICE,
125 	NO_MOVEMENT
126 } MOVEMENT_STATE;
127 
128 typedef struct
129 {
130 	ELEMENT *ObjectPtr;
131 	COUNT facing;
132 	COUNT which_turn;
133 	MOVEMENT_STATE MoveState;
134 } EVALUATE_DESC;
135 
136 typedef void (IntelligenceFunc) (ELEMENT *ShipPtr,
137 		EVALUATE_DESC *ObjectsOfConcern, COUNT ConcernCounter);
138 typedef struct
139 {
140 	COUNT ManeuverabilityIndex;
141 	COUNT WeaponRange;
142 	IntelligenceFunc *intelligence_func;
143 } INTEL_STUFF;
144 
145 typedef struct
146 {
147 	COUNT max_thrust;
148 	COUNT thrust_increment;
149 	BYTE energy_regeneration;
150 	BYTE weapon_energy_cost;
151 	BYTE special_energy_cost;
152 	BYTE energy_wait;
153 	BYTE turn_wait;
154 	BYTE thrust_wait;
155 	BYTE weapon_wait;
156 	BYTE special_wait;
157 	BYTE ship_mass;
158 } CHARACTERISTIC_STUFF;
159 
160 typedef struct
161 {
162 	UWORD ship_flags;
163 	BYTE ship_cost;
164 
165 	COUNT crew_level;
166 	COUNT max_crew;
167 	BYTE energy_level;
168 	BYTE max_energy;
169 
170 	RESOURCE race_strings_rsc;
171 	RESOURCE icons_rsc;
172 	RESOURCE melee_icon_rsc;
173 
174 	STRING race_strings;
175 	FRAME icons;
176 	FRAME melee_icon;
177 } SHIP_INFO;
178 
179 typedef struct
180 {
181 	COUNT strength;
182 	POINT known_loc;
183 
184 #define INFINITE_RADIUS ((COUNT) ~0)
185 } FLEET_STUFF;
186 
187 typedef struct
188 {
189 	RESOURCE ship_rsc[NUM_VIEWS];
190 	RESOURCE weapon_rsc[NUM_VIEWS];
191 	RESOURCE special_rsc[NUM_VIEWS];
192 	CAPTAIN_STUFF captain_control;
193 	RESOURCE victory_ditty_rsc;
194 	RESOURCE ship_sounds_rsc;
195 
196 	FRAME ship[NUM_VIEWS];
197 	FRAME weapon[NUM_VIEWS];
198 	FRAME special[NUM_VIEWS];
199 	MUSIC_REF victory_ditty;
200 	SOUND ship_sounds;
201 } DATA_STUFF;
202 
203 
204 typedef struct race_desc RACE_DESC;
205 
206 typedef void (PREPROCESS_FUNC) (ELEMENT *ElementPtr);
207 typedef void (POSTPROCESS_FUNC) (ELEMENT *ElementPtr);
208 typedef COUNT (INIT_WEAPON_FUNC) (ELEMENT *ElementPtr, HELEMENT Weapon[]);
209 typedef void (UNINIT_FUNC) (RACE_DESC *pRaceDesc);
210 
211 struct race_desc
212 {
213 	SHIP_INFO ship_info _ALIGNED_ANY;
214 	FLEET_STUFF fleet _ALIGNED_ANY;
215 	CHARACTERISTIC_STUFF characteristics _ALIGNED_ANY;
216 	DATA_STUFF ship_data _ALIGNED_ANY;
217 	INTEL_STUFF cyborg_control _ALIGNED_ANY;
218 
219 	UNINIT_FUNC *uninit_func;
220 	PREPROCESS_FUNC *preprocess_func;
221 	POSTPROCESS_FUNC *postprocess_func;
222 	INIT_WEAPON_FUNC *init_weapon_func;
223 
224 	void* data;  // private ship data, ship code owns this
225 
226 	void *CodeRef;
227 };
228 
229 #define SHIP_BASE_COMMON \
230 	/* LINK elements; must be first */ \
231 	HLINK pred; \
232 	HLINK succ; \
233 	\
234 	SPECIES_ID SpeciesID; \
235 	BYTE captains_name_index \
236 			/* Also used in full-game to detect if a STARSHIP is an escort
237 			 * or the flagship (captains_name_index == 0) */
238 
239 typedef struct
240 {
241 	SHIP_BASE_COMMON;
242 } SHIP_BASE;
243 
244 
245 struct STARSHIP
246 {
247 	SHIP_BASE_COMMON;
248 
249 	RACE_DESC *RaceDescPtr;
250 
251 	// Ship information
252 	COUNT crew_level;
253 			// In full-game battles: crew left
254 			// In SuperMelee: irrelevant
255 	COUNT max_crew;
256 	BYTE ship_cost;
257 			// In Super Melee ship queue: ship cost
258 			// In full-game: irrelevant
259 	COUNT index;
260 			// original queue index
261 	STRING race_strings;
262 	FRAME icons;
263 
264 	// Battle states
265 	BYTE weapon_counter;
266 			// In battle: frames left before primary weapon can be used
267 	BYTE special_counter;
268 			// In battle: frames left before special can be used
269 	BYTE energy_counter;
270 			// In battle: frames left before energy regeneration
271 
272 	BYTE ship_input_state;
273 	STATUS_FLAGS cur_status_flags;
274 	STATUS_FLAGS old_status_flags;
275 
276 	HELEMENT hShip;
277 	COUNT ShipFacing;
278 
279 	SIZE playerNr;
280 			//  0: bottom player; In full-game: the human player (RPG)
281 			//  1: top player; In full-game: the NPC opponent
282 			// -1: neutral; this should currently never happen (asserts)
283 	BYTE control;
284 			// HUMAN, COMPUTER or NETWORK control flags, see intel.h
285 };
286 
287 #define RPG_PLAYER_NUM  0
288 #define NPC_PLAYER_NUM  1
289 
290 static inline STARSHIP *
LockStarShip(const QUEUE * pq,HSTARSHIP h)291 LockStarShip (const QUEUE *pq, HSTARSHIP h)
292 {
293 	assert (GetLinkSize (pq) == sizeof (STARSHIP));
294 	return (STARSHIP *) LockLink (pq, h);
295 }
296 
297 #define UnlockStarShip(pq, h)  UnlockLink (pq, h)
298 #define FreeStarShip(pq, h)    FreeLink (pq, h)
299 
300 
301 typedef HLINK HSHIPFRAG;
302 
303 typedef struct
304 {
305 	SHIP_BASE_COMMON;
306 
307 	BYTE race_id;
308 	BYTE index;
309 	COUNT crew_level;
310 			/* For ships in npc_built_ship_q, the value INFINITE_FLEET for
311 			 * crew_level indicates an infinite number of ships. */
312 	COUNT max_crew;
313 
314 	BYTE energy_level;
315 	BYTE max_energy;
316 			// XXX: energy_level and max_energy are unused. We save and load
317 			//   them, but otherwise nothing needs them atm.
318 
319 	STRING race_strings;
320 	FRAME icons;
321 	FRAME melee_icon;  /* Only used by Shipyard */
322 
323 #define INFINITE_FLEET ((COUNT) ~0)
324 } SHIP_FRAGMENT;
325 
326 static inline SHIP_FRAGMENT *
LockShipFrag(const QUEUE * pq,HSHIPFRAG h)327 LockShipFrag (const QUEUE *pq, HSHIPFRAG h)
328 {
329 	assert (GetLinkSize (pq) == sizeof (SHIP_FRAGMENT));
330 	return (SHIP_FRAGMENT *) LockLink (pq, h);
331 }
332 
333 #define UnlockShipFrag(pq, h)  UnlockLink (pq, h)
334 #define FreeShipFrag(pq, h)    FreeLink (pq, h)
335 
336 
337 typedef HLINK HFLEETINFO;
338 
339 typedef struct
340 {
341 	// LINK elements; must be first
342 	HFLEETINFO pred;
343 	HFLEETINFO succ;
344 
345 	SPECIES_ID SpeciesID;
346 
347 	UWORD allied_state; /* GOOD_GUY, BAD_GUY or DEAD_GUY */
348 	BYTE days_left;   /* Days left before the fleet reachers 'dest_loc'. */
349 	BYTE growth_fract;
350 	COUNT crew_level;
351 	COUNT max_crew;
352 	BYTE growth;
353 	BYTE max_energy;
354 	POINT loc;        /* Location of the fleet (center) */
355 
356 	STRING race_strings;
357 			/* Race specific strings, see doc/devel/racestrings. */
358 	FRAME icons;
359 	FRAME melee_icon;
360 
361 	COUNT actual_strength;
362 			/* Measure for the size of the sphere of influence.
363 			 * 0 if there is none and no ships will be generated.
364 	         * '(COUNT) ~0' if there is none, and the ship generation
365 			 * is handled separately. */
366 	COUNT known_strength;
367 			/* Measure for the size of the sphere of influence when last
368 			 * checked the starmap.
369 			 * 0 if the race's SoI is not known. */
370 	POINT known_loc;
371 			/* Location of the SoI (center) when last checked
372 			 * the starmap. */
373 
374 	BYTE growth_err_term;
375 	BYTE func_index;
376 			/* Function index defined in clock.h (the same as in SetEvent())
377 			 * for the function to call when the fleet reaches 'dest_loc'.
378 			 * '(BYTE) ~0' means no function to call. */
379 	POINT dest_loc;
380 			/* Location to which the fleet (center) is moving. */
381 
382 } FLEET_INFO;
383 
384 // Values for FLEET_INFO.allied_state
385 enum
386 {
387 	DEAD_GUY = 0,  // Race is extinct
388 	GOOD_GUY,      // Race is allied with the player
389 	BAD_GUY,       // Race is not allied with the player
390 };
391 
392 static inline FLEET_INFO *
LockFleetInfo(const QUEUE * pq,HFLEETINFO h)393 LockFleetInfo (const QUEUE *pq, HFLEETINFO h)
394 {
395 	assert (GetLinkSize (pq) == sizeof (FLEET_INFO));
396 	return (FLEET_INFO *) LockLink (pq, h);
397 }
398 
399 #define UnlockFleetInfo(pq, h) UnlockLink (pq, h)
400 
401 enum
402 {
403 	ARILOU_SHIP,
404 	CHMMR_SHIP,
405 	HUMAN_SHIP,
406 	ORZ_SHIP,
407 	PKUNK_SHIP,
408 	SHOFIXTI_SHIP,
409 	SPATHI_SHIP,
410 	SUPOX_SHIP,
411 	THRADDASH_SHIP,
412 	UTWIG_SHIP,
413 	VUX_SHIP,
414 	YEHAT_SHIP,
415 	MELNORME_SHIP,
416 	DRUUGE_SHIP,
417 	ILWRATH_SHIP,
418 	MYCON_SHIP,
419 	SLYLANDRO_SHIP,
420 	UMGAH_SHIP,
421 	URQUAN_SHIP,
422 	ZOQFOTPIK_SHIP,
423 
424 	SYREEN_SHIP,
425 	BLACK_URQUAN_SHIP,
426 	YEHAT_REBEL_SHIP,
427 	URQUAN_DRONE_SHIP,
428 	SAMATRA_SHIP = URQUAN_DRONE_SHIP,
429 
430 	NUM_AVAILABLE_RACES
431 };
432 
433 #define RACE_COMMUNICATION \
434 		ARILOU_CONVERSATION,       /* ARILOU_SHIP */ \
435 		CHMMR_CONVERSATION,        /* CHMMR_SHIP */ \
436 		INVALID_CONVERSATION,      /* HUMAN_SHIP */ \
437 		ORZ_CONVERSATION,          /* ORZ_SHIP */ \
438 		PKUNK_CONVERSATION,        /* PKUNK_SHIP */ \
439 		SHOFIXTI_CONVERSATION,     /* SHOFIXTI_SHIP */ \
440 		SPATHI_CONVERSATION,       /* SPATHI_SHIP */ \
441 		SUPOX_CONVERSATION,        /* SUPOX_SHIP */ \
442 		THRADD_CONVERSATION,       /* THRADDASH_SHIP */ \
443 		UTWIG_CONVERSATION,        /* UTWIG_SHIP */ \
444 		VUX_CONVERSATION,          /* VUX_SHIP */ \
445 		YEHAT_CONVERSATION,        /* YEHAT_SHIP */ \
446 		MELNORME_CONVERSATION,     /* MELNORME_SHIP */ \
447 		DRUUGE_CONVERSATION,       /* DRUUGE_SHIP */ \
448 		ILWRATH_CONVERSATION,      /* ILWRATH_SHIP */ \
449 		MYCON_CONVERSATION,        /* MYCON_SHIP */ \
450 		SLYLANDRO_CONVERSATION,    /* SLYLANDRO_SHIP */ \
451 		UMGAH_CONVERSATION,        /* UMGAH_SHIP */ \
452 		URQUAN_CONVERSATION,       /* URQUAN_SHIP */ \
453 		ZOQFOTPIK_CONVERSATION,    /* ZOQFOTPIK_SHIP */ \
454 		INVALID_CONVERSATION,      /* SYREEN_SHIP */ \
455 		BLACKURQ_CONVERSATION,     /* BLACK_URQUAN_SHIP */ \
456 		YEHAT_REBEL_CONVERSATION,  /* YEHAT_REBEL_SHIP */ \
457 		URQUAN_DRONE_CONVERSATION, /* URQUAN_DRONE_SHIP */
458 
459 #define RACE_SHIP_FOR_COMM \
460 	ARILOU_SHIP,       /* ARILOU_CONVERSATION */ \
461 	CHMMR_SHIP,        /* CHMMR_CONVERSATION */ \
462 	HUMAN_SHIP,        /* COMMANDER_CONVERSATION */ \
463 	ORZ_SHIP,          /* ORZ_CONVERSATION */ \
464 	PKUNK_SHIP,        /* PKUNK_CONVERSATION */ \
465 	SHOFIXTI_SHIP,     /* SHOFIXTI_CONVERSATION */ \
466 	SPATHI_SHIP,       /* SPATHI_CONVERSATION */ \
467 	SUPOX_SHIP,        /* SUPOX_CONVERSATION */ \
468 	THRADDASH_SHIP,    /* THRADD_CONVERSATION */ \
469 	UTWIG_SHIP,        /* UTWIG_CONVERSATION */ \
470 	VUX_SHIP,          /* VUX_CONVERSATION */ \
471 	YEHAT_SHIP,        /* YEHAT_CONVERSATION */ \
472 	MELNORME_SHIP,     /* MELNORME_CONVERSATION */ \
473 	DRUUGE_SHIP,       /* DRUUGE_CONVERSATION */ \
474 	ILWRATH_SHIP,      /* ILWRATH_CONVERSATION */ \
475 	MYCON_SHIP,        /* MYCON_CONVERSATION */ \
476 	SLYLANDRO_SHIP,    /* SLYLANDRO_CONVERSATION */ \
477 	UMGAH_SHIP,        /* UMGAH_CONVERSATION */ \
478 	URQUAN_SHIP,       /* URQUAN_CONVERSATION */ \
479 	ZOQFOTPIK_SHIP,    /* ZOQFOTPIK_CONVERSATION */ \
480 	SYREEN_SHIP,       /* SYREEN_CONVERSATION */ \
481 	BLACK_URQUAN_SHIP, /* BLACKURQ_CONVERSATION */ \
482 	UMGAH_SHIP,        /* TALKING_PET_CONVERSATION */ \
483 	SLYLANDRO_SHIP,    /* SLYLANDRO_HOME_CONVERSATION */ \
484 	URQUAN_DRONE_SHIP, /* URQUAN_DRONE_CONVERSATION */ \
485 	YEHAT_SHIP,        /* YEHAT_REBEL_CONVERSATION */ \
486 	HUMAN_SHIP         /* INVALID_CONVERSATION */
487 
488 #define RACE_SHIP_COST \
489 		1600,  /* ARILOU_SHIP */ \
490 		3000,  /* CHMMR_SHIP */ \
491 		1100,  /* HUMAN_SHIP */ \
492 		2300,  /* ORZ_SHIP */ \
493 		2000,  /* PKUNK_SHIP */ \
494 		 500,  /* SHOFIXTI_SHIP */ \
495 		1800,  /* SPATHI_SHIP */ \
496 		1600,  /* SUPOX_SHIP */ \
497 		1000,  /* THRADDASH_SHIP */ \
498 		2200,  /* UTWIG_SHIP */ \
499 		1200,  /* VUX_SHIP */ \
500 		2300,  /* YEHAT_SHIP */ \
501 		3600,  /* MELNORME_SHIP */ \
502 		1700,  /* DRUUGE_SHIP */ \
503 		1000,  /* ILWRATH_SHIP */ \
504 		2100,  /* MYCON_SHIP */ \
505 		4400,  /* SLYLANDRO_SHIP */ \
506 		 700,  /* UMGAH_SHIP */ \
507 		3000,  /* URQUAN_SHIP */ \
508 		 600,  /* ZOQFOTPIK_SHIP */ \
509 		1300,  /* SYREEN_SHIP */ \
510 		3000,  /* BLACK_URQUAN_SHIP */ \
511 		2300,  /* YEHAT_REBEL_SHIP */
512 
513 #define LOG_TO_IP(s) ((s) << 1)
514 #define RACE_IP_SPEED \
515 		LOG_TO_IP (40),  /* ARILOU_SHIP */ \
516 		LOG_TO_IP (27),  /* CHMMR_SHIP */ \
517 		LOG_TO_IP (24),  /* HUMAN_SHIP */ \
518 		LOG_TO_IP (40),  /* ORZ_SHIP */ \
519 		LOG_TO_IP (40),  /* PKUNK_SHIP */ \
520 		LOG_TO_IP (35),  /* SHOFIXTI_SHIP */ \
521 		LOG_TO_IP (48),  /* SPATHI_SHIP */ \
522 		LOG_TO_IP (40),  /* SUPOX_SHIP */ \
523 		LOG_TO_IP (28),  /* THRADDASH_SHIP */ \
524 		LOG_TO_IP (30),  /* UTWIG_SHIP */ \
525 		LOG_TO_IP (21),  /* VUX_SHIP */ \
526 		LOG_TO_IP (30),  /* YEHAT_SHIP */ \
527 		LOG_TO_IP (40),  /* MELNORME_SHIP */ \
528 		LOG_TO_IP (20),  /* DRUUGE_SHIP */ \
529 		LOG_TO_IP (25),  /* ILWRATH_SHIP */ \
530 		LOG_TO_IP (27),  /* MYCON_SHIP */ \
531 		LOG_TO_IP (60),  /* SLYLANDRO_SHIP */ \
532 		LOG_TO_IP (18),  /* UMGAH_SHIP */ \
533 		LOG_TO_IP (30),  /* URQUAN_SHIP */ \
534 		LOG_TO_IP (40),  /* ZOQFOTPIK_SHIP */ \
535 		LOG_TO_IP (36),  /* SYREEN_SHIP */ \
536 		LOG_TO_IP (30),  /* BLACK_URQUAN_SHIP */ \
537 		LOG_TO_IP (30),  /* YEHAT_REBEL_SHIP */ \
538 		LOG_TO_IP (90),  /* URQUAN_DRONE_SHIP */
539 
540 #define LOG_TO_HYPER(s) (WORLD_TO_VELOCITY (s) >> 1)
541 #define RACE_HYPER_SPEED \
542 		LOG_TO_HYPER (40),  /* ARILOU_SHIP */ \
543 		LOG_TO_HYPER (27),  /* CHMMR_SHIP */ \
544 		LOG_TO_HYPER (24),  /* HUMAN_SHIP */ \
545 		LOG_TO_HYPER (40),  /* ORZ_SHIP */ \
546 		LOG_TO_HYPER (40),  /* PKUNK_SHIP */ \
547 		LOG_TO_HYPER (35),  /* SHOFIXTI_SHIP */ \
548 		LOG_TO_HYPER (48),  /* SPATHI_SHIP */ \
549 		LOG_TO_HYPER (40),  /* SUPOX_SHIP */ \
550 		LOG_TO_HYPER (50),  /* THRADDASH_SHIP */ \
551 		LOG_TO_HYPER (30),  /* UTWIG_SHIP */ \
552 		LOG_TO_HYPER (21),  /* VUX_SHIP */ \
553 		LOG_TO_HYPER (30),  /* YEHAT_SHIP */ \
554 		LOG_TO_HYPER (40),  /* MELNORME_SHIP */ \
555 		LOG_TO_HYPER (20),  /* DRUUGE_SHIP */ \
556 		LOG_TO_HYPER (25),  /* ILWRATH_SHIP */ \
557 		LOG_TO_HYPER (27),  /* MYCON_SHIP */ \
558 		LOG_TO_HYPER (60),  /* SLYLANDRO_SHIP */ \
559 		LOG_TO_HYPER (18),  /* UMGAH_SHIP */ \
560 		LOG_TO_HYPER (30),  /* URQUAN_SHIP */ \
561 		LOG_TO_HYPER (40),  /* ZOQFOTPIK_SHIP */ \
562 		LOG_TO_HYPER (36),  /* SYREEN_SHIP */ \
563 		LOG_TO_HYPER (30),  /* BLACK_URQUAN_SHIP */ \
564 		LOG_TO_HYPER (30),  /* YEHAT_REBEL_SHIP */
565 
566 #define RACE_HYPERSPACE_PERCENT \
567 		20,  /* ARILOU_SHIP */ \
568 		 0,  /* CHMMR_SHIP */ \
569 		 0,  /* HUMAN_SHIP */ \
570 		20,  /* ORZ_SHIP */ \
571 		40,  /* PKUNK_SHIP */ \
572 		 0,  /* SHOFIXTI_SHIP */ \
573 		20,  /* SPATHI_SHIP */ \
574 		40,  /* SUPOX_SHIP */ \
575 		60,  /* THRADDASH_SHIP */ \
576 		40,  /* UTWIG_SHIP */ \
577 		40,  /* VUX_SHIP */ \
578 		60,  /* YEHAT_SHIP */ \
579 		 0,  /* MELNORME_SHIP */ \
580 		30,  /* DRUUGE_SHIP */ \
581 		60,  /* ILWRATH_SHIP */ \
582 		40,  /* MYCON_SHIP */ \
583 		 2,  /* SLYLANDRO_SHIP */ \
584 		30,  /* UMGAH_SHIP */ \
585 		70,  /* URQUAN_SHIP */ \
586 		 0,  /* ZOQFOTPIK_SHIP */ \
587 		 0,  /* SYREEN_SHIP */ \
588 		70,  /* BLACK_URQUAN_SHIP */ \
589 		60,  /* YEHAT_REBEL_SHIP */ \
590 		 0,  /* URQUAN_DRONE_SHIP */
591 
592 #define RACE_INTERPLANETARY_PERCENT \
593 		 0,  /* ARILOU_SHIP */ \
594 		 0,  /* CHMMR_SHIP */ \
595 		 0,  /* HUMAN_SHIP */ \
596 		20,  /* ORZ_SHIP */ \
597 		20,  /* PKUNK_SHIP */ \
598 		 0,  /* SHOFIXTI_SHIP */ \
599 		10,  /* SPATHI_SHIP */ \
600 		20,  /* SUPOX_SHIP */ \
601 		20,  /* THRADDASH_SHIP */ \
602 		20,  /* UTWIG_SHIP */ \
603 		20,  /* VUX_SHIP */ \
604 		40,  /* YEHAT_SHIP */ \
605 		 0,  /* MELNORME_SHIP */ \
606 		20,  /* DRUUGE_SHIP */ \
607 		60,  /* ILWRATH_SHIP */ \
608 		20,  /* MYCON_SHIP */ \
609 		 5,  /* SLYLANDRO_SHIP */ \
610 		20,  /* UMGAH_SHIP */ \
611 		40,  /* URQUAN_SHIP */ \
612 		 0,  /* ZOQFOTPIK_SHIP */ \
613 		 0,  /* SYREEN_SHIP */ \
614 		40,  /* BLACK_URQUAN_SHIP */ \
615 		40,  /* YEHAT_REBEL_SHIP */ \
616 		 0,  /* URQUAN_DRONE_SHIP */
617 
618 // How many ships will an encounter consist of.
619 // The first number specifies the minimum, the second the maximum.
620 // The chance is 50% for each ship past the minimum to be present.
621 #define RACE_ENCOUNTER_MAKEUP \
622 		MAKE_BYTE (1, 5),  /* ARILOU_SHIP */ \
623 		0,                 /* CHMMR_SHIP */ \
624 		0,                 /* HUMAN_SHIP */ \
625 		MAKE_BYTE (1, 5),  /* ORZ_SHIP */ \
626 		MAKE_BYTE (1, 5),  /* PKUNK_SHIP */ \
627 		0,                 /* SHOFIXTI_SHIP */ \
628 		MAKE_BYTE (1, 5),  /* SPATHI_SHIP */ \
629 		MAKE_BYTE (1, 5),  /* SUPOX_SHIP */ \
630 		MAKE_BYTE (1, 5),  /* THRADDASH_SHIP */ \
631 		MAKE_BYTE (1, 5),  /* UTWIG_SHIP */ \
632 		MAKE_BYTE (1, 5),  /* VUX_SHIP */ \
633 		MAKE_BYTE (1, 5),  /* YEHAT_SHIP */ \
634 		MAKE_BYTE (1, 1),  /* MELNORME_SHIP */ \
635 		MAKE_BYTE (1, 5),  /* DRUUGE_SHIP */ \
636 		MAKE_BYTE (1, 5),  /* ILWRATH_SHIP */ \
637 		MAKE_BYTE (1, 5),  /* MYCON_SHIP */ \
638 		MAKE_BYTE (1, 1),  /* SLYLANDRO_SHIP */ \
639 		MAKE_BYTE (1, 5),  /* UMGAH_SHIP */ \
640 		MAKE_BYTE (1, 5),  /* URQUAN_SHIP */ \
641 		MAKE_BYTE (1, 5),  /* ZOQFOTPIK_SHIP */ \
642 		0,                 /* SYREEN_SHIP */ \
643 		MAKE_BYTE (1, 5),  /* BLACK_URQUAN_SHIP */ \
644 		MAKE_BYTE (1, 5),  /* YEHAT_REBEL_SHIP */
645 
646 #define RACE_COLORS \
647 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x10), 0x53),  /* ARILOU_SHIP */ \
648 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00),  /* CHMMR_SHIP */ \
649 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x01, 0x1f), 0x4D),  /* HUMAN_SHIP */ \
650 		BUILD_COLOR (MAKE_RGB15_INIT (0x0E, 0x00, 0x0E), 0x36),  /* ORZ_SHIP */ \
651 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x06, 0x08), 0x62),  /* PKUNK_SHIP */ \
652 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00),  /* SHOFIXTI_SHIP */ \
653 		BUILD_COLOR (MAKE_RGB15_INIT (0x0C, 0x05, 0x00), 0x76),  /* SPATHI_SHIP */ \
654 		BUILD_COLOR (MAKE_RGB15_INIT (0x0C, 0x05, 0x00), 0x76),  /* SUPOX_SHIP */ \
655 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x06, 0x08), 0x62),  /* THRADDASH_SHIP */ \
656 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x06, 0x08), 0x62),  /* UTWIG_SHIP */ \
657 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x10), 0x53),  /* VUX_SHIP */ \
658 		BUILD_COLOR (MAKE_RGB15_INIT (0x0A, 0x00, 0x11), 0x3D),  /* YEHAT_SHIP */ \
659 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x06, 0x08), 0x62),  /* MELNORME_SHIP */ \
660 		BUILD_COLOR (MAKE_RGB15_INIT (0x0F, 0x00, 0x00), 0x2D),  /* DRUUGE_SHIP */ \
661 		BUILD_COLOR (MAKE_RGB15_INIT (0x0E, 0x00, 0x0E), 0x36),  /* ILWRATH_SHIP */ \
662 		BUILD_COLOR (MAKE_RGB15_INIT (0x0E, 0x00, 0x0E), 0x36),  /* MYCON_SHIP */ \
663 		BUILD_COLOR (MAKE_RGB15_INIT (0x0C, 0x05, 0x00), 0x76),  /* SLYLANDRO_SHIP */ \
664 		BUILD_COLOR (MAKE_RGB15_INIT (0x0A, 0x00, 0x11), 0x3D),  /* UMGAH_SHIP */ \
665 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x08, 0x00), 0x6E),  /* URQUAN_SHIP */ \
666 		BUILD_COLOR (MAKE_RGB15_INIT (0x0F, 0x00, 0x00), 0x2D),  /* ZOQFOTPIK_SHIP */ \
667 		BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00),  /* SYREEN_SHIP */ \
668 		BUILD_COLOR (MAKE_RGB15_INIT (0x06, 0x06, 0x06), 0x20),  /* BLACK_URQUAN_SHIP */ \
669 		BUILD_COLOR (MAKE_RGB15_INIT (0x14, 0x07, 0x1F), 0x39),  /* YEHAT_REBEL_SHIP */
670 
671 #if defined(__cplusplus)
672 }
673 #endif
674 
675 #endif /* UQM_RACES_H_ */
676