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_GLOBDATA_H_
20 #define UQM_GLOBDATA_H_
21 
22 #include "clock.h"
23 #include "libs/gfxlib.h"
24 #include "libs/reslib.h"
25 #include "libs/sndlib.h"
26 #include "sis.h"
27 #include "velocity.h"
28 #include "commanim.h"
29 
30 #if defined(__cplusplus)
31 extern "C" {
32 #endif
33 
34 
35 // general numbers-speech generator info
36 // should accomodate most common base-10 languages
37 // many languages require various plural forms
38 // for digit names like "hundred"
39 // possibly needs reworking for others
40 typedef struct
41 {
42 	// an array of these structs must be in ascending remainder order
43 	// terminate the array with Divider == 0
44 
45 	// digit divider, i.e. 1, 10, 100, etc.
46 	int Divider;
47 	// maximum remainder for this name
48 	// name will be used if Number % Divider <= MaxRemainder
49 	int MaxRemainder;
50 	// string table index for this name
51 	// i.e. "hundred" in English
52 	COUNT StrIndex;
53 } SPEECH_DIGITNAME;
54 
55 typedef struct
56 {
57 	// digit divider, i.e. 1, 10, 100, etc.
58 	int Divider;
59 	// digit sub, i.e. 10 for teens
60 	// subtracted from the value to get an index into StrDigits
61 	int Subtrahend;
62 	// ptr to 10 indices for this digit
63 	// index is string table ptr when > 0
64 	//       is invalid (should not happen) or
65 	//       is a a 'skip digit' indicator when == 0
66 	// StrDigits can be NULL, in which case
67 	// the value is interpreted recursively
68 	COUNT *StrDigits;
69 	// digit Names, can be NULL, in which case
70 	// CommonNameIndex is used
71 	SPEECH_DIGITNAME *Names;
72 	// common digit name string table index
73 	// i.e. "hundred" in English
74 	COUNT CommonNameIndex;
75 } SPEECH_DIGIT;
76 
77 // this accomodates up to "billions" in english
78 #define MAX_SPEECH_DIGITS 7
79 
80 typedef struct
81 {
82 	// slots used in Digits array
83 	COUNT NumDigits;
84 	// slots for each digit in numbers
85 	// teens is exception
86 	// 0-9, 10-19, ..20-90, ..100-900, etc.
87 	SPEECH_DIGIT Digits[MAX_SPEECH_DIGITS];
88 } NUMBER_SPEECH_DESC;
89 typedef const NUMBER_SPEECH_DESC *NUMBER_SPEECH;
90 
91 typedef DWORD LDAS_FLAGS;
92 #define LDASF_NONE           ((LDAS_FLAGS)      0 )
93 #define LDASF_USE_ALTERNATE  ((LDAS_FLAGS)(1 << 0))
94 
95 typedef struct
96 {
97 	void (*init_encounter_func) (void);
98 			/* Called when entering communications */
99 	void (*post_encounter_func) (void);
100 			/* Called when leaving communications or combat normally */
101 	COUNT (*uninit_encounter_func) (void);
102 			/* Called when encounter is done for cleanup */
103 
104 	RESOURCE AlienFrameRes;
105 	RESOURCE AlienFontRes;
106 	Color AlienTextFColor, AlienTextBColor;
107 	POINT AlienTextBaseline;
108 	COUNT AlienTextWidth;
109 	TEXT_ALIGN AlienTextAlign;
110 	TEXT_VALIGN AlienTextValign;
111 	RESOURCE AlienColorMapRes;
112 	RESOURCE AlienSongRes;
113 	RESOURCE AlienAltSongRes;
114 	LDAS_FLAGS AlienSongFlags;
115 
116 	RESOURCE ConversationPhrasesRes;
117 
118 	COUNT NumAnimations;
119 	ANIMATION_DESC AlienAmbientArray[MAX_ANIMATIONS];
120 
121 	// Transition animation to/from talking state;
122 	// the first frame is neutral (sort of like YOYO_ANIM)
123 	ANIMATION_DESC AlienTransitionDesc;
124 	// Talking animation, like RANDOM_ANIM, except random frames
125 	// always alternate with a neutral frame;
126 	// the first frame is neutral
127 	ANIMATION_DESC AlienTalkDesc;
128 
129 	NUMBER_SPEECH AlienNumberSpeech;
130 
131 	FRAME AlienFrame;
132 	FONT AlienFont;
133 	COLORMAP AlienColorMap;
134 	MUSIC_REF AlienSong;
135 	STRING ConversationPhrases;
136 
137 } LOCDATA;
138 
139 enum
140 {
141 	PORTAL_SPAWNER_DEVICE = 0,
142 	TALKING_PET_DEVICE,
143 	UTWIG_BOMB_DEVICE,
144 	SUN_EFFICIENCY_DEVICE,
145 	ROSY_SPHERE_DEVICE,
146 	AQUA_HELIX_DEVICE,
147 	CLEAR_SPINDLE_DEVICE,
148 	ULTRON_0_DEVICE,
149 	ULTRON_1_DEVICE,
150 	ULTRON_2_DEVICE,
151 	ULTRON_3_DEVICE,
152 	MAIDENS_DEVICE,
153 	UMGAH_HYPERWAVE_DEVICE,
154 	BURVIX_HYPERWAVE_DEVICE,
155 	DATA_PLATE_1_DEVICE,
156 	DATA_PLATE_2_DEVICE,
157 	DATA_PLATE_3_DEVICE,
158 	TAALO_PROTECTOR_DEVICE,
159 	EGG_CASING0_DEVICE,
160 	EGG_CASING1_DEVICE,
161 	EGG_CASING2_DEVICE,
162 	SYREEN_SHUTTLE_DEVICE,
163 	VUX_BEAST_DEVICE,
164 	DESTRUCT_CODE_DEVICE,
165 	URQUAN_WARP_DEVICE,
166 	ARTIFACT_2_DEVICE,
167 	ARTIFACT_3_DEVICE,
168 	LUNAR_BASE_DEVICE,
169 
170 	NUM_DEVICES
171 };
172 
173 #define YEARS_TO_KOHRAH_VICTORY 4
174 
175 #define START_GAME_STATE enum {
176 #define ADD_GAME_STATE(SName,NumBits) SName, END_##SName = SName + NumBits - 1,
177 #define END_GAME_STATE NUM_GAME_STATE_BITS };
178 
179 START_GAME_STATE
180 		/* Shofixti states */
181 	ADD_GAME_STATE (SHOFIXTI_VISITS, 3)
182 	ADD_GAME_STATE (SHOFIXTI_STACK1, 2)
183 	ADD_GAME_STATE (SHOFIXTI_STACK2, 3)
184 	ADD_GAME_STATE (SHOFIXTI_STACK3, 2)
185 	ADD_GAME_STATE (SHOFIXTI_KIA, 1)
186 	ADD_GAME_STATE (SHOFIXTI_BRO_KIA, 1)
187 	ADD_GAME_STATE (SHOFIXTI_RECRUITED, 1)
188 
189 	ADD_GAME_STATE (SHOFIXTI_MAIDENS, 1) /* Did you find the babes yet? */
190 	ADD_GAME_STATE (MAIDENS_ON_SHIP, 1)
191 	ADD_GAME_STATE (BATTLE_SEGUE, 1)
192 			/* Set to 0 in init_xxx_comm() if communications directly
193 			 * follows an encounter.
194 			 * Set to 1 in init_xxx_comm() if the player gets to decide
195 			 * whether to attack or talk.
196 			 * Set to 1 in communication when battle follows the
197 			 * communication. It is still valid when uninit_xxx_comm() gets
198 			 * called after combat or communication.
199 			 */
200 	ADD_GAME_STATE (PLANETARY_LANDING, 1)
201 	ADD_GAME_STATE (PLANETARY_CHANGE, 1)
202 			/* Flag set to 1 when the planet information for the current
203 			 * world is changed since it was last saved to the starinfo.dat
204 			 * file. Set when picking up bio, mineral, or energy nodes.
205 			 * When there's no current world, it should be 0.
206 			 */
207 
208 		/* Spathi states */
209 	ADD_GAME_STATE (SPATHI_VISITS, 3)
210 	ADD_GAME_STATE (SPATHI_HOME_VISITS, 3)
211 	ADD_GAME_STATE (FOUND_PLUTO_SPATHI, 2)
212 			/* 0 - Haven't met Fwiffo.
213 			 * 1 - Met Fwiffo on Pluto, now talking to him.
214 			 * 2 - Met Fwiffo on Pluto, after dialog.
215 			 * 3 - Met Fwiffo, and have reported to the Safe Ones on
216 			 *     the Spathi moon that he was either killed, or that
217 			 *     you have him on board.
218 			 */
219 	ADD_GAME_STATE (SPATHI_SHIELDED_SELVES, 1)
220 	ADD_GAME_STATE (SPATHI_CREATURES_EXAMINED, 1)
221 	ADD_GAME_STATE (SPATHI_CREATURES_ELIMINATED, 1)
222 	ADD_GAME_STATE (UMGAH_BROADCASTERS, 1)
223 	ADD_GAME_STATE (SPATHI_MANNER, 2)
224 	ADD_GAME_STATE (SPATHI_QUEST, 1)
225 	ADD_GAME_STATE (LIED_ABOUT_CREATURES, 2)
226 	ADD_GAME_STATE (SPATHI_PARTY, 1)
227 	ADD_GAME_STATE (KNOW_SPATHI_PASSWORD, 1)
228 
229 	ADD_GAME_STATE (ILWRATH_HOME_VISITS, 3)
230 	ADD_GAME_STATE (ILWRATH_CHMMR_VISITS, 1)
231 
232 	ADD_GAME_STATE (ARILOU_SPACE, 1)
233 			/* 0 if the periodically opening QuasiSpace portal is
234 			 * closed or closing.
235 			 * 1 if the periodically opening QuasiSpace portal is
236 			 * open or opening.
237 			 */
238 	ADD_GAME_STATE (ARILOU_SPACE_SIDE, 2)
239 			/* 0 if in HyperSpace and not just emerged from the periodically
240 			 * opening QuasiSpace portal.
241 			 * 1 if in HyperSpace and just emerged from the periodically
242 			 * QuasiSpace portal (still on the portal).
243 			 * 2 if in QuasiSpace and just emerged from the periodically
244 			 * opening portal (still on the portal).
245 			 * 3 if in QuasiSpace and not just emerged from the
246 			 * periodically opening portal.
247 			 */
248 	ADD_GAME_STATE (ARILOU_SPACE_COUNTER, 4)
249 			/* Keeps track of how far the periodically opening QuasiSpace
250 			 * portal is open. (This determines the image)
251 			 * 0 <= ARILOU_SPACE_COUNTER <= 9
252 			 * 0 means totally closed.
253 			 * 9 means completely open.
254 			 */
255 
256 	ADD_GAME_STATE (LANDER_SHIELDS, 4)
257 
258 	ADD_GAME_STATE (MET_MELNORME, 1)
259 	ADD_GAME_STATE (MELNORME_RESCUE_REFUSED, 1)
260 	ADD_GAME_STATE (MELNORME_RESCUE_COUNT, 3)
261 	ADD_GAME_STATE (TRADED_WITH_MELNORME, 1)
262 	ADD_GAME_STATE (WHY_MELNORME_PURPLE, 1)
263 	ADD_GAME_STATE (MELNORME_CREDIT0, 8)
264 	ADD_GAME_STATE (MELNORME_CREDIT1, 8)
265 	ADD_GAME_STATE (MELNORME_BUSINESS_COUNT, 2)
266 	ADD_GAME_STATE (MELNORME_YACK_STACK0, 2)
267 	ADD_GAME_STATE (MELNORME_YACK_STACK1, 2)
268 	ADD_GAME_STATE (MELNORME_YACK_STACK2, 4)
269 	ADD_GAME_STATE (MELNORME_YACK_STACK3, 3)
270 	ADD_GAME_STATE (MELNORME_YACK_STACK4, 2)
271 	ADD_GAME_STATE (WHY_MELNORME_BLUE, 1)
272 	ADD_GAME_STATE (MELNORME_ANGER, 2)
273 	ADD_GAME_STATE (MELNORME_MIFFED_COUNT, 2)
274 	ADD_GAME_STATE (MELNORME_PISSED_COUNT, 2)
275 	ADD_GAME_STATE (MELNORME_HATE_COUNT, 2)
276 
277 	ADD_GAME_STATE (PROBE_MESSAGE_DELIVERED, 1)
278 	ADD_GAME_STATE (PROBE_ILWRATH_ENCOUNTER, 1)
279 
280 	ADD_GAME_STATE (STARBASE_AVAILABLE, 1)
281 	ADD_GAME_STATE (STARBASE_VISITED, 1)
282 	ADD_GAME_STATE (RADIOACTIVES_PROVIDED, 1)
283 	ADD_GAME_STATE (LANDERS_LOST, 1)
284 	ADD_GAME_STATE (GIVEN_FUEL_BEFORE, 1)
285 
286 	ADD_GAME_STATE (AWARE_OF_SAMATRA, 1)
287 	ADD_GAME_STATE (YEHAT_CAVALRY_ARRIVED, 1)
288 	ADD_GAME_STATE (URQUAN_MESSED_UP, 1)
289 
290 	ADD_GAME_STATE (MOONBASE_DESTROYED, 1)
291 	ADD_GAME_STATE (WILL_DESTROY_BASE, 1)
292 
293 	ADD_GAME_STATE (ARTIFACT_2_ON_SHIP, 1)
294 	ADD_GAME_STATE (ARTIFACT_3_ON_SHIP, 1)
295 
296 	ADD_GAME_STATE (KOHR_AH_KILLED_ALL, 1)
297 
298 	ADD_GAME_STATE (STARBASE_YACK_STACK1, 1)
299 
300 	ADD_GAME_STATE (DISCUSSED_PORTAL_SPAWNER, 1)
301 	ADD_GAME_STATE (DISCUSSED_TALKING_PET, 1)
302 	ADD_GAME_STATE (DISCUSSED_UTWIG_BOMB, 1)
303 	ADD_GAME_STATE (DISCUSSED_SUN_EFFICIENCY, 1)
304 	ADD_GAME_STATE (DISCUSSED_ROSY_SPHERE, 1)
305 	ADD_GAME_STATE (DISCUSSED_AQUA_HELIX, 1)
306 	ADD_GAME_STATE (DISCUSSED_CLEAR_SPINDLE, 1)
307 	ADD_GAME_STATE (DISCUSSED_ULTRON, 1)
308 	ADD_GAME_STATE (DISCUSSED_MAIDENS, 1)
309 	ADD_GAME_STATE (DISCUSSED_UMGAH_HYPERWAVE, 1)
310 	ADD_GAME_STATE (DISCUSSED_BURVIX_HYPERWAVE, 1)
311 	ADD_GAME_STATE (SYREEN_WANT_PROOF, 1)
312 	ADD_GAME_STATE (PLAYER_HAVING_SEX, 1)
313 	ADD_GAME_STATE (MET_ARILOU, 1)
314 	ADD_GAME_STATE (DISCUSSED_TAALO_PROTECTOR, 1)
315 	ADD_GAME_STATE (DISCUSSED_EGG_CASING0, 1)
316 	ADD_GAME_STATE (DISCUSSED_EGG_CASING1, 1)
317 	ADD_GAME_STATE (DISCUSSED_EGG_CASING2, 1)
318 	ADD_GAME_STATE (DISCUSSED_SYREEN_SHUTTLE, 1)
319 	ADD_GAME_STATE (DISCUSSED_VUX_BEAST, 1)
320 	ADD_GAME_STATE (DISCUSSED_DESTRUCT_CODE, 1)
321 	ADD_GAME_STATE (DISCUSSED_URQUAN_WARP, 1)
322 	ADD_GAME_STATE (DISCUSSED_ARTIFACT_2, 1)
323 	ADD_GAME_STATE (DISCUSSED_ARTIFACT_3, 1)
324 
325 	ADD_GAME_STATE (ATTACKED_DRUUGE, 1)
326 
327 	ADD_GAME_STATE (NEW_ALLIANCE_NAME, 2)
328 
329 	ADD_GAME_STATE (PORTAL_COUNTER, 4)
330 			/* Set to 1 when the player opens a QuasiSpace portal.
331 			 * It will then be increased to 10, at which time
332 			 * the portal is completely open. (This determines the image).
333 			 */
334 
335 	ADD_GAME_STATE (BURVIXESE_BROADCASTERS, 1)
336 	ADD_GAME_STATE (BURV_BROADCASTERS_ON_SHIP, 1)
337 
338 	ADD_GAME_STATE (UTWIG_BOMB, 1)
339 	ADD_GAME_STATE (UTWIG_BOMB_ON_SHIP, 1)
340 
341 	ADD_GAME_STATE (AQUA_HELIX, 1)
342 	ADD_GAME_STATE (AQUA_HELIX_ON_SHIP, 1)
343 
344 	ADD_GAME_STATE (SUN_DEVICE, 1)
345 	ADD_GAME_STATE (SUN_DEVICE_ON_SHIP, 1)
346 
347 	ADD_GAME_STATE (TAALO_PROTECTOR, 1)
348 	ADD_GAME_STATE (TAALO_PROTECTOR_ON_SHIP, 1)
349 
350 	ADD_GAME_STATE (SHIP_VAULT_UNLOCKED, 1)
351 	ADD_GAME_STATE (SYREEN_SHUTTLE, 1)
352 
353 	ADD_GAME_STATE (PORTAL_KEY, 1)
354 	ADD_GAME_STATE (PORTAL_KEY_ON_SHIP, 1)
355 
356 	ADD_GAME_STATE (VUX_BEAST, 1)
357 	ADD_GAME_STATE (VUX_BEAST_ON_SHIP, 1)
358 
359 	ADD_GAME_STATE (TALKING_PET, 1)
360 	ADD_GAME_STATE (TALKING_PET_ON_SHIP, 1)
361 
362 	ADD_GAME_STATE (MOONBASE_ON_SHIP, 1)
363 
364 	ADD_GAME_STATE (KOHR_AH_FRENZY, 1)
365 	ADD_GAME_STATE (KOHR_AH_VISITS, 2)
366 	ADD_GAME_STATE (KOHR_AH_BYES, 1)
367 
368 	ADD_GAME_STATE (SLYLANDRO_HOME_VISITS, 3)
369 	ADD_GAME_STATE (DESTRUCT_CODE_ON_SHIP, 1)
370 
371 	ADD_GAME_STATE (ILWRATH_VISITS, 3)
372 	ADD_GAME_STATE (ILWRATH_DECEIVED, 1)
373 	ADD_GAME_STATE (FLAGSHIP_CLOAKED, 1)
374 
375 	ADD_GAME_STATE (MYCON_VISITS, 3)
376 	ADD_GAME_STATE (MYCON_HOME_VISITS, 3)
377 	ADD_GAME_STATE (MYCON_AMBUSH, 1)
378 	ADD_GAME_STATE (MYCON_FELL_FOR_AMBUSH, 1)
379 			/* Set to 1 when the Mycon have been told about Organon
380 			 * and are moving towards it.
381 			 */
382 
383 	ADD_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 8)
384 			/* This state seems to be used to distinguish between different
385 			 * places where one may have an conversation with an alien.
386 			 * Like home world, other world, space.
387 			 * Why this needs 8 bits I don't know. Only specific
388 			 * combinations of bits seem to be used (0, 1, or all bits).
389 			 * A closer investigation is desirable. - SvdB
390 			 * Bit 4 is set when initiating communication with the Ilwrath
391 			 * 		homeworld by means of a HyperWave Broadcaster.
392 			 * Bit 5 is set when initiating communication with an Ilwrath
393 			 * 		ship by means of a HyperWave Broadcaster.
394 			 * All bits are cleared when communication is over.
395 			 */
396 
397 	ADD_GAME_STATE (ORZ_VISITS, 3)
398 	ADD_GAME_STATE (TAALO_VISITS, 3)
399 	ADD_GAME_STATE (ORZ_MANNER, 2)
400 
401 	ADD_GAME_STATE (PROBE_EXHIBITED_BUG, 1)
402 	ADD_GAME_STATE (CLEAR_SPINDLE_ON_SHIP, 1)
403 
404 	ADD_GAME_STATE (URQUAN_VISITS, 3)
405 	ADD_GAME_STATE (PLAYER_HYPNOTIZED, 1)
406 
407 	ADD_GAME_STATE (VUX_VISITS, 3)
408 	ADD_GAME_STATE (VUX_HOME_VISITS, 3)
409 	ADD_GAME_STATE (ZEX_VISITS, 3)
410 	ADD_GAME_STATE (ZEX_IS_DEAD, 1)
411 	ADD_GAME_STATE (KNOW_ZEX_WANTS_MONSTER, 1)
412 
413 	ADD_GAME_STATE (UTWIG_VISITS, 3)
414 	ADD_GAME_STATE (UTWIG_HOME_VISITS, 3)
415 	ADD_GAME_STATE (BOMB_VISITS, 3)
416 	ADD_GAME_STATE (ULTRON_CONDITION, 3)
417 			/* 0 if the Supox still have the Ultron
418 			 * 1 if the Captain has the Ultron, completely broken
419 			 * 2 if the Captain has the Ultron, with 1 fix
420 			 * 3 if the Captain has the Ultron, with 2 fixes
421 			 * 4 if the Captain has the Ultron, completely restored
422 			 * 5 if the Ultron has been returned to the Utwig
423 			 */
424 	ADD_GAME_STATE (UTWIG_HAVE_ULTRON, 1)
425 	ADD_GAME_STATE (BOMB_UNPROTECTED, 1)
426 
427 	ADD_GAME_STATE (TAALO_UNPROTECTED, 1)
428 
429 	ADD_GAME_STATE (TALKING_PET_VISITS, 3)
430 	ADD_GAME_STATE (TALKING_PET_HOME_VISITS, 3)
431 	ADD_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES, 1)
432 			/* The Umgah have come under the influence of the Talking Pet */
433 	ADD_GAME_STATE (KNOW_UMGAH_ZOMBIES, 1)
434 			/* The Captain is aware that something is up with the Umgah */
435 
436 	ADD_GAME_STATE (ARILOU_VISITS, 3)
437 	ADD_GAME_STATE (ARILOU_HOME_VISITS, 3)
438 	ADD_GAME_STATE (KNOW_ARILOU_WANT_WRECK, 1)
439 	ADD_GAME_STATE (ARILOU_CHECKED_UMGAH, 2)
440 	ADD_GAME_STATE (PORTAL_SPAWNER, 1)
441 	ADD_GAME_STATE (PORTAL_SPAWNER_ON_SHIP, 1)
442 
443 	ADD_GAME_STATE (UMGAH_VISITS, 3)
444 	ADD_GAME_STATE (UMGAH_HOME_VISITS, 3)
445 	ADD_GAME_STATE (MET_NORMAL_UMGAH, 1)
446 
447 	ADD_GAME_STATE (SYREEN_HOME_VISITS, 3)
448 	ADD_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP, 1)
449 	ADD_GAME_STATE (KNOW_SYREEN_VAULT, 1)
450 
451 	ADD_GAME_STATE (EGG_CASE0_ON_SHIP, 1)
452 	ADD_GAME_STATE (SUN_DEVICE_UNGUARDED, 1)
453 
454 	ADD_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1)
455 			/* The Rosy Sphere is aboard the flagship, i.e. It has been
456 			 * acquired from the Druuge, but not yet inserted in the broken
457 			 * Ultron. cf. ROSY_SPHERE */
458 
459 	ADD_GAME_STATE (CHMMR_HOME_VISITS, 3)
460 	ADD_GAME_STATE (CHMMR_EMERGING, 1)
461 	ADD_GAME_STATE (CHMMR_UNLEASHED, 1)
462 	ADD_GAME_STATE (CHMMR_BOMB_STATE, 2)
463 			/* 0 - Nothing is known about the Precursor Bomb.
464 			 * 1 - The captain knows from the Chmmr that some extremely
465 			 *     powerful weapon is needed to destroy the Sa-Matra.
466 			 * 2 - Installation of the precursor bomb has started.
467 			 * 3 - Left the starbase after installation of the Precursor bomb.
468 			 */
469 
470 	ADD_GAME_STATE (DRUUGE_DISCLAIMER, 1)
471 
472 	ADD_GAME_STATE (YEHAT_VISITS, 3)
473 	ADD_GAME_STATE (YEHAT_REBEL_VISITS, 3)
474 	ADD_GAME_STATE (YEHAT_HOME_VISITS, 3)
475 	ADD_GAME_STATE (YEHAT_CIVIL_WAR, 1)
476 	ADD_GAME_STATE (YEHAT_ABSORBED_PKUNK, 1)
477 	ADD_GAME_STATE (YEHAT_SHIP_MONTH, 4)
478 	ADD_GAME_STATE (YEHAT_SHIP_DAY, 5)
479 	ADD_GAME_STATE (YEHAT_SHIP_YEAR, 5)
480 
481 	ADD_GAME_STATE (CLEAR_SPINDLE, 1)
482 	ADD_GAME_STATE (PKUNK_VISITS, 3)
483 	ADD_GAME_STATE (PKUNK_HOME_VISITS, 3)
484 	ADD_GAME_STATE (PKUNK_SHIP_MONTH, 4)
485 			/* The month in PKUNK_SHIP_YEAR that new ships are available
486 			 * from the Pkunk. */
487 	ADD_GAME_STATE (PKUNK_SHIP_DAY, 5)
488 			/* The day of the month in PKUNK_SHIP_MONTH in PKUNK_SHIP_YEAR
489 			 * that new ships are available. */
490 	ADD_GAME_STATE (PKUNK_SHIP_YEAR, 5)
491 			/* The year that new ships are available from the Pkunk
492 			 * (stored as an offset from the year the game starts). */
493 	ADD_GAME_STATE (PKUNK_MISSION, 3)
494 
495 	ADD_GAME_STATE (SUPOX_VISITS, 3)
496 	ADD_GAME_STATE (SUPOX_HOME_VISITS, 3)
497 
498 	ADD_GAME_STATE (THRADD_VISITS, 3)
499 	ADD_GAME_STATE (THRADD_HOME_VISITS, 3)
500 	ADD_GAME_STATE (HELIX_VISITS, 3)
501 	ADD_GAME_STATE (HELIX_UNPROTECTED, 1)
502 	ADD_GAME_STATE (THRADD_CULTURE, 2)
503 	ADD_GAME_STATE (THRADD_MISSION, 3)
504 			/* 0 if the Thraddash fleet hasn't left the Thraddash home world.
505 			 * 1 if the Thraddash are heading towards Kohr-Ah territory.
506 			 * 2 if the Thraddash are fighting the Kohr-Ah.
507 			 * 3 if the Thraddash are returning from Kohr-Ah territory.
508 			 * 4 if the Thraddash fleet is back at the Thraddash home world.
509 			 */
510 
511 	ADD_GAME_STATE (DRUUGE_VISITS, 3)
512 	ADD_GAME_STATE (DRUUGE_HOME_VISITS, 3)
513 	ADD_GAME_STATE (ROSY_SPHERE, 1)
514 			/* The play has or has had the Rosy Sphere.
515 			 * cf. ROSY_SHERE_ON_SHIP */
516 	ADD_GAME_STATE (SCANNED_MAIDENS, 1)
517 	ADD_GAME_STATE (SCANNED_FRAGMENTS, 1)
518 	ADD_GAME_STATE (SCANNED_CASTER, 1)
519 	ADD_GAME_STATE (SCANNED_SPAWNER, 1)
520 	ADD_GAME_STATE (SCANNED_ULTRON, 1)
521 
522 	ADD_GAME_STATE (ZOQFOT_INFO, 2)
523 	ADD_GAME_STATE (ZOQFOT_HOSTILE, 1)
524 	ADD_GAME_STATE (ZOQFOT_HOME_VISITS, 3)
525 	ADD_GAME_STATE (MET_ZOQFOT, 1)
526 	ADD_GAME_STATE (ZOQFOT_DISTRESS, 2)
527 			/* 0 if the Zoq-Fot-Pik aren't in distress
528 			 * 1 if the Zoq-Fot-Pik are under attack by the Kohr-Ah
529 			 * 2 if the Zoq-Fot-Pik have been destroyed because of this
530 			 *   attack (not by the Kohr-Ah final victory cleansing)
531 			 */
532 
533 	ADD_GAME_STATE (EGG_CASE1_ON_SHIP, 1)
534 	ADD_GAME_STATE (EGG_CASE2_ON_SHIP, 1)
535 	ADD_GAME_STATE (MYCON_SUN_VISITS, 3)
536 	ADD_GAME_STATE (ORZ_HOME_VISITS, 3)
537 
538 	ADD_GAME_STATE (MELNORME_FUEL_PROCEDURE, 1)
539 	ADD_GAME_STATE (MELNORME_TECH_PROCEDURE, 1)
540 	ADD_GAME_STATE (MELNORME_INFO_PROCEDURE, 1)
541 
542 	ADD_GAME_STATE (MELNORME_TECH_STACK, 4)
543 			/* MELNORME_TECH_STACK is now unused */
544 	ADD_GAME_STATE (MELNORME_EVENTS_INFO_STACK, 5)
545 	ADD_GAME_STATE (MELNORME_ALIEN_INFO_STACK, 5)
546 	ADD_GAME_STATE (MELNORME_HISTORY_INFO_STACK, 5)
547 
548 	ADD_GAME_STATE (RAINBOW_WORLD0, 8)
549 			/* Low byte of a bit array, one bit per rainbow world.
550 			 * Each bit is set if the rainbow world has been visited.
551 			 * The lowest bit is for the first star in the star_array
552 			 * with RAINBOW_DEFINED, and so on.
553 			 */
554 	ADD_GAME_STATE (RAINBOW_WORLD1, 2)
555 			/* High 2 bits of the bit array of which RAINBOW_WORLD0
556 			 * is the low byte.
557 			 */
558 	ADD_GAME_STATE (MELNORME_RAINBOW_COUNT, 4)
559 			/* The number of rainbow world locations sold to the Melnorme. */
560 
561 	ADD_GAME_STATE (USED_BROADCASTER, 1)
562 	ADD_GAME_STATE (BROADCASTER_RESPONSE, 1)
563 
564 	ADD_GAME_STATE (IMPROVED_LANDER_SPEED, 1)
565 	ADD_GAME_STATE (IMPROVED_LANDER_CARGO, 1)
566 	ADD_GAME_STATE (IMPROVED_LANDER_SHOT, 1)
567 
568 	ADD_GAME_STATE (MET_ORZ_BEFORE, 1)
569 	ADD_GAME_STATE (YEHAT_REBEL_TOLD_PKUNK, 1)
570 	ADD_GAME_STATE (PLAYER_HAD_SEX, 1)
571 	ADD_GAME_STATE (UMGAH_BROADCASTERS_ON_SHIP, 1)
572 
573 	ADD_GAME_STATE (LIGHT_MINERAL_LOAD, 3)
574 	ADD_GAME_STATE (MEDIUM_MINERAL_LOAD, 3)
575 	ADD_GAME_STATE (HEAVY_MINERAL_LOAD, 3)
576 
577 	ADD_GAME_STATE (STARBASE_BULLETS0, 8)
578 	ADD_GAME_STATE (STARBASE_BULLETS1, 8)
579 	ADD_GAME_STATE (STARBASE_BULLETS2, 8)
580 	ADD_GAME_STATE (STARBASE_BULLETS3, 8)
581 
582 	ADD_GAME_STATE (STARBASE_MONTH, 4)
583 	ADD_GAME_STATE (STARBASE_DAY, 5)
584 
585 	ADD_GAME_STATE (CREW_SOLD_TO_DRUUGE0, 8)
586 	ADD_GAME_STATE (CREW_PURCHASED0, 8)
587 	ADD_GAME_STATE (CREW_PURCHASED1, 8)
588 
589 	ADD_GAME_STATE (URQUAN_PROTECTING_SAMATRA, 1)
590 
591 #define THRADDASH_BODY_THRESHOLD 25
592 	ADD_GAME_STATE (THRADDASH_BODY_COUNT, 5)
593 
594 	ADD_GAME_STATE (UTWIG_SUPOX_MISSION, 3)
595 			/* 0 if the Utwig and Supox fleet haven't left their home world.
596 			 * 1 if the U&S are on their way towards the Kohr-Ah
597 			 * 2 if the U&S are fighting the Kohr-Ah (first 80 days)
598 			 * 3 does not occur
599              * 4 if the U&S are fighting the Kohr-Ah (second 80 days)
600 			 * 5 if the U&S are returning home.
601 			 * 6 if the U&S are back at their home world.
602 			 */
603 	ADD_GAME_STATE (SPATHI_INFO, 3)
604 
605 	ADD_GAME_STATE (ILWRATH_INFO, 2)
606 	ADD_GAME_STATE (ILWRATH_GODS_SPOKEN, 4)
607 	ADD_GAME_STATE (ILWRATH_WORSHIP, 2)
608 	ADD_GAME_STATE (ILWRATH_FIGHT_THRADDASH, 1)
609 
610 	ADD_GAME_STATE (READY_TO_CONFUSE_URQUAN, 1)
611 	ADD_GAME_STATE (URQUAN_HYPNO_VISITS, 1)
612 	ADD_GAME_STATE (MENTIONED_PET_COMPULSION, 1)
613 	ADD_GAME_STATE (URQUAN_INFO, 2)
614 	ADD_GAME_STATE (KNOW_URQUAN_STORY, 2)
615 
616 	ADD_GAME_STATE (MYCON_INFO, 4)
617 	ADD_GAME_STATE (MYCON_RAMBLE, 5)
618 	ADD_GAME_STATE (KNOW_ABOUT_SHATTERED, 2)
619 			/* 0 if the player doesn't known about shattered worlds
620 			 * 1 if the player has encountered a shattered world
621 			 * 2 if the player knows that shatterred worlds are caused
622 			 *   by Mycon deep children.
623 			 * 3 if the player has told the Syreen that Mycon Deep Children
624 			 *   cause shattered worlds. Proof doesn't have to be presented
625 			 *   yet at this time.
626 			 */
627 	ADD_GAME_STATE (MYCON_INSULTS, 3)
628 	ADD_GAME_STATE (MYCON_KNOW_AMBUSH, 1)
629 			/* Set to 1 when the Mycon have been butchered at Organon,
630 			 * just before the remaining Mycon head back home.
631 			 */
632 
633 	ADD_GAME_STATE (SYREEN_INFO, 2)
634 	ADD_GAME_STATE (KNOW_SYREEN_WORLD_SHATTERED, 1)
635 	ADD_GAME_STATE (SYREEN_KNOW_ABOUT_MYCON, 1)
636 
637 	ADD_GAME_STATE (TALKING_PET_INFO, 3)
638 	ADD_GAME_STATE (TALKING_PET_SUGGESTIONS, 3)
639 	ADD_GAME_STATE (LEARNED_TALKING_PET, 1)
640 	ADD_GAME_STATE (DNYARRI_LIED, 1)
641 			/* Set when the Talking Pet tells you his version of their
642 			 * race's history with the Ur-Quan.
643 			 * Cleared once you confront him about this lie.
644 			 */
645 	ADD_GAME_STATE (SHIP_TO_COMPEL, 1)
646 
647 	ADD_GAME_STATE (ORZ_GENERAL_INFO, 2)
648 	ADD_GAME_STATE (ORZ_PERSONAL_INFO, 3)
649 	ADD_GAME_STATE (ORZ_ANDRO_STATE, 2)
650 	ADD_GAME_STATE (REFUSED_ORZ_ALLIANCE, 1)
651 
652 	ADD_GAME_STATE (PKUNK_MANNER, 2)
653 			/* 0 not met the Pkunk
654 			 * 1 fought the Pkunk, but relations are still salvagable.
655 			 * 2 hostile relations with the Pkunk, no way back.
656 			 * 3 friendly relations with the Pkunk
657 			 */
658 	ADD_GAME_STATE (PKUNK_ON_THE_MOVE, 1)
659 	ADD_GAME_STATE (PKUNK_FLEET, 2)
660 	ADD_GAME_STATE (PKUNK_MIGRATE, 2)
661 	ADD_GAME_STATE (PKUNK_RETURN, 1)
662 	ADD_GAME_STATE (PKUNK_WORRY, 2)
663 	ADD_GAME_STATE (PKUNK_INFO, 3)
664 	ADD_GAME_STATE (PKUNK_WAR, 2)
665 	ADD_GAME_STATE (PKUNK_FORTUNE, 3)
666 	ADD_GAME_STATE (PKUNK_MIGRATE_VISITS, 3)
667 	ADD_GAME_STATE (PKUNK_REASONS, 4)
668 	ADD_GAME_STATE (PKUNK_SWITCH, 1)
669 	ADD_GAME_STATE (PKUNK_SENSE_VICTOR, 1)
670 
671 	ADD_GAME_STATE (KOHR_AH_REASONS, 2)
672 	ADD_GAME_STATE (KOHR_AH_PLEAD, 2)
673 	ADD_GAME_STATE (KOHR_AH_INFO, 2)
674 	ADD_GAME_STATE (KNOW_KOHR_AH_STORY, 2)
675 	ADD_GAME_STATE (KOHR_AH_SENSES_EVIL, 1)
676 	ADD_GAME_STATE (URQUAN_SENSES_EVIL, 1)
677 
678 	ADD_GAME_STATE (SLYLANDRO_PROBE_VISITS, 3)
679 	ADD_GAME_STATE (SLYLANDRO_PROBE_THREAT, 2)
680 	ADD_GAME_STATE (SLYLANDRO_PROBE_WRONG, 2)
681 	ADD_GAME_STATE (SLYLANDRO_PROBE_ID, 2)
682 	ADD_GAME_STATE (SLYLANDRO_PROBE_INFO, 2)
683 	ADD_GAME_STATE (SLYLANDRO_PROBE_EXIT, 2)
684 
685 	ADD_GAME_STATE (UMGAH_HOSTILE, 1)
686 	ADD_GAME_STATE (UMGAH_EVIL_BLOBBIES, 1)
687 	ADD_GAME_STATE (UMGAH_MENTIONED_TRICKS, 2)
688 
689 	ADD_GAME_STATE (BOMB_CARRIER, 1)
690 			/* 0 when the flagship is not in battle, or it doesn't have the
691 			 *   enhanced precursor bomb installed.
692 			 * 1 when the flagship is in battle and the bomb is installed.
693 			 * This determines whether you can flee (if the warp escape unit
694 			 * is installed at all), and whether taking the ship into the
695 			 * Sa-Matra defense structure will trigger the end of the game.
696 			 */
697 
698 	ADD_GAME_STATE (THRADD_MANNER, 1)
699 	ADD_GAME_STATE (THRADD_INTRO, 2)
700 	ADD_GAME_STATE (THRADD_DEMEANOR, 3)
701 	ADD_GAME_STATE (THRADD_INFO, 2)
702 	ADD_GAME_STATE (THRADD_BODY_LEVEL, 2)
703 	ADD_GAME_STATE (THRADD_MISSION_VISITS, 1)
704 	ADD_GAME_STATE (THRADD_STACK_1, 3)
705 	ADD_GAME_STATE (THRADD_HOSTILE_STACK_2, 1)
706 	ADD_GAME_STATE (THRADD_HOSTILE_STACK_3, 1)
707 	ADD_GAME_STATE (THRADD_HOSTILE_STACK_4, 1)
708 	ADD_GAME_STATE (THRADD_HOSTILE_STACK_5, 1)
709 
710 	ADD_GAME_STATE (CHMMR_STACK, 2)
711 
712 	ADD_GAME_STATE (ARILOU_MANNER, 2)
713 	ADD_GAME_STATE (NO_PORTAL_VISITS, 1)
714 	ADD_GAME_STATE (ARILOU_STACK_1, 2)
715 	ADD_GAME_STATE (ARILOU_STACK_2, 1)
716 	ADD_GAME_STATE (ARILOU_STACK_3, 2)
717 	ADD_GAME_STATE (ARILOU_STACK_4, 1)
718 	ADD_GAME_STATE (ARILOU_STACK_5, 2)
719 	ADD_GAME_STATE (ARILOU_INFO, 2)
720 	ADD_GAME_STATE (ARILOU_HINTS, 2)
721 
722 	ADD_GAME_STATE (DRUUGE_MANNER, 1)
723 	ADD_GAME_STATE (DRUUGE_SPACE_INFO, 2)
724 	ADD_GAME_STATE (DRUUGE_HOME_INFO, 2)
725 	ADD_GAME_STATE (DRUUGE_SALVAGE, 1)
726 	ADD_GAME_STATE (KNOW_DRUUGE_SLAVERS, 2)
727 	ADD_GAME_STATE (FRAGMENTS_BOUGHT, 2)
728 
729 	ADD_GAME_STATE (ZEX_STACK_1, 2)
730 	ADD_GAME_STATE (ZEX_STACK_2, 2)
731 	ADD_GAME_STATE (ZEX_STACK_3, 2)
732 
733 	ADD_GAME_STATE (VUX_INFO, 2)
734 	ADD_GAME_STATE (VUX_STACK_1, 4)
735 	ADD_GAME_STATE (VUX_STACK_2, 2)
736 	ADD_GAME_STATE (VUX_STACK_3, 2)
737 	ADD_GAME_STATE (VUX_STACK_4, 2)
738 
739 	ADD_GAME_STATE (SHOFIXTI_STACK4, 2)
740 
741 	ADD_GAME_STATE (YEHAT_REBEL_INFO, 3)
742 	ADD_GAME_STATE (YEHAT_ROYALIST_INFO, 1)
743 	ADD_GAME_STATE (YEHAT_ROYALIST_TOLD_PKUNK, 1)
744 	ADD_GAME_STATE (NO_YEHAT_ALLY_HOME, 1)
745 	ADD_GAME_STATE (NO_YEHAT_HELP_HOME, 1)
746 	ADD_GAME_STATE (NO_YEHAT_INFO, 1)
747 	ADD_GAME_STATE (NO_YEHAT_ALLY_SPACE, 2)
748 	ADD_GAME_STATE (NO_YEHAT_HELP_SPACE, 2)
749 
750 	ADD_GAME_STATE (ZOQFOT_KNOW_MASK, 4)
751 
752 	ADD_GAME_STATE (SUPOX_HOSTILE, 1)
753 	ADD_GAME_STATE (SUPOX_INFO, 1)
754 	ADD_GAME_STATE (SUPOX_WAR_NEWS, 2)
755 	ADD_GAME_STATE (SUPOX_ULTRON_HELP, 1)
756 	ADD_GAME_STATE (SUPOX_STACK1, 3)
757 	ADD_GAME_STATE (SUPOX_STACK2, 2)
758 
759 	ADD_GAME_STATE (UTWIG_HOSTILE, 1)
760 	ADD_GAME_STATE (UTWIG_INFO, 1)
761 	ADD_GAME_STATE (UTWIG_WAR_NEWS, 2)
762 	ADD_GAME_STATE (UTWIG_STACK1, 3)
763 	ADD_GAME_STATE (UTWIG_STACK2, 2)
764 	ADD_GAME_STATE (BOMB_INFO, 1)
765 	ADD_GAME_STATE (BOMB_STACK1, 2)
766 	ADD_GAME_STATE (BOMB_STACK2, 2)
767 
768 	ADD_GAME_STATE (SLYLANDRO_KNOW_BROKEN, 1)
769 	ADD_GAME_STATE (PLAYER_KNOWS_PROBE, 1)
770 	ADD_GAME_STATE (PLAYER_KNOWS_PROGRAM, 1)
771 	ADD_GAME_STATE (PLAYER_KNOWS_EFFECTS, 1)
772 	ADD_GAME_STATE (PLAYER_KNOWS_PRIORITY, 1)
773 	ADD_GAME_STATE (SLYLANDRO_STACK1, 3)
774 	ADD_GAME_STATE (SLYLANDRO_STACK2, 1)
775 	ADD_GAME_STATE (SLYLANDRO_STACK3, 2)
776 	ADD_GAME_STATE (SLYLANDRO_STACK4, 2)
777 	ADD_GAME_STATE (SLYLANDRO_STACK5, 1)
778 	ADD_GAME_STATE (SLYLANDRO_STACK6, 1)
779 	ADD_GAME_STATE (SLYLANDRO_STACK7, 2)
780 	ADD_GAME_STATE (SLYLANDRO_STACK8, 2)
781 	ADD_GAME_STATE (SLYLANDRO_STACK9, 2)
782 	ADD_GAME_STATE (SLYLANDRO_KNOW_EARTH, 1)
783 	ADD_GAME_STATE (SLYLANDRO_KNOW_EXPLORE, 1)
784 	ADD_GAME_STATE (SLYLANDRO_KNOW_GATHER, 1)
785 	ADD_GAME_STATE (SLYLANDRO_KNOW_URQUAN, 2)
786 	ADD_GAME_STATE (RECALL_VISITS, 2)
787 
788 	ADD_GAME_STATE (SLYLANDRO_MULTIPLIER, 3)
789 	ADD_GAME_STATE (KNOW_SPATHI_QUEST, 1)
790 	ADD_GAME_STATE (KNOW_SPATHI_EVIL, 1)
791 
792 	ADD_GAME_STATE (BATTLE_PLANET, 8)
793 	ADD_GAME_STATE (ESCAPE_COUNTER, 8)
794 
795 	ADD_GAME_STATE (CREW_SOLD_TO_DRUUGE1, 8)
796 	ADD_GAME_STATE (PKUNK_DONE_WAR, 1)
797 
798 	ADD_GAME_STATE (SYREEN_STACK0, 2)
799 	ADD_GAME_STATE (SYREEN_STACK1, 2)
800 	ADD_GAME_STATE (SYREEN_STACK2, 2)
801 
802 	ADD_GAME_STATE (REFUSED_ULTRON_AT_BOMB, 1)
803 	ADD_GAME_STATE (NO_TRICK_AT_SUN, 1)
804 
805 	ADD_GAME_STATE (SPATHI_STACK0, 2)
806 	ADD_GAME_STATE (SPATHI_STACK1, 1)
807 	ADD_GAME_STATE (SPATHI_STACK2, 1)
808 
809 	ADD_GAME_STATE (ORZ_STACK0, 1)
810 	ADD_GAME_STATE (ORZ_STACK1, 1)
811 
812 /* These state bits are actually offsets into defgrp.dat. They really
813  * shouldn't be part of the serialized Game State array! --MCM */
814 	ADD_GAME_STATE (SHOFIXTI_GRPOFFS0, 8)
815 	ADD_GAME_STATE (SHOFIXTI_GRPOFFS1, 8)
816 	ADD_GAME_STATE (SHOFIXTI_GRPOFFS2, 8)
817 	ADD_GAME_STATE (SHOFIXTI_GRPOFFS3, 8)
818 
819 	ADD_GAME_STATE (ZOQFOT_GRPOFFS0, 8)
820 	ADD_GAME_STATE (ZOQFOT_GRPOFFS1, 8)
821 	ADD_GAME_STATE (ZOQFOT_GRPOFFS2, 8)
822 	ADD_GAME_STATE (ZOQFOT_GRPOFFS3, 8)
823 
824 	ADD_GAME_STATE (MELNORME0_GRPOFFS0, 8)
825 	ADD_GAME_STATE (MELNORME0_GRPOFFS1, 8)
826 	ADD_GAME_STATE (MELNORME0_GRPOFFS2, 8)
827 	ADD_GAME_STATE (MELNORME0_GRPOFFS3, 8)
828 
829 	ADD_GAME_STATE (MELNORME1_GRPOFFS0, 8)
830 	ADD_GAME_STATE (MELNORME1_GRPOFFS1, 8)
831 	ADD_GAME_STATE (MELNORME1_GRPOFFS2, 8)
832 	ADD_GAME_STATE (MELNORME1_GRPOFFS3, 8)
833 
834 	ADD_GAME_STATE (MELNORME2_GRPOFFS0, 8)
835 	ADD_GAME_STATE (MELNORME2_GRPOFFS1, 8)
836 	ADD_GAME_STATE (MELNORME2_GRPOFFS2, 8)
837 	ADD_GAME_STATE (MELNORME2_GRPOFFS3, 8)
838 
839 	ADD_GAME_STATE (MELNORME3_GRPOFFS0, 8)
840 	ADD_GAME_STATE (MELNORME3_GRPOFFS1, 8)
841 	ADD_GAME_STATE (MELNORME3_GRPOFFS2, 8)
842 	ADD_GAME_STATE (MELNORME3_GRPOFFS3, 8)
843 
844 	ADD_GAME_STATE (MELNORME4_GRPOFFS0, 8)
845 	ADD_GAME_STATE (MELNORME4_GRPOFFS1, 8)
846 	ADD_GAME_STATE (MELNORME4_GRPOFFS2, 8)
847 	ADD_GAME_STATE (MELNORME4_GRPOFFS3, 8)
848 
849 	ADD_GAME_STATE (MELNORME5_GRPOFFS0, 8)
850 	ADD_GAME_STATE (MELNORME5_GRPOFFS1, 8)
851 	ADD_GAME_STATE (MELNORME5_GRPOFFS2, 8)
852 	ADD_GAME_STATE (MELNORME5_GRPOFFS3, 8)
853 
854 	ADD_GAME_STATE (MELNORME6_GRPOFFS0, 8)
855 	ADD_GAME_STATE (MELNORME6_GRPOFFS1, 8)
856 	ADD_GAME_STATE (MELNORME6_GRPOFFS2, 8)
857 	ADD_GAME_STATE (MELNORME6_GRPOFFS3, 8)
858 
859 	ADD_GAME_STATE (MELNORME7_GRPOFFS0, 8)
860 	ADD_GAME_STATE (MELNORME7_GRPOFFS1, 8)
861 	ADD_GAME_STATE (MELNORME7_GRPOFFS2, 8)
862 	ADD_GAME_STATE (MELNORME7_GRPOFFS3, 8)
863 
864 	ADD_GAME_STATE (MELNORME8_GRPOFFS0, 8)
865 	ADD_GAME_STATE (MELNORME8_GRPOFFS1, 8)
866 	ADD_GAME_STATE (MELNORME8_GRPOFFS2, 8)
867 	ADD_GAME_STATE (MELNORME8_GRPOFFS3, 8)
868 
869 	ADD_GAME_STATE (URQUAN_PROBE_GRPOFFS0, 8)
870 	ADD_GAME_STATE (URQUAN_PROBE_GRPOFFS1, 8)
871 	ADD_GAME_STATE (URQUAN_PROBE_GRPOFFS2, 8)
872 	ADD_GAME_STATE (URQUAN_PROBE_GRPOFFS3, 8)
873 
874 	ADD_GAME_STATE (COLONY_GRPOFFS0, 8)
875 	ADD_GAME_STATE (COLONY_GRPOFFS1, 8)
876 	ADD_GAME_STATE (COLONY_GRPOFFS2, 8)
877 	ADD_GAME_STATE (COLONY_GRPOFFS3, 8)
878 
879 	ADD_GAME_STATE (SAMATRA_GRPOFFS0, 8)
880 	ADD_GAME_STATE (SAMATRA_GRPOFFS1, 8)
881 	ADD_GAME_STATE (SAMATRA_GRPOFFS2, 8)
882 	ADD_GAME_STATE (SAMATRA_GRPOFFS3, 8)
883 
884 END_GAME_STATE
885 
886 // Values for GAME_STATE.glob_flags:
887 #define COMBAT_SPEED_SHIFT 6
888 #define COMBAT_SPEED_MASK (((1 << 2) - 1) << COMBAT_SPEED_SHIFT)
889 #define NUM_COMBAT_SPEEDS 4
890 #define MUSIC_DISABLED (1 << 3)
891 #define SOUND_DISABLED (1 << 4)
892 #define CYBORG_ENABLED (1 << 5)
893 
894 enum
895 {
896 	SUPER_MELEE = 0, /* Is also used while in the main menu */
897 	IN_LAST_BATTLE,
898 	IN_ENCOUNTER,
899 	IN_HYPERSPACE /* in HyperSpace or QuasiSpace */,
900 	IN_INTERPLANETARY,
901 	WON_LAST_BATTLE,
902 
903 	/* The following three are only used when displaying save game
904 	 * summaries */
905 	IN_QUASISPACE,
906 	IN_PLANET_ORBIT,
907 	IN_STARBASE,
908 
909 	CHECK_PAUSE = MAKE_WORD (0, (1 << 0)),
910 	IN_BATTLE = MAKE_WORD (0, (1 << 1)),
911 			/* Is also set while in HyperSpace/QuasiSpace */
912 	START_ENCOUNTER = MAKE_WORD (0, (1 << 2)),
913 	START_INTERPLANETARY = MAKE_WORD (0, (1 << 3)),
914 	CHECK_LOAD = MAKE_WORD (0, (1 << 4)),
915 	CHECK_RESTART = MAKE_WORD (0, (1 << 5)),
916 	CHECK_ABORT = MAKE_WORD (0, (1 << 6)),
917 };
918 typedef UWORD ACTIVITY;
919 
920 typedef struct
921 {
922 	BYTE glob_flags;
923 			// See above for the meaning of the bits.
924 
925 	BYTE CrewCost, FuelCost;
926 	BYTE ModuleCost[NUM_MODULES];
927 	BYTE ElementWorth[NUM_ELEMENT_CATEGORIES];
928 
929 	PRIMITIVE *DisplayArray;
930 	ACTIVITY CurrentActivity;
931 
932 	CLOCK_STATE GameClock;
933 
934 	POINT autopilot;
935 	POINT ip_location;
936 	STAMP ShipStamp;
937 	UWORD ShipFacing;
938 	BYTE ip_planet;
939 	BYTE in_orbit;
940 	VELOCITY_DESC velocity;
941 
942 	DWORD BattleGroupRef;
943 	QUEUE avail_race_q;
944 			/* List of all the races in the game with information
945 			 * about their ships, and what player knows about their
946 			 * fleet, center of SoI, status, etc.
947 			 * queue element is FLEET_INFO */
948 	QUEUE npc_built_ship_q;
949 			/* Non-player-character list of ships (during encounter)
950 			 * queue element is SHIP_FRAGMENT */
951 	QUEUE ip_group_q;
952 			/* List of groups present in solarsys (during IP);
953 			 * queue element is IP_GROUP */
954 	QUEUE encounter_q;
955 			/* List of HyperSpace encounters (black globes);
956 			 * queue element is ENCOUNTER */
957 	QUEUE built_ship_q;
958 			/* List of SIS escort ships;
959 			 * queue element is SHIP_FRAGMENT */
960 
961 	BYTE GameState[(NUM_GAME_STATE_BITS + 7) >> 3];
962 } GAME_STATE;
963 
964 typedef struct
965 {
966 	SIS_STATE SIS_state;
967 	GAME_STATE Game_state;
968 } GLOBDATA;
969 
970 extern GLOBDATA GlobData;
971 #define GLOBAL(f) GlobData.Game_state.f
972 #define GLOBAL_SIS(f) GlobData.SIS_state.f
973 
974 #define MAX_ENCOUNTERS  16
975 #define MAX_BATTLE_GROUPS 32
976 
977 /* DEFGRP enumeration. These identify scripted TrueSpace encounters
978  * more consistently than offsets into the DEFGRPINFO_FILE state
979  * file. */
980 enum {
981 	DEFGRP_NONE,
982 	DEFGRP_SHOFIXTI,
983 	DEFGRP_ZOQFOT,
984 	DEFGRP_MELNORME0,
985 	DEFGRP_MELNORME1,
986 	DEFGRP_MELNORME2,
987 	DEFGRP_MELNORME3,
988 	DEFGRP_MELNORME4,
989 	DEFGRP_MELNORME5,
990 	DEFGRP_MELNORME6,
991 	DEFGRP_MELNORME7,
992 	DEFGRP_MELNORME8,
993 	DEFGRP_URQUAN_PROBE,
994 	DEFGRP_COLONY,
995 	DEFGRP_SAMATRA,
996 	NUM_DEFGRPS
997 };
998 
999 //#define STATE_DEBUG
1000 
1001 extern BYTE getGameState (BYTE *state, int startBit, int endBit);
1002 extern void setGameState (BYTE *state, int startBit, int endBit, BYTE val
1003 #ifdef STATE_DEBUG
1004 		, const char *name
1005 #endif
1006 		);
1007 extern void copyGameState (BYTE *dest, DWORD target, BYTE *src, DWORD begin, DWORD end);
1008 
1009 #define GET_GAME_STATE(SName) getGameState (GLOBAL(GameState), (SName), (END_##SName))
1010 #ifdef STATE_DEBUG
1011 #	define SET_GAME_STATE(SName, val) \
1012 			setGameState (GLOBAL(GameState), (SName), (END_##SName), (val), #SName)
1013 #else
1014 #	define SET_GAME_STATE(SName, val) \
1015 			setGameState (GLOBAL(GameState), (SName), (END_##SName), (val))
1016 #endif
1017 
1018 extern DWORD getGameState32 (BYTE *state, int startBit);
1019 extern void setGameState32 (BYTE *state, int startBit, DWORD val
1020 #ifdef STATE_DEBUG
1021 		, const char *name
1022 #endif
1023 		);
1024 
1025 #define GET_GAME_STATE_32(SName) getGameState32 (GLOBAL(GameState), (SName))
1026 #ifdef STATE_DEBUG
1027 #	define SET_GAME_STATE_32(SName, val) \
1028 			setGameState32 (GLOBAL(GameState), (SName), (val), #SName)
1029 #else
1030 #	define SET_GAME_STATE_32(SName, val) \
1031 			setGameState32 (GLOBAL(GameState), (SName), (val))
1032 #endif
1033 
1034 
1035 extern CONTEXT RadarContext;
1036 
1037 extern void FreeSC2Data (void);
1038 extern BOOLEAN LoadSC2Data (void);
1039 
1040 extern void InitGlobData (void);
1041 
1042 BOOLEAN inFullGame (void);
1043 BOOLEAN inSuperMelee (void);
1044 //BOOLEAN inBattle (void);
1045 //BOOLEAN inInterPlanetary (void);
1046 //BOOLEAN inSolarSystem (void);
1047 //BOOLEAN inOrbit (void);
1048 BOOLEAN inHQSpace (void);
1049 BOOLEAN inHyperSpace (void);
1050 BOOLEAN inQuasiSpace (void);
1051 
1052 extern BOOLEAN InitGameStructures (void);
1053 extern void UninitGameStructures (void);
1054 
1055 #if defined(__cplusplus)
1056 }
1057 #endif
1058 
1059 #endif /* UQM_GLOBDATA_H_ */
1060