Transferring items (with test)

This commit is contained in:
marcin.sciesinski
2019-08-08 23:27:02 -07:00
parent 1353d8af06
commit c33f6902af
3 changed files with 82 additions and 41 deletions

View File

@@ -44,5 +44,7 @@ public class RuleSet {
new ToilRule(_modifiersLogic).applyRule();
new HealByDiscardRule(_modifiersLogic).applyRule();
new TransferItemRule(_modifiersLogic).applyRule();
}
}

View File

@@ -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<? extends ActivateCardAction> 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<? extends ActivateCardAction> 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;
}
});

View File

@@ -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<String, Collection<String>> extraCards = new HashMap<String, Collection<String>>();
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());
}
}