diff --git a/src/lang/english.txt b/src/lang/english.txt index bf51d8c44e..6fc7c7ae0c 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3177,6 +3177,7 @@ STR_TRACE_RESTRICT_CONDITIONAL_ORDER_DEPOT :{STRING} {STRIN STR_TRACE_RESTRICT_CONDITIONAL_CARGO :{STRING} train {STRING} cargo: {STRING} then STR_TRACE_RESTRICT_CONDITIONAL_ENTRY_DIRECTION :{STRING} train {STRING} entering from {STRING} tile edge then STR_TRACE_RESTRICT_CONDITIONAL_ENTRY_SIGNAL_FACE :{STRING} train {STRING} entering from {STRING} of signal then +STR_TRACE_RESTRICT_CONDITIONAL_ENTRY_SIGNAL_TYPE :{STRING} train {STRING} {STRING} then STR_TRACE_RESTRICT_CONDITIONAL_TILE_INDEX :{STRING} {STRING} {STRING} at {NUM} x {NUM} then STR_TRACE_RESTRICT_CONDITIONAL_GROUP :{STRING} train {STRING} in group: {GROUP} then STR_TRACE_RESTRICT_CONDITIONAL_GROUP_STR :{STRING} train {STRING} in group: {STRING} {BLACK}{STRING}then @@ -3220,6 +3221,8 @@ STR_TRACE_RESTRICT_DIRECTION_NE :north-east STR_TRACE_RESTRICT_DIRECTION_SE :south-east STR_TRACE_RESTRICT_DIRECTION_SW :south-west STR_TRACE_RESTRICT_DIRECTION_NW :north-west +STR_TRACE_RESTRICT_DIRECTION_TUNBRIDGE_ENTRANCE :entering tunnel/bridge +STR_TRACE_RESTRICT_DIRECTION_TUNBRIDGE_EXIT :exiting tunnel/bridge STR_TRACE_RESTRICT_COMPANY :Company STR_TRACE_RESTRICT_UNDEFINED_COMPANY :Undefined company STR_TRACE_RESTRICT_SLOT_OP :Slot operation diff --git a/src/tracerestrict.cpp b/src/tracerestrict.cpp index 0cb0c85571..843112d12c 100644 --- a/src/tracerestrict.cpp +++ b/src/tracerestrict.cpp @@ -328,13 +328,21 @@ void TraceRestrictProgram::Execute(const Train* v, const TraceRestrictProgramInp break; case TRDTSV_FRONT: - direction_match = IsTileType(input.tile, MP_RAILWAY) && HasSignalOnTrackdir(input.tile, input.trackdir); + direction_match = (IsTileType(input.tile, MP_RAILWAY) && HasSignalOnTrackdir(input.tile, input.trackdir)) || IsTileType(input.tile, MP_TUNNELBRIDGE); break; case TRDTSV_BACK: direction_match = IsTileType(input.tile, MP_RAILWAY) && !HasSignalOnTrackdir(input.tile, input.trackdir); break; + case TRDTSV_TUNBRIDGE_ENTER: + direction_match = IsTunnelBridgeSignalSimulationEntranceTile(input.tile) && TrackdirEntersTunnelBridge(input.tile, input.trackdir); + break; + + case TRDTSV_TUNBRIDGE_EXIT: + direction_match = IsTunnelBridgeSignalSimulationExitTile(input.tile) && TrackdirExitsTunnelBridge(input.tile, input.trackdir); + break; + default: NOT_REACHED(); break; diff --git a/src/tracerestrict.h b/src/tracerestrict.h index 9f0f0b13c7..94c3682176 100644 --- a/src/tracerestrict.h +++ b/src/tracerestrict.h @@ -194,6 +194,8 @@ enum TraceRestrictDirectionTypeSpecialValue { TRNTSV_NW = 3, ///< DIAGDIR_NW: entering at NW tile edge TRDTSV_FRONT = 4, ///< entering at front face of signal TRDTSV_BACK = 5, ///< entering at rear face of signal + TRDTSV_TUNBRIDGE_ENTER = 32, ///< signal is a tunnel/bridge entrance + TRDTSV_TUNBRIDGE_EXIT = 33, ///< signal is a tunnel/bridge exit }; /** diff --git a/src/tracerestrict_gui.cpp b/src/tracerestrict_gui.cpp index cce824d131..49407961c7 100644 --- a/src/tracerestrict_gui.cpp +++ b/src/tracerestrict_gui.cpp @@ -263,6 +263,8 @@ static const StringID _direction_value_str[] = { STR_TRACE_RESTRICT_DIRECTION_SE, STR_TRACE_RESTRICT_DIRECTION_SW, STR_TRACE_RESTRICT_DIRECTION_NW, + STR_TRACE_RESTRICT_DIRECTION_TUNBRIDGE_ENTRANCE, + STR_TRACE_RESTRICT_DIRECTION_TUNBRIDGE_EXIT, INVALID_STRING_ID }; static const uint _direction_value_val[] = { @@ -272,6 +274,8 @@ static const uint _direction_value_val[] = { TRNTSV_SE, TRNTSV_SW, TRNTSV_NW, + TRDTSV_TUNBRIDGE_ENTER, + TRDTSV_TUNBRIDGE_EXIT, }; /** value drop down list for direction type strings and values */ @@ -1125,7 +1129,9 @@ static void DrawInstructionString(const TraceRestrictProgram *prog, TraceRestric break; case TRVT_DIRECTION: - if (GetTraceRestrictValue(item) >= TRDTSV_FRONT) { + if (GetTraceRestrictValue(item) >= TRDTSV_TUNBRIDGE_ENTER) { + instruction_string = STR_TRACE_RESTRICT_CONDITIONAL_ENTRY_SIGNAL_TYPE; + } else if (GetTraceRestrictValue(item) >= TRDTSV_FRONT) { instruction_string = STR_TRACE_RESTRICT_CONDITIONAL_ENTRY_SIGNAL_FACE; } else { instruction_string = STR_TRACE_RESTRICT_CONDITIONAL_ENTRY_DIRECTION;