void WalkerPrefect::onMidTile() { ReachedBuildings reachedBuildings; TilePos firePos; bool haveBurningRuinsNear = _looks4Fire( reachedBuildings, firePos ); bool isDestination = _getPathway().isDestination(); switch( _d->action ) { case Impl::doNothing: break; 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<Prefecture>()->fireDetect( firePos ); _back2Prefecture(); Walker::onNewDirection(); } else { foreach( BuildingPtr building, reachedBuildings ) { building->applyService( ServiceWalkerPtr( this ) ); HousePtr house = building.as<House>(); if( house.isValid() && house->getHealthLevel() < 1 ) { house->deleteLater(); GameEventMgr::append( DisasterEvent::create( house->getTilePos(), DisasterEvent::plague ) ); } } } 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<Prefecture>()->fireDetect( firePos ); } if( isDestination ) { deleteLater(); _d->action = Impl::doNothing; } Walker::onMidTile(); } break; case Impl::gotoFire: { if( _getPathway().getDestination().getIJ().distanceFrom( getIJ() ) < 1.5f ) { LandOverlayPtr overlay = _getPathway().getDestination().getOverlay(); if( overlay.isValid() && overlay->getType() == B_BURNING_RUINS ) { _d->action = Impl::fightFire; _setGraphic( WG_PREFECT_FIGHTS_FIRE ); Walker::onNewDirection(); isDestination = false; } } if( isDestination ) { if( !haveBurningRuinsNear || _d->water == 0 ) { _back2Prefecture(); } else { _setGraphic( WG_PREFECT_DRAG_WATER ); _d->action = Impl::gotoFire; _checkPath2NearestFire( reachedBuildings ); Walker::onNewDirection(); } } Walker::onMidTile(); } break; case Impl::fightFire: break; }
void LayerHealth::drawTile(GfxEngine& engine, Tile& tile, Point offset) { Point screenPos = tile.getXY() + offset; tile.setWasDrawn(); bool needDrawAnimations = false; if( tile.getOverlay().isNull() ) { //draw background engine.drawPicture( tile.getPicture(), screenPos ); } else { TileOverlayPtr overlay = tile.getOverlay(); int healthLevel = -1; switch( overlay->getType() ) { //fire buildings and roads case construction::road: case construction::B_PLAZA: needDrawAnimations = true; engine.drawPicture( tile.getPicture(), screenPos ); break; case building::B_DOCTOR: case building::B_HOSPITAL: case building::B_BARBER: case building::B_BATHS: needDrawAnimations = _flags.count( overlay->getType() ); if( needDrawAnimations ) { engine.drawPicture( tile.getPicture(), screenPos ); } else { CityHelper helper( _city ); drawArea( engine, helper.getArea( overlay ), offset, ResourceGroup::foodOverlay, OverlayPic::base ); } break; //houses case building::house: { HousePtr house = overlay.as< House >(); if( _flags.count( building::B_DOCTOR ) ) { healthLevel = house->getHealthLevel(); } else if( _flags.count( building::B_HOSPITAL ) ) { healthLevel = house->getServiceValue( Service::hospital ); } else if( _flags.count( building::B_BARBER ) ) { healthLevel = house->getServiceValue( Service::barber ); } else if( _flags.count( building::B_BATHS ) ) { healthLevel = house->getServiceValue( Service::baths ); } needDrawAnimations = (house->getSpec().getLevel() == 1) && (house->getHabitants().size() == 0); CityHelper helper( _city ); drawArea( engine, helper.getArea( overlay ), offset, ResourceGroup::foodOverlay, OverlayPic::inHouseBase ); } break; //other buildings default: { CityHelper helper( _city ); drawArea( engine, helper.getArea( overlay ), offset, ResourceGroup::foodOverlay, OverlayPic::base ); } break; } if( needDrawAnimations ) { _renderer->registerTileForRendering( tile ); } else if( healthLevel > 0 ) { drawColumn( engine, screenPos, 9, healthLevel ); } } }