Initial implementation of PBS entry signal condition variable.

TODO: see how the efficiency of this can be improved.
This commit is contained in:
Jonathan G Rennison
2015-08-03 20:28:42 +01:00
parent 116bd41101
commit a0520b8937
5 changed files with 199 additions and 12 deletions

View File

@@ -217,6 +217,9 @@ void TraceRestrictProgram::Execute(const Train* v, const TraceRestrictProgramInp
static std::vector<TraceRestrictCondStackFlags> condstack;
condstack.clear();
bool have_previous_signal = false;
TileIndex previous_signal_tile = INVALID_TILE;
size_t size = this->items.size();
for (size_t i = 0; i < size; i++) {
TraceRestrictItem item = this->items[i];
@@ -313,6 +316,22 @@ void TraceRestrictProgram::Execute(const Train* v, const TraceRestrictProgramInp
break;
}
case TRIT_COND_PBS_ENTRY_SIGNAL: {
// TRVT_TILE_INDEX value type uses the next slot
i++;
uint32_t signal_tile = this->items[i];
if (!have_previous_signal) {
if (input.previous_signal_callback) {
previous_signal_tile = input.previous_signal_callback(v, input.previous_signal_ptr);
}
have_previous_signal = true;
}
bool match = (signal_tile != INVALID_TILE)
&& (previous_signal_tile == signal_tile);
result = TestBinaryConditionCommon(item, match);
break;
}
default:
NOT_REACHED();
}
@@ -450,6 +469,7 @@ void SetTraceRestrictValueDefault(TraceRestrictItem &item, TraceRestrictValueTyp
case TRVT_INT:
case TRVT_DENY:
case TRVT_SPEED:
case TRVT_TILE_INDEX:
SetTraceRestrictValue(item, 0);
SetTraceRestrictAuxField(item, 0);
break;
@@ -639,6 +659,9 @@ static CommandCost TraceRestrictCheckTileIsUsable(TileIndex tile, Track track)
static uint32 GetDualInstructionInitialValue(TraceRestrictItem item)
{
switch (GetTraceRestrictType(item)) {
case TRIT_COND_PBS_ENTRY_SIGNAL:
return INVALID_TILE;
default:
NOT_REACHED();
}