Explorar o código

Partial support for antilag in army management

Ivan Savenko hai 4 meses
pai
achega
6a22b042ac
Modificáronse 2 ficheiros con 57 adicións e 5 borrados
  1. 53 1
      client/AntilagServer.cpp
  2. 4 4
      client/AntilagServer.h

+ 53 - 1
client/AntilagServer.cpp

@@ -20,7 +20,7 @@
 #include "../lib/serializer/GameConnection.h"
 #include "GameInstance.h"
 
-class DLL_LINKAGE AntilagRollbackNotSupportedException : public std::runtime_error
+class AntilagRollbackNotSupportedException : public std::runtime_error
 {
 public:
 	using std::runtime_error::runtime_error;
@@ -51,6 +51,53 @@ void AntilagRollbackGeneratorVisitor::visitPlayerBlocked(PlayerBlocked & pack)
 	// 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)
 {
 	auto rollbackVisit = std::make_unique<HeroVisitCastle>();
@@ -105,6 +152,11 @@ void AntilagReplyPredictionVisitor::visitMoveHero(MoveHero & pack)
 	canBeAppliedValue = true;
 }
 
+void AntilagReplyPredictionVisitor::visitArrangeStacks(ArrangeStacks & pack)
+{
+	canBeAppliedValue = true;
+}
+
 bool AntilagReplyPredictionVisitor::canBeApplied() const
 {
 	return canBeAppliedValue;

+ 4 - 4
client/AntilagServer.h

@@ -49,7 +49,7 @@ class AntilagReplyPredictionVisitor final : public VCMI_LIB_WRAP_NAMESPACE(ICPac
 	//void visitDismissHero(DismissHero & pack) override;
 	void visitMoveHero(MoveHero & pack) override;
 	//void visitCastleTeleportHero(CastleTeleportHero & pack) override;
-	//void visitArrangeStacks(ArrangeStacks & pack) override;
+	void visitArrangeStacks(ArrangeStacks & pack) override;
 	//void visitBulkMoveArmy(BulkMoveArmy & pack) override;
 	//void visitBulkSplitStack(BulkSplitStack & pack) override;
 	//void visitBulkMergeStacks(BulkMergeStacks & pack) override;
@@ -108,10 +108,10 @@ private:
 	//void visitChangeStackCount(ChangeStackCount & pack) override;
 	//void visitSetStackType(SetStackType & pack) override;
 	//void visitEraseStack(EraseStack & pack) override;
-	//void visitSwapStacks(SwapStacks & pack) override;
 	//void visitInsertNewStack(InsertNewStack & pack) override;
-	//void visitRebalanceStacks(RebalanceStacks & pack) override;
-	//void visitBulkRebalanceStacks(BulkRebalanceStacks & pack) override;
+	void visitSwapStacks(SwapStacks & pack) override;
+	void visitRebalanceStacks(RebalanceStacks & pack) override;
+	void visitBulkRebalanceStacks(BulkRebalanceStacks & pack) override;
 	//void visitGrowUpArtifact(GrowUpArtifact & pack) override;
 	//void visitPutArtifact(PutArtifact & pack) override;
 	//void visitBulkEraseArtifacts(BulkEraseArtifacts & pack) override;