From 7f6002caba3f0a6749820c2772161caf55b8d267 Mon Sep 17 00:00:00 2001 From: neonloop Date: Fri, 7 May 2021 20:00:12 +0000 Subject: Initial commit (uqm-0.8.0) --- src/uqm/globdata.h | 1059 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1059 insertions(+) create mode 100644 src/uqm/globdata.h (limited to 'src/uqm/globdata.h') diff --git a/src/uqm/globdata.h b/src/uqm/globdata.h new file mode 100644 index 0000000..216cadf --- /dev/null +++ b/src/uqm/globdata.h @@ -0,0 +1,1059 @@ +//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_ */ -- cgit v1.2.3