diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index 1a14d47601..1019fd6142 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -48,6 +48,7 @@ static const SpriteID * const _landscape_spriteindexes[] = { /** file index of first user-added GRF file */ int _first_user_grf_file_index; +int _opengfx_grf_file_index; /** * Load an old fashioned GRF file. @@ -185,6 +186,11 @@ static void LoadSpriteTables() /* Tracerestrict sprites. */ LoadGrfFile("tracerestrict.grf", SPR_TRACERESTRICT_BASE, i++); + /* Fill duplicate original signal graphics sprite block */ + for (uint i = 0; i < DUP_ORIGINAL_SIGNALS_SPRITE_COUNT; i++) { + DupSprite(SPR_ORIGINAL_SIGNALS_BASE + i, SPR_DUP_ORIGINAL_SIGNALS_BASE + i); + } + /* * The second basic file always starts at the given location and does * contain a different amount of sprites depending on the "type"; DOS @@ -242,6 +248,16 @@ static void LoadSpriteTables() LoadNewGRF(SPR_NEWGRFS_BASE, i); _first_user_grf_file_index = i + 1; + _opengfx_grf_file_index = -1; + uint index = i; + for (GRFConfig *c = master; c != NULL; c = c->next, index++) { + if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND || HasBit(c->flags, GCF_INIT_ONLY)) continue; + if (c->ident.grfid == BSWAP32(0xFF4F4701)) { + /* Detect OpenGFX GRF ID */ + _opengfx_grf_file_index = index; + break; + } + } /* Free and remove the top element. */ delete master; diff --git a/src/lang/english.txt b/src/lang/english.txt index 9cbb7a7bfb..d37f3837a6 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1298,6 +1298,8 @@ STR_CONFIG_SETTING_SHOW_TRAIN_LENGTH_IN_DETAILS :Show train leng STR_CONFIG_SETTING_SHOW_TRAIN_LENGTH_IN_DETAILS_HELPTEXT :Show train length in the vehicle details window STR_CONFIG_SETTING_SHOW_VEHICLE_GROUP_IN_DETAILS :Show vehicle group in details: {STRING2} STR_CONFIG_SETTING_SHOW_VEHICLE_GROUP_IN_DETAILS_HELPTEXT :Show vehicle group name 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_LANDSCAPE :Landscape: {STRING2} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landscapes define basic gameplay scenarios with different cargos and town growth requirements. NewGRF and Game Scripts allow finer control though diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 43ae02378f..dd0e223049 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -5671,11 +5671,19 @@ static void GraphicsNew(ByteReader *buf) /* Load sprites starting from , then skip sprites. */ grfmsg(2, "GraphicsNew: Replacing sprites %d to %d of %s (type 0x%02X) at SpriteID 0x%04X", offset, offset + num - 1, action5_type->name, type, replace); - for (; num > 0; num--) { + for (uint16 n = num; n > 0; n--) { _cur.nfo_line++; LoadNextSprite(replace == 0 ? _cur.spriteid++ : replace++, _cur.file_index, _cur.nfo_line, _cur.grf_container_ver); } + if (type == 0x04 && (_cur.grffile->is_ottdfile || _cur.grfconfig->ident.grfid == BSWAP32(0xFF4F4701))) { + /* Signal graphics action 5: Fill duplicate signal sprite block if this is a baseset GRF or OpenGFX */ + const SpriteID end = offset + num; + for (SpriteID i = offset; i < end; i++) { + DupSprite(SPR_SIGNALS_BASE + i, SPR_DUP_SIGNALS_BASE + i); + } + } + if (type == 0x0D) _loaded_newgrf_features.shore = SHORE_REPLACE_ACTION_5; _cur.skip_sprites = skip_num; diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index bdae420d15..ff591a9202 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1987,6 +1987,8 @@ static void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track trac SignalType type = GetSignalType(tile, track); SignalVariant variant = GetSignalVariant(tile, track); + bool show_restricted = (variant == SIG_ELECTRIC) && IsRestrictedSignal(tile) && (GetExistingTraceRestrictProgram(tile, track) != NULL); + SpriteID sprite = GetCustomSignalSprite(rti, tile, type, variant, condition); bool is_custom_sprite = (sprite != 0); if (sprite != 0) { @@ -2003,11 +2005,21 @@ static void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track trac } else if (type == SIGTYPE_PROG && variant == SIG_ELECTRIC) { sprite = SPR_PROGSIGNAL_BASE + 16 + image * 2 + condition; is_custom_sprite = false; + } else { + uint origin_slot = GetOriginFileSlot(sprite); + extern uint _first_user_grf_file_index; + extern uint _opengfx_grf_file_index; + if (!is_custom_sprite) is_custom_sprite = origin_slot != _opengfx_grf_file_index && (origin_slot >= _first_user_grf_file_index); } - extern uint _first_user_grf_file_index; - if (!is_custom_sprite) is_custom_sprite = (GetOriginFileSlot(sprite) >= _first_user_grf_file_index); - if (!is_custom_sprite && variant == SIG_ELECTRIC && IsRestrictedSignal(tile) && GetExistingTraceRestrictProgram(tile, track) != NULL) { + if (is_custom_sprite && show_restricted && _settings_client.gui.show_restricted_signal_default) { + /* Use duplicate sprite block, instead of GRF-specified signals */ + sprite = (type == SIGTYPE_NORMAL && variant == SIG_ELECTRIC) ? SPR_DUP_ORIGINAL_SIGNALS_BASE : SPR_DUP_SIGNALS_BASE - 16; + sprite += type * 16 + variant * 64 + image * 2 + condition + (IsSignalSpritePBS(type) ? 64 : 0); + is_custom_sprite = false; + } + + if (!is_custom_sprite && show_restricted) { if (type == SIGTYPE_PBS || type == SIGTYPE_PBS_ONEWAY) { static const SubSprite lower_part = { -50, -10, 50, 50 }; static const SubSprite upper_part = { -50, -50, 50, -11 }; diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index a8be2fa64e..16ab4580c2 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1480,6 +1480,7 @@ static SettingsContainer &GetSettingsTree() graphics->Add(new SettingEntry("gui.show_vehicle_route_steps")); 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")); } SettingsPage *sound = main->Add(new SettingsPage(STR_CONFIG_SETTING_SOUND)); diff --git a/src/settings_type.h b/src/settings_type.h index cf7d534594..5a5e2c2a8a 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -168,6 +168,7 @@ struct GUISettings { uint8 graph_line_thickness; ///< the thickness of the lines in the various graph guis bool show_train_length_in_details; ///< show train length 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 uint8 osk_activation; ///< Mouse gesture to trigger the OSK. bool show_vehicle_route_steps; ///< when a window related to a specific vehicle is focused, show route steps bool show_vehicle_list_company_colour; ///< show the company colour of vehicles which have an owner different to the owner of the vehicle list diff --git a/src/table/settings.ini b/src/table/settings.ini index 709511a90c..234dbf4c11 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -3888,6 +3888,14 @@ strhelp = STR_CONFIG_SETTING_SHOW_VEHICLE_LIST_COMPANY_COLOUR_HELPTEXT proc = RedrawScreen cat = SC_BASIC +[SDTC_BOOL] +var = gui.show_restricted_signal_default +flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +def = false +str = STR_CONFIG_SETTING_SHOW_RESTRICTED_SIG_DEF +strhelp = STR_CONFIG_SETTING_SHOW_RESTRICTED_SIG_DEF_HELPTEXT +proc = RedrawScreen + ; For the dedicated build we'll enable dates in logs by default. [SDTC_BOOL] ifdef = DEDICATED diff --git a/src/table/sprites.h b/src/table/sprites.h index 0d8a09a81c..b676f8ec32 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -322,8 +322,14 @@ static const SpriteID SPR_ZONING_INNER_HIGHLIGHT_WHITE = SPR_ZONING_INNER_H static const SpriteID SPR_TRACERESTRICT_BASE = SPR_ZONING_INNER_HIGHLIGHT_BASE + ZONING_INNER_HIGHLIGHT_SPRITE_COUNT; static const uint16 TRACERESTRICT_SPRITE_COUNT = 2; +/* Duplicated signal sprites */ +static const SpriteID SPR_DUP_ORIGINAL_SIGNALS_BASE = SPR_TRACERESTRICT_BASE + TRACERESTRICT_SPRITE_COUNT; +static const uint16 DUP_ORIGINAL_SIGNALS_SPRITE_COUNT = 16; +static const SpriteID SPR_DUP_SIGNALS_BASE = SPR_DUP_ORIGINAL_SIGNALS_BASE + DUP_ORIGINAL_SIGNALS_SPRITE_COUNT; +static const uint16 DUP_SIGNALS_SPRITE_COUNT = PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT; + /* From where can we start putting NewGRFs? */ -static const SpriteID SPR_NEWGRFS_BASE = SPR_TRACERESTRICT_BASE + TRACERESTRICT_SPRITE_COUNT; +static const SpriteID SPR_NEWGRFS_BASE = SPR_DUP_SIGNALS_BASE + DUP_SIGNALS_SPRITE_COUNT; /* Manager face sprites */ static const SpriteID SPR_GRADIENT = 874; // background gradient behind manager face