From 0bf78830de57e3f99e92a0698c4a6e18051aaf27 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Sun, 3 Jun 2018 22:44:06 -0400 Subject: [PATCH 1/5] Changes to try and better handle X mana costs with minimum X values with AI decisions #4906 --- Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java index 872c1a3996e..29d51f0ab89 100644 --- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java +++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java @@ -890,12 +890,12 @@ public class PlayerStub implements Player { @Override public int announceXMana(int min, int max, String message, Game game, Ability ability) { - return 0; + return min; } @Override public int announceXCost(int min, int max, String message, Game game, Ability ability, VariableCost variableCost) { - return 0; + return min; } @Override From de9042dafe6d1be6309b0fede16b39792630af50 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Sun, 3 Jun 2018 22:47:56 -0400 Subject: [PATCH 2/5] Changes to try and better handle X mana costs with minimum X values with AI decisions #4906 --- .../Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cda1cfd16f8..4602e864fd0 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 @@ -132,7 +132,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { if (variableManaCost != null) { int multiplier = variableManaCost.getMultiplier(); - for (int mana = 0; mana <= numAvailable; mana++) { + for (int mana = variableManaCost.getMinX(); mana <= numAvailable; mana++) { if (mana % multiplier == 0) { // use only values dependant from muliplier int xAmount = mana / multiplier; Ability newAbility = ability.copy(); From b0d1f868902bca8f70e2e0827459c7cffbb47c69 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Sun, 3 Jun 2018 22:50:56 -0400 Subject: [PATCH 3/5] Changes to try and better handle X mana costs with minimum X values with AI decisions #4906 --- .../main/java/mage/player/ai/ComputerPlayer.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 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 75409c91a49..cc862b47c12 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 @@ -1472,18 +1472,25 @@ public class ComputerPlayer extends PlayerImpl implements Player { int numAvailable = getAvailableManaProducers(game).size() - ability.getManaCosts().convertedManaCost(); if (numAvailable < 0) { numAvailable = 0; - } - if (numAvailable > max) { - numAvailable = max; + } else { + if (numAvailable < min) { + numAvailable = min; + } + if (numAvailable > max) { + numAvailable = max; + } } return numAvailable; } @Override public int announceXCost(int min, int max, String message, Game game, Ability ability, VariableCost variablCost) { - log.debug("announceXMana"); + log.debug("announceXCost"); //TODO: improve this int value = RandomUtil.nextInt(max + 1); + if (value < min) { + value = min; + } if (value < max) { value++; } From d0f0de33a24609a98f032414f5de40f92ef60863 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Sun, 3 Jun 2018 23:22:39 -0400 Subject: [PATCH 4/5] Fixed typos --- .../java/mage/player/ai/ComputerPlayer.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 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 cc862b47c12..e5dd0c6b0ea 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 @@ -70,7 +70,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { private static final Logger log = Logger.getLogger(ComputerPlayer.class); - protected int PASSIVITY_PENALTY = 5; // Penalty value for doing nothing if some actions are availble + protected int PASSIVITY_PENALTY = 5; // Penalty value for doing nothing if some actions are available protected boolean ALLOW_INTERRUPT = true; // change this for test to false / debugging purposes to false to switch off interrupts while debugging private transient Map unplayable = new TreeMap<>(); @@ -279,9 +279,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = threats(randomOpponentId, sourceId, ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets()); } for (Permanent permanent : targets) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); if (t.canTarget(abilityControllerId, permanent.getId(), null, game)) { - if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + if (alreadyTargeted != null && !alreadyTargeted.contains(permanent.getId())) { target.add(permanent.getId(), game); return true; } @@ -312,9 +312,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = opponentTargets; } for (Permanent permanent : targets) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); if (t.canTarget(permanent.getId(), game)) { - if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + if (alreadyTargeted != null && !alreadyTargeted.contains(permanent.getId())) { target.add(permanent.getId(), game); return true; } @@ -346,9 +346,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = ownedTargets; } for (Permanent permanent : targets) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); if (t.canTarget(permanent.getId(), game)) { - if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + if (alreadyTargeted != null && !alreadyTargeted.contains(permanent.getId())) { target.add(permanent.getId(), game); return true; } @@ -376,11 +376,11 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (target.getOriginalTarget() instanceof TargetCardInYourGraveyard || target.getOriginalTarget() instanceof TargetCardInASingleGraveyard) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); List cards = new ArrayList<>(game.getPlayer(abilityControllerId).getGraveyard().getCards((FilterCard) target.getFilter(), game)); while (!cards.isEmpty()) { Card card = pickTarget(cards, outcome, target, null, game); - if (card != null && alreadyTargetted != null && !alreadyTargetted.contains(card.getId())) { + if (card != null && alreadyTargeted != null && !alreadyTargeted.contains(card.getId())) { target.add(card.getId(), game); if (target.isChosen()) { return true; @@ -396,9 +396,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { for (UUID targetId : targets) { MageObject targetObject = game.getObject(targetId); if (targetObject != null) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); if (t.canTarget(targetObject.getId(), game)) { - if (alreadyTargetted != null && !alreadyTargetted.contains(targetObject.getId())) { + if (alreadyTargeted != null && !alreadyTargeted.contains(targetObject.getId())) { target.add(targetObject.getId(), game); return true; } @@ -547,9 +547,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = game.getBattlefield().getActivePermanents(((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), playerId, game); } for (Permanent permanent : targets) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); if (t.canTarget(abilityControllerId, permanent.getId(), source, game)) { - if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + if (alreadyTargeted != null && !alreadyTargeted.contains(permanent.getId())) { target.addTarget(permanent.getId(), source, game); return true; } @@ -594,9 +594,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = game.getBattlefield().getActivePermanents(((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), playerId, game); } for (Permanent permanent : targets) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); if (t.canTarget(abilityControllerId, permanent.getId(), source, game)) { - if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + if (alreadyTargeted != null && !alreadyTargeted.contains(permanent.getId())) { target.addTarget(permanent.getId(), source, game); return true; } @@ -641,9 +641,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = game.getBattlefield().getActivePermanents(((FilterPermanentOrPlayer) t.getFilter()).getPermanentFilter(), playerId, game); } for (Permanent permanent : targets) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); if (t.canTarget(abilityControllerId, permanent.getId(), source, game)) { - if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + if (alreadyTargeted != null && !alreadyTargeted.contains(permanent.getId())) { target.addTarget(permanent.getId(), source, game); return true; } @@ -676,9 +676,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = game.getBattlefield().getActivePermanents(((TargetPlayerOrPlaneswalker) t.getFilter()).getFilterPermanent(), playerId, game); } for (Permanent permanent : targets) { - List alreadyTargetted = target.getTargets(); + List alreadyTargeted = target.getTargets(); if (t.canTarget(abilityControllerId, permanent.getId(), source, game)) { - if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + if (alreadyTargeted != null && !alreadyTargeted.contains(permanent.getId())) { target.addTarget(permanent.getId(), source, game); return true; } @@ -1382,7 +1382,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { private Abilities getManaAbilitiesSortedByManaCount(MageObject mageObject, final Game game) { Abilities manaAbilities = mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game); if (manaAbilities.size() > 1) { - // Sort mana abilities by numbver of produced manas, to use ability first that produces most mana (maybe also conditional if possible) + // Sort mana abilities by number of produced manas, to use ability first that produces most mana (maybe also conditional if possible) Collections.sort(manaAbilities, new Comparator() { @Override public int compare(ActivatedManaAbilityImpl a1, ActivatedManaAbilityImpl a2) { @@ -1909,7 +1909,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } double total = mana.getBlack() + mana.getBlue() + mana.getGreen() + mana.getRed() + mana.getWhite(); - // most frequent land is forest by defalt + // most frequent land is forest by default int mostLand = 0; String mostLandName = "Forest"; if (mana.getGreen() > 0) { @@ -2006,7 +2006,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { // but also check it can be targeted betterCard = target.canTarget(getId(), card.getId(), source, game); } else { - // target object wasn't provided, so acceptings it anyway + // target object wasn't provided, so accepting it anyway betterCard = true; } } From 2fbbf7a51624fb17b7d0ad252650e1e5ec8e817e Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Sun, 3 Jun 2018 23:24:36 -0400 Subject: [PATCH 5/5] Fixed typos --- .../Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4602e864fd0..018ef807a11 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 @@ -133,7 +133,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { int multiplier = variableManaCost.getMultiplier(); for (int mana = variableManaCost.getMinX(); mana <= numAvailable; mana++) { - if (mana % multiplier == 0) { // use only values dependant from muliplier + if (mana % multiplier == 0) { // use only values dependant from multiplier int xAmount = mana / multiplier; Ability newAbility = ability.copy(); VariableManaCost varCost = null;