diff --git a/docs/newgrf-additions-nml.html b/docs/newgrf-additions-nml.html index 1c1e858d3a..20b546b3fe 100644 --- a/docs/newgrf-additions-nml.html +++ b/docs/newgrf-additions-nml.html @@ -121,6 +121,33 @@ + signal_contextSIGNAL_CONTEXT_XXX + + Information about the context of the signal being drawn: +
+
GUI
+
The signal is being drawn in the GUI (signal window)
+
TRACK
+
The signal is being drawn on ordinary rail track
+
TUNNEL_BRIDGE_ENTRANCE
+
The signal is being drawn as a tunnel/bridge entrance signal
+
TUNNEL_BRIDGE_EXIT
+
The signal is being drawn as a tunnel/bridge exit signal
+
BRIDGE_MIDDLE
+
The signal is being drawn on the middle of a bridge
+
+ + + signal_context_is_tunnel0 or 1 + + The signal is being drawn on a tunnel entrance/exit (not a bridge) + + + signal_context_info + + Above signal context variables in one variable (all of the railtype_signal_context variable) + +

Roadtype properties

@@ -435,6 +462,33 @@ item (FEAT_GLOBALVARS) { + + + + + + + + +
signal_contextSIGNAL_CONTEXT_XXX + Information about the context of the signal being drawn: +
+
GUI
+
The signal is being drawn in the GUI (signal window)
+
TRACK
+
The signal is being drawn on ordinary rail track
+
TUNNEL_BRIDGE_ENTRANCE
+
The signal is being drawn as a tunnel/bridge entrance signal
+
TUNNEL_BRIDGE_EXIT
+
The signal is being drawn as a tunnel/bridge exit signal
+
BRIDGE_MIDDLE
+
The signal is being drawn on the middle of a bridge
+
+
signal_context_is_tunnel0 or 1 + The signal is being drawn on a tunnel entrance/exit (not a bridge) +
signal_context_info + Above signal context variables in one variable (all of the signals_signal_context variable) +

Custom signal sprites example: diff --git a/docs/newgrf-additions.html b/docs/newgrf-additions.html index a6ff925f73..84842e6ff1 100644 --- a/docs/newgrf-additions.html +++ b/docs/newgrf-additions.html @@ -588,6 +588,25 @@

See also: railtype_enable_restricted_signals property

This is indicated by the feature name: action0_railtype_restricted_signals, version 2

+

Signal context (mappable variable: railtype_signal_context)

+

This applies to Action 2/3 - Railtype custom signal sprites.
+ + + + +
BitMeaning
0 - 7 + Context: + + + + + + + +
ValueMeaning
0GUI
1Plain rail track
2Tunnel/bridge entrance
3Tunnel/bridge exit
4Bridge middle
+
8Tunnel tile
+

+

This is indicated by the feature name: varaction2_railtype_signal_context, version 1


Variational Action 2 - Objects

Tile slope after foundation applied (mappable variable: object_foundation_tile_slope)

@@ -611,6 +630,25 @@

See also: signals_enable_restricted_signals property

This is indicated by the feature name: action0_signals_restricted_signals, version 2

+

Signal context (mappable variable: signals_signal_context)

+

This applies to Action 2/3 Signals (Feature 0E) custom signal sprites.
+ + + + +
BitMeaning
0 - 7 + Context: + + + + + + + +
ValueMeaning
0GUI
1Plain rail track
2Tunnel/bridge entrance
3Tunnel/bridge exit
4Bridge middle
+
8Tunnel tile
+

+

This is indicated by the feature name: varaction2_signals_signal_context, version 1



Action 3 - Signals (Feature 0E)

diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index 399cba098a..201f0d1695 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -21,7 +21,7 @@ #include "company_type.h" /** Context for tile accesses */ -enum TileContext { +enum TileContext : uint8 { TCX_NORMAL, ///< Nothing special. TCX_UPPER_HALFTILE, ///< Querying information about the upper part of a tile with halftile foundation. TCX_ON_BRIDGE, ///< Querying information about stuff on the bridge (via some bridgehead). @@ -344,4 +344,12 @@ enum SpriteGroupCallbacksUsed : uint8 { }; DECLARE_ENUM_AS_BIT_SET(SpriteGroupCallbacksUsed) +enum CustomSignalSpriteContext : uint8 { + CSSC_GUI = 0, + CSSC_TRACK, + CSSC_TUNNEL_BRIDGE_ENTRANCE, + CSSC_TUNNEL_BRIDGE_EXIT, + CSSC_BRIDGE_MIDDLE, +}; + #endif /* NEWGRF_COMMONS_H */ diff --git a/src/newgrf_extension.cpp b/src/newgrf_extension.cpp index 45512b69fa..4bc4f83b2a 100644 --- a/src/newgrf_extension.cpp +++ b/src/newgrf_extension.cpp @@ -39,6 +39,7 @@ extern const GRFFeatureInfo _grf_feature_list[] = { GRFFeatureInfo("action0_railtype_recolour", 1), GRFFeatureInfo("action0_railtype_extra_aspects", 1), GRFFeatureInfo("action0_roadtype_extra_flags", 1), + GRFFeatureInfo("varaction2_railtype_signal_context", 1), GRFFeatureInfo("action0_global_extra_station_names", 2), GRFFeatureInfo("action0_global_default_object_generate_amount", 1), GRFFeatureInfo("action0_signals_programmable_signals", 1), @@ -46,6 +47,7 @@ extern const GRFFeatureInfo _grf_feature_list[] = { GRFFeatureInfo("action0_signals_restricted_signals", 2), GRFFeatureInfo("action0_signals_recolour", 1), GRFFeatureInfo("action0_signals_extra_aspects", 1), + GRFFeatureInfo("varaction2_signals_signal_context", 1), GRFFeatureInfo("action3_signals_custom_signal_sprites", 1), GRFFeatureInfo("action0_object_use_land_ground", 1), GRFFeatureInfo("action0_object_edge_foundation_mode", 2), @@ -130,7 +132,9 @@ extern const GRFVariableMapDefinition _grf_action2_remappable_variables[] = { GRFVariableMapDefinition(GSF_ROADSTOPS, 0x68, "roadstop_road_stop_info_nearby_tiles"), GRFVariableMapDefinition(GSF_ROADSTOPS, 0x6A, "roadstop_road_stop_grfid_nearby_tiles"), GRFVariableMapDefinition(GSF_RAILTYPES, A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO, "railtype_signal_restriction_info"), + GRFVariableMapDefinition(GSF_RAILTYPES, A2VRI_RAILTYPE_SIGNAL_CONTEXT, "railtype_signal_context"), GRFVariableMapDefinition(GSF_SIGNALS, A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO, "signals_signal_restriction_info"), + GRFVariableMapDefinition(GSF_SIGNALS, A2VRI_SIGNALS_SIGNAL_CONTEXT, "signals_signal_context"), GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x40, "newlandscape_terrain_type"), GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x41, "newlandscape_tile_slope"), GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x42, "newlandscape_tile_height"), diff --git a/src/newgrf_extension.h b/src/newgrf_extension.h index 88a6f3d518..86a717cc24 100644 --- a/src/newgrf_extension.h +++ b/src/newgrf_extension.h @@ -63,7 +63,9 @@ enum Action2VariableRemapIds { A2VRI_OBJECT_FOUNDATION_SLOPE_CHANGE, A2VRI_VEHICLE_CURRENT_SPEED_SCALED, A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO, + A2VRI_RAILTYPE_SIGNAL_CONTEXT, A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO, + A2VRI_SIGNALS_SIGNAL_CONTEXT, }; /** Action14 feature definition */ diff --git a/src/newgrf_newsignals.cpp b/src/newgrf_newsignals.cpp index 1eaa6737b7..95f1c95b83 100644 --- a/src/newgrf_newsignals.cpp +++ b/src/newgrf_newsignals.cpp @@ -30,6 +30,7 @@ std::vector _new_signals_grfs; switch (variable) { case 0x40: return 0; case A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO: return 0; + case A2VRI_SIGNALS_SIGNAL_CONTEXT: return this->signal_context; } } @@ -37,6 +38,8 @@ std::vector _new_signals_grfs; case 0x40: return GetTerrainType(this->tile, this->context); case A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO: return GetNewSignalsRestrictedSignalsInfo(this->prog, this->tile); + case A2VRI_SIGNALS_SIGNAL_CONTEXT: + return GetNewSignalsSignalContext(this->signal_context, this->tile); } DEBUG(grf, 1, "Unhandled new signals tile variable 0x%X", variable); @@ -64,10 +67,11 @@ GrfSpecFeature NewSignalsResolverObject::GetFeature() const * @param context Are we resolving sprites for the upper halftile, or on a bridge? * @param param1 Extra parameter (first parameter of the callback, except railtypes do not have callbacks). * @param param2 Extra parameter (second parameter of the callback, except railtypes do not have callbacks). + * @param signal_context Signal context. * @param prog Routing restriction program. */ -NewSignalsResolverObject::NewSignalsResolverObject(const GRFFile *grffile, TileIndex tile, TileContext context, uint32 param1, uint32 param2, const TraceRestrictProgram *prog) - : ResolverObject(grffile, CBID_NO_CALLBACK, param1, param2), newsignals_scope(*this, tile, context, prog) +NewSignalsResolverObject::NewSignalsResolverObject(const GRFFile *grffile, TileIndex tile, TileContext context, uint32 param1, uint32 param2, CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog) + : ResolverObject(grffile, CBID_NO_CALLBACK, param1, param2), newsignals_scope(*this, tile, context, signal_context, prog) { this->root_spritegroup = grffile != nullptr ? grffile->new_signals_group : nullptr; } diff --git a/src/newgrf_newsignals.h b/src/newgrf_newsignals.h index 803fb99245..9ca73fbc99 100644 --- a/src/newgrf_newsignals.h +++ b/src/newgrf_newsignals.h @@ -12,6 +12,7 @@ #include "newgrf_commons.h" #include "newgrf_spritegroup.h" +#include "tunnel_map.h" extern std::vector _new_signals_grfs; @@ -21,6 +22,7 @@ struct TraceRestrictProgram; struct NewSignalsScopeResolver : public ScopeResolver { TileIndex tile; ///< Tracktile. For track on a bridge this is the southern bridgehead. TileContext context; ///< Are we resolving sprites for the upper halftile, or on a bridge? + CustomSignalSpriteContext signal_context; const TraceRestrictProgram *prog; /** @@ -28,9 +30,10 @@ struct NewSignalsScopeResolver : public ScopeResolver { * @param ro Surrounding resolver. * @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead. * @param context Are we resolving sprites for the upper halftile, or on a bridge? + * @param signal_context Signal context. */ - NewSignalsScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context, const TraceRestrictProgram *prog) - : ScopeResolver(ro), tile(tile), context(context), prog(prog) + NewSignalsScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context, CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog) + : ScopeResolver(ro), tile(tile), context(context), signal_context(signal_context), prog(prog) { } @@ -42,7 +45,7 @@ struct NewSignalsScopeResolver : public ScopeResolver { struct NewSignalsResolverObject : public ResolverObject { NewSignalsScopeResolver newsignals_scope; ///< Resolver for the new signals scope. - NewSignalsResolverObject(const GRFFile *grffile, TileIndex tile, TileContext context, uint32 param1 = 0, uint32 param2 = 0, const TraceRestrictProgram *prog = nullptr); + NewSignalsResolverObject(const GRFFile *grffile, TileIndex tile, TileContext context, uint32 param1, uint32 param2, CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog = nullptr); ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) override { @@ -59,4 +62,11 @@ struct NewSignalsResolverObject : public ResolverObject { uint GetNewSignalsRestrictedSignalsInfo(const TraceRestrictProgram *prog, TileIndex tile); +inline uint GetNewSignalsSignalContext(CustomSignalSpriteContext signal_context, TileIndex tile) +{ + uint result = signal_context; + if ((signal_context == CSSC_TUNNEL_BRIDGE_ENTRANCE || signal_context == CSSC_TUNNEL_BRIDGE_EXIT) && IsTunnel(tile)) result |= 0x100; + return result; +} + #endif /* NEWGRF_NEWSIGNALS_H */ diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index 3c37a3a37e..fc8f17bedb 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -34,6 +34,7 @@ case 0x43: return _date; case 0x44: return HZB_TOWN_EDGE; case A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO: return 0; + case A2VRI_RAILTYPE_SIGNAL_CONTEXT: return this->signal_context; } } @@ -55,6 +56,8 @@ } case A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO: return GetNewSignalsRestrictedSignalsInfo(this->prog, this->tile); + case A2VRI_RAILTYPE_SIGNAL_CONTEXT: + return GetNewSignalsSignalContext(this->signal_context, this->tile); } DEBUG(grf, 1, "Unhandled rail type tile variable 0x%X", variable); @@ -81,10 +84,11 @@ uint32 RailTypeResolverObject::GetDebugID() const * @param rtsg Railpart of interest * @param param1 Extra parameter (first parameter of the callback, except railtypes do not have callbacks). * @param param2 Extra parameter (second parameter of the callback, except railtypes do not have callbacks). + * @param signal_context Signal context. * @param prog Routing restriction program. */ -RailTypeResolverObject::RailTypeResolverObject(const RailtypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32 param1, uint32 param2, const TraceRestrictProgram *prog) - : ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), railtype_scope(*this, rti, tile, context, prog) +RailTypeResolverObject::RailTypeResolverObject(const RailtypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32 param1, uint32 param2, CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog) + : ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), railtype_scope(*this, rti, tile, context, signal_context, prog) { this->root_spritegroup = rti != nullptr ? rti->group[rtsg] : nullptr; } @@ -121,16 +125,16 @@ inline uint8 RemapAspect(uint8 aspect, uint8 extra_aspects) return aspect + 1; } -static PalSpriteID GetRailTypeCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, bool gui, const TraceRestrictProgram *prog) +static PalSpriteID GetRailTypeCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, CustomSignalSpriteContext context, const TraceRestrictProgram *prog) { if (rti->group[RTSG_SIGNALS] == nullptr) return { 0, PAL_NONE }; if (type == SIGTYPE_PROG && !HasBit(rti->ctrl_flags, RTCF_PROGSIG)) return { 0, PAL_NONE }; if (type == SIGTYPE_NO_ENTRY && !HasBit(rti->ctrl_flags, RTCF_NOENTRYSIG)) return { 0, PAL_NONE }; - uint32 param1 = gui ? 0x10 : 0x00; + uint32 param1 = (context == CSSC_GUI) ? 0x10 : 0x00; uint32 param2 = (type << 16) | (var << 8) | RemapAspect(aspect, rti->signal_extra_aspects); if ((prog != nullptr) && HasBit(rti->ctrl_flags, RTCF_RESTRICTEDSIG)) SetBit(param2, 24); - RailTypeResolverObject object(rti, tile, TCX_NORMAL, RTSG_SIGNALS, param1, param2, prog); + RailTypeResolverObject object(rti, tile, TCX_NORMAL, RTSG_SIGNALS, param1, param2, context, prog); const SpriteGroup *group = object.Resolve(); if (group == nullptr || group->GetNumResults() == 0) return { 0, PAL_NONE }; @@ -149,21 +153,21 @@ static PalSpriteID GetRailTypeCustomSignalSprite(const RailtypeInfo *rti, TileIn * @param gui Is the sprite being used on the map or in the GUI? * @return The sprite to draw. */ -CustomSignalSpriteResult GetCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, bool gui, const TraceRestrictProgram *prog) +CustomSignalSpriteResult GetCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, CustomSignalSpriteContext context, const TraceRestrictProgram *prog) { if (_settings_client.gui.show_all_signal_default) return { { 0, PAL_NONE }, false }; - PalSpriteID spr = GetRailTypeCustomSignalSprite(rti, tile, type, var, aspect, gui, prog); + PalSpriteID spr = GetRailTypeCustomSignalSprite(rti, tile, type, var, aspect, context, prog); if (spr.sprite != 0) return { spr, HasBit(rti->ctrl_flags, RTCF_RESTRICTEDSIG) }; for (const GRFFile *grf : _new_signals_grfs) { if (type == SIGTYPE_PROG && !HasBit(grf->new_signal_ctrl_flags, NSCF_PROGSIG)) continue; if (type == SIGTYPE_NO_ENTRY && !HasBit(grf->new_signal_ctrl_flags, NSCF_NOENTRYSIG)) continue; - uint32 param1 = gui ? 0x10 : 0x00; + uint32 param1 = (context == CSSC_GUI) ? 0x10 : 0x00; uint32 param2 = (type << 16) | (var << 8) | RemapAspect(aspect, grf->new_signal_extra_aspects); if ((prog != nullptr) && HasBit(grf->new_signal_ctrl_flags, NSCF_RESTRICTEDSIG)) SetBit(param2, 24); - NewSignalsResolverObject object(grf, tile, TCX_NORMAL, param1, param2, prog); + NewSignalsResolverObject object(grf, tile, TCX_NORMAL, param1, param2, context, prog); const SpriteGroup *group = object.Resolve(); if (group != nullptr && group->GetNumResults() != 0) { diff --git a/src/newgrf_railtype.h b/src/newgrf_railtype.h index 470c27355e..994c5ad6c5 100644 --- a/src/newgrf_railtype.h +++ b/src/newgrf_railtype.h @@ -20,6 +20,7 @@ struct TraceRestrictProgram; struct RailTypeScopeResolver : public ScopeResolver { TileIndex tile; ///< Tracktile. For track on a bridge this is the southern bridgehead. TileContext context; ///< Are we resolving sprites for the upper halftile, or on a bridge? + CustomSignalSpriteContext signal_context; const RailtypeInfo *rti; const TraceRestrictProgram *prog; @@ -28,9 +29,10 @@ struct RailTypeScopeResolver : public ScopeResolver { * @param ro Surrounding resolver. * @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead. * @param context Are we resolving sprites for the upper halftile, or on a bridge? + * @param signal_context Signal context. */ - RailTypeScopeResolver(ResolverObject &ro, const RailtypeInfo *rti, TileIndex tile, TileContext context, const TraceRestrictProgram *prog) - : ScopeResolver(ro), tile(tile), context(context), rti(rti), prog(prog) + RailTypeScopeResolver(ResolverObject &ro, const RailtypeInfo *rti, TileIndex tile, TileContext context, CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog) + : ScopeResolver(ro), tile(tile), context(context), signal_context(signal_context), rti(rti), prog(prog) { } @@ -42,7 +44,7 @@ struct RailTypeScopeResolver : public ScopeResolver { struct RailTypeResolverObject : public ResolverObject { RailTypeScopeResolver railtype_scope; ///< Resolver for the railtype scope. - RailTypeResolverObject(const RailtypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32 param1 = 0, uint32 param2 = 0, const TraceRestrictProgram *prog = nullptr); + RailTypeResolverObject(const RailtypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32 param1 = 0, uint32 param2 = 0, CustomSignalSpriteContext signal_context = CSSC_GUI, const TraceRestrictProgram *prog = nullptr); ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) override { @@ -62,7 +64,7 @@ struct CustomSignalSpriteResult { }; SpriteID GetCustomRailSprite(const RailtypeInfo *rti, TileIndex tile, RailTypeSpriteGroup rtsg, TileContext context = TCX_NORMAL, uint *num_results = nullptr); -CustomSignalSpriteResult GetCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, bool gui = false, const TraceRestrictProgram *prog = nullptr); +CustomSignalSpriteResult GetCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, CustomSignalSpriteContext context, const TraceRestrictProgram *prog = nullptr); RailType GetRailTypeTranslation(uint8 railtype, const GRFFile *grffile); uint8 GetReverseRailTypeTranslation(RailType railtype, const GRFFile *grffile); diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 8cc6ed422c..9d74d28e5e 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -129,7 +129,7 @@ void ResolveRailTypeGUISprites(RailtypeInfo *rti) 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; + PalSpriteID red = GetCustomSignalSprite(rti, INVALID_TILE, type, var, 0, CSSC_GUI).sprite; if (red.sprite != 0) { rti->gui_sprites.signals[type][var][0] = { red.sprite + SIGNAL_TO_SOUTH, red.pal }; } else { @@ -139,7 +139,7 @@ void ResolveRailTypeGUISprites(RailtypeInfo *rti) rti->gui_sprites.signals[type][var][1] = rti->gui_sprites.signals[type][var][0]; continue; } - PalSpriteID green = GetCustomSignalSprite(rti, INVALID_TILE, type, var, 255, true).sprite; + PalSpriteID green = GetCustomSignalSprite(rti, INVALID_TILE, type, var, 255, CSSC_GUI).sprite; if (green.sprite != 0) { rti->gui_sprites.signals[type][var][1] = { green.sprite + SIGNAL_TO_SOUTH, green.pal }; } else { @@ -2721,7 +2721,7 @@ static void GetSignalXY(TileIndex tile, uint pos, uint &x, uint &y) } void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track track, SignalState condition, SignalOffsets image, uint pos, SignalType type, - SignalVariant variant, const TraceRestrictProgram *prog, bool exit_signal = false) + SignalVariant variant, const TraceRestrictProgram *prog, CustomSignalSpriteContext context) { bool show_restricted = (prog != nullptr); @@ -2734,17 +2734,28 @@ void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track track, Sign if (condition == SIGNAL_STATE_GREEN) { aspect = 1; if (_extra_aspects > 0) { - if (IsPlainRailTile(tile)) { - aspect = GetSignalAspect(tile, track); - } else if (IsTunnelBridgeWithSignalSimulation(tile)) { - aspect = exit_signal? GetTunnelBridgeExitSignalAspect(tile) : GetTunnelBridgeEntranceSignalAspect(tile); + switch (context) { + case CSSC_TRACK: + aspect = GetSignalAspect(tile, track); + break; + + case CSSC_TUNNEL_BRIDGE_ENTRANCE: + aspect = GetTunnelBridgeEntranceSignalAspect(tile); + break; + + case CSSC_TUNNEL_BRIDGE_EXIT: + aspect = GetTunnelBridgeExitSignalAspect(tile); + break; + + default: + break; } } } else { aspect = 0; } - const CustomSignalSpriteResult result = GetCustomSignalSprite(rti, tile, type, variant, aspect, false, prog); + const CustomSignalSpriteResult result = GetCustomSignalSprite(rti, tile, type, variant, aspect, context, prog); SpriteID sprite = result.sprite.sprite; PaletteID pal = PAL_NONE; bool is_custom_sprite = (sprite != 0); @@ -2825,7 +2836,7 @@ static void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track trac SignalVariant variant = GetSignalVariant(tile, track); const TraceRestrictProgram *prog = IsRestrictedSignal(tile) ? GetExistingTraceRestrictProgram(tile, track) : nullptr; - DrawSingleSignal(tile, rti, track, condition, image, pos, type, variant, prog); + DrawSingleSignal(tile, rti, track, condition, image, pos, type, variant, prog, CSSC_TRACK); } template diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 16b4de7b2b..7432584dca 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1759,7 +1759,7 @@ static void DrawTunnelBridgeRampSingleSignal(const TileInfo *ti, bool is_green, } bool show_restricted = IsTunnelBridgeRestrictedSignal(ti->tile); const TraceRestrictProgram *prog = show_restricted ? GetExistingTraceRestrictProgram(ti->tile, FindFirstTrack(GetAcrossTunnelBridgeTrackBits(ti->tile))) : nullptr; - const CustomSignalSpriteResult result = GetCustomSignalSprite(rti, ti->tile, type, variant, aspect, false, prog); + const CustomSignalSpriteResult result = GetCustomSignalSprite(rti, ti->tile, type, variant, aspect, show_exit ? CSSC_TUNNEL_BRIDGE_EXIT : CSSC_TUNNEL_BRIDGE_ENTRANCE, prog); PalSpriteID sprite = result.sprite; bool is_custom_sprite = (sprite.sprite != 0); @@ -1887,7 +1887,7 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st } const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(bridge_start_tile)); - PalSpriteID sprite = GetCustomSignalSprite(rti, bridge_start_tile, SIGTYPE_NORMAL, variant, aspect).sprite; + PalSpriteID sprite = GetCustomSignalSprite(rti, bridge_start_tile, SIGTYPE_NORMAL, variant, aspect, CSSC_BRIDGE_MIDDLE).sprite; if (sprite.sprite != 0) { sprite.sprite += position; @@ -2143,7 +2143,7 @@ static void DrawTile_TunnelBridge(TileInfo *ti, DrawTileProcParams params) if (IsTunnelBridgeWithSignalSimulation(ti->tile)) { extern void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track track, SignalState condition, - SignalOffsets image, uint pos, SignalType type, SignalVariant variant, const TraceRestrictProgram *prog, bool exit_signal = false); + SignalOffsets image, uint pos, SignalType type, SignalVariant variant, const TraceRestrictProgram *prog, CustomSignalSpriteContext context); DiagDirection dir = GetTunnelBridgeDirection(ti->tile); SignalVariant variant = IsTunnelBridgeSemaphore(ti->tile) ? SIG_SEMAPHORE : SIG_ELECTRIC; @@ -2157,14 +2157,14 @@ static void DrawTile_TunnelBridge(TileInfo *ti, DrawTileProcParams params) } const TraceRestrictProgram *prog = IsTunnelBridgeRestrictedSignal(ti->tile) ? GetExistingTraceRestrictProgram(ti->tile, t) : nullptr; if (IsTunnelBridgeSignalSimulationEntrance(ti->tile)) { - DrawSingleSignal(ti->tile, rti, t, GetTunnelBridgeEntranceSignalState(ti->tile), image, position, SIGTYPE_NORMAL, variant, prog, false); + DrawSingleSignal(ti->tile, rti, t, GetTunnelBridgeEntranceSignalState(ti->tile), image, position, SIGTYPE_NORMAL, variant, prog, CSSC_TUNNEL_BRIDGE_ENTRANCE); } if (IsTunnelBridgeSignalSimulationExit(ti->tile)) { SignalType type = SIGTYPE_NORMAL; if (IsTunnelBridgePBS(ti->tile)) { type = IsTunnelBridgeSignalSimulationEntrance(ti->tile) ? SIGTYPE_PBS : SIGTYPE_PBS_ONEWAY; } - DrawSingleSignal(ti->tile, rti, t, GetTunnelBridgeExitSignalState(ti->tile), (SignalOffsets)(image ^ 1), position ^ 1, type, variant, prog, true); + DrawSingleSignal(ti->tile, rti, t, GetTunnelBridgeExitSignalState(ti->tile), (SignalOffsets)(image ^ 1), position ^ 1, type, variant, prog, CSSC_TUNNEL_BRIDGE_EXIT); } }; switch (t) {