diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 501fab87101..6f94142741b 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -275,27 +275,6 @@ public class AiAttackController { return false; } - // the attacker will die to a triggered ability (e.g. Sarkhan the Masterless) - for (Card c : ai.getOpponents().getCardsIn(ZoneType.Battlefield)) { - for (Trigger t : c.getTriggers()) { - if (t.getMode() == TriggerType.Attacks) { - SpellAbility sa = t.ensureAbility(); - if (sa == null) { - continue; - } - - if (sa.getApi() == ApiType.EachDamage && "TriggeredAttacker".equals(sa.getParam("Defined"))) { - List valid = CardLists.getValidCards(c.getController().getCreaturesInPlay(), sa.getParam("ValidCards"), c.getController(), c, sa); - // TODO: this assumes that 1 damage is dealt per creature. Improve this to check the parameter/X to determine - // how much damage is dealt by each of the creatures in the valid list. - if (attacker.getNetToughness() <= valid.size()) { - return false; - } - } - } - } - } - if ("TRUE".equals(attacker.getSVar("HasAttackEffect"))) { return true; } @@ -1005,7 +984,7 @@ public class AiAttackController { if (attackMax != -1 && combat.getAttackers().size() >= attackMax) return aiAggression; - // TODO if lifeInDanger use chance to hold back some + // TODO if lifeInDanger use chance to hold back some (especially in multiplayer) if (canAttackWrapper(attacker, defender) && isEffectiveAttacker(ai, attacker, combat, defender)) { combat.addAttacker(attacker, defender); } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 602d8a23f07..b70f478fcc3 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -1433,7 +1433,11 @@ public class ComputerUtilCombat { int damage = AbilityUtils.calculateAmount(source, sa.getParam("NumDmg"), sa); toughness -= predictDamageTo(attacker, damage, source, false); - continue; + } else if (sa.getApi() == ApiType.EachDamage && "TriggeredAttackerLKICopy".equals(sa.getParam("Defined"))) { + List valid = CardLists.getValidCards(source.getController().getCreaturesInPlay(), sa.getParam("ValidCards"), source.getController(), source, sa); + // TODO: this assumes that 1 damage is dealt per creature. Improve this to check the parameter/X to determine + // how much damage is dealt by each of the creatures in the valid list. + toughness -= valid.size(); } else if (ApiType.Pump.equals(sa.getApi())) { if (!sa.hasParam("NumDef")) { continue; 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 ce71d039611..0dce93c1862 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2469,7 +2469,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr || keyword.startsWith("Reconfigure") || keyword.startsWith("Squad") || keyword.startsWith("Miracle") || keyword.startsWith("More Than Meets the Eye") || keyword.startsWith("Level up") || keyword.startsWith("Plot") - || keyword.startsWith("Offspring") || keyword.startsWith("Mayhem")) { + || keyword.startsWith("Offspring") || keyword.startsWith("Mayhem") + || keyword.startsWith("Sneak")) { String[] k = keyword.split(":"); sbLong.append(k[0]); if (k.length > 1) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index d4faab44a01..534deb267fb 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3645,6 +3645,7 @@ public class CardFactoryUtil { newSA.putParam("Secondary", "True"); newSA.setAlternativeCost(AlternativeCost.Sneak); newSA.setIntrinsic(intrinsic); + newSA.getRestrictions().setInstantSpeed(true); inst.addSpellAbility(newSA); } else if (keyword.startsWith("Station")) { String effect = "AB$ PutCounter | Cost$ tapXType<1/Creature.Other> | Defined$ Self " +