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 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); } } }