GuiInfoBox* create( Widget* parent, const Tile& tile ) { HousePtr house = tile.getTerrain().getOverlay().as<House>(); if( house->getNbHabitants() > 0 ) { return new InfoBoxHouse( parent, tile ); } else { return new InfoBoxFreeHouse( parent, tile ); } }
void TaxCollector::onMidTile() { ServiceWalker::onMidTile(); ReachedBuildings buildings = getReachedBuildings( getIJ() ); for( ReachedBuildings::iterator it=buildings.begin(); it != buildings.end(); it++ ) { HousePtr house = (*it).as<House>(); if( house.isValid() ) { int money = house->collectTaxes(); _d->money += money; _d->peoplesReached += money > 0 ? house->getNbHabitants() : 0; } } }
void CityServiceEmigrant::update( const unsigned int time ) { if( time % 44 != 1 ) return; unsigned int vacantPop=0; LandOverlays houses = _d->city->getBuildingList(B_HOUSE); for( LandOverlays::iterator itHouse = houses.begin(); itHouse != houses.end(); ++itHouse ) { HousePtr house = (*itHouse).as<House>(); if( house.isValid() && house->getAccessRoads().size() > 0 ) { vacantPop += math::clamp( house->getMaxHabitants() - house->getNbHabitants(), 0, 0xff ); } } if( vacantPop == 0 ) { return; } Walkers walkers = _d->city->getWalkerList( WT_EMIGRANT ); if( vacantPop <= walkers.size() * 5 ) { return; } Tile& roadTile = _d->city->getTilemap().at( _d->city->getRoadEntry() ); EmigrantPtr emigrant = Emigrant::create( _d->city ); if( emigrant.isValid() ) { emigrant->send2City( roadTile ); } }
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::_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 ); }