AbstractGoal.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 "../../../lib/mapping/CMap.h" //for victory conditions
  16. #include "../../../lib/CPathfinder.h"
  17. #include "../../../lib/StringConstants.h"
  18. extern boost::thread_specific_ptr<CCallback> cb;
  19. extern boost::thread_specific_ptr<VCAI> ai;
  20. extern FuzzyHelper * fh;
  21. using namespace Goals;
  22. TSubgoal Goals::sptr(const AbstractGoal & tmp)
  23. {
  24. TSubgoal ptr;
  25. ptr.reset(tmp.clone());
  26. return ptr;
  27. }
  28. std::string AbstractGoal::name() const //TODO: virtualize
  29. {
  30. std::string desc;
  31. switch(goalType)
  32. {
  33. case INVALID:
  34. return "INVALID";
  35. case WIN:
  36. return "WIN";
  37. case CONQUER:
  38. return "CONQUER";
  39. case BUILD:
  40. return "BUILD";
  41. case EXPLORE:
  42. desc = "EXPLORE";
  43. break;
  44. case GATHER_ARMY:
  45. desc = "GATHER ARMY";
  46. break;
  47. case BUY_ARMY:
  48. return "BUY ARMY";
  49. break;
  50. case BOOST_HERO:
  51. desc = "BOOST_HERO (unsupported)";
  52. break;
  53. case RECRUIT_HERO:
  54. return "RECRUIT HERO";
  55. case BUILD_STRUCTURE:
  56. return "BUILD STRUCTURE";
  57. case COLLECT_RES:
  58. desc = "COLLECT RESOURCE " + GameConstants::RESOURCE_NAMES[resID] + " (" + boost::lexical_cast<std::string>(value) + ")";
  59. break;
  60. case TRADE:
  61. {
  62. auto obj = cb->getObjInstance(ObjectInstanceID(objid));
  63. if (obj)
  64. desc = (boost::format("TRADE %d of %s at %s") % value % GameConstants::RESOURCE_NAMES[resID] % obj->getObjectName()).str();
  65. }
  66. break;
  67. case GATHER_TROOPS:
  68. desc = "GATHER TROOPS";
  69. break;
  70. case VISIT_OBJ:
  71. {
  72. auto obj = cb->getObjInstance(ObjectInstanceID(objid));
  73. if(obj)
  74. desc = "VISIT OBJ " + obj->getObjectName();
  75. }
  76. break;
  77. case FIND_OBJ:
  78. desc = "FIND OBJ " + boost::lexical_cast<std::string>(objid);
  79. break;
  80. case VISIT_HERO:
  81. {
  82. auto obj = cb->getObjInstance(ObjectInstanceID(objid));
  83. if(obj)
  84. desc = "VISIT HERO " + obj->getObjectName();
  85. }
  86. break;
  87. case GET_ART_TYPE:
  88. desc = "GET ARTIFACT OF TYPE " + VLC->arth->artifacts[aid]->Name();
  89. break;
  90. case VISIT_TILE:
  91. desc = "VISIT TILE " + tile.toString();
  92. break;
  93. case CLEAR_WAY_TO:
  94. desc = "CLEAR WAY TO " + tile.toString();
  95. break;
  96. case DIG_AT_TILE:
  97. desc = "DIG AT TILE " + tile.toString();
  98. break;
  99. default:
  100. return boost::lexical_cast<std::string>(goalType);
  101. }
  102. if(hero.get(true)) //FIXME: used to crash when we lost hero and failed goal
  103. desc += " (" + hero->name + ")";
  104. return desc;
  105. }
  106. bool AbstractGoal::operator==(const AbstractGoal & g) const
  107. {
  108. return false;
  109. }
  110. //TODO: find out why the following are not generated automatically on MVS?
  111. bool TSubgoal::operator==(const TSubgoal & rhs) const
  112. {
  113. return *get() == *rhs.get(); //comparison for Goals is overloaded, so they don't need to be identical to match
  114. }
  115. bool AbstractGoal::invalid() const
  116. {
  117. return goalType == EGoals::INVALID;
  118. }
  119. void AbstractGoal::accept(VCAI * ai)
  120. {
  121. ai->tryRealize(*this);
  122. }
  123. EvaluationContext::EvaluationContext()
  124. : movementCost(0.0),
  125. manaCost(0),
  126. danger(0),
  127. closestWayRatio(1),
  128. armyLoss(0),
  129. heroStrength(0),
  130. movementCostByRole(),
  131. skillReward(0),
  132. goldReward(0),
  133. goldCost(0),
  134. armyReward(0),
  135. armyLossPersentage(0),
  136. heroRole(HeroRole::SCOUT),
  137. turn(0),
  138. strategicalValue(0)
  139. {
  140. }