Add entry direction condition variable.

This commit is contained in:
Jonathan G Rennison
2015-07-27 21:15:43 +01:00
parent 3dd51e96b8
commit 5474ee3e40
5 changed files with 120 additions and 3 deletions

View File

@@ -211,7 +211,7 @@ static bool TestStationCondition(StationID station, TraceRestrictItem item)
* @p v may not be NULL
* @p out should be zero-initialised
*/
void TraceRestrictProgram::Execute(const Train* v, TraceRestrictProgramResult& out) const
void TraceRestrictProgram::Execute(const Train* v, const TraceRestrictProgramInput &input, TraceRestrictProgramResult& out) const
{
// static to avoid needing to re-alloc/resize on each execution
static std::vector<TraceRestrictCondStackFlags> condstack;
@@ -287,6 +287,32 @@ void TraceRestrictProgram::Execute(const Train* v, TraceRestrictProgramResult& o
break;
}
case TRIT_COND_ENTRY_DIRECTION: {
bool direction_match;
switch (GetTraceRestrictValue(item)) {
case TRNTSV_NE:
case TRNTSV_SE:
case TRNTSV_SW:
case TRNTSV_NW:
direction_match = (static_cast<DiagDirection>(GetTraceRestrictValue(item)) == TrackdirToExitdir(ReverseTrackdir(input.trackdir)));
break;
case TRDTSV_FRONT:
direction_match = IsTileType(input.tile, MP_RAILWAY) && HasSignalOnTrackdir(input.tile, input.trackdir);
break;
case TRDTSV_BACK:
direction_match = IsTileType(input.tile, MP_RAILWAY) && !HasSignalOnTrackdir(input.tile, input.trackdir);
break;
default:
NOT_REACHED();
break;
}
result = TestBinaryConditionCommon(item, direction_match);
break;
}
default:
NOT_REACHED();
}
@@ -402,6 +428,11 @@ void SetTraceRestrictValueDefault(TraceRestrictItem &item, TraceRestrictValueTyp
SetTraceRestrictAuxField(item, 0);
break;
case TRVT_DIRECTION:
SetTraceRestrictValue(item, TRDTSV_FRONT);
SetTraceRestrictAuxField(item, 0);
break;
default:
NOT_REACHED();
break;