diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 20bbcd6a2dc..964d38dc328 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -746,7 +746,7 @@ public class AiController { return AiPlayDecision.CantPlaySa; } - boolean xCost = sa.getPayCosts().hasXInAnyCostPart(); + boolean xCost = sa.getPayCosts().hasXInAnyCostPart() || sa.getHostCard().hasStartOfKeyword("Strive"); if (!xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check // when the AI won't even be able to play the spell in the first place (even if it could afford it) diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index e0f03379bd2..b36c2ac87a8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -45,7 +45,7 @@ public class CopyPermanentAi extends SpellAbilityAi { } if ("MomirAvatar".equals(aiLogic)) { - return SpecialCardAi.MomirVigAvatar.consider(aiPlayer, sa); + return SpecialCardAi.MomirVigAvatar.consider(aiPlayer, sa); } else if ("MimicVat".equals(aiLogic)) { return SpecialCardAi.MimicVat.considerCopy(aiPlayer, sa); } else if ("AtEOT".equals(aiLogic)) { @@ -59,7 +59,7 @@ public class CopyPermanentAi extends SpellAbilityAi { } } - if (sa.hasParam("AtEOT") && !aiPlayer.getGame().getPhaseHandler().is(PhaseType.MAIN1)) { + if (sa.hasParam("AtEOT") && !ph.is(PhaseType.MAIN1)) { return false; } @@ -118,7 +118,6 @@ public class CopyPermanentAi extends SpellAbilityAi { final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); final boolean canCopyLegendary = sa.hasParam("NonLegendary"); - // //// // Targeting if (sa.usesTargeting()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java index 17d69dcdbc0..9bdbeb8f6c1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java @@ -163,8 +163,6 @@ public class DiscardAi extends SpellAbilityAi { return false; } // discardTargetAI() - - @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); @@ -211,9 +209,8 @@ public class DiscardAi extends SpellAbilityAi { return true; } // discardCheckDrawbackAI() - public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - if ( mode == PlayerActionConfirmMode.Random ) { // + if ( mode == PlayerActionConfirmMode.Random ) { // TODO For now AI will always discard Random used currently with: Balduvian Horde and similar cards return true; } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index ad445fd87dd..f27ce2f2f53 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1412,7 +1412,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { @Override public int addCounter(final CounterType counterType, final int n, final Player source, final SpellAbility cause, final boolean applyMultiplier, final boolean fireEvents, GameEntityCounterTable table) { int addAmount = n; - if(addAmount <= 0 || !canReceiveCounters(counterType)) { + if (addAmount <= 0 || !canReceiveCounters(counterType)) { // As per rule 107.1b return 0; } diff --git a/forge-gui/res/cardsfolder/r/rise_of_the_hobgoblins.txt b/forge-gui/res/cardsfolder/r/rise_of_the_hobgoblins.txt index 84eb235ab51..c64f50293b3 100644 --- a/forge-gui/res/cardsfolder/r/rise_of_the_hobgoblins.txt +++ b/forge-gui/res/cardsfolder/r/rise_of_the_hobgoblins.txt @@ -1,7 +1,7 @@ Name:Rise of the Hobgoblins ManaCost:RW RW Types:Enchantment -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {X}. If you do, create X 1/1 red and white Goblin Soldier creature tokens. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {X}. If you do, create X 1/1 red and white Goblin Soldier creature tokens. SVar:TrigToken:AB$ Token | Cost$ X | TokenAmount$ X | TokenScript$ rw_1_1_goblin_soldier | TokenOwner$ You | LegacyImage$ rw 1 1 goblin soldier eve SVar:X:Count$xPaid A:AB$ PumpAll | Cost$ RW | ValidCards$ Creature.Red+YouCtrl,Creature.White+YouCtrl | KW$ First Strike | SpellDescription$ Red creatures and white creatures you control gain first strike until end of turn.