void Pathfinder::update( const Tilemap& tilemap ) { _tilemap = const_cast< Tilemap* >( &tilemap ); PtrTilesList tiles = _tilemap->getFilledRectangle( TilePos( 0, 0 ), Size( _tilemap->getSize() ) ); for( PtrTilesList::iterator i=tiles.begin(); i != tiles.end(); i++ ) { if ( !pointExists( (*i)->getIJ() ) ) { grid[ (*i)->getI() ][ (*i)->getJ() ] = new AStarPoint( *i ); } } }
void Construction::_updateDesirabilityInfluence( bool onBuild ) { City &city = Scenario::instance().getCity(); Tilemap &tilemap = city.getTilemap(); PtrTilesList desirabilityArea = tilemap.getFilledRectangle( getTile().getIJ() - TilePos( 2, 2 ), getTile().getIJ() + TilePos( 2 + getSize(), 2 + getSize() ) ); int mul = (onBuild ? 1 : -1); for( PtrTilesList::iterator it=desirabilityArea.begin(); it != desirabilityArea.end(); it++ ) { (*it)->get_terrain().appendDesirability( mul * getDesirabilityInfluence() ); } }
bool FactoryClay::canBuild(const TilePos& pos ) const { bool is_constructible = Construction::canBuild( pos ); bool near_water = false; Tilemap& tilemap = Scenario::instance().getCity().getTilemap(); PtrTilesList rect = tilemap.getRectangle( pos + TilePos( -1, -1), Size( _size + 2 ), Tilemap::checkCorners ); for( PtrTilesList::iterator itTiles = rect.begin(); itTiles != rect.end(); ++itTiles ) { near_water |= (*itTiles)->get_terrain().isWater(); } return (is_constructible && near_water); }
void House::levelDown() { _d->houseLevel--; _d->houseLevelSpec = HouseSpecHelper::getInstance().getHouseLevelSpec(_d->houseLevel); _d->nextHouseLevelSpec = _d->houseLevelSpec.next(); switch (_d->houseLevel) { case 1: { _d->houseId = 1; _d->picIdOffset = ( rand() % 10 > 6 ? 1 : 0 ); CityPtr city = Scenario::instance().getCity(); Tilemap& tmap = city->getTilemap(); if( getSize().getWidth() > 1 ) { _updateDesirabilityInfluence( Construction::duNegative ); PtrTilesList tiles = tmap.getFilledRectangle( getTile().getIJ(), Size(2) ); PtrTilesList::iterator it=tiles.begin(); int peoplesPerHouse = getNbHabitants() / 4; _d->currentHabitants = peoplesPerHouse; it++; //no destroy himself for( ; it != tiles.end(); it++ ) { HousePtr house = ConstructionManager::getInstance().create( B_HOUSE ).as<House>(); house->build( (*it)->getIJ() ); house->_d->currentHabitants = peoplesPerHouse; house->_update(); } setSize( Size( 1 ) ); _updateDesirabilityInfluence( Construction::duPositive ); } } break; case 2: _tryDegrage_11_to_2_lvl( 1, 5, -3 ); break; case 3: _tryDegrage_11_to_2_lvl( 3, 6, -3 ); break; case 4: _tryDegrage_11_to_2_lvl( 7, 11, -2 ); break; case 5: _tryDegrage_11_to_2_lvl( 9, 12, -2 ); break; case 6: _tryDegrage_11_to_2_lvl( 13, 17, -2 ); break; case 7: _tryDegrage_11_to_2_lvl( 15, 18, -2 ); break; case 8: _tryDegrage_11_to_2_lvl( 19, 23, -1 ); break; case 9: _tryDegrage_11_to_2_lvl( 21, 23, -1 ); break; case 10: _tryDegrage_11_to_2_lvl( 25, 29, 0 ); break; case 11: _tryDegrage_11_to_2_lvl( 27, 30, 0 ); break; } _update(); }
void House::_tryUpdate_1_to_11_lvl( int level4grow, int startSmallPic, int startBigPic, const char desirability ) { if( getSize() == 1 ) { CityPtr city = Scenario::instance().getCity(); Tilemap& tmap = city->getTilemap(); PtrTilesList tiles = tmap.getFilledRectangle( getTile().getIJ(), Size(2) ); bool mayGrow = true; for( PtrTilesList::iterator it=tiles.begin(); it != tiles.end(); it++ ) { if( *it == NULL ) { mayGrow = false; //some broken, can't grow break; } HousePtr house = (*it)->getTerrain().getOverlay().as<House>(); if( house != NULL && house->getLevelSpec().getHouseLevel() == level4grow ) { if( house->getSize().getWidth() > 1 ) //bigger house near, can't grow { mayGrow = false; break; } } else { mayGrow = false; //no house near, can't grow break; } } if( mayGrow ) { int sumHabitants = getNbHabitants(); int sumFreeWorkers = _d->freeWorkersCount; PtrTilesList::iterator delIt=tiles.begin(); delIt++; //don't remove himself for( ; delIt != tiles.end(); delIt++ ) { HousePtr house = (*delIt)->getTerrain().getOverlay().as<House>(); if( house.isValid() ) { house->deleteLater(); house->_d->currentHabitants = 0; sumHabitants += house->getNbHabitants(); sumFreeWorkers += house->_d->freeWorkersCount; } } _d->currentHabitants = sumHabitants; _d->freeWorkersCount = sumFreeWorkers; _d->houseLevelSpec = HouseSpecHelper::getInstance().getHouseLevelSpec(_d->houseLevel); _d->nextHouseLevelSpec = _d->houseLevelSpec.next(); _update(); _updateDesirabilityInfluence( Construction::duNegative ); setSize( getSize() + Size(1) ); build( getTile().getIJ() ); } } _updateDesirabilityInfluence( Construction::duNegative ); _d->desirability = desirability; _updateDesirabilityInfluence( Construction::duPositive ); bool bigSize = getSize().getWidth() > 1; _d->houseId = bigSize ? startBigPic : startSmallPic; _d->picIdOffset = bigSize ? 0 : ( (rand() % 10 > 6) ? 1 : 0 ); }