1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00
Files
vcmi/client/netlag/PackRollbackGeneratorVisitor.cpp

127 lines
3.6 KiB
C++

/*
* PackRollbackGeneratorVisitor.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "PackRollbackGeneratorVisitor.h"
#include "../lib/gameState/CGameState.h"
#include "../lib/mapObjects/CGHeroInstance.h"
void PackRollbackGeneratorVisitor::visitPackageReceived(PackageReceived & pack)
{
success = true;
// no-op rollback?
}
void PackRollbackGeneratorVisitor::visitPackageApplied(PackageApplied & pack)
{
success = true;
// no-op rollback?
}
void PackRollbackGeneratorVisitor::visitPlayerBlocked(PlayerBlocked & pack)
{
success = true;
// no-op rollback?
}
void PackRollbackGeneratorVisitor::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 PackRollbackGeneratorVisitor::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 PackRollbackGeneratorVisitor::visitBulkRebalanceStacks(BulkRebalanceStacks & pack)
{
for(auto & subpack : pack.moves)
visitRebalanceStacks(subpack);
success = true;
}
void PackRollbackGeneratorVisitor::visitHeroVisitCastle(HeroVisitCastle & pack)
{
auto rollbackVisit = std::make_unique<HeroVisitCastle>();
rollbackVisit->startVisit = !pack.startVisit;
rollbackVisit->tid = pack.tid;
rollbackVisit->hid = pack.hid;
rollbackPacks.push_back(std::move(rollbackVisit));
success = true;
}
void PackRollbackGeneratorVisitor::visitTryMoveHero(TryMoveHero & pack)
{
auto rollbackMove = std::make_unique<TryMoveHero>();
auto rollbackFow = std::make_unique<FoWChange>();
const auto * movedHero = gs.getHero(pack.id);
rollbackMove->id = pack.id;
rollbackMove->movePoints = movedHero->movementPointsRemaining();
rollbackMove->result = pack.result;
if(pack.result == TryMoveHero::EMBARK)
rollbackMove->result = TryMoveHero::DISEMBARK;
if(pack.result == TryMoveHero::DISEMBARK)
rollbackMove->result = TryMoveHero::EMBARK;
rollbackMove->start = pack.end;
rollbackMove->end = pack.start;
rollbackFow->mode = ETileVisibility::HIDDEN;
rollbackFow->player = movedHero->getOwner();
rollbackFow->tiles = pack.fowRevealed;
rollbackPacks.push_back(std::move(rollbackMove));
rollbackPacks.push_back(std::move(rollbackFow));
success = true;
}
bool PackRollbackGeneratorVisitor::canBeRolledBack() const
{
return success;
}
std::vector<std::unique_ptr<CPackForClient>> PackRollbackGeneratorVisitor::acquireRollbackPacks()
{
return std::move(rollbackPacks);
}