const TrackType::Endpoint &entry_ep = train.track.endpoint();
if(train.critical)
{
- train.path = train.track->get_type().coerce_path(train.track.entry(), train.track->get_active_path());
- train.update_estimate();
- next.update_estimate();
- if(next.is_viable())
- new_steps.push_back(next);
+ unsigned critical_path = train.track->get_type().coerce_path(train.track.entry(), train.track->get_active_path());
+ create_successor(next, train_index, critical_path, new_steps);
}
else
{
for(unsigned i=0; entry_ep.paths>>i; ++i)
if(entry_ep.has_path(i))
- {
- train.path = i;
- train.update_estimate();
- next.update_estimate();
- if(next.is_viable())
- new_steps.push_back(next);
- }
+ create_successor(next, train_index, i, new_steps);
}
new_steps.sort();
}
}
+void TrainRoutePlanner::RoutingStep::create_successor(RoutingStep &next, unsigned train_index, unsigned path, list<RoutingStep> &new_steps)
+{
+ TrainRoutingState &train = next.trains[train_index];
+
+ train.path = path;
+ train.update_estimate();
+ next.update_estimate();
+ if(next.is_viable())
+ new_steps.push_back(next);
+}
+
bool TrainRoutePlanner::RoutingStep::update_states()
{
bool changes = false;
RoutingStep(const RoutingStep *);
void create_successors(std::list<RoutingStep> &) const;
+ static void create_successor(RoutingStep &, unsigned, unsigned, std::list<RoutingStep> &);
bool update_states();
bool check_deadlocks() const;
int get_occupant(Track &) const;