Actors.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. * AINodeStorage.h, 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. #pragma once
  11. #include "../../../lib/CPathfinder.h"
  12. #include "../../../lib/mapObjects/CGHeroInstance.h"
  13. #include "../AIUtility.h"
  14. #include "Actions/SpecialAction.h"
  15. class HeroActor;
  16. class VCAI;
  17. class HeroExchangeArmy : public CCreatureSet
  18. {
  19. public:
  20. virtual bool needsLastStack() const override;
  21. };
  22. class ChainActor
  23. {
  24. protected:
  25. ChainActor(const CGHeroInstance * hero, uint64_t chainMask);
  26. ChainActor(const ChainActor * carrier, const ChainActor * other, const CCreatureSet * heroArmy);
  27. ChainActor(const CGObjectInstance * obj, const CCreatureSet * army, uint64_t chainMask, int initialTurn);
  28. public:
  29. uint64_t chainMask;
  30. bool isMovable;
  31. bool allowUseResources;
  32. bool allowBattle;
  33. bool allowSpellCast;
  34. const CGHeroInstance * hero;
  35. const CCreatureSet * creatureSet;
  36. const ChainActor * battleActor;
  37. const ChainActor * castActor;
  38. const ChainActor * resourceActor;
  39. const ChainActor * carrierParent;
  40. const ChainActor * otherParent;
  41. const ChainActor * baseActor;
  42. int3 initialPosition;
  43. EPathfindingLayer layer;
  44. uint32_t initialMovement;
  45. uint32_t initialTurn;
  46. uint64_t armyValue;
  47. float heroFightingStrength;
  48. uint8_t actorExchangeCount;
  49. TResources armyCost;
  50. ChainActor(){}
  51. virtual bool canExchange(const ChainActor * other) const;
  52. virtual std::string toString() const;
  53. ChainActor * exchange(const ChainActor * other) const { return exchange(this, other); }
  54. void setBaseActor(HeroActor * base);
  55. virtual const CGObjectInstance * getActorObject() const { return hero; }
  56. protected:
  57. virtual ChainActor * exchange(const ChainActor * specialActor, const ChainActor * other) const;
  58. };
  59. class HeroExchangeMap
  60. {
  61. private:
  62. const HeroActor * actor;
  63. std::map<const ChainActor *, HeroActor *> exchangeMap;
  64. std::map<const ChainActor *, bool> canExchangeCache;
  65. const VCAI * ai;
  66. public:
  67. HeroExchangeMap(const HeroActor * actor, const VCAI * ai)
  68. :actor(actor), ai(ai)
  69. {
  70. }
  71. ~HeroExchangeMap();
  72. HeroActor * exchange(const ChainActor * other);
  73. bool canExchange(const ChainActor * other);
  74. private:
  75. CCreatureSet * pickBestCreatures(const CCreatureSet * army1, const CCreatureSet * army2) const;
  76. CCreatureSet * tryUpgrade(const CCreatureSet * army, const CGObjectInstance * upgrader, TResources resources) const;
  77. };
  78. class HeroActor : public ChainActor
  79. {
  80. public:
  81. static const int SPECIAL_ACTORS_COUNT = 7;
  82. private:
  83. ChainActor specialActors[SPECIAL_ACTORS_COUNT];
  84. HeroExchangeMap * exchangeMap;
  85. void setupSpecialActors();
  86. public:
  87. std::shared_ptr<SpecialAction> exchangeAction;
  88. // chain flags, can be combined meaning hero exchange and so on
  89. HeroActor(const CGHeroInstance * hero, uint64_t chainMask, const VCAI * ai);
  90. HeroActor(const ChainActor * carrier, const ChainActor * other, const CCreatureSet * army, const VCAI * ai);
  91. virtual bool canExchange(const ChainActor * other) const override;
  92. protected:
  93. virtual ChainActor * exchange(const ChainActor * specialActor, const ChainActor * other) const override;
  94. };
  95. class ObjectActor : public ChainActor
  96. {
  97. private:
  98. const CGObjectInstance * object;
  99. public:
  100. ObjectActor(const CGObjectInstance * obj, const CCreatureSet * army, uint64_t chainMask, int initialTurn);
  101. virtual std::string toString() const override;
  102. const CGObjectInstance * getActorObject() const override;
  103. };
  104. class HillFortActor : public ObjectActor
  105. {
  106. public:
  107. HillFortActor(const CGObjectInstance * hillFort, uint64_t chainMask);
  108. };
  109. class DwellingActor : public ObjectActor
  110. {
  111. private:
  112. const CGDwelling * dwelling;
  113. public:
  114. DwellingActor(const CGDwelling * dwelling, uint64_t chainMask, bool waitForGrowth, int dayOfWeek);
  115. ~DwellingActor();
  116. virtual std::string toString() const override;
  117. protected:
  118. int getInitialTurn(bool waitForGrowth, int dayOfWeek);
  119. CCreatureSet * getDwellingCreatures(const CGDwelling * dwelling, bool waitForGrowth);
  120. };
  121. class TownGarrisonActor : public ObjectActor
  122. {
  123. private:
  124. const CGTownInstance * town;
  125. public:
  126. TownGarrisonActor(const CGTownInstance * town, uint64_t chainMask);
  127. virtual std::string toString() const override;
  128. };