Index: trunk/boden/wege/runway.cc =================================================================== --- trunk/boden/wege/runway.cc (revision 8453) +++ trunk/boden/wege/runway.cc (working copy) @@ -9,6 +9,8 @@ #include "../../bauer/wegbauer.h" #include "../../descriptor/way_desc.h" #include "../../dataobj/loadsave.h" +#include "../../dataobj/translator.h" +#include "../../utils/cbuffer_t.h" #include "runway.h" @@ -27,6 +29,18 @@ } +void runway_t::info(cbuffer_t & buf) const +{ + schiene_t::info(buf); + + cbuffer_t reserved; + if( get_desc()->get_styp()==type_runway ) { + reserved.printf( "%s %i\n", translator::translate("waiting"), reservations.get_count() ); + buf.append( reserved ); + } +} + + void runway_t::rdwr(loadsave_t *file) { xml_tag_t t( file, "runway_t" ); Index: trunk/boden/wege/runway.h =================================================================== --- trunk/boden/wege/runway.h (revision 8453) +++ trunk/boden/wege/runway.h (working copy) @@ -8,6 +8,8 @@ #ifndef boden_wege_runway_h #define boden_wege_runway_h +#include "../../tpl/vector_tpl.h" +#include "../../convoihandle_t.h" #include "schiene.h" @@ -14,20 +16,16 @@ /** * Class for aiport runaway in Simutrans. - * speed >250 are for take of (maybe rather use system type in next release?) - * - * @author Hj. Malthaner + * system type==1 are for takeoff */ class runway_t : public schiene_t { +private: + vector_tpl reservations; + public: static const way_desc_t *default_runway; - /** - * File loading constructor. - * - * @author Hj. Malthaner - */ runway_t(loadsave_t *file); runway_t(); @@ -34,7 +32,24 @@ inline waytype_t get_waytype() const {return air_wt;} + /** + * @return additional info is reservation! + * @author prissi + */ + virtual void info(cbuffer_t & buf) const OVERRIDE; + void rdwr(loadsave_t *file); + + // the code below is only used for runways + // the more reservations, the higher the cost for landing there. + // Should quickly lead to equal usage of runways + uint32 get_reservation_count() const { return reservations.get_count(); } + + void add_convoi_reservation( convoihandle_t cnv ) { reservations.append_unique(cnv); } + + void remove_convoi_reservation( convoihandle_t cnv ) { reservations.remove(cnv); } + + virtual bool unreserve( convoihandle_t cnv ) OVERRIDE { reservations.remove(cnv); schiene_t::unreserve(cnv); return true; } }; #endif Index: trunk/boden/wege/schiene.cc =================================================================== --- trunk/boden/wege/schiene.cc (revision 8453) +++ trunk/boden/wege/schiene.cc (working copy) @@ -117,28 +117,6 @@ - -/** -* releases previous reservation -* @author prissi -*/ -bool schiene_t::unreserve(vehicle_t *) -{ - // is this tile empty? - if(!reserved.is_bound()) { - return true; - } -// if(!welt->lookup(get_pos())->suche_obj(v->get_typ())) { - reserved = convoihandle_t(); - if(schiene_t::show_reservations) { - set_flag( obj_t::dirty ); - } - return true; -// } -// return false; -} - - void schiene_t::rdwr(loadsave_t *file) { xml_tag_t t( file, "schiene_t" ); Index: trunk/boden/wege/schiene.h =================================================================== --- trunk/boden/wege/schiene.h (revision 8453) +++ trunk/boden/wege/schiene.h (working copy) @@ -73,13 +73,13 @@ * releases previous reservation * @author prissi */ - bool unreserve( convoihandle_t c); + virtual bool unreserve( convoihandle_t c); /** * releases previous reservation * @author prissi */ - bool unreserve( vehicle_t *); + bool unreserve( vehicle_t *) { return unreserve(reserved); } /* called before deletion; * last chance to unreserve tiles ... Index: trunk/vehicle/simvehicle.cc =================================================================== --- trunk/vehicle/simvehicle.cc (revision 8453) +++ trunk/vehicle/simvehicle.cc (working copy) @@ -3343,8 +3343,11 @@ } else { // only, if not flying ... - assert(w); - + runway_t *rw =(runway_t *)w; + // if we are on a runway, then take into account how many convois are already going there + if( rw->get_desc()->get_styp()==1 ) { + costs += rw->get_reservation_count()*9; // encourage detours even during take off + } if(w->get_desc()->get_styp()==type_flat) { costs += 3; } @@ -3491,12 +3494,7 @@ } } // free runway reservation - if(route_index>=takeoff && route_index=touchdown-1 && state!=taxiing) { - block_reserver( touchdown, searchforstop+1, false ); - } + block_reserver( route_index, route->get_count(), false ); } target_halt = halthandle_t(); // no block reserved @@ -3739,7 +3737,7 @@ for( uint32 i=start; success && iget_count(); i++) { grund_t *gr = welt->lookup(route->at(i)); - runway_t * sch1 = gr ? (runway_t *)gr->get_weg(air_wt) : NULL; + runway_t *sch1 = gr ? (runway_t *)gr->get_weg(air_wt) : NULL; if( !sch1 ) { if(reserve) { if(!start_now) { @@ -3757,6 +3755,7 @@ // we un-reserve also nonexistent tiles! (may happen during deletion) if(reserve) { start_now = true; + sch1->add_convoi_reservation(cnv->self); if( !sch1->reserve(cnv->self,ribi_t::none) ) { // unsuccessful => must un-reserve all success = false; @@ -3765,24 +3764,19 @@ } // end of runway? if( i > start && (ribi_t::is_single( sch1->get_ribi_unmasked() ) || sch1->get_desc()->get_styp() != type_runway) ) { - return true; + end = i; + break; } } - else if( !sch1->unreserve(cnv->self) ) { - if(start_now) { - // reached an reserved or free track => finished - return true; - } - } else { - // un-reserve from here (only used during sale, since there might be reserved tiles not freed) - start_now = true; + // we always unreserve everything + sch1->unreserve(cnv->self); } } } // un-reserve if not successful - if(!success && reserve) { + if( !success && reserve ) { for( uint32 i=start; ilookup(route->at(i)); if (gr) { @@ -3792,7 +3786,23 @@ } } } + return false; } + + if( reserve && endget_count(); i++ ) { + if( grund_t *gr = welt->lookup(route->at(i)) ) { + if( runway_t* sch1 = (runway_t *)gr->get_weg(air_wt) ) { + if( sch1->get_desc()->get_styp()!=type_runway ) { + break; + } + sch1->add_convoi_reservation( cnv->self ); + } + } + } + } + return success; } @@ -4112,7 +4122,7 @@ ) { state = flying; new_friction = 1; - block_reserver( takeoff, takeoff+100, false ); + block_reserver( takeoff, touchdown-1, false ); flying_height = h_cur - h_next; target_height = h_cur+TILE_HEIGHT_STEP*3; }