コード例 #1
0
void BurningRuins::applyService(ServiceWalkerPtr walker)
{
  if ( S_PREFECT == walker->getService() )
  {
    _fireLevel = math::clamp<float>( _fireLevel - walker->getServiceValue(), 0.f, 100.f );
  }
}
コード例 #2
0
ファイル: ruins.cpp プロジェクト: BlackFoks/opencaesar3
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 );
  }
}
コード例 #3
0
ファイル: oc3_house.cpp プロジェクト: akuskis/opencaesar3
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;
}
コード例 #4
0
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 );
  }
}
コード例 #5
0
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>() );
}
コード例 #6
0
ファイル: well.cpp プロジェクト: BlackFoks/opencaesar3
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 );
  }
コード例 #7
0
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>() );
  }
}
コード例 #8
0
ファイル: ruins.cpp プロジェクト: BlackFoks/opencaesar3
float BurningRuins::evaluateService( ServiceWalkerPtr walker )
{
  if ( Service::prefect == walker->getService() )
  {
    return getState( Construction::fire ) * 2;
  }

  return 0;
}
コード例 #9
0
ファイル: building.cpp プロジェクト: dalerank/opencaesar3
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;
   }
}
コード例 #10
0
ファイル: building.cpp プロジェクト: dalerank/opencaesar3
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;
}
コード例 #11
0
ファイル: oc3_building.cpp プロジェクト: LMG/opencaesar3
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;
   }
}
コード例 #12
0
ファイル: forum.cpp プロジェクト: Ecordonnier/caesaria-game
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 );
}
コード例 #13
0
ファイル: oc3_building.cpp プロジェクト: LMG/opencaesar3
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;
}
コード例 #14
0
ファイル: oc3_house.cpp プロジェクト: akuskis/opencaesar3
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);
      }
   }
}
コード例 #15
0
ファイル: oc3_house.cpp プロジェクト: akuskis/opencaesar3
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;
  }
}