void WalkerPrefect::_checkPath2NearestFire( const ReachedBuildings& buildings )
{
  PathWay bestPath;
  int minLength = 9999;
  for( ReachedBuildings::const_iterator itBuilding = buildings.begin(); 
       itBuilding != buildings.end(); ++itBuilding)
  {
    if( (*itBuilding)->getType() != B_BURNING_RUINS )
      continue;

    PathWay tmp;
    bool foundPath = Pathfinder::getInstance().getPath( getIJ(), (*itBuilding)->getTile().getIJ(), tmp, 
                                                        false, Size( 0 ) ); 
    if( foundPath && tmp.getLength() < minLength )
    {
      bestPath = tmp;
      minLength = tmp.getLength();
      
      if( tmp.getLength() == 1 )
        break;
    }
  }

  if( bestPath.getLength() > 0 )
  {
    _pathWay = bestPath;
    _pathWay.begin();
  }
}
void TaxCollector::onMidTile()
{
  ServiceWalker::onMidTile();

  ReachedBuildings buildings = getReachedBuildings( getIJ() );
  for( ReachedBuildings::iterator it=buildings.begin(); it != buildings.end(); it++ )
  {
    HousePtr house = (*it).as<House>();
    if( house.isValid() )
    {
      int money = house->collectTaxes();
      _d->money += money;
      _d->peoplesReached += money > 0 ? house->getNbHabitants() : 0;
    }
  }
}
void WalkerPrefect::onMidTile()
{
  ReachedBuildings reachedBuildings;
  TilePos firePos;
  bool haveBurningRuinsNear = _looks4Fire( reachedBuildings, firePos );  
  bool isDestination = _pathWay.isDestination();

  switch( _d->action )
  {
  case Impl::patrol:
    {
      if( haveBurningRuinsNear )
      {
        //tell our prefecture that need send prefect with water to fight with fire
        //on next deliverService

        //found fire, no water, go prefecture
        getBase().as<BuildingPrefect>()->fireDetect( firePos );         
        _back2Prefecture();

        Walker::onNewDirection();
      }
      else
      {
        for( ReachedBuildings::iterator itBuilding = reachedBuildings.begin(); 
             itBuilding != reachedBuildings.end(); ++itBuilding)
        {
          (*itBuilding)->applyService( ServiceWalkerPtr( this ) );
        }
      }

      if( isDestination )
      {
        _back2Prefecture();
      }

      Walker::onMidTile();
    }
  break;

  case Impl::back2Prefecture:
    {
      if( haveBurningRuinsNear )
      {
        //tell our prefecture that need send prefect with water to fight with fire
        //on next deliverService
        getBase().as<BuildingPrefect>()->fireDetect( firePos );        
      }

      if( isDestination )
      {
        deleteLater();
        _d->action = Impl::doNothing;
      }

      Walker::onMidTile();
    }
  break;

  case Impl::gotoFire:
    {
      if( _pathWay.getDestination().getIJ().distanceFrom( getIJ() ) < 1.5f )
      {
        LandOverlayPtr overlay = _pathWay.getDestination().get_terrain().getOverlay();
        BurningRuinsPtr bruins = overlay.as<BurningRuins>();
        if( bruins.isValid() )
        {
          _d->action = Impl::fightFire;     
          _walkerGraphic = WG_PREFECT_FIGHTS_FIRE;
          Walker::onNewDirection();
          isDestination = false;
        }
      }
      
      if( isDestination )
      {
        if( !haveBurningRuinsNear || _d->water == 0 ) 
        {
          _back2Prefecture();
        }
        else
        {
          _walkerGraphic = WG_PREFECT_DRAG_WATER;
          _d->action = Impl::gotoFire;

          _checkPath2NearestFire( reachedBuildings );
          Walker::onNewDirection();
        }
      }
     
      Walker::onMidTile();
    }
  break;

  case Impl::fightFire:
  break;
  }
}