From 89758ccb2de5ef551021a3835a8581a636cfb227 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Wed, 19 Apr 2023 07:31:15 +0300 Subject: [PATCH 1/6] - Minor tidy up in the new achievement code. --- .../achievements/CardActivationAchievements.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/src/main/java/forge/localinstance/achievements/CardActivationAchievements.java b/forge-gui/src/main/java/forge/localinstance/achievements/CardActivationAchievements.java index b92c69323dc..5f0b22978ff 100644 --- a/forge-gui/src/main/java/forge/localinstance/achievements/CardActivationAchievements.java +++ b/forge-gui/src/main/java/forge/localinstance/achievements/CardActivationAchievements.java @@ -29,7 +29,7 @@ public class CardActivationAchievements extends AchievementCollection { } protected void add(String cardName0, String displayName0, String flavorText0) { - add(new NonPWUltimate(cardName0, displayName0, flavorText0)); + add(new CardAbilityUltimate(cardName0, displayName0, flavorText0)); } @Override @@ -50,14 +50,14 @@ public class CardActivationAchievements extends AchievementCollection { } } - private class NonPWUltimate extends ProgressiveAchievement { - private NonPWUltimate(String cardName0, String displayName0, String flavorText0) { + private class CardAbilityUltimate extends ProgressiveAchievement { + private CardAbilityUltimate(String cardName0, String displayName0, String flavorText0) { super(cardName0, displayName0, Localizer.getInstance().getMessage("lblWinGameAfterActivatingCardUltimate", CardTranslation.getTranslatedName(cardName0)), flavorText0); } @Override protected boolean eval(Player player, Game game) { - return true; //if this reaches this point, it can be presumed that alternate win condition achieved + return true; //if this reaches this point, it can be presumed that winning the game after activating the ultimate card ability is accomplished } @Override From 93a4e87e37abcc9d5e7c804bceaaf194f68e24cd Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Thu, 27 Apr 2023 21:12:05 +0300 Subject: [PATCH 2/6] - Add Ultimate tags to remaining MOM sagas. --- .../res/cardsfolder/upcoming/sheoldred_the_true_scriptures.txt | 2 +- forge-gui/res/cardsfolder/upcoming/urabrask_the_great_work.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/sheoldred_the_true_scriptures.txt b/forge-gui/res/cardsfolder/upcoming/sheoldred_the_true_scriptures.txt index 4bf90c22dfd..a69ab903f55 100644 --- a/forge-gui/res/cardsfolder/upcoming/sheoldred_the_true_scriptures.txt +++ b/forge-gui/res/cardsfolder/upcoming/sheoldred_the_true_scriptures.txt @@ -23,7 +23,7 @@ K:Saga:3:DBDestroy,DBDiscard,DBRiseAll SVar:DBDestroy:DB$ Destroy | ValidTgts$ Creature.OppCtrl,Planeswalker.OppCtrl | TgtPrompt$ For each opponent, select up to one target creature or planeswalker | TargetMin$ 0 | TargetMax$ OneEach | TargetsWithDifferentControllers$ True | SpellDescription$ For each opponent, destroy up to one target creature or planeswalker that player controls. SVar:DBDiscard:DB$ Discard | Defined$ Opponent | NumCards$ 3 | Mode$ TgtChoose | SubAbility$ DBMill | SpellDescription$ Each opponent discards three cards, then mills three cards. SVar:DBMill:DB$ Mill | Defined$ Opponent | NumCards$ 3 | StackDescription$ None -SVar:DBRiseAll:DB$ ChangeZoneAll | ChangeType$ Creature | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ DBExileSelf | SpellDescription$ Put all creature cards in all graveyards onto the battlefield under your control. Exile CARDNAME, then return it to the battlefield (front face up). +SVar:DBRiseAll:DB$ ChangeZoneAll | ChangeType$ Creature | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ DBExileSelf | Ultimate$ True | SpellDescription$ Put all creature cards in all graveyards onto the battlefield under your control. Exile CARDNAME, then return it to the battlefield (front face up). SVar:DBExileSelf:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBReturnSelf | RememberChanged$ True SVar:DBReturnSelf:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/upcoming/urabrask_the_great_work.txt b/forge-gui/res/cardsfolder/upcoming/urabrask_the_great_work.txt index b707c9a7cc0..e3fc0a6ad56 100644 --- a/forge-gui/res/cardsfolder/upcoming/urabrask_the_great_work.txt +++ b/forge-gui/res/cardsfolder/upcoming/urabrask_the_great_work.txt @@ -27,7 +27,7 @@ Types:Enchantment Saga K:Saga:3:DBDamage,DBToken,DBCastAll SVar:DBDamage:DB$ DamageAll | ValidTgts$ Opponent | NumDmg$ 3 | ValidPlayers$ Targeted | ValidCards$ Creature.TargetedPlayerCtrl | ValidDescription$ target opponent and each creature they control. | SpellDescription$ CARDNAME deals 3 damage to target opponent and each creature they control. SVar:DBToken:DB$ Token | TokenAmount$ 3 | TokenScript$ c_a_treasure_sac | SpellDescription$ Create three Treasure tokens. -SVar:DBCastAll:DB$ Effect | ReplacementEffects$ REExileOnResolve | StaticAbilities$ STPlay | AILogic$ YawgmothsWill | AINoRecursiveCheck$ True | SubAbility$ DBExileSelf | SpellDescription$ Until end of turn, you may cast instant and sorcery spells from any graveyard. If a spell cast this way would be put into a graveyard, exile it instead. Exile CARDNAME, then return it to the battlefield (front face up). +SVar:DBCastAll:DB$ Effect | ReplacementEffects$ REExileOnResolve | StaticAbilities$ STPlay | AILogic$ YawgmothsWill | AINoRecursiveCheck$ True | Ultimate$ True | SubAbility$ DBExileSelf | SpellDescription$ Until end of turn, you may cast instant and sorcery spells from any graveyard. If a spell cast this way would be put into a graveyard, exile it instead. Exile CARDNAME, then return it to the battlefield (front face up). SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.Instant,Card.Sorcery | AffectedZone$ Graveyard | MayPlay$ True | Description$ You may play instant and sorcery spells from any graveyard. SVar:REExileOnResolve:Event$ Moved | ValidLKI$ Card.CastSa Spell.MayPlaySource | Origin$ Stack | Destination$ Graveyard | ReplaceWith$ MoveExile SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Stack | Destination$ Exile From 822ed63287553049daee2bfb69a5adec623cf62e Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Thu, 27 Apr 2023 21:31:21 +0300 Subject: [PATCH 3/6] - Add card activation ultimates to the actual UI. --- .../forge/localinstance/achievements/AchievementCollection.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/src/main/java/forge/localinstance/achievements/AchievementCollection.java b/forge-gui/src/main/java/forge/localinstance/achievements/AchievementCollection.java index 64a920639f5..12e5e2c8ceb 100644 --- a/forge-gui/src/main/java/forge/localinstance/achievements/AchievementCollection.java +++ b/forge-gui/src/main/java/forge/localinstance/achievements/AchievementCollection.java @@ -79,6 +79,7 @@ public abstract class AchievementCollection implements Iterable { cb.addItem(FModel.getAchievements(GameType.Puzzle)); cb.addItem(AltWinAchievements.instance); cb.addItem(PlaneswalkerAchievements.instance); + cb.addItem(CardActivationAchievements.instance); cb.addItem(ChallengeAchievements.instance); } From 215a41ed84f9066dafba7be719a6c9b0f55fed6d Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 7 May 2023 21:10:25 +0300 Subject: [PATCH 4/6] - Added puzzles PS_ONE3 (disabled for now), PS_ONE4, PS_ONE5, PS_MOM1, PS_MOM2. --- forge-gui/res/puzzle/PS_MOM1.pzl | 21 +++++++++++++++++++++ forge-gui/res/puzzle/PS_MOM2.pzl | 20 ++++++++++++++++++++ forge-gui/res/puzzle/PS_ONE3.pzl.disabled | 21 +++++++++++++++++++++ forge-gui/res/puzzle/PS_ONE4.pzl | 22 ++++++++++++++++++++++ forge-gui/res/puzzle/PS_ONE5.pzl | 21 +++++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_MOM1.pzl create mode 100644 forge-gui/res/puzzle/PS_MOM2.pzl create mode 100644 forge-gui/res/puzzle/PS_ONE3.pzl.disabled create mode 100644 forge-gui/res/puzzle/PS_ONE4.pzl create mode 100644 forge-gui/res/puzzle/PS_ONE5.pzl diff --git a/forge-gui/res/puzzle/PS_MOM1.pzl b/forge-gui/res/puzzle/PS_MOM1.pzl new file mode 100644 index 00000000000..a6f40d11954 --- /dev/null +++ b/forge-gui/res/puzzle/PS_MOM1.pzl @@ -0,0 +1,21 @@ +[metadata] +Name:Possibility Storm - March of the Machines #01 +URL:https://twitter.com/mtgpuzzles/status/1648895487607554054/photo/1 +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. Assume that any cards you could access from your library are irrelevant to the solution. Remember that your solution must satisfy all opponent decisions (including both blocking and activated abilities.) +[state] +turn=1 +activeplayer=p0 +activephase=MAIN1 +p0life=20 +p0landsplayed=0 +p0landsplayedlastturn=0 +p0hand=Annihilating Glare;Boon-Bringer Valkyrie;Night Clubber +p0library=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt +p0battlefield=Drana and Linvala;Knight of Dusk's Shadow;Swamp;Swamp;Swamp;Shattered Sanctum;Shattered Sanctum +p1life=10 +p1landsplayed=0 +p1landsplayedlastturn=0 +p1battlefield=Cutthroat Centurion;Cutthroat Centurion;Mandible Justiciar diff --git a/forge-gui/res/puzzle/PS_MOM2.pzl b/forge-gui/res/puzzle/PS_MOM2.pzl new file mode 100644 index 00000000000..d9d6543c19d --- /dev/null +++ b/forge-gui/res/puzzle/PS_MOM2.pzl @@ -0,0 +1,20 @@ +[metadata] +Name:Possibility Storm - March of the Machines #02 +URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2023/04/latest-1-scaled.jpg?ssl=1 +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. Battles are a new card type that you cast, and is then defended by your opponent. You can attack it and deal it damage like planeswalkers. When defeated, its owner casts it transformed. Remember that your solution must satisfy all possible blocking decisions. +[state] +turn=1 +activeplayer=p0 +activephase=MAIN1 +p0life=20 +p0landsplayed=0 +p0landsplayedlastturn=0 +p0hand=Rampaging Raptor;Mountain;Into the Fire;Volcanic Spite +p0battlefield=Invasion of Karsus|Counters:DEFENSE=2;Invasion of Kaldheim|Counters:DEFENSE=2;Dwarven Forge-Chanter;Mountain;Mountain;Mountain;Mountain +p1life=8 +p1landsplayed=0 +p1landsplayedlastturn=0 +p1battlefield=Invasion of Xerex|Counters:DEFENSE=2;Swordsworn Cavalier;Swordsworn Cavalier diff --git a/forge-gui/res/puzzle/PS_ONE3.pzl.disabled b/forge-gui/res/puzzle/PS_ONE3.pzl.disabled new file mode 100644 index 00000000000..1706458ece9 --- /dev/null +++ b/forge-gui/res/puzzle/PS_ONE3.pzl.disabled @@ -0,0 +1,21 @@ +# TODO: adding a Meld card doesn't work because MeldedWith is not set correctly. +[metadata] +Name:Possibility Storm - Phyrexia: All Will Be One #03 +URL:https://i1.wp.com/www.possibilitystorm.com/wp-content/uploads/2023/02/latest-1-scaled.jpg?ssl=1 +Goal:Win +Turns:9999 +Difficulty:Mythic +Description:Start in your first main phase and before your opponent's next turn. Your opponent has no board, and you have no land! You have 20 cards remaining in your library. Assume any of them that you could draw are not relevant to the solution. +[state] +turn=1 +activeplayer=p0 +activephase=MAIN1 +p0life=20 +p0landsplayed=0 +p0landsplayedlastturn=0 +p0hand=Cement Shoes;Prophetic Prism +p0battlefield=Kaito, Dancing Shadow|Counters:LOYALTY=3;Tezzeret, Betrayer of Flesh|Counters:LOYALTY=2;The Mightstone and Weakstone;Urza, Planeswalker|Meld|Counters:LOYALTY=7|Id:1;Levitating Statue;Ichormoon Gauntlet +p0library=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt +p1life=21 +p1landsplayed=0 +p1landsplayedlastturn=0 diff --git a/forge-gui/res/puzzle/PS_ONE4.pzl b/forge-gui/res/puzzle/PS_ONE4.pzl new file mode 100644 index 00000000000..fe017d9786b --- /dev/null +++ b/forge-gui/res/puzzle/PS_ONE4.pzl @@ -0,0 +1,22 @@ +[metadata] +Name:Possibility Storm - Phyrexia: All Will Be One #04 +URL:https://i1.wp.com/www.possibilitystorm.com/wp-content/uploads/2023/03/latest-scaled.jpg?ssl=1 +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. Assume that any cards you could draw are irrelevant to the solution. +[state] +turn=1 +activeplayer=p0 +activephase=MAIN1 +p0life=5 +p0landsplayed=0 +p0landsplayedlastturn=0 +p0hand=Volt Charge;Furnace Skullbomb;Experimental Augury;Blazing Crescendo +p0library=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt +p0battlefield=Tekuthal, Inquiry Dominus;Ichor Synthesizer;Serum-Core Chimera|Counters:OIL=2;Cacophony Scamp;Urabrask's Forge|Counters:OIL=2;Island;Island;Mountain;Mountain;Mountain +p1life=16 +p1landsplayed=0 +p1landsplayedlastturn=0 +p1battlefield=Phyrexian Vindicator;Porcelain Zealot;Porcelain Zealot;Porcelain Zealot +p1counters=POISON=4 diff --git a/forge-gui/res/puzzle/PS_ONE5.pzl b/forge-gui/res/puzzle/PS_ONE5.pzl new file mode 100644 index 00000000000..78cd6fdceba --- /dev/null +++ b/forge-gui/res/puzzle/PS_ONE5.pzl @@ -0,0 +1,21 @@ +[metadata] +Name:Possibility Storm - All Will Be One #05 +URL:https://i0.wp.com/www.possibilitystorm.com/wp-content/uploads/2023/03/latest-1-scaled.jpg?ssl=1 +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. Assume that any cards that you could access from your library are irrelevant to the solution. Remember that your solution must satisfy all opponent decisions (including both blocking and activated abilities.) +[state] +turn=1 +activeplayer=p0 +activephase=MAIN1 +p0life=20 +p0landsplayed=0 +p0landsplayedlastturn=0 +p0hand=Annihilating Glare;Drown in Ichor;Charforger +p0library=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt +p0battlefield=Churning Reservoir;Cutthroat Centurion;Cutthroat Centurion;Furnace Strider|Counters:OIL=1;Swamp;Swamp;Mountain;Mountain;Mountain +p1life=8 +p1landsplayed=0 +p1landsplayedlastturn=0 +p1battlefield=Drana and Linvala;Benalish Sleeper;Necrosquito|Counters:OIL=3 From f4984495f416c4a8be1d2711811a437a68b06bda Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Mon, 8 May 2023 14:08:46 +0300 Subject: [PATCH 5/6] - Add support for MeldedWith in Game State. - Add proper support for PS_ONE3 (goal and all). --- forge-ai/src/main/java/forge/ai/GameState.java | 14 ++++++++++++++ .../puzzle/{PS_ONE3.pzl.disabled => PS_ONE3.pzl} | 7 +++---- forge-gui/res/puzzle/PS_ONE5.pzl | 2 +- .../main/java/forge/gamemodes/puzzle/Puzzle.java | 5 +++++ 4 files changed, 23 insertions(+), 5 deletions(-) rename forge-gui/res/puzzle/{PS_ONE3.pzl.disabled => PS_ONE3.pzl} (52%) diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 09e5e9c8dcf..0dce859f59b 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -303,6 +303,10 @@ public abstract class GameState { newText.append("|Flipped"); } else if (c.getCurrentStateName().equals(CardStateName.Meld)) { newText.append("|Meld"); + if (c.getMeldedWith() != null) { + newText.append("|MeldedWith:"); + newText.append(c.getMeldedWith().getName()); + } } else if (c.getCurrentStateName().equals(CardStateName.Modal)) { newText.append("|Modal"); } @@ -1245,6 +1249,16 @@ public abstract class GameState { c.setBackSide(true); } else if (info.startsWith("Flipped")) { c.setState(CardStateName.Flipped, true); + } else if (info.startsWith("MeldedWith")) { + String meldCardName = info.substring(info.indexOf(':') + 1).replace("^", ","); + Card meldTarget; + PaperCard pc = StaticData.instance().getCommonCards().getCard(meldCardName); + if (pc == null) { + System.err.println("ERROR: Tried to create a non-existent card named " + meldCardName + " (as a MeldedWith card) when loading game state!"); + continue; + } + meldTarget = Card.fromPaperCard(pc, c.getOwner()); + c.setMeldedWith(meldTarget); } else if (info.startsWith("Meld")) { c.setState(CardStateName.Meld, true); c.setBackSide(true); diff --git a/forge-gui/res/puzzle/PS_ONE3.pzl.disabled b/forge-gui/res/puzzle/PS_ONE3.pzl similarity index 52% rename from forge-gui/res/puzzle/PS_ONE3.pzl.disabled rename to forge-gui/res/puzzle/PS_ONE3.pzl index 1706458ece9..dcfbf886921 100644 --- a/forge-gui/res/puzzle/PS_ONE3.pzl.disabled +++ b/forge-gui/res/puzzle/PS_ONE3.pzl @@ -1,11 +1,10 @@ -# TODO: adding a Meld card doesn't work because MeldedWith is not set correctly. [metadata] Name:Possibility Storm - Phyrexia: All Will Be One #03 URL:https://i1.wp.com/www.possibilitystorm.com/wp-content/uploads/2023/02/latest-1-scaled.jpg?ssl=1 -Goal:Win +Goal:Win Before Opponent's Next Turn Turns:9999 Difficulty:Mythic -Description:Start in your first main phase and before your opponent's next turn. Your opponent has no board, and you have no land! You have 20 cards remaining in your library. Assume any of them that you could draw are not relevant to the solution. +Description:Start in your first main phase and win before your opponent's next turn. Your opponent has no board, and you have no land! You have 20 cards remaining in your library. Assume any of them that you could draw are not relevant to the solution. [state] turn=1 activeplayer=p0 @@ -14,7 +13,7 @@ p0life=20 p0landsplayed=0 p0landsplayedlastturn=0 p0hand=Cement Shoes;Prophetic Prism -p0battlefield=Kaito, Dancing Shadow|Counters:LOYALTY=3;Tezzeret, Betrayer of Flesh|Counters:LOYALTY=2;The Mightstone and Weakstone;Urza, Planeswalker|Meld|Counters:LOYALTY=7|Id:1;Levitating Statue;Ichormoon Gauntlet +p0battlefield=Kaito, Dancing Shadow|Counters:LOYALTY=3;Tezzeret, Betrayer of Flesh|Counters:LOYALTY=2;Urza, Planeswalker|Meld|MeldedWith:The Mightstone and Weakstone|Counters:LOYALTY=7|Id:1;Levitating Statue;Ichormoon Gauntlet p0library=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt p1life=21 p1landsplayed=0 diff --git a/forge-gui/res/puzzle/PS_ONE5.pzl b/forge-gui/res/puzzle/PS_ONE5.pzl index 78cd6fdceba..6560c4e3c70 100644 --- a/forge-gui/res/puzzle/PS_ONE5.pzl +++ b/forge-gui/res/puzzle/PS_ONE5.pzl @@ -1,5 +1,5 @@ [metadata] -Name:Possibility Storm - All Will Be One #05 +Name:Possibility Storm - Phyrexia: All Will Be One #05 URL:https://i0.wp.com/www.possibilitystorm.com/wp-content/uploads/2023/03/latest-1-scaled.jpg?ssl=1 Goal:Win Turns:1 diff --git a/forge-gui/src/main/java/forge/gamemodes/puzzle/Puzzle.java b/forge-gui/src/main/java/forge/gamemodes/puzzle/Puzzle.java index e27ecd33d98..3435a16252c 100644 --- a/forge-gui/src/main/java/forge/gamemodes/puzzle/Puzzle.java +++ b/forge-gui/src/main/java/forge/gamemodes/puzzle/Puzzle.java @@ -196,6 +196,11 @@ public class Puzzle extends GameState implements InventoryItem, Comparable Date: Mon, 8 May 2023 14:11:07 +0300 Subject: [PATCH 6/6] - Minor cleanup for PS_ONE3. --- forge-gui/res/puzzle/PS_ONE3.pzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/puzzle/PS_ONE3.pzl b/forge-gui/res/puzzle/PS_ONE3.pzl index dcfbf886921..b6ab6b43248 100644 --- a/forge-gui/res/puzzle/PS_ONE3.pzl +++ b/forge-gui/res/puzzle/PS_ONE3.pzl @@ -13,7 +13,7 @@ p0life=20 p0landsplayed=0 p0landsplayedlastturn=0 p0hand=Cement Shoes;Prophetic Prism -p0battlefield=Kaito, Dancing Shadow|Counters:LOYALTY=3;Tezzeret, Betrayer of Flesh|Counters:LOYALTY=2;Urza, Planeswalker|Meld|MeldedWith:The Mightstone and Weakstone|Counters:LOYALTY=7|Id:1;Levitating Statue;Ichormoon Gauntlet +p0battlefield=Kaito, Dancing Shadow|Counters:LOYALTY=3;Tezzeret, Betrayer of Flesh|Counters:LOYALTY=2;Urza, Planeswalker|Meld|MeldedWith:The Mightstone and Weakstone|Counters:LOYALTY=7;Levitating Statue;Ichormoon Gauntlet p0library=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt p1life=21 p1landsplayed=0