X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Flayout.cpp;h=5c4cf9e1d82d26f604fbb4f5a20736cf944937d6;hb=26e741a3e8f1c83e717318f69ff02eed9b0ef6de;hp=3e49f19b836fa56351f4b42439e9be6b00e588be;hpb=7e27b311e33beda1746eb63e0945633f262427f6;p=r2c2.git diff --git a/source/libr2c2/layout.cpp b/source/libr2c2/layout.cpp index 3e49f19..5c4cf9e 100644 --- a/source/libr2c2/layout.cpp +++ b/source/libr2c2/layout.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of R²C² -Copyright © 2006-2010 Mikkosoft Productions, Mikko Rasa +Copyright © 2006-2011 Mikkosoft Productions, Mikko Rasa Distributed under the GPL */ @@ -53,6 +53,8 @@ Layout::~Layout() delete trains.begin()->second; while(!routes.empty()) delete *routes.begin(); + while(!zones.empty()) + delete *zones.begin(); while(!tracks.empty()) delete *tracks.begin(); while(!blocks.empty()) @@ -84,7 +86,16 @@ void Layout::remove_track(Track &t) } } -unsigned Layout::allocate_turnout_id(bool dbl) +Track *Layout::pick_track(const Vector &start, const Vector &ray) +{ + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) + if((*i)->collide_ray(start, ray)) + return *i; + + return 0; +} + +unsigned Layout::allocate_turnout_id() { set used_ids; for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) @@ -92,9 +103,9 @@ unsigned Layout::allocate_turnout_id(bool dbl) used_ids.insert((*i)->get_turnout_id()); unsigned result = next_turnout_id; - while(used_ids.count(result) || (dbl && used_ids.count(result+1))) + while(used_ids.count(result)) ++result; - next_turnout_id = result+1+dbl; + next_turnout_id = result+1; return result; } @@ -310,11 +321,15 @@ void Layout::save(const string &fn) const } } -void Layout::save_trains(const string &fn) const +void Layout::save_dynamic(const string &fn) const { IO::BufferedFile out(fn, IO::M_WRITE); DataFile::Writer writer(out); + for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) + if(unsigned tid = (*i)->get_turnout_id()) + writer.write((DataFile::Statement("turnout"), tid, (*i)->get_active_path())); + for(map::const_iterator i=trains.begin(); i!=trains.end(); ++i) { DataFile::Statement st("train"); @@ -349,6 +364,7 @@ Layout::Loader::Loader(Layout &l): add("route", static_cast(&Loader::route)); add("track", static_cast(&Loader::track)); add("train", static_cast(&Loader::train)); + add("turnout", &Loader::turnout); add("zone", &Loader::zone); // Deprecated aliases @@ -402,6 +418,12 @@ void Layout::Loader::train(ArticleNumber art_nr, unsigned addr, const std::strin load_sub(*trn); } +void Layout::Loader::turnout(unsigned addr, unsigned path) +{ + if(obj.driver) + obj.driver->set_turnout(addr, path); +} + void Layout::Loader::zone() { Zone *zne = new Zone(obj);