Signals: Add variable for signal context (track, tunnel, bridge, etc)

pull/400/head
Jonathan G Rennison 2 years ago
parent cf5eef515e
commit 41117a52d2

@ -121,6 +121,33 @@
</dl> </dl>
</td> </td>
</tr> </tr>
<tr><td>signal_context</td><td>SIGNAL_CONTEXT_XXX</td>
<td>
Information about the context of the signal being drawn:
<dl>
<dt>GUI</dt>
<dd>The signal is being drawn in the GUI (signal window)</dd>
<dt>TRACK</dt>
<dd>The signal is being drawn on ordinary rail track</dd>
<dt>TUNNEL_BRIDGE_ENTRANCE</dt>
<dd>The signal is being drawn as a tunnel/bridge entrance signal</dd>
<dt>TUNNEL_BRIDGE_EXIT</dt>
<dd>The signal is being drawn as a tunnel/bridge exit signal</dd>
<dt>BRIDGE_MIDDLE</dt>
<dd>The signal is being drawn on the middle of a bridge</dd>
</dl>
</td>
</tr>
<tr><td>signal_context_is_tunnel</td><td>0 or 1</td>
<td>
The signal is being drawn on a tunnel entrance/exit (not a bridge)
</td>
</tr>
<tr><td>signal_context_info</td><td></td>
<td>
Above signal context variables in one variable (all of the railtype_signal_context variable)
</td>
</tr>
</table> </table>
<h3><a href="https://newgrf-specs.tt-wiki.net/wiki/NML:Roadtypes#Roadtype_properties">Roadtype properties</a></h3> <h3><a href="https://newgrf-specs.tt-wiki.net/wiki/NML:Roadtypes#Roadtype_properties">Roadtype properties</a></h3>
<table> <table>
@ -435,6 +462,33 @@ item (FEAT_GLOBALVARS) {
</dl> </dl>
</td> </td>
</tr> </tr>
<tr><td>signal_context</td><td>SIGNAL_CONTEXT_XXX</td>
<td>
Information about the context of the signal being drawn:
<dl>
<dt>GUI</dt>
<dd>The signal is being drawn in the GUI (signal window)</dd>
<dt>TRACK</dt>
<dd>The signal is being drawn on ordinary rail track</dd>
<dt>TUNNEL_BRIDGE_ENTRANCE</dt>
<dd>The signal is being drawn as a tunnel/bridge entrance signal</dd>
<dt>TUNNEL_BRIDGE_EXIT</dt>
<dd>The signal is being drawn as a tunnel/bridge exit signal</dd>
<dt>BRIDGE_MIDDLE</dt>
<dd>The signal is being drawn on the middle of a bridge</dd>
</dl>
</td>
</tr>
<tr><td>signal_context_is_tunnel</td><td>0 or 1</td>
<td>
The signal is being drawn on a tunnel entrance/exit (not a bridge)
</td>
</tr>
<tr><td>signal_context_info</td><td></td>
<td>
Above signal context variables in one variable (all of the signals_signal_context variable)
</td>
</tr>
</table> </table>
<p> <p>
Custom signal sprites example: Custom signal sprites example:

@ -588,6 +588,25 @@
</p> </p>
<p>See also: <a href="#railtype_enable_restricted_signals">railtype_enable_restricted_signals property</a></p> <p>See also: <a href="#railtype_enable_restricted_signals">railtype_enable_restricted_signals property</a></p>
<p>This is indicated by the feature name: <font face="monospace">action0_railtype_restricted_signals</font>, version 2</p> <p>This is indicated by the feature name: <font face="monospace">action0_railtype_restricted_signals</font>, version 2</p>
<h4 id="railtype_signal_context">Signal context (mappable variable: railtype_signal_context)</h4>
<p>This applies to <a href="https://newgrf-specs.tt-wiki.net/wiki/Action3/Railtypes#Signal_sprites_.280B.29">Action 2/3 - Railtype custom signal sprites</a>.<br />
<table>
<tr><th>Bit</th><th>Meaning</th></tr>
<tr><td>0 - 7</td><td>
Context:
<table>
<tr><th>Value</th><th>Meaning</th></tr>
<tr><td>0</td><td>GUI</td></tr>
<tr><td>1</td><td>Plain rail track</td></tr>
<tr><td>2</td><td>Tunnel/bridge entrance</td></tr>
<tr><td>3</td><td>Tunnel/bridge exit</td></tr>
<tr><td>4</td><td>Bridge middle</td></tr>
</table>
</td></tr>
<tr><td>8</td><td>Tunnel tile</td></tr>
</table>
</p>
<p>This is indicated by the feature name: <font face="monospace">varaction2_railtype_signal_context</font>, version 1</p>
<br /> <br />
<h3 id="varaction2_object"><a href="https://newgrf-specs.tt-wiki.net/wiki/VariationalAction2/Objects">Variational Action 2 - Objects</a></h3> <h3 id="varaction2_object"><a href="https://newgrf-specs.tt-wiki.net/wiki/VariationalAction2/Objects">Variational Action 2 - Objects</a></h3>
<h4 id="object_foundation_tile_slope">Tile slope after foundation applied (mappable variable: object_foundation_tile_slope)</h4> <h4 id="object_foundation_tile_slope">Tile slope after foundation applied (mappable variable: object_foundation_tile_slope)</h4>
@ -611,6 +630,25 @@
</p> </p>
<p>See also: <a href="#signals_enable_restricted_signals">signals_enable_restricted_signals property</a></p> <p>See also: <a href="#signals_enable_restricted_signals">signals_enable_restricted_signals property</a></p>
<p>This is indicated by the feature name: <font face="monospace">action0_signals_restricted_signals</font>, version 2</p> <p>This is indicated by the feature name: <font face="monospace">action0_signals_restricted_signals</font>, version 2</p>
<h4 id="signals_signal_context">Signal context (mappable variable: signals_signal_context)</h4>
<p>This applies to <a href="#a3signals_custom_signal_sprites">Action 2/3 Signals (Feature 0E) custom signal sprites</a>.<br />
<table>
<tr><th>Bit</th><th>Meaning</th></tr>
<tr><td>0 - 7</td><td>
Context:
<table>
<tr><th>Value</th><th>Meaning</th></tr>
<tr><td>0</td><td>GUI</td></tr>
<tr><td>1</td><td>Plain rail track</td></tr>
<tr><td>2</td><td>Tunnel/bridge entrance</td></tr>
<tr><td>3</td><td>Tunnel/bridge exit</td></tr>
<tr><td>4</td><td>Bridge middle</td></tr>
</table>
</td></tr>
<tr><td>8</td><td>Tunnel tile</td></tr>
</table>
</p>
<p>This is indicated by the feature name: <font face="monospace">varaction2_signals_signal_context</font>, version 1</p>
<br /> <br />
<br /> <br />
<h3 id="a3signals"><a href="https://newgrf-specs.tt-wiki.net/wiki/Action3">Action 3 - Signals (Feature 0E)</a></h3> <h3 id="a3signals"><a href="https://newgrf-specs.tt-wiki.net/wiki/Action3">Action 3 - Signals (Feature 0E)</a></h3>

@ -21,7 +21,7 @@
#include "company_type.h" #include "company_type.h"
/** Context for tile accesses */ /** Context for tile accesses */
enum TileContext { enum TileContext : uint8 {
TCX_NORMAL, ///< Nothing special. TCX_NORMAL, ///< Nothing special.
TCX_UPPER_HALFTILE, ///< Querying information about the upper part of a tile with halftile foundation. 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). 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) 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 */ #endif /* NEWGRF_COMMONS_H */

@ -39,6 +39,7 @@ extern const GRFFeatureInfo _grf_feature_list[] = {
GRFFeatureInfo("action0_railtype_recolour", 1), GRFFeatureInfo("action0_railtype_recolour", 1),
GRFFeatureInfo("action0_railtype_extra_aspects", 1), GRFFeatureInfo("action0_railtype_extra_aspects", 1),
GRFFeatureInfo("action0_roadtype_extra_flags", 1), GRFFeatureInfo("action0_roadtype_extra_flags", 1),
GRFFeatureInfo("varaction2_railtype_signal_context", 1),
GRFFeatureInfo("action0_global_extra_station_names", 2), GRFFeatureInfo("action0_global_extra_station_names", 2),
GRFFeatureInfo("action0_global_default_object_generate_amount", 1), GRFFeatureInfo("action0_global_default_object_generate_amount", 1),
GRFFeatureInfo("action0_signals_programmable_signals", 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_restricted_signals", 2),
GRFFeatureInfo("action0_signals_recolour", 1), GRFFeatureInfo("action0_signals_recolour", 1),
GRFFeatureInfo("action0_signals_extra_aspects", 1), GRFFeatureInfo("action0_signals_extra_aspects", 1),
GRFFeatureInfo("varaction2_signals_signal_context", 1),
GRFFeatureInfo("action3_signals_custom_signal_sprites", 1), GRFFeatureInfo("action3_signals_custom_signal_sprites", 1),
GRFFeatureInfo("action0_object_use_land_ground", 1), GRFFeatureInfo("action0_object_use_land_ground", 1),
GRFFeatureInfo("action0_object_edge_foundation_mode", 2), 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, 0x68, "roadstop_road_stop_info_nearby_tiles"),
GRFVariableMapDefinition(GSF_ROADSTOPS, 0x6A, "roadstop_road_stop_grfid_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_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_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, 0x40, "newlandscape_terrain_type"),
GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x41, "newlandscape_tile_slope"), GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x41, "newlandscape_tile_slope"),
GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x42, "newlandscape_tile_height"), GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x42, "newlandscape_tile_height"),

@ -63,7 +63,9 @@ enum Action2VariableRemapIds {
A2VRI_OBJECT_FOUNDATION_SLOPE_CHANGE, A2VRI_OBJECT_FOUNDATION_SLOPE_CHANGE,
A2VRI_VEHICLE_CURRENT_SPEED_SCALED, A2VRI_VEHICLE_CURRENT_SPEED_SCALED,
A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO, A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO,
A2VRI_RAILTYPE_SIGNAL_CONTEXT,
A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO, A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO,
A2VRI_SIGNALS_SIGNAL_CONTEXT,
}; };
/** Action14 feature definition */ /** Action14 feature definition */

@ -30,6 +30,7 @@ std::vector<const GRFFile *> _new_signals_grfs;
switch (variable) { switch (variable) {
case 0x40: return 0; case 0x40: return 0;
case A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO: 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<const GRFFile *> _new_signals_grfs;
case 0x40: return GetTerrainType(this->tile, this->context); case 0x40: return GetTerrainType(this->tile, this->context);
case A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO: case A2VRI_SIGNALS_SIGNAL_RESTRICTION_INFO:
return GetNewSignalsRestrictedSignalsInfo(this->prog, this->tile); 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); 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 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 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 param2 Extra parameter (second parameter of the callback, except railtypes do not have callbacks).
* @param signal_context Signal context.
* @param prog Routing restriction program. * @param prog Routing restriction program.
*/ */
NewSignalsResolverObject::NewSignalsResolverObject(const GRFFile *grffile, TileIndex tile, TileContext context, uint32 param1, uint32 param2, const TraceRestrictProgram *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, 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; this->root_spritegroup = grffile != nullptr ? grffile->new_signals_group : nullptr;
} }

@ -12,6 +12,7 @@
#include "newgrf_commons.h" #include "newgrf_commons.h"
#include "newgrf_spritegroup.h" #include "newgrf_spritegroup.h"
#include "tunnel_map.h"
extern std::vector<const GRFFile *> _new_signals_grfs; extern std::vector<const GRFFile *> _new_signals_grfs;
@ -21,6 +22,7 @@ struct TraceRestrictProgram;
struct NewSignalsScopeResolver : public ScopeResolver { struct NewSignalsScopeResolver : public ScopeResolver {
TileIndex tile; ///< Tracktile. For track on a bridge this is the southern bridgehead. 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? TileContext context; ///< Are we resolving sprites for the upper halftile, or on a bridge?
CustomSignalSpriteContext signal_context;
const TraceRestrictProgram *prog; const TraceRestrictProgram *prog;
/** /**
@ -28,9 +30,10 @@ struct NewSignalsScopeResolver : public ScopeResolver {
* @param ro Surrounding resolver. * @param ro Surrounding resolver.
* @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead. * @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 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) NewSignalsScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context, CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog)
: ScopeResolver(ro), tile(tile), context(context), prog(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 { struct NewSignalsResolverObject : public ResolverObject {
NewSignalsScopeResolver newsignals_scope; ///< Resolver for the new signals scope. 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 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); 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 */ #endif /* NEWGRF_NEWSIGNALS_H */

@ -34,6 +34,7 @@
case 0x43: return _date; case 0x43: return _date;
case 0x44: return HZB_TOWN_EDGE; case 0x44: return HZB_TOWN_EDGE;
case A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO: return 0; 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: case A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO:
return GetNewSignalsRestrictedSignalsInfo(this->prog, this->tile); 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); 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 rtsg Railpart of interest
* @param param1 Extra parameter (first parameter of the callback, except railtypes do not have callbacks). * @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 param2 Extra parameter (second parameter of the callback, except railtypes do not have callbacks).
* @param signal_context Signal context.
* @param prog Routing restriction program. * @param prog Routing restriction program.
*/ */
RailTypeResolverObject::RailTypeResolverObject(const RailtypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32 param1, uint32 param2, const TraceRestrictProgram *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, 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; this->root_spritegroup = rti != nullptr ? rti->group[rtsg] : nullptr;
} }
@ -121,16 +125,16 @@ inline uint8 RemapAspect(uint8 aspect, uint8 extra_aspects)
return aspect + 1; 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 (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_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 }; 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); uint32 param2 = (type << 16) | (var << 8) | RemapAspect(aspect, rti->signal_extra_aspects);
if ((prog != nullptr) && HasBit(rti->ctrl_flags, RTCF_RESTRICTEDSIG)) SetBit(param2, 24); 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(); const SpriteGroup *group = object.Resolve();
if (group == nullptr || group->GetNumResults() == 0) return { 0, PAL_NONE }; 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? * @param gui Is the sprite being used on the map or in the GUI?
* @return The sprite to draw. * @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 }; 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) }; if (spr.sprite != 0) return { spr, HasBit(rti->ctrl_flags, RTCF_RESTRICTEDSIG) };
for (const GRFFile *grf : _new_signals_grfs) { for (const GRFFile *grf : _new_signals_grfs) {
if (type == SIGTYPE_PROG && !HasBit(grf->new_signal_ctrl_flags, NSCF_PROGSIG)) continue; 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; 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); 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); 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(); const SpriteGroup *group = object.Resolve();
if (group != nullptr && group->GetNumResults() != 0) { if (group != nullptr && group->GetNumResults() != 0) {

@ -20,6 +20,7 @@ struct TraceRestrictProgram;
struct RailTypeScopeResolver : public ScopeResolver { struct RailTypeScopeResolver : public ScopeResolver {
TileIndex tile; ///< Tracktile. For track on a bridge this is the southern bridgehead. 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? TileContext context; ///< Are we resolving sprites for the upper halftile, or on a bridge?
CustomSignalSpriteContext signal_context;
const RailtypeInfo *rti; const RailtypeInfo *rti;
const TraceRestrictProgram *prog; const TraceRestrictProgram *prog;
@ -28,9 +29,10 @@ struct RailTypeScopeResolver : public ScopeResolver {
* @param ro Surrounding resolver. * @param ro Surrounding resolver.
* @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead. * @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 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) RailTypeScopeResolver(ResolverObject &ro, const RailtypeInfo *rti, TileIndex tile, TileContext context, CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog)
: ScopeResolver(ro), tile(tile), context(context), rti(rti), prog(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 { struct RailTypeResolverObject : public ResolverObject {
RailTypeScopeResolver railtype_scope; ///< Resolver for the railtype scope. 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 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); 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); RailType GetRailTypeTranslation(uint8 railtype, const GRFFile *grffile);
uint8 GetReverseRailTypeTranslation(RailType railtype, const GRFFile *grffile); uint8 GetReverseRailTypeTranslation(RailType railtype, const GRFFile *grffile);

@ -129,7 +129,7 @@ void ResolveRailTypeGUISprites(RailtypeInfo *rti)
for (SignalType type = SIGTYPE_NORMAL; type < SIGTYPE_END; type = (SignalType)(type + 1)) { for (SignalType type = SIGTYPE_NORMAL; type < SIGTYPE_END; type = (SignalType)(type + 1)) {
for (SignalVariant var = SIG_ELECTRIC; var <= SIG_SEMAPHORE; var = (SignalVariant)(var + 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) { if (red.sprite != 0) {
rti->gui_sprites.signals[type][var][0] = { red.sprite + SIGNAL_TO_SOUTH, red.pal }; rti->gui_sprites.signals[type][var][0] = { red.sprite + SIGNAL_TO_SOUTH, red.pal };
} else { } else {
@ -139,7 +139,7 @@ void ResolveRailTypeGUISprites(RailtypeInfo *rti)
rti->gui_sprites.signals[type][var][1] = rti->gui_sprites.signals[type][var][0]; rti->gui_sprites.signals[type][var][1] = rti->gui_sprites.signals[type][var][0];
continue; 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) { if (green.sprite != 0) {
rti->gui_sprites.signals[type][var][1] = { green.sprite + SIGNAL_TO_SOUTH, green.pal }; rti->gui_sprites.signals[type][var][1] = { green.sprite + SIGNAL_TO_SOUTH, green.pal };
} else { } 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, 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); bool show_restricted = (prog != nullptr);
@ -2734,17 +2734,28 @@ void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track track, Sign
if (condition == SIGNAL_STATE_GREEN) { if (condition == SIGNAL_STATE_GREEN) {
aspect = 1; aspect = 1;
if (_extra_aspects > 0) { if (_extra_aspects > 0) {
if (IsPlainRailTile(tile)) { switch (context) {
aspect = GetSignalAspect(tile, track); case CSSC_TRACK:
} else if (IsTunnelBridgeWithSignalSimulation(tile)) { aspect = GetSignalAspect(tile, track);
aspect = exit_signal? GetTunnelBridgeExitSignalAspect(tile) : GetTunnelBridgeEntranceSignalAspect(tile); break;
case CSSC_TUNNEL_BRIDGE_ENTRANCE:
aspect = GetTunnelBridgeEntranceSignalAspect(tile);
break;
case CSSC_TUNNEL_BRIDGE_EXIT:
aspect = GetTunnelBridgeExitSignalAspect(tile);
break;
default:
break;
} }
} }
} else { } else {
aspect = 0; 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; SpriteID sprite = result.sprite.sprite;
PaletteID pal = PAL_NONE; PaletteID pal = PAL_NONE;
bool is_custom_sprite = (sprite != 0); 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); SignalVariant variant = GetSignalVariant(tile, track);
const TraceRestrictProgram *prog = IsRestrictedSignal(tile) ? GetExistingTraceRestrictProgram(tile, track) : nullptr; 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 <typename F> template <typename F>

@ -1759,7 +1759,7 @@ static void DrawTunnelBridgeRampSingleSignal(const TileInfo *ti, bool is_green,
} }
bool show_restricted = IsTunnelBridgeRestrictedSignal(ti->tile); bool show_restricted = IsTunnelBridgeRestrictedSignal(ti->tile);
const TraceRestrictProgram *prog = show_restricted ? GetExistingTraceRestrictProgram(ti->tile, FindFirstTrack(GetAcrossTunnelBridgeTrackBits(ti->tile))) : nullptr; 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; PalSpriteID sprite = result.sprite;
bool is_custom_sprite = (sprite.sprite != 0); 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)); 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) { if (sprite.sprite != 0) {
sprite.sprite += position; sprite.sprite += position;
@ -2143,7 +2143,7 @@ static void DrawTile_TunnelBridge(TileInfo *ti, DrawTileProcParams params)
if (IsTunnelBridgeWithSignalSimulation(ti->tile)) { if (IsTunnelBridgeWithSignalSimulation(ti->tile)) {
extern void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track track, SignalState condition, 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); DiagDirection dir = GetTunnelBridgeDirection(ti->tile);
SignalVariant variant = IsTunnelBridgeSemaphore(ti->tile) ? SIG_SEMAPHORE : SIG_ELECTRIC; 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; const TraceRestrictProgram *prog = IsTunnelBridgeRestrictedSignal(ti->tile) ? GetExistingTraceRestrictProgram(ti->tile, t) : nullptr;
if (IsTunnelBridgeSignalSimulationEntrance(ti->tile)) { 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)) { if (IsTunnelBridgeSignalSimulationExit(ti->tile)) {
SignalType type = SIGTYPE_NORMAL; SignalType type = SIGTYPE_NORMAL;
if (IsTunnelBridgePBS(ti->tile)) { if (IsTunnelBridgePBS(ti->tile)) {
type = IsTunnelBridgeSignalSimulationEntrance(ti->tile) ? SIGTYPE_PBS : SIGTYPE_PBS_ONEWAY; 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) { switch (t) {

Loading…
Cancel
Save