diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 7dbbae4e2f..1e8f232295 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -61,7 +61,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 1, 1, "tt_wait_in_depot", NULL, NULL, NULL }, { XSLFI_AUTO_TIMETABLE, XSCF_NULL, 4, 4, "auto_timetables", NULL, NULL, NULL }, { XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 2, 2, "vehicle_repair_cost", NULL, NULL, NULL }, - { 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_INFRA_SHARING, XSCF_NULL, 2, 2, "infra_sharing", NULL, NULL, "CPDP" }, { XSLFI_VARIABLE_DAY_LENGTH, XSCF_NULL, 2, 2, "variable_day_length", NULL, NULL, NULL }, { XSLFI_ORDER_OCCUPANCY, XSCF_NULL, 2, 2, "order_occupancy", NULL, NULL, NULL }, diff --git a/src/saveload/plans_sl.cpp b/src/saveload/plans_sl.cpp index 7e39d9239c..97b32b825e 100644 --- a/src/saveload/plans_sl.cpp +++ b/src/saveload/plans_sl.cpp @@ -24,13 +24,24 @@ static const SaveLoad _plan_desc[] = { 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. */ static void Save_PLAN() { Plan *p; FOR_ALL_PLANS(p) { SlSetArrayIndex(p->index); - SlObject(p, _plan_desc); + SlAutolength((AutolengthProc*) RealSave_PLAN, p); } } @@ -41,20 +52,17 @@ static void Load_PLAN() while ((index = SlIterateArray()) != -1) { Plan *p = new (index) Plan(); SlObject(p, _plan_desc); - } -} - -/** Save all plan lines. */ -static void Save_PLANLINE() -{ - Plan *p; - FOR_ALL_PLANS(p) { - for (size_t i = 0; i < p->lines.size(); i++) { - SlSetArrayIndex((uint) p->index << 16 | (uint) i); - PlanLine *pl = p->lines[i]; - size_t plsz = pl->tiles.size(); - SlSetLength(plsz * sizeof(TileIndex)); - SlArray(&pl->tiles[0], plsz, SLE_UINT32); + if (SlXvIsFeaturePresent(XSLFI_ENH_VIEWPORT_PLANS, 2)) { + const size_t line_count = SlReadUint32(); + p->lines.resize(line_count); + for (size_t i = 0; i < line_count; i++) { + PlanLine *pl = new PlanLine(); + p->lines[i] = pl; + const size_t tile_count = SlReadUint32(); + pl->tiles.resize(tile_count); + SlArray(&pl->tiles[0], tile_count, SLE_UINT32); + } + p->SetVisibility(false); } } } @@ -83,5 +91,5 @@ static void Load_PLANLINE() /** Chunk handlers related to plans. */ extern const ChunkHandler _plan_chunk_handlers[] = { { '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}, };