mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +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/kargan_dragonlord.txt svneol=native#text/plain
|
||||||
res/cardsfolder/k/karma.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/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/karn_silver_golem.txt svneol=native#text/plain
|
||||||
res/cardsfolder/k/karns_touch.txt svneol=native#text/plain
|
res/cardsfolder/k/karns_touch.txt svneol=native#text/plain
|
||||||
res/cardsfolder/k/karona_false_god.txt -text
|
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/RegenerateAllAi.java -text
|
||||||
src/main/java/forge/card/abilityfactory/ai/RemoveFromCombatAi.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/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/RevealAi.java -text
|
||||||
src/main/java/forge/card/abilityfactory/ai/RevealAiBase.java -text
|
src/main/java/forge/card/abilityfactory/ai/RevealAiBase.java -text
|
||||||
src/main/java/forge/card/abilityfactory/ai/RevealHandAi.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/RegenerateEffect.java -text
|
||||||
src/main/java/forge/card/abilityfactory/effects/RemoveFromCombatEffect.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/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/RevealEffect.java -text
|
||||||
src/main/java/forge/card/abilityfactory/effects/RevealEffectBase.java svneol=native#text/plain
|
src/main/java/forge/card/abilityfactory/effects/RevealEffectBase.java svneol=native#text/plain
|
||||||
src/main/java/forge/card/abilityfactory/effects/RevealHandEffect.java -text
|
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();
|
se = new RepeatEffect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (this.api.equals("RestartGame")) {
|
||||||
|
ai = new RestartGameAi();
|
||||||
|
se = new RestartGameEffect();
|
||||||
|
}
|
||||||
|
|
||||||
else if (this.api.equals("Reveal")) {
|
else if (this.api.equals("Reveal")) {
|
||||||
ai = new RevealAi();
|
ai = new RevealAi();
|
||||||
se = new RevealEffect();
|
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