Move signal style mask variables into a single struct

pull/403/head
Jonathan G Rennison 2 years ago
parent c1b54f1c31
commit 2f7664fc93

@ -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;

@ -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);

@ -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));

@ -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<uint8>(_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)) {

@ -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)

@ -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)) {

Loading…
Cancel
Save