void moveBulldozer(int dist){ for(int n=0; n<dist;n++){ // d.game->sim->getRailPen()->move(1, d.game->sim); Point p = d.game->sim.railPen.getPos(); if(d.game->sim.railPen.getMode() == RailPen::PAINTING){ Rail * newRail = d.game->sim.railPen.makeNewRail(d.game->sim.railMap.getRailAt(p.row, p.col)); d.game->sim.railMap.setRail(p.row, p.col, newRail); ForkRail *rf = dynamic_cast<ForkRail *>(newRail); if(rf){ d.game->sim.addFork(rf); } Point lastPoint = d.game->sim.railPen.getPos(); Dir lastDir = d.game->sim.railPen.getLastDir(); Dir backDir = -lastDir; lastPoint.move(backDir); Rail * lastRail = d.game->sim.railMap.getRailAt(lastPoint.row, lastPoint.col); if(lastRail){ newRail->linkRailAt(backDir, lastRail); } } d.game->sim.railPen.forward(); } }
Rail * RailPen::makeNewRail(Rail * rail){ DirEnv env; if(rail){ env = rail->getEnv(); } env.addPath(-lastDir, dir); Rail * newRail = env.makeNewRail(); if(rail){ for(int n(Dir::E) ;n<(Dir::NUM_DIRS); n++){ Dir dir (n); Rail * linked = rail->getLinkedRailAt(dir); if(linked){ newRail->linkRailAt(dir, linked); } } } return newRail; }
// ojo, no pinta cuando distance es mayor que 1. Testear esto!!!!!!!!!!!!!! bool RailPen::move(int distance, Sim * sim){ Point p = getPos(); if(getMode() == PAINTING){ if(distance>0){ for(int n= 0; n<distance;n++){ Rail * newRail = makeNewRail(sim->railMap.getRailAt(p.row, p.col)); sim->railMap.setRail(p.row, p.col, newRail); ForkRail *rf = dynamic_cast<ForkRail *>(newRail); if(rf){ sim->addFork(rf); } Point lastPoint = getPos(); Dir lastDir = getLastDir(); Dir backDir = -lastDir; lastPoint.move(backDir); Rail * lastRail = sim->railMap.getRailAt(lastPoint.row, lastPoint.col); if(lastRail){ newRail->linkRailAt(backDir, lastRail); } forward(); } }else{ for(int n=0; n>distance;n--){ Point p = getPos(); sim->railMap.setRail(p.row, p.col, 0); backwards(); } } }else{ pos.move(dir, distance); lastDir=dir; } return true; }