Add NewGRF signal style flag to draw on both sides
This commit is contained in:
@@ -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 <span class="code">define_style</span> property).
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td>style_both_sides</td><td>0 or 1</td>
|
||||
<td>
|
||||
Set whether signals should be drawn on both sides of the track for the most recently defined style (defined using the <span class="code">define_style</span> property).<br />
|
||||
If set, the <span class="code">signal_context_is_second</span> variable is true when drawing the second signal.<br />
|
||||
If this and <span class="code">style_opposite_side</span> are both set, the first signal is drawn on the opposite side and the second signal is drawn on the usual side.
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td>style_realistic_braking_only</td><td>0 or 1</td>
|
||||
<td>
|
||||
Set whether signals using this style may only be built when realistic braking is enabled, for the most recently defined style (defined using the <span class="code">define_style</span> property).
|
||||
@@ -724,6 +731,11 @@ item (FEAT_GLOBALVARS) {
|
||||
The signal is being drawn on a tunnel entrance/exit (not a bridge)
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td>signal_context_is_second</td><td>0 or 1</td>
|
||||
<td>
|
||||
The second signal is being drawn (on the opposite side to the first signal), see the style_both_sides property
|
||||
</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)
|
||||
|
@@ -554,6 +554,16 @@
|
||||
The Action 0 Id field is not used, the value is ignored.
|
||||
</p>
|
||||
<p>This is indicated by the feature name: <font face="monospace">action0_signals_style</font>, version 1</p>
|
||||
<h4 id="signals_style_both_sides">Set custom signal style signal drawn on both sides (mappable property: signals_style_both_sides)</h4>
|
||||
<p>This applies to the most recent custom signal style defined using the <a href="#signals_define_style">signals_define_style</a> property.<br />
|
||||
When enabled, signals using this style are drawn on both sides of the track.<br />
|
||||
Bit 9 of <a href="#signals_signal_context">signals_signal_context</a> is set when drawing the second signal on the opposite side.</p>
|
||||
<p>If this and <a href="#signals_style_opposite_side">signals_style_opposite_side</a> are both set, the first signal is drawn on the opposite side
|
||||
and the second signal is drawn on the usual side.</p>
|
||||
<p>The property length is 1 byte. 0 is disabled (default). 1 is enabled.<br />
|
||||
The Action 0 Id field is not used, the value is ignored.
|
||||
</p>
|
||||
<p>This is indicated by the feature name: <font face="monospace">action0_signals_style</font>, version 3</p>
|
||||
<h4 id="signals_style_realistic_braking_only">Set custom signal style signal requires realistic braking (mappable property: signals_style_realistic_braking_only)</h4>
|
||||
<p>This applies to the most recent custom signal style defined using the <a href="#signals_define_style">signals_define_style</a> property.<br />
|
||||
When enabled, signals using this style may only be built when realistic braking is enabled.</p>
|
||||
@@ -929,6 +939,7 @@
|
||||
</table>
|
||||
</td></tr>
|
||||
<tr><td>8</td><td>Tunnel tile</td></tr>
|
||||
<tr><td>9</td><td>Second signal (being drawn on opposite side), see: <a href="#signals_style_both_sides">signals_style_both_sides</a></td></tr>
|
||||
</table>
|
||||
</p>
|
||||
<p>This is indicated by the feature name: <font face="monospace">varaction2_signals_signal_context</font>, version 1</p>
|
||||
|
@@ -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<uint32_t, const GRFFile *> grfs;
|
||||
@@ -3234,7 +3235,7 @@ DEF_CONSOLE_CMD(ConDumpSignalStyles)
|
||||
grfid = style.grffile->grfid;
|
||||
grfs.insert(std::pair<uint32_t, const GRFFile *>(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)
|
||||
);
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
@@ -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"),
|
||||
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
{
|
||||
|
@@ -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)
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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)) {
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user