Exemple #1
0
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;
}
Exemple #2
0
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);
      }
   }
}