From 83e976680925eabcd79b361b14af830c4e4168c7 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 21 Nov 2023 13:15:21 -0500 Subject: [PATCH] market_gnome.txt and support --- .../main/java/forge/ai/AiCostDecision.java | 7 ++-- .../src/main/java/forge/game/GameAction.java | 2 + .../forge/game/trigger/TriggerExiled.java | 39 +++++++++++++++++++ .../res/cardsfolder/upcoming/market_gnome.txt | 11 ++++++ 4 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/market_gnome.txt diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 07be4d52f7b..25ffd9b03e7 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -141,20 +141,21 @@ public PaymentDecision visit(CostDraw cost) { @Override public PaymentDecision visit(CostExile cost) { + String type = cost.getType(); if (cost.payCostFromSource()) { return PaymentDecision.card(source); } - if (cost.getType().equals("All")) { + if (type.equals("All")) { return PaymentDecision.card(player.getCardsIn(cost.getFrom())); } - else if (cost.getType().contains("FromTopGrave")) { + else if (type.contains("FromTopGrave")) { return null; } int c = cost.getAbilityAmount(ability); - if (cost.getFrom().equals(ZoneType.Library)) { + if (cost.from.size() == 1 && cost.getFrom().get(0).equals(ZoneType.Library)) { return PaymentDecision.card(player.getCardsIn(ZoneType.Library, c)); } else if (cost.zoneRestriction == 0) { diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 510ba1ece5c..9628f0e2aa7 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -945,6 +945,8 @@ public final Card exile(final Card c, SpellAbility cause, Map runParams) { return false; } + if (hasParam("WhileKeyword")) { + final String keyword = getParam("WhileKeyword"); + boolean withKeyword = false; + + IndividualCostPaymentInstance currentPayment = (IndividualCostPaymentInstance) runParams.get(AbilityKey.IndividualCostPaymentInstance); + + SpellAbility sa; + if (currentPayment != null) { + sa = currentPayment.getPayment().getAbility(); + + if (sa != null && sa.getHostCard() != null) { + if ((sa.isSpell() || sa.isAbility()) && sa.getHostCard().hasStartOfUnHiddenKeyword(keyword)) { + withKeyword = true; + } + } + } + + if (!withKeyword) { + CostPaymentStack stack = (CostPaymentStack) runParams.get(AbilityKey.CostStack); + + for (IndividualCostPaymentInstance individual : stack) { + sa = individual.getPayment().getAbility(); + + if (sa == null || sa.getHostCard() == null) + continue; + + if ((sa.isSpell() || sa.isAbility()) && sa.getHostCard().hasStartOfUnHiddenKeyword(keyword)) { + withKeyword = true; + break; + } + } + } + + if (!withKeyword) + return false; + } + return true; } diff --git a/forge-gui/res/cardsfolder/upcoming/market_gnome.txt b/forge-gui/res/cardsfolder/upcoming/market_gnome.txt new file mode 100644 index 00000000000..f951c6c88f7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/market_gnome.txt @@ -0,0 +1,11 @@ +Name:Market Gnome +ManaCost:W +Types:Artifact Creature Gnome +PT:0/3 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME dies, you gain 1 life and draw a card. +T:Mode$ Exiled | Origin$ Battlefield | WhileKeyword$ Craft | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME is exiled from the battlefield while you're activating a craft ability, you gain 1 life and draw a card. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw +DeckHas:Ability$LifeGain +SVar:SacMe:2 +Oracle:When Market Gnome dies, you gain 1 life and draw a card.\nWhen Market Gnome is exiled from the battlefield while you're activating a craft ability, you gain 1 life and draw a card.