X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Flayout.cpp;h=70a9f106849d26ec2f9b59ad0eb2d5b8d13a2169;hb=1709c7afe41a96b079f3d34c9625d1a790dcc805;hp=72f083d57cc2da491dead13077ad495b716f5942;hpb=399b48a7a80dafde49e7530ff8dfd2820232a73f;p=r2c2.git diff --git a/source/libr2c2/layout.cpp b/source/libr2c2/layout.cpp index 72f083d..70a9f10 100644 --- a/source/libr2c2/layout.cpp +++ b/source/libr2c2/layout.cpp @@ -425,6 +425,14 @@ void Layout::tick() dt = t-last_tick; last_tick = t; + unsigned count = dt/(10*Time::msec)+1; + dt /= count; + while(count--) + step(dt); +} + +void Layout::step(const Time::TimeDelta &dt) +{ if(!driver || !driver->is_halted()) clock.tick(dt); @@ -525,7 +533,12 @@ void Layout::save_dynamic(const string &fn) const const set &tracks = objects.get(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) if((*i)->get_type().is_turnout()) - writer.write((DataFile::Statement("turnout"), (*i)->get_turnout_address(), (*i)->get_active_path())); + { + DataFile::Statement st("turnout"); + st.append((*i)->get_turnout_address()); + (*i)->save_dynamic(st.sub); + writer.write(st); + } for(map::const_iterator i=trains.begin(); i!=trains.end(); ++i) { @@ -638,6 +651,9 @@ Layout::Loader::Loader(Layout &l): add("train", &Loader::train); add("turnout", &Loader::turnout); add("zone", &Loader::zone); + + // Deprecated + add("turnout", &Loader::turnout2); } void Layout::Loader::beamgate() @@ -685,8 +701,24 @@ void Layout::Loader::train(const string &n, unsigned addr, const std::string &pr load_sub(*trn); } -void Layout::Loader::turnout(unsigned addr, unsigned path) +void Layout::Loader::turnout(unsigned addr) +{ + /* Kinda slow, but maintaining a map of turnouts seems more trouble than + it's worth at this point. */ + const set &tracks = obj.objects.get(); + for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) + if((*i)->get_turnout_address()==addr) + { + load_sub(**i); + return; + } + + throw key_error(addr); +} + +void Layout::Loader::turnout2(unsigned addr, unsigned path) { + // XXX Discrepancy between ids and addresses if(obj.driver) obj.driver->set_turnout(addr, path); }