//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_GLOBDATA_H_
#define UQM_GLOBDATA_H_

#include "clock.h"
#include "libs/gfxlib.h"
#include "libs/reslib.h"
#include "libs/sndlib.h"
#include "sis.h"
#include "velocity.h"
#include "commanim.h"

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


// general numbers-speech generator info
// should accomodate most common base-10 languages
// many languages require various plural forms
// for digit names like "hundred"
// possibly needs reworking for others
typedef struct
{
	// an array of these structs must be in ascending remainder order
	// terminate the array with Divider == 0

	// digit divider, i.e. 1, 10, 100, etc.
	int Divider;
	// maximum remainder for this name
	// name will be used if Number % Divider <= MaxRemainder
	int MaxRemainder;
	// string table index for this name
	// i.e. "hundred" in English
	COUNT StrIndex;
} SPEECH_DIGITNAME;

typedef struct
{
	// digit divider, i.e. 1, 10, 100, etc.
	int Divider;
	// digit sub, i.e. 10 for teens
	// subtracted from the value to get an index into StrDigits
	int Subtrahend;
	// ptr to 10 indices for this digit
	// index is string table ptr when > 0
	//       is invalid (should not happen) or
	//       is a a 'skip digit' indicator when == 0 
	// StrDigits can be NULL, in which case
	// the value is interpreted recursively
	COUNT *StrDigits;
	// digit Names, can be NULL, in which case
	// CommonNameIndex is used
	SPEECH_DIGITNAME *Names;
	// common digit name string table index
	// i.e. "hundred" in English
	COUNT CommonNameIndex;
} SPEECH_DIGIT;

// this accomodates up to "billions" in english
#define MAX_SPEECH_DIGITS 7

typedef struct
{
	// slots used in Digits array
	COUNT NumDigits;
	// slots for each digit in numbers
	// teens is exception
	// 0-9, 10-19, ..20-90, ..100-900, etc.
	SPEECH_DIGIT Digits[MAX_SPEECH_DIGITS];
} NUMBER_SPEECH_DESC;
typedef const NUMBER_SPEECH_DESC *NUMBER_SPEECH;

typedef DWORD LDAS_FLAGS;
#define LDASF_NONE           ((LDAS_FLAGS)      0 )
#define LDASF_USE_ALTERNATE  ((LDAS_FLAGS)(1 << 0))

typedef struct
{
	void (*init_encounter_func) (void);
			/* Called when entering communications */
	void (*post_encounter_func) (void);
			/* Called when leaving communications or combat normally */
	COUNT (*uninit_encounter_func) (void);
			/* Called when encounter is done for cleanup */

	RESOURCE AlienFrameRes;
	RESOURCE AlienFontRes;
	Color AlienTextFColor, AlienTextBColor;
	POINT AlienTextBaseline;
	COUNT AlienTextWidth;
	TEXT_ALIGN AlienTextAlign;
	TEXT_VALIGN AlienTextValign;
	RESOURCE AlienColorMapRes;
	RESOURCE AlienSongRes;
	RESOURCE AlienAltSongRes;
	LDAS_FLAGS AlienSongFlags;

	RESOURCE ConversationPhrasesRes;

	COUNT NumAnimations;
	ANIMATION_DESC AlienAmbientArray[MAX_ANIMATIONS];

	// Transition animation to/from talking state;
	// the first frame is neutral (sort of like YOYO_ANIM)
	ANIMATION_DESC AlienTransitionDesc;
	// Talking animation, like RANDOM_ANIM, except random frames
	// always alternate with a neutral frame;
	// the first frame is neutral
	ANIMATION_DESC AlienTalkDesc;

	NUMBER_SPEECH AlienNumberSpeech;

	FRAME AlienFrame;
	FONT AlienFont;
	COLORMAP AlienColorMap;
	MUSIC_REF AlienSong;
	STRING ConversationPhrases;
	
} LOCDATA;

enum
{
	PORTAL_SPAWNER_DEVICE = 0,
	TALKING_PET_DEVICE,
	UTWIG_BOMB_DEVICE,
	SUN_EFFICIENCY_DEVICE,
	ROSY_SPHERE_DEVICE,
	AQUA_HELIX_DEVICE,
	CLEAR_SPINDLE_DEVICE,
	ULTRON_0_DEVICE,
	ULTRON_1_DEVICE,
	ULTRON_2_DEVICE,
	ULTRON_3_DEVICE,
	MAIDENS_DEVICE,
	UMGAH_HYPERWAVE_DEVICE,
	BURVIX_HYPERWAVE_DEVICE,
	DATA_PLATE_1_DEVICE,
	DATA_PLATE_2_DEVICE,
	DATA_PLATE_3_DEVICE,
	TAALO_PROTECTOR_DEVICE,
	EGG_CASING0_DEVICE,
	EGG_CASING1_DEVICE,
	EGG_CASING2_DEVICE,
	SYREEN_SHUTTLE_DEVICE,
	VUX_BEAST_DEVICE,
	DESTRUCT_CODE_DEVICE,
	URQUAN_WARP_DEVICE,
	ARTIFACT_2_DEVICE,
	ARTIFACT_3_DEVICE,
	LUNAR_BASE_DEVICE,

	NUM_DEVICES
};

#define YEARS_TO_KOHRAH_VICTORY 4

#define START_GAME_STATE enum {
#define ADD_GAME_STATE(SName,NumBits) SName, END_##SName = SName + NumBits - 1,
#define END_GAME_STATE NUM_GAME_STATE_BITS };

START_GAME_STATE
		/* Shofixti states */
	ADD_GAME_STATE (SHOFIXTI_VISITS, 3)
	ADD_GAME_STATE (SHOFIXTI_STACK1, 2)
	ADD_GAME_STATE (SHOFIXTI_STACK2, 3)
	ADD_GAME_STATE (SHOFIXTI_STACK3, 2)
	ADD_GAME_STATE (SHOFIXTI_KIA, 1)
	ADD_GAME_STATE (SHOFIXTI_BRO_KIA, 1)
	ADD_GAME_STATE (SHOFIXTI_RECRUITED, 1)

	ADD_GAME_STATE (SHOFIXTI_MAIDENS, 1) /* Did you find the babes yet? */
	ADD_GAME_STATE (MAIDENS_ON_SHIP, 1)
	ADD_GAME_STATE (BATTLE_SEGUE, 1)
			/* Set to 0 in init_xxx_comm() if communications directly
			 * follows an encounter.
			 * Set to 1 in init_xxx_comm() if the player gets to decide
			 * whether to attack or talk.
			 * Set to 1 in communication when battle follows the
			 * communication. It is still valid when uninit_xxx_comm() gets
			 * called after combat or communication.
			 */
	ADD_GAME_STATE (PLANETARY_LANDING, 1)
	ADD_GAME_STATE (PLANETARY_CHANGE, 1)
			/* Flag set to 1 when the planet information for the current
			 * world is changed since it was last saved to the starinfo.dat
			 * file. Set when picking up bio, mineral, or energy nodes.
			 * When there's no current world, it should be 0.
			 */

		/* Spathi states */
	ADD_GAME_STATE (SPATHI_VISITS, 3)
	ADD_GAME_STATE (SPATHI_HOME_VISITS, 3)
	ADD_GAME_STATE (FOUND_PLUTO_SPATHI, 2)
			/* 0 - Haven't met Fwiffo.
			 * 1 - Met Fwiffo on Pluto, now talking to him.
			 * 2 - Met Fwiffo on Pluto, after dialog.
			 * 3 - Met Fwiffo, and have reported to the Safe Ones on
			 *     the Spathi moon that he was either killed, or that
			 *     you have him on board.
			 */
	ADD_GAME_STATE (SPATHI_SHIELDED_SELVES, 1)
	ADD_GAME_STATE (SPATHI_CREATURES_EXAMINED, 1)
	ADD_GAME_STATE (SPATHI_CREATURES_ELIMINATED, 1)
	ADD_GAME_STATE (UMGAH_BROADCASTERS, 1)
	ADD_GAME_STATE (SPATHI_MANNER, 2)
	ADD_GAME_STATE (SPATHI_QUEST, 1)
	ADD_GAME_STATE (LIED_ABOUT_CREATURES, 2)
	ADD_GAME_STATE (SPATHI_PARTY, 1)
	ADD_GAME_STATE (KNOW_SPATHI_PASSWORD, 1)

	ADD_GAME_STATE (ILWRATH_HOME_VISITS, 3)
	ADD_GAME_STATE (ILWRATH_CHMMR_VISITS, 1)

	ADD_GAME_STATE (ARILOU_SPACE, 1)
			/* 0 if the periodically opening QuasiSpace portal is
			 * closed or closing.
			 * 1 if the periodically opening QuasiSpace portal is
			 * open or opening.
			 */
	ADD_GAME_STATE (ARILOU_SPACE_SIDE, 2)
			/* 0 if in HyperSpace and not just emerged from the periodically
			 * opening QuasiSpace portal.
			 * 1 if in HyperSpace and just emerged from the periodically
			 * QuasiSpace portal (still on the portal).
			 * 2 if in QuasiSpace and just emerged from the periodically
			 * opening portal (still on the portal).
			 * 3 if in QuasiSpace and not just emerged from the
			 * periodically opening portal.
			 */
	ADD_GAME_STATE (ARILOU_SPACE_COUNTER, 4)
			/* Keeps track of how far the periodically opening QuasiSpace
			 * portal is open. (This determines the image)
			 * 0 <= ARILOU_SPACE_COUNTER <= 9
			 * 0 means totally closed.
			 * 9 means completely open.
			 */

	ADD_GAME_STATE (LANDER_SHIELDS, 4)

	ADD_GAME_STATE (MET_MELNORME, 1)
	ADD_GAME_STATE (MELNORME_RESCUE_REFUSED, 1)
	ADD_GAME_STATE (MELNORME_RESCUE_COUNT, 3)
	ADD_GAME_STATE (TRADED_WITH_MELNORME, 1)
	ADD_GAME_STATE (WHY_MELNORME_PURPLE, 1)
	ADD_GAME_STATE (MELNORME_CREDIT0, 8)
	ADD_GAME_STATE (MELNORME_CREDIT1, 8)
	ADD_GAME_STATE (MELNORME_BUSINESS_COUNT, 2)
	ADD_GAME_STATE (MELNORME_YACK_STACK0, 2)
	ADD_GAME_STATE (MELNORME_YACK_STACK1, 2)
	ADD_GAME_STATE (MELNORME_YACK_STACK2, 4)
	ADD_GAME_STATE (MELNORME_YACK_STACK3, 3)
	ADD_GAME_STATE (MELNORME_YACK_STACK4, 2)
	ADD_GAME_STATE (WHY_MELNORME_BLUE, 1)
	ADD_GAME_STATE (MELNORME_ANGER, 2)
	ADD_GAME_STATE (MELNORME_MIFFED_COUNT, 2)
	ADD_GAME_STATE (MELNORME_PISSED_COUNT, 2)
	ADD_GAME_STATE (MELNORME_HATE_COUNT, 2)

	ADD_GAME_STATE (PROBE_MESSAGE_DELIVERED, 1)
	ADD_GAME_STATE (PROBE_ILWRATH_ENCOUNTER, 1)

	ADD_GAME_STATE (STARBASE_AVAILABLE, 1)
	ADD_GAME_STATE (STARBASE_VISITED, 1)
	ADD_GAME_STATE (RADIOACTIVES_PROVIDED, 1)
	ADD_GAME_STATE (LANDERS_LOST, 1)
	ADD_GAME_STATE (GIVEN_FUEL_BEFORE, 1)

	ADD_GAME_STATE (AWARE_OF_SAMATRA, 1)
	ADD_GAME_STATE (YEHAT_CAVALRY_ARRIVED, 1)
	ADD_GAME_STATE (URQUAN_MESSED_UP, 1)

	ADD_GAME_STATE (MOONBASE_DESTROYED, 1)
	ADD_GAME_STATE (WILL_DESTROY_BASE, 1)

	ADD_GAME_STATE (ARTIFACT_2_ON_SHIP, 1)
	ADD_GAME_STATE (ARTIFACT_3_ON_SHIP, 1)

	ADD_GAME_STATE (KOHR_AH_KILLED_ALL, 1)

	ADD_GAME_STATE (STARBASE_YACK_STACK1, 1)

	ADD_GAME_STATE (DISCUSSED_PORTAL_SPAWNER, 1)
	ADD_GAME_STATE (DISCUSSED_TALKING_PET, 1)
	ADD_GAME_STATE (DISCUSSED_UTWIG_BOMB, 1)
	ADD_GAME_STATE (DISCUSSED_SUN_EFFICIENCY, 1)
	ADD_GAME_STATE (DISCUSSED_ROSY_SPHERE, 1)
	ADD_GAME_STATE (DISCUSSED_AQUA_HELIX, 1)
	ADD_GAME_STATE (DISCUSSED_CLEAR_SPINDLE, 1)
	ADD_GAME_STATE (DISCUSSED_ULTRON, 1)
	ADD_GAME_STATE (DISCUSSED_MAIDENS, 1)
	ADD_GAME_STATE (DISCUSSED_UMGAH_HYPERWAVE, 1)
	ADD_GAME_STATE (DISCUSSED_BURVIX_HYPERWAVE, 1)
	ADD_GAME_STATE (SYREEN_WANT_PROOF, 1)
	ADD_GAME_STATE (PLAYER_HAVING_SEX, 1)
	ADD_GAME_STATE (MET_ARILOU, 1)
	ADD_GAME_STATE (DISCUSSED_TAALO_PROTECTOR, 1)
	ADD_GAME_STATE (DISCUSSED_EGG_CASING0, 1)
	ADD_GAME_STATE (DISCUSSED_EGG_CASING1, 1)
	ADD_GAME_STATE (DISCUSSED_EGG_CASING2, 1)
	ADD_GAME_STATE (DISCUSSED_SYREEN_SHUTTLE, 1)
	ADD_GAME_STATE (DISCUSSED_VUX_BEAST, 1)
	ADD_GAME_STATE (DISCUSSED_DESTRUCT_CODE, 1)
	ADD_GAME_STATE (DISCUSSED_URQUAN_WARP, 1)
	ADD_GAME_STATE (DISCUSSED_ARTIFACT_2, 1)
	ADD_GAME_STATE (DISCUSSED_ARTIFACT_3, 1)

	ADD_GAME_STATE (ATTACKED_DRUUGE, 1)

	ADD_GAME_STATE (NEW_ALLIANCE_NAME, 2)

	ADD_GAME_STATE (PORTAL_COUNTER, 4)
			/* Set to 1 when the player opens a QuasiSpace portal.
			 * It will then be increased to 10, at which time
			 * the portal is completely open. (This determines the image).
			 */

	ADD_GAME_STATE (BURVIXESE_BROADCASTERS, 1)
	ADD_GAME_STATE (BURV_BROADCASTERS_ON_SHIP, 1)

	ADD_GAME_STATE (UTWIG_BOMB, 1)
	ADD_GAME_STATE (UTWIG_BOMB_ON_SHIP, 1)

	ADD_GAME_STATE (AQUA_HELIX, 1)
	ADD_GAME_STATE (AQUA_HELIX_ON_SHIP, 1)

	ADD_GAME_STATE (SUN_DEVICE, 1)
	ADD_GAME_STATE (SUN_DEVICE_ON_SHIP, 1)

	ADD_GAME_STATE (TAALO_PROTECTOR, 1)
	ADD_GAME_STATE (TAALO_PROTECTOR_ON_SHIP, 1)

	ADD_GAME_STATE (SHIP_VAULT_UNLOCKED, 1)
	ADD_GAME_STATE (SYREEN_SHUTTLE, 1)

	ADD_GAME_STATE (PORTAL_KEY, 1)
	ADD_GAME_STATE (PORTAL_KEY_ON_SHIP, 1)

	ADD_GAME_STATE (VUX_BEAST, 1)
	ADD_GAME_STATE (VUX_BEAST_ON_SHIP, 1)

	ADD_GAME_STATE (TALKING_PET, 1)
	ADD_GAME_STATE (TALKING_PET_ON_SHIP, 1)

	ADD_GAME_STATE (MOONBASE_ON_SHIP, 1)

	ADD_GAME_STATE (KOHR_AH_FRENZY, 1)
	ADD_GAME_STATE (KOHR_AH_VISITS, 2)
	ADD_GAME_STATE (KOHR_AH_BYES, 1)

	ADD_GAME_STATE (SLYLANDRO_HOME_VISITS, 3)
	ADD_GAME_STATE (DESTRUCT_CODE_ON_SHIP, 1)

	ADD_GAME_STATE (ILWRATH_VISITS, 3)
	ADD_GAME_STATE (ILWRATH_DECEIVED, 1)
	ADD_GAME_STATE (FLAGSHIP_CLOAKED, 1)

	ADD_GAME_STATE (MYCON_VISITS, 3)
	ADD_GAME_STATE (MYCON_HOME_VISITS, 3)
	ADD_GAME_STATE (MYCON_AMBUSH, 1)
	ADD_GAME_STATE (MYCON_FELL_FOR_AMBUSH, 1)
			/* Set to 1 when the Mycon have been told about Organon
			 * and are moving towards it.
			 */

	ADD_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 8)
			/* This state seems to be used to distinguish between different
			 * places where one may have an conversation with an alien.
			 * Like home world, other world, space.
			 * Why this needs 8 bits I don't know. Only specific
			 * combinations of bits seem to be used (0, 1, or all bits).
			 * A closer investigation is desirable. - SvdB
			 * Bit 4 is set when initiating communication with the Ilwrath
			 * 		homeworld by means of a HyperWave Broadcaster.
			 * Bit 5 is set when initiating communication with an Ilwrath
			 * 		ship by means of a HyperWave Broadcaster.
			 * All bits are cleared when communication is over.
			 */

	ADD_GAME_STATE (ORZ_VISITS, 3)
	ADD_GAME_STATE (TAALO_VISITS, 3)
	ADD_GAME_STATE (ORZ_MANNER, 2)

	ADD_GAME_STATE (PROBE_EXHIBITED_BUG, 1)
	ADD_GAME_STATE (CLEAR_SPINDLE_ON_SHIP, 1)

	ADD_GAME_STATE (URQUAN_VISITS, 3)
	ADD_GAME_STATE (PLAYER_HYPNOTIZED, 1)

	ADD_GAME_STATE (VUX_VISITS, 3)
	ADD_GAME_STATE (VUX_HOME_VISITS, 3)
	ADD_GAME_STATE (ZEX_VISITS, 3)
	ADD_GAME_STATE (ZEX_IS_DEAD, 1)
	ADD_GAME_STATE (KNOW_ZEX_WANTS_MONSTER, 1)

	ADD_GAME_STATE (UTWIG_VISITS, 3)
	ADD_GAME_STATE (UTWIG_HOME_VISITS, 3)
	ADD_GAME_STATE (BOMB_VISITS, 3)
	ADD_GAME_STATE (ULTRON_CONDITION, 3)
			/* 0 if the Supox still have the Ultron
			 * 1 if the Captain has the Ultron, completely broken
			 * 2 if the Captain has the Ultron, with 1 fix
			 * 3 if the Captain has the Ultron, with 2 fixes
			 * 4 if the Captain has the Ultron, completely restored
			 * 5 if the Ultron has been returned to the Utwig
			 */
	ADD_GAME_STATE (UTWIG_HAVE_ULTRON, 1)
	ADD_GAME_STATE (BOMB_UNPROTECTED, 1)

	ADD_GAME_STATE (TAALO_UNPROTECTED, 1)

	ADD_GAME_STATE (TALKING_PET_VISITS, 3)
	ADD_GAME_STATE (TALKING_PET_HOME_VISITS, 3)
	ADD_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES, 1)
			/* The Umgah have come under the influence of the Talking Pet */
	ADD_GAME_STATE (KNOW_UMGAH_ZOMBIES, 1)
			/* The Captain is aware that something is up with the Umgah */

	ADD_GAME_STATE (ARILOU_VISITS, 3)
	ADD_GAME_STATE (ARILOU_HOME_VISITS, 3)
	ADD_GAME_STATE (KNOW_ARILOU_WANT_WRECK, 1)
	ADD_GAME_STATE (ARILOU_CHECKED_UMGAH, 2)
	ADD_GAME_STATE (PORTAL_SPAWNER, 1)
	ADD_GAME_STATE (PORTAL_SPAWNER_ON_SHIP, 1)

	ADD_GAME_STATE (UMGAH_VISITS, 3)
	ADD_GAME_STATE (UMGAH_HOME_VISITS, 3)
	ADD_GAME_STATE (MET_NORMAL_UMGAH, 1)

	ADD_GAME_STATE (SYREEN_HOME_VISITS, 3)
	ADD_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP, 1)
	ADD_GAME_STATE (KNOW_SYREEN_VAULT, 1)

	ADD_GAME_STATE (EGG_CASE0_ON_SHIP, 1)
	ADD_GAME_STATE (SUN_DEVICE_UNGUARDED, 1)

	ADD_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1)
			/* The Rosy Sphere is aboard the flagship, i.e. It has been
			 * acquired from the Druuge, but not yet inserted in the broken
			 * Ultron. cf. ROSY_SPHERE */

	ADD_GAME_STATE (CHMMR_HOME_VISITS, 3)
	ADD_GAME_STATE (CHMMR_EMERGING, 1)
	ADD_GAME_STATE (CHMMR_UNLEASHED, 1)
	ADD_GAME_STATE (CHMMR_BOMB_STATE, 2)
			/* 0 - Nothing is known about the Precursor Bomb.
			 * 1 - The captain knows from the Chmmr that some extremely
			 *     powerful weapon is needed to destroy the Sa-Matra.
			 * 2 - Installation of the precursor bomb has started.
			 * 3 - Left the starbase after installation of the Precursor bomb.
			 */

	ADD_GAME_STATE (DRUUGE_DISCLAIMER, 1)

	ADD_GAME_STATE (YEHAT_VISITS, 3)
	ADD_GAME_STATE (YEHAT_REBEL_VISITS, 3)
	ADD_GAME_STATE (YEHAT_HOME_VISITS, 3)
	ADD_GAME_STATE (YEHAT_CIVIL_WAR, 1)
	ADD_GAME_STATE (YEHAT_ABSORBED_PKUNK, 1)
	ADD_GAME_STATE (YEHAT_SHIP_MONTH, 4)
	ADD_GAME_STATE (YEHAT_SHIP_DAY, 5)
	ADD_GAME_STATE (YEHAT_SHIP_YEAR, 5)

	ADD_GAME_STATE (CLEAR_SPINDLE, 1)
	ADD_GAME_STATE (PKUNK_VISITS, 3)
	ADD_GAME_STATE (PKUNK_HOME_VISITS, 3)
	ADD_GAME_STATE (PKUNK_SHIP_MONTH, 4)
			/* The month in PKUNK_SHIP_YEAR that new ships are available
			 * from the Pkunk. */
	ADD_GAME_STATE (PKUNK_SHIP_DAY, 5)
			/* The day of the month in PKUNK_SHIP_MONTH in PKUNK_SHIP_YEAR
			 * that new ships are available. */
	ADD_GAME_STATE (PKUNK_SHIP_YEAR, 5)
			/* The year that new ships are available from the Pkunk
			 * (stored as an offset from the year the game starts). */
	ADD_GAME_STATE (PKUNK_MISSION, 3)

	ADD_GAME_STATE (SUPOX_VISITS, 3)
	ADD_GAME_STATE (SUPOX_HOME_VISITS, 3)

	ADD_GAME_STATE (THRADD_VISITS, 3)
	ADD_GAME_STATE (THRADD_HOME_VISITS, 3)
	ADD_GAME_STATE (HELIX_VISITS, 3)
	ADD_GAME_STATE (HELIX_UNPROTECTED, 1)
	ADD_GAME_STATE (THRADD_CULTURE, 2)
	ADD_GAME_STATE (THRADD_MISSION, 3)
			/* 0 if the Thraddash fleet hasn't left the Thraddash home world.
			 * 1 if the Thraddash are heading towards Kohr-Ah territory.
			 * 2 if the Thraddash are fighting the Kohr-Ah.
			 * 3 if the Thraddash are returning from Kohr-Ah territory.
			 * 4 if the Thraddash fleet is back at the Thraddash home world.
			 */

	ADD_GAME_STATE (DRUUGE_VISITS, 3)
	ADD_GAME_STATE (DRUUGE_HOME_VISITS, 3)
	ADD_GAME_STATE (ROSY_SPHERE, 1)
			/* The play has or has had the Rosy Sphere.
			 * cf. ROSY_SHERE_ON_SHIP */
	ADD_GAME_STATE (SCANNED_MAIDENS, 1)
	ADD_GAME_STATE (SCANNED_FRAGMENTS, 1)
	ADD_GAME_STATE (SCANNED_CASTER, 1)
	ADD_GAME_STATE (SCANNED_SPAWNER, 1)
	ADD_GAME_STATE (SCANNED_ULTRON, 1)

	ADD_GAME_STATE (ZOQFOT_INFO, 2)
	ADD_GAME_STATE (ZOQFOT_HOSTILE, 1)
	ADD_GAME_STATE (ZOQFOT_HOME_VISITS, 3)
	ADD_GAME_STATE (MET_ZOQFOT, 1)
	ADD_GAME_STATE (ZOQFOT_DISTRESS, 2)
			/* 0 if the Zoq-Fot-Pik aren't in distress
			 * 1 if the Zoq-Fot-Pik are under attack by the Kohr-Ah
			 * 2 if the Zoq-Fot-Pik have been destroyed because of this
			 *   attack (not by the Kohr-Ah final victory cleansing)
			 */

	ADD_GAME_STATE (EGG_CASE1_ON_SHIP, 1)
	ADD_GAME_STATE (EGG_CASE2_ON_SHIP, 1)
	ADD_GAME_STATE (MYCON_SUN_VISITS, 3)
	ADD_GAME_STATE (ORZ_HOME_VISITS, 3)

	ADD_GAME_STATE (MELNORME_FUEL_PROCEDURE, 1)
	ADD_GAME_STATE (MELNORME_TECH_PROCEDURE, 1)
	ADD_GAME_STATE (MELNORME_INFO_PROCEDURE, 1)

	ADD_GAME_STATE (MELNORME_TECH_STACK, 4)
			/* MELNORME_TECH_STACK is now unused */
	ADD_GAME_STATE (MELNORME_EVENTS_INFO_STACK, 5)
	ADD_GAME_STATE (MELNORME_ALIEN_INFO_STACK, 5)
	ADD_GAME_STATE (MELNORME_HISTORY_INFO_STACK, 5)

	ADD_GAME_STATE (RAINBOW_WORLD0, 8)
			/* Low byte of a bit array, one bit per rainbow world.
			 * Each bit is set if the rainbow world has been visited.
			 * The lowest bit is for the first star in the star_array
			 * with RAINBOW_DEFINED, and so on.
			 */
	ADD_GAME_STATE (RAINBOW_WORLD1, 2)
			/* High 2 bits of the bit array of which RAINBOW_WORLD0
			 * is the low byte.
			 */
	ADD_GAME_STATE (MELNORME_RAINBOW_COUNT, 4)
			/* The number of rainbow world locations sold to the Melnorme. */

	ADD_GAME_STATE (USED_BROADCASTER, 1)
	ADD_GAME_STATE (BROADCASTER_RESPONSE, 1)

	ADD_GAME_STATE (IMPROVED_LANDER_SPEED, 1)
	ADD_GAME_STATE (IMPROVED_LANDER_CARGO, 1)
	ADD_GAME_STATE (IMPROVED_LANDER_SHOT, 1)

	ADD_GAME_STATE (MET_ORZ_BEFORE, 1)
	ADD_GAME_STATE (YEHAT_REBEL_TOLD_PKUNK, 1)
	ADD_GAME_STATE (PLAYER_HAD_SEX, 1)
	ADD_GAME_STATE (UMGAH_BROADCASTERS_ON_SHIP, 1)

	ADD_GAME_STATE (LIGHT_MINERAL_LOAD, 3)
	ADD_GAME_STATE (MEDIUM_MINERAL_LOAD, 3)
	ADD_GAME_STATE (HEAVY_MINERAL_LOAD, 3)

	ADD_GAME_STATE (STARBASE_BULLETS0, 8)
	ADD_GAME_STATE (STARBASE_BULLETS1, 8)
	ADD_GAME_STATE (STARBASE_BULLETS2, 8)
	ADD_GAME_STATE (STARBASE_BULLETS3, 8)

	ADD_GAME_STATE (STARBASE_MONTH, 4)
	ADD_GAME_STATE (STARBASE_DAY, 5)

	ADD_GAME_STATE (CREW_SOLD_TO_DRUUGE0, 8)
	ADD_GAME_STATE (CREW_PURCHASED0, 8)
	ADD_GAME_STATE (CREW_PURCHASED1, 8)

	ADD_GAME_STATE (URQUAN_PROTECTING_SAMATRA, 1)

#define THRADDASH_BODY_THRESHOLD 25
	ADD_GAME_STATE (THRADDASH_BODY_COUNT, 5)

	ADD_GAME_STATE (UTWIG_SUPOX_MISSION, 3)
			/* 0 if the Utwig and Supox fleet haven't left their home world.
			 * 1 if the U&S are on their way towards the Kohr-Ah
			 * 2 if the U&S are fighting the Kohr-Ah (first 80 days)
			 * 3 does not occur
             * 4 if the U&S are fighting the Kohr-Ah (second 80 days)
			 * 5 if the U&S are returning home.
			 * 6 if the U&S are back at their home world.
			 */
	ADD_GAME_STATE (SPATHI_INFO, 3)

	ADD_GAME_STATE (ILWRATH_INFO, 2)
	ADD_GAME_STATE (ILWRATH_GODS_SPOKEN, 4)
	ADD_GAME_STATE (ILWRATH_WORSHIP, 2)
	ADD_GAME_STATE (ILWRATH_FIGHT_THRADDASH, 1)

	ADD_GAME_STATE (READY_TO_CONFUSE_URQUAN, 1)
	ADD_GAME_STATE (URQUAN_HYPNO_VISITS, 1)
	ADD_GAME_STATE (MENTIONED_PET_COMPULSION, 1)
	ADD_GAME_STATE (URQUAN_INFO, 2)
	ADD_GAME_STATE (KNOW_URQUAN_STORY, 2)

	ADD_GAME_STATE (MYCON_INFO, 4)
	ADD_GAME_STATE (MYCON_RAMBLE, 5)
	ADD_GAME_STATE (KNOW_ABOUT_SHATTERED, 2)
			/* 0 if the player doesn't known about shattered worlds
			 * 1 if the player has encountered a shattered world
			 * 2 if the player knows that shatterred worlds are caused
			 *   by Mycon deep children.
			 * 3 if the player has told the Syreen that Mycon Deep Children
			 *   cause shattered worlds. Proof doesn't have to be presented
			 *   yet at this time.
			 */
	ADD_GAME_STATE (MYCON_INSULTS, 3)
	ADD_GAME_STATE (MYCON_KNOW_AMBUSH, 1)
			/* Set to 1 when the Mycon have been butchered at Organon,
			 * just before the remaining Mycon head back home.
			 */

	ADD_GAME_STATE (SYREEN_INFO, 2)
	ADD_GAME_STATE (KNOW_SYREEN_WORLD_SHATTERED, 1)
	ADD_GAME_STATE (SYREEN_KNOW_ABOUT_MYCON, 1)

	ADD_GAME_STATE (TALKING_PET_INFO, 3)
	ADD_GAME_STATE (TALKING_PET_SUGGESTIONS, 3)
	ADD_GAME_STATE (LEARNED_TALKING_PET, 1)
	ADD_GAME_STATE (DNYARRI_LIED, 1)
			/* Set when the Talking Pet tells you his version of their
			 * race's history with the Ur-Quan.
			 * Cleared once you confront him about this lie.
			 */
	ADD_GAME_STATE (SHIP_TO_COMPEL, 1)

	ADD_GAME_STATE (ORZ_GENERAL_INFO, 2)
	ADD_GAME_STATE (ORZ_PERSONAL_INFO, 3)
	ADD_GAME_STATE (ORZ_ANDRO_STATE, 2)
	ADD_GAME_STATE (REFUSED_ORZ_ALLIANCE, 1)

	ADD_GAME_STATE (PKUNK_MANNER, 2)
			/* 0 not met the Pkunk
			 * 1 fought the Pkunk, but relations are still salvagable.
			 * 2 hostile relations with the Pkunk, no way back.
			 * 3 friendly relations with the Pkunk
			 */
	ADD_GAME_STATE (PKUNK_ON_THE_MOVE, 1)
	ADD_GAME_STATE (PKUNK_FLEET, 2)
	ADD_GAME_STATE (PKUNK_MIGRATE, 2)
	ADD_GAME_STATE (PKUNK_RETURN, 1)
	ADD_GAME_STATE (PKUNK_WORRY, 2)
	ADD_GAME_STATE (PKUNK_INFO, 3)
	ADD_GAME_STATE (PKUNK_WAR, 2)
	ADD_GAME_STATE (PKUNK_FORTUNE, 3)
	ADD_GAME_STATE (PKUNK_MIGRATE_VISITS, 3)
	ADD_GAME_STATE (PKUNK_REASONS, 4)
	ADD_GAME_STATE (PKUNK_SWITCH, 1)
	ADD_GAME_STATE (PKUNK_SENSE_VICTOR, 1)

	ADD_GAME_STATE (KOHR_AH_REASONS, 2)
	ADD_GAME_STATE (KOHR_AH_PLEAD, 2)
	ADD_GAME_STATE (KOHR_AH_INFO, 2)
	ADD_GAME_STATE (KNOW_KOHR_AH_STORY, 2)
	ADD_GAME_STATE (KOHR_AH_SENSES_EVIL, 1)
	ADD_GAME_STATE (URQUAN_SENSES_EVIL, 1)

	ADD_GAME_STATE (SLYLANDRO_PROBE_VISITS, 3)
	ADD_GAME_STATE (SLYLANDRO_PROBE_THREAT, 2)
	ADD_GAME_STATE (SLYLANDRO_PROBE_WRONG, 2)
	ADD_GAME_STATE (SLYLANDRO_PROBE_ID, 2)
	ADD_GAME_STATE (SLYLANDRO_PROBE_INFO, 2)
	ADD_GAME_STATE (SLYLANDRO_PROBE_EXIT, 2)

	ADD_GAME_STATE (UMGAH_HOSTILE, 1)
	ADD_GAME_STATE (UMGAH_EVIL_BLOBBIES, 1)
	ADD_GAME_STATE (UMGAH_MENTIONED_TRICKS, 2)

	ADD_GAME_STATE (BOMB_CARRIER, 1)
			/* 0 when the flagship is not in battle, or it doesn't have the
			 *   enhanced precursor bomb installed.
			 * 1 when the flagship is in battle and the bomb is installed.
			 * This determines whether you can flee (if the warp escape unit
			 * is installed at all), and whether taking the ship into the
			 * Sa-Matra defense structure will trigger the end of the game.
			 */
	
	ADD_GAME_STATE (THRADD_MANNER, 1)
	ADD_GAME_STATE (THRADD_INTRO, 2)
	ADD_GAME_STATE (THRADD_DEMEANOR, 3)
	ADD_GAME_STATE (THRADD_INFO, 2)
	ADD_GAME_STATE (THRADD_BODY_LEVEL, 2)
	ADD_GAME_STATE (THRADD_MISSION_VISITS, 1)
	ADD_GAME_STATE (THRADD_STACK_1, 3)
	ADD_GAME_STATE (THRADD_HOSTILE_STACK_2, 1)
	ADD_GAME_STATE (THRADD_HOSTILE_STACK_3, 1)
	ADD_GAME_STATE (THRADD_HOSTILE_STACK_4, 1)
	ADD_GAME_STATE (THRADD_HOSTILE_STACK_5, 1)

	ADD_GAME_STATE (CHMMR_STACK, 2)

	ADD_GAME_STATE (ARILOU_MANNER, 2)
	ADD_GAME_STATE (NO_PORTAL_VISITS, 1)
	ADD_GAME_STATE (ARILOU_STACK_1, 2)
	ADD_GAME_STATE (ARILOU_STACK_2, 1)
	ADD_GAME_STATE (ARILOU_STACK_3, 2)
	ADD_GAME_STATE (ARILOU_STACK_4, 1)
	ADD_GAME_STATE (ARILOU_STACK_5, 2)
	ADD_GAME_STATE (ARILOU_INFO, 2)
	ADD_GAME_STATE (ARILOU_HINTS, 2)

	ADD_GAME_STATE (DRUUGE_MANNER, 1)
	ADD_GAME_STATE (DRUUGE_SPACE_INFO, 2)
	ADD_GAME_STATE (DRUUGE_HOME_INFO, 2)
	ADD_GAME_STATE (DRUUGE_SALVAGE, 1)
	ADD_GAME_STATE (KNOW_DRUUGE_SLAVERS, 2)
	ADD_GAME_STATE (FRAGMENTS_BOUGHT, 2)

	ADD_GAME_STATE (ZEX_STACK_1, 2)
	ADD_GAME_STATE (ZEX_STACK_2, 2)
	ADD_GAME_STATE (ZEX_STACK_3, 2)

	ADD_GAME_STATE (VUX_INFO, 2)
	ADD_GAME_STATE (VUX_STACK_1, 4)
	ADD_GAME_STATE (VUX_STACK_2, 2)
	ADD_GAME_STATE (VUX_STACK_3, 2)
	ADD_GAME_STATE (VUX_STACK_4, 2)

	ADD_GAME_STATE (SHOFIXTI_STACK4, 2)

	ADD_GAME_STATE (YEHAT_REBEL_INFO, 3)
	ADD_GAME_STATE (YEHAT_ROYALIST_INFO, 1)
	ADD_GAME_STATE (YEHAT_ROYALIST_TOLD_PKUNK, 1)
	ADD_GAME_STATE (NO_YEHAT_ALLY_HOME, 1)
	ADD_GAME_STATE (NO_YEHAT_HELP_HOME, 1)
	ADD_GAME_STATE (NO_YEHAT_INFO, 1)
	ADD_GAME_STATE (NO_YEHAT_ALLY_SPACE, 2)
	ADD_GAME_STATE (NO_YEHAT_HELP_SPACE, 2)

	ADD_GAME_STATE (ZOQFOT_KNOW_MASK, 4)

	ADD_GAME_STATE (SUPOX_HOSTILE, 1)
	ADD_GAME_STATE (SUPOX_INFO, 1)
	ADD_GAME_STATE (SUPOX_WAR_NEWS, 2)
	ADD_GAME_STATE (SUPOX_ULTRON_HELP, 1)
	ADD_GAME_STATE (SUPOX_STACK1, 3)
	ADD_GAME_STATE (SUPOX_STACK2, 2)

	ADD_GAME_STATE (UTWIG_HOSTILE, 1)
	ADD_GAME_STATE (UTWIG_INFO, 1)
	ADD_GAME_STATE (UTWIG_WAR_NEWS, 2)
	ADD_GAME_STATE (UTWIG_STACK1, 3)
	ADD_GAME_STATE (UTWIG_STACK2, 2)
	ADD_GAME_STATE (BOMB_INFO, 1)
	ADD_GAME_STATE (BOMB_STACK1, 2)
	ADD_GAME_STATE (BOMB_STACK2, 2)

	ADD_GAME_STATE (SLYLANDRO_KNOW_BROKEN, 1)
	ADD_GAME_STATE (PLAYER_KNOWS_PROBE, 1)
	ADD_GAME_STATE (PLAYER_KNOWS_PROGRAM, 1)
	ADD_GAME_STATE (PLAYER_KNOWS_EFFECTS, 1)
	ADD_GAME_STATE (PLAYER_KNOWS_PRIORITY, 1)
	ADD_GAME_STATE (SLYLANDRO_STACK1, 3)
	ADD_GAME_STATE (SLYLANDRO_STACK2, 1)
	ADD_GAME_STATE (SLYLANDRO_STACK3, 2)
	ADD_GAME_STATE (SLYLANDRO_STACK4, 2)
	ADD_GAME_STATE (SLYLANDRO_STACK5, 1)
	ADD_GAME_STATE (SLYLANDRO_STACK6, 1)
	ADD_GAME_STATE (SLYLANDRO_STACK7, 2)
	ADD_GAME_STATE (SLYLANDRO_STACK8, 2)
	ADD_GAME_STATE (SLYLANDRO_STACK9, 2)
	ADD_GAME_STATE (SLYLANDRO_KNOW_EARTH, 1)
	ADD_GAME_STATE (SLYLANDRO_KNOW_EXPLORE, 1)
	ADD_GAME_STATE (SLYLANDRO_KNOW_GATHER, 1)
	ADD_GAME_STATE (SLYLANDRO_KNOW_URQUAN, 2)
	ADD_GAME_STATE (RECALL_VISITS, 2)

	ADD_GAME_STATE (SLYLANDRO_MULTIPLIER, 3)
	ADD_GAME_STATE (KNOW_SPATHI_QUEST, 1)
	ADD_GAME_STATE (KNOW_SPATHI_EVIL, 1)

	ADD_GAME_STATE (BATTLE_PLANET, 8)
	ADD_GAME_STATE (ESCAPE_COUNTER, 8)

	ADD_GAME_STATE (CREW_SOLD_TO_DRUUGE1, 8)
	ADD_GAME_STATE (PKUNK_DONE_WAR, 1)

	ADD_GAME_STATE (SYREEN_STACK0, 2)
	ADD_GAME_STATE (SYREEN_STACK1, 2)
	ADD_GAME_STATE (SYREEN_STACK2, 2)

	ADD_GAME_STATE (REFUSED_ULTRON_AT_BOMB, 1)
	ADD_GAME_STATE (NO_TRICK_AT_SUN, 1)

	ADD_GAME_STATE (SPATHI_STACK0, 2)
	ADD_GAME_STATE (SPATHI_STACK1, 1)
	ADD_GAME_STATE (SPATHI_STACK2, 1)

	ADD_GAME_STATE (ORZ_STACK0, 1)
	ADD_GAME_STATE (ORZ_STACK1, 1)

/* These state bits are actually offsets into defgrp.dat. They really
 * shouldn't be part of the serialized Game State array! --MCM */
	ADD_GAME_STATE (SHOFIXTI_GRPOFFS0, 8)
	ADD_GAME_STATE (SHOFIXTI_GRPOFFS1, 8)
	ADD_GAME_STATE (SHOFIXTI_GRPOFFS2, 8)
	ADD_GAME_STATE (SHOFIXTI_GRPOFFS3, 8)

	ADD_GAME_STATE (ZOQFOT_GRPOFFS0, 8)
	ADD_GAME_STATE (ZOQFOT_GRPOFFS1, 8)
	ADD_GAME_STATE (ZOQFOT_GRPOFFS2, 8)
	ADD_GAME_STATE (ZOQFOT_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME0_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME0_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME0_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME0_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME1_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME1_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME1_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME1_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME2_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME2_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME2_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME2_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME3_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME3_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME3_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME3_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME4_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME4_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME4_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME4_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME5_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME5_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME5_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME5_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME6_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME6_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME6_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME6_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME7_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME7_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME7_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME7_GRPOFFS3, 8)

	ADD_GAME_STATE (MELNORME8_GRPOFFS0, 8)
	ADD_GAME_STATE (MELNORME8_GRPOFFS1, 8)
	ADD_GAME_STATE (MELNORME8_GRPOFFS2, 8)
	ADD_GAME_STATE (MELNORME8_GRPOFFS3, 8)

	ADD_GAME_STATE (URQUAN_PROBE_GRPOFFS0, 8)
	ADD_GAME_STATE (URQUAN_PROBE_GRPOFFS1, 8)
	ADD_GAME_STATE (URQUAN_PROBE_GRPOFFS2, 8)
	ADD_GAME_STATE (URQUAN_PROBE_GRPOFFS3, 8)

	ADD_GAME_STATE (COLONY_GRPOFFS0, 8)
	ADD_GAME_STATE (COLONY_GRPOFFS1, 8)
	ADD_GAME_STATE (COLONY_GRPOFFS2, 8)
	ADD_GAME_STATE (COLONY_GRPOFFS3, 8)

	ADD_GAME_STATE (SAMATRA_GRPOFFS0, 8)
	ADD_GAME_STATE (SAMATRA_GRPOFFS1, 8)
	ADD_GAME_STATE (SAMATRA_GRPOFFS2, 8)
	ADD_GAME_STATE (SAMATRA_GRPOFFS3, 8)

END_GAME_STATE

// Values for GAME_STATE.glob_flags:
#define COMBAT_SPEED_SHIFT 6
#define COMBAT_SPEED_MASK (((1 << 2) - 1) << COMBAT_SPEED_SHIFT)
#define NUM_COMBAT_SPEEDS 4
#define MUSIC_DISABLED (1 << 3)
#define SOUND_DISABLED (1 << 4)
#define CYBORG_ENABLED (1 << 5)

enum
{
	SUPER_MELEE = 0, /* Is also used while in the main menu */
	IN_LAST_BATTLE,
	IN_ENCOUNTER,
	IN_HYPERSPACE /* in HyperSpace or QuasiSpace */,
	IN_INTERPLANETARY,
	WON_LAST_BATTLE,

	/* The following three are only used when displaying save game
	 * summaries */
	IN_QUASISPACE,
	IN_PLANET_ORBIT,
	IN_STARBASE,

	CHECK_PAUSE = MAKE_WORD (0, (1 << 0)),
	IN_BATTLE = MAKE_WORD (0, (1 << 1)),
			/* Is also set while in HyperSpace/QuasiSpace */
	START_ENCOUNTER = MAKE_WORD (0, (1 << 2)),
	START_INTERPLANETARY = MAKE_WORD (0, (1 << 3)),
	CHECK_LOAD = MAKE_WORD (0, (1 << 4)),
	CHECK_RESTART = MAKE_WORD (0, (1 << 5)),
	CHECK_ABORT = MAKE_WORD (0, (1 << 6)),
};
typedef UWORD ACTIVITY;

typedef struct
{
	BYTE glob_flags;
			// See above for the meaning of the bits.

	BYTE CrewCost, FuelCost;
	BYTE ModuleCost[NUM_MODULES];
	BYTE ElementWorth[NUM_ELEMENT_CATEGORIES];

	PRIMITIVE *DisplayArray;
	ACTIVITY CurrentActivity;

	CLOCK_STATE GameClock;

	POINT autopilot;
	POINT ip_location;
	STAMP ShipStamp;
	UWORD ShipFacing;
	BYTE ip_planet;
	BYTE in_orbit;
	VELOCITY_DESC velocity;

	DWORD BattleGroupRef;
	QUEUE avail_race_q;
			/* List of all the races in the game with information
			 * about their ships, and what player knows about their
			 * fleet, center of SoI, status, etc.
			 * queue element is FLEET_INFO */
	QUEUE npc_built_ship_q;
			/* Non-player-character list of ships (during encounter)
			 * queue element is SHIP_FRAGMENT */
	QUEUE ip_group_q;
			/* List of groups present in solarsys (during IP);
			 * queue element is IP_GROUP */
	QUEUE encounter_q;
			/* List of HyperSpace encounters (black globes);
			 * queue element is ENCOUNTER */
	QUEUE built_ship_q;
			/* List of SIS escort ships;
			 * queue element is SHIP_FRAGMENT */

	BYTE GameState[(NUM_GAME_STATE_BITS + 7) >> 3];
} GAME_STATE;

typedef struct
{
	SIS_STATE SIS_state;
	GAME_STATE Game_state;
} GLOBDATA;

extern GLOBDATA GlobData;
#define GLOBAL(f) GlobData.Game_state.f
#define GLOBAL_SIS(f) GlobData.SIS_state.f

#define MAX_ENCOUNTERS  16
#define MAX_BATTLE_GROUPS 32

/* DEFGRP enumeration. These identify scripted TrueSpace encounters
 * more consistently than offsets into the DEFGRPINFO_FILE state
 * file. */
enum {
	DEFGRP_NONE,
	DEFGRP_SHOFIXTI,
	DEFGRP_ZOQFOT,
	DEFGRP_MELNORME0,
	DEFGRP_MELNORME1,
	DEFGRP_MELNORME2,
	DEFGRP_MELNORME3,
	DEFGRP_MELNORME4,
	DEFGRP_MELNORME5,
	DEFGRP_MELNORME6,
	DEFGRP_MELNORME7,
	DEFGRP_MELNORME8,
	DEFGRP_URQUAN_PROBE,
	DEFGRP_COLONY,
	DEFGRP_SAMATRA,
	NUM_DEFGRPS
};

//#define STATE_DEBUG

extern BYTE getGameState (BYTE *state, int startBit, int endBit);
extern void setGameState (BYTE *state, int startBit, int endBit, BYTE val
#ifdef STATE_DEBUG
		, const char *name
#endif
		);
extern void copyGameState (BYTE *dest, DWORD target, BYTE *src, DWORD begin, DWORD end);

#define GET_GAME_STATE(SName) getGameState (GLOBAL(GameState), (SName), (END_##SName))
#ifdef STATE_DEBUG
#	define SET_GAME_STATE(SName, val) \
			setGameState (GLOBAL(GameState), (SName), (END_##SName), (val), #SName)
#else
#	define SET_GAME_STATE(SName, val) \
			setGameState (GLOBAL(GameState), (SName), (END_##SName), (val))
#endif

extern DWORD getGameState32 (BYTE *state, int startBit);
extern void setGameState32 (BYTE *state, int startBit, DWORD val
#ifdef STATE_DEBUG
		, const char *name
#endif
		);

#define GET_GAME_STATE_32(SName) getGameState32 (GLOBAL(GameState), (SName))
#ifdef STATE_DEBUG
#	define SET_GAME_STATE_32(SName, val) \
			setGameState32 (GLOBAL(GameState), (SName), (val), #SName)
#else
#	define SET_GAME_STATE_32(SName, val) \
			setGameState32 (GLOBAL(GameState), (SName), (val))
#endif

	
extern CONTEXT RadarContext;

extern void FreeSC2Data (void);
extern BOOLEAN LoadSC2Data (void);

extern void InitGlobData (void);

BOOLEAN inFullGame (void);
BOOLEAN inSuperMelee (void);
//BOOLEAN inBattle (void);
//BOOLEAN inInterPlanetary (void);
//BOOLEAN inSolarSystem (void);
//BOOLEAN inOrbit (void);
BOOLEAN inHQSpace (void);
BOOLEAN inHyperSpace (void);
BOOLEAN inQuasiSpace (void);

extern BOOLEAN InitGameStructures (void);
extern void UninitGameStructures (void);

#if defined(__cplusplus)
}
#endif

#endif /* UQM_GLOBDATA_H_ */
