Remove padding and unused data from savegame format.

This commit is contained in:
Michael Martin
2013-10-07 00:39:06 -07:00
parent 51fa5a7ae5
commit 876daf0827
2 changed files with 17 additions and 204 deletions
+6 -89
View File
@@ -86,13 +86,6 @@ read_32s (void *fp, SDWORD *v)
return ret; return ret;
} }
static inline size_t
read_ptr (void *fp)
{
DWORD t;
return read_32 (fp, &t); /* ptrs are useless in saves */
}
static inline size_t static inline size_t
read_a8 (void *fp, BYTE *ar, COUNT count) read_a8 (void *fp, BYTE *ar, COUNT count)
{ {
@@ -167,21 +160,13 @@ LoadShipQueue (void *fh, QUEUE *pQueue)
FragPtr = LockShipFrag (pQueue, hStarShip); FragPtr = LockShipFrag (pQueue, hStarShip);
// Read SHIP_FRAGMENT elements // Read SHIP_FRAGMENT elements
read_16 (fh, NULL); /* unused: was which_side */
read_8 (fh, &FragPtr->captains_name_index); read_8 (fh, &FragPtr->captains_name_index);
read_8 (fh, NULL); /* padding */
read_16 (fh, NULL); /* unused: was ship_flags */
read_8 (fh, &FragPtr->race_id); read_8 (fh, &FragPtr->race_id);
read_8 (fh, &FragPtr->index); read_8 (fh, &FragPtr->index);
// XXX: reading crew as BYTE to maintain savegame compatibility read_16 (fh, &FragPtr->crew_level);
read_8 (fh, &tmpb); read_16 (fh, &FragPtr->max_crew);
FragPtr->crew_level = tmpb;
read_8 (fh, &tmpb);
FragPtr->max_crew = tmpb;
read_8 (fh, &FragPtr->energy_level); read_8 (fh, &FragPtr->energy_level);
read_8 (fh, &FragPtr->max_energy); read_8 (fh, &FragPtr->max_energy);
read_16 (fh, NULL); /* unused; was loc.x */
read_16 (fh, NULL); /* unused; was loc.y */
UnlockShipFrag (pQueue, hStarShip); UnlockShipFrag (pQueue, hStarShip);
} }
@@ -227,7 +212,6 @@ LoadRaceQueue (void *fh, QUEUE *pQueue)
read_8 (fh, &FleetPtr->func_index); read_8 (fh, &FleetPtr->func_index);
read_16s(fh, &FleetPtr->dest_loc.x); read_16s(fh, &FleetPtr->dest_loc.x);
read_16s(fh, &FleetPtr->dest_loc.y); read_16s(fh, &FleetPtr->dest_loc.y);
read_16 (fh, NULL); /* alignment padding */
UnlockFleetInfo (pQueue, hStarShip); UnlockFleetInfo (pQueue, hStarShip);
} }
@@ -246,21 +230,15 @@ LoadGroupQueue (void *fh, QUEUE *pQueue)
IP_GROUP *GroupPtr; IP_GROUP *GroupPtr;
BYTE tmpb; BYTE tmpb;
read_16 (fh, NULL); /* unused; was race_id */
hGroup = BuildGroup (pQueue, 0); hGroup = BuildGroup (pQueue, 0);
GroupPtr = LockIpGroup (pQueue, hGroup); GroupPtr = LockIpGroup (pQueue, hGroup);
read_16 (fh, NULL); /* unused; was which_side */
read_8 (fh, NULL); /* unused; was captains_name_index */
read_8 (fh, NULL); /* padding; for savegame compat */
read_16 (fh, &GroupPtr->group_counter); read_16 (fh, &GroupPtr->group_counter);
read_8 (fh, &GroupPtr->race_id); read_8 (fh, &GroupPtr->race_id);
read_8 (fh, &tmpb); /* was var2 */ read_8 (fh, &tmpb); /* was var2 */
GroupPtr->sys_loc = LONIBBLE (tmpb); GroupPtr->sys_loc = LONIBBLE (tmpb);
GroupPtr->task = HINIBBLE (tmpb); GroupPtr->task = HINIBBLE (tmpb);
read_8 (fh, &GroupPtr->in_system); /* was crew_level */ read_8 (fh, &GroupPtr->in_system); /* was crew_level */
read_8 (fh, NULL); /* unused; was max_crew */
read_8 (fh, &tmpb); /* was energy_level */ read_8 (fh, &tmpb); /* was energy_level */
GroupPtr->dest_loc = LONIBBLE (tmpb); GroupPtr->dest_loc = LONIBBLE (tmpb);
GroupPtr->orbit_pos = HINIBBLE (tmpb); GroupPtr->orbit_pos = HINIBBLE (tmpb);
@@ -278,11 +256,8 @@ LoadEncounter (ENCOUNTER *EncounterPtr, void *fh)
COUNT i; COUNT i;
BYTE tmpb; BYTE tmpb;
read_ptr (fh); /* useless ptr; HENCOUNTER pred */
EncounterPtr->pred = 0; EncounterPtr->pred = 0;
read_ptr (fh); /* useless ptr; HENCOUNTER succ */
EncounterPtr->succ = 0; EncounterPtr->succ = 0;
read_ptr (fh); /* useless ptr; HELEMENT hElement */
EncounterPtr->hElement = 0; EncounterPtr->hElement = 0;
read_16s (fh, &EncounterPtr->transition_state); read_16s (fh, &EncounterPtr->transition_state);
read_16s (fh, &EncounterPtr->origin.x); read_16s (fh, &EncounterPtr->origin.x);
@@ -292,31 +267,18 @@ LoadEncounter (ENCOUNTER *EncounterPtr, void *fh)
read_16s (fh, &EncounterPtr->loc_pt.x); read_16s (fh, &EncounterPtr->loc_pt.x);
read_16s (fh, &EncounterPtr->loc_pt.y); read_16s (fh, &EncounterPtr->loc_pt.y);
read_8 (fh, &EncounterPtr->race_id); read_8 (fh, &EncounterPtr->race_id);
read_8 (fh, &tmpb); read_8 (fh, &EncounterPtr->num_ships);
EncounterPtr->num_ships = tmpb & ENCOUNTER_SHIPS_MASK; read_8 (fh, &EncounterPtr->flags);
EncounterPtr->flags = tmpb & ENCOUNTER_FLAGS_MASK;
read_16 (fh, NULL); /* alignment padding */
// Load each entry in the BRIEF_SHIP_INFO array // Load each entry in the BRIEF_SHIP_INFO array
for (i = 0; i < MAX_HYPER_SHIPS; i++) for (i = 0; i < MAX_HYPER_SHIPS; i++)
{ {
BRIEF_SHIP_INFO *ShipInfo = &EncounterPtr->ShipList[i]; BRIEF_SHIP_INFO *ShipInfo = &EncounterPtr->ShipList[i];
read_16 (fh, NULL); /* useless; was SHIP_INFO.ship_flags */
read_8 (fh, &ShipInfo->race_id); read_8 (fh, &ShipInfo->race_id);
read_8 (fh, NULL); /* useless; was SHIP_INFO.var2 */ read_16 (fh, &ShipInfo->crew_level);
// XXX: reading crew as BYTE to maintain savegame compatibility read_16 (fh, &ShipInfo->max_crew);
read_8 (fh, &tmpb);
ShipInfo->crew_level = tmpb;
read_8 (fh, &tmpb);
ShipInfo->max_crew = tmpb;
read_8 (fh, NULL); /* useless; was SHIP_INFO.energy_level */
read_8 (fh, &ShipInfo->max_energy); read_8 (fh, &ShipInfo->max_energy);
read_16 (fh, NULL); /* useless; was SHIP_INFO.loc.x */
read_16 (fh, NULL); /* useless; was SHIP_INFO.loc.y */
read_32 (fh, NULL); /* useless val; STRING race_strings */
read_ptr (fh); /* useless ptr; FRAME icons */
read_ptr (fh); /* useless ptr; FRAME melee_icon */
} }
// Load the stuff after the BRIEF_SHIP_INFO array // Load the stuff after the BRIEF_SHIP_INFO array
@@ -327,37 +289,12 @@ LoadEncounter (ENCOUNTER *EncounterPtr, void *fh)
static void static void
LoadEvent (EVENT *EventPtr, void *fh) LoadEvent (EVENT *EventPtr, void *fh)
{ {
read_ptr (fh); /* useless ptr; HEVENT pred */
EventPtr->pred = 0; EventPtr->pred = 0;
read_ptr (fh); /* useless ptr; HEVENT succ */
EventPtr->succ = 0; EventPtr->succ = 0;
read_8 (fh, &EventPtr->day_index); read_8 (fh, &EventPtr->day_index);
read_8 (fh, &EventPtr->month_index); read_8 (fh, &EventPtr->month_index);
read_16 (fh, &EventPtr->year_index); read_16 (fh, &EventPtr->year_index);
read_8 (fh, &EventPtr->func_index); read_8 (fh, &EventPtr->func_index);
read_8 (fh, NULL); /* padding */
read_16 (fh, NULL); /* padding */
}
static void
DummyLoadQueue (QUEUE *QueuePtr, void *fh)
{
/* QUEUE should never actually be loaded since it contains
* purely internal representation and the lists
* involved are actually loaded separately */
(void)QueuePtr; /* silence compiler */
/* QUEUE format with QUEUE_TABLE defined -- UQM default */
read_ptr (fh); /* HLINK head */
read_ptr (fh); /* HLINK tail */
read_ptr (fh); /* BYTE* pq_tab */
read_ptr (fh); /* HLINK free_list */
read_16 (fh, NULL); /* MEM_HANDLE hq_tab */
read_16 (fh, NULL); /* COUNT object_size */
read_8 (fh, NULL); /* BYTE num_objects */
read_8 (fh, NULL); /* padding */
read_16 (fh, NULL); /* padding */
} }
static void static void
@@ -368,28 +305,18 @@ LoadClockState (CLOCK_STATE *ClockPtr, void *fh)
read_16 (fh, &ClockPtr->year_index); read_16 (fh, &ClockPtr->year_index);
read_16s (fh, &ClockPtr->tick_count); read_16s (fh, &ClockPtr->tick_count);
read_16s (fh, &ClockPtr->day_in_ticks); read_16s (fh, &ClockPtr->day_in_ticks);
read_ptr (fh); /* not loading ptr; Semaphore clock_sem */
read_ptr (fh); /* not loading ptr; Task clock_task */
read_32 (fh, NULL); /* not loading; DWORD TimeCounter */
DummyLoadQueue (&ClockPtr->event_q, fh);
} }
static void static void
LoadGameState (GAME_STATE *GSPtr, void *fh) LoadGameState (GAME_STATE *GSPtr, void *fh)
{ {
BYTE dummy8;
read_8 (fh, &dummy8); /* obsolete */
read_8 (fh, &GSPtr->glob_flags); read_8 (fh, &GSPtr->glob_flags);
read_8 (fh, &GSPtr->CrewCost); read_8 (fh, &GSPtr->CrewCost);
read_8 (fh, &GSPtr->FuelCost); read_8 (fh, &GSPtr->FuelCost);
read_a8 (fh, GSPtr->ModuleCost, NUM_MODULES); read_a8 (fh, GSPtr->ModuleCost, NUM_MODULES);
read_a8 (fh, GSPtr->ElementWorth, NUM_ELEMENT_CATEGORIES); read_a8 (fh, GSPtr->ElementWorth, NUM_ELEMENT_CATEGORIES);
read_ptr (fh); /* not loading ptr; PRIMITIVE *DisplayArray */
read_16 (fh, &GSPtr->CurrentActivity); read_16 (fh, &GSPtr->CurrentActivity);
read_16 (fh, NULL); /* CLOCK_STATE alignment padding */
LoadClockState (&GSPtr->GameClock, fh); LoadClockState (&GSPtr->GameClock, fh);
read_16s (fh, &GSPtr->autopilot.x); read_16s (fh, &GSPtr->autopilot.x);
@@ -413,20 +340,10 @@ LoadGameState (GAME_STATE *GSPtr, void *fh)
read_16s (fh, &GSPtr->velocity.error.height); read_16s (fh, &GSPtr->velocity.error.height);
read_16s (fh, &GSPtr->velocity.incr.width); read_16s (fh, &GSPtr->velocity.incr.width);
read_16s (fh, &GSPtr->velocity.incr.height); read_16s (fh, &GSPtr->velocity.incr.height);
read_16 (fh, NULL); /* VELOCITY_DESC padding */
read_32 (fh, &GSPtr->BattleGroupRef); read_32 (fh, &GSPtr->BattleGroupRef);
DummyLoadQueue (&GSPtr->avail_race_q, fh);
DummyLoadQueue (&GSPtr->npc_built_ship_q, fh);
// Not loading ip_group_q, was not there originally
DummyLoadQueue (&GSPtr->encounter_q, fh);
DummyLoadQueue (&GSPtr->built_ship_q, fh);
read_a8 (fh, GSPtr->GameState, sizeof (GSPtr->GameState)); read_a8 (fh, GSPtr->GameState, sizeof (GSPtr->GameState));
assert (sizeof (GSPtr->GameState) % 4 == 3);
read_8 (fh, NULL); /* GAME_STATE alignment padding */
} }
static BOOLEAN static BOOLEAN
+11 -115
View File
@@ -84,12 +84,6 @@ cwrite_32 (SAVEBUF *fh, DWORD v)
return 0; return 0;
} }
static inline COUNT
cwrite_ptr (SAVEBUF *fh)
{
return cwrite_32 (fh, 0); /* ptrs are useless in saves */
}
static inline COUNT static inline COUNT
cwrite_a8 (SAVEBUF *fh, const BYTE *ar, COUNT count) cwrite_a8 (SAVEBUF *fh, const BYTE *ar, COUNT count)
{ {
@@ -118,12 +112,6 @@ write_32 (void *fp, DWORD v)
return WriteResFile (&v, 4, 1, fp); return WriteResFile (&v, 4, 1, fp);
} }
static inline size_t
write_ptr (void *fp)
{
return write_32 (fp, 0); /* ptrs are useless in saves */
}
static inline size_t static inline size_t
write_a8 (void *fp, const BYTE *ar, COUNT count) write_a8 (void *fp, const BYTE *ar, COUNT count)
{ {
@@ -183,19 +171,13 @@ SaveShipQueue (SAVEBUF *fh, QUEUE *pQueue)
cwrite_16 (fh, Index); cwrite_16 (fh, Index);
// Write SHIP_FRAGMENT elements // Write SHIP_FRAGMENT elements
cwrite_16 (fh, 0); /* unused; was which_side */
cwrite_8 (fh, FragPtr->captains_name_index); cwrite_8 (fh, FragPtr->captains_name_index);
cwrite_8 (fh, 0); /* padding */
cwrite_16 (fh, 0); /* unused: was ship_flags */
cwrite_8 (fh, FragPtr->race_id); cwrite_8 (fh, FragPtr->race_id);
cwrite_8 (fh, FragPtr->index); cwrite_8 (fh, FragPtr->index);
// XXX: writing crew as BYTE to maintain savegame compatibility cwrite_16 (fh, FragPtr->crew_level);
cwrite_8 (fh, FragPtr->crew_level); cwrite_16 (fh, FragPtr->max_crew);
cwrite_8 (fh, FragPtr->max_crew);
cwrite_8 (fh, FragPtr->energy_level); cwrite_8 (fh, FragPtr->energy_level);
cwrite_8 (fh, FragPtr->max_energy); cwrite_8 (fh, FragPtr->max_energy);
cwrite_16 (fh, 0); /* unused; was loc.x */
cwrite_16 (fh, 0); /* unused; was loc.y */
UnlockShipFrag (pQueue, hStarShip); UnlockShipFrag (pQueue, hStarShip);
hStarShip = hNextShip; hStarShip = hNextShip;
@@ -245,7 +227,6 @@ SaveRaceQueue (SAVEBUF *fh, QUEUE *pQueue)
cwrite_8 (fh, FleetPtr->func_index); cwrite_8 (fh, FleetPtr->func_index);
cwrite_16 (fh, FleetPtr->dest_loc.x); cwrite_16 (fh, FleetPtr->dest_loc.x);
cwrite_16 (fh, FleetPtr->dest_loc.y); cwrite_16 (fh, FleetPtr->dest_loc.y);
cwrite_16 (fh, 0); /* alignment padding */
UnlockFleetInfo (pQueue, hFleet); UnlockFleetInfo (pQueue, hFleet);
hFleet = hNextFleet; hFleet = hNextFleet;
@@ -267,18 +248,12 @@ SaveGroupQueue (SAVEBUF *fh, QUEUE *pQueue)
GroupPtr = LockIpGroup (pQueue, hGroup); GroupPtr = LockIpGroup (pQueue, hGroup);
hNextGroup = _GetSuccLink (GroupPtr); hNextGroup = _GetSuccLink (GroupPtr);
cwrite_16 (fh, GroupPtr->race_id); /* unused; for old versions */
cwrite_16 (fh, 0); /* unused; was which_side */
cwrite_8 (fh, 0); /* unused; was captains_name_index */
cwrite_8 (fh, 0); /* padding; for savegame compat */
cwrite_16 (fh, GroupPtr->group_counter); cwrite_16 (fh, GroupPtr->group_counter);
cwrite_8 (fh, GroupPtr->race_id); cwrite_8 (fh, GroupPtr->race_id);
assert (GroupPtr->sys_loc < 0x10 && GroupPtr->task < 0x10); assert (GroupPtr->sys_loc < 0x10 && GroupPtr->task < 0x10);
cwrite_8 (fh, MAKE_BYTE (GroupPtr->sys_loc, GroupPtr->task)); cwrite_8 (fh, MAKE_BYTE (GroupPtr->sys_loc, GroupPtr->task));
/* was var2 */ /* was var2 */
cwrite_8 (fh, GroupPtr->in_system); /* was crew_level */ cwrite_8 (fh, GroupPtr->in_system); /* was crew_level */
cwrite_8 (fh, 0); /* unused; was max_crew */
assert (GroupPtr->dest_loc < 0x10 && GroupPtr->orbit_pos < 0x10); assert (GroupPtr->dest_loc < 0x10 && GroupPtr->orbit_pos < 0x10);
cwrite_8 (fh, MAKE_BYTE (GroupPtr->dest_loc, GroupPtr->orbit_pos)); cwrite_8 (fh, MAKE_BYTE (GroupPtr->dest_loc, GroupPtr->orbit_pos));
/* was energy_level */ /* was energy_level */
@@ -295,9 +270,6 @@ SaveEncounter (const ENCOUNTER *EncounterPtr, SAVEBUF *fh)
{ {
COUNT i; COUNT i;
cwrite_ptr (fh); /* useless ptr; HENCOUNTER pred */
cwrite_ptr (fh); /* useless ptr; HENCOUNTER succ */
cwrite_ptr (fh); /* useless ptr; HELEMENT hElement */
cwrite_16 (fh, EncounterPtr->transition_state); cwrite_16 (fh, EncounterPtr->transition_state);
cwrite_16 (fh, EncounterPtr->origin.x); cwrite_16 (fh, EncounterPtr->origin.x);
cwrite_16 (fh, EncounterPtr->origin.y); cwrite_16 (fh, EncounterPtr->origin.y);
@@ -306,29 +278,18 @@ SaveEncounter (const ENCOUNTER *EncounterPtr, SAVEBUF *fh)
cwrite_16 (fh, EncounterPtr->loc_pt.x); cwrite_16 (fh, EncounterPtr->loc_pt.x);
cwrite_16 (fh, EncounterPtr->loc_pt.y); cwrite_16 (fh, EncounterPtr->loc_pt.y);
cwrite_8 (fh, EncounterPtr->race_id); cwrite_8 (fh, EncounterPtr->race_id);
// XXX: writing combined fields to maintain savegame compatibility cwrite_8 (fh, EncounterPtr->num_ships);
cwrite_8 (fh, (EncounterPtr->num_ships & ENCOUNTER_SHIPS_MASK) cwrite_8 (fh, EncounterPtr->flags);
| (EncounterPtr->flags & ENCOUNTER_FLAGS_MASK));
cwrite_16 (fh, 0); /* alignment padding */
// Save each entry in the BRIEF_SHIP_INFO array // Save each entry in the BRIEF_SHIP_INFO array
for (i = 0; i < MAX_HYPER_SHIPS; i++) for (i = 0; i < MAX_HYPER_SHIPS; i++)
{ {
const BRIEF_SHIP_INFO *ShipInfo = &EncounterPtr->ShipList[i]; const BRIEF_SHIP_INFO *ShipInfo = &EncounterPtr->ShipList[i];
cwrite_16 (fh, 0); /* useless; was SHIP_INFO.ship_flags */
cwrite_8 (fh, ShipInfo->race_id); cwrite_8 (fh, ShipInfo->race_id);
cwrite_8 (fh, 0); /* useless; was SHIP_INFO.var2 */ cwrite_16 (fh, ShipInfo->crew_level);
// XXX: writing crew as BYTE to maintain savegame compatibility cwrite_16 (fh, ShipInfo->max_crew);
cwrite_8 (fh, ShipInfo->crew_level);
cwrite_8 (fh, ShipInfo->max_crew);
cwrite_8 (fh, 0); /* useless; was SHIP_INFO.energy_level */
cwrite_8 (fh, ShipInfo->max_energy); cwrite_8 (fh, ShipInfo->max_energy);
cwrite_16 (fh, 0); /* useless; was SHIP_INFO.loc.x */
cwrite_16 (fh, 0); /* useless; was SHIP_INFO.loc.y */
cwrite_32 (fh, 0); /* useless val; STRING race_strings */
cwrite_ptr (fh); /* useless ptr; FRAME icons */
cwrite_ptr (fh); /* useless ptr; FRAME melee_icon */
} }
// Save the stuff after the BRIEF_SHIP_INFO array // Save the stuff after the BRIEF_SHIP_INFO array
@@ -339,35 +300,10 @@ SaveEncounter (const ENCOUNTER *EncounterPtr, SAVEBUF *fh)
static void static void
SaveEvent (const EVENT *EventPtr, SAVEBUF *fh) SaveEvent (const EVENT *EventPtr, SAVEBUF *fh)
{ {
cwrite_ptr (fh); /* useless ptr; HEVENT pred */
cwrite_ptr (fh); /* useless ptr; HEVENT succ */
cwrite_8 (fh, EventPtr->day_index); cwrite_8 (fh, EventPtr->day_index);
cwrite_8 (fh, EventPtr->month_index); cwrite_8 (fh, EventPtr->month_index);
cwrite_16 (fh, EventPtr->year_index); cwrite_16 (fh, EventPtr->year_index);
cwrite_8 (fh, EventPtr->func_index); cwrite_8 (fh, EventPtr->func_index);
cwrite_8 (fh, 0); /* padding */
cwrite_16 (fh, 0); /* padding */
}
static void
DummySaveQueue (const QUEUE *QueuePtr, SAVEBUF *fh)
{
/* QUEUE should never actually be saved since it contains
* purely internal representation and the lists
* involved are actually saved separately */
(void)QueuePtr; /* silence compiler */
/* QUEUE format with QUEUE_TABLE defined -- UQM default */
cwrite_ptr (fh); /* HLINK head */
cwrite_ptr (fh); /* HLINK tail */
cwrite_ptr (fh); /* BYTE* pq_tab */
cwrite_ptr (fh); /* HLINK free_list */
cwrite_16 (fh, 0); /* MEM_HANDLE hq_tab */
cwrite_16 (fh, 0); /* COUNT object_size */
cwrite_8 (fh, 0); /* BYTE num_objects */
cwrite_8 (fh, 0); /* padding */
cwrite_16 (fh, 0); /* padding */
} }
static void static void
@@ -378,26 +314,18 @@ SaveClockState (const CLOCK_STATE *ClockPtr, SAVEBUF *fh)
cwrite_16 (fh, ClockPtr->year_index); cwrite_16 (fh, ClockPtr->year_index);
cwrite_16 (fh, ClockPtr->tick_count); cwrite_16 (fh, ClockPtr->tick_count);
cwrite_16 (fh, ClockPtr->day_in_ticks); cwrite_16 (fh, ClockPtr->day_in_ticks);
cwrite_ptr (fh); /* useless ptr; Semaphore clock_sem */
cwrite_ptr (fh); /* useless ptr; Task clock_task */
cwrite_32 (fh, 0); /* useless value; DWORD TimeCounter */
DummySaveQueue (&ClockPtr->event_q, fh);
} }
static void static void
SaveGameState (const GAME_STATE *GSPtr, SAVEBUF *fh) SaveGameState (const GAME_STATE *GSPtr, SAVEBUF *fh)
{ {
cwrite_8 (fh, 0); /* obsolete; BYTE cur_state */
cwrite_8 (fh, GSPtr->glob_flags); cwrite_8 (fh, GSPtr->glob_flags);
cwrite_8 (fh, GSPtr->CrewCost); cwrite_8 (fh, GSPtr->CrewCost);
cwrite_8 (fh, GSPtr->FuelCost); cwrite_8 (fh, GSPtr->FuelCost);
cwrite_a8 (fh, GSPtr->ModuleCost, NUM_MODULES); cwrite_a8 (fh, GSPtr->ModuleCost, NUM_MODULES);
cwrite_a8 (fh, GSPtr->ElementWorth, NUM_ELEMENT_CATEGORIES); cwrite_a8 (fh, GSPtr->ElementWorth, NUM_ELEMENT_CATEGORIES);
cwrite_ptr (fh); /* useless ptr; PRIMITIVE *DisplayArray */
cwrite_16 (fh, GSPtr->CurrentActivity); cwrite_16 (fh, GSPtr->CurrentActivity);
cwrite_16 (fh, 0); /* CLOCK_STATE alignment padding */
SaveClockState (&GSPtr->GameClock, fh); SaveClockState (&GSPtr->GameClock, fh);
cwrite_16 (fh, GSPtr->autopilot.x); cwrite_16 (fh, GSPtr->autopilot.x);
@@ -421,20 +349,10 @@ SaveGameState (const GAME_STATE *GSPtr, SAVEBUF *fh)
cwrite_16 (fh, GSPtr->velocity.error.height); cwrite_16 (fh, GSPtr->velocity.error.height);
cwrite_16 (fh, GSPtr->velocity.incr.width); cwrite_16 (fh, GSPtr->velocity.incr.width);
cwrite_16 (fh, GSPtr->velocity.incr.height); cwrite_16 (fh, GSPtr->velocity.incr.height);
cwrite_16 (fh, 0); /* VELOCITY_DESC padding */
cwrite_32 (fh, GSPtr->BattleGroupRef); cwrite_32 (fh, GSPtr->BattleGroupRef);
DummySaveQueue (&GSPtr->avail_race_q, fh);
DummySaveQueue (&GSPtr->npc_built_ship_q, fh);
// Not saving ip_group_q, was not there originally
DummySaveQueue (&GSPtr->encounter_q, fh);
DummySaveQueue (&GSPtr->built_ship_q, fh);
cwrite_a8 (fh, GSPtr->GameState, sizeof (GSPtr->GameState)); cwrite_a8 (fh, GSPtr->GameState, sizeof (GSPtr->GameState));
assert (sizeof (GSPtr->GameState) % 4 == 3);
cwrite_8 (fh, 0); /* GAME_STATE alignment padding */
} }
static BOOLEAN static BOOLEAN
@@ -469,7 +387,7 @@ SaveSummary (const SUMMARY_DESC *SummPtr, void *fp)
if ( if (
write_32 (fp, SAVE_MAGIC) != 1 || write_32 (fp, SAVE_MAGIC) != 1 ||
write_32 (fp, SUMMARY_MAGIC) != 1 || write_32 (fp, SUMMARY_MAGIC) != 1 ||
write_32 (fp, 161 + strlen(SummPtr->SaveName)) != 1 write_32 (fp, 160 + strlen(SummPtr->SaveName)) != 1
) )
return FALSE; return FALSE;
if (!SaveSisState (&SummPtr->SS, fp)) if (!SaveSisState (&SummPtr->SS, fp))
@@ -487,7 +405,7 @@ SaveSummary (const SUMMARY_DESC *SummPtr, void *fp)
write_8 (fp, SummPtr->NumDevices) != 1 || write_8 (fp, SummPtr->NumDevices) != 1 ||
write_a8 (fp, SummPtr->ShipList, MAX_BUILT_SHIPS) != 1 || write_a8 (fp, SummPtr->ShipList, MAX_BUILT_SHIPS) != 1 ||
write_a8 (fp, SummPtr->DeviceList, MAX_EXCLUSIVE_DEVICES) != 1 || write_a8 (fp, SummPtr->DeviceList, MAX_EXCLUSIVE_DEVICES) != 1 ||
write_a8 (fp, SummPtr->SaveName, strlen(SummPtr->SaveName)+1) != 1 write_a8 (fp, SummPtr->SaveName, strlen(SummPtr->SaveName)) != 1
) )
return FALSE; return FALSE;
else else
@@ -667,31 +585,16 @@ SaveFlagshipState (void)
BOOLEAN BOOLEAN
SaveGame (COUNT which_game, SUMMARY_DESC *SummPtr, const char *name) SaveGame (COUNT which_game, SUMMARY_DESC *SummPtr, const char *name)
{ {
BOOLEAN success, made_room; BOOLEAN success;
void *out_fp, *h; void *out_fp, *h;
SAVEBUF fh_backing, *fh; SAVEBUF fh_backing, *fh;
success = TRUE; success = TRUE;
made_room = FALSE;
fh = &fh_backing; fh = &fh_backing;
RetrySave:
h = HMalloc (128 * 1024); h = HMalloc (128 * 1024);
if (h == 0) if (h == 0)
{ {
if (success) log_add (log_Debug, "Insufficient room for save buffers");
{
success = FALSE;
made_room = TRUE;
HFree (h);
FreeSC2Data ();
log_add (log_Debug, "Insufficient room for save buffers"
" -- RETRYING");
goto RetrySave;
}
else
log_add (log_Debug, "Insufficient room for save buffers"
" -- GIVING UP!");
} }
else else
{ {
@@ -742,7 +645,6 @@ RetrySave:
// from group state files. But the original code did, // from group state files. But the original code did,
// and so will we until we can prove we do not need to. // and so will we until we can prove we do not need to.
SaveGroupQueue (fh, &GLOBAL (ip_group_q)); SaveGroupQueue (fh, &GLOBAL (ip_group_q));
//SaveEmptyQueue (fh);
else else
// XXX: empty queue write-out is only needed to maintain // XXX: empty queue write-out is only needed to maintain
// the savegame compatibility // the savegame compatibility
@@ -802,7 +704,6 @@ RetrySave:
{ {
flen = LengthStateFile (fp); flen = LengthStateFile (fp);
// Write the uncompressed size. // Write the uncompressed size.
printf ("Star Info: %u bytes\n", flen);
cwrite_32 (fh, flen); cwrite_32 (fh, flen);
while (flen) while (flen)
{ {
@@ -823,7 +724,6 @@ RetrySave:
{ {
flen = LengthStateFile (fp); flen = LengthStateFile (fp);
// Write the uncompressed size. // Write the uncompressed size.
printf ("Defined Group Info: %u bytes\n", flen);
cwrite_32 (fh, flen); cwrite_32 (fh, flen);
while (flen) while (flen)
{ {
@@ -844,7 +744,6 @@ RetrySave:
{ {
flen = LengthStateFile (fp); flen = LengthStateFile (fp);
// Write the uncompressed size. // Write the uncompressed size.
printf ("Random Group Info: %u bytes\n", flen);
cwrite_32 (fh, flen); cwrite_32 (fh, flen);
while (flen) while (flen)
{ {
@@ -867,7 +766,7 @@ RetrySave:
// Write the memory file to the actual savegame file. // Write the memory file to the actual savegame file.
sprintf (file, "uqmsave.%02u", which_game); sprintf (file, "uqmsave.%02u", which_game);
log_add (log_Debug, "'%s' is %u bytes long", file, log_add (log_Debug, "'%s' is %u bytes long", file,
flen + 181 + strlen(SummPtr->SaveName)); flen + 180 + strlen(SummPtr->SaveName));
if (flen && (out_fp = res_OpenResFile (saveDir, file, "wb"))) if (flen && (out_fp = res_OpenResFile (saveDir, file, "wb")))
{ {
PrepareSummary (SummPtr, name); PrepareSummary (SummPtr, name);
@@ -894,8 +793,5 @@ RetrySave:
HFree (h); HFree (h);
if (made_room)
LoadSC2Data ();
return (success); return (success);
} }