void Construction::computeAccessRoads() { _accessRoads.clear(); Tilemap& tilemap = Scenario::instance().getCity().getTilemap(); int mi = _master_tile->getI(); int mj = _master_tile->getJ(); Uint8 maxDst2road = getMaxDistance2Road(); std::list<Tile*> rect = tilemap.getRectangle( mi-maxDst2road, mj-maxDst2road, mi+_size+maxDst2road-1, mj+_size+maxDst2road-1, false); for (std::list<Tile*>::iterator itTiles = rect.begin(); itTiles != rect.end(); ++itTiles) { Tile* tile = *itTiles; if( tile->get_terrain().isRoad() ) { _accessRoads.push_back( tile ); } } }
// here the problem lays: if we remove road, it is left in _accessRoads array // also we need to recompute _accessRoads if we place new road tile // on next to this road tile buildings void Construction::computeAccessRoads() { _accessRoads.clear(); if( !_master_tile ) return; Tilemap& tilemap = Scenario::instance().getCity().getTilemap(); Uint8 maxDst2road = getMaxDistance2Road(); std::list<Tile*> rect = tilemap.getRectangle( _master_tile->getIJ() + TilePos( -maxDst2road, -maxDst2road ), _master_tile->getIJ() + TilePos( _size + maxDst2road - 1, _size + maxDst2road - 1 ), !Tilemap::checkCorners ); for (std::list<Tile*>::iterator itTiles = rect.begin(); itTiles != rect.end(); ++itTiles) { Tile* tile = *itTiles; if ( tile->get_terrain().isRoad() ) { _accessRoads.push_back( tile ); } } }