diff --git a/src/lang/english.txt b/src/lang/english.txt index 65f080fbb2..d605b32ce7 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4567,6 +4567,9 @@ STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Data integrity STR_GAME_SAVELOAD_NOT_AVAILABLE : STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Game was saved in version without tram support. All trams have been removed +STR_GAME_SAVELOAD_ERROR_HUGE_AIRPORTS_PRESENT :Savegame uses huge airports +STR_GAME_SAVELOAD_ERROR_HELI_OILRIG_BUG :Savegame has a helicopter on approach to a buggy oil rig + # Map generation messages STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Map generation aborted...{}... no suitable town locations STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... there is no town in this scenario diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index a0f27100f5..99ba5694a2 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -56,6 +56,7 @@ #include "../order_backup.h" #include "../error.h" #include "../disaster_vehicle.h" +#include "../tracerestrict.h" #include "saveload_internal.h" @@ -584,7 +585,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 +600,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 +2955,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. @@ -3037,6 +3058,110 @@ bool AfterLoadGame() } } + if (SlXvIsFeaturePresent(XSLFI_SPRINGPP, 1, 1)) { + /* + * Cost scaling changes: + * SpringPP v2.0.102 divides all prices by the difficulty factor, effectively making things about 8 times cheaper. + * Adjust the inflation factor to compensate for this, as otherwise the game is unplayable on load if inflation has been running for a while. + * To avoid making things too cheap, clamp the price inflation factor to no lower than the payment inflation factor. + */ + + DEBUG(sl, 3, "Inflation prices: %f", _economy.inflation_prices / 65536.0); + DEBUG(sl, 3, "Inflation payments: %f", _economy.inflation_payment / 65536.0); + + _economy.inflation_prices >>= 3; + if (_economy.inflation_prices < _economy.inflation_payment) { + _economy.inflation_prices = _economy.inflation_payment; + } + + DEBUG(sl, 3, "New inflation prices: %f", _economy.inflation_prices / 65536.0); + } + + if (SlXvIsFeaturePresent(XSLFI_SPRINGPP)) { + /* + * Reject huge airports + * Annoyingly SpringPP v2.0.102 has a bug where it uses the same ID for AT_INTERCONTINENTAL2 and AT_OILRIG, + */ + Station *st; + FOR_ALL_STATIONS(st) { + if (st->airport.tile == INVALID_TILE) continue; + StringID err = INVALID_STRING_ID; + if (st->airport.type == 9) { + if (st->dock_tile != INVALID_TILE && IsOilRig(st->dock_tile)) { + /* this airport is probably an oil rig, not a huge airport */ + } else { + err = STR_GAME_SAVELOAD_ERROR_HUGE_AIRPORTS_PRESENT; + } + st->airport.type = AT_OILRIG; + } else if (st->airport.type == 10) { + err = STR_GAME_SAVELOAD_ERROR_HUGE_AIRPORTS_PRESENT; + } + if (err != INVALID_STRING_ID) { + SetSaveLoadError(err); + /* Restore the signals */ + ResetSignalHandlers(); + return false; + } + } + } + if (SlXvIsFeaturePresent(XSLFI_SPRINGPP, 1, 1)) { + /* + * Reject helicopters aproaching oil rigs using the wrong aircraft movement data + * Annoyingly SpringPP v2.0.102 has a bug where it uses the same ID for AT_INTERCONTINENTAL2 and AT_OILRIG + */ + Aircraft *v; + FOR_ALL_AIRCRAFT(v) { + Station *st = GetTargetAirportIfValid(v); + if (st != NULL && st->dock_tile != INVALID_TILE && IsOilRig(st->dock_tile)) { + /* aircraft is on approach to an oil rig, bail out now */ + SetSaveLoadError(STR_GAME_SAVELOAD_ERROR_HELI_OILRIG_BUG); + /* Restore the signals */ + ResetSignalHandlers(); + return false; + } + } + } + + if (SlXvIsFeaturePresent(XSLFI_MIGHT_USE_PAX_SIGNALS) || SlXvIsFeatureMissing(XSLFI_TRACE_RESTRICT)) { + for (TileIndex t = 0; t < map_size; t++) { + if (HasStationTileRail(t)) { + /* clear station PAX bit */ + ClrBit(_me[t].m6, 6); + } + if (IsTileType(t, MP_RAILWAY) && HasSignals(t)) { + /* + * tracerestrict uses same bit as 1st PAX signals bit + * only conditionally clear the bit, don't bother checking for whether to set it + */ + if (IsRestrictedSignal(t)) { + TraceRestrictSetIsSignalRestrictedBit(t); + } + + /* clear 2nd signal PAX bit */ + ClrBit(_m[t].m2, 13); + } + } + } + + if (SlXvIsFeaturePresent(XSLFI_TRAFFIC_LIGHTS)) { + /* remove traffic lights */ + for (TileIndex t = 0; t < map_size; t++) { + if (IsTileType(t, MP_ROAD) && (GetRoadTileType(t) == ROAD_TILE_NORMAL)) { + DeleteAnimatedTile(t); + ClrBit(_me[t].m7, 4); + } + } + } + + if (SlXvIsFeaturePresent(XSLFI_RAIL_AGEING)) { + /* remove rail aging data */ + for (TileIndex t = 0; t < map_size; t++) { + if (IsPlainRailTile(t)) { + SB(_me[t].m7, 0, 8, 0); + } + } + } + /* Station acceptance is some kind of cache */ if (IsSavegameVersionBefore(127)) { Station *st; diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 73265c7050..cc81735f57 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -140,6 +140,40 @@ 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_SPRINGPP] = 1; + } else if (_sl_version == 221) { /* SL_SPRING_2013_v2_1_108 */ + DEBUG(sl, 1, "Loading a SpringPP 2013 v2.1.108 savegame version %d as version 188", _sl_version); + + _sl_version = 188; + _sl_xv_feature_versions[XSLFI_SPRINGPP] = 2; + } else if (_sl_version == 222) { /* SL_SPRING_2013_v2_1_147 */ + DEBUG(sl, 1, "Loading a SpringPP 2013 v2.1.147 savegame version %d as version 194", _sl_version); + + _sl_version = 194; + _sl_xv_feature_versions[XSLFI_SPRINGPP] = 3; + } + + if (_sl_xv_feature_versions[XSLFI_SPRINGPP]) { + _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_TRAFFIC_LIGHTS] = 1; + _sl_xv_feature_versions[XSLFI_RAIL_AGEING] = 1; + + _sl_xv_feature_versions[XSLFI_TIMETABLES_START_TICKS] = 1; + _sl_xv_feature_versions[XSLFI_VEHICLE_REPAIR_COST] = 1; + _sl_xv_feature_versions[XSLFI_IMPROVED_BREAKDOWNS] = 1; + _sl_xv_feature_versions[XSLFI_INFRA_SHARING] = 1; + _sl_xv_feature_versions[XSLFI_AUTO_TIMETABLE] = 1; + _sl_xv_feature_versions[XSLFI_MORE_COND_ORDERS] = 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 51349bc7dc..7f010b59ec 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -38,6 +38,13 @@ enum SlXvFeatureIndex { XSLFI_ORDER_OCCUPANCY, ///< Running average of order occupancy XSLFI_MORE_COND_ORDERS, ///< More conditional orders 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_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_SIZE, ///< Total count of features, including null feature }; diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index 3b5fd56c6c..f45346b183 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), 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..15ad396dac 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -190,7 +190,8 @@ static const SaveLoad _old_station_desc[] = { SLE_VAR(Station, time_since_load, SLE_UINT8), SLE_VAR(Station, time_since_unload, SLE_UINT8), - SLE_VAR(Station, delete_ctr, SLE_UINT8), + SLE_CONDVAR_X(Station, delete_ctr, SLE_UINT8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 0, 2)), + SLE_CONDVAR_X(Station, delete_ctr, SLE_FILE_U16 | SLE_VAR_U8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 3)), SLE_VAR(Station, owner, SLE_UINT8), SLE_VAR(Station, facilities, SLE_UINT8), SLE_VAR(Station, airport.type, SLE_UINT8), @@ -270,6 +271,7 @@ const SaveLoad *GetGoodsDesc() SLE_CONDVAR(GoodsEntry, status, SLE_UINT8, 68, SL_MAX_VERSION), SLE_CONDNULL(2, 51, 67), SLE_VAR(GoodsEntry, time_since_pickup, SLE_UINT8), + SLE_CONDNULL_X(6, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 3)), SLE_VAR(GoodsEntry, rating, SLE_UINT8), SLEG_CONDVAR( _cargo_source, SLE_FILE_U8 | SLE_VAR_U16, 0, 6), SLEG_CONDVAR( _cargo_source, SLE_UINT16, 7, 67), @@ -393,7 +395,8 @@ static const SaveLoad _base_station_desc[] = { SLE_REF(BaseStation, town, REF_TOWN), SLE_VAR(BaseStation, string_id, SLE_STRINGID), SLE_STR(BaseStation, name, SLE_STR | SLF_ALLOW_CONTROL, 0), - SLE_VAR(BaseStation, delete_ctr, SLE_UINT8), + SLE_CONDVAR_X(Station, delete_ctr, SLE_UINT8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 0, 2)), + SLE_CONDVAR_X(Station, delete_ctr, SLE_FILE_U16 | SLE_VAR_U8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 3)), SLE_VAR(BaseStation, owner, SLE_UINT8), SLE_VAR(BaseStation, facilities, SLE_UINT8), SLE_VAR(BaseStation, build_date, SLE_INT32), @@ -424,7 +427,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 6488841fd4..7ca0ec76ad 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -645,7 +645,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_VAR(Vehicle, day_counter, SLE_UINT8), SLE_VAR(Vehicle, tick_counter, SLE_UINT8), - SLE_CONDVAR(Vehicle, running_ticks, SLE_UINT8, 88, SL_MAX_VERSION), + SLE_CONDVAR_X(Vehicle, running_ticks, SLE_UINT8, 88, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 0, 2)), + SLE_CONDVAR_X(Vehicle, running_ticks, SLE_FILE_U16 | SLE_VAR_U8, 88, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 2)), SLE_VAR(Vehicle, cur_implicit_order_index, SLE_UINT8), SLE_CONDVAR(Vehicle, cur_real_order_index, SLE_UINT8, 158, SL_MAX_VERSION), @@ -726,10 +727,17 @@ 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((8 + 8 + 2 + 2 + 4 + 4 + 1 + 1) * 70, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 3)), + 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() }; @@ -799,6 +807,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Aircraft, previous_pos, SLE_UINT8, 2, SL_MAX_VERSION), SLE_CONDVAR(Aircraft, last_direction, SLE_UINT8, 2, SL_MAX_VERSION), SLE_CONDVAR(Aircraft, number_consecutive_turns, SLE_UINT8, 2, SL_MAX_VERSION), + SLE_CONDNULL_X(2, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), SLE_CONDVAR(Aircraft, turn_counter, SLE_UINT8, 136, SL_MAX_VERSION), SLE_CONDVAR(Aircraft, flags, SLE_UINT8, 167, SL_MAX_VERSION), @@ -813,6 +822,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 +883,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/settings.cpp b/src/settings.cpp index e0f4a697f5..f2019fdbde 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2066,24 +2066,27 @@ bool SetSettingValue(uint index, const char *value, bool force_newgame) /** * Given a name of setting, return a setting description of it. - * @param name Name of the setting to return a setting description of - * @param i Pointer to an integer that will contain the index of the setting after the call, if it is successful. + * @param name Name of the setting to return a setting description of + * @param i Pointer to an integer that will contain the index of the setting after the call, if it is successful. + * @param ignore_version Return a setting even if it not valid for the current savegame version * @return Pointer to the setting description of setting \a name if it can be found, * \c NULL indicates failure to obtain the description */ -const SettingDesc *GetSettingFromName(const char *name, uint *i) +const SettingDesc *GetSettingFromName(const char *name, uint *i, bool ignore_version) { const SettingDesc *sd; /* First check all full names */ for (*i = 0, sd = _settings; sd->save.cmd != SL_END; sd++, (*i)++) { - if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; + if (sd->desc.name == NULL) continue; + if (!ignore_version && !SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; if (strcmp(sd->desc.name, name) == 0) return sd; } /* Then check the shortcut variant of the name. */ for (*i = 0, sd = _settings; sd->save.cmd != SL_END; sd++, (*i)++) { - if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; + if (sd->desc.name == NULL) continue; + if (!ignore_version && !SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; const char *short_name = strchr(sd->desc.name, '.'); if (short_name != NULL) { short_name++; @@ -2094,7 +2097,8 @@ const SettingDesc *GetSettingFromName(const char *name, uint *i) if (strncmp(name, "company.", 8) == 0) name += 8; /* And finally the company-based settings */ for (*i = 0, sd = _company_settings; sd->save.cmd != SL_END; sd++, (*i)++) { - if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; + if (sd->desc.name == NULL) continue; + if (!ignore_version && !SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; if (strcmp(sd->desc.name, name) == 0) return sd; } @@ -2206,6 +2210,29 @@ void IConsoleListSettings(const char *prefilter) IConsolePrintF(CC_WARNING, "Use 'setting' command to change a value"); } +/** + * Load handler for settings, which don't go in the PATX chunk, and which are a cross-reference to another setting + * @param osd SettingDesc struct containing all information + * @param object can be either NULL in which case we load global variables or + * a pointer to a struct which is getting saved + */ +static void LoadSettingsXref(const SettingDesc *osd, void *object) { + DEBUG(sl, 3, "PATS chunk: Loading xref setting: '%s'", osd->xref); + uint index = 0; + const SettingDesc *setting_xref = GetSettingFromName(osd->xref, &index, true); + assert(setting_xref != NULL); + + // Generate a new SaveLoad from the xref target using the version params from the source + SaveLoad sld = setting_xref->save; + sld.version_from = osd->save.version_from; + sld.version_to = osd->save.version_to; + sld.ext_feature_test = osd->save.ext_feature_test; + void *ptr = GetVariableAddress(object, &sld); + + if (!SlObjectMember(ptr, &sld)) return; + if (IsNumericType(sld.conv)) Write_ValidateSetting(ptr, setting_xref, ReadValue(ptr, sld.conv)); +} + /** * Save and load handler for settings, except for those which go in the PATX chunk * @param osd SettingDesc struct containing all information @@ -2214,9 +2241,15 @@ void IConsoleListSettings(const char *prefilter) */ static void LoadSettings(const SettingDesc *osd, void *object) { + extern uint16 _sl_version; + for (; osd->save.cmd != SL_END; osd++) { if (osd->patx_name != NULL) continue; const SaveLoad *sld = &osd->save; + if (osd->xref != NULL) { + if (sld->ext_feature_test.IsFeaturePresent(_sl_version, sld->version_from, sld->version_to)) LoadSettingsXref(osd, object); + continue; + } void *ptr = GetVariableAddress(object, sld); if (!SlObjectMember(ptr, sld)) continue; @@ -2238,6 +2271,7 @@ static void SaveSettings(const SettingDesc *sd, void *object) size_t length = 0; for (i = sd; i->save.cmd != SL_END; i++) { if (i->patx_name != NULL) continue; + if (i->xref != NULL) continue; length += SlCalcObjMemberLength(object, &i->save); } SlSetLength(length); diff --git a/src/settings_internal.h b/src/settings_internal.h index e356e7e5e6..2f0021392f 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -112,6 +112,7 @@ struct SettingDesc { SettingDescBase desc; ///< Settings structure (going to configuration file) SaveLoad save; ///< Internal structure (going to savegame, parts to config) const char *patx_name; ///< Name to save/load setting from in PATX chunk, if NULL save/load from PATS chunk as normal + const char *xref; ///< Name of SettingDesc to use instead of the contents of this one, useful for loading legacy savegames, if NULL save/load as normal bool IsEditable(bool do_command = false) const; SettingType GetType() const; @@ -126,7 +127,7 @@ struct SettingDesc { * offset in a certain struct */ typedef SettingDesc SettingDescGlobVarList; -const SettingDesc *GetSettingFromName(const char *name, uint *i); +const SettingDesc *GetSettingFromName(const char *name, uint *i, bool ignore_version = false); bool SetSettingValue(uint index, int32 value, bool force_newgame = false); bool SetSettingValue(uint index, const char *value, bool force_newgame = false); void SetCompanySetting(uint index, int32 value); diff --git a/src/table/company_settings.ini b/src/table/company_settings.ini index e49f4094fa..bf3784d577 100644 --- a/src/table/company_settings.ini +++ b/src/table/company_settings.ini @@ -20,6 +20,7 @@ static const SettingDesc _company_settings[] = { [templates] SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), +SDT_NULL = SDT_NULL($length, $from, $to, $extver), SDT_END = SDT_END() [defaults] @@ -74,6 +75,11 @@ base = CompanySettings var = renew_keep_length def = false +;; allow_autoreplace_to_self +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 2) + [SDT_BOOL] base = CompanySettings var = vehicle.servint_ispercent diff --git a/src/table/settings.h.preamble b/src/table/settings.h.preamble index ed67d43c30..9e78a500ff 100644 --- a/src/table/settings.h.preamble +++ b/src/table/settings.h.preamble @@ -62,7 +62,7 @@ static size_t ConvertLandscape(const char *value); /* Macros for various objects to go in the configuration file. * This section is for global variables */ #define SDTG_GENERAL(name, sdt_cmd, sle_cmd, type, flags, guiflags, var, length, def, min, max, interval, full, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ - {NSD_GENERAL(name, def, sdt_cmd, guiflags, min, max, interval, full, str, strhelp, strval, proc, NULL, cat), SLEG_GENERAL_X(sle_cmd, var, type | flags, length, from, to, extver), patxname} + {NSD_GENERAL(name, def, sdt_cmd, guiflags, min, max, interval, full, str, strhelp, strval, proc, NULL, cat), SLEG_GENERAL_X(sle_cmd, var, type | flags, length, from, to, extver), patxname, NULL} #define SDTG_VAR(name, type, flags, guiflags, var, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDTG_GENERAL(name, SDT_NUMX, SL_VAR, type, flags, guiflags, var, 0, def, min, max, interval, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) @@ -83,14 +83,14 @@ static size_t ConvertLandscape(const char *value); SDTG_GENERAL(name, SDT_MANYOFMANY, SL_VAR, type, flags, guiflags, var, 0, def, 0, 0, 0, full, str, strhelp, strval, proc, from, to, cat, extver, patxname) #define SDTG_NULL(length, from, to, extver)\ - {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLEG_NULL_X(length, from, to, extver), NULL} + {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLEG_NULL_X(length, from, to, extver), NULL, NULL} -#define SDTG_END() {{NULL, NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLEG_END(), NULL} +#define SDTG_END() {{NULL, NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLEG_END(), NULL, NULL} /* Macros for various objects to go in the configuration file. * This section is for structures where their various members are saved */ #define SDT_GENERAL(name, sdt_cmd, sle_cmd, type, flags, guiflags, base, var, length, def, min, max, interval, full, str, strhelp, strval, proc, load, from, to, cat, extver, patxname)\ - {NSD_GENERAL(name, def, sdt_cmd, guiflags, min, max, interval, full, str, strhelp, strval, proc, load, cat), SLE_GENERAL_X(sle_cmd, base, var, type | flags, length, from, to, extver), patxname} + {NSD_GENERAL(name, def, sdt_cmd, guiflags, min, max, interval, full, str, strhelp, strval, proc, load, cat), SLE_GENERAL_X(sle_cmd, base, var, type | flags, length, from, to, extver), patxname, NULL} #define SDT_VAR(base, var, type, flags, guiflags, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDT_GENERAL(#var, SDT_NUMX, SL_VAR, type, flags, guiflags, base, var, 1, def, min, max, interval, NULL, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) @@ -114,7 +114,7 @@ static size_t ConvertLandscape(const char *value); SDT_GENERAL(#var, SDT_MANYOFMANY, SL_VAR, type, flags, guiflags, base, var, 1, def, 0, 0, 0, full, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) #define SDT_NULL(length, from, to, extver)\ - {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_CONDNULL_X(length, from, to, extver), NULL} + {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_CONDNULL_X(length, from, to, extver), NULL, NULL} #define SDTC_VAR(var, type, flags, guiflags, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ @@ -132,5 +132,8 @@ static size_t ConvertLandscape(const char *value); #define SDTC_OMANY(var, type, flags, guiflags, def, max, full, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDTG_GENERAL(#var, SDT_ONEOFMANY, SL_VAR, type, flags, guiflags, _settings_client.var, 1, def, 0, max, 0, full, str, strhelp, strval, proc, from, to, cat, extver, patxname) -#define SDT_END() {{NULL, NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_END(), NULL} +#define SDT_XREF(from, to, extver, xref)\ + {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_CONDNULL_X(0, from, to, extver), NULL, xref} + +#define SDT_END() {{NULL, NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_END(), NULL, NULL} diff --git a/src/table/settings.ini b/src/table/settings.ini index 80c0847e8a..475329b710 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -81,6 +81,7 @@ SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, SDT_STR = SDT_STR($base, $var, $type, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), SDT_NULL = SDT_NULL($length, $from, $to, $extver), +SDT_XREF = SDT_XREF( $from, $to, $extver, $xref), SDT_END = SDT_END() [defaults] @@ -97,6 +98,7 @@ to = SL_MAX_VERSION cat = SC_ADVANCED extver = SlXvFeatureTest() patxname = NULL +xref = @@ -335,6 +337,14 @@ min = 0 max = 3 cat = SC_BASIC +[SDT_XREF] +xref = ""order.timetable_automated"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""order.timetable_separation"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_BOOL] base = GameSettings var = order.timetable_automated @@ -435,6 +445,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 @@ -562,6 +573,10 @@ str = STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH strhelp = STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT strval = STR_CONFIG_SETTING_TILE_LENGTH +[SDT_XREF] +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 2) +xref = ""construction.simulated_wormhole_signals"" + [SDT_VAR] base = GameSettings var = construction.max_bridge_height @@ -606,7 +621,11 @@ from = 0 cat = SC_BASIC patxname = ""signal_tunnel_bridge.construction.simulated_wormhole_signals"" -# construction.longbridges +[SDT_XREF] +xref = ""construction.maximum_signal_evaluations"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; construction.longbridges [SDT_NULL] length = 1 to = 158 @@ -648,6 +667,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 @@ -657,6 +686,10 @@ def = true str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT +[SDT_XREF] +xref = ""economy.town_cargo_factor"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_VAR] base = GameSettings var = economy.found_town @@ -1030,6 +1063,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 @@ -1171,6 +1209,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 @@ -1214,6 +1257,10 @@ strhelp = STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT strval = STR_CONFIG_SETTING_PLANE_CRASHES_NONE cat = SC_BASIC +[SDT_XREF] +xref = ""vehicle.improved_breakdowns"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_BOOL] base = GameSettings var = vehicle.improved_breakdowns @@ -1246,6 +1293,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 @@ -1339,6 +1392,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 @@ -1396,10 +1459,22 @@ def = false str = STR_CONFIG_SETTING_MULTIPINDTOWN strhelp = STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT +;; economy.allow_automatic_industries +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 3) + [SDT_NULL] 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 @@ -1511,6 +1586,59 @@ strhelp = STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT strval = STR_CONFIG_SETTING_PERCENTAGE cat = SC_EXPERT +[SDT_XREF] +xref = ""economy.day_length_factor"" +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) + +; note that this has changed format in SpringPP 2.1.147 +[SDT_XREF] +xref = ""vehicle.pay_for_repair"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""vehicle.repair_cost"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +;; economy.town_consumption_rate +[SDT_NULL] +length = 1 +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 @@ -1558,6 +1686,43 @@ from = 77 def = true cat = SC_EXPERT + +[SDT_XREF] +xref = ""economy.infrastructure_sharing[0]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""economy.infrastructure_sharing[1]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""economy.infrastructure_sharing[2]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""economy.infrastructure_sharing[3]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""economy.sharing_fee[0]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""economy.sharing_fee[1]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""economy.sharing_fee[2]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""economy.sharing_fee[3]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + +[SDT_XREF] +xref = ""economy.sharing_payment_in_debt"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) + [SDT_VAR] base = GameSettings var = construction.maximum_signal_evaluations @@ -2015,6 +2180,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 @@ -2320,6 +2490,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 diff --git a/src/tracerestrict.cpp b/src/tracerestrict.cpp index 968a22c8ea..10fa437e41 100644 --- a/src/tracerestrict.cpp +++ b/src/tracerestrict.cpp @@ -559,7 +559,7 @@ void SetTraceRestrictTypeAndNormalise(TraceRestrictItem &item, TraceRestrictItem * Sets the "signal has a trace restrict mapping" bit * This looks for mappings with that tile index */ -void SetIsSignalRestrictedBit(TileIndex t) +void TraceRestrictSetIsSignalRestrictedBit(TileIndex t) { // First mapping for this tile, or later TraceRestrictMapping::iterator lower_bound = _tracerestrictprogram_mapping.lower_bound(MakeTraceRestrictRefId(t, static_cast(0))); @@ -590,7 +590,7 @@ void TraceRestrictCreateProgramMapping(TraceRestrictRefId ref, TraceRestrictProg TileIndex tile = GetTraceRestrictRefIdTileIndex(ref); Track track = GetTraceRestrictRefIdTrack(ref); - SetIsSignalRestrictedBit(tile); + TraceRestrictSetIsSignalRestrictedBit(tile); MarkTileDirtyByTile(tile); YapfNotifyTrackLayoutChange(tile, track); } @@ -614,7 +614,7 @@ void TraceRestrictRemoveProgramMapping(TraceRestrictRefId ref) TileIndex tile = GetTraceRestrictRefIdTileIndex(ref); Track track = GetTraceRestrictRefIdTrack(ref); - SetIsSignalRestrictedBit(tile); + TraceRestrictSetIsSignalRestrictedBit(tile); MarkTileDirtyByTile(tile); YapfNotifyTrackLayoutChange(tile, track); diff --git a/src/tracerestrict.h b/src/tracerestrict.h index 6913234bc7..b2f01f2649 100644 --- a/src/tracerestrict.h +++ b/src/tracerestrict.h @@ -489,6 +489,7 @@ static inline Track GetTraceRestrictRefIdTrack(TraceRestrictRefId ref) return static_cast(ref & 7); } +void TraceRestrictSetIsSignalRestrictedBit(TileIndex t); void TraceRestrictCreateProgramMapping(TraceRestrictRefId ref, TraceRestrictProgram *prog); void TraceRestrictRemoveProgramMapping(TraceRestrictRefId ref);