From d56d4ea51f737ff92d26fe43a8df7accec71b459 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 28 Dec 2019 13:06:22 +0000 Subject: [PATCH] Add initial support for loading JokerPP savegames See #123 --- README.md | 11 +++- src/saveload/afterload.cpp | 47 ++++++++++++--- src/saveload/economy_sl.cpp | 1 + src/saveload/extended_ver_sl.cpp | 24 ++++++++ src/saveload/extended_ver_sl.h | 1 + src/saveload/order_sl.cpp | 15 +++++ src/saveload/plans_sl.cpp | 1 + src/saveload/saveload.h | 9 +++ src/saveload/station_sl.cpp | 4 ++ src/saveload/tbtr_template_veh_sl.cpp | 1 + src/saveload/town_sl.cpp | 3 + src/saveload/tracerestrict_sl.cpp | 9 +++ src/saveload/vehicle_sl.cpp | 7 ++- src/table/gameopt_settings.ini | 5 ++ src/table/settings.ini | 82 ++++++++++++++++++++++++++- 15 files changed, 207 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 1c5a930c3e..e9dd9e31ff 100644 --- a/README.md +++ b/README.md @@ -211,8 +211,10 @@ See [jgrpp-changelog.md](jgrpp-changelog.md) for changelog. * Savegames from this patchpack are not loadable in trunk. * Savegames from trunk up to the last savegame version which has been merged into this branch (*jgrpp*) should be loadable in this patchpack. * Savegames from other branches which use the save/load code in the *save_ext* branch (usually suffixed: *-sx*) which are also merged into this branch (*jgrpp*), or where the added feature is marked as discardable/ignorable, should be loadable in this patchpack. - * Savegames from other patched versions are not loadable in this patchpack except for savegames from the *tracerestrict* branch ([routing restrictions patch](http://www.tt-forums.net/viewtopic.php?f=33&t=73397)), - savegames from the [Spring 2013 Patch Pack](http://www.tt-forums.net/viewtopic.php?f=33&t=66892) v2.0 - v2.4 (subject to caveats, see below). + * Savegames from other patched versions are not loadable in this patchpack except for savegames from: + * The *tracerestrict* branch ([routing restrictions patch](http://www.tt-forums.net/viewtopic.php?f=33&t=73397)) + * The [Spring 2013 Patch Pack](http://www.tt-forums.net/viewtopic.php?f=33&t=66892) v2.0 - v2.4 (subject to caveats, see below) + * [Joker's Patch Pack](https://www.tt-forums.net/viewtopic.php?f=33&t=74365) v1.19 - v1.27 (subject to caveats, see below) * Miscellaneous * Various improvements to the crash logger. @@ -276,6 +278,11 @@ See [jgrpp-changelog.md](jgrpp-changelog.md) for changelog. * Savegames which have aircraft approaching, landing, taking off or landed at an oil rig are rejected * The inflation cost multiplier is adjusted on load +#### Caveats for loading savegames from [Joker's Patch Pack](https://www.tt-forums.net/viewtopic.php?f=33&t=74365): +* This is not guaranteed to be bug free +* Logic signals are cleared, leaving ordinary signals +* Various vehicle separation settings and partially-automatic modes are not supported. +* Rail ageing/grass on tracks, trip histories, waiting cargo histories, station cargo punishment and other features not in this patch pack are dropped/ignored. #### A note on branches diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 757f7814d3..39f759a877 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -794,7 +794,7 @@ bool AfterLoadGame() /* The value of _date_fract got divided, so make sure that old games are converted correctly. */ if (IsSavegameVersionBefore(SLV_11, 1) || (IsSavegameVersionBefore(SLV_147) && _date_fract > DAY_TICKS)) _date_fract /= 885; - if (SlXvIsFeaturePresent(XSLFI_SPRINGPP)) { + if (SlXvIsFeaturePresent(XSLFI_SPRINGPP) || SlXvIsFeaturePresent(XSLFI_JOKERPP)) { assert(_settings_game.economy.day_length_factor >= 1); _tick_skip_counter = _date_fract % _settings_game.economy.day_length_factor; _date_fract /= _settings_game.economy.day_length_factor; @@ -803,7 +803,7 @@ bool AfterLoadGame() } /* Set day length factor to 1 if loading a pre day length savegame */ - if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH) && SlXvIsFeatureMissing(XSLFI_SPRINGPP)) { + if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH) && SlXvIsFeatureMissing(XSLFI_SPRINGPP) && SlXvIsFeatureMissing(XSLFI_JOKERPP)) { _settings_game.economy.day_length_factor = 1; } @@ -1424,7 +1424,7 @@ bool AfterLoadGame() } } - if (IsSavegameVersionBefore(SLV_ROAD_TYPES)) { + if (IsSavegameVersionBefore(SLV_ROAD_TYPES) && !SlXvIsFeaturePresent(XSLFI_JOKERPP, SL_JOKER_1_27)) { /* Add road subtypes */ for (TileIndex t = 0; t < map_size; t++) { bool has_road = false; @@ -1971,6 +1971,13 @@ bool AfterLoadGame() v->current_order.SetLoadType(OLFB_NO_LOAD); } } + } else if (SlXvIsFeaturePresent(XSLFI_JOKERPP, 1, SL_JOKER_1_23)) { + Order* order; + FOR_ALL_ORDERS(order) { + if (order->IsType(OT_CONDITIONAL) && order->GetConditionVariable() == OCV_SLOT_OCCUPANCY) { + order->GetXDataRef() = order->GetConditionValue(); + } + } } if (IsSavegameVersionBefore(SLV_84)) { @@ -3364,6 +3371,35 @@ bool AfterLoadGame() } } + if (SlXvIsFeaturePresent(XSLFI_JOKERPP)) { + for (TileIndex t = 0; t < map_size; t++) { + if (IsTileType(t, MP_RAILWAY) && HasSignals(t)) { + if (GetSignalType(t, TRACK_LOWER) == SIGTYPE_PROG) SetSignalType(t, TRACK_LOWER, SIGTYPE_NORMAL); + if (GetSignalType(t, TRACK_UPPER) == SIGTYPE_PROG) SetSignalType(t, TRACK_UPPER, SIGTYPE_NORMAL); + } + } + Vehicle *v; + FOR_ALL_VEHICLES(v) { + SB(v->vehicle_flags, 10, 2, 0); + } + extern std::vector _jokerpp_auto_separation; + extern std::vector _jokerpp_non_auto_separation; + for (OrderList *list : _jokerpp_auto_separation) { + for (Vehicle *w = list->GetFirstSharedVehicle(); w != nullptr; w = w->NextShared()) { + SetBit(w->vehicle_flags, VF_TIMETABLE_SEPARATION); + w->ClearSeparation(); + } + } + for (OrderList *list : _jokerpp_non_auto_separation) { + for (Vehicle *w = list->GetFirstSharedVehicle(); w != nullptr; w = w->NextShared()) { + ClrBit(w->vehicle_flags, VF_TIMETABLE_SEPARATION); + w->ClearSeparation(); + } + } + _jokerpp_auto_separation.clear(); + _jokerpp_non_auto_separation.clear(); + } + /* * Only keep order-backups for network clients (and when replaying). * If we are a network server or not networking, then we just loaded a previously @@ -3688,11 +3724,6 @@ bool AfterLoadGame() _settings_game.economy.town_cargo_scale_factor = _settings_game.economy.old_town_cargo_factor * 10; } - /* Set day length factor to 1 if loading a pre day length savegame */ - if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH) && SlXvIsFeatureMissing(XSLFI_SPRINGPP)) { - _settings_game.economy.day_length_factor = 1; - } - if (SlXvIsFeatureMissing(XSLFI_SAFER_CROSSINGS)) { for (TileIndex t = 0; t < map_size; t++) { if (IsLevelCrossingTile(t)) { diff --git a/src/saveload/economy_sl.cpp b/src/saveload/economy_sl.cpp index f98998fabd..f69dd6d554 100644 --- a/src/saveload/economy_sl.cpp +++ b/src/saveload/economy_sl.cpp @@ -46,6 +46,7 @@ static const SaveLoad _economy_desc[] = { SLE_VAR(Economy, infl_amount, SLE_UINT8), SLE_VAR(Economy, infl_amount_pr, SLE_UINT8), SLE_CONDVAR(Economy, industry_daily_change_counter, SLE_UINT32, SLV_102, SL_MAX_VERSION), + SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), SLE_END() }; diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index f622fa2fc9..83d2bf7774 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -230,6 +230,30 @@ bool SlXvCheckSpecialSavegameVersions() _sl_maybe_springpp = true; return true; } + if (_sl_version >= SL_JOKER_1_19 && _sl_version <= SL_JOKER_1_27) { /* 278 - 286 */ + DEBUG(sl, 1, "Loading a JokerPP savegame version %d as version 197", _sl_version); + _sl_xv_feature_versions[XSLFI_JOKERPP] = _sl_version; + _sl_xv_feature_versions[XSLFI_TOWN_CARGO_ADJ] = 1; + _sl_xv_feature_versions[XSLFI_TEMPLATE_REPLACEMENT] = 1; + _sl_xv_feature_versions[XSLFI_VEH_LIFETIME_PROFIT] = 1; + _sl_xv_feature_versions[XSLFI_TRAIN_FLAGS_EXTRA] = 1; + _sl_xv_feature_versions[XSLFI_SIG_TUNNEL_BRIDGE] = 5; + _sl_xv_feature_versions[XSLFI_REVERSE_AT_WAYPOINT] = 1; + _sl_xv_feature_versions[XSLFI_MULTIPLE_DOCKS] = 1; + _sl_xv_feature_versions[XSLFI_ST_LAST_VEH_TYPE] = 1; + _sl_xv_feature_versions[XSLFI_MORE_RAIL_TYPES] = 1; + _sl_xv_feature_versions[XSLFI_CHUNNEL] = 1; + _sl_xv_feature_versions[XSLFI_MORE_COND_ORDERS] = 1; + _sl_xv_feature_versions[XSLFI_TRACE_RESTRICT] = 1; + if (_sl_version >= SL_JOKER_1_21) _sl_xv_feature_versions[XSLFI_LINKGRAPH_DAY_SCALE] = 1; + if (_sl_version >= SL_JOKER_1_24) _sl_xv_feature_versions[XSLFI_TIMETABLE_EXTRA] = 1; + if (_sl_version >= SL_JOKER_1_24) _sl_xv_feature_versions[XSLFI_ORDER_EXTRA_DATA] = 1; + _sl_xv_discardable_chunk_ids.push_back('SPRG'); + _sl_xv_discardable_chunk_ids.push_back('SLNK'); + _sl_version = SLV_197; + _sl_is_faked_ext = true; + return true; + } return false; } diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 0e22829e0d..2b1ee2db03 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -84,6 +84,7 @@ enum SlXvFeatureIndex { XSLFI_TRAFFIC_LIGHTS, ///< This save game uses road traffic lights XSLFI_RAIL_AGEING, ///< This save game uses the rail aging patch XSLFI_SPRINGPP, ///< This is a SpringPP game, use this for loading some settings + XSLFI_JOKERPP, ///< This is a JokerPP game, use this for loading some settings XSLFI_SIZE, ///< Total count of features, including null feature }; diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index 032fa886d7..8379943e12 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -16,6 +16,10 @@ #include "../safeguards.h" +static uint32 _jokerpp_separation_mode; +std::vector _jokerpp_auto_separation; +std::vector _jokerpp_non_auto_separation; + /** * Converts this order from an old savegame's version; * it moves all bits to the new location. @@ -257,6 +261,8 @@ const SaveLoad *GetOrderListDescription() SLE_CONDVAR_X(OrderList, scheduled_dispatch_start_full_date_fract, SLE_UINT16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SCHEDULED_DISPATCH)), SLE_CONDVAR_X(OrderList, scheduled_dispatch_last_dispatch, SLE_INT32, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SCHEDULED_DISPATCH)), SLE_CONDVAR_X(OrderList, scheduled_dispatch_max_delay, SLE_INT32, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SCHEDULED_DISPATCH)), + SLEG_CONDVAR_X(_jokerpp_separation_mode, SLE_UINT32, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), + SLE_CONDNULL_X(21, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), SLE_END() }; @@ -275,12 +281,21 @@ static void Save_ORDL() static void Load_ORDL() { + _jokerpp_auto_separation.clear(); + _jokerpp_non_auto_separation.clear(); int index; while ((index = SlIterateArray()) != -1) { /* set num_orders to 0 so it's a valid OrderList */ OrderList *list = new (index) OrderList(0); SlObject(list, GetOrderListDescription()); + if (SlXvIsFeaturePresent(XSLFI_JOKERPP)) { + if (_jokerpp_separation_mode == 0) { + _jokerpp_auto_separation.push_back(list); + } else { + _jokerpp_non_auto_separation.push_back(list); + } + } } } diff --git a/src/saveload/plans_sl.cpp b/src/saveload/plans_sl.cpp index ffa0ed8ece..ea694e8801 100644 --- a/src/saveload/plans_sl.cpp +++ b/src/saveload/plans_sl.cpp @@ -20,6 +20,7 @@ static const SaveLoad _plan_desc[] = { SLE_VAR(Plan, visible_by_all, SLE_BOOL), SLE_VAR(Plan, creation_date, SLE_INT32), SLE_CONDSTDSTR_X(Plan, name, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ENH_VIEWPORT_PLANS, 3)), + SLE_CONDSTDSTR_X(Plan, name, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_20)), SLE_END() }; diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index c3561e6bdc..ed3a1b065f 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -319,6 +319,15 @@ enum SaveLoadVersion : uint16 { SL_TRACE_RESTRICT_2000 = 2000, SL_TRACE_RESTRICT_2001 = 2001, SL_TRACE_RESTRICT_2002 = 2002, + SL_JOKER_1_19 = 278, + SL_JOKER_1_20 = 279, + SL_JOKER_1_21 = 280, + SL_JOKER_1_22 = 281, + SL_JOKER_1_23 = 282, + SL_JOKER_1_24 = 283, + SL_JOKER_1_25 = 284, + SL_JOKER_1_26 = 285, + SL_JOKER_1_27 = 286, }; /** Save or load result codes. */ diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 8779553dc9..1ce33db9ec 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -206,6 +206,7 @@ static const SaveLoad _old_station_desc[] = { SLE_CONDNULL(2, SL_MIN_VERSION, SLV_26), ///< last-vehicle SLEG_CONDVAR_X(_old_last_vehicle_type, SLE_UINT8, SLV_26, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ST_LAST_VEH_TYPE, 0, 0)), + SLE_CONDNULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), SLE_CONDNULL(2, SLV_3, SLV_26), ///< custom station class and id SLE_CONDVAR(Station, build_date, SLE_FILE_U16 | SLE_VAR_I32, SLV_3, SLV_31), @@ -292,6 +293,7 @@ const SaveLoad *GetGoodsDesc() SLE_CONDVAR(GoodsEntry, node, SLE_UINT16, SLV_183, SL_MAX_VERSION), SLEG_CONDVAR( _num_flows, SLE_UINT32, SLV_183, SL_MAX_VERSION), SLE_CONDVAR(GoodsEntry, max_waiting_cargo, SLE_UINT32, SLV_183, SL_MAX_VERSION), + SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), SLE_CONDVAR_X(GoodsEntry, last_vehicle_type, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ST_LAST_VEH_TYPE, 1)), SLE_END() }; @@ -457,10 +459,12 @@ static const SaveLoad _station_desc[] = { SLE_VAR(Station, time_since_load, SLE_UINT8), SLE_VAR(Station, time_since_unload, SLE_UINT8), SLEG_CONDVAR_X(_old_last_vehicle_type, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ST_LAST_VEH_TYPE, 0, 0)), + SLE_CONDNULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), SLE_VAR(Station, had_vehicle_of_type, SLE_UINT8), SLE_VEC(Station, loading_vehicles, REF_VEHICLE), SLE_CONDVAR(Station, always_accepted, SLE_FILE_U32 | SLE_VAR_U64, SLV_127, SLV_EXTEND_CARGOTYPES), SLE_CONDVAR(Station, always_accepted, SLE_UINT64, SLV_EXTEND_CARGOTYPES, SL_MAX_VERSION), + SLE_CONDNULL_X(32 * 24, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_22)), SLE_END() }; diff --git a/src/saveload/tbtr_template_veh_sl.cpp b/src/saveload/tbtr_template_veh_sl.cpp index a4dfa95089..16067f1e96 100644 --- a/src/saveload/tbtr_template_veh_sl.cpp +++ b/src/saveload/tbtr_template_veh_sl.cpp @@ -43,6 +43,7 @@ const SaveLoad* GTD() { SLE_CONDNULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TEMPLATE_REPLACEMENT, 0, 3)), SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TEMPLATE_REPLACEMENT, 0, 1)), SLE_CONDNULL_X(36, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TEMPLATE_REPLACEMENT, 2, 3)), + SLE_CONDNULL_X(36, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_TEMPLATE_REPLACEMENT, 0, 3)), SLE_END() diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 12051a79a6..6246950b8b 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -184,10 +184,13 @@ static const SaveLoad _town_desc[] = { SLE_CONDVAR(Town, grow_counter, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_54), SLE_CONDVAR(Town, growth_rate, SLE_FILE_U8 | SLE_VAR_I16, SL_MIN_VERSION, SLV_54), + SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), SLE_CONDVAR(Town, time_until_rebuild, SLE_UINT16, SLV_54, SL_MAX_VERSION), + SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_26)), SLE_CONDVAR(Town, grow_counter, SLE_UINT16, SLV_54, SL_MAX_VERSION), SLE_CONDVAR(Town, growth_rate, SLE_FILE_I16 | SLE_VAR_U16, SLV_54, SLV_165), + SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_26)), SLE_CONDVAR(Town, growth_rate, SLE_UINT16, SLV_165, SL_MAX_VERSION), SLE_VAR(Town, fund_buildings_months, SLE_UINT8), diff --git a/src/saveload/tracerestrict_sl.cpp b/src/saveload/tracerestrict_sl.cpp index 1fd99aa8f7..885cc04e2a 100644 --- a/src/saveload/tracerestrict_sl.cpp +++ b/src/saveload/tracerestrict_sl.cpp @@ -65,6 +65,15 @@ static void Load_TRRP() SlObject(&stub, _trace_restrict_program_stub_desc); prog->items.resize(stub.length); SlArray(&(prog->items[0]), stub.length, SLE_UINT32); + if (SlXvIsFeaturePresent(XSLFI_JOKERPP)) { + for (size_t i = 0; i < prog->items.size(); i++) { + TraceRestrictItem &item = prog->items[i]; // note this is a reference, + if (GetTraceRestrictType(item) == 19 || GetTraceRestrictType(item) == 20) { + SetTraceRestrictType(item, (TraceRestrictItemType)(GetTraceRestrictType(item) + 2)); + } + if (IsTraceRestrictDoubleItem(item)) i++; + } + } CommandCost validation_result = prog->Validate(); if (validation_result.Failed()) { char str[4096]; diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 8627681a60..34846c3fc3 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -670,10 +670,10 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_VAR(Vehicle, day_counter, SLE_UINT8), SLE_VAR(Vehicle, tick_counter, SLE_UINT8), SLE_CONDVAR_X(Vehicle, running_ticks, SLE_FILE_U8 | SLE_VAR_U16, SLV_88, SL_MAX_VERSION, SlXvFeatureTest([](uint16 version, bool version_in_range) -> bool { - return version_in_range && !(SlXvIsFeaturePresent(XSLFI_SPRINGPP, 3) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); + return version_in_range && !(SlXvIsFeaturePresent(XSLFI_SPRINGPP, 3) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); })), SLE_CONDVAR_X(Vehicle, running_ticks, SLE_UINT16, SLV_88, SL_MAX_VERSION, SlXvFeatureTest([](uint16 version, bool version_in_range) -> bool { - return version_in_range && (SlXvIsFeaturePresent(XSLFI_SPRINGPP, 2) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); + return version_in_range && (SlXvIsFeaturePresent(XSLFI_SPRINGPP, 2) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); })), SLE_VAR(Vehicle, cur_implicit_order_index, SLE_UINT8), @@ -761,6 +761,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Vehicle, current_order_time, SLE_UINT32, SLV_67, SL_MAX_VERSION), SLE_CONDVAR_X(Vehicle, current_loading_time, SLE_UINT32, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_AUTO_TIMETABLE)), + SLE_CONDVAR_X(Vehicle, current_loading_time, SLE_UINT32, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_23)), SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), SLE_CONDVAR(Vehicle, lateness_counter, SLE_INT32, SLV_67, SL_MAX_VERSION), @@ -772,6 +773,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDNULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), + SLE_CONDNULL_X(160, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), + SLE_END() }; diff --git a/src/table/gameopt_settings.ini b/src/table/gameopt_settings.ini index e6f22a6e35..0233372e25 100644 --- a/src/table/gameopt_settings.ini +++ b/src/table/gameopt_settings.ini @@ -153,6 +153,11 @@ min = MIN_SNOWLINE_HEIGHT * TILE_HEIGHT max = MAX_SNOWLINE_HEIGHT * TILE_HEIGHT to = SLV_22 +;;game_creation.desert_amount +[SDT_NULL] +length = 2 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_NULL] length = 1 from = SLV_22 diff --git a/src/table/settings.ini b/src/table/settings.ini index 38a9bba30f..5cc18f2def 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -637,6 +637,10 @@ strval = STR_CONFIG_SETTING_TILE_LENGTH extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 2) xref = ""construction.simulated_wormhole_signals"" +[SDT_XREF] +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) +xref = ""construction.simulated_wormhole_signals"" + [SDT_VAR] base = GameSettings var = construction.max_bridge_height @@ -693,6 +697,10 @@ patxname = ""signal_tunnel_bridge.construction.simulated_wormhole_signals"" xref = ""construction.maximum_signal_evaluations"" extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) +[SDT_XREF] +xref = ""construction.chunnel"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + ;; construction.longbridges [SDT_NULL] length = 1 @@ -803,6 +811,11 @@ strhelp = STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT strval = STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL cat = SC_ADVANCED +;; economy.max_town_heightlevel +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + ; link graph [SDT_VAR] @@ -837,7 +850,7 @@ var = linkgraph.recalc_not_scaled_by_daylength def = true str = STR_CONFIG_SETTING_LINKGRAPH_NOT_DAYLENGTH_SCALED strhelp = STR_CONFIG_SETTING_LINKGRAPH_NOT_DAYLENGTH_SCALED_HELPTEXT -extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_LINKGRAPH_DAY_SCALE) +extver = SlXvFeatureTest([](uint16 version, bool version_in_range) -> bool { return version_in_range && SlXvIsFeaturePresent(XSLFI_LINKGRAPH_DAY_SCALE) && !SlXvIsFeaturePresent(XSLFI_JOKERPP); }) patxname = ""linkgraph_day_scale.linkgraph.recalc_not_scaled_by_daylength"" [SDT_ENUM] @@ -1074,6 +1087,10 @@ strval = STR_JUST_INT extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_TOWN_CARGO_ADJ, 1, 1) patxname = ""town_cargo_adj.economy.town_cargo_factor"" +[SDT_XREF] +xref = ""economy.old_town_cargo_factor"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_VAR] base = GameSettings var = economy.town_cargo_scale_factor @@ -1158,6 +1175,11 @@ strhelp = STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT proc = InvalidateShipPathCache cat = SC_EXPERT +;; pf.back_of_one_way_pbs_waiting_point +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_VAR] base = GameSettings var = vehicle.max_train_length @@ -1409,6 +1431,16 @@ str = STR_CONFIG_SETTING_WAGONSPEEDLIMITS strhelp = STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT proc = UpdateConsists +;; vehicle.slow_road_vehicles_in_curves +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_25) + +;; vehicle.train_speed_adaption +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_BOOL] base = GameSettings var = vehicle.disable_elrails @@ -1562,6 +1594,19 @@ cat = SC_EXPERT length = 2 extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) +;; order.automatic_timetable_separation +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + +;; order.timetable_auto_travel_buffer +;; order.timetable_auto_load_buffer +;; order.timetable_auto_travel_rounding +;; order.timetable_auto_load_rounding +[SDT_NULL] +length = 4 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_24) + [SDTC_BOOL] var = gui.sg_new_nonstop from = SLV_22 @@ -1678,6 +1723,10 @@ str = STR_CONFIG_SETTING_ENABLE_ROAD_CUSTOM_BRIDGE_HEADS strhelp = STR_CONFIG_SETTING_ENABLE_ROAD_CUSTOM_BRIDGE_HEADS_HELPTEXT patxname = ""custom_bridge_heads.construction.road_custom_bridge_heads"" +[SDT_XREF] +xref = ""construction.road_custom_bridge_heads"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_BOOL] base = GameSettings var = construction.rail_custom_bridge_heads @@ -1895,6 +1944,11 @@ str = STR_CONFIG_SETTING_ALLOW_GIVE_MONEY strhelp = STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT cat = SC_BASIC +;; game_creation.tree_line_height +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_VAR] base = GameSettings var = game_creation.snow_line_height @@ -1908,6 +1962,11 @@ strhelp = STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT strval = STR_JUST_COMMA cat = SC_BASIC +;;game_creation.desert_amount +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_NULL] length = 4 to = SLV_144 @@ -2109,6 +2168,10 @@ strhelp = STR_CONFIG_SETTING_TOWN_MIN_DISTANCE_HELPTEXT strval = STR_JUST_INT patxname = ""town_min_distance.economy.town_min_distance"" +[SDT_XREF] +xref = ""economy.town_min_distance"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_XREF] xref = ""economy.infrastructure_sharing[0]"" extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) @@ -2260,6 +2323,10 @@ str = STR_CONFIG_SETTING_SHARING_PAYMENT_IN_DEBT extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING) patxname = ""infra_sharing.economy.sharing_payment_in_debt"" +[SDT_XREF] +xref = ""economy.day_length_factor"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + ; previously ai-new setting. [SDT_NULL] length = 1 @@ -3215,6 +3282,14 @@ strval = STR_CONFIG_SETTING_TREE_GROWTH_NORMAL cat = SC_BASIC patxname = ""reduced_tree_growth.construction.tree_growth_rate"" +[SDT_XREF] +xref = ""construction.tree_growth_rate"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + +[SDT_XREF] +xref = ""construction.trees_around_snow_line_range"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + [SDT_VAR] base = GameSettings var = game_creation.custom_sea_level @@ -3258,6 +3333,11 @@ str = STR_CONFIG_SETTING_RIVER_AMOUNT strhelp = STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT strval = STR_RIVERS_NONE +;;game_creation.build_public_roads +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) + ; locale [SDT_OMANY]