void WalkerPrefect::_checkPath2NearestFire( const ReachedBuildings& buildings ) { PathWay bestPath; int minLength = 9999; for( ReachedBuildings::const_iterator itBuilding = buildings.begin(); itBuilding != buildings.end(); ++itBuilding) { if( (*itBuilding)->getType() != B_BURNING_RUINS ) continue; PathWay tmp; bool foundPath = Pathfinder::getInstance().getPath( getIJ(), (*itBuilding)->getTile().getIJ(), tmp, false, Size( 0 ) ); if( foundPath && tmp.getLength() < minLength ) { bestPath = tmp; minLength = tmp.getLength(); if( tmp.getLength() == 1 ) break; } } if( bestPath.getLength() > 0 ) { _pathWay = bestPath; _pathWay.begin(); } }
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 WalkerPrefect::onMidTile() { ReachedBuildings reachedBuildings; TilePos firePos; bool haveBurningRuinsNear = _looks4Fire( reachedBuildings, firePos ); bool isDestination = _pathWay.isDestination(); switch( _d->action ) { case Impl::patrol: { if( haveBurningRuinsNear ) { //tell our prefecture that need send prefect with water to fight with fire //on next deliverService //found fire, no water, go prefecture getBase().as<BuildingPrefect>()->fireDetect( firePos ); _back2Prefecture(); Walker::onNewDirection(); } else { for( ReachedBuildings::iterator itBuilding = reachedBuildings.begin(); itBuilding != reachedBuildings.end(); ++itBuilding) { (*itBuilding)->applyService( ServiceWalkerPtr( this ) ); } } if( isDestination ) { _back2Prefecture(); } Walker::onMidTile(); } break; case Impl::back2Prefecture: { if( haveBurningRuinsNear ) { //tell our prefecture that need send prefect with water to fight with fire //on next deliverService getBase().as<BuildingPrefect>()->fireDetect( firePos ); } if( isDestination ) { deleteLater(); _d->action = Impl::doNothing; } Walker::onMidTile(); } break; case Impl::gotoFire: { if( _pathWay.getDestination().getIJ().distanceFrom( getIJ() ) < 1.5f ) { LandOverlayPtr overlay = _pathWay.getDestination().get_terrain().getOverlay(); BurningRuinsPtr bruins = overlay.as<BurningRuins>(); if( bruins.isValid() ) { _d->action = Impl::fightFire; _walkerGraphic = WG_PREFECT_FIGHTS_FIRE; Walker::onNewDirection(); isDestination = false; } } if( isDestination ) { if( !haveBurningRuinsNear || _d->water == 0 ) { _back2Prefecture(); } else { _walkerGraphic = WG_PREFECT_DRAG_WATER; _d->action = Impl::gotoFire; _checkPath2NearestFire( reachedBuildings ); Walker::onNewDirection(); } } Walker::onMidTile(); } break; case Impl::fightFire: break; } }