Move signal style mask variables into a single struct
This commit is contained in:
@@ -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)) {
|
||||
|
Reference in New Issue
Block a user