ObstacleSetHandler.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * ObstacleSetHandler.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "ObstacleSetHandler.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. ObstacleSet::ObstacleSet(EObstacleType type, TerrainId terrain):
  14. type(type),
  15. terrain(terrain)
  16. {
  17. }
  18. void ObstacleSet::addObstacle(std::shared_ptr<const ObjectTemplate> obstacle)
  19. {
  20. obstacles.push_back(obstacle);
  21. }
  22. ObstacleSetFilter::ObstacleSetFilter(std::vector<ObstacleSet::EObstacleType> allowedTypes, TerrainId terrain = TerrainId::ANY_TERRAIN):
  23. allowedTypes(allowedTypes),
  24. terrain(terrain)
  25. {
  26. }
  27. ObstacleSetFilter::ObstacleSetFilter(ObstacleSet::EObstacleType allowedType, TerrainId terrain = TerrainId::ANY_TERRAIN):
  28. allowedTypes({allowedType}),
  29. terrain(terrain)
  30. {
  31. }
  32. bool ObstacleSetFilter::filter(const ObstacleSet &set) const
  33. {
  34. return (set.getTerrain() == terrain) || (terrain == TerrainId::ANY_TERRAIN);
  35. }
  36. TerrainId ObstacleSetFilter::getTerrain() const
  37. {
  38. return terrain;
  39. }
  40. TerrainId ObstacleSet::getTerrain() const
  41. {
  42. return terrain;
  43. }
  44. ObstacleSet::EObstacleType ObstacleSet::getType() const
  45. {
  46. return type;
  47. }
  48. std::vector<std::shared_ptr<const ObjectTemplate>> ObstacleSet::getObstacles() const
  49. {
  50. return obstacles;
  51. }
  52. ObstacleSet::EObstacleType ObstacleSetHandler::convertObstacleClass(MapObjectID id)
  53. {
  54. switch (id)
  55. {
  56. case Obj::MOUNTAIN:
  57. case Obj::VOLCANIC_VENT:
  58. case Obj::VOLCANO:
  59. case Obj::REEF:
  60. return ObstacleSet::MOUNTAINS;
  61. case Obj::OAK_TREES:
  62. case Obj::PINE_TREES:
  63. case Obj::TREES:
  64. case Obj::DEAD_VEGETATION:
  65. case Obj::HEDGE:
  66. case Obj::KELP:
  67. case Obj::WILLOW_TREES:
  68. case Obj::YUCCA_TREES:
  69. return ObstacleSet::TREES;
  70. case Obj::FROZEN_LAKE:
  71. case Obj::LAKE:
  72. case Obj::LAVA_FLOW:
  73. case Obj::LAVA_LAKE:
  74. return ObstacleSet::LAKES;
  75. case Obj::CANYON:
  76. case Obj::CRATER:
  77. case Obj::SAND_PIT:
  78. case Obj::TAR_PIT:
  79. return ObstacleSet::CRATERS;
  80. case Obj::HILL:
  81. case Obj::MOUND:
  82. case Obj::OUTCROPPING:
  83. case Obj::ROCK:
  84. case Obj::SAND_DUNE:
  85. case Obj::STALAGMITE:
  86. return ObstacleSet::ROCKS;
  87. case Obj::BUSH:
  88. case Obj::CACTUS:
  89. case Obj::FLOWERS:
  90. case Obj::MUSHROOMS:
  91. case Obj::LOG:
  92. case Obj::MANDRAKE:
  93. case Obj::MOSS:
  94. case Obj::PLANT:
  95. case Obj::SHRUB:
  96. case Obj::STUMP:
  97. case Obj::VINE:
  98. return ObstacleSet::PLANTS;
  99. case Obj::SKULL:
  100. return ObstacleSet::ANIMALS;
  101. default:
  102. return ObstacleSet::OTHER;
  103. }
  104. }
  105. ObstacleSet::EObstacleType ObstacleSet::typeFromString(const std::string &str)
  106. {
  107. static const std::map<std::string, EObstacleType> OBSTACLE_TYPE_NAMES =
  108. {
  109. {"mountain", MOUNTAINS},
  110. {"tree", TREES},
  111. {"lake", LAKES},
  112. {"crater", CRATERS},
  113. {"rock", ROCKS},
  114. {"plant", PLANTS},
  115. {"structure", STRUCTURES},
  116. {"animal", ANIMALS},
  117. {"other", OTHER}
  118. };
  119. if (OBSTACLE_TYPE_NAMES.find(str) != OBSTACLE_TYPE_NAMES.end())
  120. {
  121. return OBSTACLE_TYPE_NAMES.at(str);
  122. }
  123. // TODO: How to handle that?
  124. throw std::runtime_error("Invalid obstacle type: " + str);
  125. }
  126. std::vector<ObstacleSet::EObstacleType> ObstacleSetFilter::getAllowedTypes() const
  127. {
  128. return allowedTypes;
  129. }
  130. void ObstacleSetHandler::addObstacleSet(const ObstacleSet &os)
  131. {
  132. obstacleSets[os.getType()].push_back(os);
  133. }
  134. TObstacleTypes ObstacleSetHandler::getObstacles( const ObstacleSetFilter &filter) const
  135. {
  136. TObstacleTypes result;
  137. for (const auto &allowedType : filter.getAllowedTypes())
  138. {
  139. auto it = obstacleSets.find(allowedType);
  140. if(it != obstacleSets.end())
  141. {
  142. for (const auto &os : it->second)
  143. {
  144. if (filter.filter(os))
  145. {
  146. result.push_back(os);
  147. }
  148. }
  149. }
  150. }
  151. return result;
  152. }
  153. VCMI_LIB_NAMESPACE_END