Change viewport plan save format

The previous format stored sparse keys in a non-sparse array chunk,
which resulted in a significant savegame size penalty.
This commit is contained in:
Jonathan G Rennison
2018-06-02 00:10:36 +01:00
parent 64815c0d8a
commit 9376dc7089
2 changed files with 25 additions and 17 deletions

View File

@@ -45,7 +45,7 @@ std::vector<uint32> _sl_xv_discardable_chunk_ids; ///< list of chunks
static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk
const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
{ XSLFI_ENH_VIEWPORT_PLANS, XSCF_IGNORABLE_ALL, 1, 1, "enh_viewport_plans", NULL, NULL, "PLAN,PLLN" }, { XSLFI_ENH_VIEWPORT_PLANS, XSCF_IGNORABLE_ALL, 2, 2, "enh_viewport_plans", NULL, NULL, "PLAN" },
{ XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker
}; };

View File

@@ -24,13 +24,24 @@ static const SaveLoad _plan_desc[] = {
SLE_END() SLE_END()
}; };
static void RealSave_PLAN(Plan *p)
{
SlObject(p, _plan_desc);
SlWriteUint32(p->lines.size());
for (size_t i = 0; i < p->lines.size(); i++) {
PlanLine *pl = p->lines[i];
SlWriteUint32(pl->tiles.size());
SlArray(&pl->tiles[0], pl->tiles.size(), SLE_UINT32);
}
}
/** Save all plans. */ /** Save all plans. */
static void Save_PLAN() static void Save_PLAN()
{ {
Plan *p; Plan *p;
FOR_ALL_PLANS(p) { FOR_ALL_PLANS(p) {
SlSetArrayIndex(p->index); SlSetArrayIndex(p->index);
SlObject(p, _plan_desc); SlAutolength((AutolengthProc*) RealSave_PLAN, p);
} }
} }
@@ -41,20 +52,17 @@ static void Load_PLAN()
while ((index = SlIterateArray()) != -1) { while ((index = SlIterateArray()) != -1) {
Plan *p = new (index) Plan(); Plan *p = new (index) Plan();
SlObject(p, _plan_desc); SlObject(p, _plan_desc);
} if (SlXvIsFeaturePresent(XSLFI_ENH_VIEWPORT_PLANS, 2)) {
} const size_t line_count = SlReadUint32();
p->lines.resize(line_count);
/** Save all plan lines. */ for (size_t i = 0; i < line_count; i++) {
static void Save_PLANLINE() PlanLine *pl = new PlanLine();
{ p->lines[i] = pl;
Plan *p; const size_t tile_count = SlReadUint32();
FOR_ALL_PLANS(p) { pl->tiles.resize(tile_count);
for (size_t i = 0; i < p->lines.size(); i++) { SlArray(&pl->tiles[0], tile_count, SLE_UINT32);
SlSetArrayIndex((uint) p->index << 16 | (uint) i); }
PlanLine *pl = p->lines[i]; p->SetVisibility(false);
size_t plsz = pl->tiles.size();
SlSetLength(plsz * sizeof(TileIndex));
SlArray(&pl->tiles[0], plsz, SLE_UINT32);
} }
} }
} }
@@ -83,5 +91,5 @@ static void Load_PLANLINE()
/** Chunk handlers related to plans. */ /** Chunk handlers related to plans. */
extern const ChunkHandler _plan_chunk_handlers[] = { extern const ChunkHandler _plan_chunk_handlers[] = {
{ 'PLAN', Save_PLAN, Load_PLAN, NULL, NULL, CH_ARRAY}, { 'PLAN', Save_PLAN, Load_PLAN, NULL, NULL, CH_ARRAY},
{ 'PLLN', Save_PLANLINE, Load_PLANLINE, NULL, NULL, CH_ARRAY | CH_LAST}, { 'PLLN', NULL, Load_PLANLINE, NULL, NULL, CH_ARRAY | CH_LAST},
}; };