From bec218069c6fc4e0217c2d94cb6596a86b5664c6 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 19 Jan 2022 09:33:58 -0700 Subject: [PATCH] Feature: Remember the last-used signal between games (cherry picked from commit a9de36ad23f30d125ed495f0bd84342b594d19df) See: https://github.com/OpenTTD/OpenTTD/pull/9792 --- src/rail_gui.cpp | 16 +++++++++++++--- src/settings_type.h | 2 ++ src/table/settings/settings.ini | 8 ++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 7db316c791..ba4256c945 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -220,6 +220,13 @@ static void PlaceRail_Station(TileIndex tile) } } +static SignalType GetDefaultSignalType() +{ + SignalType sigtype = _settings_client.gui.default_signal_type; + if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsSignalTypeUnsuitableForRealisticBraking(sigtype)) return SIGTYPE_PBS_ONEWAY; + return sigtype; +} + /** * Build a new signal or edit/remove a present signal, use CmdBuildSingleSignal() or CmdRemoveSingleSignal() in rail_cmd.cpp * @@ -291,7 +298,7 @@ static void GenericPlaceSignals(TileIndex tile) } else { SB(p1, 3, 1, _ctrl_pressed); SB(p1, 4, 1, (_cur_year < _settings_client.gui.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC)); - SB(p1, 5, 3, SIGTYPE_PBS_ONEWAY); + SB(p1, 5, 3, GetDefaultSignalType()); SB(p1, 8, 1, 0); SB(p1, 9, 6, cycle_types); } @@ -471,7 +478,7 @@ static void HandleAutoSignalPlacement() SB(p2, 3, 1, 0); SB(p2, 4, 1, (_cur_year < _settings_client.gui.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC)); SB(p2, 6, 1, _ctrl_pressed); - SB(p2, 7, 3, SIGTYPE_PBS_ONEWAY); + SB(p2, 7, 3, GetDefaultSignalType()); SB(p2, 24, 8, _settings_client.gui.drag_signals_density); SB(p2, 10, 1, !_settings_client.gui.drag_signals_fixed_distance); } @@ -1977,6 +1984,9 @@ public: _cur_signal_type = TypeForClick(_cur_signal_button); _cur_signal_variant = widget >= WID_BS_ELECTRIC_NORM ? SIG_ELECTRIC : SIG_SEMAPHORE; + /* Update default (last-used) signal type in config file. */ + _settings_client.gui.default_signal_type = Clamp(_cur_signal_type, SIGTYPE_NORMAL, SIGTYPE_PBS_ONEWAY); + /* If 'remove' button of rail build toolbar is active, disable it. */ ClearRemoveState(); break; @@ -2457,7 +2467,7 @@ void InitializeRailGUI() _convert_signal_button = false; _trace_restrict_button = false; _program_signal_button = false; - _cur_signal_type = SIGTYPE_PBS_ONEWAY; + _cur_signal_type = GetDefaultSignalType(); _cur_signal_button = _cur_signal_type == SIGTYPE_PROG ? 4 : _cur_signal_type == SIGTYPE_PBS ? 5 : diff --git a/src/settings_type.h b/src/settings_type.h index 302088da7d..3b663264e5 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -22,6 +22,7 @@ #include "openttd.h" #include "rail_gui_type.h" #include "station_type.h" +#include "signal_type.h" /* Used to validate sizes of "max" value in settings. */ const size_t MAX_SLE_UINT8 = UINT8_MAX; @@ -192,6 +193,7 @@ struct GUISettings : public TimeSettings { bool pause_on_newgame; ///< whether to start new games paused or not SignalGUISettings signal_gui_mode; ///< select which signal types are shown in the signal GUI SignalCycleSettings cycle_signal_types; ///< Which signal types to cycle with the build signal tool. + SignalType default_signal_type; ///< The default signal type, which is set automatically by the last signal used. Not available in Settings. Year coloured_news_year; ///< when does newspaper become coloured? bool override_time_settings; ///< Whether to override time display settings stored in savegame. bool timetable_in_ticks; ///< whether to show the timetable in ticks rather than days diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index 40cf04793f..49e616ab94 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -4935,6 +4935,14 @@ strhelp = STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT strval = STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS cat = SC_ADVANCED +[SDTC_VAR] +var = gui.default_signal_type +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = 5 +min = 0 +max = 5 + [SDTC_VAR] var = gui.drag_signals_density type = SLE_UINT8