diff --git a/src/lang/english.txt b/src/lang/english.txt index b116deedd9..dd5fb3cffe 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1546,6 +1546,8 @@ STR_CONFIG_SETTING_SHOW_TRAIN_WEIGHT_RATIOS_IN_DETAILS :Show train weig STR_CONFIG_SETTING_SHOW_TRAIN_WEIGHT_RATIOS_IN_DETAILS_HELPTEXT :Show train weight ratios in the vehicle details window STR_CONFIG_SETTING_SHOW_RESTRICTED_SIG_DEF :Show restricted electric signals using default graphics: {STRING2} STR_CONFIG_SETTING_SHOW_RESTRICTED_SIG_DEF_HELPTEXT :Show electric signals with routing restriction programs using the default signal graphics with a blue signal post, instead of using any NewGRF signal graphics. This is to make it easier to visually distinguish restricted signals. +STR_CONFIG_SETTING_SHOW_ALL_SIG_DEF :Show all signals using default graphics: {STRING2} +STR_CONFIG_SETTING_SHOW_ALL_SIG_DEF_HELPTEXT :Show all signals using the default signal graphics, instead of using any NewGRF signal graphics. This is to make it easier to see the state and type of signals when NewGRFs provide unclear or inaccessible signal graphics. STR_CONFIG_SETTING_SHOW_ADV_TRACE_RESTRICT_FEATURES :Show advanced routing restriction features: {STRING2} STR_CONFIG_SETTING_SHOW_ADV_TRACE_RESTRICT_FEATURES_HELPTEXT :Show advanced routing restriction features. When disabled, some advanced features are not shown in the UI, but are still available to all players. STR_CONFIG_SETTING_SHOW_PROGSIG_FEATURES :Show programmable pre-signal feature: {STRING2} diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index f0c60849d8..f023a1f1a8 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -146,6 +146,8 @@ static PalSpriteID GetRailTypeCustomSignalSprite(const RailtypeInfo *rti, TileIn */ CustomSignalSpriteResult GetCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, bool gui, bool restricted) { + if (_settings_client.gui.show_all_signal_default) return { { 0, PAL_NONE }, false }; + PalSpriteID spr = GetRailTypeCustomSignalSprite(rti, tile, type, var, aspect, gui, restricted); if (spr.sprite != 0) return { spr, HasBit(rti->ctrl_flags, RTCF_RESTRICTEDSIG) }; diff --git a/src/rail.h b/src/rail.h index d46b77c28d..e645184fea 100644 --- a/src/rail.h +++ b/src/rail.h @@ -499,6 +499,7 @@ RailTypes GetRailTypes(bool introduces); RailType GetRailTypeByLabel(RailTypeLabel label, bool allow_alternate_labels = true); void ResetRailTypes(); +void UpdateRailGuiSprites(); void InitRailTypes(); RailType AllocateRailType(RailTypeLabel label); diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 02a999eca9..63b6631d17 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -111,13 +111,29 @@ void ResolveRailTypeGUISprites(RailtypeInfo *rti) SPR_IMG_SIGNAL_SEMAPHORE_PROG, SPR_IMG_SIGNAL_SEMAPHORE_NO_ENTRY}, }; + auto default_sprite = [&](SignalVariant var, SignalType type) -> SpriteID { + SpriteID spr = _signal_lookup[var][type]; + if (_settings_client.gui.show_all_signal_default) { + if (type == SIGTYPE_PROG) { + spr += SPR_DUP_PROGSIGNAL_BASE - SPR_PROGSIGNAL_BASE; + } else if (type == SIGTYPE_NO_ENTRY) { + spr += SPR_DUP_EXTRASIGNAL_BASE - SPR_EXTRASIGNAL_BASE; + } else if (var == SIG_ELECTRIC && type == SIGTYPE_NORMAL) { + spr += SPR_DUP_ORIGINAL_SIGNALS_BASE - SPR_ORIGINAL_SIGNALS_BASE; + } else { + spr += SPR_DUP_SIGNALS_BASE - SPR_SIGNALS_BASE; + } + } + return spr; + }; + for (SignalType type = SIGTYPE_NORMAL; type < SIGTYPE_END; type = (SignalType)(type + 1)) { for (SignalVariant var = SIG_ELECTRIC; var <= SIG_SEMAPHORE; var = (SignalVariant)(var + 1)) { PalSpriteID red = GetCustomSignalSprite(rti, INVALID_TILE, type, var, 0, true).sprite; if (red.sprite != 0) { rti->gui_sprites.signals[type][var][0] = { red.sprite + SIGNAL_TO_SOUTH, red.pal }; } else { - rti->gui_sprites.signals[type][var][0] = { _signal_lookup[var][type], PAL_NONE }; + rti->gui_sprites.signals[type][var][0] = { default_sprite(var, type), PAL_NONE }; } if (type == SIGTYPE_NO_ENTRY) { rti->gui_sprites.signals[type][var][1] = rti->gui_sprites.signals[type][var][0]; @@ -127,7 +143,7 @@ void ResolveRailTypeGUISprites(RailtypeInfo *rti) if (green.sprite != 0) { rti->gui_sprites.signals[type][var][1] = { green.sprite + SIGNAL_TO_SOUTH, green.pal }; } else { - rti->gui_sprites.signals[type][var][1] = { _signal_lookup[var][type] + 1, PAL_NONE }; + rti->gui_sprites.signals[type][var][1] = { default_sprite(var, type) + 1, PAL_NONE }; } } } @@ -194,6 +210,13 @@ void SortRailTypes() std::sort(_sorted_railtypes.begin(), _sorted_railtypes.end(), CompareRailTypes); } +void UpdateRailGuiSprites() +{ + for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { + ResolveRailTypeGUISprites(&_railtypes[rt]); + } +} + /** * Resolve sprites of custom rail types */ @@ -2752,7 +2775,7 @@ void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track track, Sign is_custom_sprite = file != nullptr && (file->flags & SFF_USERGRF) && !(file->flags & SFF_OGFX); } - if (is_custom_sprite && show_restricted && _settings_client.gui.show_restricted_signal_default && !result.restricted_valid && variant == SIG_ELECTRIC) { + if (_settings_client.gui.show_all_signal_default || (is_custom_sprite && show_restricted && _settings_client.gui.show_restricted_signal_default && !result.restricted_valid && variant == SIG_ELECTRIC)) { /* Use duplicate sprite block, instead of GRF-specified signals */ if (type == SIGTYPE_PROG) { if (variant == SIG_SEMAPHORE) { diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index e34fddd5e0..c9148915f1 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1765,6 +1765,7 @@ static SettingsContainer &GetSettingsTree() graphics->Add(new SettingEntry("gui.show_vehicle_route")); graphics->Add(new SettingEntry("gui.dash_level_of_route_lines")); graphics->Add(new SettingEntry("gui.show_restricted_signal_default")); + graphics->Add(new SettingEntry("gui.show_all_signal_default")); } SettingsPage *sound = main->Add(new SettingsPage(STR_CONFIG_SETTING_SOUND)); diff --git a/src/settings_type.h b/src/settings_type.h index 43c0046090..b07fc7b2ed 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -217,6 +217,7 @@ struct GUISettings : public TimeSettings { bool show_train_weight_ratios_in_details; ///< show train weight ratios in vehicle details window top widget bool show_vehicle_group_in_details; ///< show vehicle group in vehicle details window top widget bool show_restricted_signal_default; ///< Show restricted electric signals using the default sprite + bool show_all_signal_default; ///< Show all signals using the default sprite bool show_adv_tracerestrict_features; ///< Show advanced trace restrict features in UI bool show_progsig_ui; ///< Show programmable pre-signals feature in UI bool show_noentrysig_ui; ///< Show no-entry signals feature in UI diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index 0f877744fa..e0196a88ed 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -5195,6 +5195,14 @@ str = STR_CONFIG_SETTING_SHOW_RESTRICTED_SIG_DEF strhelp = STR_CONFIG_SETTING_SHOW_RESTRICTED_SIG_DEF_HELPTEXT post_cb = [](auto) { MarkWholeScreenDirty(); } +[SDTC_BOOL] +var = gui.show_all_signal_default +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = false +str = STR_CONFIG_SETTING_SHOW_ALL_SIG_DEF +strhelp = STR_CONFIG_SETTING_SHOW_ALL_SIG_DEF_HELPTEXT +post_cb = [](auto) { UpdateRailGuiSprites(); MarkWholeScreenDirty(); } + [SDTC_BOOL] var = gui.show_adv_tracerestrict_features flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 9d0e8a77b3..02dea527ec 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1765,9 +1765,11 @@ static void DrawTunnelBridgeRampSingleSignal(const TileInfo *ti, bool is_green, if (variant == SIG_ELECTRIC && type == SIGTYPE_NORMAL) { /* Normal electric signals are picked from original sprites. */ sprite = { SPR_ORIGINAL_SIGNALS_BASE + ((position << 1) + is_green), PAL_NONE }; + if (_settings_client.gui.show_all_signal_default) sprite.sprite += SPR_DUP_ORIGINAL_SIGNALS_BASE - SPR_ORIGINAL_SIGNALS_BASE; } else { /* All other signals are picked from add on sprites. */ sprite = { SPR_SIGNALS_BASE + ((type - 1) * 16 + variant * 64 + (position << 1) + is_green) + (IsSignalSpritePBS(type) ? 64 : 0), PAL_NONE }; + if (_settings_client.gui.show_all_signal_default) sprite.sprite += SPR_DUP_SIGNALS_BASE - SPR_SIGNALS_BASE; } } @@ -1889,9 +1891,11 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st if (variant == SIG_ELECTRIC) { /* Normal electric signals are picked from original sprites. */ sprite.sprite = SPR_ORIGINAL_SIGNALS_BASE + (position << 1) + (state == SIGNAL_STATE_GREEN ? 1 : 0); + if (_settings_client.gui.show_all_signal_default) sprite.sprite += SPR_DUP_ORIGINAL_SIGNALS_BASE - SPR_ORIGINAL_SIGNALS_BASE; } else { /* All other signals are picked from add on sprites. */ sprite.sprite = SPR_SIGNALS_BASE + (variant * 64) + (position << 1) - 16 + (state == SIGNAL_STATE_GREEN ? 1 : 0); + if (_settings_client.gui.show_all_signal_default) sprite.sprite += SPR_DUP_SIGNALS_BASE - SPR_SIGNALS_BASE; } sprite.pal = PAL_NONE; }