From 32e7ab16233670da2bea155d50c17db2e4ee5843 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 5 Nov 2012 02:33:58 +0000 Subject: [PATCH] - Adding Karn Liberated (albeit with limited AI support for AF_RestartGame) --- .gitattributes | 3 + res/cardsfolder/k/karn_liberated.txt | 15 +++++ .../card/abilityfactory/AbilityFactory.java | 5 ++ .../card/abilityfactory/ai/RestartGameAi.java | 34 ++++++++++ .../effects/RestartGameEffect.java | 67 +++++++++++++++++++ 5 files changed, 124 insertions(+) create mode 100644 res/cardsfolder/k/karn_liberated.txt create mode 100644 src/main/java/forge/card/abilityfactory/ai/RestartGameAi.java create mode 100644 src/main/java/forge/card/abilityfactory/effects/RestartGameEffect.java diff --git a/.gitattributes b/.gitattributes index 1adae54d94c..8698b940717 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5145,6 +5145,7 @@ res/cardsfolder/k/karakas.txt svneol=native#text/plain res/cardsfolder/k/kargan_dragonlord.txt svneol=native#text/plain res/cardsfolder/k/karma.txt svneol=native#text/plain res/cardsfolder/k/karmic_guide.txt svneol=native#text/plain +res/cardsfolder/k/karn_liberated.txt -text res/cardsfolder/k/karn_silver_golem.txt svneol=native#text/plain res/cardsfolder/k/karns_touch.txt svneol=native#text/plain res/cardsfolder/k/karona_false_god.txt -text @@ -12534,6 +12535,7 @@ src/main/java/forge/card/abilityfactory/ai/RegenerateAi.java svneol=native#text/ src/main/java/forge/card/abilityfactory/ai/RegenerateAllAi.java -text src/main/java/forge/card/abilityfactory/ai/RemoveFromCombatAi.java -text src/main/java/forge/card/abilityfactory/ai/RepeatAi.java -text +src/main/java/forge/card/abilityfactory/ai/RestartGameAi.java -text src/main/java/forge/card/abilityfactory/ai/RevealAi.java -text src/main/java/forge/card/abilityfactory/ai/RevealAiBase.java -text src/main/java/forge/card/abilityfactory/ai/RevealHandAi.java -text @@ -12623,6 +12625,7 @@ src/main/java/forge/card/abilityfactory/effects/RegenerateAllEffect.java -text src/main/java/forge/card/abilityfactory/effects/RegenerateEffect.java -text src/main/java/forge/card/abilityfactory/effects/RemoveFromCombatEffect.java -text src/main/java/forge/card/abilityfactory/effects/RepeatEffect.java -text +src/main/java/forge/card/abilityfactory/effects/RestartGameEffect.java -text src/main/java/forge/card/abilityfactory/effects/RevealEffect.java -text src/main/java/forge/card/abilityfactory/effects/RevealEffectBase.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/effects/RevealHandEffect.java -text diff --git a/res/cardsfolder/k/karn_liberated.txt b/res/cardsfolder/k/karn_liberated.txt new file mode 100644 index 00000000000..e2b8538dc13 --- /dev/null +++ b/res/cardsfolder/k/karn_liberated.txt @@ -0,0 +1,15 @@ +Name:Karn Liberated +ManaCost:7 +Types:Planeswalker Karn +Text:no text +Loyalty:6 +A:AB$ ChangeZone | Cost$ AddCounter<4/LOYALTY> | Planeswalker$ True | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | RememberChanged$ True | Chooser$ Targeted | Hidden$ True | SpellDescription$ Target player exiles a card from his or her hand. +A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SpellDescription$ Exile target permanent. +A:AB$ RestartGame | Cost$ SubCounter<14/LOYALTY> | Planeswalker$ True | Ultimate$ True | RestrictFromZone$ Exile | RestrictFromValid$ Card.IsNotRemembered,Spell,Card.Aura | SubAbility$ ReturnFromExile | SpellDescription$ Restart the game, leaving in exile all non-Aura permanent cards exiled with CARDNAME. Then put those cards onto the battlefield under your control. +SVar:ReturnFromExile:DB$ ChangeZoneAll | ChangeType$ Permanent.nonAura+IsRemembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Rarity:Mythic +SVar:Picture:http://www.wizards.com/global/images/magic/general/karn_liberated.jpg +SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/1.jpg +Oracle:[+4] Target player exiles a card from his or her hand.\n[-3] Exile target permanent.\n[-14] Restart the game, leaving in exile all non-Aura permanent cards exiled with Karn Liberated. Then put those cards onto the battlefield under your control. +End \ No newline at end of file diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index 8da1d58d223..9ec17d1ac13 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -763,6 +763,11 @@ public class AbilityFactory { se = new RepeatEffect(); } + else if (this.api.equals("RestartGame")) { + ai = new RestartGameAi(); + se = new RestartGameEffect(); + } + else if (this.api.equals("Reveal")) { ai = new RevealAi(); se = new RevealEffect(); diff --git a/src/main/java/forge/card/abilityfactory/ai/RestartGameAi.java b/src/main/java/forge/card/abilityfactory/ai/RestartGameAi.java new file mode 100644 index 00000000000..b0ea480ca38 --- /dev/null +++ b/src/main/java/forge/card/abilityfactory/ai/RestartGameAi.java @@ -0,0 +1,34 @@ +package forge.card.abilityfactory.ai; + +import java.util.Map; +import forge.card.abilityfactory.SpellAiLogic; +import forge.card.spellability.SpellAbility; +import forge.game.player.Player; + +public class RestartGameAi extends SpellAiLogic { + + /* + * (non-Javadoc) + * + * @see + * forge.card.abilityfactory.AbilityFactoryAlterLife.SpellAiLogic#canPlayAI + * (forge.game.player.Player, java.util.Map, + * forge.card.spellability.SpellAbility) + */ + @Override + public boolean canPlayAI(Player ai, Map params, SpellAbility sa) { + // The only card that uses this is Karn Liberated + + // TODO Add Logic, check if AI is losing game state, or life + + // TODO Add Logic, check if any good cards will be available to be returned + + return true; + } + + @Override + public boolean doTriggerAI(Player ai, Map params, SpellAbility sa, boolean mandatory) { + // This trigger AI is completely unused, but return true just in case + return true; + } +} \ No newline at end of file diff --git a/src/main/java/forge/card/abilityfactory/effects/RestartGameEffect.java b/src/main/java/forge/card/abilityfactory/effects/RestartGameEffect.java new file mode 100644 index 00000000000..c9192e32093 --- /dev/null +++ b/src/main/java/forge/card/abilityfactory/effects/RestartGameEffect.java @@ -0,0 +1,67 @@ +package forge.card.abilityfactory.effects; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import forge.Card; +import forge.CardLists; +import forge.CardPredicates; +import forge.Singletons; +import forge.card.abilityfactory.SpellEffect; +import forge.card.spellability.SpellAbility; +import forge.game.GameNew; +import forge.game.GameState; +import forge.game.player.Player; +import forge.game.zone.ZoneType; + +public class RestartGameEffect extends SpellEffect { + + /* (non-Javadoc) + * @see forge.card.abilityfactory.AbilityFactoryAlterLife.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility) + */ + @Override + public void resolve(Map params, SpellAbility sa) { + GameState game = Singletons.getModel().getGame(); + List players = game.getPlayers(); + Map> playerLibraries = new HashMap>(); + + // Don't grab Ante Zones + List restartZones = new ArrayList(Arrays.asList(ZoneType.Battlefield, + ZoneType.Library, ZoneType.Graveyard, ZoneType.Hand, ZoneType.Exile, ZoneType.Command)); + + ZoneType leaveZone = ZoneType.smartValueOf(params.containsKey("RestrictFromZone") ? params.get("RestrictFromZone") : null); + restartZones.remove(leaveZone); + String leaveRestriction = params.containsKey("RestrictFromValid") ? params.get("RestrictFromValid") : "Card"; + + for(Player p : players) { + List newLibrary = new ArrayList(p.getCardsIn(restartZones)); + List filteredCards = null; + if (leaveZone != null) { + filteredCards = CardLists.filter(p.getCardsIn(leaveZone), + CardPredicates.restriction(leaveRestriction.split(","), p, sa.getSourceCard())); + } + + newLibrary.addAll(filteredCards); + playerLibraries.put(p, newLibrary); + } + + GameNew.restartGame(game, sa.getActivatingPlayer(), playerLibraries); + } + + /* (non-Javadoc) + * @see forge.card.abilityfactory.AbilityFactoryAlterLife.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility) + */ + @Override + public String getStackDescription(Map params, SpellAbility sa) { + String desc = params.get("SpellDescription"); + + if (desc == null) { + desc = "Restart the game."; + } + + return desc.replace("CARDNAME", sa.getSourceCard().getName()); + } +}