Add initial support for loading JokerPP savegames

See #123
pull/128/head
Jonathan G Rennison 4 years ago
parent c75ed00f0f
commit d56d4ea51f

@ -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

@ -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<OrderList *> _jokerpp_auto_separation;
extern std::vector<OrderList *> _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)) {

@ -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()
};

@ -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;
}

@ -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
};

@ -16,6 +16,10 @@
#include "../safeguards.h"
static uint32 _jokerpp_separation_mode;
std::vector<OrderList *> _jokerpp_auto_separation;
std::vector<OrderList *> _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);
}
}
}
}

@ -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()
};

@ -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. */

@ -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()
};

@ -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()

@ -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),

@ -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];

@ -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()
};

@ -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

@ -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]

Loading…
Cancel
Save