From 6933c5a9f3f7d3988cae55a32b13295cc4d7b89c Mon Sep 17 00:00:00 2001 From: magenoxx Date: Wed, 19 Oct 2011 19:13:51 +0400 Subject: [PATCH 1/2] Added the possibility to force AI to play cards in cheat mode. --- .../src/mage/player/ai/ComputerPlayer6.java | 34 ++++++++++++--- .../src/mage/player/ai/SimulatedPlayer2.java | 40 ++++++++++++++---- .../config/ai.please.cast.this.txt.example | 2 + Mage.Server/plugins/mage-player-ai-ma.jar | Bin 43101 -> 44225 bytes 4 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 Mage.Server/config/ai.please.cast.this.txt.example 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 da2259042f..51209bf93b 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 @@ -56,10 +56,8 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetCard; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; +import java.io.File; +import java.util.*; import java.util.concurrent.*; /** @@ -81,11 +79,15 @@ public class ComputerPlayer6 extends ComputerPlayer implements protected int currentScore; protected SimulationNode2 root; + private static final String FILE_WITH_INSTRUCTIONS = "config/ai.please.cast.this.txt"; + private List suggested = new ArrayList(); + public ComputerPlayer6(String name, RangeOfInfluence range, int skill) { super(name, range); maxDepth = skill * 2; maxThink = skill * 3; maxNodes = Config2.maxNodes; + getSuggestedActions(); } public ComputerPlayer6(final ComputerPlayer6 player) { @@ -773,7 +775,7 @@ public class ComputerPlayer6 extends ComputerPlayer implements for (Player copyPlayer: sim.getState().getPlayers().values()) { Player origPlayer = game.getState().getPlayers().get(copyPlayer.getId()); - SimulatedPlayer2 newPlayer = new SimulatedPlayer2(copyPlayer.getId(), copyPlayer.getId().equals(playerId)); + SimulatedPlayer2 newPlayer = new SimulatedPlayer2(copyPlayer.getId(), copyPlayer.getId().equals(playerId), suggested); newPlayer.restore(origPlayer); sim.getState().getPlayers().put(copyPlayer.getId(), newPlayer); } @@ -795,4 +797,26 @@ public class ComputerPlayer6 extends ComputerPlayer implements } return false; } + + protected void getSuggestedActions() { + try { + File file = new File(FILE_WITH_INSTRUCTIONS); + if (file.exists()) { + Scanner scanner = new Scanner(file); + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + if (line.startsWith("cast:") || line.startsWith("play:")) { + suggested.add(line.substring(5, line.length())); + } + } + System.out.println("suggested::"); + for (int i = 0; i < suggested.size(); i++) { + System.out.println(" " + suggested.get(i)); + } + } + } catch (Exception e) { + // swallow + e.printStackTrace(); + } + } } 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 52e107a148..0fe7657385 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 @@ -28,12 +28,8 @@ package mage.player.ai; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.io.File; +import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; import mage.abilities.Ability; import mage.abilities.TriggeredAbility; @@ -43,6 +39,7 @@ import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.VariableManaCost; import mage.abilities.mana.ManaOptions; +import mage.cards.Card; import mage.choices.Choice; import mage.filter.FilterAbility; import mage.game.Game; @@ -50,6 +47,7 @@ import mage.game.combat.Combat; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.stack.StackAbility; +import mage.sets.innistrad.UnholyFiend; import mage.target.Target; import mage.util.Logging; import org.apache.log4j.Logger; @@ -66,10 +64,13 @@ public class SimulatedPlayer2 extends ComputerPlayer { private transient ConcurrentLinkedQueue allActions; private static PassAbility pass = new PassAbility(); - public SimulatedPlayer2(UUID id, boolean isSimulatedPlayer) { + private List suggested; + + public SimulatedPlayer2(UUID id, boolean isSimulatedPlayer, List suggested) { super(id); pass.setControllerId(playerId); this.isSimulatedPlayer = isSimulatedPlayer; + this.suggested = suggested; } public SimulatedPlayer2(final SimulatedPlayer2 player) { @@ -101,6 +102,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { ManaOptions available = getManaAvailable(game); available.addMana(manaPool.getMana()); List playables = game.getPlayer(playerId).getPlayable(game, filter, available, isSimulatedPlayer); + playables = filterAbilities(game, playables, suggested); for (Ability ability: playables) { List options = game.getPlayer(playerId).getPlayableOptions(ability, game); if (options.size() == 0) { @@ -141,6 +143,29 @@ public class SimulatedPlayer2 extends ComputerPlayer { // } // } + protected List filterAbilities(Game game, List playables, List suggested) { + if (playables.isEmpty()) { + return playables; + } + if (suggested == null || suggested.isEmpty()) { + return playables; + } + List filtered = new ArrayList(); + for (Ability ability : playables) { + Card card = game.getCard(ability.getSourceId()); + for (String s : suggested) { + if (s.equals(card.getName())) { + System.out.println("matched: " + s); + filtered.add(ability); + } + } + } + if (!filtered.isEmpty()) { + return filtered; + } + return playables; + } + //add a generic mana cost for each amount possible protected void simulateVariableCosts(Ability ability, Game game) { int numAvailable = getAvailableManaProducers(game).size(); @@ -276,5 +301,4 @@ public class SimulatedPlayer2 extends ComputerPlayer { public void priority(Game game) { //should never get here } - } diff --git a/Mage.Server/config/ai.please.cast.this.txt.example b/Mage.Server/config/ai.please.cast.this.txt.example new file mode 100644 index 0000000000..646ec21a94 --- /dev/null +++ b/Mage.Server/config/ai.please.cast.this.txt.example @@ -0,0 +1,2 @@ +play:Swamp +cast:Duress \ No newline at end of file diff --git a/Mage.Server/plugins/mage-player-ai-ma.jar b/Mage.Server/plugins/mage-player-ai-ma.jar index 04b9b53e5062368960cc68dbb498d417695a5c0b..0e4bd9abc17b6090391833a1c6684d3ed8bcf3d1 100644 GIT binary patch delta 22226 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 X{@#%Ud!>J13SSX02IL+EzqS7YlsI%& From bc89714da0bd61df93f3a920e636f2a2a8d3485e Mon Sep 17 00:00:00 2001 From: Loki Date: Wed, 19 Oct 2011 23:00:37 +0300 Subject: [PATCH 2/2] refactoring --- .../MyojinOfCleansingFire.java | 36 +++---------------- .../common/CastFromHandCondition.java | 26 ++++++++++++++ 2 files changed, 30 insertions(+), 32 deletions(-) create mode 100644 Mage/src/mage/abilities/condition/common/CastFromHandCondition.java diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/MyojinOfCleansingFire.java b/Mage.Sets/src/mage/sets/championsofkamigawa/MyojinOfCleansingFire.java index d988000541..fc6dfbcaaa 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/MyojinOfCleansingFire.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/MyojinOfCleansingFire.java @@ -37,12 +37,15 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.CastFromHandCondition; import mage.abilities.condition.common.HasCounterCondition; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.decorator.ConditionalContinousEffect; +import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.effects.common.continious.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.IndestructibleAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -54,7 +57,6 @@ import mage.watchers.Watcher; import mage.watchers.common.CastFromHandWatcher; /** - * * @author Loki */ public class MyojinOfCleansingFire extends CardImpl { @@ -77,7 +79,7 @@ public class MyojinOfCleansingFire extends CardImpl { this.addWatcher(new CastFromHandWatcher()); // Myojin of Cleansing Fire enters the battlefield with a divinity counter on it if you cast it from your hand. - this.addAbility(new EntersBattlefieldAbility(new MyojinOfCleansingFireEntersBattlefieldEffect(), "{this} enters the battlefield with a divinity counter on it if you cast it from your hand")); + this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new AddCountersSourceEffect(CounterType.DIVINITY.createInstance()), new CastFromHandCondition(), ""), "{this} enters the battlefield with a divinity counter on it if you cast it from your hand")); // Myojin of Cleansing Fire is indestructible as long as it has a divinity counter on it. this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, new ConditionalContinousEffect(new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Constants.Duration.WhileOnBattlefield), new HasCounterCondition(CounterType.DIVINITY), "{this} is indestructible as long as it has a divinity counter on it"))); @@ -94,33 +96,3 @@ public class MyojinOfCleansingFire extends CardImpl { return new MyojinOfCleansingFire(this); } } - -class MyojinOfCleansingFireEntersBattlefieldEffect extends OneShotEffect { - MyojinOfCleansingFireEntersBattlefieldEffect() { - super(Constants.Outcome.Benefit); - } - - MyojinOfCleansingFireEntersBattlefieldEffect(final MyojinOfCleansingFireEntersBattlefieldEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent p = game.getPermanent(source.getSourceId()); - if (p != null) { - Watcher watcher = game.getState().getWatchers().get("CastFromHand", source.getSourceId()); - if (watcher != null && watcher.conditionMet()) { - p.addCounters(CounterType.DIVINITY.createInstance(), game); - } - } - return true; - } - - @Override - public MyojinOfCleansingFireEntersBattlefieldEffect copy() { - return new MyojinOfCleansingFireEntersBattlefieldEffect(this); - } -} - - - diff --git a/Mage/src/mage/abilities/condition/common/CastFromHandCondition.java b/Mage/src/mage/abilities/condition/common/CastFromHandCondition.java new file mode 100644 index 0000000000..42345c1f5b --- /dev/null +++ b/Mage/src/mage/abilities/condition/common/CastFromHandCondition.java @@ -0,0 +1,26 @@ +package mage.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.watchers.Watcher; + +/** + * Warning: CastFromHandWatcher must be installed to card for proper working. + * + * @author Loki + */ +public class CastFromHandCondition implements Condition { + @Override + public boolean apply(Game game, Ability source) { + Permanent p = game.getPermanent(source.getSourceId()); + if (p != null) { + Watcher watcher = game.getState().getWatchers().get("CastFromHand", source.getSourceId()); + if (watcher != null && watcher.conditionMet()) { + return true; + } + } + return false; + } +}