diff --git a/.gitattributes b/.gitattributes index 40349850223..a4a8337da55 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16952,6 +16952,7 @@ forge-gui/res/cardsfolder/u/utvara_hellkite.txt -text forge-gui/res/cardsfolder/u/utvara_scalper.txt svneol=native#text/plain forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt svneol=native#text/plain forge-gui/res/cardsfolder/upcoming/abrade.txt -text +forge-gui/res/cardsfolder/upcoming/adorned_pouncer.txt -text forge-gui/res/cardsfolder/upcoming/bontus_last_reckoning.txt -text forge-gui/res/cardsfolder/upcoming/carrion_screecher.txt -text forge-gui/res/cardsfolder/upcoming/hour_of_revelation.txt -text @@ -16960,6 +16961,7 @@ forge-gui/res/cardsfolder/upcoming/nicol_bolas_god_pharaoh.txt -text forge-gui/res/cardsfolder/upcoming/nissa_genesis_mage.txt -text forge-gui/res/cardsfolder/upcoming/ramunap_excavator.txt -text forge-gui/res/cardsfolder/upcoming/samut_the_tested.txt -text +forge-gui/res/cardsfolder/upcoming/steadfast_sentinel.txt -text forge-gui/res/cardsfolder/upcoming/wildfire_eternal.txt -text forge-gui/res/cardsfolder/v/vacuumelt.txt svneol=native#text/plain forge-gui/res/cardsfolder/v/vaevictis_asmadi.txt svneol=native#text/plain diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index afc4a508f94..d2f58798fbe 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -342,6 +342,13 @@ public class CloneEffect extends SpellAbilityEffect { tgtCard.setColor(MagicColor.WHITE); tgtCard.setManaCost(ManaCost.NO_COST); } + if (sa.hasParam("Eternalize") && tgtCard.isEternalized()) { + tgtCard.addType("Zombie"); + tgtCard.setColor(MagicColor.BLACK); + tgtCard.setManaCost(ManaCost.NO_COST); + tgtCard.setBasePower(4); + tgtCard.setBaseToughness(4); + } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 62e405068fc..c4ba594980a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -253,6 +253,17 @@ public class CopyPermanentEffect extends SpellAbilityEffect { String name = copy.getName().replace(",", "").replace(" ", "_").toLowerCase(); copy.setImageKey(ImageKeys.getTokenKey("embalm_" + name)); } + if (sa.hasParam("Eternalize")) { + copy.addType("Zombie"); + copy.setColor(MagicColor.BLACK); + copy.setManaCost(ManaCost.NO_COST); + copy.setBasePower(4); + copy.setBaseToughness(4); + copy.setEternalized(true); + + String name = copy.getName().replace(",", "").replace(" ", "_").toLowerCase(); + copy.setImageKey(ImageKeys.getTokenKey("eternalize_" + name)); + } copy.updateStateForView(); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 704e061c338..9d84fd36caa 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -167,6 +167,7 @@ public class Card extends GameEntity implements Comparable { private boolean suspend = false; private boolean tributed = false; private boolean embalmed = false; + private boolean eternalized = false; private boolean madness = false; private boolean madnessWithoutCast = false; @@ -1531,7 +1532,7 @@ public class Card extends GameEntity implements Comparable { || keyword.startsWith("Evoke") || keyword.startsWith("Bestow") || keyword.startsWith("Dash") || keyword.startsWith("Surge") || keyword.startsWith("Transmute") || keyword.startsWith("Suspend") || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") || keyword.startsWith("Embalm") - || keyword.startsWith("Level up") || keyword.equals("Prowess") + || keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Eternalize") || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")) { // keyword parsing takes care of adding a proper description } else if (keyword.startsWith("CantBeBlockedBy")) { @@ -6138,7 +6139,14 @@ public class Card extends GameEntity implements Comparable { public final void setEmbalmed(final boolean b) { embalmed = b; } - + + public final boolean isEternalized() { + return eternalized; + } + public final void setEternalized(final boolean b) { + eternalized = b; + } + public final int getExertedThisTurn() { return exertThisTurn; } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index cd5c7d0f826..edf6b869852 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2176,6 +2176,9 @@ public class CardFactoryUtil { else if (keyword.startsWith("Escalate")) { addStaticAbility(keyword, card, null); } + else if (keyword.startsWith("Eternalize")) { + addSpellAbility(keyword, card, null); + } else if (keyword.startsWith("Fabricate")) { addTriggerAbility(keyword, card, null); } @@ -3775,6 +3778,24 @@ public class CardFactoryUtil { kws.addSpellAbility(newSA); } card.addSpellAbility(newSA); + } else if (keyword.startsWith("Eternalize")) { + final String[] kw = keyword.split(":"); + String costStr = kw[1]; + + String effect = "AB$ CopyPermanent | Cost$ " + costStr + " ExileFromGrave<1/CARDNAME> " + + "| ActivationZone$ Graveyard | SorcerySpeed$ True | Eternalize$ True " + + "| PrecostDesc$ Eternalize | CostDesc$ " + ManaCostParser.parse(costStr) + " | Defined$ Self " + + "| StackDescription$ Eternalize - CARDNAME "+ + "| SpellDescription$ (" + Keyword.getInstance(keyword).getReminderText() + ")" ; + final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + + if (!intrinsic) { + sa.setTemporary(true); + //sa.setOriginalHost(hostCard); + kws.addSpellAbility(sa); + } + card.addSpellAbility(sa); } else if (keyword.startsWith("Evoke")) { final String[] k = keyword.split(":"); final SpellAbility sa = card.getFirstSpellAbility(); diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 279153b4c9d..48108e23c69 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -48,6 +48,7 @@ public enum Keyword { EPIC(SimpleKeyword.class, true, "For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps for the rest of the game, copy this spell except for its epic ability. If the spell has any targets, you may choose new targets for the copy."), EQUIP(KeywordWithCost.class, false, "%s: Attach this permanent to target creature you control. Activate this ability only any time you could cast a sorcery."), ESCALATE(KeywordWithCost.class, true, "Pay this cost for each mode chosen beyond the first."), + ETERNALIZE(KeywordWithCost.class, false, "Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery."), EVOKE(KeywordWithCost.class, false, "You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield."), EVOLVE(SimpleKeyword.class, false, "Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than this creature, put a +1/+1 counter on this creature."), EXALTED(SimpleKeyword.class, false, "Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn."), diff --git a/forge-gui/res/cardsfolder/upcoming/adorned_pouncer.txt b/forge-gui/res/cardsfolder/upcoming/adorned_pouncer.txt new file mode 100644 index 00000000000..0ffe93433aa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/adorned_pouncer.txt @@ -0,0 +1,8 @@ +Name:Adorned Pouncer +ManaCost:1 W +Types:Creature Cat +PT:1/1 +K:Double Strike +K:Eternalize:3 W W +SVar:Picture:http://www.wizards.com/global/images/magic/general/adorned_pouncer.jpg +Oracle:Double strike\nEternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/steadfast_sentinel.txt b/forge-gui/res/cardsfolder/upcoming/steadfast_sentinel.txt new file mode 100644 index 00000000000..f0b53af80a5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steadfast_sentinel.txt @@ -0,0 +1,8 @@ +Name:Steadfast Sentinel +ManaCost:3 W +Types:Creature Human Cleric +PT:2/3 +K:Vigilance +K:Eternalize:4 W W +SVar:Picture:http://www.wizards.com/global/images/magic/general/steadfast_sentinel.jpg +Oracle:Vigilance\nEternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)