my fault. but a test to exclude tunnel and bridge tiles should be easy.
Index: simwerkz.cc
===================================================================
--- simwerkz.cc (revision 2489)
+++ simwerkz.cc (working copy)
@@ -1651,30 +1651,38 @@
wkz_wayremover_bauer = NULL;
erster = true;
- // get a default vehikel
- fahrer_t* test_driver;
- if( wt!=powerline_wt ) {
- vehikel_besch_t remover_besch(wt, 500, vehikel_besch_t::diesel );
- test_driver = vehikelbauer_t::baue(start, sp, NULL, &remover_besch);
+ route_t verbindung;
+ bool can_delete;
+ if (start != gr->get_pos()) {
+ // get a default vehikel
+ fahrer_t* test_driver;
+ if( wt!=powerline_wt ) {
+ vehikel_besch_t remover_besch(wt, 500, vehikel_besch_t::diesel );
+ test_driver = vehikelbauer_t::baue(start, sp, NULL, &remover_besch);
+ }
+ else {
+ test_driver = (fahrer_t * )new electron_t();
+ }
+ can_delete = verbindung.calc_route(welt, start, gr->get_pos(), test_driver, 0);
+ delete test_driver;
+ welt->show_distance = start = koord3d::invalid;
+ DBG_MESSAGE("wkz_wayremover()", "route search returned %d", can_delete);
+
+ if(!can_delete) {
+ DBG_MESSAGE("wkz_wayremover()","no route found");
+ return "Ways not connected";
+ }
}
else {
- test_driver = (fahrer_t * )new electron_t();
+ // if start = end then remove the entire way on this tile
+ verbindung.append(start);
+ can_delete= true;
}
- route_t verbindung;
- bool can_delete = verbindung.calc_route(welt, start, gr->get_pos(), test_driver, 0);
- delete test_driver;
- welt->show_distance = start = koord3d::invalid;
- DBG_MESSAGE("wkz_wayremover()", "route search returned %d", can_delete);
- if(!can_delete) {
- DBG_MESSAGE("wkz_wayremover()","no route found");
- return "Ways not connected";
- }
-
DBG_MESSAGE("wkz_wayremover()","route with %d tile found",verbindung.get_max_n());
// found a route => check if I can delete anything on it
- for( uint32 i=0; can_delete && i<=verbindung.get_max_n(); i++ ) {
+ for( uint32 i=0; can_delete && i<verbindung.get_max_n(); i++ ) {
grund_t *gr=welt->lookup(verbindung.position_bei(i));
if(gr) {
if( wt!=powerline_wt ) {
@@ -1706,7 +1714,7 @@
}
// if successful => delete everything
- for( uint32 i=0; can_delete && i<=verbindung.get_max_n(); i++ ) {
+ for( uint32 i=0; can_delete && i<verbindung.get_max_n(); i++ ) {
grund_t *gr=welt->lookup(verbindung.position_bei(i));
@@ -1732,6 +1740,10 @@
ribi_t::ribi rem = (i>0) ? ribi_typ( verbindung.position_bei(i).get_2d(), verbindung.position_bei(i-1).get_2d() ) : 0;
ribi_t::ribi rem2 = (i<verbindung.get_max_n()) ? ribi_typ(verbindung.position_bei(i).get_2d(),verbindung.position_bei(i+1).get_2d()) : 0;
rem = ~(rem|rem2);
+ // if start=end tile then delete every direction
+ if (verbindung.get_max_n()==1) {
+ rem = 0;
+ }
if( wt!=powerline_wt ) {
if(!gr->get_flag(grund_t::is_kartenboden) && (gr->get_typ()==grund_t::tunnelboden || gr->get_typ()==grund_t::monorailboden) && gr->get_weg_nr(0)->get_waytype()==wt) {
Now the patch looks much more m****ive, but most of the changes are due to indentation. It now uses the original remover logic but adapted to the special situation start=end.