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 c818b917a6f..0a8e95acce5 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 @@ -607,6 +607,32 @@ public class ComputerPlayer6 extends ComputerPlayer implements for (TreeOptimizer optimizer : optimizers) { optimizer.optimize(game, allActions); } + Collections.sort(allActions, new Comparator() { + @Override + public int compare(Ability ability, Ability ability1) { + String rule = ability.toString(); + String rule1 = ability1.toString(); + if (rule.equals("Pass")) { + return 1; + } + if (rule1.equals("Pass")) { + return -1; + } + if (rule.startsWith("Play")) { + return -1; + } + if (rule1.startsWith("Play")) { + return 1; + } + if (rule.startsWith("Cast")) { + return -1; + } + if (rule1.startsWith("Cast")) { + return 1; + } + return ability.getRule().compareTo(ability1.getRule()); + } + }); } protected boolean allPassed(Game game) { 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 d9a076b0297..0f63ac787f3 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 @@ -35,6 +35,7 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.VariableManaCost; +import mage.abilities.effects.Effect; import mage.cards.Card; import mage.choices.Choice; import mage.game.Game; @@ -118,6 +119,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { for (Ability ability: playables) { List options = game.getPlayer(playerId).getPlayableOptions(ability, game); options = filterOptions(game, options, ability, suggested); + options = optimizeOptions(game, options, ability); if (options.isEmpty()) { if (ability.getManaCosts().getVariableCosts().size() > 0) { simulateVariableCosts(ability, game); @@ -221,6 +223,39 @@ public class SimulatedPlayer2 extends ComputerPlayer { return options; } + protected List optimizeOptions(Game game, List options, Ability ability) { + if (options.isEmpty()) { + return options; + } + + // determine if all effects are bad + Iterator iterator = options.iterator(); + boolean bad = false; + for (Effect effect : ability.getEffects()) { + if (effect.getOutcome().isGood()) { + bad = false; + break; + } else { + bad = true; + } + } + + if (bad) { + // remove its own creatures for bad effects + while (iterator.hasNext()) { + Ability ability1 = iterator.next(); + if (ability1.getTargets().size() == 1) { + Permanent permanent = game.getPermanent(ability1.getFirstTarget()); + if (permanent != null && permanent.getControllerId().equals(playerId)) { + iterator.remove(); + } + } + } + } + + return options; + } + //add a generic mana cost for each amount possible protected void simulateVariableCosts(Ability ability, Game game) { int numAvailable = getAvailableManaProducers(game).size(); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java index 94aaa3ae53b..108cd9191f5 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java @@ -91,7 +91,15 @@ public class ArtificialScoringSystem { } } } - score += equipments*50 + enchantments*100; + score += equipments*50 /*+ enchantments*100*/; + + if (!permanent.canAttack(game)) { + score -= 100; + } + + if (!permanent.canBlockAny(game)) { + score -= 30; + } } return score; } diff --git a/Mage.Server/plugins/mage-player-ai-ma.jar b/Mage.Server/plugins/mage-player-ai-ma.jar index 2c678b13c27..ae0c9abc9ff 100644 Binary files a/Mage.Server/plugins/mage-player-ai-ma.jar and b/Mage.Server/plugins/mage-player-ai-ma.jar differ diff --git a/Mage.Sets/src/mage/sets/avacynrestored/BowerPassage.java b/Mage.Sets/src/mage/sets/avacynrestored/BowerPassage.java index f2bfce75fbd..e771d38962e 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/BowerPassage.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/BowerPassage.java @@ -88,7 +88,7 @@ class BowerPassageEffect extends RestrictionEffect { @Override public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (attacker.getControllerId().equals(source.getControllerId()) && blocker.getAbilities().contains(FlyingAbility.getInstance())) { + if (attacker != null && attacker.getControllerId().equals(source.getControllerId()) && blocker.getAbilities().contains(FlyingAbility.getInstance())) { return false; } return true; diff --git a/Mage.Sets/src/mage/sets/avacynrestored/HuntedGhoul.java b/Mage.Sets/src/mage/sets/avacynrestored/HuntedGhoul.java index 4828429d7f1..838a4211273 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/HuntedGhoul.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/HuntedGhoul.java @@ -114,7 +114,7 @@ class HuntedGhoulEffect extends RestrictionEffect { @Override public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (attacker.getSubtype().contains("Human")) { + if (attacker != null && attacker.getSubtype().contains("Human")) { return false; } return true; diff --git a/Mage.Sets/src/mage/sets/innistrad/GraveyardShovel.java b/Mage.Sets/src/mage/sets/innistrad/GraveyardShovel.java index c3ddb20f576..1596e679f9c 100644 --- a/Mage.Sets/src/mage/sets/innistrad/GraveyardShovel.java +++ b/Mage.Sets/src/mage/sets/innistrad/GraveyardShovel.java @@ -27,7 +27,6 @@ */ package mage.sets.innistrad; -import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Outcome; import mage.Constants.Rarity; @@ -44,6 +43,8 @@ import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** * * @author North @@ -93,6 +94,7 @@ class GraveyardShovelEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (targetPlayer != null && controller != null) { TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(); + target.setRequired(true); if (targetPlayer.chooseTarget(Outcome.Exile, target, source, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { diff --git a/Mage/src/mage/game/permanent/Permanent.java b/Mage/src/mage/game/permanent/Permanent.java index 3d74f43a196..64ae58867bc 100644 --- a/Mage/src/mage/game/permanent/Permanent.java +++ b/Mage/src/mage/game/permanent/Permanent.java @@ -137,6 +137,7 @@ public interface Permanent extends Card, Controllable { public void setMinBlockedBy(int minBlockedBy); public boolean canAttack(Game game); public boolean canBlock(UUID attackerId, Game game); + public boolean canBlockAny(Game game); public boolean removeFromCombat(Game game); public boolean isDeathtouched(); diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index 22b2fed7d31..b6f22c3ed71 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -801,6 +801,20 @@ public abstract class PermanentImpl> extends CardImpl return true; } + @Override + public boolean canBlockAny(Game game) { + if (tapped) + return false; + + //20101001 - 509.1b + for (RestrictionEffect effect : game.getContinuousEffects().getApplicableRestrictionEffects(this, game)) { + if (!effect.canBlock(null, this, game.getContinuousEffects().getAbility(effect.getId()), game)) + return false; + } + + return true; + } + @Override public void setAttacking(boolean attacking) { this.attacking = attacking; diff --git a/Mage/src/mage/target/TargetPermanent.java b/Mage/src/mage/target/TargetPermanent.java index 7417e8639cb..c693a1e275b 100644 --- a/Mage/src/mage/target/TargetPermanent.java +++ b/Mage/src/mage/target/TargetPermanent.java @@ -169,7 +169,7 @@ public class TargetPermanent> extends TargetObject< public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { Set possibleTargets = new HashSet(); MageObject targetSource = game.getObject(sourceId); - for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) { + for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) { if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) { possibleTargets.add(permanent.getId()); }