void BurningRuins::applyService(ServiceWalkerPtr walker) { if ( S_PREFECT == walker->getService() ) { _fireLevel = math::clamp<float>( _fireLevel - walker->getServiceValue(), 0.f, 100.f ); } }
void BurningRuins::applyService(ServiceWalkerPtr walker) { if ( Service::prefect == walker->getService() ) { double newValue = math::clamp<float>( getState( Construction::fire ) - walker->getServiceValue(), 0.f, 100.f ); updateState( Construction::fire, newValue, false ); } }
float House::evaluateService(ServiceWalkerPtr walker) { float res = 0.0; ServiceType service = walker->getService(); if( _reservedServices.count(service) == 1 ) { // service is already reserved return 0.0; } switch(service) { case S_ENGINEER: res = _damageLevel; break; case S_PREFECT: res = _fireLevel; break; // this house pays taxes case S_FORUM: case S_SENATE: res = _d->mayPayTax() ? (float)_d->getAvailableTax() : 0.f; break; case S_MARKET: { MarketPtr market = walker->getBase().as<Market>(); GoodStore &marketStore = market->getGoodStore(); GoodStore &houseStore = getGoodStore(); for (int i = 0; i < G_MAX; ++i) { GoodType goodType = (GoodType) i; int houseQty = houseStore.getCurrentQty(goodType); int houseSafeQty = _d->houseLevelSpec.computeMonthlyConsumption(*this, goodType) + _d->nextHouseLevelSpec.computeMonthlyConsumption(*this, goodType); int marketQty = marketStore.getCurrentQty(goodType); if (houseQty < houseSafeQty && marketQty > 0) { res += std::min(houseSafeQty - houseQty, marketQty); } } } break; case S_WORKERS_HUNTER: { res = (float)_d->freeWorkersCount; } break; default: { return _d->houseLevelSpec.evaluateServiceNeed(*this, service); } break; } // std::cout << "House evaluateService " << service << "=" << res << std::endl; return res; }
void BuildingFountain::deliverService() { ServiceWalkerPtr walker = ServiceWalker::create( BuildingPtr( this ), getService()); ServiceWalker::ReachedBuildings reachedBuildings = walker->getReachedBuildings( getTile().getIJ() ); for( ServiceWalker::ReachedBuildings::iterator itBuilding = reachedBuildings.begin(); itBuilding != reachedBuildings.end(); ++itBuilding) { (*itBuilding)->applyService( walker ); } }
void ServiceBuilding::deliverService() { // make a service walker and send him to his wandering ServiceWalkerPtr serviceman = ServiceWalker::create( BuildingPtr( this ),_service); serviceman->send2City(); if( !serviceman->isDeleted() ) _addWalker( serviceman.as<Walker>() ); }
void Well::deliverService() { ServiceWalkerPtr walker = ServiceWalker::create( _getCity(), getService() ); walker->setBase( BuildingPtr( this ) ); ServiceWalker::ReachedBuildings reachedBuildings = walker->getReachedBuildings( getTile().getIJ() ); foreach( BuildingPtr building, reachedBuildings) { building->applyService( walker ); }
void ServiceBuilding::deliverService() { // make a service walker and send him to his wandering ServiceWalkerPtr serviceman = ServiceWalker::create( _getCity(), getService() ); serviceman->setMaxDistance( getWalkerDistance() ); serviceman->send2City( BuildingPtr( this ) ); if( !serviceman->isDeleted() ) { addWalker( serviceman.as<Walker>() ); } }
float BurningRuins::evaluateService( ServiceWalkerPtr walker ) { if ( Service::prefect == walker->getService() ) { return getState( Construction::fire ) * 2; } return 0; }
void Building::applyService( ServiceWalkerPtr walker) { // std::cout << "apply service" << std::endl; // remove service reservation Service::Type service = walker->getService(); _reservedServices.erase(service); switch( service ) { case Service::engineer: updateState( Construction::damage, 0, false ); break; case Service::prefect: updateState( Construction::fire, 0, false ); break; default: break; } }
float Building::evaluateService(ServiceWalkerPtr walker) { float res = 0.0; Service::Type service = walker->getService(); if (_reservedServices.count(service) == 1) { // service is already reserved return 0.0; } switch(service) { case Service::engineer: res = getState( Construction::damage ); break; case Service::prefect: res = getState( Construction::fire ); break; default: break; } return res; }
void Building::applyService( ServiceWalkerPtr walker) { // std::cout << "apply service" << std::endl; // remove service reservation ServiceType service = walker->getService(); _reservedServices.erase(service); switch( service ) { case S_ENGINEER: { _damageLevel = 0; } break; case S_PREFECT: { _fireLevel = 0; } break; } }
void Forum::applyService(ServiceWalkerPtr walker) { switch( walker->type() ) { case walker::taxCollector: { TaxCollectorPtr txcl = ptr_cast<TaxCollector>( walker ); if( txcl.isValid() ) { float tax = txcl->takeMoney();; _d->taxValue += tax; Logger::warning( "Forum: collect money %f. All money %f", tax, _d->taxValue ); } } break; default: break; } ServiceBuilding::applyService( walker ); }
float Building::evaluateService(ServiceWalkerPtr walker) { float res = 0.0; ServiceType service = walker->getService(); if (_reservedServices.count(service) == 1) { // service is already reserved return 0.0; } switch(service) { case S_ENGINEER: res = _damageLevel; break; case S_PREFECT: res = _fireLevel; break; } return res; }
void House::buyMarket( ServiceWalkerPtr walker ) { // std::cout << "House buyMarket" << std::endl; MarketPtr market = walker->getBase().as<Market>(); GoodStore& marketStore = market->getGoodStore(); GoodStore &houseStore = getGoodStore(); for (int i = 0; i < G_MAX; ++i) { GoodType goodType = (GoodType) i; int houseQty = houseStore.getCurrentQty(goodType); int houseSafeQty = _d->houseLevelSpec.computeMonthlyConsumption(*this, goodType) + _d->nextHouseLevelSpec.computeMonthlyConsumption(*this, goodType); int marketQty = marketStore.getCurrentQty(goodType); if (houseQty < houseSafeQty && marketQty > 0) { int qty = std::min(houseSafeQty - houseQty, marketQty); GoodStock stock(goodType, qty); marketStore.retrieve(stock, qty); houseStore.store(stock, qty); } } }
void House::applyService( ServiceWalkerPtr walker ) { Building::applyService(walker); // handles basic services, and remove service reservation ServiceType service = walker->getService(); switch (service) { case S_WELL: case S_FOUNTAIN: case S_TEMPLE_NEPTUNE: case S_TEMPLE_CERES: case S_TEMPLE_VENUS: case S_TEMPLE_MARS: case S_TEMPLE_MERCURE: case S_DOCTOR: case S_BARBER: case S_BATHS: case S_HOSPITAL: case S_SCHOOL: case S_LIBRARY: case S_COLLEGE: case S_THEATER: case S_AMPHITHEATER: case S_COLLOSSEUM: case S_HIPPODROME: setServiceAccess(service, 100); break; case S_MARKET: buyMarket(walker); break; case S_SENATE: case S_FORUM: setServiceAccess(service, 100); break; case S_TEMPLE_ORACLE: case S_ENGINEER: case S_PREFECT: case S_MAX: break; case S_WORKERS_HUNTER: { if( !_d->freeWorkersCount ) break; WorkersHunterPtr hunter = walker.as<WorkersHunter>(); if( hunter.isValid() ) { int hiredWorkers = math::clamp( _d->freeWorkersCount, 0, hunter->getWorkersNeeded() ); _d->freeWorkersCount -= hiredWorkers; hunter->hireWorkers( hiredWorkers ); } } break; default: break; } }