|
@@ -20,7 +20,7 @@
|
|
|
#include "../lib/serializer/GameConnection.h"
|
|
#include "../lib/serializer/GameConnection.h"
|
|
|
#include "GameInstance.h"
|
|
#include "GameInstance.h"
|
|
|
|
|
|
|
|
-class DLL_LINKAGE AntilagRollbackNotSupportedException : public std::runtime_error
|
|
|
|
|
|
|
+class AntilagRollbackNotSupportedException : public std::runtime_error
|
|
|
{
|
|
{
|
|
|
public:
|
|
public:
|
|
|
using std::runtime_error::runtime_error;
|
|
using std::runtime_error::runtime_error;
|
|
@@ -51,6 +51,53 @@ void AntilagRollbackGeneratorVisitor::visitPlayerBlocked(PlayerBlocked & pack)
|
|
|
// no-op rollback?
|
|
// no-op rollback?
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void AntilagRollbackGeneratorVisitor::visitSwapStacks(SwapStacks & pack)
|
|
|
|
|
+{
|
|
|
|
|
+ auto rollbackSwap = std::make_unique<SwapStacks>();
|
|
|
|
|
+
|
|
|
|
|
+ rollbackSwap->srcArmy = pack.dstArmy;
|
|
|
|
|
+ rollbackSwap->dstArmy = pack.srcArmy;
|
|
|
|
|
+ rollbackSwap->srcSlot = pack.dstSlot;
|
|
|
|
|
+ rollbackSwap->dstSlot = pack.srcSlot;
|
|
|
|
|
+
|
|
|
|
|
+ rollbackPacks.push_back(std::move(rollbackSwap));
|
|
|
|
|
+ success = true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void AntilagRollbackGeneratorVisitor::visitRebalanceStacks(RebalanceStacks & pack)
|
|
|
|
|
+{
|
|
|
|
|
+ const auto * srcObject = gs.getObjInstance(pack.srcArmy);
|
|
|
|
|
+ const auto * dstObject = gs.getObjInstance(pack.dstArmy);
|
|
|
|
|
+
|
|
|
|
|
+ const auto * srcArmy = dynamic_cast<const CArmedInstance*>(srcObject);
|
|
|
|
|
+ const auto * dstArmy = dynamic_cast<const CArmedInstance*>(dstObject);
|
|
|
|
|
+
|
|
|
|
|
+ if (srcArmy->getStack(pack.srcSlot).getTotalExperience() != 0 ||
|
|
|
|
|
+ dstArmy->getStack(pack.srcSlot).getTotalExperience() != 0 ||
|
|
|
|
|
+ srcArmy->getStack(pack.srcSlot).getSlot(ArtifactPosition::CREATURE_SLOT)->artifactID.hasValue())
|
|
|
|
|
+ {
|
|
|
|
|
+ // TODO: rollback creature artifacts & stack experience
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ auto rollbackRebalance = std::make_unique<RebalanceStacks>();
|
|
|
|
|
+ rollbackRebalance->srcArmy = pack.dstArmy;
|
|
|
|
|
+ rollbackRebalance->dstArmy = pack.srcArmy;
|
|
|
|
|
+ rollbackRebalance->srcSlot = pack.dstSlot;
|
|
|
|
|
+ rollbackRebalance->dstSlot = pack.srcSlot;
|
|
|
|
|
+ rollbackRebalance->count = pack.count;
|
|
|
|
|
+ rollbackPacks.push_back(std::move(rollbackRebalance));
|
|
|
|
|
+ success = true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void AntilagRollbackGeneratorVisitor::visitBulkRebalanceStacks(BulkRebalanceStacks & pack)
|
|
|
|
|
+{
|
|
|
|
|
+ for (auto & subpack : pack.moves)
|
|
|
|
|
+ visitRebalanceStacks(subpack);
|
|
|
|
|
+
|
|
|
|
|
+ success = true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void AntilagRollbackGeneratorVisitor::visitHeroVisitCastle(HeroVisitCastle & pack)
|
|
void AntilagRollbackGeneratorVisitor::visitHeroVisitCastle(HeroVisitCastle & pack)
|
|
|
{
|
|
{
|
|
|
auto rollbackVisit = std::make_unique<HeroVisitCastle>();
|
|
auto rollbackVisit = std::make_unique<HeroVisitCastle>();
|
|
@@ -105,6 +152,11 @@ void AntilagReplyPredictionVisitor::visitMoveHero(MoveHero & pack)
|
|
|
canBeAppliedValue = true;
|
|
canBeAppliedValue = true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void AntilagReplyPredictionVisitor::visitArrangeStacks(ArrangeStacks & pack)
|
|
|
|
|
+{
|
|
|
|
|
+ canBeAppliedValue = true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
bool AntilagReplyPredictionVisitor::canBeApplied() const
|
|
bool AntilagReplyPredictionVisitor::canBeApplied() const
|
|
|
{
|
|
{
|
|
|
return canBeAppliedValue;
|
|
return canBeAppliedValue;
|