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)"); }