From c88d5b373a053bfeffca585fea64bb5f91afa439 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 24 Sep 2021 21:55:01 +0200 Subject: [PATCH] Fix AI for Ludevic --- .../src/main/java/forge/ai/ability/SetStateAi.java | 11 ++++++++--- .../src/main/java/forge/game/cost/CostExile.java | 8 ++++++-- .../src/main/java/forge/game/cost/CostGainLife.java | 10 ++++------ .../res/cardsfolder/upcoming/contortionist_troupe.txt | 5 +++-- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index ff78b3cc8fd..2e73a232e34 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -3,6 +3,7 @@ package forge.ai.ability; import com.google.common.base.Predicate; import forge.ai.ComputerUtilCard; +import forge.ai.ComputerUtilCost; import forge.ai.SpellAbilityAi; import forge.card.CardStateName; import forge.game.Game; @@ -30,7 +31,7 @@ public class SetStateAi extends SpellAbilityAi { final String mode = sa.getParam("Mode"); // turning face is most likely okay - if("TurnFace".equals(mode)) { + if ("TurnFace".equals(mode)) { return true; } @@ -39,7 +40,12 @@ public class SetStateAi extends SpellAbilityAi { return false; } - if("Transform".equals(mode) || "Flip".equals(mode)) { + if (sa.getSVar("X").equals("Count$xPaid")) { + final int xPay = ComputerUtilCost.getMaxXValue(sa, aiPlayer); + sa.setXManaCostPaid(xPay); + } + + if ("Transform".equals(mode) || "Flip".equals(mode)) { return true; } return false; @@ -146,7 +152,6 @@ public class SetStateAi extends SpellAbilityAi { // TODO: compareCards assumes that a creature will transform into a creature. Need to improve this // for other things potentially transforming. return compareCards(card, transformed, ai, ph); - } private boolean shouldTurnFace(Card card, Player ai, PhaseHandler ph) { diff --git a/forge-game/src/main/java/forge/game/cost/CostExile.java b/forge-game/src/main/java/forge/game/cost/CostExile.java index 68a0981fd40..adb7f8a075d 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExile.java +++ b/forge-game/src/main/java/forge/game/cost/CostExile.java @@ -18,6 +18,7 @@ package forge.game.cost; import forge.game.Game; +import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; @@ -131,8 +132,7 @@ public class CostExile extends CostPartWithList { CardCollectionView list; if (this.sameZone) { list = game.getCardsIn(this.from); - } - else { + } else { list = payer.getCardsIn(this.from); } @@ -146,6 +146,10 @@ public class CostExile extends CostPartWithList { Integer amount = this.convertAmount(); + if (amount == null) { // try to calculate when it's defined. + amount = AbilityUtils.calculateAmount(ability.getHostCard(), getAmount(), ability); + } + // for cards like Allosaurus Rider, do not count it if (this.from == ZoneType.Hand && source.isInZone(ZoneType.Hand) && list.contains(source)) { amount++; diff --git a/forge-game/src/main/java/forge/game/cost/CostGainLife.java b/forge-game/src/main/java/forge/game/cost/CostGainLife.java index 463e4f5ef90..310d7b98ad6 100644 --- a/forge-game/src/main/java/forge/game/cost/CostGainLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostGainLife.java @@ -64,12 +64,10 @@ public class CostGainLife extends CostPart { return sb.toString(); } - public List getPotentialTargets(final Player payer, final Card source) - { + public List getPotentialTargets(final Player payer, final Card source) { List res = new ArrayList<>(); - for(Player p : payer.getGame().getPlayers()) - { - if(p.isValid(getType(), payer, source, null)) + for (Player p : payer.getGame().getPlayers()) { + if (p.isValid(getType(), payer, source, null)) res.add(p); } return res; @@ -85,7 +83,7 @@ public class CostGainLife extends CostPart { @Override public final boolean canPay(final SpellAbility ability, final Player payer) { final Integer amount = this.convertAmount(); - if ( amount == null ) return false; + if (amount == null) return false; int cntAbleToGainLife = 0; List possibleTargets = getPotentialTargets(payer, ability.getHostCard()); diff --git a/forge-gui/res/cardsfolder/upcoming/contortionist_troupe.txt b/forge-gui/res/cardsfolder/upcoming/contortionist_troupe.txt index a5aab0cfa79..c3dd6cc0413 100644 --- a/forge-gui/res/cardsfolder/upcoming/contortionist_troupe.txt +++ b/forge-gui/res/cardsfolder/upcoming/contortionist_troupe.txt @@ -3,8 +3,9 @@ ManaCost:X G Types:Creature Human PT:0/0 K:etbCounter:P1P1:X -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ X | SVarCompare$ GE3 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Coven — At the beginning of your end step, if you control three or more creatures with different powers, put a +1/+1 counter on target creature you control. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | CheckSVar$ Y | SVarCompare$ GE3 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Coven — At the beginning of your end step, if you control three or more creatures with different powers, put a +1/+1 counter on target creature you control. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 -SVar:X:Count$DifferentPower_Creature.YouCtrl +SVar:X:Count$xPaid +SVar:Y:Count$DifferentPower_Creature.YouCtrl DeckHas:Ability$Counters Oracle:Contortionist Troupe enters the battlefield with X +1/+1 counters on it.\nCoven — At the beginning of your end step, if you control three or more creatures with different powers, put a +1/+1 counter on target creature you control.