void Migration::citizenLeaveCity(WalkerPtr walker) { EmigrantPtr emigrant = ptr_cast<Emigrant>( walker ); if( emigrant.isValid() ) { _d->lastMonthLeaving += emigrant->peoples().count(); } }
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 ); } }