1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-27 22:49:25 +02:00

Proof of concept with OH3 obstacles

This commit is contained in:
Tomasz Zieliński
2024-04-04 21:39:01 +02:00
parent c2f160326c
commit b1a5693612
10 changed files with 514 additions and 1 deletions

View File

@@ -0,0 +1,153 @@
/*
* ObstacleSetHandler.cpp, 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
*
*/
#include "StdInc.h"
#include "ObstacleSetHandler.h"
VCMI_LIB_NAMESPACE_BEGIN
ObstacleSet::ObstacleSet(EObstacleType type, TerrainId terrain):
type(type),
terrain(terrain)
{
}
void ObstacleSet::addObstacle(std::shared_ptr<const ObjectTemplate> obstacle)
{
obstacles.push_back(obstacle);
}
ObstacleSetFilter::ObstacleSetFilter(std::vector<ObstacleSet::EObstacleType> allowedTypes, TerrainId terrain = TerrainId::ANY_TERRAIN):
allowedTypes(allowedTypes),
terrain(terrain)
{
}
ObstacleSetFilter::ObstacleSetFilter(ObstacleSet::EObstacleType allowedType, TerrainId terrain = TerrainId::ANY_TERRAIN):
allowedTypes({allowedType}),
terrain(terrain)
{
}
bool ObstacleSetFilter::filter(const ObstacleSet &set) const
{
return (set.getTerrain() == terrain) || (terrain == TerrainId::ANY_TERRAIN);
}
TerrainId ObstacleSetFilter::getTerrain() const
{
return terrain;
}
TerrainId ObstacleSet::getTerrain() const
{
return terrain;
}
ObstacleSet::EObstacleType ObstacleSet::getType() const
{
return type;
}
std::vector<std::shared_ptr<const ObjectTemplate>> ObstacleSet::getObstacles() const
{
return obstacles;
}
ObstacleSet::EObstacleType ObstacleSetHandler::convertObstacleClass(MapObjectID id)
{
switch (id)
{
case Obj::MOUNTAIN:
case Obj::SAND_DUNE:
case Obj::VOLCANIC_VENT:
case Obj::VOLCANO:
case Obj::REEF:
return ObstacleSet::MOUNTAINS;
case Obj::OAK_TREES:
case Obj::PINE_TREES:
case Obj::TREES:
case Obj::DEAD_VEGETATION:
case Obj::HEDGE:
case Obj::KELP:
case Obj::WILLOW_TREES:
case Obj::YUCCA_TREES:
return ObstacleSet::TREES;
case Obj::FROZEN_LAKE:
case Obj::LAKE:
case Obj::LAVA_FLOW:
case Obj::LAVA_LAKE:
return ObstacleSet::LAKES;
case Obj::CANYON:
case Obj::CRATER:
case Obj::SAND_PIT:
case Obj::TAR_PIT:
return ObstacleSet::CRATERS;
case Obj::HILL:
case Obj::MOUND:
case Obj::OUTCROPPING:
case Obj::ROCK:
case Obj::STALAGMITE:
return ObstacleSet::ROCKS;
case Obj::BUSH:
case Obj::CACTUS:
case Obj::FLOWERS:
case Obj::MUSHROOMS:
case Obj::LOG:
case Obj::MANDRAKE:
case Obj::MOSS:
case Obj::PLANT:
case Obj::SHRUB:
case Obj::STUMP:
case Obj::VINE:
return ObstacleSet::PLANTS;
case Obj::SKULL:
return ObstacleSet::ANIMALS;
default:
return ObstacleSet::OTHER;
}
}
std::vector<ObstacleSet::EObstacleType> ObstacleSetFilter::getAllowedTypes() const
{
return allowedTypes;
}
void ObstacleSetHandler::addObstacleSet(const ObstacleSet &os)
{
obstacleSets[os.getType()].push_back(os);
}
TObstacleTypes ObstacleSetHandler::getObstacles( const ObstacleSetFilter &filter) const
{
// TODO: Handle multiple terrains for one obstacle set?
auto terrainType = filter.getTerrain();
TObstacleTypes result;
for (const auto &allowedType : filter.getAllowedTypes())
{
auto it = obstacleSets.find(allowedType);
if(it != obstacleSets.end())
{
for (const auto &os : it->second)
{
if (filter.filter(os))
{
result.push_back(os);
}
}
}
}
return result;
}
VCMI_LIB_NAMESPACE_END