bool IronMine::canBuild(const TilePos& pos ) const { bool is_constructible = WorkingBuilding::canBuild( pos ); bool near_mountain = false; // tells if the factory is next to a mountain Tilemap& tilemap = Scenario::instance().getCity()->getTilemap(); PtrTilesArea rect = tilemap.getRectangle( pos + TilePos( -1, -1 ), getSize() + Size(2), Tilemap::checkCorners ); for( PtrTilesArea::iterator itTiles = rect.begin(); itTiles != rect.end(); ++itTiles) { near_mountain |= (*itTiles)->getTerrain().isRock(); } return (is_constructible && near_mountain); }
bool TimberLogger::canBuild(const TilePos& pos ) const { bool is_constructible = WorkingBuilding::canBuild( pos ); bool near_forest = false; // tells if the factory is next to a forest Tilemap& tilemap = Scenario::instance().getCity()->getTilemap(); PtrTilesArea rect = tilemap.getRectangle( pos + TilePos( -1, -1 ), getSize() + Size( 2 ), Tilemap::checkCorners ); for( PtrTilesArea::iterator itTiles = rect.begin(); itTiles != rect.end(); ++itTiles) { Tile &tile = **itTiles; near_forest |= tile.getTerrain().isTree(); } return (is_constructible && near_forest); }
bool Construction::canBuild( const TilePos& pos ) const { Tilemap& tilemap = Scenario::instance().getCity().getTilemap(); bool is_constructible = true; //return area for available tiles PtrTilesArea rect = tilemap.getFilledRectangle( pos, Size( _size ) ); //on over map size if( rect.size() != _size * _size ) return false; for( PtrTilesArea::iterator itTiles = rect.begin(); itTiles != rect.end(); ++itTiles ) { is_constructible &= (*itTiles)->get_terrain().isConstructible(); } return is_constructible; }
/* INCORRECT! */ bool Wharf::canBuild(const TilePos& pos ) const { bool is_constructible = Construction::canBuild( pos ); // We can build wharf only on straight border of water and land // // ?WW? ???? ???? ???? // ?XX? WXX? ?XXW ?XX? // ?XX? WXX? ?XXW ?XX? // ???? ???? ???? ?WW? // bool bNorth = true; bool bSouth = true; bool bWest = true; bool bEast = true; Tilemap& tilemap = Scenario::instance().getCity()->getTilemap(); PtrTilesArea rect = tilemap.getRectangle( pos + TilePos( -1, -1 ), getSize() + Size( 2 ), false); for( PtrTilesArea::iterator itTiles = rect.begin(); itTiles != rect.end(); ++itTiles) { Tile &tile = **itTiles; std::cout << tile.getI() << " " << tile.getJ() << " " << pos.getI() << " " << pos.getJ() << std::endl; // if (tiles.get_terrain().isWater()) int size = getSize().getWidth(); if (tile.getJ() > (pos.getJ() + size -1) && !tile.getTerrain().isWater()) { bNorth = false; } if (tile.getJ() < pos.getJ() && !tile.getTerrain().isWater()) { bSouth = false; } if (tile.getI() > (pos.getI() + size -1) && !tile.getTerrain().isWater()) { bEast = false; } if (tile.getI() < pos.getI() && !tile.getTerrain().isWater()) { bWest = false; } } return (is_constructible && (bNorth || bSouth || bEast || bWest)); }
void HighBridge::_computePictures( const TilePos& startPos, const TilePos& endPos, DirectionType dir ) { Tilemap& tilemap = Scenario::instance().getCity()->getTilemap(); //Picture& water = Picture::load( "land1a", 120 ); switch( dir ) { case D_NORTH_WEST: { PtrTilesArea tiles = tilemap.getFilledRectangle( endPos, startPos ); tiles.pop_back(); tiles.pop_back(); tiles.pop_front(); _d->addSpan( tiles.front()->getIJ() - startPos - TilePos( 1, 0 ), HighBridgeSubTile::liftingSE ); _d->addSpan( tiles.front()->getIJ() - startPos, HighBridgeSubTile::liftingSE2 ); tiles.pop_front(); for( PtrTilesArea::iterator it=tiles.begin(); it != tiles.end(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, HighBridgeSubTile::spanSE ); } _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 1, 0 ), HighBridgeSubTile::descentSE ); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 2, 0 ), HighBridgeSubTile::descentSE2 ); } break; case D_NORTH_EAST: { PtrTilesArea tiles = tilemap.getFilledRectangle( startPos, endPos ); tiles.pop_back(); tiles.pop_back(); tiles.pop_front(); TilePos liftPos = tiles.front()->getIJ(); tiles.pop_front(); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 0, 1 ), HighBridgeSubTile::liftingSW ); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 0, 2 ), HighBridgeSubTile::liftingSW2 ); for( PtrTilesArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, HighBridgeSubTile::spanSW ); } _d->addSpan( liftPos - startPos, HighBridgeSubTile::descentSW2 ); _d->addSpan( liftPos - startPos - TilePos( 0, 1 ), HighBridgeSubTile::descentSW ); } break; case D_SOUTH_EAST: { PtrTilesArea tiles = tilemap.getFilledRectangle( startPos, endPos ); tiles.pop_back(); tiles.pop_back(); tiles.pop_front(); _d->addSpan( tiles.front()->getIJ() - startPos - TilePos( 1, 0 ), HighBridgeSubTile::liftingSE ); _d->addSpan( tiles.front()->getIJ() - startPos, HighBridgeSubTile::liftingSE2 ); tiles.pop_front(); for( PtrTilesArea::iterator it=tiles.begin(); it != tiles.end(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, HighBridgeSubTile::spanSE ); } _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 1, 0 ), HighBridgeSubTile::descentSE ); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 2, 0 ), HighBridgeSubTile::descentSE2 ); } break; case D_SOUTH_WEST: { PtrTilesArea tiles = tilemap.getFilledRectangle( endPos, startPos ); tiles.pop_back(); tiles.pop_back(); tiles.pop_front(); TilePos liftPos = tiles.front()->getIJ(); tiles.pop_front(); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 0, 1 ), HighBridgeSubTile::liftingSW ); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 0, 2 ), HighBridgeSubTile::liftingSW2 ); for( PtrTilesArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, HighBridgeSubTile::spanSW ); } _d->addSpan( liftPos - startPos, HighBridgeSubTile::descentSW2 ); _d->addSpan( liftPos - startPos - TilePos( 0, 1 ), HighBridgeSubTile::descentSW ); } break; default: break; } for( HighBridgeSubTiles::iterator it=_d->subtiles.begin(); it != _d->subtiles.end(); it++ ) { _fgPictures.push_back( (*it)->_picture ); } }