Пример #1
0
void FishPlace::timeStep(const unsigned long time)
{
  _getAnimation().update( time );

  _d->animations[ 0 ] = _getAnimation().getFrame();

  if( _d->walker != 0 )
  {
    TilePos lastPos = _d->walker->getIJ();
    _d->walker->timeStep( time );

    if( lastPos != _d->walker->getIJ() )
    {
      getTile().setOverlay( 0 );
      getTile().setPicture( _d->savePicture );

      TilePos pos =  _d->walker->getIJ();

      _d->savePicture = &_getCity()->getTilemap().at( pos ).getPicture();
      setPicture( *_d->savePicture );

      TileOverlay::build( _getCity(), pos );
    }
    else if( lastPos == _d->walker->getPathway().getDestination().getIJ() )
    {
      deleteLater();
    }
  }
  else
  {
    Pathway pathway;
    bool pathFound = Pathfinder::getInstance().getPath( getTilePos(), _getCity()->getBorderInfo().boatExit,
                                                        pathway, Pathfinder::waterOnly, Size( 1 ) );

    if( !pathFound )
    {
      deleteLater();
    }
    else
    {
      _d->walker = WalkerPtr( new Walker( _getCity() ) );
      _d->walker->drop();
      _d->walker->setSpeed( 0.1f );
      _d->walker->setPathway( pathway );
      _d->walker->setIJ( getTilePos() );
      _d->walker->go();
    }
  }
}
Пример #2
0
void Prefecture::deliverService()
{
  if( getWorkers() > 0 && getWalkerList().size() == 0 )
  {
    bool fireDetect = _fireDetect.getI() >= 0;
    PrefectPtr walker = Prefect::create( _getCity() );
    walker->setMaxDistance( 26 );

    //bool patrol = true;
    if( fireDetect )
    {
      Pathway pathway;
      TilePos startPos = getAccessRoads().front()->getIJ();
      bool pathFounded = Pathfinder::getInstance().getPath( startPos, _fireDetect, pathway, false, Size( 0 ) );
      //patrol = !pathFounded;

      if( pathFounded )
      {
        walker->setPathway( pathway );
        walker->setIJ( pathway.getOrigin().getIJ() );
      }

      _fireDetect = TilePos( -1, -1 );
    }
    
    walker->send2City( PrefecturePtr( this ), fireDetect ? 200 : 0 );

    addWalker( walker.as<Walker>() );
  }
}
Пример #3
0
void Walker::load( const VariantMap& stream)
{
  Tilemap& tmap = _getCity()->getTilemap();

  _d->pathWay.init( tmap, tmap.at( 0, 0 ) );
  _d->pathWay.load( stream.get( "pathway" ).toMap() );
  _d->action.action = (Walker::Action) stream.get( "action" ).toInt();
  _d->action.direction = (DirectionType) stream.get( "direction" ).toInt();
  _d->pos = stream.get( "pos" ).toTilePos();
  _d->tileOffset = stream.get( "tileoffset" ).toPoint();
  _d->posOnMap = stream.get( "mappos" ).toPoint();
  _d->uid = (UniqueId)stream.get( "uid" ).toInt();
  _d->speedMultiplier = stream.get( "speedMul" ).toFloat();
  _d->name = stream.get( "name" ).toString();
  
  _OC3_DEBUG_BREAK_IF( _d->speedMultiplier < 0.1 );
  if( _d->speedMultiplier < 0.1 ) //Sometime this have this error in save file
  {
    _d->speedMultiplier = 1;
  }

  _d->speed = stream.get( "speed" ).toFloat();
  _d->midTilePos = stream.get( "midTile" ).toPoint();
  _d->remainMove = stream.get( "remainmove" ).toPointF();
}
Пример #4
0
void House::timeStep(const unsigned long time)
{
   if( _d->currentHabitants > 0 )
   {
     if( time % 16 == 0 )
     {
        // consume services
        for (int i = 0; i < Service::S_MAX; ++i)
        {
           Service::Type service = (Service::Type) i;
           _d->serviceAccess[service] = std::max(_d->serviceAccess[service] - 1, 0);
        }

        cancelService( Service::S_WORKERS_HUNTER );
        _d->updateHealthLevel();

        // consume goods
        for (int i = 0; i < Good::goodCount; ++i)
        {
           Good::Type goodType = (Good::Type) i;
           _d->goodStore.setCurrentQty( goodType, std::max( _d->goodStore.getCurrentQty(goodType) - 1, 0) );
        }
     }

     if( time % 64 == 0 )
     {
       bool validate = _d->houseLevelSpec.checkHouse( this );
       if (!validate)
       {
         levelDown();
       }
       else
       {
         _d->condition4Up = "";
         validate = _d->nextHouseLevelSpec.checkHouse( this, &_d->condition4Up );
         if( validate && _d->currentHabitants > 0 )
         {
            levelUp();
         }
       }

       int homeless = math::clamp( _d->currentHabitants - _d->maxHabitants, 0, 0xff );

       if( homeless > 0 )
       {
         _d->currentHabitants = math::clamp( _d->currentHabitants, 0, _d->maxHabitants );

         ImmigrantPtr im = Immigrant::create( _getCity() );
         im->setCapacity( homeless );
         im->send2City( getTile() );
       }
     }

     Building::timeStep( time );
   }
}
Пример #5
0
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 CartPusher::send2City( BuildingPtr building, GoodStock& carry )
{
  _d->stock.append( carry );
  setProducerBuilding( building  );

  computeWalkerDestination();

  if( !isDeleted() )
  {
    _getCity()->addWalker( this );
  }
}
Пример #7
0
void MarketLadyHelper::send2City( MarketPtr destination )
{
  if( destination.isValid() )
  {
    _d->marketPos = destination->getTilePos();
    _getCity()->addWalker( this );
  }
  else
  {
    deleteLater();
  }
}
Пример #8
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>() );
  }
}
void CartPusher::computeWalkerDestination()
{
   // get the list of buildings within reach
   PathWay pathWay;
   Propagator pathPropagator( _getCity() );
   _d->consumerBuilding = 0;

   if( _d->producerBuilding.isNull() )
   {
     StringHelper::debug( 0xff, "CartPusher destroyed: producerBuilding can't be NULL" );
     deleteLater();
     return;
   }

   pathPropagator.init( _d->producerBuilding.as<Construction>() );
   pathPropagator.propagate(_d->maxDistance);

   BuildingPtr destBuilding;
   if (destBuilding == NULL)
   {
      // try send that good to a factory
      destBuilding = _d->getWalkerDestination_factory(pathPropagator, pathWay);
   }

   if (destBuilding == NULL)
   {
      // try send that good to a granary
      destBuilding = _d->getWalkerDestination_granary(pathPropagator, pathWay);
   }

   if (destBuilding == NULL)
   {
      // try send that good to a warehouse
      destBuilding = _d->getWalkerDestination_warehouse( pathPropagator, pathWay );
   }

   if( destBuilding != NULL)
   {
      //_isDeleted = true;  // no destination!
     setConsumerBuilding( destBuilding );
     setPathWay( pathWay );
     setIJ( _getPathway().getOrigin().getIJ() );
     setSpeed( 1 );
   }
   else
   {
     _setDirection( D_NORTH );
     setSpeed( 0 );
     setIJ( _d->producerBuilding->getAccessRoads().front()->getIJ() );
     walk();
   }
}
Пример #10
0
void Forum::deliverService()
{
  if( getWorkers() > 0 && getWalkerList().size() == 0 )
  {
    TaxCollectorPtr walker = TaxCollector::create( _getCity() );
    walker->send2City( this );

    if( !walker->isDeleted() )
    {
      addWalker( walker.as<Walker>() );
    }
  }
}
void CartPusher::load( const VariantMap& stream )
{
  Walker::load( stream );

  _d->stock.load( stream.get( "stock" ).toList() );

  TilePos prPos( stream.get( "producerPos" ).toTilePos() );
  Tile& prTile = _getCity()->getTilemap().at( prPos );
  _d->producerBuilding = prTile.getOverlay().as<Building>();
  
  if( _d->producerBuilding.is<WorkingBuilding>() )
  {
    _d->producerBuilding.as<WorkingBuilding>()->addWalker( this );
  }

  TilePos cnsmPos( stream.get( "consumerPos" ).toTilePos() );
  Tile& cnsmTile = _getCity()->getTilemap().at( cnsmPos );
  _d->consumerBuilding = cnsmTile.getOverlay().as<Building>();

  _d->maxDistance = stream.get( "maxDistance" ).toInt();
  _d->reservationID = stream.get( "reservationID" ).toInt();
}
Пример #12
0
void MarketLadyHelper::onDestination()
{
  Walker::onDestination();

  deleteLater();

  CityHelper cityh( _getCity() );
  MarketPtr market = cityh.find< Market >( _d->marketPos );
  if( market.isValid() )
  {
    market->getGoodStore().store( _d->basket, _d->basket._currentQty );
  }
}
void LowBridge::destroy()
{ 
  for( LowBridgeSubTiles::iterator it=_d->subtiles.begin(); it != _d->subtiles.end(); it++ )
  {
    (*it)->_parent = 0;
    GameEventMgr::append( ClearLandEvent::create( (*it)->_pos ) );

    std::string picName = TileHelper::convId2PicName( (*it)->_imgId );

    Tile& mapTile = _getCity()->getTilemap().at( (*it)->_pos );
    mapTile.setPicture( &Picture::load( picName ) );
    TileHelper::decode( mapTile, (*it)->_info );
  }
}
Пример #14
0
void MarketLady::computeWalkerDestination( MarketPtr market )
{
  _d->market = market;
  std::list<Good::Type> priorityGoods = _d->market->getMostNeededGoods();

  _d->destBuildingPos = TilePos( -1, -1 );  // no destination yet

  if( priorityGoods.size() > 0 )
  {
     // we have something to buy!

     // get the list of buildings within reach
     PathWay pathWay;
     Propagator pathPropagator( _getCity() );
     pathPropagator.init( _d->market.as<Construction>() );
     pathPropagator.propagate( _d->maxDistance);

     // try to find the most needed good
     foreach( Good::Type goodType, priorityGoods )
     {
        _d->priorityGood = goodType;

        if( _d->priorityGood == Good::wheat || _d->priorityGood == Good::fish
            || _d->priorityGood == Good::meat || _d->priorityGood == Good::fruit
            || _d->priorityGood == Good::vegetable)
        {
           // try get that good from a granary
           _d->destBuildingPos = getWalkerDestination2<Granary>( pathPropagator, B_GRANARY, _d->market,
                                                              _d->basket, _d->priorityGood, pathWay, _d->reservationID );
        }
        else
        {
           // try get that good from a warehouse
           _d->destBuildingPos = getWalkerDestination2<Warehouse>( pathPropagator, B_WAREHOUSE, _d->market, 
                                                                _d->basket, _d->priorityGood, pathWay, _d->reservationID );
        }

        if( _d->destBuildingPos.getI() >= 0 )
        {
           // we found a destination!
           setPathWay(pathWay);
           break;
        }
     }
Пример #15
0
void TileOverlay::setPicture(Picture picture)
{
  _d->picture = picture;

  if (_d->masterTile != NULL)
  {
     Tilemap &tilemap = _getCity()->getTilemap();
     // _master_tile == NULL is cloneable buildings
     TilePos pos = _d->masterTile->getIJ();

     for (int dj = 0; dj<_d->size.getWidth(); ++dj)
     {
        for (int di = 0; di<_d->size.getHeight(); ++di)
        {
           Tile &tile = tilemap.at( pos + TilePos( di, dj ) );
           tile.setPicture( &_d->picture );
        }
     }
  }
}
Пример #16
0
void Granary::_tryDevastateGranary()
{
  //if granary in devastation mode need try send cart pusher with goods to other granary/warehouse/factory
  for( int goodType=Good::wheat; goodType <= Good::vegetable; goodType++ )
  {
    int goodQty = math::clamp( goodQty, 0, 400);

    if( goodQty > 0 )
    {
      GoodStock stock( (Good::Type)goodType, goodQty, goodQty);
      CartPusherPtr walker = CartPusher::create( _getCity() );
      walker->send2City( BuildingPtr( this ), stock );

      if( !walker->isDeleted() )
      {
        stock._currentQty = 0;
        _d->goodStore.retrieve( stock, goodQty );//setCurrentQty( (GoodType)goodType, goodQtyMax - goodQty );
        addWalker( walker.as<Walker>() );
        break;
      }
    }
  }   
}
Пример #17
0
unsigned int Senate::getFunds() const
{
  return _getCity()->getFunds().getValue();
}
Пример #18
0
void House::_tryUpdate_1_to_11_lvl( int level4grow, int startSmallPic, int startBigPic, const char desirability )
{       
  if( getSize() == 1 )
  {
    Tilemap& tmap = _getCity()->getTilemap();
    TilemapTiles area = tmap.getFilledRectangle( getTile().getIJ(), Size(2) );
    bool mayGrow = true;

    foreach( Tile* tile, area )
    {
      if( tile == NULL )
      {
        mayGrow = false;   //some broken, can't grow
        break;
      }

      HousePtr house = tile->getOverlay().as<House>();
      if( house != NULL && house->getLevelSpec().getHouseLevel() == level4grow )
      {
        if( house->getSize().getWidth() > 1 )  //bigger house near, can't grow
        {
          mayGrow = false;
          break;
        }            
      }
      else
      {
        mayGrow = false; //no house near, can't grow
        break;
      }
    }

    if( mayGrow )
    {
      int sumHabitants = getNbHabitants();
      int sumFreeWorkers = _d->freeWorkersCount;
      TilemapTiles::iterator delIt=area.begin();
      HousePtr selfHouse = (*delIt)->getOverlay().as<House>();

      delIt++; //don't remove himself
      for( ; delIt != area.end(); delIt++ )
      {
        HousePtr house = (*delIt)->getOverlay().as<House>();
        if( house.isValid() )
        {
          house->deleteLater();
          house->_d->currentHabitants = 0;

          sumHabitants += house->getNbHabitants();
          sumFreeWorkers += house->_d->freeWorkersCount;

          selfHouse->getGoodStore().storeAll( house->getGoodStore() );
        }
      }

      _d->currentHabitants = sumHabitants;
      _d->freeWorkersCount = sumFreeWorkers;
      _d->houseLevelSpec = HouseSpecHelper::getInstance().getHouseLevelSpec(_d->houseLevel);
      _d->nextHouseLevelSpec = _d->houseLevelSpec.next();

      _update();
      _updateDesirabilityInfluence( Construction::duNegative );
      setSize( getSize() + Size(1) );
      build( _getCity(), getTile().getIJ() );
    }
  }