diff --git a/docs/newgrf-additions-nml.html b/docs/newgrf-additions-nml.html index 0c5c923dea..5147aee695 100644 --- a/docs/newgrf-additions-nml.html +++ b/docs/newgrf-additions-nml.html @@ -675,6 +675,13 @@ item (FEAT_GLOBALVARS) { Set whether signals should be drawn on the opposite side of the track for the most recently defined style (defined using the define_style property). + style_both_sides0 or 1 + + Set whether signals should be drawn on both sides of the track for the most recently defined style (defined using the define_style property).
+ If set, the signal_context_is_second variable is true when drawing the second signal.
+ If this and style_opposite_side are both set, the first signal is drawn on the opposite side and the second signal is drawn on the usual side. + + style_realistic_braking_only0 or 1 Set whether signals using this style may only be built when realistic braking is enabled, for the most recently defined style (defined using the define_style property). @@ -724,6 +731,11 @@ item (FEAT_GLOBALVARS) { The signal is being drawn on a tunnel entrance/exit (not a bridge) + signal_context_is_second0 or 1 + + The second signal is being drawn (on the opposite side to the first signal), see the style_both_sides property + + signal_context_info Above signal context variables in one variable (all of the signals_signal_context variable) diff --git a/docs/newgrf-additions.html b/docs/newgrf-additions.html index 19865ccc89..c4ea4873eb 100644 --- a/docs/newgrf-additions.html +++ b/docs/newgrf-additions.html @@ -554,6 +554,16 @@ The Action 0 Id field is not used, the value is ignored.

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

+

Set custom signal style signal drawn on both sides (mappable property: signals_style_both_sides)

+

This applies to the most recent custom signal style defined using the signals_define_style property.
+ When enabled, signals using this style are drawn on both sides of the track.
+ Bit 9 of signals_signal_context is set when drawing the second signal on the opposite side.

+

If this and signals_style_opposite_side are both set, the first signal is drawn on the opposite side + and the second signal is drawn on the usual side.

+

The property length is 1 byte. 0 is disabled (default). 1 is enabled.
+ The Action 0 Id field is not used, the value is ignored. +

+

This is indicated by the feature name: action0_signals_style, version 3

Set custom signal style signal requires realistic braking (mappable property: signals_style_realistic_braking_only)

This applies to the most recent custom signal style defined using the signals_define_style property.
When enabled, signals using this style may only be built when realistic braking is enabled.

@@ -929,6 +939,7 @@ 8Tunnel tile + 9Second signal (being drawn on opposite side), see: signals_style_both_sides

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

diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index c88d4b1ad7..f2ccf179fd 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -3223,6 +3223,7 @@ DEF_CONSOLE_CMD(ConDumpSignalStyles) IConsolePrintF(CC_DEFAULT, " s = lookahead single signal"); IConsolePrintF(CC_DEFAULT, " c = combined normal and shunt"); IConsolePrintF(CC_DEFAULT, " r = realistic braking only"); + IConsolePrintF(CC_DEFAULT, " b = both sides"); IConsolePrintF(CC_DEFAULT, " Extra aspects: %u", _extra_aspects); btree::btree_map grfs; @@ -3234,7 +3235,7 @@ DEF_CONSOLE_CMD(ConDumpSignalStyles) grfid = style.grffile->grfid; grfs.insert(std::pair(grfid, style.grffile)); } - IConsolePrintF(CC_DEFAULT, " %2u: GRF: %08X, Local: %2u, Extra aspects: %3u, Flags: %c%c%c%c%c%c%c, %s", + IConsolePrintF(CC_DEFAULT, " %2u: GRF: %08X, Local: %2u, Extra aspects: %3u, Flags: %c%c%c%c%c%c%c%c, %s", (uint) (i + 1), BSWAP32(grfid), style.grf_local_id, @@ -3246,6 +3247,7 @@ DEF_CONSOLE_CMD(ConDumpSignalStyles) HasBit(style.style_flags, NSSF_LOOKAHEAD_SINGLE_SIGNAL) ? 's' : '-', HasBit(style.style_flags, NSSF_COMBINED_NORMAL_SHUNT) ? 'c' : '-', HasBit(style.style_flags, NSSF_REALISTIC_BRAKING_ONLY) ? 'r' : '-', + HasBit(style.style_flags, NSSF_BOTH_SIDES) ? 'b' : '-', GetStringPtr(style.name) ); } diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 57b7678cfa..5a245aad2f 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -4255,6 +4255,15 @@ static ChangeInfoResult SignalsChangeInfo(uint id, int numinfo, int prop, const break; } + case A0RPI_SIGNALS_STYLE_BOTH_SIDES: { + if (MappedPropertyLengthMismatch(buf, 1, mapping_entry)) break; + uint8_t value = buf->ReadByte(); + if (_cur.grffile->current_new_signal_style != nullptr) { + SB(_cur.grffile->current_new_signal_style->style_flags, NSSF_BOTH_SIDES, 1, (value != 0 ? 1 : 0)); + } + break; + } + default: ret = HandleAction0PropertyDefault(buf, prop); break; diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index 5747fd3ad3..4fc00e7602 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -344,7 +344,7 @@ enum SpriteGroupCallbacksUsed : uint8_t { }; DECLARE_ENUM_AS_BIT_SET(SpriteGroupCallbacksUsed) -enum CustomSignalSpriteContext : uint8_t { +enum CustomSignalSpriteContextMode : uint8_t { CSSC_GUI = 0, CSSC_TRACK, CSSC_TUNNEL_BRIDGE_ENTRANCE, @@ -352,4 +352,16 @@ enum CustomSignalSpriteContext : uint8_t { CSSC_BRIDGE_MIDDLE, }; +enum CustomSignalSpriteContextFlags : uint8_t { + CSSCF_NONE = 0, + CSSCF_TUNNEL = 1 << 1, + CSSCF_SECOND_SIGNAL = 1 << 2, +}; +DECLARE_ENUM_AS_BIT_SET(CustomSignalSpriteContextFlags) + +struct CustomSignalSpriteContext { + CustomSignalSpriteContextMode ctx_mode; + CustomSignalSpriteContextFlags ctx_flags = CSSCF_NONE; +}; + #endif /* NEWGRF_COMMONS_H */ diff --git a/src/newgrf_extension.cpp b/src/newgrf_extension.cpp index 194a5c0b6f..9b7eec151a 100644 --- a/src/newgrf_extension.cpp +++ b/src/newgrf_extension.cpp @@ -53,7 +53,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("action0_signals_style", 2), + GRFFeatureInfo("action0_signals_style", 3), GRFFeatureInfo("varaction2_signals_signal_context", 1), GRFFeatureInfo("varaction2_signals_signal_side", 1), GRFFeatureInfo("varaction2_signals_signal_vertical_clearance", 1), @@ -126,6 +126,7 @@ extern const GRFPropertyMapDefinition _grf_action0_remappable_properties[] = { GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_OPPOSITE_SIDE, "signals_style_opposite_side"), GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_COMBINED_NORMAL_SHUNT, "signals_style_combined_normal_shunt"), GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_REALISTIC_BRAKING_ONLY, "signals_style_realistic_braking_only"), + GRFPropertyMapDefinition(GSF_SIGNALS, A0RPI_SIGNALS_STYLE_BOTH_SIDES, "signals_style_both_sides"), GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_USE_LAND_GROUND, "object_use_land_ground"), GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_EDGE_FOUNDATION_MODE, "object_edge_foundation_mode"), GRFPropertyMapDefinition(GSF_OBJECTS, A0RPI_OBJECT_FLOOD_RESISTANT, "object_flood_resistant"), diff --git a/src/newgrf_extension.h b/src/newgrf_extension.h index ba66e6304e..870ac4f881 100644 --- a/src/newgrf_extension.h +++ b/src/newgrf_extension.h @@ -50,6 +50,7 @@ enum Action0RemapPropertyIds { A0RPI_SIGNALS_STYLE_OPPOSITE_SIDE, A0RPI_SIGNALS_STYLE_COMBINED_NORMAL_SHUNT, A0RPI_SIGNALS_STYLE_REALISTIC_BRAKING_ONLY, + A0RPI_SIGNALS_STYLE_BOTH_SIDES, A0RPI_OBJECT_USE_LAND_GROUND, A0RPI_OBJECT_EDGE_FOUNDATION_MODE, A0RPI_OBJECT_FLOOD_RESISTANT, diff --git a/src/newgrf_newsignals.cpp b/src/newgrf_newsignals.cpp index 9801869b00..a0fba65139 100644 --- a/src/newgrf_newsignals.cpp +++ b/src/newgrf_newsignals.cpp @@ -51,7 +51,7 @@ uint32_t GetNewSignalsSideVariable() switch (variable) { case 0x40: return 0; case A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO: return 0; - case A2VRI_SIGNALS_SIGNAL_CONTEXT: return this->signal_context; + case A2VRI_SIGNALS_SIGNAL_CONTEXT: return GetNewSignalsSignalContext(this->signal_context); case A2VRI_SIGNALS_SIGNAL_STYLE: return MapSignalStyle(this->signal_style); case A2VRI_SIGNALS_SIGNAL_SIDE: return GetNewSignalsSideVariable(); case A2VRI_SIGNALS_SIGNAL_VERTICAL_CLEARANCE: return 0xFF; @@ -63,7 +63,7 @@ uint32_t GetNewSignalsSideVariable() case A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO: return GetNewSignalsRestrictedSignalsInfo(this->prog, this->tile, this->signal_style); case A2VRI_SIGNALS_SIGNAL_CONTEXT: - return GetNewSignalsSignalContext(this->signal_context, this->tile); + return GetNewSignalsSignalContext(this->signal_context); case A2VRI_SIGNALS_SIGNAL_STYLE: return MapSignalStyle(this->signal_style); case A2VRI_SIGNALS_SIGNAL_SIDE: return GetNewSignalsSideVariable(); case A2VRI_SIGNALS_SIGNAL_VERTICAL_CLEARANCE: return GetNewSignalsVerticalClearanceInfo(this->tile, this->z); diff --git a/src/newgrf_newsignals.h b/src/newgrf_newsignals.h index e4e89150e4..e58f46becb 100644 --- a/src/newgrf_newsignals.h +++ b/src/newgrf_newsignals.h @@ -35,6 +35,7 @@ enum NewSignalStyleFlags { NSSF_LOOKAHEAD_SINGLE_SIGNAL = 4, NSSF_COMBINED_NORMAL_SHUNT = 5, NSSF_REALISTIC_BRAKING_ONLY = 6, + NSSF_BOTH_SIDES = 7, }; struct NewSignalStyle { @@ -107,11 +108,9 @@ struct NewSignalsResolverObject : public ResolverObject { uint GetNewSignalsRestrictedSignalsInfo(const TraceRestrictProgram *prog, TileIndex tile, uint8_t signal_style); uint GetNewSignalsVerticalClearanceInfo(TileIndex tile, uint z); -inline uint GetNewSignalsSignalContext(CustomSignalSpriteContext signal_context, TileIndex tile) +inline uint GetNewSignalsSignalContext(CustomSignalSpriteContext signal_context) { - uint result = signal_context; - if ((signal_context == CSSC_TUNNEL_BRIDGE_ENTRANCE || signal_context == CSSC_TUNNEL_BRIDGE_EXIT) && IsTunnel(tile)) result |= 0x100; - return result; + return (uint)signal_context.ctx_mode | (((uint)signal_context.ctx_flags) << 8); } uint32_t GetNewSignalsSideVariable(); diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index bac6c9cf36..695f2674a8 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -37,7 +37,7 @@ case 0x43: return CalTime::CurDate().base(); case 0x44: return HZB_TOWN_EDGE; case A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO: return 0; - case A2VRI_RAILTYPE_SIGNAL_CONTEXT: return this->signal_context; + case A2VRI_RAILTYPE_SIGNAL_CONTEXT: return GetNewSignalsSignalContext(this->signal_context); case A2VRI_RAILTYPE_SIGNAL_SIDE: return GetNewSignalsSideVariable(); case A2VRI_RAILTYPE_SIGNAL_VERTICAL_CLEARANCE: return 0xFF; case A2VRI_RAILTYPE_ADJACENT_CROSSING: return 0; @@ -63,7 +63,7 @@ case A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO: return GetNewSignalsRestrictedSignalsInfo(this->prog, this->tile, 0); case A2VRI_RAILTYPE_SIGNAL_CONTEXT: - return GetNewSignalsSignalContext(this->signal_context, this->tile); + return GetNewSignalsSignalContext(this->signal_context); case A2VRI_RAILTYPE_SIGNAL_SIDE: return GetNewSignalsSideVariable(); case A2VRI_RAILTYPE_SIGNAL_VERTICAL_CLEARANCE: @@ -175,7 +175,7 @@ static PalSpriteID GetRailTypeCustomSignalSprite(const RailTypeInfo *rti, TileIn 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_t param1 = (context == CSSC_GUI) ? 0x10 : 0x00; + uint32_t param1 = (context.ctx_mode == CSSC_GUI) ? 0x10 : 0x00; uint32_t param2 = (type << 16) | (var << 8) | RemapAspect(aspect, rti->signal_extra_aspects, 0); if ((prog != nullptr) && HasBit(rti->ctrl_flags, RTCF_RESTRICTEDSIG)) SetBit(param2, 24); RailTypeResolverObject object(rti, tile, TCX_NORMAL, RTSG_SIGNALS, param1, param2, context, prog, z); @@ -214,7 +214,7 @@ CustomSignalSpriteResult GetCustomSignalSprite(const RailTypeInfo *rti, TileInde } if (!HasBit(grf->new_signal_style_mask, style)) continue; - uint32_t param1 = (context == CSSC_GUI) ? 0x10 : 0x00; + uint32_t param1 = (context.ctx_mode == CSSC_GUI) ? 0x10 : 0x00; uint32_t param2 = (type << 16) | (var << 8) | RemapAspect(aspect, grf->new_signal_extra_aspects, style); if ((prog != nullptr) && HasBit(grf->new_signal_ctrl_flags, NSCF_RESTRICTEDSIG)) SetBit(param2, 24); NewSignalsResolverObject object(grf, tile, TCX_NORMAL, param1, param2, context, style, prog, z); diff --git a/src/newgrf_railtype.h b/src/newgrf_railtype.h index b2a12f26ab..c723f6b6f6 100644 --- a/src/newgrf_railtype.h +++ b/src/newgrf_railtype.h @@ -46,7 +46,7 @@ struct RailTypeResolverObject : public ResolverObject { RailTypeScopeResolver railtype_scope; ///< Resolver for the railtype scope. RailTypeResolverObject(const RailTypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32_t param1 = 0, uint32_t param2 = 0, - CustomSignalSpriteContext signal_context = CSSC_GUI, const TraceRestrictProgram *prog = nullptr, uint z = 0); + CustomSignalSpriteContext signal_context = { CSSC_GUI }, const TraceRestrictProgram *prog = nullptr, uint z = 0); ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, VarSpriteGroupScopeOffset relative = 0) override { diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index ba2c985081..b56c2a954f 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -102,7 +102,7 @@ void ResolveRailTypeGUISignalSprites(RailTypeInfo *rti, uint8_t style, PalSprite for (SignalType type = SIGTYPE_BLOCK; 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, CSSC_GUI, style).sprite; + PalSpriteID red = GetCustomSignalSprite(rti, INVALID_TILE, type, var, 0, { CSSC_GUI }, style).sprite; if (red.sprite != 0) { signals[type][var][0] = { red.sprite + SIGNAL_TO_SOUTH, red.pal }; } else { @@ -112,7 +112,7 @@ void ResolveRailTypeGUISignalSprites(RailTypeInfo *rti, uint8_t style, PalSprite signals[type][var][1] = signals[type][var][0]; continue; } - PalSpriteID green = GetCustomSignalSprite(rti, INVALID_TILE, type, var, 255, CSSC_GUI, style).sprite; + PalSpriteID green = GetCustomSignalSprite(rti, INVALID_TILE, type, var, 255, { CSSC_GUI }, style).sprite; if (green.sprite != 0) { signals[type][var][1] = { green.sprite + SIGNAL_TO_SOUTH, green.pal }; } else { @@ -3221,7 +3221,7 @@ void DrawSingleSignal(TileIndex tile, const RailTypeInfo *rti, Track track, Sign uint8_t style = 0; if (_num_new_signal_styles > 0) { - switch (context) { + switch (context.ctx_mode) { case CSSC_TRACK: style = GetSignalStyle(tile, track); break; @@ -3236,14 +3236,19 @@ void DrawSingleSignal(TileIndex tile, const RailTypeInfo *rti, Track track, Sign } } + if (HasBit(_signal_style_masks.signal_both_sides, style) && ((context.ctx_flags & CSSCF_SECOND_SIGNAL) == 0)) { + /* Draw second signal on opposite side */ + DrawSingleSignal(tile, rti, track, condition, image, pos, type, variant, prog, { context.ctx_mode, context.ctx_flags | CSSCF_SECOND_SIGNAL }); + } + uint x, y; - GetSignalXY(tile, pos, HasBit(_signal_style_masks.signal_opposite_side, style), x, y); + GetSignalXY(tile, pos, HasBit(_signal_style_masks.signal_opposite_side, style) != ((context.ctx_flags & CSSCF_SECOND_SIGNAL) != 0), x, y); uint8_t aspect; if (condition == SIGNAL_STATE_GREEN) { aspect = 1; if (_extra_aspects > 0) { - switch (context) { + switch (context.ctx_mode) { case CSSC_TRACK: aspect = GetSignalAspect(tile, track); break; @@ -3341,7 +3346,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, CSSC_TRACK); + DrawSingleSignal(tile, rti, track, condition, image, pos, type, variant, prog, { CSSC_TRACK }); } static void GetSignalXYByTrackdir(TileIndex tile, Trackdir td, bool opposite, uint &x, uint &y) @@ -3402,6 +3407,11 @@ void MarkSingleSignalDirty(TileIndex tile, Trackdir td) MarkSingleSignalDirtyIntl(tile, td, opposite, [td](uint x, uint y) -> uint { return GetSaveSlopeZ(x, y, TrackdirToTrack(td)); }); + + if (_signal_style_masks.signal_both_sides == 0 || !HasBit(_signal_style_masks.signal_both_sides, GetSignalStyleGeneric(tile, TrackdirToTrack(td)))) return; + MarkSingleSignalDirtyIntl(tile, td, !opposite, [td](uint x, uint y) -> uint { + return GetSaveSlopeZ(x, y, TrackdirToTrack(td)); + }); } void MarkSingleSignalDirtyAtZ(TileIndex tile, Trackdir td, bool opposite_side, uint z) diff --git a/src/signal.cpp b/src/signal.cpp index 53daf1bdf2..c1c83f8baa 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -1887,6 +1887,9 @@ static bool DetermineExtraAspectsVariable() if (HasBit(_new_signal_styles[i].style_flags, NSSF_OPPOSITE_SIDE)) { SetBit(_signal_style_masks.signal_opposite_side, i + 1); } + if (HasBit(_new_signal_styles[i].style_flags, NSSF_BOTH_SIDES)) { + SetBit(_signal_style_masks.signal_both_sides, i + 1); + } if (HasBit(_new_signal_styles[i].style_flags, NSSF_COMBINED_NORMAL_SHUNT)) { SetBit(_signal_style_masks.combined_normal_shunt, i + 1); SetBit(_signal_style_masks.no_tunnel_bridge, i + 1); diff --git a/src/signal_func.h b/src/signal_func.h index 35cb55fc06..91741c0189 100644 --- a/src/signal_func.h +++ b/src/signal_func.h @@ -33,6 +33,7 @@ struct SignalStyleMasks { uint16_t always_reserve_through = 0; uint16_t no_tunnel_bridge = 0; uint16_t signal_opposite_side = 0; + uint16_t signal_both_sides = 0; uint16_t combined_normal_shunt = 0; }; extern SignalStyleMasks _signal_style_masks; diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index 95c837bf72..e7c43ca450 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -1449,11 +1449,12 @@ class NIHSignals : public NIHelper { uint Resolve(uint index, uint var, uint param, GetVariableExtra *extra) const override { extern TraceRestrictProgram *GetFirstTraceRestrictProgramOnTile(TileIndex t); - CustomSignalSpriteContext ctx = CSSC_TRACK; + CustomSignalSpriteContext ctx = { CSSC_TRACK }; uint8_t style = 0; uint z = 0; if (IsTunnelBridgeWithSignalSimulation(index)) { - ctx = IsTunnelBridgeSignalSimulationEntrance(index) ? CSSC_TUNNEL_BRIDGE_ENTRANCE : CSSC_TUNNEL_BRIDGE_EXIT; + ctx = { IsTunnelBridgeSignalSimulationEntrance(index) ? CSSC_TUNNEL_BRIDGE_ENTRANCE : CSSC_TUNNEL_BRIDGE_EXIT }; + if (IsTunnel(index)) ctx.ctx_flags |= CSSCF_TUNNEL; style = GetTunnelBridgeSignalStyle(index); z = GetTunnelBridgeSignalZ(index, !IsTunnelBridgeSignalSimulationEntrance(index)); } else if (IsTileType(index, MP_RAILWAY) && HasSignals(index)) { diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index a0d94ab2dd..61a9e56f5b 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1770,7 +1770,9 @@ 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, show_exit ? CSSC_TUNNEL_BRIDGE_EXIT : CSSC_TUNNEL_BRIDGE_ENTRANCE, style, prog, z); + CustomSignalSpriteContext ctx = { show_exit ? CSSC_TUNNEL_BRIDGE_EXIT : CSSC_TUNNEL_BRIDGE_ENTRANCE }; + if (IsTunnel(ti->tile)) ctx.ctx_flags |= CSSCF_TUNNEL; + const CustomSignalSpriteResult result = GetCustomSignalSprite(rti, ti->tile, type, variant, aspect, ctx, style, prog, z); PalSpriteID sprite = result.sprite; bool is_custom_sprite = (sprite.sprite != 0); @@ -1896,7 +1898,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_BLOCK, variant, aspect, CSSC_BRIDGE_MIDDLE, style).sprite; + PalSpriteID sprite = GetCustomSignalSprite(rti, bridge_start_tile, SIGTYPE_BLOCK, variant, aspect, { CSSC_BRIDGE_MIDDLE }, style).sprite; if (sprite.sprite != 0) { sprite.sprite += position; @@ -2222,14 +2224,16 @@ 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_BLOCK, variant, prog, CSSC_TUNNEL_BRIDGE_ENTRANCE); + CustomSignalSpriteContext ctx = { CSSC_TUNNEL_BRIDGE_ENTRANCE }; + DrawSingleSignal(ti->tile, rti, t, GetTunnelBridgeEntranceSignalState(ti->tile), image, position, SIGTYPE_BLOCK, variant, prog, ctx); } if (IsTunnelBridgeSignalSimulationExit(ti->tile)) { SignalType type = SIGTYPE_BLOCK; 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, CSSC_TUNNEL_BRIDGE_EXIT); + CustomSignalSpriteContext ctx = { CSSC_TUNNEL_BRIDGE_EXIT }; + DrawSingleSignal(ti->tile, rti, t, GetTunnelBridgeExitSignalState(ti->tile), (SignalOffsets)(image ^ 1), position ^ 1, type, variant, prog, ctx); } }; switch (t) {