+#include "catalogue.h"
#include "layout.h"
#include "route.h"
#include "train.h"
bool changes = false;
for(vector<TrainRoutingState>::iterator i=next.trains.begin(); i!=next.trains.end(); ++i)
{
+ if(i->state==ARRIVED)
+ continue;
+
TrainState old_state = i->state;
if(i->state==BLOCKED)
i->state = MOVING;
if(next_entry_ep.has_path(i))
{
next.trains[train_index].path = i;
- new_steps.push_back(next);
+ if(next.is_viable())
+ new_steps.push_back(next);
}
if(next_entry_ep.paths!=next_track->get_type().get_paths())
RoutingStep wait(&step);
wait.advance(dt);
wait.trains[train_index].state = WAITING;
- new_steps.push_back(wait);
+ if(wait.is_viable())
+ new_steps.push_back(wait);
}
}
TrainRoutePlanner::TrainRoutingInfo::TrainRoutingInfo(Train &t):
train(&t),
+ speed(train->get_maximum_speed()),
router(train->get_ai_of_type<TrainRouter>()),
route(0)
-{ }
+{
+ // If no maximum speed is specified, use a sensible default
+ if(!speed)
+ speed = 20*train->get_layout().get_catalogue().get_scale();
+}
TrainRoutePlanner::OccupiedTrack::OccupiedTrack(Track &t, unsigned p, OccupiedTrack *n):
offset(other.offset),
back_offset(other.back_offset),
state(other.state),
+ delay(other.delay),
waypoint(other.waypoint)
{
++occupied_tracks->refcount;
Time::TimeDelta TrainRoutePlanner::TrainRoutingState::get_time_to_next_track() const
{
- // TODO Consider the speed of the train
- return (track->get_type().get_path_length(path)-offset)*Time::sec+delay;
+ return ((track->get_type().get_path_length(path)-offset)/info->speed)*Time::sec+delay;
}
bool TrainRoutePlanner::TrainRoutingState::is_occupied(Track &trk) const
i->delay = Time::zero;
}
else if(i->state==MOVING)
- {
- float distance = dt/Time::sec;
- i->advance(distance);
- }
+ i->advance(i->info->speed*(dt/Time::sec));
}
}
+bool TrainRoutePlanner::RoutingStep::is_viable() const
+{
+ for(vector<TrainRoutingState>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
+ if(i->state==MOVING)
+ return true;
+
+ return false;
+}
+
bool TrainRoutePlanner::RoutingStep::is_goal() const
{
for(vector<TrainRoutingState>::const_iterator i=trains.begin(); i!=trains.end(); ++i)