PackRollbackGeneratorVisitor.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. * PackRollbackGeneratorVisitor.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 "PackRollbackGeneratorVisitor.h"
  12. #include "../lib/gameState/CGameState.h"
  13. #include "../lib/mapObjects/CGHeroInstance.h"
  14. void PackRollbackGeneratorVisitor::visitPackageReceived(PackageReceived & pack)
  15. {
  16. success = true;
  17. // no-op rollback?
  18. }
  19. void PackRollbackGeneratorVisitor::visitPackageApplied(PackageApplied & pack)
  20. {
  21. success = true;
  22. // no-op rollback?
  23. }
  24. void PackRollbackGeneratorVisitor::visitPlayerBlocked(PlayerBlocked & pack)
  25. {
  26. success = true;
  27. // no-op rollback?
  28. }
  29. void PackRollbackGeneratorVisitor::visitSwapStacks(SwapStacks & pack)
  30. {
  31. auto rollbackSwap = std::make_unique<SwapStacks>();
  32. rollbackSwap->srcArmy = pack.dstArmy;
  33. rollbackSwap->dstArmy = pack.srcArmy;
  34. rollbackSwap->srcSlot = pack.dstSlot;
  35. rollbackSwap->dstSlot = pack.srcSlot;
  36. rollbackPacks.push_back(std::move(rollbackSwap));
  37. success = true;
  38. }
  39. void PackRollbackGeneratorVisitor::visitRebalanceStacks(RebalanceStacks & pack)
  40. {
  41. const auto * srcObject = gs.getObjInstance(pack.srcArmy);
  42. const auto * dstObject = gs.getObjInstance(pack.dstArmy);
  43. const auto * srcArmy = dynamic_cast<const CArmedInstance *>(srcObject);
  44. const auto * dstArmy = dynamic_cast<const CArmedInstance *>(dstObject);
  45. if (srcArmy->getStack(pack.srcSlot).getTotalExperience() != 0 ||
  46. dstArmy->getStack(pack.srcSlot).getTotalExperience() != 0 ||
  47. srcArmy->getStack(pack.srcSlot).getSlot(ArtifactPosition::CREATURE_SLOT)->artifactID.hasValue())
  48. {
  49. // TODO: rollback creature artifacts & stack experience
  50. return;
  51. }
  52. auto rollbackRebalance = std::make_unique<RebalanceStacks>();
  53. rollbackRebalance->srcArmy = pack.dstArmy;
  54. rollbackRebalance->dstArmy = pack.srcArmy;
  55. rollbackRebalance->srcSlot = pack.dstSlot;
  56. rollbackRebalance->dstSlot = pack.srcSlot;
  57. rollbackRebalance->count = pack.count;
  58. rollbackPacks.push_back(std::move(rollbackRebalance));
  59. success = true;
  60. }
  61. void PackRollbackGeneratorVisitor::visitBulkRebalanceStacks(BulkRebalanceStacks & pack)
  62. {
  63. for(auto & subpack : pack.moves)
  64. visitRebalanceStacks(subpack);
  65. success = true;
  66. }
  67. void PackRollbackGeneratorVisitor::visitHeroVisitCastle(HeroVisitCastle & pack)
  68. {
  69. auto rollbackVisit = std::make_unique<HeroVisitCastle>();
  70. rollbackVisit->startVisit = !pack.startVisit;
  71. rollbackVisit->tid = pack.tid;
  72. rollbackVisit->hid = pack.hid;
  73. rollbackPacks.push_back(std::move(rollbackVisit));
  74. success = true;
  75. }
  76. void PackRollbackGeneratorVisitor::visitTryMoveHero(TryMoveHero & pack)
  77. {
  78. auto rollbackMove = std::make_unique<TryMoveHero>();
  79. auto rollbackFow = std::make_unique<FoWChange>();
  80. const auto * movedHero = gs.getHero(pack.id);
  81. rollbackMove->id = pack.id;
  82. rollbackMove->movePoints = movedHero->movementPointsRemaining();
  83. rollbackMove->result = pack.result;
  84. if(pack.result == TryMoveHero::EMBARK)
  85. rollbackMove->result = TryMoveHero::DISEMBARK;
  86. if(pack.result == TryMoveHero::DISEMBARK)
  87. rollbackMove->result = TryMoveHero::EMBARK;
  88. rollbackMove->start = pack.end;
  89. rollbackMove->end = pack.start;
  90. rollbackFow->mode = ETileVisibility::HIDDEN;
  91. rollbackFow->player = movedHero->getOwner();
  92. rollbackFow->tiles = pack.fowRevealed;
  93. rollbackPacks.push_back(std::move(rollbackMove));
  94. rollbackPacks.push_back(std::move(rollbackFow));
  95. success = true;
  96. }
  97. bool PackRollbackGeneratorVisitor::canBeRolledBack() const
  98. {
  99. return success;
  100. }
  101. std::vector<std::unique_ptr<CPackForClient>> PackRollbackGeneratorVisitor::acquireRollbackPacks()
  102. {
  103. return std::move(rollbackPacks);
  104. }