Merge branch 'progsig-sx' into jgrpp
This commit is contained in:
@@ -2627,9 +2627,8 @@ STR_PROGSIG_COND_ALWAYS :always
|
|||||||
STR_PROGSIG_COND_NEVER :never
|
STR_PROGSIG_COND_NEVER :never
|
||||||
STR_PROGSIG_COND_COMPARE :{STRING} {STRING} {NUM}
|
STR_PROGSIG_COND_COMPARE :{STRING} {STRING} {NUM}
|
||||||
STR_PROGSIG_COND_SIGNAL_STATE :signal state
|
STR_PROGSIG_COND_SIGNAL_STATE :signal state
|
||||||
STR_PROGSIG_CONDVAR_SIGNAL_STATE :{STRING1} is green
|
STR_PROGSIG_CONDVAR_SIGNAL_STATE_SPECIFIED :signal at {NUM} x {NUM} is green
|
||||||
STR_PROGSIG_CONDVAR_SIGNAL_STATE_SPECIFIED :specified signal
|
STR_PROGSIG_CONDVAR_SIGNAL_STATE_UNSPECIFIED :{RED}unspecified signal{STRING} is green
|
||||||
STR_PROGSIG_CONDVAR_SIGNAL_STATE_UNSPECIFIED :{RED}unspecified signal{STRING}
|
|
||||||
STR_PROGSIG_CONDVAR_NUM_RED :red signals
|
STR_PROGSIG_CONDVAR_NUM_RED :red signals
|
||||||
STR_PROGSIG_CONDVAR_NUM_GREEN :green signals
|
STR_PROGSIG_CONDVAR_NUM_GREEN :green signals
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -137,10 +137,15 @@ static char *GetConditionString(SignalCondition *cond, char *buf, char *buflast,
|
|||||||
} else {
|
} else {
|
||||||
string = _program_condvar[cond->ConditionCode()];
|
string = _program_condvar[cond->ConditionCode()];
|
||||||
if (cond->ConditionCode() == PSC_SIGNAL_STATE) {
|
if (cond->ConditionCode() == PSC_SIGNAL_STATE) {
|
||||||
string = STR_PROGSIG_CONDVAR_SIGNAL_STATE;
|
SignalStateCondition *sig_cond = static_cast<SignalStateCondition*>(cond);
|
||||||
SetDParam(0, static_cast<SignalStateCondition*>(cond)->IsSignalValid()
|
if (sig_cond->IsSignalValid()) {
|
||||||
? STR_PROGSIG_CONDVAR_SIGNAL_STATE_SPECIFIED : STR_PROGSIG_CONDVAR_SIGNAL_STATE_UNSPECIFIED);
|
string = STR_PROGSIG_CONDVAR_SIGNAL_STATE_SPECIFIED;
|
||||||
SetDParam(1, selected ? STR_WHITE : STR_BLACK);
|
SetDParam(0, TileX(sig_cond->sig_tile));
|
||||||
|
SetDParam(1, TileY(sig_cond->sig_tile));
|
||||||
|
} else {
|
||||||
|
string = STR_PROGSIG_CONDVAR_SIGNAL_STATE_UNSPECIFIED;
|
||||||
|
SetDParam(0, selected ? STR_WHITE : STR_BLACK);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return GetString(buf, string, buflast);
|
return GetString(buf, string, buflast);
|
||||||
|
@@ -646,7 +646,7 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
|||||||
|
|
||||||
/* Charge extra to remove signals on the track, if they are there */
|
/* Charge extra to remove signals on the track, if they are there */
|
||||||
if (HasSignalOnTrack(tile, track)) {
|
if (HasSignalOnTrack(tile, track)) {
|
||||||
CheckRemoveSignal(tile, track);
|
if (flags & DC_EXEC) CheckRemoveSignal(tile, track);
|
||||||
cost.AddCost(DoCommand(tile, track, 0, flags, CMD_REMOVE_SIGNALS));
|
cost.AddCost(DoCommand(tile, track, 0, flags, CMD_REMOVE_SIGNALS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -802,12 +802,14 @@ 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 DEBUG(misc, 0, "Removing dependency held by non-programmable signal (Unexpected)");
|
} else {
|
||||||
|
DEBUG(misc, 0, "Removing dependency held by non-programmable signal (Unexpected)");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckRemoveSignal(TileIndex tile, Track track)
|
void CheckRemoveSignal(TileIndex tile, Track track)
|
||||||
|
Reference in New Issue
Block a user