diff --git a/src/newgrf_newsignals.cpp b/src/newgrf_newsignals.cpp index dd37a112c5..1e8865b550 100644 --- a/src/newgrf_newsignals.cpp +++ b/src/newgrf_newsignals.cpp @@ -89,7 +89,7 @@ NewSignalsResolverObject::NewSignalsResolverObject(const GRFFile *grffile, TileI uint GetNewSignalsRestrictedSignalsInfo(const TraceRestrictProgram *prog, TileIndex tile, uint8 signal_style) { uint result = 0; - if (signal_style != 0 && HasBit(_always_reserve_through_style_mask, signal_style)) result |= 2; + if (signal_style != 0 && HasBit(_signal_style_masks.always_reserve_through, signal_style)) result |= 2; if (prog != nullptr) { result |= 1; if ((prog->actions_used_flags & TRPAUF_RESERVE_THROUGH_ALWAYS) && !IsTileType(tile, MP_TUNNELBRIDGE)) result |= 2; diff --git a/src/pbs.cpp b/src/pbs.cpp index 078ea30016..3f66f3ab30 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -661,10 +661,10 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra if (signal_speed == 0 || (speed_restriction != 0 && speed_restriction < signal_speed)) signal_speed = speed_restriction; uint8 signal_style = GetSignalStyle(tile, TrackdirToTrack(trackdir)); uint16 signal_flags = signal_style << 8; - if (HasBit(_non_aspect_inc_style_mask, signal_style)) { + if (HasBit(_signal_style_masks.non_aspect_inc, signal_style)) { SetBit(signal_flags, TRSLAI_NO_ASPECT_INC); } - if (HasBit(_next_only_style_mask, signal_style)) { + if (HasBit(_signal_style_masks.next_only, signal_style)) { SetBit(signal_flags, TRSLAI_NEXT_ONLY); } lookahead->AddSignal(signal_speed, 0, z, signal_flags); diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index c3a89444e5..68f6890729 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1531,7 +1531,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, if (convert_signal) return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS); if (!(p2_signal_in && p2_signal_out)) { cost = CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_SIGNALS] * ((GetTunnelBridgeLength(tile, tile_exit) + 4) >> 2) * (bidirectional ? 2 : 1)); // minimal 1 - if (HasBit(_no_tunnel_bridge_style_mask, signal_style)) return_cmd_error(STR_ERROR_UNSUITABLE_SIGNAL_TYPE); + if (HasBit(_signal_style_masks.no_tunnel_bridge, signal_style)) return_cmd_error(STR_ERROR_UNSUITABLE_SIGNAL_TYPE); if (!is_style_usable(sigvar, signal_style, bidirectional ? 0x11 : (is_pbs ? 0x21 : 0x1))) return_cmd_error(STR_ERROR_UNSUITABLE_SIGNAL_TYPE); } } else { @@ -1550,7 +1550,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, will_be_style = signal_style; will_be_pbs = is_pbs; will_be_semaphore = (sigvar == SIG_SEMAPHORE); - if (HasBit(_no_tunnel_bridge_style_mask, signal_style)) return_cmd_error(STR_ERROR_UNSUITABLE_SIGNAL_TYPE); + if (HasBit(_signal_style_masks.no_tunnel_bridge, signal_style)) return_cmd_error(STR_ERROR_UNSUITABLE_SIGNAL_TYPE); } else if (ctrl_pressed) { will_be_bidi = false; will_be_pbs = !will_be_pbs; @@ -2815,7 +2815,7 @@ void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track track, Sign } uint x, y; - GetSignalXY(tile, pos, HasBit(_signal_opposite_side_style_mask, style), x, y); + GetSignalXY(tile, pos, HasBit(_signal_style_masks.signal_opposite_side, style), x, y); uint8 aspect; if (condition == SIGNAL_STATE_GREEN) { @@ -2967,8 +2967,8 @@ void MarkSingleSignalDirty(TileIndex tile, Trackdir td) return; } bool opposite = false; - if (_signal_opposite_side_style_mask != 0) { - opposite = HasBit(_signal_opposite_side_style_mask, GetSignalStyleGeneric(tile, TrackdirToTrack(td))); + if (_signal_style_masks.signal_opposite_side != 0) { + opposite = HasBit(_signal_style_masks.signal_opposite_side, GetSignalStyleGeneric(tile, TrackdirToTrack(td))); } MarkSingleSignalDirtyIntl(tile, td, opposite, [td](uint x, uint y) -> uint { return GetSaveSlopeZ(x, y, TrackdirToTrack(td)); diff --git a/src/signal.cpp b/src/signal.cpp index 33f55b7797..43bfebda73 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -30,11 +30,7 @@ uint8 _extra_aspects = 0; uint64 _aspect_cfg_hash = 0; -uint16 _non_aspect_inc_style_mask = 0; -uint16 _next_only_style_mask = 0; -uint16 _always_reserve_through_style_mask = 0; -uint16 _no_tunnel_bridge_style_mask = 0; -uint16 _signal_opposite_side_style_mask = 0; +SignalStyleMasks _signal_style_masks = {}; bool _signal_sprite_oversized = false; /// List of signals dependent upon this one @@ -1267,7 +1263,7 @@ uint8 GetSignalAspectGeneric(TileIndex tile, Trackdir trackdir, bool check_non_i void AdjustSignalAspectIfNonIncStyleIntl(TileIndex tile, Track track, uint8 &aspect) { - if (IsTileType(tile, MP_RAILWAY) && HasBit(_non_aspect_inc_style_mask, GetSignalStyle(tile, track))) aspect--; + if (IsTileType(tile, MP_RAILWAY) && HasBit(_signal_style_masks.non_aspect_inc, GetSignalStyle(tile, track))) aspect--; } static void RefreshBridgeOnExitAspectChange(TileIndex entrance, TileIndex exit) @@ -1512,11 +1508,7 @@ static bool DetermineExtraAspectsVariable() bool changed = false; uint8 new_extra_aspects = 0; - _non_aspect_inc_style_mask = 0; - _next_only_style_mask = 0; - _no_tunnel_bridge_style_mask = 0; - _always_reserve_through_style_mask = 0; - _signal_opposite_side_style_mask = 0; + _signal_style_masks = {}; if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC) { for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) { @@ -1528,23 +1520,23 @@ static bool DetermineExtraAspectsVariable() } for (uint i = 0; i < _num_new_signal_styles; i++) { if (HasBit(_new_signal_styles[i].style_flags, NSSF_NO_ASPECT_INC)) { - SetBit(_non_aspect_inc_style_mask, i + 1); - SetBit(_no_tunnel_bridge_style_mask, i + 1); + SetBit(_signal_style_masks.non_aspect_inc, i + 1); + SetBit(_signal_style_masks.no_tunnel_bridge, i + 1); } if (HasBit(_new_signal_styles[i].style_flags, NSSF_ALWAYS_RESERVE_THROUGH)) { - SetBit(_always_reserve_through_style_mask, i + 1); - SetBit(_no_tunnel_bridge_style_mask, i + 1); + SetBit(_signal_style_masks.always_reserve_through, i + 1); + SetBit(_signal_style_masks.no_tunnel_bridge, i + 1); } if (HasBit(_new_signal_styles[i].style_flags, NSSF_LOOKAHEAD_SINGLE_SIGNAL)) { _new_signal_styles[i].lookahead_extra_aspects = 0; - SetBit(_next_only_style_mask, i + 1); + SetBit(_signal_style_masks.next_only, i + 1); } else if (HasBit(_new_signal_styles[i].style_flags, NSSF_LOOKAHEAD_ASPECTS_SET)) { _new_signal_styles[i].lookahead_extra_aspects = std::min(_new_signal_styles[i].lookahead_extra_aspects, _new_signal_styles[i].grffile->new_signal_extra_aspects); } else { _new_signal_styles[i].lookahead_extra_aspects = _new_signal_styles[i].grffile->new_signal_extra_aspects; } if (HasBit(_new_signal_styles[i].style_flags, NSSF_OPPOSITE_SIDE)) { - SetBit(_signal_opposite_side_style_mask, i + 1); + SetBit(_signal_style_masks.signal_opposite_side, i + 1); } } for (uint i = _num_new_signal_styles; i < MAX_NEW_SIGNAL_STYLES; i++) { @@ -1556,8 +1548,8 @@ static bool DetermineExtraAspectsVariable() SimpleChecksum64 checksum; checksum.Update(SimpleHash32(_extra_aspects)); - checksum.Update(SimpleHash32(_non_aspect_inc_style_mask)); - checksum.Update(SimpleHash32(_always_reserve_through_style_mask)); + checksum.Update(SimpleHash32(_signal_style_masks.non_aspect_inc)); + checksum.Update(SimpleHash32(_signal_style_masks.always_reserve_through)); if (checksum.state != _aspect_cfg_hash) { _aspect_cfg_hash = checksum.state; @@ -1587,8 +1579,8 @@ void InitialiseExtraAspectsVariable() void UpdateSignalReserveThroughBit(TileIndex tile, Track track, bool update_signal) { bool reserve_through = false; - if (NonZeroSignalStylePossiblyOnTile(tile) && _always_reserve_through_style_mask != 0 && - HasBit(_always_reserve_through_style_mask, GetSignalStyle(tile, track))) { + if (NonZeroSignalStylePossiblyOnTile(tile) && _signal_style_masks.always_reserve_through != 0 && + HasBit(_signal_style_masks.always_reserve_through, GetSignalStyle(tile, track))) { reserve_through = true; } else { if (IsRestrictedSignal(tile)) { diff --git a/src/signal_func.h b/src/signal_func.h index 5cb7e6846f..e70cadea19 100644 --- a/src/signal_func.h +++ b/src/signal_func.h @@ -21,11 +21,16 @@ extern uint8 _extra_aspects; extern uint64 _aspect_cfg_hash; -extern uint16 _non_aspect_inc_style_mask; -extern uint16 _next_only_style_mask; -extern uint16 _always_reserve_through_style_mask; -extern uint16 _no_tunnel_bridge_style_mask; -extern uint16 _signal_opposite_side_style_mask; + +struct SignalStyleMasks { + uint16 non_aspect_inc = 0; + uint16 next_only = 0; + uint16 always_reserve_through = 0; + uint16 no_tunnel_bridge = 0; + uint16 signal_opposite_side = 0; +}; +extern SignalStyleMasks _signal_style_masks; + extern bool _signal_sprite_oversized; /** @@ -187,7 +192,7 @@ void InitialiseExtraAspectsVariable(); inline void AdjustSignalAspectIfNonIncStyle(TileIndex tile, Track track, uint8 &aspect) { extern void AdjustSignalAspectIfNonIncStyleIntl(TileIndex tile, Track track, uint8 &aspect); - if (aspect > 0 && _non_aspect_inc_style_mask != 0) AdjustSignalAspectIfNonIncStyleIntl(tile, track, aspect); + if (aspect > 0 && _signal_style_masks.non_aspect_inc != 0) AdjustSignalAspectIfNonIncStyleIntl(tile, track, aspect); } inline uint8 GetForwardAspectFollowingTrackAndIncrement(TileIndex tile, Trackdir trackdir) diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 2eecbb7ed2..75095f60b8 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1733,7 +1733,7 @@ static void DrawTunnelBridgeRampSingleSignal(const TileInfo *ti, bool is_green, DiagDirection dir = GetTunnelBridgeDirection(ti->tile); uint8 style = GetTunnelBridgeSignalStyle(ti->tile); - side ^= HasBit(_signal_opposite_side_style_mask, style); + side ^= HasBit(_signal_style_masks.signal_opposite_side, style); static const Point SignalPositions[2][4] = { { /* X X Y Y Signals on the left side */ @@ -1870,7 +1870,7 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st uint8 style = GetBridgeSignalStyle(bridge_start_tile); uint position, x, y; - GetBridgeSignalXY(ti->tile, GetTunnelBridgeDirection(bridge_start_tile), HasBit(_signal_opposite_side_style_mask, style), position, x, y); + GetBridgeSignalXY(ti->tile, GetTunnelBridgeDirection(bridge_start_tile), HasBit(_signal_style_masks.signal_opposite_side, style), position, x, y); SignalVariant variant = IsTunnelBridgeSemaphore(bridge_start_tile) ? SIG_SEMAPHORE : SIG_ELECTRIC; SignalState state = GetBridgeEntranceSimulatedSignalState(bridge_start_tile, m2_position); @@ -1926,8 +1926,8 @@ void MarkSingleBridgeSignalDirty(TileIndex tile, TileIndex bridge_start_tile) } bool opposite_side = false; - if (_signal_opposite_side_style_mask != 0) { - opposite_side = HasBit(_signal_opposite_side_style_mask, GetTunnelBridgeSignalStyle(bridge_start_tile)); + if (_signal_style_masks.signal_opposite_side != 0) { + opposite_side = HasBit(_signal_style_masks.signal_opposite_side, GetTunnelBridgeSignalStyle(bridge_start_tile)); } uint position, x, y; @@ -1950,8 +1950,8 @@ void MarkTunnelBridgeSignalDirty(TileIndex tile, bool exit) } bool opposite_side = false; - if (_signal_opposite_side_style_mask != 0) { - opposite_side = HasBit(_signal_opposite_side_style_mask, GetTunnelBridgeSignalStyle(tile)); + if (_signal_style_masks.signal_opposite_side != 0) { + opposite_side = HasBit(_signal_style_masks.signal_opposite_side, GetTunnelBridgeSignalStyle(tile)); } if (IsRailCustomBridgeHeadTile(tile)) {