From cf7aa547691eff5f29d523fa0c779c7a0d9b09d1 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Sun, 20 Oct 2024 10:45:16 +0200 Subject: [PATCH] Support Captain America --- .../main/java/forge/ai/AiCostDecision.java | 6 +++--- .../java/forge/game/cost/CostUnattach.java | 21 +++++++++---------- .../captain_america_first_avenger.txt | 4 ++-- .../java/forge/player/HumanCostDecision.java | 18 +++++++++++++--- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index fd176603ff0..662a42b7318 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -838,12 +838,12 @@ public class AiCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(CostUnattach cost) { - final Card cardToUnattach = cost.findCardToUnattach(source, player, ability); - if (cardToUnattach == null) { + final CardCollection cardToUnattach = cost.findCardToUnattach(source, player, ability); + if (cardToUnattach.isEmpty()) { // We really shouldn't be able to get here if there's nothing to unattach return null; } - return PaymentDecision.card(cardToUnattach); + return PaymentDecision.card(cardToUnattach.getFirst()); } @Override diff --git a/forge-game/src/main/java/forge/game/cost/CostUnattach.java b/forge-game/src/main/java/forge/game/cost/CostUnattach.java index f4d6739f6fd..97d863b416f 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUnattach.java +++ b/forge-game/src/main/java/forge/game/cost/CostUnattach.java @@ -17,9 +17,8 @@ */ package forge.game.cost; -import java.util.List; - import forge.game.card.Card; +import forge.game.card.CardCollection; import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -70,27 +69,27 @@ public class CostUnattach extends CostPartWithList { */ @Override public final boolean canPay(final SpellAbility ability, final Player payer, final boolean effect) { - return findCardToUnattach(ability.getHostCard(), payer, ability) != null; + return !findCardToUnattach(ability.getHostCard(), payer, ability).isEmpty(); } - public Card findCardToUnattach(final Card source, Player activator, SpellAbility ability) { + public CardCollection findCardToUnattach(final Card source, Player activator, SpellAbility ability) { + CardCollection attachees = new CardCollection(); if (payCostFromSource()) { if (source.isEquipping()) { - return source; + attachees.add(source); } } else if (getType().equals("OriginalHost")) { Card originalEquipment = ability.getOriginalHost(); if (originalEquipment.isEquipping()) { - return originalEquipment; + attachees.add(originalEquipment); } } else { - List attachees = CardLists.getValidCards(source.getEquippedBy(), this.getType(), activator, source, ability); - if (attachees.size() > 0) { - // Just pick the first one, although maybe give a dialog - return attachees.get(0); + attachees.addAll(source.getEquippedBy()); + if (!getType().contains("X") || ability.getXManaCostPaid() != null) { + attachees = CardLists.getValidCards(attachees, this.getType(), activator, source, ability); } } - return null; + return attachees; } /* (non-Javadoc) diff --git a/forge-gui/res/cardsfolder/upcoming/captain_america_first_avenger.txt b/forge-gui/res/cardsfolder/upcoming/captain_america_first_avenger.txt index a2bddbc99ba..201c540ead9 100644 --- a/forge-gui/res/cardsfolder/upcoming/captain_america_first_avenger.txt +++ b/forge-gui/res/cardsfolder/upcoming/captain_america_first_avenger.txt @@ -2,8 +2,8 @@ Name:Captain America, First Avenger ManaCost:R W U Types:Legendary Creature Human Soldier Hero PT:4/4 -A:AB$ DealDamage | Cost$ 3 Unattach | PrecostDesc$ Throw . . . — | ValidTgts$ Any | TgtPrompt$ Select any target to distribute damage to | NumDmg$ X | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ X | SpellDescription$ He deals damage equal to that Equipment's mana value divided as you choose among one, two, or three targets. -SVar:X:Unattached$CardManaCost +A:AB$ DealDamage | Cost$ 3 Unattach | Announce$ X | PrecostDesc$ Throw . . . — | ValidTgts$ Any | TgtPrompt$ Select any target to distribute damage to | NumDmg$ X | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ X | SpellDescription$ He deals damage equal to that Equipment's mana value divided as you choose among one, two, or three targets. +SVar:X:Count$xPaid T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBAttach | TriggerDescription$ . . . Catch — At the beginning of combat on your turn, attach up one target Equipment you control to NICKNAME. SVar:DBAttach:DB$ Attach | ValidTgts$ Equipment.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target Equipment you control | Object$ Targeted | Defined$ Self Oracle:Throw . . . — {3}, Unattach an Equipment from Captain America: He deals damage equal to that Equipment's mana value divided as you choose among one, two, or three targets.\n. . . Catch — At the beginning of combat on your turn, attach up one target Equipment you control to Captain America. diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 4ffa07d42fc..b64572b0c43 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -1330,9 +1330,20 @@ public class HumanCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(final CostUnattach cost) { - final Card cardToUnattach = cost.findCardToUnattach(source, player, ability); - if (cardToUnattach != null && confirmAction(cost, Localizer.getInstance().getMessage("lblUnattachCardConfirm", CardTranslation.getTranslatedName(cardToUnattach.getName())))) { - return PaymentDecision.card(cardToUnattach); + final CardCollection cardToUnattach = cost.findCardToUnattach(source, player, ability); + if (cardToUnattach.size() == 1 && confirmAction(cost, Localizer.getInstance().getMessage("lblUnattachCardConfirm", CardTranslation.getTranslatedName(cardToUnattach.getFirst().getName())))) { + return PaymentDecision.card(cardToUnattach.getFirst()); + } + if (cardToUnattach.size() > 1) { + int c = cost.getAbilityAmount(ability); + final InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, c, cardToUnattach, ability); + inp.setCancelAllowed(true); + inp.setMessage(Localizer.getInstance().getMessage("lblUnattachCardConfirm", cost.getDescriptiveType())); + inp.showAndWait(); + if (inp.hasCancelled() || inp.getSelected().size() != c) { + return null; + } + return PaymentDecision.card(inp.getSelected()); } return null; } @@ -1341,6 +1352,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { public boolean paysRightAfterDecision() { return true; } + private boolean confirmAction(CostPart costPart, String message) { CardView cardView = ability.getCardView(); if (GuiBase.getInterface().isLibgdxPort()) {