mapHandler.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /*
  2. * mapHandler.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 "mapHandler.h"
  12. #include "IMapRendererObserver.h"
  13. #include "../CGameInfo.h"
  14. #include "../CPlayerInterface.h"
  15. #include "../../lib/UnlockGuard.h"
  16. #include "../../lib/mapObjects/CGHeroInstance.h"
  17. #include "../../lib/mapObjects/CObjectClassesHandler.h"
  18. #include "../../lib/mapping/CMap.h"
  19. #include "../../lib/CGeneralTextHandler.h"
  20. #include "../../lib/TerrainHandler.h"
  21. /*
  22. void CMapPuzzleViewBlitter::drawObjects(SDL_Surface * targetSurf, const TerrainTile2 & tile) const
  23. {
  24. CMapBlitter::drawObjects(targetSurf, tile);
  25. // grail X mark
  26. if(pos.x == info->grailPos.x && pos.y == info->grailPos.y)
  27. {
  28. const auto mark = graphics->heroMoveArrows->getImage(0);
  29. mark->draw(targetSurf,realTileRect.x,realTileRect.y);
  30. }
  31. }
  32. */
  33. /*
  34. void CMapPuzzleViewBlitter::postProcessing(SDL_Surface * targetSurf) const
  35. {
  36. CSDL_Ext::applyEffect(targetSurf, info->drawBounds, static_cast<int>(!ADVOPT.puzzleSepia));
  37. }
  38. */
  39. /*
  40. bool CMapPuzzleViewBlitter::canDrawObject(const CGObjectInstance * obj) const
  41. {
  42. if (!CMapBlitter::canDrawObject(obj))
  43. return false;
  44. //don't print flaggable objects in puzzle mode
  45. if (obj->isVisitable())
  46. return false;
  47. if(std::find(unblittableObjects.begin(), unblittableObjects.end(), obj->ID) != unblittableObjects.end())
  48. return false;
  49. return true;
  50. }
  51. */
  52. /*
  53. CMapPuzzleViewBlitter::CMapPuzzleViewBlitter(CMapHandler * parent)
  54. : CMapNormalBlitter(parent)
  55. {
  56. unblittableObjects.push_back(Obj::HOLE);
  57. }
  58. */
  59. bool CMapHandler::hasOngoingAnimations()
  60. {
  61. for (auto * observer : observers)
  62. if (observer->hasOngoingAnimations())
  63. return true;
  64. return false;
  65. }
  66. void CMapHandler::waitForOngoingAnimations()
  67. {
  68. while (CGI->mh->hasOngoingAnimations())
  69. {
  70. auto unlockPim = vstd::makeUnlockGuard(*CPlayerInterface::pim);
  71. boost::this_thread::sleep(boost::posix_time::milliseconds(1));
  72. }
  73. }
  74. bool CMapHandler::hasObjectHole(const int3 & pos) const
  75. {
  76. //const TerrainTile2 & tt = ttiles[pos.z][pos.x][pos.y];
  77. //for(auto & elem : tt.objects)
  78. //{
  79. // if(elem.obj && elem.obj->ID == Obj::HOLE)
  80. // return true;
  81. //}
  82. return false;
  83. }
  84. void CMapHandler::getTerrainDescr(const int3 & pos, std::string & out, bool isRMB) const
  85. {
  86. const TerrainTile & t = map->getTile(pos);
  87. if(t.hasFavorableWinds())
  88. {
  89. out = CGI->objtypeh->getObjectName(Obj::FAVORABLE_WINDS, 0);
  90. return;
  91. }
  92. //const TerrainTile2 & tt = ttiles[pos.z][pos.x][pos.y];
  93. bool isTile2Terrain = false;
  94. out.clear();
  95. //for(auto & elem : tt.objects)
  96. //{
  97. // if(elem.obj)
  98. // {
  99. // out = elem.obj->getObjectName();
  100. // if(elem.obj->ID == Obj::HOLE)
  101. // return;
  102. // isTile2Terrain = elem.obj->isTile2Terrain();
  103. // break;
  104. // }
  105. //}
  106. if(!isTile2Terrain || out.empty())
  107. out = t.terType->getNameTranslated();
  108. if(t.getDiggingStatus(false) == EDiggingStatus::CAN_DIG)
  109. {
  110. out = boost::str(boost::format(isRMB ? "%s\r\n%s" : "%s %s") // New line for the Message Box, space for the Status Bar
  111. % out
  112. % CGI->generaltexth->allTexts[330]); // 'digging ok'
  113. }
  114. }
  115. bool CMapHandler::compareObjectBlitOrder(const CGObjectInstance * a, const CGObjectInstance * b)
  116. {
  117. if (!a)
  118. return true;
  119. if (!b)
  120. return false;
  121. if (a->appearance->printPriority != 0 || b->appearance->printPriority != 0)
  122. {
  123. if (a->appearance->printPriority != b->appearance->printPriority)
  124. return a->appearance->printPriority > b->appearance->printPriority;
  125. //H3 behavior: order of two background objects depends on their placement order on map
  126. return a->id < b->id;
  127. }
  128. if(a->pos.y != b->pos.y)
  129. return a->pos.y < b->pos.y;
  130. if(b->ID==Obj::HERO && a->ID!=Obj::HERO)
  131. return true;
  132. if(b->ID!=Obj::HERO && a->ID==Obj::HERO)
  133. return false;
  134. if(!a->isVisitable() && b->isVisitable())
  135. return true;
  136. if(!b->isVisitable() && a->isVisitable())
  137. return false;
  138. //H3 behavior: order of two background objects depends on their placement order on map
  139. return a->id < b->id;
  140. }
  141. CMapHandler::CMapHandler(const CMap * map)
  142. : map(map)
  143. {
  144. }
  145. const CMap * CMapHandler::getMap()
  146. {
  147. return map;
  148. }
  149. bool CMapHandler::isInMap( const int3 & tile)
  150. {
  151. return map->isInTheMap(tile);
  152. }
  153. std::vector<std::string> CMapHandler::getAmbientSounds(const int3 & tile)
  154. {
  155. std::vector<std::string> result;
  156. //for(auto & ttObj : ttiles[tile.z][tile.x][tile.y].objects)
  157. //{
  158. // if(ttObj.ambientSound)
  159. // result.push_back(ttObj.ambientSound.get());
  160. //}
  161. if(map->isCoastalTile(tile))
  162. result.emplace_back("LOOPOCEA");
  163. return result;
  164. }
  165. void CMapHandler::onObjectFadeIn(const CGObjectInstance * obj)
  166. {
  167. for (auto * observer : observers)
  168. observer->onObjectFadeIn(obj);
  169. }
  170. void CMapHandler::onObjectFadeOut(const CGObjectInstance * obj)
  171. {
  172. for (auto * observer : observers)
  173. observer->onObjectFadeOut(obj);
  174. }
  175. void CMapHandler::onObjectInstantAdd(const CGObjectInstance * obj)
  176. {
  177. for (auto * observer : observers)
  178. observer->onObjectInstantAdd(obj);
  179. }
  180. void CMapHandler::onObjectInstantRemove(const CGObjectInstance * obj)
  181. {
  182. for (auto * observer : observers)
  183. observer->onObjectInstantRemove(obj);
  184. }
  185. void CMapHandler::onHeroTeleported(const CGHeroInstance * obj, const int3 & from, const int3 & dest)
  186. {
  187. assert(obj->pos == dest);
  188. for (auto * observer : observers)
  189. observer->onHeroTeleported(obj, from, dest);
  190. }
  191. void CMapHandler::onHeroMoved(const CGHeroInstance * obj, const int3 & from, const int3 & dest)
  192. {
  193. assert(obj->pos == dest);
  194. for (auto * observer : observers)
  195. observer->onHeroMoved(obj, from, dest);
  196. }
  197. void CMapHandler::onHeroRotated(const CGHeroInstance * obj, const int3 & from, const int3 & dest)
  198. {
  199. assert(obj->pos == from);
  200. for (auto * observer : observers)
  201. observer->onHeroRotated(obj, from, dest);
  202. }
  203. void CMapHandler::addMapObserver(IMapObjectObserver * object)
  204. {
  205. observers.push_back(object);
  206. }
  207. void CMapHandler::removeMapObserver(IMapObjectObserver * object)
  208. {
  209. vstd::erase(observers, object);
  210. }
  211. IMapObjectObserver::IMapObjectObserver()
  212. {
  213. CGI->mh->addMapObserver(this);
  214. }
  215. IMapObjectObserver::~IMapObjectObserver()
  216. {
  217. CGI->mh->removeMapObserver(this);
  218. }