Reverse behind signal pathfinding now takes into account train length

This is to avoid pathfinding into a reversing track section which
is too short
This commit is contained in:
Jonathan G Rennison
2021-09-11 14:53:08 +01:00
parent 29df09e917
commit 7018babeac
4 changed files with 48 additions and 6 deletions

View File

@@ -289,13 +289,16 @@ public:
*/
inline void PfFollowNode(Node &old_node)
{
TrackFollower F(Yapf().GetVehicle());
const Train *v = Yapf().GetVehicle();
TrackFollower F(v);
if (old_node.flags_u.flags_s.m_reverse_pending && old_node.m_segment->m_end_segment_reason & (ESRB_SAFE_TILE | ESRB_DEPOT | ESRB_DEAD_END)) {
Node *rev_node = &old_node;
uint length = 0;
while (rev_node && !(rev_node->m_segment->m_end_segment_reason & ESRB_REVERSE)) {
length += rev_node->GetNodeLength(v, Yapf(), *this);
rev_node = rev_node->m_parent;
}
if (rev_node) {
if (rev_node && length >= v->gcache.cached_total_length) {
if (F.Follow(rev_node->GetLastTile(), ReverseTrackdir(rev_node->GetLastTrackdir()))) {
Yapf().AddMultipleNodes(&old_node, F, [&](Node &n) {
n.flags_u.flags_s.m_reverse_pending = false;
@@ -303,6 +306,8 @@ public:
});
}
return;
} else if (old_node.m_segment->m_end_segment_reason & (ESRB_DEPOT | ESRB_DEAD_END)) {
return;
}
}
if (F.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir())) {
@@ -482,13 +487,16 @@ public:
*/
inline void PfFollowNode(Node &old_node)
{
TrackFollower F(Yapf().GetVehicle());
const Train *v = Yapf().GetVehicle();
TrackFollower F(v);
if (old_node.flags_u.flags_s.m_reverse_pending && old_node.m_segment->m_end_segment_reason & (ESRB_SAFE_TILE | ESRB_DEPOT | ESRB_DEAD_END)) {
Node *rev_node = &old_node;
uint length = 0;
while (rev_node && !(rev_node->m_segment->m_end_segment_reason & ESRB_REVERSE)) {
length += rev_node->GetNodeLength(v, Yapf(), *this);
rev_node = rev_node->m_parent;
}
if (rev_node) {
if (rev_node && length >= v->gcache.cached_total_length) {
if (F.Follow(rev_node->GetLastTile(), ReverseTrackdir(rev_node->GetLastTrackdir()))) {
Yapf().AddMultipleNodes(&old_node, F, [&](Node &n) {
n.flags_u.flags_s.m_reverse_pending = false;
@@ -496,6 +504,8 @@ public:
});
}
return;
} else if (old_node.m_segment->m_end_segment_reason & (ESRB_DEPOT | ESRB_DEAD_END)) {
return;
}
}
if (F.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir())) {