void Unemployed::drawTile(Engine& engine, Tile& tile, const Point& offset) { Point screenPos = tile.mappos() + offset; if( tile.overlay().isNull() ) { //draw background //engine.draw( tile.picture(), screenPos ); drawPass( engine, tile, offset, Renderer::ground ); drawPass( engine, tile, offset, Renderer::groundAnimation ); } else { bool needDrawAnimations = false; OverlayPtr overlay = tile.overlay(); WorkingBuildingPtr workBuilding = overlay.as<WorkingBuilding>(); int worklessPercent = 0; if( _isVisibleObject( overlay->type() ) ) { needDrawAnimations = true; } else if( overlay->type() == object::house ) { HousePtr house = overlay.as<House>(); int worklessNumber = (int)house->getServiceValue( Service::recruter ); int matureNumber = (int)house->habitants().mature_n(); worklessPercent = math::percentage( worklessNumber, matureNumber ); needDrawAnimations = (house->spec().level() == 1) && house->habitants().empty(); if( !needDrawAnimations ) { drawArea( engine, overlay->area(), offset, ResourceGroup::foodOverlay, OverlayPic::inHouseBase ); } } else if( workBuilding.isValid() ) { worklessPercent = math::percentage( workBuilding->needWorkers(), workBuilding->maximumWorkers() ); needDrawAnimations = workBuilding->needWorkers() > 0; if( !needDrawAnimations ) drawArea( engine, overlay->area(), offset, ResourceGroup::foodOverlay, OverlayPic::base ); } if( needDrawAnimations ) { Layer::drawTile( engine, tile, offset ); registerTileForRendering( tile ); } else if( worklessPercent > 0 ) { drawColumn( engine, screenPos, worklessPercent ); } } tile.setWasDrawn(); }
void Unemployed::handleEvent(NEvent& event) { if( event.EventType == sEventMouse ) { switch( event.mouse.type ) { case mouseMoved: { Tile* tile = _camera()->at( event.mouse.pos(), false ); // tile under the cursor (or NULL) std::string text = ""; if( tile != 0 ) { HousePtr house = tile->overlay().as<House>(); WorkingBuildingPtr workBuilding = tile->overlay().as<WorkingBuilding>(); if( house.isValid() ) { int workless = house->getServiceValue( Service::recruter ); if( workless > 0 ) text = utils::format( 0xff, "%s %d %s", _("##this_house_have##"), workless, _("##unemployers##") ); else text = "##this_house_haveno_unemployers##"; } else if( workBuilding.isValid() ) { int need = workBuilding->needWorkers(); if( need > 0 ) text = utils::format( 0xff, "%s %d %s", _("##this_building_need##"), need, _("##workers##") ); else text = "##this_building_have_all_workers##"; } } _setTooltipText( text ); } break; default: break; } } Layer::handleEvent( event ); }
void WorkersHire::Impl::hireWorkers(PlayerCityPtr city, WorkingBuildingPtr bld) { if( excludeTypes.count( bld->type() ) > 0 ) return; if( bld->numberWorkers() == bld->maximumWorkers() ) return; if( haveRecruter( bld ) ) return; if( bld->roadside().size() > 0 ) { RecruterPtr hr = Recruter::create( city ); hr->setPriority( priorities ); hr->setMaxDistance( distance ); hr->send2City( bld, bld->needWorkers() ); } }