diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index d6fe5755a5e..96c5e674771 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java @@ -24,10 +24,7 @@ import mage.game.permanent.Permanent; import mage.game.stack.StackAbility; import mage.game.stack.StackObject; import mage.player.ai.ma.optimizers.TreeOptimizer; -import mage.player.ai.ma.optimizers.impl.DiscardCardOptimizer; -import mage.player.ai.ma.optimizers.impl.EquipOptimizer; -import mage.player.ai.ma.optimizers.impl.LevelUpOptimizer; -import mage.player.ai.ma.optimizers.impl.OutcomeOptimizer; +import mage.player.ai.ma.optimizers.impl.*; import mage.player.ai.util.CombatInfo; import mage.player.ai.util.CombatUtil; import mage.players.Player; @@ -72,6 +69,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { protected static final String BLANKS = "..............................................."; static { + optimizers.add(new WrongCodeUsageOptimizer()); optimizers.add(new LevelUpOptimizer()); optimizers.add(new EquipOptimizer()); optimizers.add(new DiscardCardOptimizer()); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java index b75b6da4bcf..e8c137dacf8 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java @@ -34,7 +34,6 @@ import java.util.concurrent.ConcurrentLinkedQueue; public class SimulatedPlayer2 extends ComputerPlayer { private static final Logger logger = Logger.getLogger(SimulatedPlayer2.class); - private static final PassAbility pass = new PassAbility(); private final boolean isSimulatedPlayer; private final List suggested; @@ -45,7 +44,6 @@ public class SimulatedPlayer2 extends ComputerPlayer { public SimulatedPlayer2(Player originalPlayer, boolean isSimulatedPlayer, List suggested) { super(originalPlayer.getId()); this.originalPlayer = originalPlayer.copy(); - pass.setControllerId(playerId); this.isSimulatedPlayer = isSimulatedPlayer; this.suggested = suggested; this.userData = UserData.getDefaultUserDataView(); @@ -76,7 +74,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { Collections.reverse(list); if (!forced) { - list.add(pass); + list.add(new PassAbility()); } if (logger.isTraceEnabled()) { diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/optimizers/impl/WrongCodeUsageOptimizer.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/optimizers/impl/WrongCodeUsageOptimizer.java new file mode 100644 index 00000000000..f572ebfa79f --- /dev/null +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/optimizers/impl/WrongCodeUsageOptimizer.java @@ -0,0 +1,23 @@ +package mage.player.ai.ma.optimizers.impl; + +import mage.abilities.Ability; +import mage.abilities.common.PassAbility; +import mage.game.Game; + +import java.util.List; + +/** + * AI: runtime checks for possible errors or use case, must be added first in optimizers list + * + * @author JayDi85 + */ +public class WrongCodeUsageOptimizer extends BaseTreeOptimizer { + + @Override + public void filter(Game game, List actions, List actionsToRemove) { + // runtime check: pass ability must be all the time + if (actions.stream().filter(a -> a instanceof PassAbility).count() != 1) { + throw new IllegalArgumentException("Wrong code usage. AI's actions list must contains only 1 instance of PassAbility"); + } + } +} diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java index 401b9c9b348..7e3728bf3ea 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java @@ -20,9 +20,7 @@ import java.util.UUID; */ public class MCTSPlayer extends ComputerPlayer { - private static final Logger logger = Logger.getLogger(MCTSPlayer.class); - - protected PassAbility pass = new PassAbility(); + private static final Logger logger = Logger.getLogger(MCTSPlayer.class); private NextAction nextAction; @@ -32,12 +30,10 @@ public class MCTSPlayer extends ComputerPlayer { public MCTSPlayer(UUID id) { super(id); - this.pass.setControllerId(id); } public MCTSPlayer(final MCTSPlayer player) { super(player); - this.pass = player.pass.copy(); this.nextAction = player.nextAction; } @@ -48,7 +44,7 @@ public class MCTSPlayer extends ComputerPlayer { protected List getPlayableAbilities(Game game) { List playables = getPlayable(game, true); - playables.add(pass); + playables.add(new PassAbility()); return playables; } diff --git a/Mage/src/main/java/mage/abilities/common/PassAbility.java b/Mage/src/main/java/mage/abilities/common/PassAbility.java index af862849434..22926d0caac 100644 --- a/Mage/src/main/java/mage/abilities/common/PassAbility.java +++ b/Mage/src/main/java/mage/abilities/common/PassAbility.java @@ -9,7 +9,7 @@ import mage.game.Game; import java.util.UUID; /** - * AI only: fake ability for game simulations + * AI: fake ability to pass priority in game simulations * * @author BetaSteward_at_googlemail.com */ diff --git a/Mage/src/main/java/mage/abilities/effects/common/PassEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PassEffect.java index 73b2cdda80c..66d89d5bf0f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PassEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PassEffect.java @@ -1,5 +1,3 @@ - - package mage.abilities.effects.common; import mage.constants.Outcome; @@ -9,6 +7,8 @@ import mage.game.Game; import mage.players.Player; /** + * AI: fake effect to pass priority in game simulations + * * @author BetaSteward_at_googlemail.com */ public class PassEffect extends OneShotEffect {