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:
@@ -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())) {
|
||||
|
Reference in New Issue
Block a user