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