From 39608841f2b5f3c4f271be486dc1c4eb5a24a9e9 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 31 Jul 2015 17:34:57 +0100 Subject: [PATCH] Initial support for loading savegames from SpringPP v2.0.102/103 Savegame version 220 Bin all extra settings added in SpringPP. Bin extra features: trip histories, more conditional orders/jump counter, prev order time, snow-line chunk, town auto adv. campaign, etc. Fix vehicle flags. Fix bridges wrt height changes. Handle 60-bit RIFF chunk sizes. Doesn't deal with huge airports, loading games with these may lead to undefined ehaviour. PAX signals and traffic lights are ignored. --- src/saveload/afterload.cpp | 22 ++++- src/saveload/extended_ver_sl.cpp | 19 ++++ src/saveload/extended_ver_sl.h | 5 + src/saveload/order_sl.cpp | 2 + src/saveload/saveload.cpp | 12 +++ src/saveload/station_sl.cpp | 2 + src/saveload/town_sl.cpp | 30 +++++- src/saveload/vehicle_sl.cpp | 9 ++ src/table/settings.ini | 151 ++++++++++++++++++++++++++++++- 9 files changed, 246 insertions(+), 6 deletions(-) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 334a598c38..1b0badcc51 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -584,7 +584,7 @@ bool AfterLoadGame() } } - if (IsSavegameVersionBefore(194)) { + if (IsSavegameVersionBefore(194) && SlXvIsFeatureMissing(XSLFI_HEIGHT_8_BIT)) { _settings_game.construction.max_heightlevel = 15; /* In old savegame versions, the heightlevel was coded in bits 0..3 of the type field */ @@ -599,6 +599,17 @@ bool AfterLoadGame() SB(_m[t].type, 2, 2, 0); } } + } else if (SlXvIsFeaturePresent(XSLFI_HEIGHT_8_BIT)) { + for (TileIndex t = 0; t < map_size; t++) { + SB(_m[t].type, 0, 2, GB(_me[t].m6, 0, 2)); + SB(_me[t].m6, 0, 2, 0); + if (MayHaveBridgeAbove(t)) { + SB(_m[t].type, 2, 2, GB(_me[t].m6, 6, 2)); + SB(_me[t].m6, 6, 2, 0); + } else { + SB(_m[t].type, 2, 2, 0); + } + } } /* in version 2.1 of the savegame, town owner was unified. */ @@ -2943,6 +2954,15 @@ bool AfterLoadGame() } } + if (SlXvIsFeaturePresent(XSLFI_SPRINGPP)) { + // re-arrange vehicle_flags + Vehicle *v; + FOR_ALL_VEHICLES(v) { + SB(v->vehicle_flags, VF_AUTOMATE_TIMETABLE, 1, GB(v->vehicle_flags, 6, 1)); + SB(v->vehicle_flags, VF_STOP_LOADING, 4, GB(v->vehicle_flags, 7, 4)); + } + } + if (IsSavegameVersionBefore(188)) { /* Fix articulated road vehicles. * Some curves were shorter than other curves. diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 4d0fdafaa1..a840e2c3ae 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -138,6 +138,25 @@ void SlXvCheckSpecialSavegameVersions() _sl_is_faked_ext = true; _sl_xv_feature_versions[XSLFI_TRACE_RESTRICT] = 1; } + + if (_sl_version == 220) { /* SL_SPRING_2013_v2_0_102 */ + DEBUG(sl, 1, "Loading a SpringPP 2013 v2.0.102 savegame version %d as version 187", _sl_version); + + _sl_version = 187; + _sl_xv_feature_versions[XSLFI_RIFF_HEADER_60_BIT] = 1; + _sl_xv_feature_versions[XSLFI_HEIGHT_8_BIT] = 1; + _sl_xv_feature_versions[XSLFI_MIGHT_USE_PAX_SIGNALS] = 1; + + _sl_xv_feature_versions[XSLFI_TIMETABLES_START_TICKS] = 1; + _sl_xv_feature_versions[XSLFI_VEHICLE_REPAIR_COST] = 1; + _sl_xv_feature_versions[XLSFI_IMPROVED_BREAKDOWNS] = 1; + _sl_xv_feature_versions[XSLFI_INFRA_SHARING] = 1; + _sl_xv_feature_versions[XSLFI_AUTO_TIMETABLE] = 1; + + _sl_xv_feature_versions[XSLFI_SPRINGPP] = 1; + + _sl_xv_discardable_chunk_ids.push_back('SNOW'); + } } /** diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index b8ce1ea0fe..f0c395cac2 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -36,6 +36,11 @@ enum SlXvFeatureIndex { XSLFI_INFRA_SHARING, ///< Infrastructure sharing patch XSLFI_VARIABLE_DAY_LENGTH, ///< Variable day length patch + XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit + XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk + XSLFI_MIGHT_USE_PAX_SIGNALS, ///< This save game might use the pax-signals feature + XSLFI_SPRINGPP, ///< This is a SpringPP 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 d55d577cb6..6e610e7b05 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -106,6 +106,7 @@ const SaveLoad *GetOrderDescription() static const SaveLoad _order_desc[] = { SLE_VAR(Order, type, SLE_UINT8), SLE_VAR(Order, flags, SLE_UINT8), + SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), SLE_VAR(Order, dest, SLE_UINT16), SLE_REF(Order, next, REF_ORDER), SLE_CONDVAR(Order, refit_cargo, SLE_UINT8, 36, SL_MAX_VERSION), @@ -113,6 +114,7 @@ const SaveLoad *GetOrderDescription() SLE_CONDVAR(Order, wait_time, SLE_UINT16, 67, SL_MAX_VERSION), SLE_CONDVAR(Order, travel_time, SLE_UINT16, 67, SL_MAX_VERSION), SLE_CONDVAR(Order, max_speed, SLE_UINT16, 172, SL_MAX_VERSION), + SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), /* Leftover from the minor savegame version stuff * We will never use those free bytes, but we have to keep this line to allow loading of old savegames */ diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 3cc555a350..9df256bb2c 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1695,6 +1695,12 @@ static void SlLoadChunk(const ChunkHandler *ch) /* Read length */ len = (SlReadByte() << 16) | ((m >> 4) << 24); len += SlReadUint16(); + if (SlXvIsFeaturePresent(XSLFI_RIFF_HEADER_60_BIT)) { + if (len != 0) { + SlErrorCorrupt("RIFF chunk too large"); + } + len = SlReadUint32(); + } _sl.obj_len = len; endoffs = _sl.reader->GetSize() + len; ch->load_proc(); @@ -1741,6 +1747,12 @@ static void SlLoadCheckChunk(const ChunkHandler *ch) /* Read length */ len = (SlReadByte() << 16) | ((m >> 4) << 24); len += SlReadUint16(); + if (SlXvIsFeaturePresent(XSLFI_RIFF_HEADER_60_BIT)) { + if (len != 0) { + SlErrorCorrupt("RIFF chunk too large"); + } + len = SlReadUint32(); + } _sl.obj_len = len; endoffs = _sl.reader->GetSize() + len; if (ch && ch->load_check_proc) { diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 3db5e1f5f8..7ddd3ce0e9 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -424,7 +424,9 @@ static const SaveLoad _station_desc[] = { SLE_CONDVAR(Station, airport.h, SLE_FILE_U8 | SLE_VAR_U16, 140, SL_MAX_VERSION), SLE_VAR(Station, airport.type, SLE_UINT8), SLE_CONDVAR(Station, airport.layout, SLE_UINT8, 145, SL_MAX_VERSION), + SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), SLE_VAR(Station, airport.flags, SLE_UINT64), + SLE_CONDNULL_X(8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), SLE_CONDVAR(Station, airport.rotation, SLE_UINT8, 145, SL_MAX_VERSION), SLEG_CONDARR(_old_st_persistent_storage.storage, SLE_UINT32, 16, 145, 160), SLE_CONDREF(Station, airport.psa, REF_STORAGE, 161, SL_MAX_VERSION), diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 7db6a7aa6f..1ffca9f637 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -137,6 +137,7 @@ static const SaveLoad _town_desc[] = { SLE_CONDVAR(Town, have_ratings, SLE_UINT16, 104, SL_MAX_VERSION), SLE_CONDARR(Town, ratings, SLE_INT16, 8, 0, 103), SLE_CONDARR(Town, ratings, SLE_INT16, MAX_COMPANIES, 104, SL_MAX_VERSION), + SLE_CONDNULL_X(MAX_COMPANIES, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), /* failed bribe attempts are stored since savegame format 4 */ SLE_CONDARR(Town, unwanted, SLE_INT8, 8, 4, 103), SLE_CONDARR(Town, unwanted, SLE_INT8, MAX_COMPANIES, 104, SL_MAX_VERSION), @@ -217,6 +218,15 @@ static const SaveLoad _town_received_desc[] = { SLE_END() }; +static const SaveLoad _town_received_desc_spp[] = { + SLE_CONDVAR(TransportedCargoStat, old_max, SLE_FILE_U32 | SLE_VAR_U16, 165, SL_MAX_VERSION), + SLE_CONDVAR(TransportedCargoStat, new_max, SLE_FILE_U32 | SLE_VAR_U16, 165, SL_MAX_VERSION), + SLE_CONDVAR(TransportedCargoStat, old_act, SLE_FILE_U32 | SLE_VAR_U16, 165, SL_MAX_VERSION), + SLE_CONDVAR(TransportedCargoStat, new_act, SLE_FILE_U32 | SLE_VAR_U16, 165, SL_MAX_VERSION), + + SLE_END() +}; + static void Save_HIDS() { Save_NewGRFMapping(_house_mngr); @@ -247,8 +257,14 @@ static void RealSave_Town(Town *t) for (CargoID i = 0; i < NUM_CARGO; i++) { SlObject(&t->supplied[i], _town_supplied_desc); } - for (int i = TE_BEGIN; i < NUM_TE; i++) { - SlObject(&t->received[i], _town_received_desc); + if (SlXvIsFeaturePresent(XSLFI_SPRINGPP)) { + for (int i = TE_BEGIN; i < NUM_TE; i++) { + SlObject(&t->received[i], _town_received_desc_spp); + } + } else { + for (int i = TE_BEGIN; i < NUM_TE; i++) { + SlObject(&t->received[i], _town_received_desc); + } } if (IsSavegameVersionBefore(166)) return; @@ -281,8 +297,14 @@ static void Load_TOWN() for (CargoID i = 0; i < NUM_CARGO; i++) { SlObject(&t->supplied[i], _town_supplied_desc); } - for (int i = TE_BEGIN; i < TE_END; i++) { - SlObject(&t->received[i], _town_received_desc); + if (SlXvIsFeaturePresent(XSLFI_SPRINGPP)) { + for (int i = TE_BEGIN; i < NUM_TE; i++) { + SlObject(&t->received[i], _town_received_desc_spp); + } + } else { + for (int i = TE_BEGIN; i < NUM_TE; i++) { + SlObject(&t->received[i], _town_received_desc); + } } if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GB(t->townnametype, 11, 5) != 15) { diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index a396a2fe30..2b504c7aa8 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -726,10 +726,16 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Vehicle, current_order_time, SLE_UINT32, 67, SL_MAX_VERSION), SLE_CONDVAR_X(Vehicle, current_loading_time, SLE_UINT32, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_AUTO_TIMETABLE)), + SLE_CONDNULL_X(4, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), SLE_CONDVAR(Vehicle, lateness_counter, SLE_INT32, 67, SL_MAX_VERSION), SLE_CONDNULL(10, 2, 143), // old reserved space + SLE_CONDNULL_X((8 + 8 + 2 + 2 + 4 + 4 + 1 + 1) * 30, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), + SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), + SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), + SLE_CONDNULL_X(2, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), + SLE_END() }; @@ -813,6 +819,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_VAR(Vehicle, subtype, SLE_UINT8), + SLE_CONDNULL_X(5, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), + SLE_CONDVAR(Vehicle, tile, SLE_FILE_U16 | SLE_VAR_U32, 0, 5), SLE_CONDVAR(Vehicle, tile, SLE_UINT32, 6, SL_MAX_VERSION), @@ -872,6 +880,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(DisasterVehicle, image_override, SLE_UINT32, 191, SL_MAX_VERSION), SLE_CONDVAR(DisasterVehicle, big_ufo_destroyer_target, SLE_FILE_U16 | SLE_VAR_U32, 0, 190), SLE_CONDVAR(DisasterVehicle, big_ufo_destroyer_target, SLE_UINT32, 191, SL_MAX_VERSION), + SLE_CONDNULL_X(2, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), SLE_CONDVAR(DisasterVehicle, flags, SLE_UINT8, 194, SL_MAX_VERSION), SLE_CONDNULL(16, 2, 143), // old reserved space diff --git a/src/table/settings.ini b/src/table/settings.ini index 479b57dc26..c33075d357 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -335,6 +335,24 @@ min = 0 max = 3 cat = SC_BASIC +[SDT_BOOL] +base = GameSettings +var = order.timetable_automated +def = true +str = STR_CONFIG_SETTING_TIMETABLE_AUTOMATED +strhelp = STR_CONFIG_SETTING_TIMETABLE_AUTOMATED_HELPTEXT +cat = SC_EXPERT +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_BOOL] +base = GameSettings +var = order.timetable_separation +def = true +str = STR_CONFIG_SETTING_TIMETABLE_SEPARATION +strhelp = STR_CONFIG_SETTING_TIMETABLE_SEPARATION_HELPTEXT +cat = SC_EXPERT +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_BOOL] base = GameSettings var = order.timetable_automated @@ -420,6 +438,7 @@ strhelp = STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT strval = STR_JUST_INT proc = ChangeMaxHeightLevel cat = SC_BASIC +extver = SlXvFeatureTest(XSLFTO_OR, XSLFI_HEIGHT_8_BIT) [SDT_BOOL] base = GameSettings @@ -582,7 +601,12 @@ from = 0 cat = SC_BASIC patxname = ""signal_tunnel_bridge.construction.simulated_wormhole_signals"" -# construction.longbridges +;; construction.maximum_signal_evaluations +[SDT_NULL] +length = 2 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; construction.longbridges [SDT_NULL] length = 1 to = 158 @@ -624,6 +648,16 @@ strhelp = STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT strval = STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT proc = TownFoundingChanged +;; economy.town_construction_cost +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.station_rating_type +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_BOOL] base = GameSettings var = economy.allow_town_roads @@ -633,6 +667,11 @@ def = true str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT +;; economy.town_cargo_factor +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_VAR] base = GameSettings var = economy.found_town @@ -1006,6 +1045,11 @@ def = false str = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT +;; vehicle.exact_intro_date +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_VAR] base = GameSettings var = vehicle.max_trains @@ -1147,6 +1191,11 @@ strhelp = STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT strval = STR_JUST_COMMA proc = UpdateConsists +;; vehicle.freight_mult_to_passengers +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + ; order.timetabling [SDT_NULL] length = 1 @@ -1198,6 +1247,11 @@ def = false str = STR_CONFIG_SETTING_IMPROVED_BREAKDOWNS patxname = ""improved_breakdowns.vehicle.improved_breakdowns"" +;; vehicle.improved_breakdowns +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + ; station.join_stations [SDT_NULL] length = 1 @@ -1222,6 +1276,12 @@ var = order.selectgoods def = true cat = SC_EXPERT +;; economy.deliver_goods +;; vehicle.cargo_wait_time +[SDT_NULL] +length = 2 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDTC_BOOL] var = gui.sg_new_nonstop from = 22 @@ -1315,6 +1375,16 @@ str = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS strhelp = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT proc = DeleteSelectStationWindow +;; construction.traffic_lights +;; construction.towns_build_traffic_lights +;; construction.allow_building_tls_in_towns +;; construction.traffic_lights_green_phase +;; construction.max_tlc_size +;; construction.max_tlc_distance +[SDT_NULL] +length = 6 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + ## [SDT_BOOL] base = GameSettings @@ -1376,6 +1446,13 @@ strhelp = STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT length = 1 to = 140 +;; economy.minimum_distance_town +;; economy.minimum_distance_industry +;; economy.minimum_distance_ind_town +[SDT_NULL] +length = 6 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_BOOL] base = GameSettings var = economy.bribe @@ -1487,6 +1564,53 @@ strhelp = STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT strval = STR_CONFIG_SETTING_PERCENTAGE cat = SC_EXPERT +;; economy.day_length_factor +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.price_mult[0-70] +[SDT_NULL] +length = 71 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.price_rails[0-15] +[SDT_NULL] +length = 16 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.rail_maintenance[0-15] +[SDT_NULL] +length = 16 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.pay_for_repair +;; economy.repair_cost +;; economy.town_consumption_rate +[SDT_NULL] +length = 3 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.town_pop_* +[SDT_NULL] +length = 6 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.town_consumption_rates[0-2][0-2] +[SDT_NULL] +length = 18 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.town_effects[0-2] +[SDT_NULL] +length = 3 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.grow_if_one_delivered +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_VAR] base = GameSettings var = economy.town_growth_rate @@ -1534,6 +1658,21 @@ from = 77 def = true cat = SC_EXPERT +;; economy.infrastructure_sharing[0-3] +[SDT_NULL] +length = 4 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.sharing_fee[0-3] +[SDT_NULL] +length = 16 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.sharing_payment_in_debt +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_VAR] base = GameSettings var = construction.maximum_signal_evaluations @@ -1991,6 +2130,11 @@ min = 0 max = 100000 cat = SC_EXPERT +# pf.npf.npf_road_trafficlight_penalty +[SDT_NULL] +length = 4 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_VAR] base = GameSettings var = pf.npf.npf_road_dt_occupied_penalty @@ -2296,6 +2440,11 @@ min = 0 max = 1000000 cat = SC_EXPERT +# pf.yapf.road_trafficlight_penalty +[SDT_NULL] +length = 4 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_VAR] base = GameSettings var = pf.yapf.road_stop_penalty