From 51dcaa1725fd2292d02e9f366d96958ee2fbaa3d Mon Sep 17 00:00:00 2001 From: htrajan Date: Thu, 16 Apr 2020 20:14:43 -0700 Subject: [PATCH] update simulators --- .../java/mage/player/ai/ComputerPlayer.java | 4 +-- .../ai/simulators/CombatGroupSimulator.java | 14 +++++----- .../player/ai/simulators/CombatSimulator.java | 6 ++--- .../ai/simulators/CreatureSimulator.java | 27 ++++++++++++++----- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 4070da886fa..d1c17c24666 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -2434,7 +2434,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { simulations = new TreeNode<>(combat); addBlockSimulations(blockers, simulations, game); - combat.simulate(); + combat.simulate(game); return getWorstSimulation(simulations); @@ -2452,7 +2452,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { TreeNode child = new TreeNode<>(combat); node.addChild(child); addBlockSimulations(subList, child, game); - combat.simulate(); + combat.simulate(game); } } } diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CombatGroupSimulator.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CombatGroupSimulator.java index 874a4dd1314..ffa8bdee0e6 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CombatGroupSimulator.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CombatGroupSimulator.java @@ -1,5 +1,3 @@ - - package mage.player.ai.simulators; import mage.game.Game; @@ -52,15 +50,15 @@ public class CombatGroupSimulator implements Serializable { return blocker.canBlock(attacker.id, game); } - public void simulateCombat() { + public void simulateCombat(Game game) { unblockedDamage = 0; if (hasFirstOrDoubleStrike()) - assignDamage(true); - assignDamage(false); + assignDamage(true, game); + assignDamage(false, game); } - private void assignDamage(boolean first) { + private void assignDamage(boolean first, Game game) { if (blockers.isEmpty()) { if (canDamage(attacker, first)) unblockedDamage += attacker.power; @@ -69,7 +67,7 @@ public class CombatGroupSimulator implements Serializable { CreatureSimulator blocker = blockers.get(0); if (canDamage(attacker, first)) { if (attacker.hasTrample) { - int lethalDamage = blocker.getLethalDamage(); + int lethalDamage = blocker.getLethalDamage(game); if (attacker.power > lethalDamage) { blocker.damage += lethalDamage; unblockedDamage += attacker.power - lethalDamage; @@ -87,7 +85,7 @@ public class CombatGroupSimulator implements Serializable { int damage = attacker.power; for (CreatureSimulator blocker: blockers) { if (damage > 0 && canDamage(attacker, first)) { - int lethalDamage = blocker.getLethalDamage(); + int lethalDamage = blocker.getLethalDamage(game); if (damage > lethalDamage) { blocker.damage += lethalDamage; damage -= lethalDamage; diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CombatSimulator.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CombatSimulator.java index 79f809bbdad..7157962a522 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CombatSimulator.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CombatSimulator.java @@ -1,5 +1,3 @@ - - package mage.player.ai.simulators; import mage.counters.CounterType; @@ -52,9 +50,9 @@ public class CombatSimulator implements Serializable { attackerId = null; } - public void simulate() { + public void simulate(Game game) { for (CombatGroupSimulator group: groups) { - group.simulateCombat(); + group.simulateCombat(game); } } diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CreatureSimulator.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CreatureSimulator.java index e6ef4aafdd1..1a5e7fe7b85 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CreatureSimulator.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/simulators/CreatureSimulator.java @@ -1,14 +1,16 @@ - - package mage.player.ai.simulators; -import java.io.Serializable; -import java.util.UUID; import mage.abilities.keyword.DoubleStrikeAbility; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.TrampleAbility; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; import mage.game.permanent.Permanent; +import java.io.Serializable; +import java.util.List; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -21,6 +23,7 @@ public class CreatureSimulator implements Serializable { public boolean hasFirstStrike; public boolean hasDoubleStrike; public boolean hasTrample; + public Permanent permanent; public CreatureSimulator(Permanent permanent) { this.id = permanent.getId(); @@ -30,13 +33,25 @@ public class CreatureSimulator implements Serializable { this.hasDoubleStrike = permanent.getAbilities().containsKey(DoubleStrikeAbility.getInstance().getId()); this.hasFirstStrike = permanent.getAbilities().containsKey(FirstStrikeAbility.getInstance().getId()); this.hasTrample = permanent.getAbilities().containsKey(TrampleAbility.getInstance().getId()); + this.permanent = permanent; } public boolean isDead() { return damage >= toughness; } - public int getLethalDamage() { - return toughness - damage; + public int getLethalDamage(Game game) { + List usePowerInsteadOfToughnessForDamageLethalityFilters = game.getState().getActivePowerInsteadOfToughnessForDamageLethalityFilters(); + /* + * for handling Zilortha, Strength Incarnate: + * 2020-04-17 + * Any time the game is checking whether damage is lethal or if a creature should be destroyed for having lethal damage marked on it, use the power of your creatures rather than their toughness to check the damage against. This includes being assigned trample damage, damage from Flame Spill, and so on. + */ + boolean usePowerInsteadOfToughnessForDamageLethality = usePowerInsteadOfToughnessForDamageLethalityFilters.stream() + .anyMatch(filter -> filter.match(permanent, game)); + int lethalDamageThreshold = usePowerInsteadOfToughnessForDamageLethality ? + // Zilortha, Strength Incarnate, 2020-04-17: A creature with 0 power isn’t destroyed unless it has at least 1 damage marked on it. + Math.max(power, 1) : toughness; + return Math.max(lethalDamageThreshold - damage, 0); } }