From 1303991ee7950effda72552ff710e63983e428eb Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 14 Aug 2019 17:33:06 +0000 Subject: [PATCH] CostSacrifice: allow X as amount --- forge-ai/src/main/java/forge/ai/PlayerControllerAi.java | 4 ++++ .../src/main/java/forge/game/cost/CostSacrifice.java | 6 +++++- .../res/cardsfolder/upcoming/archfiend_of_spite.txt | 6 ++---- forge-gui/src/main/java/forge/player/HumanPlay.java | 9 +++++---- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index b7a2bf62e89..529df9a08c8 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -941,6 +941,10 @@ public class PlayerControllerAi extends PlayerController { final Card source = sa.getHostCard(); final Ability emptyAbility = new AbilityStatic(source, cost, sa.getTargetRestrictions()) { @Override public void resolve() { } }; emptyAbility.setActivatingPlayer(player); + emptyAbility.setTriggeringObjects(sa.getTriggeringObjects()); + for (String sVar : sa.getSVars()) { + emptyAbility.setSVar(sVar, sa.getSVar(sVar)); + } if (ComputerUtilCost.willPayUnlessCost(sa, player, cost, alreadyPaid, allPayers) && ComputerUtilCost.canPayCost(emptyAbility, player)) { ComputerUtil.playNoStack(player, emptyAbility, game); // AI needs something to resolve to pay that cost return true; diff --git a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java index f7e57a6a2a6..46f121a07a2 100644 --- a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java +++ b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java @@ -17,6 +17,7 @@ */ package forge.game.cost; +import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; @@ -95,7 +96,10 @@ public class CostSacrifice extends CostPartWithList { CardCollectionView typeList = activator.getCardsIn(ZoneType.Battlefield); typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source, ability); - final Integer amount = this.convertAmount(); + Integer amount = this.convertAmount(); + if (amount == null) { + amount = AbilityUtils.calculateAmount(source, getAmount(), ability); + } typeList = CardLists.filter(typeList, CardPredicates.canBeSacrificedBy(ability)); diff --git a/forge-gui/res/cardsfolder/upcoming/archfiend_of_spite.txt b/forge-gui/res/cardsfolder/upcoming/archfiend_of_spite.txt index 5132226c6ac..baf49295f37 100644 --- a/forge-gui/res/cardsfolder/upcoming/archfiend_of_spite.txt +++ b/forge-gui/res/cardsfolder/upcoming/archfiend_of_spite.txt @@ -3,10 +3,8 @@ ManaCost:5 B B Types:Creature Demon PT:6/6 K:Flying -T:Mode$ DamageDone | ValidSource$ Card.OppCtrl | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ Whenever a source an opponent controls deals damage to CARDNAME, that source’s controller loses that much life unless they sacrifice that many permanents. -SVar:TrigSacrifice:DB$ Sacrifice | Defined$ TriggeredSourceController | SacValid$ Permanent | Amount$ X | References$ X | StrictAmount$ True | OptionalSacrifice$ True | RememberSacrificed$ True | SubAbility$ DBCurseDamage -SVar:DBCurseDamage:DB$ DealDamage | Defined$ TriggeredSourceController | NumDmg$ X | References$ X | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ DamageDone | ValidSource$ Card.OppCtrl | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ DBLoseLife | TriggerDescription$ Whenever a source an opponent controls deals damage to CARDNAME, that source’s controller loses that much life unless they sacrifice that many permanents. +SVar:DBLoseLife:DB$ LoseLife | Defined$ TriggeredSourceController | LifeAmount$ X | References$ X | UnlessCost$ Sac | UnlessPayer$ TriggeredSourceController SVar:X:TriggerCount$DamageAmount K:Madness:3 B B Oracle:Flying\nWhenever a source an opponent controls deals damage to Archfiend of Spite, that source’s controller loses that much life unless they sacrifice that many permanents.\nMadness {3}{B}{B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 77ab312396c..c1e1325af7d 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -569,10 +569,11 @@ public class HumanPlay { return true; } else if (part instanceof CostSacrifice) { - int amount = Integer.parseInt(((CostSacrifice)part).getAmount()); - CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Battlefield), part.getType().split(";"), p, source, sourceAbility); - boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "sacrifice." + orString); - if (!hasPaid) { return false; } + PaymentDecision pd = part.accept(hcd); + if (pd == null) + return false; + else + part.payAsDecided(p, pd, sourceAbility); } else if (part instanceof CostGainControl) { int amount = Integer.parseInt(((CostGainControl)part).getAmount());