From a81a666b812d68f80fe06fa6d1a245515d42beb7 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Wed, 25 Dec 2013 08:21:25 +0000 Subject: [PATCH] move haunt Ai to a separate file remove isComputer method --- .gitattributes | 1 + .../main/java/forge/ai/ComputerUtilCard.java | 2 +- .../main/java/forge/ai/ability/HauntAi.java | 30 +++++++++++++++++++ .../main/java/forge/game/ability/ApiType.java | 3 +- .../ability/effects/ChangeZoneEffect.java | 6 ++-- .../java/forge/game/player/LobbyPlayer.java | 2 -- .../main/java/forge/game/player/Player.java | 6 ++-- .../forge/game/spellability/SpellAbility.java | 2 ++ .../main/java/forge/game/zone/MagicStack.java | 16 ++-------- 9 files changed, 44 insertions(+), 24 deletions(-) create mode 100644 forge-gui/src/main/java/forge/ai/ability/HauntAi.java diff --git a/.gitattributes b/.gitattributes index 16a6b4df387..bea64392f0a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14769,6 +14769,7 @@ forge-gui/src/main/java/forge/ai/ability/FlipACoinAi.java -text forge-gui/src/main/java/forge/ai/ability/FogAi.java -text forge-gui/src/main/java/forge/ai/ability/GameLossAi.java -text forge-gui/src/main/java/forge/ai/ability/GameWinAi.java -text +forge-gui/src/main/java/forge/ai/ability/HauntAi.java -text forge-gui/src/main/java/forge/ai/ability/LegendaryRuleAi.java -text forge-gui/src/main/java/forge/ai/ability/LifeExchangeAi.java -text forge-gui/src/main/java/forge/ai/ability/LifeGainAi.java -text diff --git a/forge-gui/src/main/java/forge/ai/ComputerUtilCard.java b/forge-gui/src/main/java/forge/ai/ComputerUtilCard.java index 7ee6047e54e..8e115d58718 100644 --- a/forge-gui/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-gui/src/main/java/forge/ai/ComputerUtilCard.java @@ -253,7 +253,7 @@ public class ComputerUtilCard { * a {@link forge.CardList} object. * @return a {@link forge.game.card.Card} object. */ - public static Card getWorstCreatureAI(final List list) { + public static Card getWorstCreatureAI(final Collection list) { return Aggregates.itemWithMin(Iterables.filter(list, CardPredicates.Presets.CREATURES), ComputerUtilCard.fnEvaluateCreature); } diff --git a/forge-gui/src/main/java/forge/ai/ability/HauntAi.java b/forge-gui/src/main/java/forge/ai/ability/HauntAi.java new file mode 100644 index 00000000000..9513537ebe2 --- /dev/null +++ b/forge-gui/src/main/java/forge/ai/ability/HauntAi.java @@ -0,0 +1,30 @@ +package forge.ai.ability; + +import java.util.Collection; +import java.util.List; + +import forge.ai.ComputerUtilCard; +import forge.ai.SpellAbilityAi; +import forge.game.card.Card; +import forge.game.card.CardLists; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; + +public class HauntAi extends SpellAbilityAi { + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#canPlayAI(forge.game.player.Player, forge.card.spellability.SpellAbility) + */ + @Override + protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { + return false; // should not get here + } + + + @Override + public Card chooseSingleCard(Player ai, SpellAbility sa, Collection creats, boolean isOptional, Player targetedPlayer) { + final List oppCreats = CardLists.filterControlledBy(creats, ai.getOpponents()); + return ComputerUtilCard.getWorstCreatureAI(oppCreats.isEmpty() ? creats : oppCreats); + } + +} \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/game/ability/ApiType.java b/forge-gui/src/main/java/forge/game/ability/ApiType.java index a9a4e783f0d..cba31ab531d 100644 --- a/forge-gui/src/main/java/forge/game/ability/ApiType.java +++ b/forge-gui/src/main/java/forge/game/ability/ApiType.java @@ -130,7 +130,8 @@ public enum ApiType { InternalEtbReplacement(ETBReplacementEffect.class, CanPlayAsDrawbackAi.class), - InternalLegendaryRule(CharmEffect.class, LegendaryRuleAi.class); // Charm has empty resolve blocks, may act as a dummy + InternalLegendaryRule(CharmEffect.class, LegendaryRuleAi.class), // Charm has empty resolve blocks, may act as a dummy + InternalHaunt(CharmEffect.class, HauntAi.class); private final Class clsEffect; private final Class clsAi; diff --git a/forge-gui/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-gui/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 8b3d7a65954..de168795c76 100644 --- a/forge-gui/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-gui/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -587,10 +587,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (decider == null) { decider = player; } - if (decider.isComputer()) { - ChangeZoneAi.hiddenOriginResolveAI(decider, sa, player); - } else { + if (decider.isHuman()) { changeHiddenOriginResolveHuman(decider, sa, player); + } else { + ChangeZoneAi.hiddenOriginResolveAI(decider, sa, player); } } } diff --git a/forge-gui/src/main/java/forge/game/player/LobbyPlayer.java b/forge-gui/src/main/java/forge/game/player/LobbyPlayer.java index 3ae6f24dbe4..4d577f7453e 100644 --- a/forge-gui/src/main/java/forge/game/player/LobbyPlayer.java +++ b/forge-gui/src/main/java/forge/game/player/LobbyPlayer.java @@ -19,8 +19,6 @@ public abstract class LobbyPlayer implements IHasIcon { @Deprecated public boolean isHuman() { return getType() == PlayerType.HUMAN; } - @Deprecated - public boolean isComputer() { return getType() == PlayerType.COMPUTER; } protected final String name; protected String imageKey; diff --git a/forge-gui/src/main/java/forge/game/player/Player.java b/forge-gui/src/main/java/forge/game/player/Player.java index ec705f065d4..bd4db138b27 100644 --- a/forge-gui/src/main/java/forge/game/player/Player.java +++ b/forge-gui/src/main/java/forge/game/player/Player.java @@ -247,8 +247,6 @@ public class Player extends GameEntity implements Comparable { @Deprecated public boolean isHuman() { return getLobbyPlayer().isHuman(); } - @Deprecated - public boolean isComputer() { return getLobbyPlayer().isComputer(); } public boolean isArchenemy() { @@ -1368,7 +1366,7 @@ public class Player extends GameEntity implements Comparable { c = game.getAction().moveToHand(c); drawn.add(c); - if ((this.numDrawnThisTurn == 0) && this.isComputer()) { + if (this.numDrawnThisTurn == 0) { boolean reveal = false; final List cards = this.getCardsIn(ZoneType.Battlefield); for (final Card card : cards) { @@ -1378,7 +1376,7 @@ public class Player extends GameEntity implements Comparable { } } if (reveal) { - game.getAction().reveal("Revealing the first card drawn", drawn, this, false); + game.getAction().reveal("Revealing the first card drawn", drawn, this, true); } } diff --git a/forge-gui/src/main/java/forge/game/spellability/SpellAbility.java b/forge-gui/src/main/java/forge/game/spellability/SpellAbility.java index 47532e4a71e..f918a56de6c 100644 --- a/forge-gui/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-gui/src/main/java/forge/game/spellability/SpellAbility.java @@ -56,6 +56,8 @@ import forge.util.TextUtil; public abstract class SpellAbility extends GameObject implements ISpellAbility { public static class EmptySa extends SpellAbility { + public EmptySa(Card sourceCard) { super(sourceCard, Cost.Zero); setActivatingPlayer(sourceCard.getController());} + public EmptySa(ApiType api, Card sourceCard) { super(sourceCard, Cost.Zero); setActivatingPlayer(sourceCard.getController()); this.api = api;} public EmptySa(Card sourceCard, Player activator) { super(sourceCard, Cost.Zero); setActivatingPlayer(activator);} public EmptySa(ApiType api, Card sourceCard, Player activator) { super(sourceCard, Cost.Zero); setActivatingPlayer(activator); this.api = api;} @Override public void resolve() {} diff --git a/forge-gui/src/main/java/forge/game/zone/MagicStack.java b/forge-gui/src/main/java/forge/game/zone/MagicStack.java index aa13fde16a0..b113638f1e6 100644 --- a/forge-gui/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-gui/src/main/java/forge/game/zone/MagicStack.java @@ -31,13 +31,13 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import forge.FThreads; -import forge.ai.ComputerUtilCard; import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GameLogEntryType; import forge.game.GameObject; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; +import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardFactory; import forge.game.card.CardFactoryUtil; @@ -65,7 +65,7 @@ import forge.game.spellability.TargetChoices; import forge.game.spellability.TargetRestrictions; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; -import forge.gui.input.InputSelectCardsFromList; + /** *

@@ -623,17 +623,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable oppCreats = CardLists.filterControlledBy(creats, source.getController().getOpponents()); - targetCard = ComputerUtilCard.getWorstCreatureAI(oppCreats.isEmpty() ? creats : oppCreats); - } + final Card targetCard = source.getController().getController().chooseSingleEntityForEffect(creats, new SpellAbility.EmptySa(ApiType.InternalHaunt, source), "Choose target creature to haunt."); haunterDiesWork.setTargetCard(targetCard); this.add(haunterDiesWork); }