/* $Id$
This file is part of R²C²
-Copyright © 2010 Mikkosoft Productions, Mikko Rasa
+Copyright © 2010-2011 Mikkosoft Productions, Mikko Rasa
Distributed under the GPL
*/
delete next_ctrl;
}
+const char *AIControl::enumerate_controls(unsigned index) const
+{
+ if(index==0)
+ return target_speed.name.c_str();
+ else
+ {
+ for(--index;; ++index)
+ {
+ const char *ret = next_ctrl->enumerate_controls(index-1);
+ if(!ret || ret!=target_speed.name)
+ return ret;
+ }
+ }
+}
+
void AIControl::set_control(const string &n, float v)
{
- if(n=="speed")
+ if(n==target_speed.name)
{
if(v && !train.is_active())
train.set_active(true);
const Controller::Control &AIControl::get_control(const string &n) const
{
- if(n=="speed")
+ if(n==target_speed.name)
return target_speed;
else
return next_ctrl->get_control(n);
float brake_dist = next_ctrl->get_braking_distance();
float approach_margin = 50*scale;
float approach_speed = 5*scale;
- float margin = 10*scale;
+ float margin = 1*scale;
State old_state = state;
speed_limit = 0;
else if(state==APPROACH)
speed_limit = approach_speed;
- else if(state==FOLLOW)
+ else if(state==FOLLOW && train.get_preceding_train()->is_active())
speed_limit = train.get_preceding_train()->get_speed();
if(speed_limit>=0 && target_speed.value>speed_limit)