void TaxCollector::_centerTile() { Walker::_centerTile(); int difficulty = SETTINGS_VALUE(difficulty); float multiply = 1.0f; switch (difficulty) { case 0: multiply = 3.0f; break; case 1: multiply = 2.0f; break; case 2: multiply = 1.5f; break; case 3: multiply = 1.0f; break; case 4: multiply = 0.75f; break; } ReachedBuildings buildings = getReachedBuildings( pos() ); foreach( it, buildings ) { HousePtr house = ptr_cast<House>( *it ); if( house.isValid() ) { float tax = house->collectTaxes() * multiply; _d->money += tax; house->applyService( this ); std::string posStr = utils::format( 0xff, "%02dx%02d", house->pos().i(), house->pos().j() ); _d->history[ posStr ] += tax; } }
bool Emigrant::_checkNearestHouse() { city::Helper helper( _city() ); for( int k=1; k < 3; k++ ) { TilePos offset( k, k ); HouseList houses = helper.find<House>( building::house, pos()-offset, pos() + offset ); std::map< int, HousePtr > vacantRoomPriority; foreach( it, houses ) { HousePtr house = *it; unsigned int freeRoom = house->maxHabitants() - house->habitants().count(); vacantRoomPriority[ 1000 - freeRoom ] = house; } foreach( it, vacantRoomPriority ) //have destination { HousePtr house = it->second; int freeRoom = house->maxHabitants() - house->habitants().count(); if( freeRoom > 0 ) { Pathway pathway = PathwayHelper::create( pos(), house->pos(), makeDelegate( _d.data(), &Impl::mayWalk ) ); _updatePathway( pathway ); go(); return true; } }
Pathway Emigrant::_findSomeWay( TilePos startPoint ) { HousePtr house = _findBlankHouse(); _d->failedWayCount++; Pathway pathway; if( house.isValid() ) { pathway = PathwayHelper::create( startPoint, house->pos(), PathwayHelper::roadFirst ); if( !pathway.isValid() ) { pathway = PathwayHelper::create( startPoint, ptr_cast<Construction>(house), PathwayHelper::roadFirst ); } if( pathway.isValid() ) { _lockHouse( house ); } } if( !pathway.isValid() || _d->failedWayCount > 10 ) { pathway = PathwayHelper::create( startPoint, _city()->borderInfo().roadExit, PathwayHelper::allTerrain ); } return pathway; }
foreach( it, buildings ) { if( (*it)->type() == object::house ) { HousePtr house = it->as<House>(); TilePos pos = house->pos(); int hash = (pos.i() << 8) | pos.i(); _d->servedHouses[ hash ] = house->habitants().count(); } }
void Emigrant::_lockHouse( HousePtr house ) { if( _d->housePosLock.i() >= 0 ) { HousePtr oldHouse = ptr_cast<House>( _city()->tilemap().at( _d->housePosLock ).overlay() ); if( oldHouse.isValid() ) { _d->housePosLock = TilePos( -1, -1 ); oldHouse->setState( House::settleLock, 0 ); } } if( house.isValid() ) { _d->housePosLock = house->pos(); house->setState( House::settleLock, TileHelper::hash( _d->housePosLock ) ); } }