+void Train::set_position(const Block::Endpoint &bep)
+{
+ cur_track = bep.track;
+ cur_track_ep = bep.track_ep;
+ offset = 0;
+ pos = cur_track->get_endpoint_position(cur_track_ep);
+}
+
+void Train::release_reserved_blocks()
+{
+ for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
+ i->block->reserve(0);
+ rsv_blocks.clear();
+}
+
+
+Train::RealSpeed::RealSpeed():
+ speed(0),
+ weight(0)
+{ }
+
+void Train::RealSpeed::add(float s, float w)
+{
+ speed = (speed*weight+s*w)/(weight+w);
+ weight = min(weight+w, 300.0f);
+}
+
+
+Train::Loader::Loader(Train &t):
+ DataFile::BasicLoader<Train>(t)
+{
+ add("name", &Train::name);
+ add("real_speed", &Loader::real_speed);
+}
+
+void Train::Loader::real_speed(unsigned i, float speed, float weight)
+{
+ obj.real_speed[i].speed = speed;
+ obj.real_speed[i].weight = weight;
+}
+