From 914c5a060f57f3c24d6b848e9d634f2045b6597d Mon Sep 17 00:00:00 2001 From: Sol Date: Sat, 5 Jan 2013 23:04:08 +0000 Subject: [PATCH] - - Adding PeekAndReveal AF. It was simpler to create this subset of Dig than force Kinship cards to have a complex and ugly script. --- .gitattributes | 2 + .../forge/card/abilityfactory/ApiType.java | 1 + .../abilityfactory/ai/PeekAndRevealAi.java | 23 +++++ .../effects/PeekAndRevealEffect.java | 84 +++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 src/main/java/forge/card/abilityfactory/ai/PeekAndRevealAi.java create mode 100644 src/main/java/forge/card/abilityfactory/effects/PeekAndRevealEffect.java diff --git a/.gitattributes b/.gitattributes index 2f1025fb7cc..fe211b444c5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13168,6 +13168,7 @@ src/main/java/forge/card/abilityfactory/ai/LifeSetAi.java -text src/main/java/forge/card/abilityfactory/ai/MillAi.java -text src/main/java/forge/card/abilityfactory/ai/MustAttackAi.java -text src/main/java/forge/card/abilityfactory/ai/MustBlockAi.java -text +src/main/java/forge/card/abilityfactory/ai/PeekAndRevealAi.java -text src/main/java/forge/card/abilityfactory/ai/PermanentCreatureAi.java -text src/main/java/forge/card/abilityfactory/ai/PermanentNoncreatureAi.java -text src/main/java/forge/card/abilityfactory/ai/PhasesAi.java -text @@ -13269,6 +13270,7 @@ src/main/java/forge/card/abilityfactory/effects/ManaReflectedEffect.java -text src/main/java/forge/card/abilityfactory/effects/MillEffect.java -text src/main/java/forge/card/abilityfactory/effects/MustAttackEffect.java -text src/main/java/forge/card/abilityfactory/effects/MustBlockEffect.java -text +src/main/java/forge/card/abilityfactory/effects/PeekAndRevealEffect.java -text src/main/java/forge/card/abilityfactory/effects/PermanentCreatureEfect.java -text src/main/java/forge/card/abilityfactory/effects/PermanentNoncreatureEffect.java -text src/main/java/forge/card/abilityfactory/effects/PhasesEffect.java -text diff --git a/src/main/java/forge/card/abilityfactory/ApiType.java b/src/main/java/forge/card/abilityfactory/ApiType.java index 35dc03cbefc..46132cc56b2 100644 --- a/src/main/java/forge/card/abilityfactory/ApiType.java +++ b/src/main/java/forge/card/abilityfactory/ApiType.java @@ -65,6 +65,7 @@ public enum ApiType { MustAttack (MustAttackEffect.class, MustAttackAi.class), MustBlock (MustBlockEffect.class, MustBlockAi.class), NameCard (ChooseCardNameEffect.class, ChooseCardNameAi.class), + PeekAndReveal (PeekAndRevealEffect.class, PeekAndRevealAi.class), PermanentCreature (PermanentCreatureEfect.class, PermanentCreatureAi.class), PermanentNoncreature (PermanentNoncreatureEffect.class, PermanentNoncreatureAi.class), Phases (PhasesEffect.class, PhasesAi.class), diff --git a/src/main/java/forge/card/abilityfactory/ai/PeekAndRevealAi.java b/src/main/java/forge/card/abilityfactory/ai/PeekAndRevealAi.java new file mode 100644 index 00000000000..8fb3b3d0f22 --- /dev/null +++ b/src/main/java/forge/card/abilityfactory/ai/PeekAndRevealAi.java @@ -0,0 +1,23 @@ +package forge.card.abilityfactory.ai; + +import forge.card.abilityfactory.SpellAiLogic; +import forge.card.spellability.SpellAbility; +import forge.game.player.Player; + +/** + * TODO: Write javadoc for this type. + * + */ +public class PeekAndRevealAi extends SpellAiLogic { + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, forge.card.spellability.SpellAbility) + */ + @Override + protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { + // So far this only appears on Triggers, but will expand + // once things get converted from Dig + NoMove + return false; + } + +} diff --git a/src/main/java/forge/card/abilityfactory/effects/PeekAndRevealEffect.java b/src/main/java/forge/card/abilityfactory/effects/PeekAndRevealEffect.java new file mode 100644 index 00000000000..f034b77f601 --- /dev/null +++ b/src/main/java/forge/card/abilityfactory/effects/PeekAndRevealEffect.java @@ -0,0 +1,84 @@ +package forge.card.abilityfactory.effects; + +import java.util.ArrayList; +import java.util.List; + +import forge.Card; +import forge.CardLists; +import forge.GameActionUtil; +import forge.card.abilityfactory.AbilityFactory; +import forge.card.abilityfactory.SpellEffect; +import forge.card.spellability.AbilitySub; +import forge.card.spellability.SpellAbility; +import forge.game.player.Player; +import forge.game.zone.PlayerZone; +import forge.game.zone.ZoneType; +import forge.gui.GuiChoose; + +/** + * PeeakAndReveal is a simplified why of handling something that could + * be done with dig and NoMove$ . All of the Kinship cards are going to use this + * And there's probably a bunch of existing cards that would have simpler scripts + * by just using PeekAndReveal + * + */ +public class PeekAndRevealEffect extends SpellEffect { + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellEffect#resolve(forge.card.spellability.SpellAbility) + */ + @Override + public void resolve(SpellAbility sa) { + //RevealValid$ Card.sharesCreatureTypeWith | RevealOptional$ True | RememberRevealed$ True + Card source = sa.getSourceCard(); + boolean revealOptional = sa.hasParam("RevealOptional"); + boolean rememberRevealed = sa.hasParam("RememberRevealed"); + String revealValid = sa.hasParam("RevealValid") ? sa.getParam("RevealValid") : "Card"; + String peekAmount = sa.hasParam("PeekAmount") ? sa.getParam("PeekAmount") : "1"; + int numPeek = AbilityFactory.calculateAmount(sa.getSourceCard(), peekAmount, sa); + + // Right now, this is only used on your own library. + Player libraryToPeek = sa.getActivatingPlayer(); + Player peekingPlayer = sa.getActivatingPlayer(); + + final PlayerZone library = libraryToPeek.getZone(ZoneType.Library); + numPeek = Math.min(numPeek, library.size()); + + List peekCards = new ArrayList(); + for(int i = 0; i < numPeek; i++) { + peekCards.add(library.get(i)); + } + + List revealableCards = CardLists.getValidCards(peekCards, revealValid, sa.getActivatingPlayer(), sa.getSourceCard()); + boolean doReveal = !revealableCards.isEmpty(); + + //peekingPlayer.showCards(peekCards) + if (peekingPlayer.isHuman()) { + GuiChoose.one(source + "Revealing cards from library", peekCards); + if (doReveal && revealOptional) { + StringBuilder question = new StringBuilder(); + question.append("Reveal cards to other players?"); + doReveal = GameActionUtil.showYesNoDialog(source, question.toString()); + } + } else { + if (doReveal && revealOptional) { + // If + AbilitySub subAb = sa.getSubAbility(); + doReveal = subAb != null && subAb.chkAIDrawback(); + } + } + + if (doReveal) { + if (!peekingPlayer.isHuman()) { + GuiChoose.one(source + "Revealing cards from library", revealableCards); + } + // Singletons.getModel().getGameAction().revealCardsToOtherPlayers(peekingPlayer, revealableCards); + if (rememberRevealed) { + for(Card c : revealableCards) { + source.addRemembered(c); + } + } + } + } + +}