2019-01-15 05:00:00 +02:00
/*
* PathfinderUtil . h , part of VCMI engine
*
* Authors : listed in file AUTHORS in main folder
*
* License : GNU General Public License v2 .0 or later
* Full text of license available in license . txt file , in main folder
*
*/
# pragma once
# include "mapping/CMapDefines.h"
# include "CGameState.h"
namespace PathfinderUtil
{
2022-09-18 16:39:10 +02:00
using FoW = std : : shared_ptr < const boost : : multi_array < ui8 , 3 > > ;
2019-01-15 05:00:00 +02:00
using ELayer = EPathfindingLayer ;
template < EPathfindingLayer : : EEPathfindingLayer layer >
2022-09-18 16:39:10 +02:00
CGPathNode : : EAccessibility evaluateAccessibility ( const int3 & pos , const TerrainTile * tinfo , FoW fow , const PlayerColor player , const CGameState * gs )
2019-01-15 05:00:00 +02:00
{
2022-09-18 16:39:10 +02:00
if ( ! ( * fow ) [ pos . z ] [ pos . x ] [ pos . y ] )
2019-01-15 05:00:00 +02:00
return CGPathNode : : BLOCKED ;
switch ( layer )
{
case ELayer : : LAND :
case ELayer : : SAIL :
if ( tinfo - > visitable )
{
if ( tinfo - > visitableObjects . front ( ) - > ID = = Obj : : SANCTUARY & & tinfo - > visitableObjects . back ( ) - > ID = = Obj : : HERO & & tinfo - > visitableObjects . back ( ) - > tempOwner ! = player ) //non-owned hero stands on Sanctuary
{
return CGPathNode : : BLOCKED ;
}
else
{
for ( const CGObjectInstance * obj : tinfo - > visitableObjects )
{
if ( obj - > blockVisit )
return CGPathNode : : BLOCKVIS ;
else if ( obj - > passableFor ( player ) )
return CGPathNode : : ACCESSIBLE ;
else if ( obj - > ID ! = Obj : : EVENT )
return CGPathNode : : VISITABLE ;
}
}
}
else if ( tinfo - > blocked )
{
return CGPathNode : : BLOCKED ;
}
else if ( gs - > guardingCreaturePosition ( pos ) . valid ( ) )
{
// Monster close by; blocked visit for battle
return CGPathNode : : BLOCKVIS ;
}
break ;
case ELayer : : WATER :
2022-06-20 16:39:50 +02:00
if ( tinfo - > blocked | | tinfo - > terType . isLand ( ) )
2019-01-15 05:00:00 +02:00
return CGPathNode : : BLOCKED ;
break ;
case ELayer : : AIR :
2022-06-20 16:39:50 +02:00
if ( tinfo - > blocked | | tinfo - > terType . isLand ( ) )
2019-01-15 05:00:00 +02:00
return CGPathNode : : FLYABLE ;
break ;
}
return CGPathNode : : ACCESSIBLE ;
}
}