From 3035b91b5cc2cf31f1b765392a07907a1f6d2516 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 8 Jul 2024 18:48:25 +0100 Subject: [PATCH] Saveload: Use table format for speed adaptation chunk --- src/sl/extended_ver_sl.cpp | 2 +- src/sl/train_speed_adaptation.cpp | 42 +++++++++++++++---------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/sl/extended_ver_sl.cpp b/src/sl/extended_ver_sl.cpp index 5168991b83..0eba2cc3fb 100644 --- a/src/sl/extended_ver_sl.cpp +++ b/src/sl/extended_ver_sl.cpp @@ -163,7 +163,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_MORE_HOUSES, XSCF_NULL, 2, 2, "more_houses", nullptr, nullptr, nullptr }, { XSLFI_CUSTOM_TOWN_ZONE, XSCF_IGNORABLE_UNKNOWN, 1, 1, "custom_town_zone", nullptr, nullptr, nullptr }, { XSLFI_STATION_CARGO_HISTORY, XSCF_NULL, 2, 2, "station_cargo_history", nullptr, nullptr, nullptr }, - { XSLFI_TRAIN_SPEED_ADAPTATION, XSCF_NULL, 2, 2, "train_speed_adaptation", nullptr, nullptr, "TSAS" }, + { XSLFI_TRAIN_SPEED_ADAPTATION, XSCF_NULL, 3, 3, "train_speed_adaptation", nullptr, nullptr, "TSAS" }, { XSLFI_EXTRA_STATION_NAMES, XSCF_NULL, 1, 1, "extra_station_names", nullptr, nullptr, nullptr }, { XSLFI_DEPOT_ORDER_EXTRA_FLAGS, XSCF_IGNORABLE_UNKNOWN, 1, 1, "depot_order_extra_flags", nullptr, nullptr, nullptr }, { XSLFI_EXTRA_SIGNAL_TYPES, XSCF_NULL, 1, 1, "extra_signal_types", nullptr, nullptr, nullptr }, diff --git a/src/sl/train_speed_adaptation.cpp b/src/sl/train_speed_adaptation.cpp index 55ab6692b8..93817351ed 100644 --- a/src/sl/train_speed_adaptation.cpp +++ b/src/sl/train_speed_adaptation.cpp @@ -13,47 +13,45 @@ using SignalSpeedType = std::pair; -static const SaveLoad _train_speed_adaptation_map_desc[] = { - SLE_CONDVAR_X(SignalSpeedType, first.signal_track, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TRAIN_SPEED_ADAPTATION, 1, 1)), - SLE_CONDVAR_X(SignalSpeedType, first.signal_track, SLE_UINT16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TRAIN_SPEED_ADAPTATION, 2)), - SLE_VAR(SignalSpeedType, first.last_passing_train_dir, SLE_UINT8), - SLE_VAR(SignalSpeedType, second.train_speed, SLE_UINT16), - SLE_VAR(SignalSpeedType, second.time_stamp, SLE_UINT64), +static const NamedSaveLoad _train_speed_adaptation_map_desc[] = { + NSLT("signal_tile", SLE_VAR(SignalSpeedType, first.signal_tile, SLE_UINT32)), + NSL("signal_track", SLE_CONDVAR_X(SignalSpeedType, first.signal_track, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TRAIN_SPEED_ADAPTATION, 1, 1))), + NSL("signal_track", SLE_CONDVAR_X(SignalSpeedType, first.signal_track, SLE_UINT16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TRAIN_SPEED_ADAPTATION, 2))), + NSL("last_passing_train_dir", SLE_VAR(SignalSpeedType, first.last_passing_train_dir, SLE_UINT8)), + NSL("train_speed", SLE_VAR(SignalSpeedType, second.train_speed, SLE_UINT16)), + NSL("time_stamp", SLE_VAR(SignalSpeedType, second.time_stamp, SLE_UINT64)), }; -static std::vector _filtered_train_speed_adaptation_map_desc; - static void Load_TSAS() { - _filtered_train_speed_adaptation_map_desc = SlFilterObject(_train_speed_adaptation_map_desc); + const bool table_mode = SlIsTableChunk(); + std::vector slt = SlTableHeaderOrRiff(_train_speed_adaptation_map_desc); + int index; SignalSpeedType data; while ((index = SlIterateArray()) != -1) { - const_cast(data.first).signal_tile = index; - SlObjectLoadFiltered(&data, _filtered_train_speed_adaptation_map_desc); + if (!table_mode) { + const_cast(data.first).signal_tile = index; + } + SlObjectLoadFiltered(&data, slt); _signal_speeds.insert(data); } - _filtered_train_speed_adaptation_map_desc.clear(); -} - -static void RealSave_TSAS(SignalSpeedType *data) -{ - SlObjectSaveFiltered(data, _filtered_train_speed_adaptation_map_desc); } static void Save_TSAS() { - _filtered_train_speed_adaptation_map_desc = SlFilterObject(_train_speed_adaptation_map_desc); + std::vector slt = SlTableHeader(_train_speed_adaptation_map_desc); + + int index = 0; for (auto &it : _signal_speeds) { - SlSetArrayIndex(it.first.signal_tile); + SlSetArrayIndex(index++); SignalSpeedType *data = ⁢ - SlAutolength((AutolengthProc*) RealSave_TSAS, data); + SlObjectSaveFiltered(data, slt); } - _filtered_train_speed_adaptation_map_desc.clear(); } extern const ChunkHandler train_speed_adaptation_chunk_handlers[] = { - { 'TSAS', Save_TSAS, Load_TSAS, nullptr, nullptr, CH_SPARSE_ARRAY }, + { 'TSAS', Save_TSAS, Load_TSAS, nullptr, nullptr, CH_TABLE }, }; extern const ChunkHandlerTable _train_speed_adaptation_chunk_handlers(train_speed_adaptation_chunk_handlers);