From 4c40598c7989e15f765472fc4877fb92a758eee3 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 21 Jun 2013 22:46:00 +0000 Subject: [PATCH] refactored 10+ calls to isComputer/isHuman --- .../java/forge/card/ability/ai/CharmAi.java | 11 ++++-- .../java/forge/card/ability/ai/CloneAi.java | 10 +++++ .../card/ability/ai/CopyPermanentAi.java | 9 +++++ .../java/forge/card/ability/ai/PlayAi.java | 35 +++++++++++++++++ .../card/ability/effects/CharmEffect.java | 16 ++------ .../card/ability/effects/CloneEffect.java | 6 +-- .../ability/effects/CopyPermanentEffect.java | 13 +------ .../forge/card/ability/effects/DigEffect.java | 10 ++--- .../card/ability/effects/PlayEffect.java | 38 +++---------------- src/main/java/forge/game/GameActionUtil.java | 6 ++- src/main/java/forge/game/ai/AiController.java | 1 + .../game/player/PlayerActionConfirmMode.java | 3 +- .../game/player/PlayerControllerHuman.java | 7 ++-- .../java/forge/gui/match/ControlWinLose.java | 2 +- 14 files changed, 89 insertions(+), 78 deletions(-) diff --git a/src/main/java/forge/card/ability/ai/CharmAi.java b/src/main/java/forge/card/ability/ai/CharmAi.java index 320e7752b0d..de49a2bbb52 100644 --- a/src/main/java/forge/card/ability/ai/CharmAi.java +++ b/src/main/java/forge/card/ability/ai/CharmAi.java @@ -4,13 +4,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import org.apache.commons.lang.math.RandomUtils; - import forge.card.ability.SpellAbilityAi; import forge.card.ability.effects.CharmEffect; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; import forge.game.player.Player; +import forge.util.Aggregates; import forge.util.MyRandom; public class CharmAi extends SpellAbilityAi { @@ -68,8 +67,12 @@ public class CharmAi extends SpellAbilityAi { return chosenList.size() >= min ? chosenList : null; } - public static Player determineOpponentChooser(Player ai, SpellAbility sa, List opponents) { - return opponents.get(RandomUtils.nextInt(opponents.size())); + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#chooseSinglePlayer(forge.game.player.Player, forge.card.spellability.SpellAbility, java.util.List) + */ + @Override + public Player chooseSinglePlayer(Player ai, SpellAbility sa, List opponents) { + return Aggregates.random(opponents); } } diff --git a/src/main/java/forge/card/ability/ai/CloneAi.java b/src/main/java/forge/card/ability/ai/CloneAi.java index 02351ee6510..81d3782d133 100644 --- a/src/main/java/forge/card/ability/ai/CloneAi.java +++ b/src/main/java/forge/card/ability/ai/CloneAi.java @@ -11,6 +11,7 @@ import forge.game.Game; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; public class CloneAi extends SpellAbilityAi { @@ -143,5 +144,14 @@ public class CloneAi extends SpellAbilityAi { // good job of picking a good target return false; } + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#confirmAction(forge.game.player.Player, forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String) + */ + @Override + public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { + // Didn't confirm in the original code + return false; + } } diff --git a/src/main/java/forge/card/ability/ai/CopyPermanentAi.java b/src/main/java/forge/card/ability/ai/CopyPermanentAi.java index ada81a66d22..2874a30e4b0 100644 --- a/src/main/java/forge/card/ability/ai/CopyPermanentAi.java +++ b/src/main/java/forge/card/ability/ai/CopyPermanentAi.java @@ -121,5 +121,14 @@ public class CopyPermanentAi extends SpellAbilityAi { //TODO: add logic here return true; } + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.game.player.Player, forge.card.spellability.SpellAbility, java.util.List, boolean) + */ + @Override + public Card chooseSingleCard(Player ai, SpellAbility sa, List options, boolean isOptional) { + // Select a card to attach to + return ComputerUtilCard.getBestAI(options); + } } diff --git a/src/main/java/forge/card/ability/ai/PlayAi.java b/src/main/java/forge/card/ability/ai/PlayAi.java index 5210f8eda90..c2df3cf9868 100644 --- a/src/main/java/forge/card/ability/ai/PlayAi.java +++ b/src/main/java/forge/card/ability/ai/PlayAi.java @@ -4,16 +4,20 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import com.google.common.base.Predicate; + import forge.Card; import forge.CardLists; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; +import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; import forge.card.spellability.TargetRestrictions; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCost; import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; import forge.game.zone.ZoneType; import forge.util.MyRandom; @@ -94,4 +98,35 @@ public class PlayAi extends SpellAbilityAi { return true; } + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#confirmAction(forge.game.player.Player, forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String) + */ + @Override + public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { + // as called from PlayEffect:173 + return true; + } + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.game.player.Player, forge.card.spellability.SpellAbility, java.util.List, boolean) + */ + @Override + public Card chooseSingleCard(final Player ai, SpellAbility sa, List options, boolean isOptional) { + List tgtCards = CardLists.filter(options, new Predicate() { + @Override + public boolean apply(final Card c) { + for (SpellAbility s : c.getBasicSpells()) { + Spell spell = (Spell) s; + s.setActivatingPlayer(ai); + // timing restrictions still apply + if (s.getRestrictions().checkTimingRestrictions(c, s) && spell.canPlayFromEffectAI(false, true)) { + return true; + } + } + return false; + } + }); + return ComputerUtilCard.getBestAI(tgtCards); + } } diff --git a/src/main/java/forge/card/ability/effects/CharmEffect.java b/src/main/java/forge/card/ability/effects/CharmEffect.java index f4d8a1793c9..a6c65c826b5 100644 --- a/src/main/java/forge/card/ability/effects/CharmEffect.java +++ b/src/main/java/forge/card/ability/effects/CharmEffect.java @@ -57,18 +57,10 @@ public class CharmEffect extends SpellAbilityEffect { if (sa.hasParam("Chooser")) { // Three modal cards require you to choose a player to make the modal choice' // Two of these also reference the chosen player during the spell effect - String choose = sa.getParam("Chooser"); - List opponents = activator.getOpponents(); - int numOpps = opponents.size(); - if (numOpps == 1) { - chooser = opponents.get(0); - } else { - if (activator.isComputer()) { - chooser = CharmAi.determineOpponentChooser(activator, sa, opponents); - } else { - chooser = GuiChoose.one("Choose an opponent", opponents); - } - } + + //String choosers = sa.getParam("Chooser"); + List opponents = activator.getOpponents(); // all cards have Choser$ Opponent, so it's hardcoded here + chooser = activator.getController().chooseSinglePlayerForEffect(opponents, sa, "Choose an opponent"); source.setChosenPlayer(chooser); } diff --git a/src/main/java/forge/card/ability/effects/CloneEffect.java b/src/main/java/forge/card/ability/effects/CloneEffect.java index 0051e23706c..f582f4a6e02 100644 --- a/src/main/java/forge/card/ability/effects/CloneEffect.java +++ b/src/main/java/forge/card/ability/effects/CloneEffect.java @@ -19,7 +19,6 @@ import forge.card.spellability.TargetRestrictions; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; import forge.game.Game; -import forge.gui.GuiDialog; import forge.properties.ForgePreferences.FPref; public class CloneEffect extends SpellAbilityEffect { @@ -74,11 +73,8 @@ public class CloneEffect extends SpellAbilityEffect { return; } - final StringBuilder sb = new StringBuilder(); - sb.append("Do you want to copy " + cardToCopy + "?"); boolean optional = sa.hasParam("Optional"); - if (host.getController().isHuman() && optional - && !GuiDialog.confirm(host, sb.toString())) { + if (optional && !host.getController().getController().confirmAction(sa, null, "Do you want to copy " + cardToCopy + "?")) { return; } diff --git a/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java b/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java index d520dae68f1..8fdcf895b62 100644 --- a/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java +++ b/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java @@ -27,10 +27,8 @@ import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; import forge.card.spellability.TargetRestrictions; import forge.game.Game; -import forge.game.ai.ComputerUtilCard; import forge.game.player.Player; import forge.game.zone.ZoneType; -import forge.gui.GuiChoose; import forge.item.PaperCard; import forge.util.Aggregates; import forge.util.PredicateString.StringOp; @@ -219,16 +217,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { list = CardLists.getValidCards(list, sa.getParam("AttachedTo"), copy.getController(), copy); } if (!list.isEmpty()) { - Card attachedTo = null; - if (sa.getActivatingPlayer().isHuman()) { - if (list.size() > 1) { - attachedTo = GuiChoose.one(copy + " - Select a card to attach to.", list); - } else { - attachedTo = list.get(0); - } - } else { // AI player - attachedTo = ComputerUtilCard.getBestAI(list); - } + Card attachedTo = sa.getActivatingPlayer().getController().chooseSingleCardForEffect(list, sa, copy + " - Select a card to attach to."); if (copy.isAura()) { if (attachedTo.canBeEnchantedBy(copy)) { copy.enchantEntity(attachedTo); diff --git a/src/main/java/forge/card/ability/effects/DigEffect.java b/src/main/java/forge/card/ability/effects/DigEffect.java index ca026f098bf..5cb5e88891f 100644 --- a/src/main/java/forge/card/ability/effects/DigEffect.java +++ b/src/main/java/forge/card/ability/effects/DigEffect.java @@ -179,21 +179,21 @@ public class DigEffect extends SpellAbilityEffect { movedCards = CardLists.getRandomSubList(valid, numChanging); } else if (allButOne) { movedCards.addAll(valid); + Card chosen = null; if (choser.isHuman()) { - Card chosen = null; + String prompt = "Choose a card to leave in "; if (destZone2.equals(ZoneType.Library) && (libraryPosition2 == 0)) { prompt = "Leave which card on top of the "; } chosen = GuiChoose.one(prompt + destZone2, valid); - movedCards.remove(chosen); } else { // Computer - Card chosen = ComputerUtilCard.getBestAI(valid); - if (sa.getActivatingPlayer().isHuman() && p.isHuman()) { + chosen = ComputerUtilCard.getBestAI(valid); + if (sa.getActivatingPlayer().isOpponentOf(choser) && p.isOpponentOf(choser)) { chosen = ComputerUtilCard.getWorstAI(valid); } - movedCards.remove(chosen); } + movedCards.remove(chosen); if (sa.hasParam("RandomOrder")) { final Random random = MyRandom.getRandom(); Collections.shuffle(movedCards, random); diff --git a/src/main/java/forge/card/ability/effects/PlayEffect.java b/src/main/java/forge/card/ability/effects/PlayEffect.java index 5e21266e2ee..beb3dd04307 100644 --- a/src/main/java/forge/card/ability/effects/PlayEffect.java +++ b/src/main/java/forge/card/ability/effects/PlayEffect.java @@ -12,7 +12,6 @@ import com.google.common.collect.Lists; import forge.Card; import forge.CardCharacteristicName; -import forge.CardLists; import forge.card.CardDb; import forge.card.CardRulesPredicates; import forge.card.ability.AbilityUtils; @@ -22,12 +21,10 @@ import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityRestriction; import forge.game.Game; import forge.game.ai.ComputerUtil; -import forge.game.ai.ComputerUtilCard; import forge.game.player.HumanPlay; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; -import forge.gui.GuiDialog; import forge.item.PaperCard; import forge.util.Aggregates; @@ -136,42 +133,17 @@ public class PlayEffect extends SpellAbilityEffect { } for (int i = 0; i < amount; i++) { - if (tgtCards.isEmpty()) { + Card tgtCard = controller.getController().chooseSingleCardForEffect(tgtCards, sa, "Select a card to play"); + if (tgtCard == null) { return; } - Card tgtCard = tgtCards.get(0); - if (tgtCards.size() > 1) { - if (controller.isHuman()) { - tgtCard = GuiChoose.one("Select a card to play", tgtCards); - } else { - // AI - tgtCards = CardLists.filter(tgtCards, new Predicate() { - @Override - public boolean apply(final Card c) { - for (SpellAbility s : c.getBasicSpells()) { - Spell spell = (Spell) s; - s.setActivatingPlayer(controller); - // timing restrictions still apply - if (s.getRestrictions().checkTimingRestrictions(c, s) && spell.canPlayFromEffectAI(false, true)) { - return true; - } - } - return false; - } - }); - tgtCard = ComputerUtilCard.getBestAI(tgtCards); - if (tgtCard == null) { - return; - } - } - } + if (tgtCard.isFaceDown()) { tgtCard.setState(CardCharacteristicName.Original); wasFaceDown = true; } - final StringBuilder sb = new StringBuilder(); - sb.append("Do you want to play " + tgtCard + "?"); - if (controller.isHuman() && optional && !GuiDialog.confirm(source, sb.toString())) { + + if (optional && !controller.getController().confirmAction(sa, null, "Do you want to play " + tgtCard + "?")) { // i--; // This causes an infinite loop (ArsenalNut) if (wasFaceDown) { tgtCard.setState(CardCharacteristicName.FaceDown); diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java index f785dd83f17..ce5e043d47e 100644 --- a/src/main/java/forge/game/GameActionUtil.java +++ b/src/main/java/forge/game/GameActionUtil.java @@ -57,6 +57,7 @@ import forge.game.ai.AiController; import forge.game.player.HumanPlay; import forge.game.event.GameEventLifeLoss; import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerControllerAi; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -297,9 +298,10 @@ public final class GameActionUtil { void doRipple(final Card c, final int rippleCount, final Player controller) { final Card rippleCard = c; - if (controller.isComputer() || GuiDialog.confirm(c, "Activate Ripple for " + c + "?")) { + final Ability ability = new RippleAbility(c, ManaCost.ZERO, controller, rippleCount, rippleCard); + + if (controller.getController().confirmAction(ability, PlayerActionConfirmMode.Ripple, "Activate Ripple for " + c + "?")) { - final Ability ability = new RippleAbility(c, ManaCost.ZERO, controller, rippleCount, rippleCard); final StringBuilder sb = new StringBuilder(); sb.append(c).append(" - Ripple."); ability.setStackDescription(sb.toString()); diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index b2cb5298fe9..631db4a9882 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -643,6 +643,7 @@ public class AiController { if ( null == api ) { if( mode != null ) switch (mode) { case BraidOfFire: return true; + case Ripple: return true; } String exMsg = String.format("AI confirmAction does not know what to decide about %s mode (api is null).", mode); diff --git a/src/main/java/forge/game/player/PlayerActionConfirmMode.java b/src/main/java/forge/game/player/PlayerActionConfirmMode.java index b6a37379248..22e2dd695fc 100644 --- a/src/main/java/forge/game/player/PlayerActionConfirmMode.java +++ b/src/main/java/forge/game/player/PlayerActionConfirmMode.java @@ -7,6 +7,7 @@ package forge.game.player; public enum PlayerActionConfirmMode { Random, BraidOfFire, - FromOpeningHand; + FromOpeningHand, + Ripple; } \ No newline at end of file diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 811f0c37a53..3660f463ab2 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -266,14 +266,15 @@ public class PlayerControllerHuman extends PlayerController { @Override public Card chooseSingleCardForEffect(List options, SpellAbility sa, String title, boolean isOptional) { // Human is supposed to read the message and understand from it what to choose + if (options.isEmpty()) + return null; + if ( isOptional ) return GuiChoose.oneOrNone(title, options); else if ( options.size() > 1 ) return GuiChoose.one(title, options); - else if (options.size() == 1) - return options.get(0); else - return null; + return options.get(0); } @Override diff --git a/src/main/java/forge/gui/match/ControlWinLose.java b/src/main/java/forge/gui/match/ControlWinLose.java index 7f792c045b3..7b0cf6074de 100644 --- a/src/main/java/forge/gui/match/ControlWinLose.java +++ b/src/main/java/forge/gui/match/ControlWinLose.java @@ -145,7 +145,7 @@ public class ControlWinLose { if( !fromGame.hasWon()) continue; // not a loser // offer to winner, if he is local human - if (fromGame.isHuman()) { + if (fromGame.getController().getLobbyPlayer() == Singletons.getControl().getLobby().getGuiPlayer()) { List chosen = GuiChoose.noneOrMany("Select cards to add to your deck", losses); if (null != chosen) { RegisteredPlayer psc = match.getPlayers().get(i);