From b2b9c0a070cd253c6408779474f1fbc4e30a32c3 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 3 Oct 2015 14:15:58 +0100 Subject: [PATCH] Progsig: Fix various issues with removing program dependencies. Fix RemoveProgramDependencies using one parameter for both source and target, and rename the parameters to something sensible. Update program window when invalidating in RemoveProgramDependencies. Make SignalStateCondition::IsSignalValid const and add CheckSignalValid for non-const validaty checking. --- src/programmable_signals.cpp | 33 ++++++++++++++++++--------------- src/programmable_signals.h | 5 +++-- src/signal.cpp | 6 +++--- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/programmable_signals.cpp b/src/programmable_signals.cpp index bfa1261e86..bf7a5490a6 100644 --- a/src/programmable_signals.cpp +++ b/src/programmable_signals.cpp @@ -121,21 +121,23 @@ SignalStateCondition::SignalStateCondition(SignalReference this_sig, : SignalCondition(PSC_SIGNAL_STATE), this_sig(this_sig), sig_tile(sig_tile) , sig_track(sig_track) { - if (this->IsSignalValid()) + if (this->CheckSignalValid()) AddSignalDependency(SignalReference(this->sig_tile, TrackdirToTrack(sig_track)), this->this_sig); } -bool SignalStateCondition::IsSignalValid() +bool SignalStateCondition::IsSignalValid() const { - if (IsValidTile(this->sig_tile)) { - if (IsTileType(this->sig_tile, MP_RAILWAY) && HasSignalOnTrackdir(this->sig_tile, this->sig_track)) { - return true; - } else { - Invalidate(); - } + return IsValidTile(this->sig_tile) && IsTileType(this->sig_tile, MP_RAILWAY) && HasSignalOnTrackdir(this->sig_tile, this->sig_track); +} + +bool SignalStateCondition::CheckSignalValid() +{ + bool valid = this->IsSignalValid(); + if (!valid) { + this->Invalidate(); } - return false; + return valid; } void SignalStateCondition::Invalidate() @@ -151,7 +153,7 @@ void SignalStateCondition::SetSignal(TileIndex tile, Trackdir track) this->this_sig); this->sig_tile = tile; this->sig_track = track; - if (this->IsSignalValid()) + if (this->CheckSignalValid()) AddSignalDependency(SignalReference(this->sig_tile, TrackdirToTrack(sig_track)), this->this_sig); } @@ -165,7 +167,7 @@ void SignalStateCondition::SetSignal(TileIndex tile, Trackdir track) /*virtual*/ bool SignalStateCondition::Evaluate(SignalVM& vm) { - if (!this->IsSignalValid()) { + if (!this->CheckSignalValid()) { DEBUG(misc, 1, "Signal (%x, %d) has an invalid condition", this->this_sig.tile, this->this_sig.track); return false; } @@ -412,9 +414,9 @@ SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green return vm.state; } -void RemoveProgramDependencies(SignalReference by, SignalReference on) +void RemoveProgramDependencies(SignalReference dependency_target, SignalReference signal_to_update) { - SignalProgram *prog = GetSignalProgram(by); + SignalProgram *prog = GetSignalProgram(signal_to_update); for (SignalInstruction **b = prog->instructions.Begin(), **i = b, **e = prog->instructions.End(); i != e; i++) { SignalInstruction *insn = *i; @@ -422,13 +424,14 @@ void RemoveProgramDependencies(SignalReference by, SignalReference on) SignalIf* ifi = static_cast(insn); if (ifi->condition->ConditionCode() == PSC_SIGNAL_STATE) { SignalStateCondition* c = static_cast(ifi->condition); - if(c->sig_tile == by.tile && TrackdirToTrack(c->sig_track) == by.track) + if(c->sig_tile == dependency_target.tile && TrackdirToTrack(c->sig_track) == dependency_target.track) c->Invalidate(); } } } - AddTrackToSignalBuffer(by.tile, by.track, GetTileOwner(by.tile)); + InvalidateWindowData(WC_SIGNAL_PROGRAM, (signal_to_update.tile << 3) | signal_to_update.track); + AddTrackToSignalBuffer(signal_to_update.tile, signal_to_update.track, GetTileOwner(signal_to_update.tile)); UpdateSignalsInBuffer(); } diff --git a/src/programmable_signals.h b/src/programmable_signals.h index 29909b9918..5cf251c6ed 100644 --- a/src/programmable_signals.h +++ b/src/programmable_signals.h @@ -202,7 +202,8 @@ class SignalStateCondition: public SignalCondition { SignalStateCondition(SignalReference this_sig, TileIndex sig_tile, Trackdir sig_track); void SetSignal(TileIndex tile, Trackdir track); - bool IsSignalValid(); + bool IsSignalValid() const; + bool CheckSignalValid(); void Invalidate(); virtual bool Evaluate(SignalVM& vm); @@ -389,7 +390,7 @@ void FreeSignalPrograms(); SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green); /// Remove dependencies on signal @p on from @p by -void RemoveProgramDependencies(SignalReference by, SignalReference on); +void RemoveProgramDependencies(SignalReference dependency_target, SignalReference signal_to_update); ///@} #endif diff --git a/src/signal.cpp b/src/signal.cpp index 5942636a88..13525531ea 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -768,11 +768,11 @@ void CheckRemoveSignalsFromTile(TileIndex tile) } } -static void NotifyRemovingDependentSignal(SignalReference on, SignalReference by) +static void NotifyRemovingDependentSignal(SignalReference being_removed, SignalReference dependant) { - SignalType t = GetSignalType(by.tile, by.track); + SignalType t = GetSignalType(dependant.tile, dependant.track); if (IsProgrammableSignal(t)) { - RemoveProgramDependencies(by, on); + RemoveProgramDependencies(being_removed, dependant); } else { DEBUG(misc, 0, "Removing dependency held by non-programmable signal (Unexpected)"); }