/*
 * This file is part of OpenTTD.
 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
 */

/** @file settings_compat.h Tables for loading non-table format settings chunks. */

#ifndef SETTINGS_COMPAT_H
#define SETTINGS_COMPAT_H

#define SLCX_VAR(name) {name, SettingsCompatType::Setting, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(), nullptr}
#define SLCX_NULL_X(length, from, to, extver) {{}, SettingsCompatType::Null, length, from, to, extver, nullptr}
#define SLCX_NULL(length, from, to) SLCX_NULL_X(length, from, to, SlXvFeatureTest())
#define SLCX_XREF(name, from, to, extver) {name, SettingsCompatType::Xref, 0, from, to, extver, nullptr}
#define SLCX_XREFCVT(name, from, to, extver, cvt) {name, SettingsCompatType::Xref, 0, from, to, extver, cvt}

static std::initializer_list<SettingsCompat> _gameopt_compat{
	SLCX_VAR("diff_custom"),
	SLCX_VAR("diff_level"),
	SLCX_VAR("locale.currency"),
	SLCX_VAR("units"),
	SLCX_VAR("game_creation.town_name"),
	SLCX_VAR("game_creation.landscape"),
	SLCX_VAR("game_creation.snow_line_height"),
	SLCX_NULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), // game_creation.desert_amount
	SLCX_NULL(1, SLV_22, SLV_165),
	SLCX_NULL(1, SL_MIN_VERSION, SLV_23),
	SLCX_VAR("vehicle.road_side"),
};

static std::initializer_list<SettingsCompat> _settings_compat{
	SLCX_VAR("difficulty.max_no_competitors"),
	SLCX_NULL(1, SLV_97, SLV_110), // difficulty.competitor_start_time
	SLCX_VAR("difficulty.number_towns"),
	SLCX_VAR("difficulty.industry_density"),
	SLCX_VAR("difficulty.max_loan"),
	SLCX_VAR("difficulty.initial_interest"),
	SLCX_VAR("difficulty.vehicle_costs"),
	SLCX_VAR("difficulty.competitor_speed"),
	SLCX_NULL(1, SLV_97, SLV_110), // difficulty.competitor_intelligence
	SLCX_VAR("difficulty.vehicle_breakdowns"),
	SLCX_VAR("difficulty.subsidy_multiplier"),
	SLCX_VAR("difficulty.subsidy_duration"),
	SLCX_VAR("difficulty.construction_cost"),
	SLCX_VAR("difficulty.terrain_type"),
	SLCX_VAR("difficulty.quantity_sea_lakes"),
	SLCX_VAR("difficulty.economy"),
	SLCX_VAR("difficulty.line_reverse_mode"),
	SLCX_VAR("difficulty.disasters"),
	SLCX_VAR("difficulty.town_council_tolerance"),
	SLCX_VAR("diff_level"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("order.old_timetable_separation", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_VAR("game_creation.town_name"),
	SLCX_VAR("game_creation.landscape"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), // snow line upper byte
	SLCX_NULL(1, SLV_97, SLV_164), // snow line
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // game_creation.desert_amount
	SLCX_NULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), // game_creation.tree_line
	SLCX_VAR("vehicle.road_side"),
	SLCX_VAR("construction.map_height_limit"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), // construction.allow_more_heightlevels
	SLCX_VAR("game_creation.heightmap_height"),
	SLCX_VAR("construction.build_on_slopes"),
	SLCX_VAR("construction.command_pause_level"),
	SLCX_VAR("construction.terraform_per_64k_frames"),
	SLCX_VAR("construction.terraform_frame_burst"),
	SLCX_VAR("construction.clear_per_64k_frames"),
	SLCX_VAR("construction.clear_frame_burst"),
	SLCX_VAR("construction.tree_per_64k_frames"),
	SLCX_VAR("construction.tree_frame_burst"),
	SLCX_VAR("construction.autoslope"),
	SLCX_VAR("construction.extra_dynamite"),
	SLCX_VAR("construction.max_bridge_length"),
	SLCX_XREF("construction.old_simulated_wormhole_signals", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 2)),
	SLCX_XREF("construction.old_simulated_wormhole_signals", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_VAR("construction.max_bridge_height"),
	SLCX_VAR("construction.max_tunnel_length"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_233)), // construction.max_chunnel_exit_length
	SLCX_XREF("construction.maximum_signal_evaluations", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("construction.chunnel", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_NULL(1, SL_MIN_VERSION, SLV_159), // construction.longbridges
	SLCX_VAR("construction.train_signal_side"),
	SLCX_VAR("station.never_expire_airports"),
	SLCX_VAR("economy.town_layout"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.town_construction_cost
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.station_rating_type
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 7)), // economy.scale_industry_production
	SLCX_VAR("economy.allow_town_roads"),
	SLCX_XREF("economy.old_town_cargo_factor", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.day_length_factor", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_VAR("economy.found_town"),
	SLCX_VAR("economy.allow_town_level_crossings"),
	SLCX_XREF("economy.old_town_cargo_factor", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_VAR("economy.town_cargogen_mode"),
	SLCX_XREF("economy.max_town_heightlevel", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_VAR("linkgraph.recalc_interval"),
	SLCX_VAR("linkgraph.recalc_time"),
	SLCX_VAR("linkgraph.distribution_pax"),
	SLCX_VAR("linkgraph.distribution_mail"),
	SLCX_VAR("linkgraph.distribution_armoured"),
	SLCX_VAR("linkgraph.distribution_default"),
	SLCX_VAR("linkgraph.distribution_per_cargo[0]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[1]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[2]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[3]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[4]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[5]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[6]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[7]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[8]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[9]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[10]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[11]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[12]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[13]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[14]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[15]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[16]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[17]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[18]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[19]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[20]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[21]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[22]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[23]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[24]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[25]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[26]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[27]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[28]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[29]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[30]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[31]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[32]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[33]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[34]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[35]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[36]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[37]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[38]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[39]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[40]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[41]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[42]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[43]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[44]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[45]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[46]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[47]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[48]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[49]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[50]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[51]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[52]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[53]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[54]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[55]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[56]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[57]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[58]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[59]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[60]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[61]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[62]"),
	SLCX_VAR("linkgraph.distribution_per_cargo[63]"),
	SLCX_VAR("linkgraph.accuracy"),
	SLCX_VAR("linkgraph.demand_distance"),
	SLCX_VAR("linkgraph.demand_size"),
	SLCX_VAR("linkgraph.short_path_saturation"),
	SLCX_VAR("linkgraph.aircraft_link_scale"),
	SLCX_XREF("economy.old_town_cargo_factor", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_VAR("vehicle.train_acceleration_model"),
	SLCX_VAR("vehicle.roadveh_acceleration_model"),
	SLCX_VAR("vehicle.train_slope_steepness"),
	SLCX_VAR("vehicle.roadveh_slope_steepness"),
	SLCX_VAR("pf.forbid_90_deg"),
	SLCX_XREF("pf.back_of_one_way_pbs_waiting_point", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_XREF("pf.back_of_one_way_pbs_waiting_point", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_VAR("vehicle.max_train_length"),
	SLCX_NULL(1, SL_MIN_VERSION, SLV_159), // vehicle.mammoth_trains
	SLCX_VAR("vehicle.smoke_amount"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SLV_159, SlXvFeatureTest(XSLFTO_OR, XSLFI_CHILLPP, SL_CHILLPP_232)), // order.gotodepot
	SLCX_VAR("pf.roadveh_queue"),
	SLCX_VAR("pf.new_pathfinding_all"),
	SLCX_VAR("pf.yapf.ship_use_yapf"),
	SLCX_VAR("pf.yapf.road_use_yapf"),
	SLCX_VAR("pf.yapf.rail_use_yapf"),
	SLCX_VAR("pf.pathfinder_for_trains"),
	SLCX_VAR("pf.pathfinder_for_roadvehs"),
	SLCX_VAR("pf.pathfinder_for_ships"),
	SLCX_VAR("vehicle.never_expire_vehicles"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // vehicle.exact_intro_date
	SLCX_VAR("vehicle.max_trains"),
	SLCX_VAR("vehicle.max_roadveh"),
	SLCX_VAR("vehicle.max_aircraft"),
	SLCX_VAR("vehicle.max_ships"),
	SLCX_VAR("vehicle.servint_ispercent"),
	SLCX_VAR("vehicle.servint_trains"),
	SLCX_VAR("vehicle.servint_roadveh"),
	SLCX_VAR("vehicle.servint_ships"),
	SLCX_VAR("vehicle.servint_aircraft"),
	SLCX_VAR("order.no_servicing_if_no_breakdowns"),
	SLCX_VAR("vehicle.wagon_speed_limits"),
	SLCX_XREF("vehicle.slow_road_vehicles_in_curves", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_25)),
	SLCX_XREF("vehicle.train_speed_adaptation", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_VAR("vehicle.disable_elrails"),
	SLCX_VAR("vehicle.freight_trains"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // vehicle.freight_mult_to_passengers
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // ticks_per_minute
	SLCX_NULL_X(1, SLV_67, SLV_159, SlXvFeatureTest(XSLFTO_OR, XSLFI_CHILLPP, SL_CHILLPP_232)), // order.timetabling
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), // order.timetable_automated
	SLCX_XREF("order.old_timetable_separation", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_VAR("vehicle.plane_speed"),
	SLCX_VAR("vehicle.dynamic_engines"),
	SLCX_VAR("vehicle.plane_crashes"),
	SLCX_XREF("vehicle.improved_breakdowns", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("vehicle.improved_breakdowns", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_NULL(1, SL_MIN_VERSION, SLV_159), // station.join_stations
	SLCX_VAR("gui.sg_full_load_any"),
	SLCX_VAR("order.improved_load"),
	SLCX_VAR("order.selectgoods"),
	SLCX_NULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.deliver_goods, vehicle.cargo_wait_time
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), // order.automatic_timetable_separation
	SLCX_NULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_24)), // order.timetable_auto_{travel_buffer, load_buffer, travel_rounding, load_rounding}
	SLCX_VAR("gui.sg_new_nonstop"),
	SLCX_NULL(1, SL_MIN_VERSION, SLV_159), // station.nonuniform_stations
	SLCX_VAR("station.station_spread"),
	SLCX_VAR("order.serviceathelipad"),
	SLCX_VAR("station.modified_catchment"),
	SLCX_VAR("station.serve_neutral_industries"),
	SLCX_VAR("order.gradual_loading"),
	SLCX_VAR("construction.road_stop_on_town_road"),
	SLCX_VAR("construction.road_stop_on_competitor_road"),
	SLCX_XREF("construction.road_custom_bridge_heads", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_VAR("station.adjacent_stations"),
	SLCX_VAR("economy.station_noise_level"),
	SLCX_VAR("station.distant_join_stations"),
	SLCX_NULL_X(6, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // construction.{traffic_lights, towns_build_traffic_lights, allow_building_tls_in_towns, traffic_lights_green_phase, max_tlc_size, max_tlc_distance}
	SLCX_VAR("economy.inflation"),
	SLCX_VAR("construction.raw_industry_construction"),
	SLCX_VAR("construction.industry_platform"),
	SLCX_VAR("economy.multiple_industry_per_town"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 4)), // economy.allow_automatic_industries
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // construction.extra_industry_placement_logic
	SLCX_NULL(1, SL_MIN_VERSION, SLV_141),
	SLCX_NULL_X(6, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.minimum_distance_{town, industry, ind_town}
	SLCX_VAR("economy.bribe"),
	SLCX_VAR("economy.exclusive_rights"),
	SLCX_VAR("economy.fund_buildings"),
	SLCX_VAR("economy.fund_roads"),
	SLCX_VAR("economy.give_money"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), // game_creation.tree_line_height
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), // snow line upper byte
	SLCX_VAR("game_creation.snow_line_height"),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // game_creation.desert_amount
	SLCX_NULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), // game_creation.tree_line
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)), // game_creation.desert_amount
	SLCX_VAR("game_creation.snow_coverage"),
	SLCX_VAR("game_creation.desert_coverage"),
	SLCX_NULL_X(4, SL_MIN_VERSION, SLV_144, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, 0, 0)),
	SLCX_VAR("game_creation.starting_year"),
	SLCX_NULL(4, SL_MIN_VERSION, SLV_105),
	SLCX_VAR("game_creation.ending_year"),
	SLCX_VAR("economy.type"),
	SLCX_VAR("economy.allow_shares"),
	SLCX_VAR("economy.min_years_for_shares"),
	SLCX_VAR("economy.feeder_payment_share"),
	SLCX_XREF("economy.day_length_factor", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_NULL_X(71, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.price_mult[0-70]
	SLCX_NULL_X(16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.price_rails[0-15]
	SLCX_NULL_X(16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.rail_maintenance[0-15]
	SLCX_XREF("vehicle.pay_for_repair", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // note that this has changed format in SpringPP 2.1.147
	SLCX_XREF("vehicle.repair_cost", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_NULL_X(7, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.town_consumption_rate, economy.town_pop_*
	SLCX_NULL_X(18, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.town_consumption_rates[0-2][0-2]
	SLCX_NULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // economy.town_effects[0-2], economy.grow_if_one_delivered
	SLCX_VAR("economy.town_growth_rate"),
	SLCX_VAR("economy.larger_towns"),
	SLCX_VAR("economy.initial_city_size"),
	SLCX_NULL_X(10, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // economy.{town_growth_cargo, town_pop_need_goods, larger_town_growth_cargo, larger_town_pop_need_goods}
	SLCX_VAR("economy.mod_road_rebuild"),
	SLCX_XREF("construction.maximum_signal_evaluations", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_XREF("economy.town_min_distance", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_XREF("economy.infrastructure_sharing[0]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.infrastructure_sharing[1]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.infrastructure_sharing[2]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.infrastructure_sharing[3]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.sharing_fee[0]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.sharing_fee[1]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.sharing_fee[2]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.sharing_fee[3]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.sharing_payment_in_debt", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
	SLCX_XREF("economy.infrastructure_sharing[0]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.infrastructure_sharing[1]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.infrastructure_sharing[2]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.infrastructure_sharing[3]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.sharing_fee[0]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.sharing_fee[1]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.sharing_fee[2]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.sharing_fee[3]", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.sharing_payment_in_debt", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_XREF("economy.day_length_factor", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_NULL(1, SL_MIN_VERSION, SLV_107), // previously ai-new setting
	SLCX_NULL(1, SLV_178, SLV_TABLE_CHUNKS), // previously script.settings_profile
	SLCX_VAR("ai.ai_in_multiplayer"),
	SLCX_VAR("ai.ai_disable_veh_train"),
	SLCX_VAR("ai.ai_disable_veh_roadveh"),
	SLCX_VAR("ai.ai_disable_veh_aircraft"),
	SLCX_VAR("ai.ai_disable_veh_ship"),
	SLCX_VAR("script.script_max_opcode_till_suspend"),
	SLCX_VAR("script.script_max_memory_megabytes"),
	SLCX_VAR("vehicle.extend_vehicle_life"),
	SLCX_VAR("economy.dist_local_authority"),
	SLCX_VAR("pf.reverse_at_signals"),
	SLCX_VAR("pf.wait_oneway_signal"),
	SLCX_VAR("pf.wait_twoway_signal"),
	SLCX_VAR("economy.town_noise_population[0]"),
	SLCX_VAR("economy.town_noise_population[1]"),
	SLCX_VAR("economy.town_noise_population[2]"),
	SLCX_VAR("economy.infrastructure_maintenance"),
	SLCX_XREF("economy.infrastructure_maintenance", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)),
	SLCX_NULL_X(6, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // construction.traffic_lights...
	SLCX_XREF("linkgraph.recalc_interval", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_XREFCVT("linkgraph.distribution_pax", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP), LinkGraphDistModeXrefChillPP),
	SLCX_XREFCVT("linkgraph.distribution_mail", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP), LinkGraphDistModeXrefChillPP),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), // linkgraph.distribution_express
	SLCX_XREFCVT("linkgraph.distribution_armoured", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP), LinkGraphDistModeXrefChillPP),
	SLCX_XREFCVT("linkgraph.distribution_default", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP), LinkGraphDistModeXrefChillPP),
	SLCX_XREF("linkgraph.accuracy", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_XREF("linkgraph.demand_size", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_XREF("linkgraph.demand_distance", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_XREF("linkgraph.short_path_saturation", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)),
	SLCX_NULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // linkgraph.no_overload_links
	SLCX_VAR("pf.wait_for_pbs_path"),
	SLCX_VAR("pf.reserve_paths"),
	SLCX_VAR("pf.path_backoff_interval"),
	SLCX_NULL(3, SL_MIN_VERSION, SLV_REMOVE_OPF), // pf.opf.pf_maxlength & pf.opf.pf_maxdepth
	SLCX_VAR("pf.npf.npf_max_search_nodes"),
	SLCX_VAR("pf.npf.npf_rail_firstred_penalty"),
	SLCX_VAR("pf.npf.npf_rail_firstred_exit_penalty"),
	SLCX_VAR("pf.npf.npf_rail_lastred_penalty"),
	SLCX_VAR("pf.npf.npf_rail_station_penalty"),
	SLCX_VAR("pf.npf.npf_rail_slope_penalty"),
	SLCX_VAR("pf.npf.npf_rail_curve_penalty"),
	SLCX_VAR("pf.npf.npf_rail_depot_reverse_penalty"),
	SLCX_VAR("pf.npf.npf_rail_pbs_cross_penalty"),
	SLCX_VAR("pf.npf.npf_rail_pbs_signal_back_penalty"),
	SLCX_VAR("pf.npf.npf_buoy_penalty"),
	SLCX_VAR("pf.npf.npf_water_curve_penalty"),
	SLCX_VAR("pf.npf.npf_road_curve_penalty"),
	SLCX_VAR("pf.npf.npf_crossing_penalty"),
	SLCX_VAR("pf.npf.npf_road_drive_through_penalty"),
	SLCX_NULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // pf.npf.npf_road_trafficlight_penalty
	SLCX_NULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // pf.npf.npf_road_trafficlight_penalty
	SLCX_VAR("pf.npf.npf_road_dt_occupied_penalty"),
	SLCX_VAR("pf.npf.npf_road_bay_occupied_penalty"),
	SLCX_VAR("pf.npf.maximum_go_to_depot_penalty"),
	SLCX_VAR("pf.yapf.disable_node_optimization"),
	SLCX_VAR("pf.yapf.max_search_nodes"),
	SLCX_VAR("pf.yapf.rail_firstred_twoway_eol"),
	SLCX_VAR("pf.yapf.rail_firstred_penalty"),
	SLCX_VAR("pf.yapf.rail_firstred_exit_penalty"),
	SLCX_VAR("pf.yapf.rail_lastred_penalty"),
	SLCX_VAR("pf.yapf.rail_lastred_exit_penalty"),
	SLCX_VAR("pf.yapf.rail_station_penalty"),
	SLCX_VAR("pf.yapf.rail_slope_penalty"),
	SLCX_VAR("pf.yapf.rail_curve45_penalty"),
	SLCX_VAR("pf.yapf.rail_curve90_penalty"),
	SLCX_VAR("pf.yapf.rail_depot_reverse_penalty"),
	SLCX_VAR("pf.yapf.rail_crossing_penalty"),
	SLCX_VAR("pf.yapf.rail_look_ahead_max_signals"),
	SLCX_VAR("pf.yapf.rail_look_ahead_signal_p0"),
	SLCX_VAR("pf.yapf.rail_look_ahead_signal_p1"),
	SLCX_VAR("pf.yapf.rail_look_ahead_signal_p2"),
	SLCX_VAR("pf.yapf.rail_pbs_cross_penalty"),
	SLCX_VAR("pf.yapf.rail_pbs_station_penalty"),
	SLCX_VAR("pf.yapf.rail_pbs_signal_back_penalty"),
	SLCX_VAR("pf.yapf.rail_doubleslip_penalty"),
	SLCX_VAR("pf.yapf.rail_longer_platform_penalty"),
	SLCX_VAR("pf.yapf.rail_longer_platform_per_tile_penalty"),
	SLCX_VAR("pf.yapf.rail_shorter_platform_penalty"),
	SLCX_VAR("pf.yapf.rail_shorter_platform_per_tile_penalty"),
	SLCX_VAR("pf.yapf.road_slope_penalty"),
	SLCX_VAR("pf.yapf.road_curve_penalty"),
	SLCX_VAR("pf.yapf.road_crossing_penalty"),
	SLCX_NULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), // pf.yapf.road_trafficlight_penalty
	SLCX_NULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // pf.yapf.road_trafficlight_penalty
	SLCX_VAR("pf.yapf.road_stop_penalty"),
	SLCX_VAR("pf.yapf.road_stop_occupied_penalty"),
	SLCX_VAR("pf.yapf.road_stop_bay_occupied_penalty"),
	SLCX_VAR("pf.yapf.maximum_go_to_depot_penalty"),
	SLCX_VAR("pf.yapf.ship_curve45_penalty"),
	SLCX_VAR("pf.yapf.ship_curve90_penalty"),
	SLCX_VAR("game_creation.land_generator"),
	SLCX_VAR("game_creation.oil_refinery_limit"),
	SLCX_VAR("game_creation.tgen_smoothness"),
	SLCX_VAR("game_creation.variety"),
	SLCX_VAR("game_creation.generation_seed"),
	SLCX_VAR("game_creation.tree_placer"),
	SLCX_VAR("construction.freeform_edges"),
	SLCX_VAR("game_creation.water_borders"),
	SLCX_VAR("game_creation.custom_town_number"),
	SLCX_VAR("construction.extra_tree_placement"),
	SLCX_NULL_X(3, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_232)), // construction.{tree_placement_drag_limit, ingame_tree_line_height, tree_growth_rate}
	SLCX_XREF("construction.tree_growth_rate", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_XREF("construction.trees_around_snow_line_range", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_VAR("game_creation.custom_terrain_type"),
	SLCX_VAR("game_creation.custom_sea_level"),
	SLCX_VAR("game_creation.min_river_length"),
	SLCX_VAR("game_creation.river_route_random"),
	SLCX_VAR("game_creation.amount_of_rivers"),
	SLCX_XREF("game_creation.build_public_roads", SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP)),
	SLCX_VAR("locale.currency"),
	SLCX_VAR("units"),
	SLCX_VAR("locale.units_velocity"),
	SLCX_VAR("locale.units_power"),
	SLCX_VAR("locale.units_weight"),
	SLCX_VAR("locale.units_volume"),
	SLCX_VAR("locale.units_force"),
	SLCX_VAR("locale.units_height"),
	SLCX_VAR("locale.digit_group_separator"),
	SLCX_VAR("locale.digit_group_separator_currency"),
	SLCX_VAR("locale.digit_decimal_separator"),
	SLCX_NULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 7)), // gui.time_in_minutes, gui.ticks_per_minute
};

#undef SLCX_VAR
#undef SLCX_NULL_X
#undef SLCX_NULL
#undef SLCX_NULL_X
#undef SLCX_XREF
#undef SLCX_XREFCVT

#endif /* SETTINGS_COMPAT_H */
