- Adding Karn Liberated (albeit with limited AI support for AF_RestartGame)

This commit is contained in:
Sol
2012-11-05 02:33:58 +00:00
parent 77ea6af152
commit 32e7ab1623
5 changed files with 124 additions and 0 deletions

3
.gitattributes vendored
View File

@@ -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

View File

@@ -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

View File

@@ -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();

View File

@@ -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<String, String> 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<String, String> params, SpellAbility sa, boolean mandatory) {
// This trigger AI is completely unused, but return true just in case
return true;
}
}

View File

@@ -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<String, String> params, SpellAbility sa) {
GameState game = Singletons.getModel().getGame();
List<Player> players = game.getPlayers();
Map<Player, List<Card>> playerLibraries = new HashMap<Player, List<Card>>();
// Don't grab Ante Zones
List<ZoneType> restartZones = new ArrayList<ZoneType>(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<Card> newLibrary = new ArrayList<Card>(p.getCardsIn(restartZones));
List<Card> 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<String, String> params, SpellAbility sa) {
String desc = params.get("SpellDescription");
if (desc == null) {
desc = "Restart the game.";
}
return desc.replace("CARDNAME", sa.getSourceCard().getName());
}
}