AbstractGoal.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * AbstractGoal.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 "AbstractGoal.h"
  12. #include "../VCAI.h"
  13. #include "../AIhelper.h"
  14. #include "../FuzzyHelper.h"
  15. #include "../ResourceManager.h"
  16. #include "../BuildingManager.h"
  17. #include "../../../lib/mapping/CMap.h" //for victory conditions
  18. #include "../../../lib/CPathfinder.h"
  19. #include "../../../lib/StringConstants.h"
  20. extern boost::thread_specific_ptr<CCallback> cb;
  21. extern boost::thread_specific_ptr<VCAI> ai;
  22. extern FuzzyHelper * fh;
  23. using namespace Goals;
  24. TSubgoal Goals::sptr(const AbstractGoal & tmp)
  25. {
  26. TSubgoal ptr;
  27. ptr.reset(tmp.clone());
  28. return ptr;
  29. }
  30. std::string AbstractGoal::name() const //TODO: virtualize
  31. {
  32. std::string desc;
  33. switch(goalType)
  34. {
  35. case INVALID:
  36. return "INVALID";
  37. case WIN:
  38. return "WIN";
  39. case DO_NOT_LOSE:
  40. return "DO NOT LOOSE";
  41. case CONQUER:
  42. return "CONQUER";
  43. case BUILD:
  44. return "BUILD";
  45. case EXPLORE:
  46. desc = "EXPLORE";
  47. break;
  48. case GATHER_ARMY:
  49. desc = "GATHER ARMY";
  50. break;
  51. case BUY_ARMY:
  52. return "BUY ARMY";
  53. break;
  54. case BOOST_HERO:
  55. desc = "BOOST_HERO (unsupported)";
  56. break;
  57. case RECRUIT_HERO:
  58. return "RECRUIT HERO";
  59. case BUILD_STRUCTURE:
  60. return "BUILD STRUCTURE";
  61. case COLLECT_RES:
  62. desc = "COLLECT RESOURCE " + GameConstants::RESOURCE_NAMES[resID] + " (" + boost::lexical_cast<std::string>(value) + ")";
  63. break;
  64. case TRADE:
  65. {
  66. auto obj = cb->getObjInstance(ObjectInstanceID(objid));
  67. if (obj)
  68. desc = (boost::format("TRADE %d of %s at %s") % value % GameConstants::RESOURCE_NAMES[resID] % obj->getObjectName()).str();
  69. }
  70. break;
  71. case GATHER_TROOPS:
  72. desc = "GATHER TROOPS";
  73. break;
  74. case VISIT_OBJ:
  75. {
  76. auto obj = cb->getObjInstance(ObjectInstanceID(objid));
  77. if(obj)
  78. desc = "GET OBJ " + obj->getObjectName();
  79. }
  80. break;
  81. case FIND_OBJ:
  82. desc = "FIND OBJ " + boost::lexical_cast<std::string>(objid);
  83. break;
  84. case VISIT_HERO:
  85. {
  86. auto obj = cb->getObjInstance(ObjectInstanceID(objid));
  87. if(obj)
  88. desc = "VISIT HERO " + obj->getObjectName();
  89. }
  90. break;
  91. case GET_ART_TYPE:
  92. desc = "GET ARTIFACT OF TYPE " + VLC->arth->artifacts[aid]->Name();
  93. break;
  94. case ISSUE_COMMAND:
  95. return "ISSUE COMMAND (unsupported)";
  96. case VISIT_TILE:
  97. desc = "VISIT TILE " + tile.toString();
  98. break;
  99. case CLEAR_WAY_TO:
  100. desc = "CLEAR WAY TO " + tile.toString();
  101. break;
  102. case DIG_AT_TILE:
  103. desc = "DIG AT TILE " + tile.toString();
  104. break;
  105. default:
  106. return boost::lexical_cast<std::string>(goalType);
  107. }
  108. if(hero.get(true)) //FIXME: used to crash when we lost hero and failed goal
  109. desc += " (" + hero->name + ")";
  110. return desc;
  111. }
  112. bool AbstractGoal::operator==(const AbstractGoal & g) const
  113. {
  114. return false;
  115. }
  116. bool AbstractGoal::operator<(AbstractGoal & g) //for std::unique
  117. {
  118. //TODO: make sure it gets goals consistent with == operator
  119. if (goalType < g.goalType)
  120. return true;
  121. if (goalType > g.goalType)
  122. return false;
  123. if (hero < g.hero)
  124. return true;
  125. if (hero > g.hero)
  126. return false;
  127. if (tile < g.tile)
  128. return true;
  129. if (g.tile < tile)
  130. return false;
  131. if (objid < g.objid)
  132. return true;
  133. if (objid > g.objid)
  134. return false;
  135. if (town < g.town)
  136. return true;
  137. if (town > g.town)
  138. return false;
  139. if (value < g.value)
  140. return true;
  141. if (value > g.value)
  142. return false;
  143. if (priority < g.priority)
  144. return true;
  145. if (priority > g.priority)
  146. return false;
  147. if (resID < g.resID)
  148. return true;
  149. if (resID > g.resID)
  150. return false;
  151. if (bid < g.bid)
  152. return true;
  153. if (bid > g.bid)
  154. return false;
  155. if (aid < g.aid)
  156. return true;
  157. if (aid > g.aid)
  158. return false;
  159. return false;
  160. }
  161. //TODO: find out why the following are not generated automatically on MVS?
  162. bool TSubgoal::operator==(const TSubgoal & rhs) const
  163. {
  164. return *get() == *rhs.get(); //comparison for Goals is overloaded, so they don't need to be identical to match
  165. }
  166. bool TSubgoal::operator<(const TSubgoal & rhs) const
  167. {
  168. return get() < rhs.get(); //compae by value
  169. }
  170. bool AbstractGoal::invalid() const
  171. {
  172. return goalType == EGoals::INVALID;
  173. }
  174. void AbstractGoal::accept(VCAI * ai)
  175. {
  176. ai->tryRealize(*this);
  177. }
  178. float AbstractGoal::accept(FuzzyHelper * f)
  179. {
  180. return f->evaluate(*this);
  181. }