; 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/>.
;

; Game settings as stored in the main configuration file ("openttd.cfg")
; and in the savegame PATS chunk.
; Game settings are everything related to vehicles, stations, orders, etc.

[pre-amble]
static constexpr std::initializer_list<const char*> _roadsides{"left", "right"};

static void StationSpreadChanged(int32_t new_value);
static void UpdateConsists(int32_t new_value);
static void TrainAccelerationModelChanged(int32_t new_value);
static void RoadVehAccelerationModelChanged(int32_t new_value);
static void TrainSlopeSteepnessChanged(int32_t new_value);
static void RoadVehSlopeSteepnessChanged(int32_t new_value);
static bool CheckRoadSide(int32_t &new_value);
static bool CheckDynamicEngines(int32_t &new_value);
static void StationCatchmentChanged(int32_t new_value);
static void MaxVehiclesChanged(int32_t new_value);

static const SettingVariant _game_settings_table[] = {
[post-amble]
};
[templates]
SDTG_BOOL  =  SDTG_BOOL($name,                     $flags, $var, $def,                        $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $from, $to,        $cat, $extra, $startup),
SDTG_VAR   =   SDTG_VAR($name,              $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $from, $to,        $cat, $extra, $startup),
SDTC_BOOL  =  SDTC_BOOL(              $var,        $flags, $def,                              $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $from, $to,        $cat, $extra, $startup),
SDT_BOOL   =   SDT_BOOL(GameSettings, $var,        $flags, $def,                              $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $from, $to,        $cat, $extra, $startup),
SDT_OMANY  =  SDT_OMANY(GameSettings, $var, $type, $flags, $def,             $max, $full,     $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $from, $to, $load, $cat, $extra, $startup),
SDT_VAR    =    SDT_VAR(GameSettings, $var, $type, $flags, $def,       $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $from, $to,        $cat, $extra, $startup),

[validation]
SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");
SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");

[defaults]
flags    = SF_NONE
interval = 0
str      = STR_NULL
strhelp  = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
strval   = STR_NULL
pre_cb   = nullptr
post_cb  = nullptr
str_cb   = nullptr
help_cb  = nullptr
val_cb   = nullptr
load     = nullptr
from     = SL_MIN_VERSION
to       = SL_MAX_VERSION
cat      = SC_ADVANCED
extra    = 0
startup  = false


[SDT_BOOL]
var      = order.no_servicing_if_no_breakdowns
def      = true
str      = STR_CONFIG_SETTING_NOSERVICE
strhelp  = STR_CONFIG_SETTING_NOSERVICE_HELPTEXT

[SDT_BOOL]
var      = order.improved_load
flags    = SF_NO_NETWORK
def      = true
cat      = SC_EXPERT

[SDT_BOOL]
var      = order.selectgoods
def      = true
cat      = SC_EXPERT

[SDT_BOOL]
var      = order.serviceathelipad
def      = true
str      = STR_CONFIG_SETTING_SERVICEATHELIPAD
strhelp  = STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT
cat      = SC_EXPERT

[SDT_BOOL]
var      = order.station_length_loading_penalty
def      = true
str      = STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY
strhelp  = STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT
cat      = SC_EXPERT

[SDT_BOOL]
var      = order.gradual_loading
from     = SLV_40
flags    = SF_NO_NETWORK
def      = true
cat      = SC_EXPERT

[SDT_BOOL]
var      = station.never_expire_airports
flags    = SF_NO_NETWORK
def      = false
str      = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS
strhelp  = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT

[SDT_VAR]
var      = station.station_spread
type     = SLE_UINT8
def      = 12
min      = 4
max      = 64
str      = STR_CONFIG_SETTING_STATION_SPREAD
strhelp  = STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT
strval   = STR_CONFIG_SETTING_TILE_LENGTH
post_cb  = StationSpreadChanged
cat      = SC_BASIC

[SDT_BOOL]
var      = station.modified_catchment
def      = true
str      = STR_CONFIG_SETTING_CATCHMENT
strhelp  = STR_CONFIG_SETTING_CATCHMENT_HELPTEXT
post_cb  = StationCatchmentChanged
cat      = SC_EXPERT

[SDT_BOOL]
var      = station.serve_neutral_industries
def      = true
from     = SLV_SERVE_NEUTRAL_INDUSTRIES
str      = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES
strhelp  = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT
post_cb  = StationCatchmentChanged

[SDT_BOOL]
var      = station.adjacent_stations
from     = SLV_62
def      = true
cat      = SC_EXPERT

[SDT_BOOL]
var      = station.distant_join_stations
from     = SLV_106
def      = true
str      = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS
strhelp  = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT
post_cb  = [](auto) { CloseWindowById(WC_SELECT_STATION, 0); }

[SDT_OMANY]
var      = vehicle.road_side
type     = SLE_UINT8
from     = SLV_97
flags    = SF_GUI_DROPDOWN | SF_NO_NETWORK
def      = 1
max      = 1
full     = _roadsides
str      = STR_CONFIG_SETTING_ROAD_SIDE
strhelp  = STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT
strval   = STR_CONFIG_SETTING_ROAD_SIDE_LEFT
pre_cb   = CheckRoadSide
cat      = SC_BASIC

[SDT_VAR]
var      = vehicle.train_acceleration_model
type     = SLE_UINT8
flags    = SF_GUI_DROPDOWN
def      = 1
min      = 0
max      = 1
interval = 1
str      = STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL
strhelp  = STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT
strval   = STR_CONFIG_SETTING_ORIGINAL
post_cb  = TrainAccelerationModelChanged

[SDT_VAR]
var      = vehicle.roadveh_acceleration_model
type     = SLE_UINT8
from     = SLV_139
flags    = SF_GUI_DROPDOWN
def      = 1
min      = 0
max      = 1
interval = 1
str      = STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL
strhelp  = STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT
strval   = STR_CONFIG_SETTING_ORIGINAL
post_cb  = RoadVehAccelerationModelChanged

[SDT_VAR]
var      = vehicle.train_slope_steepness
type     = SLE_UINT8
from     = SLV_133
def      = 3
min      = 0
max      = 10
interval = 1
str      = STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS
strhelp  = STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT
strval   = STR_CONFIG_SETTING_PERCENTAGE
post_cb  = TrainSlopeSteepnessChanged
cat      = SC_EXPERT

[SDT_VAR]
var      = vehicle.roadveh_slope_steepness
type     = SLE_UINT8
from     = SLV_139
def      = 7
min      = 0
max      = 10
interval = 1
str      = STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS
strhelp  = STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT
strval   = STR_CONFIG_SETTING_PERCENTAGE
post_cb  = RoadVehSlopeSteepnessChanged
cat      = SC_EXPERT

[SDT_VAR]
var      = vehicle.max_train_length
type     = SLE_UINT8
from     = SLV_159
def      = 7
min      = 1
max      = 64
interval = 1
str      = STR_CONFIG_SETTING_TRAIN_LENGTH
strhelp  = STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT
strval   = STR_CONFIG_SETTING_TILE_LENGTH
cat      = SC_BASIC

[SDT_VAR]
var      = vehicle.smoke_amount
type     = SLE_UINT8
from     = SLV_145
flags    = SF_GUI_DROPDOWN
def      = 2
min      = 0
max      = 2
str      = STR_CONFIG_SETTING_SMOKE_AMOUNT
strhelp  = STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT
strval   = STR_CONFIG_SETTING_NONE

[SDT_BOOL]
var      = vehicle.never_expire_vehicles
flags    = SF_NO_NETWORK
def      = false
str      = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES
strhelp  = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT

[SDT_VAR]
var      = vehicle.max_trains
type     = SLE_UINT16
def      = 500
min      = 0
max      = 5000
str      = STR_CONFIG_SETTING_MAX_TRAINS
strhelp  = STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT
strval   = STR_JUST_COMMA
post_cb  = MaxVehiclesChanged
cat      = SC_BASIC

[SDT_VAR]
var      = vehicle.max_roadveh
type     = SLE_UINT16
def      = 500
min      = 0
max      = 5000
str      = STR_CONFIG_SETTING_MAX_ROAD_VEHICLES
strhelp  = STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT
strval   = STR_JUST_COMMA
post_cb  = MaxVehiclesChanged
cat      = SC_BASIC

[SDT_VAR]
var      = vehicle.max_aircraft
type     = SLE_UINT16
def      = 200
min      = 0
max      = 5000
str      = STR_CONFIG_SETTING_MAX_AIRCRAFT
strhelp  = STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT
strval   = STR_JUST_COMMA
post_cb  = MaxVehiclesChanged
cat      = SC_BASIC

[SDT_VAR]
var      = vehicle.max_ships
type     = SLE_UINT16
def      = 300
min      = 0
max      = 5000
str      = STR_CONFIG_SETTING_MAX_SHIPS
strhelp  = STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT
strval   = STR_JUST_COMMA
post_cb  = MaxVehiclesChanged
cat      = SC_BASIC

[SDT_BOOL]
var      = vehicle.wagon_speed_limits
flags    = SF_NO_NETWORK
def      = true
str      = STR_CONFIG_SETTING_WAGONSPEEDLIMITS
strhelp  = STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT
post_cb  = UpdateConsists

[SDT_BOOL]
var      = vehicle.disable_elrails
from     = SLV_38
flags    = SF_NO_NETWORK
def      = false
str      = STR_CONFIG_SETTING_DISABLE_ELRAILS
strhelp  = STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT
post_cb  = SettingsDisableElrail
cat      = SC_EXPERT

[SDT_VAR]
var      = vehicle.freight_trains
type     = SLE_UINT8
from     = SLV_39
flags    = SF_NO_NETWORK
def      = 1
min      = 1
max      = 255
interval = 1
str      = STR_CONFIG_SETTING_FREIGHT_TRAINS
strhelp  = STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT
strval   = STR_JUST_COMMA
post_cb  = UpdateConsists

[SDT_VAR]
var      = vehicle.plane_speed
type     = SLE_UINT8
from     = SLV_90
flags    = SF_NO_NETWORK
def      = 4
min      = 1
max      = 4
str      = STR_CONFIG_SETTING_PLANE_SPEED
strhelp  = STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT
strval   = STR_CONFIG_SETTING_PLANE_SPEED_VALUE

[SDT_BOOL]
var      = vehicle.dynamic_engines
from     = SLV_95
flags    = SF_NO_NETWORK
def      = true
pre_cb   = CheckDynamicEngines
cat      = SC_EXPERT

[SDT_VAR]
var      = vehicle.plane_crashes
type     = SLE_UINT8
from     = SLV_138
flags    = SF_GUI_DROPDOWN
def      = 2
min      = 0
max      = 2
interval = 1
str      = STR_CONFIG_SETTING_PLANE_CRASHES
strhelp  = STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT
strval   = STR_CONFIG_SETTING_PLANE_CRASHES_NONE
cat      = SC_BASIC

[SDT_VAR]
var      = vehicle.extend_vehicle_life
type     = SLE_UINT8
def      = 0
min      = 0
max      = 100
cat      = SC_EXPERT

## Old vehicle settings.

[SDTG_BOOL]
name     = ""vehicle.servint_ispercent""
flags    = SF_NO_NETWORK
var      = _old_vds.servint_ispercent
def      = false
to       = SLV_120

[SDTG_VAR]
name     = ""vehicle.servint_trains""
type     = SLE_UINT16
flags    = SF_GUI_0_IS_SPECIAL
var      = _old_vds.servint_trains
def      = 150
min      = 5
max      = 800
to       = SLV_120

[SDTG_VAR]
name     = ""vehicle.servint_roadveh""
type     = SLE_UINT16
flags    = SF_GUI_0_IS_SPECIAL
var      = _old_vds.servint_roadveh
def      = 150
min      = 5
max      = 800
to       = SLV_120

[SDTG_VAR]
name     = ""vehicle.servint_ships""
type     = SLE_UINT16
flags    = SF_GUI_0_IS_SPECIAL
var      = _old_vds.servint_ships
def      = 360
min      = 5
max      = 800
to       = SLV_120

[SDTG_VAR]
name     = ""vehicle.servint_aircraft""
type     = SLE_UINT16
flags    = SF_GUI_0_IS_SPECIAL
var      = _old_vds.servint_aircraft
def      = 150
min      = 5
max      = 800
to       = SLV_120

## These were once in the "gui" section, but they really are related to orders.

[SDTC_BOOL]
var      = gui.sg_full_load_any
from     = SLV_22
to       = SLV_93
def      = true

[SDTC_BOOL]
var      = gui.sg_new_nonstop
from     = SLV_22
to       = SLV_93
def      = false
