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:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
+96
-69
@@ -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,6 +974,28 @@ 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);
|
||||||
@@ -978,6 +1004,7 @@ extern void setGameState (BYTE *state, int startBit, int endBit, BYTE val
|
|||||||
, 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
|
||||||
|
|||||||
@@ -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 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user