Codechange: make SignalState a scoped enum

This commit is contained in:
Peter Nelson
2026-06-06 16:46:07 +01:00
committed by Peter Nelson
parent 231d946624
commit 14be71cb5f
10 changed files with 39 additions and 39 deletions
+1 -1
View File
@@ -133,7 +133,7 @@ SpriteID GetCustomSignalSprite(const RailTypeInfo *rti, TileIndex tile, SignalTy
if (rti->group[RailSpriteType::Signals] == nullptr) return 0;
uint32_t param1 = gui ? 0x10 : 0x00;
uint32_t param2 = (to_underlying(type) << 16) | (to_underlying(var) << 8) | state;
uint32_t param2 = (to_underlying(type) << 16) | (to_underlying(var) << 8) | to_underlying(state);
RailTypeResolverObject object(rti, tile, TCX_NORMAL, RailSpriteType::Signals, param1, param2);
const auto *group = object.Resolve<ResultSpriteGroup>();
+2 -2
View File
@@ -214,7 +214,7 @@ public:
/* cache the look-ahead polynomial constant only if we didn't pass more signals than the look-ahead limit is */
int look_ahead_cost = (n.num_signals_passed < this->sig_look_ahead_costs.size()) ? this->sig_look_ahead_costs[n.num_signals_passed] : 0;
if (sig_state != SIGNAL_STATE_RED) {
if (sig_state != SignalState::Red) {
/* green signal */
n.flags_u.flags_s.last_signal_was_red = false;
/* negative look-ahead red-signal penalties would cause problems later, so use them as positive penalties for green signal */
@@ -376,7 +376,7 @@ public:
if (segment.last_signal_tile != INVALID_TILE) {
assert(HasSignalOnTrackdir(segment.last_signal_tile, segment.last_signal_td));
SignalState sig_state = GetSignalStateByTrackdir(segment.last_signal_tile, segment.last_signal_td);
bool is_red = (sig_state == SIGNAL_STATE_RED);
bool is_red = (sig_state == SignalState::Red);
n.flags_u.flags_s.last_signal_was_red = is_red;
if (is_red) {
n.last_red_signal_type = GetSignalType(segment.last_signal_tile, TrackdirToTrack(segment.last_signal_td));
+3 -3
View File
@@ -115,9 +115,9 @@ private:
}
/* Green path signal opposing the path? Turn to red. */
if (HasPbsSignalOnTrackdir(tile, rev_td) && GetSignalStateByTrackdir(tile, rev_td) == SIGNAL_STATE_GREEN) {
if (HasPbsSignalOnTrackdir(tile, rev_td) && GetSignalStateByTrackdir(tile, rev_td) == SignalState::Green) {
this->signals_set_to_red.emplace_back(tile, rev_td);
SetSignalStateByTrackdir(tile, rev_td, SIGNAL_STATE_RED);
SetSignalStateByTrackdir(tile, rev_td, SignalState::Red);
MarkTileDirtyByTile(tile);
}
@@ -217,7 +217,7 @@ public:
/* Re-instate green path signals we turned to red. */
for (auto [sig_tile, td] : this->signals_set_to_red) {
SetSignalStateByTrackdir(sig_tile, td, SIGNAL_STATE_GREEN);
SetSignalStateByTrackdir(sig_tile, td, SignalState::Green);
}
return false;
+1 -1
View File
@@ -147,7 +147,7 @@ public:
SpriteID build_depot; ///< button for building depots
SpriteID build_tunnel; ///< button for building a tunnel
SpriteID convert_rail; ///< button for converting rail
EnumIndexArray<EnumIndexArray<EnumIndexArray<SpriteID, SignalState, SIGNAL_STATE_END>, SignalVariant, SignalVariant::End>, SignalType, SignalType::End> signals; ///< signal GUI sprites (type, variant, state)
EnumIndexArray<EnumIndexArray<EnumIndexArray<SpriteID, SignalState, SignalState::End>, SignalVariant, SignalVariant::End>, SignalType, SignalType::End> signals; ///< signal GUI sprites (type, variant, state)
} gui_sprites;
struct {
+5 -5
View File
@@ -105,10 +105,10 @@ void ResolveRailTypeGUISprites(RailTypeInfo *rti)
for (SignalType type = SignalType::Block; type < SignalType::End; type = static_cast<SignalType>(to_underlying(type) + 1)) {
for (SignalVariant var : {SignalVariant::Electric, SignalVariant::Semaphore}) {
SpriteID red = GetCustomSignalSprite(rti, INVALID_TILE, type, var, SIGNAL_STATE_RED, true);
SpriteID green = GetCustomSignalSprite(rti, INVALID_TILE, type, var, SIGNAL_STATE_GREEN, true);
rti->gui_sprites.signals[type][var][SIGNAL_STATE_RED] = (red != 0) ? red + SIGNAL_TO_SOUTH : _signal_lookup[var][type];
rti->gui_sprites.signals[type][var][SIGNAL_STATE_GREEN] = (green != 0) ? green + SIGNAL_TO_SOUTH : _signal_lookup[var][type] + 1;
SpriteID red = GetCustomSignalSprite(rti, INVALID_TILE, type, var, SignalState::Red, true);
SpriteID green = GetCustomSignalSprite(rti, INVALID_TILE, type, var, SignalState::Green, true);
rti->gui_sprites.signals[type][var][SignalState::Red] = (red != 0) ? red + SIGNAL_TO_SOUTH : _signal_lookup[var][type];
rti->gui_sprites.signals[type][var][SignalState::Green] = (green != 0) ? green + SIGNAL_TO_SOUTH : _signal_lookup[var][type] + 1;
}
}
}
@@ -1905,7 +1905,7 @@ static void DrawSingleSignal(TileIndex tile, const RailTypeInfo *rti, Track trac
} else {
/* Normal electric signals are stored in a different sprite block than all other signals. */
sprite = (type == SignalType::Block && variant == SignalVariant::Electric) ? SPR_ORIGINAL_SIGNALS_BASE : SPR_SIGNALS_BASE - 16;
sprite += to_underlying(type) * 16 + to_underlying(variant) * 64 + image * 2 + condition + (type >= SignalType::Path ? 64 : 0);
sprite += to_underlying(type) * 16 + to_underlying(variant) * 64 + image * 2 + to_underlying(condition) + (type >= SignalType::Path ? 64 : 0);
}
AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, GetSafeSlopeZ(x, y, track), {{}, {1, 1, BB_HEIGHT_UNDER_BRIDGE}, {}});
+1 -1
View File
@@ -1556,7 +1556,7 @@ public:
const RailTypeInfo *rti = GetRailTypeInfo(_cur_railtype);
for (SignalType type = SignalType::Block; type < SignalType::End; type = static_cast<SignalType>(to_underlying(type) + 1)) {
for (SignalVariant variant : {SignalVariant::Electric, SignalVariant::Semaphore}) {
for (SignalState state : {SIGNAL_STATE_RED, SIGNAL_STATE_GREEN}) {
for (SignalState state : {SignalState::Red, SignalState::Green}) {
Point offset;
Dimension sprite_size = GetSpriteSize(rti->gui_sprites.signals[type][variant][state], &offset);
this->sig_sprite_bottom_offset = std::max<int>(this->sig_sprite_bottom_offset, sprite_size.height);
+3 -3
View File
@@ -431,7 +431,7 @@ inline uint GetSignalStates(Tile tile)
*/
inline SignalState GetSingleSignalState(Tile t, uint8_t signalbit)
{
return (SignalState)HasBit(GetSignalStates(t), signalbit);
return static_cast<SignalState>(HasBit(GetSignalStates(t), signalbit));
}
/**
@@ -508,7 +508,7 @@ inline SignalState GetSignalStateByTrackdir(Tile tile, Trackdir trackdir)
assert(IsValidTrackdir(trackdir));
assert(HasSignalOnTrack(tile, TrackdirToTrack(trackdir)));
return GetSignalStates(tile) & SignalAlongTrackdir(trackdir) ?
SIGNAL_STATE_GREEN : SIGNAL_STATE_RED;
SignalState::Green : SignalState::Red;
}
/**
@@ -519,7 +519,7 @@ inline SignalState GetSignalStateByTrackdir(Tile tile, Trackdir trackdir)
*/
inline void SetSignalStateByTrackdir(Tile tile, Trackdir trackdir, SignalState state)
{
if (state == SIGNAL_STATE_GREEN) { // set 1
if (state == SignalState::Green) { // set 1
SetSignalStates(tile, GetSignalStates(tile) | SignalAlongTrackdir(trackdir));
} else {
SetSignalStates(tile, GetSignalStates(tile) & ~SignalAlongTrackdir(trackdir));
+7 -7
View File
@@ -338,7 +338,7 @@ static SigFlags ExploreSegment(Owner owner)
if (!flags.Test(SigFlag::MultiGreen) && IsPresignalExit(tile, track) && HasSignalOnTrackdir(tile, trackdir)) { // found presignal exit
if (flags.Test(SigFlag::Exit)) flags.Set(SigFlag::MultiExit); // found two (or more) exits
flags.Set(SigFlag::Exit); // found at least one exit - allow for compiler optimizations
if (GetSignalStateByTrackdir(tile, trackdir) == SIGNAL_STATE_GREEN) { // found green presignal exit
if (GetSignalStateByTrackdir(tile, trackdir) == SignalState::Green) { // found green presignal exit
if (flags.Test(SigFlag::Green)) flags.Set(SigFlag::MultiGreen);
flags.Set(SigFlag::Green);
}
@@ -424,7 +424,7 @@ static void UpdateSignalsAroundSegment(SigFlags flags)
Track track = TrackdirToTrack(trackdir);
SignalType sig = GetSignalType(tile, track);
SignalState newstate = SIGNAL_STATE_GREEN;
SignalState newstate = SignalState::Green;
/* Signal state of reserved path signals is handled by the reserve/unreserve process. */
if (IsPbsSignal(sig) && (GetRailReservationTrackBits(tile) & TrackToTrackBits(track)) != TRACK_BIT_NONE) continue;
@@ -432,10 +432,10 @@ static void UpdateSignalsAroundSegment(SigFlags flags)
/* determine whether the new state is red */
if (flags.Test(SigFlag::Train)) {
/* train in the segment */
newstate = SIGNAL_STATE_RED;
newstate = SignalState::Red;
} else if (IsPbsSignal(sig) && flags.Any({SigFlag::Split, SigFlag::MultiEnter})) {
/* Turn path signals red if the segment has a junction or more than one way in. */
newstate = SIGNAL_STATE_RED;
newstate = SignalState::Red;
} else {
/* is it a bidir combo? - then do not count its other signal direction as exit */
if (sig == SignalType::Combo && HasSignalOnTrackdir(tile, ReverseTrackdir(trackdir))) {
@@ -444,11 +444,11 @@ static void UpdateSignalsAroundSegment(SigFlags flags)
/* no green exit */
(!flags.Test(SigFlag::Green) ||
/* only one green exit, and it is this one - so all other exits are red */
(!flags.Test(SigFlag::MultiGreen) && GetSignalStateByTrackdir(tile, ReverseTrackdir(trackdir)) == SIGNAL_STATE_GREEN))) {
newstate = SIGNAL_STATE_RED;
(!flags.Test(SigFlag::MultiGreen) && GetSignalStateByTrackdir(tile, ReverseTrackdir(trackdir)) == SignalState::Green))) {
newstate = SignalState::Red;
}
} else { // entry, at least one exit, no green exit
if (IsPresignalEntry(tile, TrackdirToTrack(trackdir)) && flags.Test(SigFlag::Exit) && !flags.Test(SigFlag::Green)) newstate = SIGNAL_STATE_RED;
if (IsPresignalEntry(tile, TrackdirToTrack(trackdir)) && flags.Test(SigFlag::Exit) && !flags.Test(SigFlag::Green)) newstate = SignalState::Red;
}
}
+5 -5
View File
@@ -30,17 +30,17 @@ enum class SignalType : uint8_t {
PathOneWay = 5, ///< no-entry path signal.
End, ///< End marker.
};
DECLARE_ENUM_AS_ADDABLE(SignalType)
/**
* These are states in which a signal can be. Currently these are only two, so
* simple boolean logic will do. But do try to compare to this enum instead of
* normal boolean evaluation, since that will make future additions easier.
*/
enum SignalState : uint8_t {
SIGNAL_STATE_RED = 0, ///< The signal is red
SIGNAL_STATE_GREEN = 1, ///< The signal is green
SIGNAL_STATE_END, ///< End marker.
enum class SignalState : uint8_t {
Red = 0, ///< The signal is red
Green = 1, ///< The signal is green
End, ///< End marker.
};
#endif /* SIGNAL_TYPE_H */
+11 -11
View File
@@ -2318,7 +2318,7 @@ static void CheckNextTrainTile(Train *consist)
Trackdir td = moving_front->GetVehicleTrackdir();
/* On a tile with a red non-pbs signal, don't look ahead. */
if (HasBlockSignalOnTrackdir(moving_front->tile, td) && GetSignalStateByTrackdir(moving_front->tile, td) == SIGNAL_STATE_RED) return;
if (HasBlockSignalOnTrackdir(moving_front->tile, td) && GetSignalStateByTrackdir(moving_front->tile, td) == SignalState::Red) return;
CFollowTrackRail ft(consist);
if (!ft.Follow(moving_front->tile, td)) return;
@@ -2502,12 +2502,12 @@ void FreeTrainTrackReservation(const Train *consist)
break;
}
if (HasPbsSignalOnTrackdir(tile, td)) {
if (GetSignalStateByTrackdir(tile, td) == SIGNAL_STATE_RED) {
if (GetSignalStateByTrackdir(tile, td) == SignalState::Red) {
/* Red PBS signal? Can't be our reservation, would be green then. */
break;
} else {
/* Turn the signal back to red. */
SetSignalStateByTrackdir(tile, td, SIGNAL_STATE_RED);
SetSignalStateByTrackdir(tile, td, SignalState::Red);
MarkTileDirtyByTile(tile);
}
} else if (HasPbsSignalOnTrackdir(tile, ReverseTrackdir(td))) {
@@ -2604,9 +2604,9 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, TrackBits *new_tracks,
bool wp_free = IsWaitingPositionFree(v, tile, cur_td, _settings_game.pf.forbid_90_deg);
if (!(wp_free && TryReserveRailTrack(tile, TrackdirToTrack(cur_td)))) break;
/* Green path signal opposing the path? Turn to red. */
if (HasPbsSignalOnTrackdir(tile, rev_td) && GetSignalStateByTrackdir(tile, rev_td) == SIGNAL_STATE_GREEN) {
if (HasPbsSignalOnTrackdir(tile, rev_td) && GetSignalStateByTrackdir(tile, rev_td) == SignalState::Green) {
signals_set_to_red.emplace_back(tile, rev_td);
SetSignalStateByTrackdir(tile, rev_td, SIGNAL_STATE_RED);
SetSignalStateByTrackdir(tile, rev_td, SignalState::Red);
MarkTileDirtyByTile(tile);
}
/* Safe position is all good, path valid and okay. */
@@ -2616,9 +2616,9 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, TrackBits *new_tracks,
if (!TryReserveRailTrack(tile, TrackdirToTrack(cur_td))) break;
/* Green path signal opposing the path? Turn to red. */
if (HasPbsSignalOnTrackdir(tile, rev_td) && GetSignalStateByTrackdir(tile, rev_td) == SIGNAL_STATE_GREEN) {
if (HasPbsSignalOnTrackdir(tile, rev_td) && GetSignalStateByTrackdir(tile, rev_td) == SignalState::Green) {
signals_set_to_red.emplace_back(tile, rev_td);
SetSignalStateByTrackdir(tile, rev_td, SIGNAL_STATE_RED);
SetSignalStateByTrackdir(tile, rev_td, SignalState::Red);
MarkTileDirtyByTile(tile);
}
}
@@ -2650,7 +2650,7 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, TrackBits *new_tracks,
/* Re-instate green signals we turned to red. */
for (auto [sig_tile, td] : signals_set_to_red) {
SetSignalStateByTrackdir(sig_tile, td, SIGNAL_STATE_GREEN);
SetSignalStateByTrackdir(sig_tile, td, SignalState::Green);
}
/* Path invalid. */
@@ -2791,7 +2791,7 @@ static Track ChooseTrainTrack(Train *consist, TileIndex tile, DiagDirection ente
if (IsValidTrack(track) && HasPbsSignalOnTrackdir(tile, TrackEnterdirToTrackdir(track, enterdir))) {
do_track_reservation = true;
changed_signal = true;
SetSignalStateByTrackdir(tile, TrackEnterdirToTrackdir(track, enterdir), SIGNAL_STATE_GREEN);
SetSignalStateByTrackdir(tile, TrackEnterdirToTrackdir(track, enterdir), SignalState::Green);
} else if (!do_track_reservation) {
return track;
}
@@ -2807,7 +2807,7 @@ static Track ChooseTrainTrack(Train *consist, TileIndex tile, DiagDirection ente
if (res_dest.tile == INVALID_TILE) {
/* Reservation failed? */
if (mark_stuck) MarkTrainAsStuck(consist);
if (changed_signal) SetSignalStateByTrackdir(tile, TrackEnterdirToTrackdir(best_track, enterdir), SIGNAL_STATE_RED);
if (changed_signal) SetSignalStateByTrackdir(tile, TrackEnterdirToTrackdir(best_track, enterdir), SignalState::Red);
return FindFirstTrack(tracks);
}
if (res_dest.okay) {
@@ -3531,7 +3531,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
Track track = FindFirstTrack(chosen_track);
Trackdir tdir = TrackDirectionToTrackdir(track, chosen_dir);
if (v->IsMovingFront() && HasPbsSignalOnTrackdir(gp.new_tile, tdir)) {
SetSignalStateByTrackdir(gp.new_tile, tdir, SIGNAL_STATE_RED);
SetSignalStateByTrackdir(gp.new_tile, tdir, SignalState::Red);
MarkTileDirtyByTile(gp.new_tile);
}