mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 10:18:01 +00:00
- Adding Karn Liberated (albeit with limited AI support for AF_RestartGame)
This commit is contained in:
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -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
|
||||
|
||||
15
res/cardsfolder/k/karn_liberated.txt
Normal file
15
res/cardsfolder/k/karn_liberated.txt
Normal 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
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user