|
@@ -383,6 +383,11 @@ void ChangeObjectVisitors::visitTyped(ICPackVisitor & visitor)
|
|
|
visitor.visitChangeObjectVisitors(*this);
|
|
|
}
|
|
|
|
|
|
+void ChangeArtifactsCostume::visitTyped(ICPackVisitor & visitor)
|
|
|
+{
|
|
|
+ visitor.visitChangeArtifactsCostume(*this);
|
|
|
+}
|
|
|
+
|
|
|
void HeroLevelUp::visitTyped(ICPackVisitor & visitor)
|
|
|
{
|
|
|
visitor.visitHeroLevelUp(*this);
|
|
@@ -613,6 +618,11 @@ void ManageBackpackArtifacts::visitTyped(ICPackVisitor & visitor)
|
|
|
visitor.visitManageBackpackArtifacts(*this);
|
|
|
}
|
|
|
|
|
|
+void ManageEquippedArtifacts::visitTyped(ICPackVisitor & visitor)
|
|
|
+{
|
|
|
+ visitor.visitManageEquippedArtifacts(*this);
|
|
|
+}
|
|
|
+
|
|
|
void AssembleArtifacts::visitTyped(ICPackVisitor & visitor)
|
|
|
{
|
|
|
visitor.visitAssembleArtifacts(*this);
|
|
@@ -1062,6 +1072,15 @@ void ChangeObjectVisitors::applyGs(CGameState * gs) const
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void ChangeArtifactsCostume::applyGs(CGameState * gs) const
|
|
|
+{
|
|
|
+ auto & allCostumes = gs->getPlayerState(player)->costumesArtifacts;
|
|
|
+ if(const auto & costume = allCostumes.find(costumeIdx); costume != allCostumes.end())
|
|
|
+ costume->second = costumeSet;
|
|
|
+ else
|
|
|
+ allCostumes.try_emplace(costumeIdx, costumeSet);
|
|
|
+}
|
|
|
+
|
|
|
void PlayerEndsGame::applyGs(CGameState * gs) const
|
|
|
{
|
|
|
PlayerState *p = gs->getPlayerState(player);
|
|
@@ -1783,69 +1802,47 @@ void MoveArtifact::applyGs(CGameState * gs)
|
|
|
|
|
|
void BulkMoveArtifacts::applyGs(CGameState * gs)
|
|
|
{
|
|
|
- enum class EBulkArtsOp
|
|
|
+ const auto bulkArtsRemove = [](std::vector<LinkedSlots> & artsPack, CArtifactSet & artSet)
|
|
|
{
|
|
|
- BULK_MOVE,
|
|
|
- BULK_REMOVE,
|
|
|
- BULK_PUT
|
|
|
+ std::vector<ArtifactPosition> packToRemove;
|
|
|
+ for(const auto & slotsPair : artsPack)
|
|
|
+ packToRemove.push_back(slotsPair.srcPos);
|
|
|
+ std::sort(packToRemove.begin(), packToRemove.end(), [](const ArtifactPosition & slot0, const ArtifactPosition & slot1) -> bool
|
|
|
+ {
|
|
|
+ return slot0.num > slot1.num;
|
|
|
+ });
|
|
|
+
|
|
|
+ for(const auto & slot : packToRemove)
|
|
|
+ {
|
|
|
+ auto * art = artSet.getArt(slot);
|
|
|
+ assert(art);
|
|
|
+ art->removeFrom(artSet, slot);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
- auto bulkArtsOperation = [this, gs](std::vector<LinkedSlots> & artsPack,
|
|
|
- CArtifactSet & artSet, EBulkArtsOp operation) -> void
|
|
|
+ const auto bulkArtsPut = [](std::vector<LinkedSlots> & artsPack, CArtifactSet & initArtSet, CArtifactSet & dstArtSet)
|
|
|
{
|
|
|
- int numBackpackArtifactsMoved = 0;
|
|
|
- for(auto & slot : artsPack)
|
|
|
+ for(const auto & slotsPair : artsPack)
|
|
|
{
|
|
|
- // When an object gets removed from the backpack, the backpack shrinks
|
|
|
- // so all the following indices will be affected. Thus, we need to update
|
|
|
- // the subsequent artifact slots to account for that
|
|
|
- auto srcPos = slot.srcPos;
|
|
|
- if(ArtifactUtils::isSlotBackpack(srcPos) && (operation != EBulkArtsOp::BULK_PUT))
|
|
|
- {
|
|
|
- srcPos = ArtifactPosition(srcPos.num - numBackpackArtifactsMoved);
|
|
|
- }
|
|
|
- auto * art = artSet.getArt(srcPos);
|
|
|
+ auto * art = initArtSet.getArt(slotsPair.srcPos);
|
|
|
assert(art);
|
|
|
- switch(operation)
|
|
|
- {
|
|
|
- case EBulkArtsOp::BULK_MOVE:
|
|
|
- art->move(artSet, srcPos, *gs->getArtSet(ArtifactLocation(dstArtHolder, dstCreature)), slot.dstPos);
|
|
|
- break;
|
|
|
- case EBulkArtsOp::BULK_REMOVE:
|
|
|
- art->removeFrom(artSet, srcPos);
|
|
|
- break;
|
|
|
- case EBulkArtsOp::BULK_PUT:
|
|
|
- art->putAt(*gs->getArtSet(ArtifactLocation(srcArtHolder, srcCreature)), slot.dstPos);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if(srcPos >= ArtifactPosition::BACKPACK_START)
|
|
|
- {
|
|
|
- numBackpackArtifactsMoved++;
|
|
|
- }
|
|
|
+ art->putAt(dstArtSet, slotsPair.dstPos);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
auto * leftSet = gs->getArtSet(ArtifactLocation(srcArtHolder, srcCreature));
|
|
|
- if(swap)
|
|
|
- {
|
|
|
- // Swap
|
|
|
- auto * rightSet = gs->getArtSet(ArtifactLocation(dstArtHolder, dstCreature));
|
|
|
- CArtifactFittingSet artFittingSet(leftSet->bearerType());
|
|
|
-
|
|
|
- artFittingSet.artifactsWorn = rightSet->artifactsWorn;
|
|
|
- artFittingSet.artifactsInBackpack = rightSet->artifactsInBackpack;
|
|
|
-
|
|
|
- bulkArtsOperation(artsPack1, *rightSet, EBulkArtsOp::BULK_REMOVE);
|
|
|
- bulkArtsOperation(artsPack0, *leftSet, EBulkArtsOp::BULK_MOVE);
|
|
|
- bulkArtsOperation(artsPack1, artFittingSet, EBulkArtsOp::BULK_PUT);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- bulkArtsOperation(artsPack0, *leftSet, EBulkArtsOp::BULK_MOVE);
|
|
|
- }
|
|
|
+ assert(leftSet);
|
|
|
+ auto * rightSet = gs->getArtSet(ArtifactLocation(dstArtHolder, dstCreature));
|
|
|
+ assert(rightSet);
|
|
|
+ CArtifactFittingSet artInitialSetLeft(*leftSet);
|
|
|
+ bulkArtsRemove(artsPack0, *leftSet);
|
|
|
+ if(!artsPack1.empty())
|
|
|
+ {
|
|
|
+ CArtifactFittingSet artInitialSetRight(*rightSet);
|
|
|
+ bulkArtsRemove(artsPack1, *rightSet);
|
|
|
+ bulkArtsPut(artsPack1, artInitialSetRight, *leftSet);
|
|
|
+ }
|
|
|
+ bulkArtsPut(artsPack0, artInitialSetLeft, *rightSet);
|
|
|
}
|
|
|
|
|
|
void AssembledArtifact::applyGs(CGameState *gs)
|