Support Captain America

This commit is contained in:
tool4EvEr
2024-10-20 10:45:16 +02:00
parent 43434e4999
commit cf7aa54769
4 changed files with 30 additions and 19 deletions

View File

@@ -838,12 +838,12 @@ public class AiCostDecision extends CostDecisionMakerBase {
@Override @Override
public PaymentDecision visit(CostUnattach cost) { public PaymentDecision visit(CostUnattach cost) {
final Card cardToUnattach = cost.findCardToUnattach(source, player, ability); final CardCollection cardToUnattach = cost.findCardToUnattach(source, player, ability);
if (cardToUnattach == null) { if (cardToUnattach.isEmpty()) {
// We really shouldn't be able to get here if there's nothing to unattach // We really shouldn't be able to get here if there's nothing to unattach
return null; return null;
} }
return PaymentDecision.card(cardToUnattach); return PaymentDecision.card(cardToUnattach.getFirst());
} }
@Override @Override

View File

@@ -17,9 +17,8 @@
*/ */
package forge.game.cost; package forge.game.cost;
import java.util.List;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists; import forge.game.card.CardLists;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -70,27 +69,27 @@ public class CostUnattach extends CostPartWithList {
*/ */
@Override @Override
public final boolean canPay(final SpellAbility ability, final Player payer, final boolean effect) { 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 (payCostFromSource()) {
if (source.isEquipping()) { if (source.isEquipping()) {
return source; attachees.add(source);
} }
} else if (getType().equals("OriginalHost")) { } else if (getType().equals("OriginalHost")) {
Card originalEquipment = ability.getOriginalHost(); Card originalEquipment = ability.getOriginalHost();
if (originalEquipment.isEquipping()) { if (originalEquipment.isEquipping()) {
return originalEquipment; attachees.add(originalEquipment);
} }
} else { } else {
List<Card> attachees = CardLists.getValidCards(source.getEquippedBy(), this.getType(), activator, source, ability); attachees.addAll(source.getEquippedBy());
if (attachees.size() > 0) { if (!getType().contains("X") || ability.getXManaCostPaid() != null) {
// Just pick the first one, although maybe give a dialog attachees = CardLists.getValidCards(attachees, this.getType(), activator, source, ability);
return attachees.get(0);
} }
} }
return null; return attachees;
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -2,8 +2,8 @@ Name:Captain America, First Avenger
ManaCost:R W U ManaCost:R W U
Types:Legendary Creature Human Soldier Hero Types:Legendary Creature Human Soldier Hero
PT:4/4 PT:4/4
A:AB$ DealDamage | Cost$ 3 Unattach<Equipment.Attached/Equipment attached to NICKNAME> | 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. A:AB$ DealDamage | Cost$ 3 Unattach<Equipment.Attached+cmcEQX/an Equipment attached to NICKNAME> | 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:Unattached$CardManaCost 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. 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 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. 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.

View File

@@ -1330,9 +1330,20 @@ public class HumanCostDecision extends CostDecisionMakerBase {
@Override @Override
public PaymentDecision visit(final CostUnattach cost) { public PaymentDecision visit(final CostUnattach cost) {
final Card cardToUnattach = cost.findCardToUnattach(source, player, ability); final CardCollection cardToUnattach = cost.findCardToUnattach(source, player, ability);
if (cardToUnattach != null && confirmAction(cost, Localizer.getInstance().getMessage("lblUnattachCardConfirm", CardTranslation.getTranslatedName(cardToUnattach.getName())))) { if (cardToUnattach.size() == 1 && confirmAction(cost, Localizer.getInstance().getMessage("lblUnattachCardConfirm", CardTranslation.getTranslatedName(cardToUnattach.getFirst().getName())))) {
return PaymentDecision.card(cardToUnattach); 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; return null;
} }
@@ -1341,6 +1352,7 @@ public class HumanCostDecision extends CostDecisionMakerBase {
public boolean paysRightAfterDecision() { public boolean paysRightAfterDecision() {
return true; return true;
} }
private boolean confirmAction(CostPart costPart, String message) { private boolean confirmAction(CostPart costPart, String message) {
CardView cardView = ability.getCardView(); CardView cardView = ability.getCardView();
if (GuiBase.getInterface().isLibgdxPort()) { if (GuiBase.getInterface().isLibgdxPort()) {