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.
This commit is contained in:
Jonathan G Rennison
2015-10-03 14:15:58 +01:00
parent 1823deae7d
commit b2b9c0a070
3 changed files with 24 additions and 20 deletions

View File

@@ -121,21 +121,23 @@ SignalStateCondition::SignalStateCondition(SignalReference this_sig,
: SignalCondition(PSC_SIGNAL_STATE), this_sig(this_sig), sig_tile(sig_tile) : SignalCondition(PSC_SIGNAL_STATE), this_sig(this_sig), sig_tile(sig_tile)
, sig_track(sig_track) , sig_track(sig_track)
{ {
if (this->IsSignalValid()) if (this->CheckSignalValid())
AddSignalDependency(SignalReference(this->sig_tile, TrackdirToTrack(sig_track)), AddSignalDependency(SignalReference(this->sig_tile, TrackdirToTrack(sig_track)),
this->this_sig); this->this_sig);
} }
bool SignalStateCondition::IsSignalValid() bool SignalStateCondition::IsSignalValid() const
{ {
if (IsValidTile(this->sig_tile)) { return IsValidTile(this->sig_tile) && IsTileType(this->sig_tile, MP_RAILWAY) && HasSignalOnTrackdir(this->sig_tile, this->sig_track);
if (IsTileType(this->sig_tile, MP_RAILWAY) && HasSignalOnTrackdir(this->sig_tile, this->sig_track)) { }
return true;
} else { bool SignalStateCondition::CheckSignalValid()
Invalidate(); {
bool valid = this->IsSignalValid();
if (!valid) {
this->Invalidate();
} }
} return valid;
return false;
} }
void SignalStateCondition::Invalidate() void SignalStateCondition::Invalidate()
@@ -151,7 +153,7 @@ void SignalStateCondition::SetSignal(TileIndex tile, Trackdir track)
this->this_sig); this->this_sig);
this->sig_tile = tile; this->sig_tile = tile;
this->sig_track = track; this->sig_track = track;
if (this->IsSignalValid()) if (this->CheckSignalValid())
AddSignalDependency(SignalReference(this->sig_tile, TrackdirToTrack(sig_track)), AddSignalDependency(SignalReference(this->sig_tile, TrackdirToTrack(sig_track)),
this->this_sig); this->this_sig);
} }
@@ -165,7 +167,7 @@ void SignalStateCondition::SetSignal(TileIndex tile, Trackdir track)
/*virtual*/ bool SignalStateCondition::Evaluate(SignalVM& vm) /*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); DEBUG(misc, 1, "Signal (%x, %d) has an invalid condition", this->this_sig.tile, this->this_sig.track);
return false; return false;
} }
@@ -412,9 +414,9 @@ SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green
return vm.state; 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(); for (SignalInstruction **b = prog->instructions.Begin(), **i = b, **e = prog->instructions.End();
i != e; i++) { i != e; i++) {
SignalInstruction *insn = *i; SignalInstruction *insn = *i;
@@ -422,13 +424,14 @@ void RemoveProgramDependencies(SignalReference by, SignalReference on)
SignalIf* ifi = static_cast<SignalIf*>(insn); SignalIf* ifi = static_cast<SignalIf*>(insn);
if (ifi->condition->ConditionCode() == PSC_SIGNAL_STATE) { if (ifi->condition->ConditionCode() == PSC_SIGNAL_STATE) {
SignalStateCondition* c = static_cast<SignalStateCondition*>(ifi->condition); SignalStateCondition* c = static_cast<SignalStateCondition*>(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(); 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(); UpdateSignalsInBuffer();
} }

View File

@@ -202,7 +202,8 @@ class SignalStateCondition: public SignalCondition {
SignalStateCondition(SignalReference this_sig, TileIndex sig_tile, Trackdir sig_track); SignalStateCondition(SignalReference this_sig, TileIndex sig_tile, Trackdir sig_track);
void SetSignal(TileIndex tile, Trackdir track); void SetSignal(TileIndex tile, Trackdir track);
bool IsSignalValid(); bool IsSignalValid() const;
bool CheckSignalValid();
void Invalidate(); void Invalidate();
virtual bool Evaluate(SignalVM& vm); virtual bool Evaluate(SignalVM& vm);
@@ -389,7 +390,7 @@ void FreeSignalPrograms();
SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green); SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green);
/// Remove dependencies on signal @p on from @p by /// 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 #endif

View File

@@ -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)) { if (IsProgrammableSignal(t)) {
RemoveProgramDependencies(by, on); RemoveProgramDependencies(being_removed, dependant);
} else { } else {
DEBUG(misc, 0, "Removing dependency held by non-programmable signal (Unexpected)"); DEBUG(misc, 0, "Removing dependency held by non-programmable signal (Unexpected)");
} }