void House::_tryDegrage_11_to_2_lvl( int smallPic, int bigPic, const char desirability ) { bool bigSize = getSize().getWidth() > 1; _d->houseId = bigSize ? bigPic : smallPic; _d->picIdOffset = bigSize ? 0 : ( rand() % 10 > 6 ? 1 : 0 ); _updateDesirabilityInfluence( Construction::duNegative ); _d->desirability = desirability; _updateDesirabilityInfluence( Construction::duPositive ); }
void Construction::destroy() { LandOverlay::destroy(); _updateDesirabilityInfluence( false ); }
void Construction::build(const TilePos& pos ) { LandOverlay::build( pos ); computeAccessRoads(); _updateDesirabilityInfluence( true ); }
void House::_tryUpdate_1_to_11_lvl( int level4grow, int startSmallPic, int startBigPic, const char desirability ) { if( getSize() == 1 ) { Tilemap& tmap = _getCity()->getTilemap(); TilemapTiles area = tmap.getFilledRectangle( getTile().getIJ(), Size(2) ); bool mayGrow = true; foreach( Tile* tile, area ) { if( tile == NULL ) { mayGrow = false; //some broken, can't grow break; } HousePtr house = tile->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; TilemapTiles::iterator delIt=area.begin(); HousePtr selfHouse = (*delIt)->getOverlay().as<House>(); delIt++; //don't remove himself for( ; delIt != area.end(); delIt++ ) { HousePtr house = (*delIt)->getOverlay().as<House>(); if( house.isValid() ) { house->deleteLater(); house->_d->currentHabitants = 0; sumHabitants += house->getNbHabitants(); sumFreeWorkers += house->_d->freeWorkersCount; selfHouse->getGoodStore().storeAll( house->getGoodStore() ); } } _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( _getCity(), getTile().getIJ() ); } }
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 ); }