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:
153
lib/mapObjects/ObstacleSetHandler.cpp
Normal file
153
lib/mapObjects/ObstacleSetHandler.cpp
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user