Signals: Add GRF restriction info bit for may reverse

pull/400/head
Jonathan G Rennison 2 years ago
parent 9cf33efe18
commit cf5eef515e

@ -116,6 +116,8 @@
<dd>The signal is restricted (has a routing restriction program attached)</dd>
<dt>RESERVE_THROUGH_ALWAYS</dt>
<dd>The attached routing restriction program unconditionally sets reserve through</dd>
<dt>MAY_REVERSE</dt>
<dd>The attached routing restriction program may allow trains to reverse behind this signal</dd>
</dl>
</td>
</tr>
@ -428,6 +430,8 @@ item (FEAT_GLOBALVARS) {
<dd>The signal is restricted (has a routing restriction program attached)</dd>
<dt>RESERVE_THROUGH_ALWAYS</dt>
<dd>The attached routing restriction program unconditionally sets reserve through</dd>
<dt>MAY_REVERSE</dt>
<dd>The attached routing restriction program may allow trains to reverse behind this signal</dd>
</dl>
</td>
</tr>

@ -583,6 +583,7 @@
<tr><th>Bit</th><th>Value</th><th>Meaning</th></tr>
<tr><td>0</td><td>1</td><td>This signal has a routing restriction program attached</td></tr>
<tr><td>1</td><td>2</td><td>Reserve through is unconditionally set in the routing restriction program</td></tr>
<tr><td>2</td><td>4</td><td>The routing restriction program may allow trains to reverse behind this signal</td></tr>
</table>
</p>
<p>See also: <a href="#railtype_enable_restricted_signals">railtype_enable_restricted_signals property</a></p>
@ -605,6 +606,7 @@
<tr><th>Bit</th><th>Value</th><th>Meaning</th></tr>
<tr><td>0</td><td>1</td><td>This signal has a routing restriction program attached</td></tr>
<tr><td>1</td><td>2</td><td>Reserve through is unconditionally set in the routing restriction program</td></tr>
<tr><td>2</td><td>4</td><td>The routing restriction program may allow trains to reverse behind this signal</td></tr>
</table>
</p>
<p>See also: <a href="#signals_enable_restricted_signals">signals_enable_restricted_signals property</a></p>

@ -78,5 +78,6 @@ uint GetNewSignalsRestrictedSignalsInfo(const TraceRestrictProgram *prog, TileIn
uint result = 1;
if ((prog->actions_used_flags & TRPAUF_RESERVE_THROUGH_ALWAYS) && !IsTileType(tile, MP_TUNNELBRIDGE)) result |= 2;
if ((prog->actions_used_flags & TRPAUF_REVERSE) && !IsTileType(tile, MP_TUNNELBRIDGE)) result |= 4;
return result;
}

@ -1057,7 +1057,19 @@ CommandCost TraceRestrictProgram::Validate(const std::vector<TraceRestrictItem>
break;
case TRIT_REVERSE:
actions_used_flags |= TRPAUF_REVERSE;
switch (static_cast<TraceRestrictReverseValueField>(GetTraceRestrictValue(item))) {
case TRRVF_REVERSE:
actions_used_flags |= TRPAUF_REVERSE;
break;
case TRRVF_CANCEL_REVERSE:
if (condstack.empty()) actions_used_flags &= ~TRPAUF_REVERSE;
break;
default:
NOT_REACHED();
break;
}
break;
case TRIT_SPEED_RESTRICTION:
@ -1327,7 +1339,7 @@ void TraceRestrictCheckRefreshSignals(const TraceRestrictProgram *prog, TileInde
{
if (_network_dedicated) return;
if (!((old_actions_used_flags ^ prog->actions_used_flags) & TRPAUF_RESERVE_THROUGH_ALWAYS)) return;
if (!((old_actions_used_flags ^ prog->actions_used_flags) & (TRPAUF_RESERVE_THROUGH_ALWAYS | TRPAUF_REVERSE))) return;
if (old_size == 0 && prog->refcount == 1) return; // Program is new, no need to refresh again

Loading…
Cancel
Save