From f178899609bb30284e40b1a3f5246ce44cfbf569 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 14 Jul 2013 09:21:46 +0000 Subject: (svn r25609) -Fix [FS#5216]: under certain circumstances a track type change would make the end-of-line-is-red setting ineffective --- src/pathfinder/yapf/yapf_base.hpp | 15 +++++++++++++++ src/pathfinder/yapf/yapf_costrail.hpp | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src/pathfinder/yapf') diff --git a/src/pathfinder/yapf/yapf_base.hpp b/src/pathfinder/yapf/yapf_base.hpp index f63dcf04a..0f88d058e 100644 --- a/src/pathfinder/yapf/yapf_base.hpp +++ b/src/pathfinder/yapf/yapf_base.hpp @@ -223,6 +223,21 @@ public: } } + /** + * In some cases an intermediate node branch should be pruned. + * The most prominent case is when a red EOL signal is encountered, but + * there was a segment change (e.g. a rail type change) before that. If + * the branch would not be pruned, the rail type change location would + * remain the best intermediate node, and thus the vehicle would still + * go towards the red EOL signal. + */ + void PruneIntermediateNodeBranch() + { + while (Yapf().m_pBestIntermediateNode != NULL && (Yapf().m_pBestIntermediateNode->m_segment->m_end_segment_reason & ESRB_CHOICE_FOLLOWS) == 0) { + Yapf().m_pBestIntermediateNode = Yapf().m_pBestIntermediateNode->m_parent; + } + } + /** * AddNewNode() - called by Tderived::PfFollowNode() for each child node. * Nodes are evaluated here and added into open list diff --git a/src/pathfinder/yapf/yapf_costrail.hpp b/src/pathfinder/yapf/yapf_costrail.hpp index 44647443b..c6080f2a1 100644 --- a/src/pathfinder/yapf/yapf_costrail.hpp +++ b/src/pathfinder/yapf/yapf_costrail.hpp @@ -212,7 +212,8 @@ public: /* we have a red signal in our direction * was it first signal which is two-way? */ if (!IsPbsSignal(sig_type) && Yapf().TreatFirstRedTwoWaySignalAsEOL() && n.flags_u.flags_s.m_choice_seen && has_signal_against && n.m_num_signals_passed == 0) { - /* yes, the first signal is two-way red signal => DEAD END */ + /* yes, the first signal is two-way red signal => DEAD END. Prune this branch... */ + Yapf().PruneIntermediateNodeBranch(); n.m_segment->m_end_segment_reason |= ESRB_DEAD_END; Yapf().m_stopped_on_first_two_way_signal = true; return -1; -- cgit v1.2.3-70-g09d2