Reorganize the GameState array.

This is preparation work so that when the state files are removed
from the savegame format (or possibly removed entirely) it will
not be a savegame compatibility-breaking change.

Legacy support has been modified so that the GameState bits are
reordered as part of load, so loading legacy saves still works.
This commit is contained in:
Michael Martin
2013-10-13 23:19:13 -07:00
parent 40dcd65afa
commit 60a9ca61cf
3 changed files with 176 additions and 73 deletions
+16
View File
@@ -119,6 +119,22 @@ setGameState32 (BYTE *state, int startBit, DWORD val
#endif #endif
} }
void
copyGameState (BYTE *dest, DWORD target, BYTE *src, DWORD begin, DWORD end)
{
while (begin < end)
{
BYTE b;
DWORD delta = 7;
if (begin + delta > end)
delta = end - begin;
b = getGameState (src, begin, begin + delta);
setGameState (dest, target, target + delta, b);
begin += 8;
target += 8;
}
}
static void static void
CreateRadar (void) CreateRadar (void)
{ {
+97 -70
View File
@@ -255,61 +255,6 @@ START_GAME_STATE
ADD_GAME_STATE (LANDER_SHIELDS, 4) ADD_GAME_STATE (LANDER_SHIELDS, 4)
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 (MET_MELNORME, 1) ADD_GAME_STATE (MET_MELNORME, 1)
ADD_GAME_STATE (MELNORME_RESCUE_REFUSED, 1) ADD_GAME_STATE (MELNORME_RESCUE_REFUSED, 1)
ADD_GAME_STATE (MELNORME_RESCUE_COUNT, 3) ADD_GAME_STATE (MELNORME_RESCUE_COUNT, 3)
@@ -329,10 +274,6 @@ START_GAME_STATE
ADD_GAME_STATE (MELNORME_PISSED_COUNT, 2) ADD_GAME_STATE (MELNORME_PISSED_COUNT, 2)
ADD_GAME_STATE (MELNORME_HATE_COUNT, 2) ADD_GAME_STATE (MELNORME_HATE_COUNT, 2)
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 (PROBE_MESSAGE_DELIVERED, 1) ADD_GAME_STATE (PROBE_MESSAGE_DELIVERED, 1)
ADD_GAME_STATE (PROBE_ILWRATH_ENCOUNTER, 1) ADD_GAME_STATE (PROBE_ILWRATH_ENCOUNTER, 1)
@@ -647,11 +588,6 @@ START_GAME_STATE
ADD_GAME_STATE (URQUAN_PROTECTING_SAMATRA, 1) ADD_GAME_STATE (URQUAN_PROTECTING_SAMATRA, 1)
ADD_GAME_STATE (COLONY_GRPOFFS0, 8)
ADD_GAME_STATE (COLONY_GRPOFFS1, 8)
ADD_GAME_STATE (COLONY_GRPOFFS2, 8)
ADD_GAME_STATE (COLONY_GRPOFFS3, 8)
#define THRADDASH_BODY_THRESHOLD 25 #define THRADDASH_BODY_THRESHOLD 25
ADD_GAME_STATE (THRADDASH_BODY_COUNT, 5) ADD_GAME_STATE (THRADDASH_BODY_COUNT, 5)
@@ -671,11 +607,6 @@ START_GAME_STATE
ADD_GAME_STATE (ILWRATH_WORSHIP, 2) ADD_GAME_STATE (ILWRATH_WORSHIP, 2)
ADD_GAME_STATE (ILWRATH_FIGHT_THRADDASH, 1) ADD_GAME_STATE (ILWRATH_FIGHT_THRADDASH, 1)
ADD_GAME_STATE (SAMATRA_GRPOFFS0, 8)
ADD_GAME_STATE (SAMATRA_GRPOFFS1, 8)
ADD_GAME_STATE (SAMATRA_GRPOFFS2, 8)
ADD_GAME_STATE (SAMATRA_GRPOFFS3, 8)
ADD_GAME_STATE (READY_TO_CONFUSE_URQUAN, 1) ADD_GAME_STATE (READY_TO_CONFUSE_URQUAN, 1)
ADD_GAME_STATE (URQUAN_HYPNO_VISITS, 1) ADD_GAME_STATE (URQUAN_HYPNO_VISITS, 1)
ADD_GAME_STATE (MENTIONED_PET_COMPULSION, 1) ADD_GAME_STATE (MENTIONED_PET_COMPULSION, 1)
@@ -877,6 +808,79 @@ START_GAME_STATE
ADD_GAME_STATE (ORZ_STACK0, 1) ADD_GAME_STATE (ORZ_STACK0, 1)
ADD_GAME_STATE (ORZ_STACK1, 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 END_GAME_STATE
// Values for GAME_STATE.glob_flags: // Values for GAME_STATE.glob_flags:
@@ -970,14 +974,37 @@ extern GLOBDATA GlobData;
#define MAX_ENCOUNTERS 16 #define MAX_ENCOUNTERS 16
#define MAX_BATTLE_GROUPS 32 #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 //#define STATE_DEBUG
extern BYTE getGameState (BYTE *state, int startBit, int endBit); extern BYTE getGameState (BYTE *state, int startBit, int endBit);
extern void setGameState (BYTE *state, int startBit, int endBit, BYTE val extern void setGameState (BYTE *state, int startBit, int endBit, BYTE val
#ifdef STATE_DEBUG #ifdef STATE_DEBUG
, const char *name , const char *name
#endif #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)) #define GET_GAME_STATE(SName) getGameState (GLOBAL(GameState), (SName), (END_##SName))
#ifdef STATE_DEBUG #ifdef STATE_DEBUG
+63 -3
View File
@@ -178,6 +178,66 @@ read_a16 (void *fp, UWORD *ar, COUNT count)
return 1; return 1;
} }
typedef struct struct_GAMESTATE_TRANSPOSE {
int start, end, target;
} GAMESTATE_TRANSPOSE;
#define LEGACY_GAMESTATE_SIZE 155
/* The *_GRPOFFS* states are no longer intermingled with the rest of
* the state. We need to shuffle all the rest of the state data
* down. */
static GAMESTATE_TRANSPOSE transpose[] = {
{ 0, 51, 0 },
{ 404, 450, 52 },
{ 483, 878, 99 },
{ 911, 930, 495 },
{ 963, 1237, 515 },
{ -1, -1, -1 } };
static DWORD old_defgrp_offsets[] = { 0, 52, 84, 116, 148, 180, 212, 244,
276, 308, 340, 372, 451, 879, 931 };
static DWORD new_defgrp_offsets[] = {
0,
SHOFIXTI_GRPOFFS0,
ZOQFOT_GRPOFFS0,
MELNORME0_GRPOFFS0,
MELNORME1_GRPOFFS0,
MELNORME2_GRPOFFS0,
MELNORME3_GRPOFFS0,
MELNORME4_GRPOFFS0,
MELNORME5_GRPOFFS0,
MELNORME6_GRPOFFS0,
MELNORME7_GRPOFFS0,
MELNORME8_GRPOFFS0,
URQUAN_PROBE_GRPOFFS0,
COLONY_GRPOFFS0,
SAMATRA_GRPOFFS0
};
static void
InterpretLegacyGameState (BYTE *result, BYTE *legacy)
{
int i;
DWORD grpoffs[NUM_DEFGRPS];
GAMESTATE_TRANSPOSE *t = &transpose[0];
grpoffs[0] = 0;
for (i = 1; i < NUM_DEFGRPS; ++i)
{
grpoffs[i] = getGameState32 (legacy, old_defgrp_offsets[i]);
}
while (t->start >= 0)
{
copyGameState (result, t->target, legacy, t->start, t->end);
++t;
}
for (i = 1; i < NUM_DEFGRPS; ++i)
{
setGameState32 (result, new_defgrp_offsets[i], grpoffs[i]);
}
}
static void static void
LoadEmptyQueue (DECODE_REF fh) LoadEmptyQueue (DECODE_REF fh)
{ {
@@ -424,7 +484,7 @@ LoadClockState (CLOCK_STATE *ClockPtr, DECODE_REF fh)
static void static void
LoadGameState (GAME_STATE *GSPtr, DECODE_REF fh) LoadGameState (GAME_STATE *GSPtr, DECODE_REF fh)
{ {
BYTE dummy8; BYTE dummy8, oldstate[LEGACY_GAMESTATE_SIZE];
cread_8 (fh, &dummy8); /* obsolete */ cread_8 (fh, &dummy8); /* obsolete */
cread_8 (fh, &GSPtr->glob_flags); cread_8 (fh, &GSPtr->glob_flags);
@@ -469,9 +529,9 @@ LoadGameState (GAME_STATE *GSPtr, DECODE_REF fh)
DummyLoadQueue (&GSPtr->encounter_q, fh); DummyLoadQueue (&GSPtr->encounter_q, fh);
DummyLoadQueue (&GSPtr->built_ship_q, fh); DummyLoadQueue (&GSPtr->built_ship_q, fh);
cread_a8 (fh, GSPtr->GameState, sizeof (GSPtr->GameState)); cread_a8 (fh, oldstate, LEGACY_GAMESTATE_SIZE);
InterpretLegacyGameState (GSPtr->GameState, oldstate);
assert (sizeof (GSPtr->GameState) % 4 == 3);
cread_8 (fh, NULL); /* GAME_STATE alignment padding */ cread_8 (fh, NULL); /* GAME_STATE alignment padding */
} }