From c33f6902afa4a7a54d1d27e63acc173ea0ba3a62 Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Thu, 8 Aug 2019 23:27:02 -0700 Subject: [PATCH] Transferring items (with test) --- .../gempukku/lotro/logic/timing/RuleSet.java | 2 + .../logic/timing/rules/TransferItemRule.java | 83 ++++++++++--------- .../com/gempukku/lotro/at/TransferAtTest.java | 38 +++++++++ 3 files changed, 82 insertions(+), 41 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/TransferAtTest.java diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java index 66589c563..c0005f495 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java @@ -44,5 +44,7 @@ public class RuleSet { new ToilRule(_modifiersLogic).applyRule(); new HealByDiscardRule(_modifiersLogic).applyRule(); + + new TransferItemRule(_modifiersLogic).applyRule(); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/TransferItemRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/TransferItemRule.java index 4faff0dcb..82446c317 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/TransferItemRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/TransferItemRule.java @@ -4,15 +4,20 @@ import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.common.Side; import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.LotroCardBlueprint; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.ActivateCardAction; +import com.gempukku.lotro.logic.actions.TransferPermanentAction; +import com.gempukku.lotro.logic.cardtype.AbstractAttachableFPPossession; import com.gempukku.lotro.logic.modifiers.AbstractModifier; import com.gempukku.lotro.logic.modifiers.ModifierEffect; import com.gempukku.lotro.logic.modifiers.ModifiersLogic; import com.gempukku.lotro.logic.modifiers.condition.PhaseCondition; +import java.util.Collections; import java.util.List; public class TransferItemRule { @@ -28,47 +33,43 @@ public class TransferItemRule { Filters.and(Side.FREE_PEOPLE, Filters.inPlay(), Zone.ATTACHED, Filters.or(CardType.POSSESSION, CardType.ARTIFACT)), new PhaseCondition(Phase.FELLOWSHIP), ModifierEffect.EXTRA_ACTION_MODIFIER) { @Override - public List getExtraPhaseAction(LotroGame game, PhysicalCard card) { -// if (game.getModifiersQuerying().canBeTransferred(game, card)) { -// final AbstractAttachableFPPossession attachable = (AbstractAttachableFPPossession) card.getBlueprint(); -// attachable.getFullValidTargetFilter(card.getOwner(), game) -// if (Filters.countActive(game, modifiersQuerying, validTargetFilter)>0 -// && gameState.getCurrentPhase() == Phase.FELLOWSHIP -// && self.getZone() == Zone.ATTACHED) { -// -// Filter validTransferFilter; -// -// PhysicalCard attachedToCard = self.getAttachedTo(); -// LotroCardBlueprint attachedTo = attachedToCard.getBlueprint(); -// if (attachedTo.getCardType() == CardType.COMPANION) { -// validTransferFilter = Filters.and(validTargetFilter, -// Filters.or( -// CardType.COMPANION, -// Filters.allyAtHome)); -// } else if (attachedTo.isAllyAtHome(gameState.getCurrentSiteNumber(), gameState.getCurrentSiteBlock())) { -// validTransferFilter = Filters.and(validTargetFilter, -// Filters.or( -// CardType.COMPANION, -// Filters.allyWithSameHome(attachedToCard))); -// } else { -// validTransferFilter = Filters.and(validTargetFilter, -// Filters.allyWithSameHome(attachedToCard)); -// } -// -// validTransferFilter = Filters.and(validTransferFilter, -// Filters.not(self.getAttachedTo()), -// new Filter() { -// @Override -// public boolean accepts(LotroGame game, PhysicalCard physicalCard) { -// return game.getModifiersQuerying().canHaveTransferredOn(game, self, physicalCard); -// } -// }); -// -// if (Filters.countActive(game, validTransferFilter)>0) -// actions.add(new TransferPermanentAction(self, validTransferFilter)); -// } -// } -// appendTransferPossessionAction(actions, game, self, getFullValidTargetFilter(playerId, game, self)); + public List getExtraPhaseAction(LotroGame game, final PhysicalCard card) { + if (game.getModifiersQuerying().canBeTransferred(game, card)) { + final AbstractAttachableFPPossession attachable = (AbstractAttachableFPPossession) card.getBlueprint(); + final Filter validTargetFilter = attachable.getFullValidTargetFilter(card.getOwner(), game, card); + if (Filters.countActive(game, validTargetFilter)>0) { + Filter validTransferFilter; + + PhysicalCard attachedToCard = card.getAttachedTo(); + LotroCardBlueprint attachedTo = attachedToCard.getBlueprint(); + if (attachedTo.getCardType() == CardType.COMPANION) { + validTransferFilter = Filters.and(validTargetFilter, + Filters.or( + CardType.COMPANION, + Filters.allyAtHome)); + } else if (attachedTo.isAllyAtHome(game.getGameState().getCurrentSiteNumber(), game.getGameState().getCurrentSiteBlock())) { + validTransferFilter = Filters.and(validTargetFilter, + Filters.or( + CardType.COMPANION, + Filters.allyWithSameHome(attachedToCard))); + } else { + validTransferFilter = Filters.and(validTargetFilter, + Filters.allyWithSameHome(attachedToCard)); + } + + validTransferFilter = Filters.and(validTransferFilter, + Filters.not(card.getAttachedTo()), + new Filter() { + @Override + public boolean accepts(LotroGame game, PhysicalCard physicalCard) { + return game.getModifiersQuerying().canHaveTransferredOn(game, card, physicalCard); + } + }); + + if (Filters.countActive(game, validTransferFilter)>0) + return Collections.singletonList(new TransferPermanentAction(card, validTransferFilter)); + } + } return null; } }); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/TransferAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/TransferAtTest.java new file mode 100644 index 000000000..1c1e5eb55 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/TransferAtTest.java @@ -0,0 +1,38 @@ +package com.gempukku.lotro.at; + +import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.logic.decisions.AwaitingDecision; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import static junit.framework.Assert.assertEquals; + +public class TransferAtTest extends AbstractAtTest { + @Test + public void transfer() throws DecisionResultInvalidException, CardNotFoundException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl athelas= new PhysicalCardImpl(100, "1_94", P1, _library.getLotroCardBlueprint("1_94")); + PhysicalCardImpl aragorn= new PhysicalCardImpl(101, "1_89", P1, _library.getLotroCardBlueprint("1_89")); + PhysicalCardImpl boromir= new PhysicalCardImpl(102, "1_96", P1, _library.getLotroCardBlueprint("1_96")); + + _game.getGameState().addCardToZone(_game, aragorn, Zone.FREE_CHARACTERS); + _game.getGameState().addCardToZone(_game, boromir, Zone.FREE_CHARACTERS); + _game.getGameState().addCardToZone(_game, athelas, Zone.ATTACHED); + athelas.attachTo(aragorn); + + skipMulligans(); + + final String transferAction = getCardActionId(_userFeedback.getAwaitingDecision(P1), "Transfer"); + playerDecided(P1, transferAction); + + assertEquals(boromir, athelas.getAttachedTo()); + } +}