mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-26 22:57:00 +02:00
77 lines
1.8 KiB
C
77 lines
1.8 KiB
C
|
/*
|
||
|
* 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
|
||
|
{
|
||
|
using FoW = std::vector<std::vector<std::vector<ui8> > >;
|
||
|
using ELayer = EPathfindingLayer;
|
||
|
|
||
|
template<EPathfindingLayer::EEPathfindingLayer layer>
|
||
|
CGPathNode::EAccessibility evaluateAccessibility(const int3 & pos, const TerrainTile * tinfo, const FoW & fow, const PlayerColor player, const CGameState * gs)
|
||
|
{
|
||
|
if(!fow[pos.x][pos.y][pos.z])
|
||
|
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:
|
||
|
if(tinfo->blocked || tinfo->terType != ETerrainType::WATER)
|
||
|
return CGPathNode::BLOCKED;
|
||
|
|
||
|
break;
|
||
|
|
||
|
case ELayer::AIR:
|
||
|
if(tinfo->blocked || tinfo->terType == ETerrainType::WATER)
|
||
|
return CGPathNode::FLYABLE;
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return CGPathNode::ACCESSIBLE;
|
||
|
}
|
||
|
}
|