Add function to get maximum signal aspect

This commit is contained in:
Jonathan G Rennison
2022-06-25 23:45:50 +01:00
parent 89f66236ff
commit fa89036a27
3 changed files with 18 additions and 13 deletions

View File

@@ -560,20 +560,20 @@ static uint8 GetSignalledTunnelBridgeEntranceForwardAspect(TileIndex tile, TileI
if (GetBridgeEntranceSimulatedSignalState(tile, i) == SIGNAL_STATE_GREEN) { if (GetBridgeEntranceSimulatedSignalState(tile, i) == SIGNAL_STATE_GREEN) {
aspect++; aspect++;
} else { } else {
return std::min<uint>(aspect, _extra_aspects + 1); return std::min<uint>(aspect, GetMaximumSignalAspect());
} }
} }
if (GetTunnelBridgeExitSignalState(tile_exit) == SIGNAL_STATE_GREEN) aspect += GetTunnelBridgeExitSignalAspect(tile_exit); if (GetTunnelBridgeExitSignalState(tile_exit) == SIGNAL_STATE_GREEN) aspect += GetTunnelBridgeExitSignalAspect(tile_exit);
return std::min<uint>(aspect, _extra_aspects + 1); return std::min<uint>(aspect, GetMaximumSignalAspect());
} else { } else {
int free_tiles = GetAvailableFreeTilesInSignalledTunnelBridge(tile, tile_exit, tile); int free_tiles = GetAvailableFreeTilesInSignalledTunnelBridge(tile, tile_exit, tile);
if (free_tiles == INT_MAX) { if (free_tiles == INT_MAX) {
uint aspect = signal_count; uint aspect = signal_count;
if (GetTunnelBridgeExitSignalState(tile_exit) == SIGNAL_STATE_GREEN) aspect += GetTunnelBridgeExitSignalAspect(tile_exit); if (GetTunnelBridgeExitSignalState(tile_exit) == SIGNAL_STATE_GREEN) aspect += GetTunnelBridgeExitSignalAspect(tile_exit);
return std::min<uint>(aspect, _extra_aspects + 1); return std::min<uint>(aspect, GetMaximumSignalAspect());
} else { } else {
if (free_tiles < (int)spacing) return 0; if (free_tiles < (int)spacing) return 0;
return std::min<uint>((free_tiles / spacing) - 1, _extra_aspects + 1); return std::min<uint>((free_tiles / spacing) - 1, GetMaximumSignalAspect());
} }
} }
} }
@@ -710,7 +710,7 @@ static uint8 GetForwardAspect(const SigInfo &info, TileIndex tile, Trackdir trac
static uint8 GetForwardAspectAndIncrement(const SigInfo &info, TileIndex tile, Trackdir trackdir) static uint8 GetForwardAspectAndIncrement(const SigInfo &info, TileIndex tile, Trackdir trackdir)
{ {
return std::min<uint8>(GetForwardAspect(info, tile, trackdir) + 1, _extra_aspects + 1); return std::min<uint8>(GetForwardAspect(info, tile, trackdir) + 1, GetMaximumSignalAspect());
} }
/** /**
@@ -838,7 +838,7 @@ static void UpdateSignalsAroundSegment(SigInfo info)
if (newstate == SIGNAL_STATE_GREEN) { if (newstate == SIGNAL_STATE_GREEN) {
aspect = 1; aspect = 1;
if (info.out_signal_tile != INVALID_TILE) { if (info.out_signal_tile != INVALID_TILE) {
aspect = std::min<uint8>(GetSignalAspectGeneric(info.out_signal_tile, info.out_signal_trackdir, true) + 1, _extra_aspects + 1); aspect = std::min<uint8>(GetSignalAspectGeneric(info.out_signal_tile, info.out_signal_trackdir, true) + 1, GetMaximumSignalAspect());
} }
} else { } else {
aspect = 0; aspect = 0;
@@ -1286,7 +1286,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect)
{ {
AdjustSignalAspectIfNonIncStyle(tile, TrackdirToTrack(trackdir), aspect); AdjustSignalAspectIfNonIncStyle(tile, TrackdirToTrack(trackdir), aspect);
aspect = std::min<uint8>(aspect + 1, _extra_aspects + 1); aspect = std::min<uint8>(aspect + 1, GetMaximumSignalAspect());
Owner owner = GetTileOwner(tile); Owner owner = GetTileOwner(tile);
DiagDirection exitdir = TrackdirToExitdir(ReverseTrackdir(trackdir)); DiagDirection exitdir = TrackdirToExitdir(ReverseTrackdir(trackdir));
DiagDirection enterdir = ReverseDiagDir(exitdir); DiagDirection enterdir = ReverseDiagDir(exitdir);
@@ -1294,7 +1294,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect)
if (IsTileType(tile, MP_TUNNELBRIDGE) && TrackdirExitsTunnelBridge(tile, trackdir)) { if (IsTileType(tile, MP_TUNNELBRIDGE) && TrackdirExitsTunnelBridge(tile, trackdir)) {
TileIndex other = GetOtherTunnelBridgeEnd(tile); TileIndex other = GetOtherTunnelBridgeEnd(tile);
if (IsBridge(tile)) RefreshBridgeOnExitAspectChange(other, tile); if (IsBridge(tile)) RefreshBridgeOnExitAspectChange(other, tile);
aspect = std::min<uint>(GetSignalledTunnelBridgeEntranceForwardAspect(other, tile) + 1, _extra_aspects + 1); aspect = std::min<uint>(GetSignalledTunnelBridgeEntranceForwardAspect(other, tile) + 1, GetMaximumSignalAspect());
tile = other; tile = other;
wormhole = true; wormhole = true;
} else { } else {
@@ -1334,7 +1334,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect)
SetSignalAspect(tile, track, aspect); SetSignalAspect(tile, track, aspect);
MarkSingleSignalDirty(tile, reversedir); MarkSingleSignalDirty(tile, reversedir);
AdjustSignalAspectIfNonIncStyle(tile, TrackdirToTrack(trackdir), aspect); AdjustSignalAspectIfNonIncStyle(tile, TrackdirToTrack(trackdir), aspect);
aspect = std::min<uint8>(aspect + 1, _extra_aspects + 1); aspect = std::min<uint8>(aspect + 1, GetMaximumSignalAspect());
} else if (IsOnewaySignal(tile, track)) { } else if (IsOnewaySignal(tile, track)) {
return; // one-way signal facing the wrong way return; // one-way signal facing the wrong way
} }
@@ -1394,7 +1394,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect)
SetTunnelBridgeExitSignalAspect(tile, aspect); SetTunnelBridgeExitSignalAspect(tile, aspect);
MarkTunnelBridgeSignalDirty(tile, true); MarkTunnelBridgeSignalDirty(tile, true);
if (IsBridge(tile)) RefreshBridgeOnExitAspectChange(other, tile); if (IsBridge(tile)) RefreshBridgeOnExitAspectChange(other, tile);
aspect = std::min<uint>(GetSignalledTunnelBridgeEntranceForwardAspect(other, tile) + 1, _extra_aspects + 1); aspect = std::min<uint>(GetSignalledTunnelBridgeEntranceForwardAspect(other, tile) + 1, GetMaximumSignalAspect());
} }
enterdir = GetTunnelBridgeDirection(other); enterdir = GetTunnelBridgeDirection(other);
exitdir = ReverseDiagDir(enterdir); exitdir = ReverseDiagDir(enterdir);
@@ -1408,7 +1408,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect)
if (GetTunnelBridgeEntranceSignalAspect(tile) == aspect) return; if (GetTunnelBridgeEntranceSignalAspect(tile) == aspect) return;
SetTunnelBridgeEntranceSignalAspect(tile, aspect); SetTunnelBridgeEntranceSignalAspect(tile, aspect);
MarkTunnelBridgeSignalDirty(tile, false); MarkTunnelBridgeSignalDirty(tile, false);
aspect = std::min<uint>(aspect + 1, _extra_aspects + 1); aspect = std::min<uint>(aspect + 1, GetMaximumSignalAspect());
} }
} }
exitdir = TrackdirToExitdir(trackdir); exitdir = TrackdirToExitdir(trackdir);

View File

@@ -22,6 +22,11 @@
extern uint8 _extra_aspects; extern uint8 _extra_aspects;
extern uint64 _aspect_cfg_hash; extern uint64 _aspect_cfg_hash;
static inline uint8 GetMaximumSignalAspect()
{
return _extra_aspects + 1;
}
struct SignalStyleMasks { struct SignalStyleMasks {
uint16 non_aspect_inc = 0; uint16 non_aspect_inc = 0;
uint16 next_only = 0; uint16 next_only = 0;
@@ -197,7 +202,7 @@ inline void AdjustSignalAspectIfNonIncStyle(TileIndex tile, Track track, uint8 &
inline uint8 GetForwardAspectFollowingTrackAndIncrement(TileIndex tile, Trackdir trackdir) inline uint8 GetForwardAspectFollowingTrackAndIncrement(TileIndex tile, Trackdir trackdir)
{ {
return std::min<uint8>(GetForwardAspectFollowingTrack(tile, trackdir) + 1, _extra_aspects + 1); return std::min<uint8>(GetForwardAspectFollowingTrack(tile, trackdir) + 1, GetMaximumSignalAspect());
} }
void UpdateSignalReserveThroughBit(TileIndex tile, Track track, bool update_signal); void UpdateSignalReserveThroughBit(TileIndex tile, Track track, bool update_signal);

View File

@@ -1888,7 +1888,7 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st
m2_position++; m2_position++;
if (GetBridgeEntranceSimulatedSignalState(bridge_start_tile, m2_position) != SIGNAL_STATE_GREEN) break; if (GetBridgeEntranceSimulatedSignalState(bridge_start_tile, m2_position) != SIGNAL_STATE_GREEN) break;
aspect++; aspect++;
if (aspect >= _extra_aspects + 1) break; if (aspect >= GetMaximumSignalAspect()) break;
} }
} }
} }