From 92010babf5825d94ff7a79f79cc7638a8d76230a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 5 Apr 2023 22:20:47 +0800 Subject: [PATCH 01/24] update TransitionScreen --- .../src/forge/screens/TransitionScreen.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/TransitionScreen.java b/forge-gui-mobile/src/forge/screens/TransitionScreen.java index 3d3b8ba18ea..ba139bec770 100644 --- a/forge-gui-mobile/src/forge/screens/TransitionScreen.java +++ b/forge-gui-mobile/src/forge/screens/TransitionScreen.java @@ -33,6 +33,7 @@ public class TransitionScreen extends FContainer { private String message = ""; boolean matchTransition, isloading, isIntro, isFadeMusic, isArenaScene; GlyphLayout layout; + BitmapFont font; public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading) { this(proc, screen, enterMatch, loading, false, false); } @@ -51,6 +52,14 @@ public class TransitionScreen extends FContainer { runnable = proc; textureRegion = screen; matchTransition = enterMatch; + if (matchTransition) { + float fontScale = GuiBase.isAndroid() ? 14f : 10f; + float screenW = Forge.isLandscapeMode() ? Forge.getScreenWidth() : Forge.getScreenHeight(); + float screenH = Forge.isLandscapeMode() ? Forge.getScreenHeight() : Forge.getScreenWidth(); + font = Controls.getBitmapFont("default", fontScale/(screenW/screenH)); + } else { + font = Controls.getBitmapFont("default"); + } isloading = loading; isIntro = intro; isFadeMusic = fadeMusic; @@ -83,6 +92,7 @@ public class TransitionScreen extends FContainer { } public void disableMatchTransition() { matchTransition = false; + Controls.getBitmapFont("default"); } private class BGAnimation extends ForgeAnimation { @@ -145,8 +155,7 @@ public class TransitionScreen extends FContainer { float centerY = screenH/2; TextureRegion enemyAvatar = Config.instance().getAtlas(enemyAtlasPath).createSprite("Avatar"); enemyAvatar.flip(true, false); - float fontScale = GuiBase.isAndroid() ? 14f : 10f; - BitmapFont font = Controls.getBitmapFont("default", fontScale/(screenW/screenH)); + if (textureRegion != null) { if (isArenaScene) g.drawImage(screenUIBackground, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight()); From 77e218e32ec75e94fd2eef2cd65a923a2239433e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 5 Apr 2023 22:29:01 +0800 Subject: [PATCH 02/24] use configdata for font height, width --- forge-gui-mobile/src/forge/screens/TransitionScreen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/TransitionScreen.java b/forge-gui-mobile/src/forge/screens/TransitionScreen.java index ba139bec770..fd3d0330561 100644 --- a/forge-gui-mobile/src/forge/screens/TransitionScreen.java +++ b/forge-gui-mobile/src/forge/screens/TransitionScreen.java @@ -54,8 +54,8 @@ public class TransitionScreen extends FContainer { matchTransition = enterMatch; if (matchTransition) { float fontScale = GuiBase.isAndroid() ? 14f : 10f; - float screenW = Forge.isLandscapeMode() ? Forge.getScreenWidth() : Forge.getScreenHeight(); - float screenH = Forge.isLandscapeMode() ? Forge.getScreenHeight() : Forge.getScreenWidth(); + float screenW = Forge.isLandscapeMode() ? Config.instance().getConfigData().screenWidth : Config.instance().getConfigData().screenHeight; + float screenH = Forge.isLandscapeMode() ? Config.instance().getConfigData().screenHeight : Config.instance().getConfigData().screenWidth; font = Controls.getBitmapFont("default", fontScale/(screenW/screenH)); } else { font = Controls.getBitmapFont("default"); From 6b393fe0de8550961d48531bb9c42d7fbc09bf71 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 5 Apr 2023 22:44:26 +0800 Subject: [PATCH 03/24] revert.. --- .../src/forge/screens/TransitionScreen.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/TransitionScreen.java b/forge-gui-mobile/src/forge/screens/TransitionScreen.java index fd3d0330561..3d3b8ba18ea 100644 --- a/forge-gui-mobile/src/forge/screens/TransitionScreen.java +++ b/forge-gui-mobile/src/forge/screens/TransitionScreen.java @@ -33,7 +33,6 @@ public class TransitionScreen extends FContainer { private String message = ""; boolean matchTransition, isloading, isIntro, isFadeMusic, isArenaScene; GlyphLayout layout; - BitmapFont font; public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading) { this(proc, screen, enterMatch, loading, false, false); } @@ -52,14 +51,6 @@ public class TransitionScreen extends FContainer { runnable = proc; textureRegion = screen; matchTransition = enterMatch; - if (matchTransition) { - float fontScale = GuiBase.isAndroid() ? 14f : 10f; - float screenW = Forge.isLandscapeMode() ? Config.instance().getConfigData().screenWidth : Config.instance().getConfigData().screenHeight; - float screenH = Forge.isLandscapeMode() ? Config.instance().getConfigData().screenHeight : Config.instance().getConfigData().screenWidth; - font = Controls.getBitmapFont("default", fontScale/(screenW/screenH)); - } else { - font = Controls.getBitmapFont("default"); - } isloading = loading; isIntro = intro; isFadeMusic = fadeMusic; @@ -92,7 +83,6 @@ public class TransitionScreen extends FContainer { } public void disableMatchTransition() { matchTransition = false; - Controls.getBitmapFont("default"); } private class BGAnimation extends ForgeAnimation { @@ -155,7 +145,8 @@ public class TransitionScreen extends FContainer { float centerY = screenH/2; TextureRegion enemyAvatar = Config.instance().getAtlas(enemyAtlasPath).createSprite("Avatar"); enemyAvatar.flip(true, false); - + float fontScale = GuiBase.isAndroid() ? 14f : 10f; + BitmapFont font = Controls.getBitmapFont("default", fontScale/(screenW/screenH)); if (textureRegion != null) { if (isArenaScene) g.drawImage(screenUIBackground, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight()); From 2adff270449cc4a0730fd47f20c99cd5f250f988 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Wed, 5 Apr 2023 23:51:40 +0200 Subject: [PATCH 04/24] Fix NPE (#2839) * Fix NPE * TapsForMana Fix --- .../game/ability/effects/ManaEffect.java | 2 +- .../ability/effects/ManaReflectedEffect.java | 2 +- .../java/forge/game/card/CardProperty.java | 24 +++++++++---------- .../res/cardsfolder/b/bridge_from_below.txt | 4 ++-- forge-gui/res/cardsfolder/g/genesis.txt | 2 +- .../res/cardsfolder/t/thunderblade_charge.txt | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 1a56a2150d8..26edbb27b5c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -245,7 +245,7 @@ public class ManaEffect extends SpellAbilityEffect { producedMana.append(abMana.produceMana(mana, p, sa)); } - abMana.tapsForMana(sa, producedMana.toString()); + abMana.tapsForMana(sa.getRootAbility(), producedMana.toString()); // Only clear express choice after mana has been produced abMana.clearExpressChoice(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java index 32911571321..349a94a8d7a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java @@ -33,7 +33,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect { producedMana.append(ma.produceMana(generated, player, sa)); } - ma.tapsForMana(sa, producedMana.toString()); + ma.tapsForMana(sa.getRootAbility(), producedMana.toString()); } // *************** Utility Functions ********************** diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 90073eb56a3..976e6df868b 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -989,6 +989,18 @@ public class CardProperty { if (card.getTurnInZone() <= sourceController.getLastTurnNr()) { return false; } + } else if (property.startsWith("ThisTurnEnteredFrom")) { + final String restrictions = property.split("ThisTurnEnteredFrom_")[1]; + final String[] res = restrictions.split("_"); + final ZoneType origin = ZoneType.smartValueOf(res[0]); + + if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { + return false; + } + + if (!card.getZone().isCardAddedThisTurn(card, origin)) { + return false; + } } else if (property.startsWith("ThisTurnEntered")) { // only check if it entered the Zone this turn if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { @@ -1012,18 +1024,6 @@ public class CardProperty { if (card.getTurnInZone() == game.getPhaseHandler().getTurn()) { return false; } - } else if (property.startsWith("ThisTurnEnteredFrom")) { - final String restrictions = property.split("ThisTurnEnteredFrom_")[1]; - final String[] res = restrictions.split("_"); - final ZoneType origin = ZoneType.smartValueOf(res[0]); - - if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { - return false; - } - - if (!card.getZone().isCardAddedThisTurn(card, origin)) { - return false; - } } else if (property.equals("DiscardedThisTurn")) { if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { return false; diff --git a/forge-gui/res/cardsfolder/b/bridge_from_below.txt b/forge-gui/res/cardsfolder/b/bridge_from_below.txt index d4a19932634..e93545c1907 100644 --- a/forge-gui/res/cardsfolder/b/bridge_from_below.txt +++ b/forge-gui/res/cardsfolder/b/bridge_from_below.txt @@ -2,9 +2,9 @@ Name:Bridge from Below ManaCost:B B B Types:Enchantment A:SP$ PermanentNoncreature | Cost$ B B B | AILogic$ DontCast -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigToken | TriggerZones$ Graveyard | TriggerDescription$ Whenever a nontoken creature is put into your graveyard from the battlefield, if CARDNAME is in your graveyard, create a 2/2 black Zombie creature token. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigToken | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | TriggerZones$ Graveyard | TriggerDescription$ Whenever a nontoken creature is put into your graveyard from the battlefield, if CARDNAME is in your graveyard, create a 2/2 black Zombie creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenOwner$ You -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Graveyard | ValidCard$ Creature.OppOwn | Execute$ TrigChange | TriggerDescription$ When a creature is put into an opponent's graveyard from the battlefield, if CARDNAME is in your graveyard, exile CARDNAME. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppOwn | Execute$ TrigChange | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | TriggerZones$ Graveyard | TriggerDescription$ When a creature is put into an opponent's graveyard from the battlefield, if CARDNAME is in your graveyard, exile CARDNAME. SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile AI:RemoveDeck:Random SVar:DiscardMe:5 diff --git a/forge-gui/res/cardsfolder/g/genesis.txt b/forge-gui/res/cardsfolder/g/genesis.txt index 39de00dce06..4c014a75e4f 100644 --- a/forge-gui/res/cardsfolder/g/genesis.txt +++ b/forge-gui/res/cardsfolder/g/genesis.txt @@ -2,7 +2,7 @@ Name:Genesis ManaCost:4 G Types:Creature Incarnation PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | PresentZone$ Graveyard | IsPresent$ Card.StrictlySelf | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. SVar:TrigChange:AB$ ChangeZone | Cost$ 2 G | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl SVar:DiscardMe:2 Oracle:At the beginning of your upkeep, if Genesis is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/t/thunderblade_charge.txt b/forge-gui/res/cardsfolder/t/thunderblade_charge.txt index 58f23394464..f308036f6de 100644 --- a/forge-gui/res/cardsfolder/t/thunderblade_charge.txt +++ b/forge-gui/res/cardsfolder/t/thunderblade_charge.txt @@ -2,6 +2,6 @@ Name:Thunderblade Charge ManaCost:1 R R Types:Sorcery A:SP$ DealDamage | Cost$ 1 R R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. -T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Creature.YouCtrl | TriggerZones$ Graveyard | ValidTarget$ Player | Execute$ TrigPlay | TriggerDescription$ Whenever one or more creatures you control deal combat damage to a player, if CARDNAME is in your graveyard, you may pay {2}{R}{R}{R}. If you do, you may cast it without paying its mana cost. -SVar:TrigPlay:AB$ Play | Cost$ 2 R R R | ActivationZone$ Graveyard | WithoutManaCost$ True | Optional$ True +T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | TriggerZones$ Graveyard | PresentZone$ Graveyard | IsPresent$ Card.StrictlySelf| Execute$ TrigPlay | TriggerDescription$ Whenever one or more creatures you control deal combat damage to a player, if CARDNAME is in your graveyard, you may pay {2}{R}{R}{R}. If you do, you may cast it without paying its mana cost. +SVar:TrigPlay:AB$ Play | Cost$ 2 R R R | WithoutManaCost$ True | Optional$ True Oracle:Thunderblade Charge deals 3 damage to any target.\nWhenever one or more creatures you control deal combat damage to a player, if Thunderblade Charge is in your graveyard, you may pay {2}{R}{R}{R}. If you do, you may cast it without paying its mana cost. From 03e335f42f7f363949cb62bc21267b1a1c25e67f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 6 Apr 2023 06:58:43 +0800 Subject: [PATCH 05/24] fix viewport update on resize --- forge-gui-mobile/src/forge/Forge.java | 9 ++++++--- forge-gui-mobile/src/forge/adventure/scene/Scene.java | 3 +++ forge-gui-mobile/src/forge/adventure/scene/UIScene.java | 6 +++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 79cda06a27e..4090e7cb3d8 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -164,6 +164,9 @@ public class Forge implements ApplicationListener { frameRate = new FrameRate(); animationBatch = new SpriteBatch(); inputProcessor = new MainInputProcessor(); + //screenWidth and screenHeight should be set initially and only change upon restarting the app + screenWidth = Gdx.app.getGraphics().getWidth(); + screenHeight = Gdx.app.getGraphics().getHeight(); Gdx.input.setInputProcessor(inputProcessor); /* @@ -958,15 +961,15 @@ public class Forge implements ApplicationListener { @Override public void resize(int width, int height) { try { - screenWidth = width; - screenHeight = height; if (currentScreen != null) { currentScreen.setSize(width, height); } else if (splashScreen != null) { splashScreen.setSize(width, height); } + if (currentScene != null) + currentScene.resize(width, height); } catch (Exception ex) { - graphics.end(); + //graphics.end(); //check if sentry is enabled, if not it will call the gui interface but here we end the graphics so we only send it via sentry.. if (BugReporter.isSentryEnabled()) BugReporter.reportException(ex); diff --git a/forge-gui-mobile/src/forge/adventure/scene/Scene.java b/forge-gui-mobile/src/forge/adventure/scene/Scene.java index 781ddb002ac..2e84eaf364d 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/Scene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/Scene.java @@ -93,6 +93,9 @@ public abstract class Scene implements Disposable { public void updateInput() { } + public void resize(int width, int height) { + + } } diff --git a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java index f353ef13ddf..887f18f9b6f 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java @@ -192,7 +192,6 @@ public class UIScene extends Scene { } public UIScene(String uiFilePath) { - uiFile = uiFilePath; stage = new Stage(new ScalingViewport(Scaling.stretch, getIntendedWidth(), getIntendedHeight())) { @Override @@ -711,4 +710,9 @@ public class UIScene extends Scene { super.updateInput(); Gdx.input.setInputProcessor(stage); } + + @Override + public void resize(int width, int height) { + stage.getViewport().update(width, height, true); + } } From 2ec0d769e571044746bc038dba27898a4d89877d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 6 Apr 2023 07:28:39 +0800 Subject: [PATCH 06/24] Update glissa_sunslayer.txt - closes #2837 --- forge-gui/res/cardsfolder/g/glissa_sunslayer.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/glissa_sunslayer.txt b/forge-gui/res/cardsfolder/g/glissa_sunslayer.txt index 96a92193828..d527a6a965a 100644 --- a/forge-gui/res/cardsfolder/g/glissa_sunslayer.txt +++ b/forge-gui/res/cardsfolder/g/glissa_sunslayer.txt @@ -9,5 +9,5 @@ SVar:TrigCharm:DB$ Charm | Choices$ DBDraw,DBDestroy,DBRemove SVar:DBDraw:DB$ Draw | SubAbility$ DBLoseLife | SpellDescription$ You draw a card and you lose 1 life. SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 SVar:DBDestroy:DB$ Destroy | ValidTgts$ Enchantment | SpellDescription$ Destroy target enchantment. -SVar:DBRemove:DB$ RemoveCounter | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | CounterType$ Any | CounterNum$ 3 | SpellDescription$ Remove up to three counters from target permanent. -Oracle:First strike, deathtouch\nWhenever Glissa Sunslayer deals combat damage to a player, choose one —\n• You draw a card and you lose 1 life.\n• Destroy target enchantment.\n• Remove up to three counters from target permanent. \ No newline at end of file +SVar:DBRemove:DB$ RemoveCounter | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | CounterType$ Any | CounterNum$ 3 | UpTo$ True | SpellDescription$ Remove up to three counters from target permanent. +Oracle:First strike, deathtouch\nWhenever Glissa Sunslayer deals combat damage to a player, choose one —\n• You draw a card and you lose 1 life.\n• Destroy target enchantment.\n• Remove up to three counters from target permanent. From 05814dca155e593bac3262429c5d8d5b99e566f7 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 6 Apr 2023 07:35:53 +0800 Subject: [PATCH 07/24] try to fix NPE --- .../src/forge/screens/match/views/VStack.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index f457faa80c4..071489f54f2 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -74,10 +74,13 @@ public class VStack extends FDropDown { final Set zones = new HashSet<>(); playersWithValidTargets = new HashMap<>(); - for (final CardView c : activeStackInstance.getTargetCards()) { - if (c.getZone() != null) { - zones.add(c.getZone()); - playersWithValidTargets.put(c.getController(), c); + FCollectionView targetCards = activeStackInstance.getTargetCards(); + if (targetCards != null) { + for (final CardView c : targetCards) { + if (c.getZone() != null) { + zones.add(c.getZone()); + playersWithValidTargets.put(c.getController(), c); + } } } if (zones.isEmpty() || playersWithValidTargets.isEmpty()) { return; } From 8ccc0d77e2609d56c9a9ee32e1ebc90ffab312b9 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 6 Apr 2023 08:24:13 +0800 Subject: [PATCH 08/24] Update RewardActor.java fix shop item icon position --- forge-gui-mobile/src/forge/adventure/util/RewardActor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index f93f3ac049c..b45178647b2 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -285,7 +285,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb Sprite item = reward.getItem().sprite(); setItemTooltips(item, backSprite); boolean isQuestItemLoot = RewardScene.Type.Loot.equals(type) && reward.getItem().questItem; - processSprite(backSprite, item, isQuestItemLoot ? Controls.newTextraLabel("[%]" + reward.getItem().name) : null, 0, -10); + processSprite(backSprite, item, isQuestItemLoot ? Controls.newTextraLabel("[%]" + reward.getItem().name) : null, 0, isQuestItemLoot ? -10 : 0); needsToBeDisposed = true; break; } From 50b9c18c115576b5ca61d778f05b9741c45f3af9 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 6 Apr 2023 07:41:15 +0200 Subject: [PATCH 09/24] Update phyrexian_censor.txt --- forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt b/forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt index c6f97556cf7..1364cbf89d9 100644 --- a/forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt +++ b/forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt @@ -1,6 +1,6 @@ Name:Phyrexian Censor ManaCost:2 W -Types:Phyrexian Wizard +Types:Creature Phyrexian Wizard PT:3/3 S:Mode$ CantBeCast | ValidCard$ Card.nonPhyrexian | Caster$ Player | NumLimitEachTurn$ 1 | Description$ Each player can't cast more than one non-Phyrexian spell each turn. R:Event$ Moved | ValidCard$ Creature.nonPhyrexian | Destination$ Battlefield | ReplaceWith$ ETBTapped | ReplacementResult$ Updated | ActiveZones$ Battlefield | Description$ Non-Phyrexian creatures enter the battlefield tapped. From f18e48f21f64e25020ccd3d664a9f06167b4b40b Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Thu, 6 Apr 2023 01:46:59 -0400 Subject: [PATCH 10/24] MOM: phyrexian_pegasus.txt referee_squad.txt seedpod_caretaker.txt (#2838) * phyrexian_pegasus.txt referee_squad.txt seedpod_caretaker.txt * aerial_guide.txt fix desc --- forge-gui/res/cardsfolder/a/aerial_guide.txt | 2 +- .../res/cardsfolder/upcoming/phyrexian_pegasus.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/referee_squad.txt | 11 +++++++++++ .../res/cardsfolder/upcoming/seedpod_caretaker.txt | 11 +++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/phyrexian_pegasus.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/referee_squad.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/seedpod_caretaker.txt diff --git a/forge-gui/res/cardsfolder/a/aerial_guide.txt b/forge-gui/res/cardsfolder/a/aerial_guide.txt index e8cc1996545..411899a8b39 100644 --- a/forge-gui/res/cardsfolder/a/aerial_guide.txt +++ b/forge-gui/res/cardsfolder/a/aerial_guide.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Drake PT:2/2 K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature you control gains flying until end of turn. +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature gains flying until end of turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other+attacking | TgtPrompt$ Select another target attacking creature | KW$ Flying Oracle:Flying\nWhenever Aerial Guide attacks, another target attacking creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/phyrexian_pegasus.txt b/forge-gui/res/cardsfolder/upcoming/phyrexian_pegasus.txt new file mode 100644 index 00000000000..c4251a94acd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phyrexian_pegasus.txt @@ -0,0 +1,9 @@ +Name:Phyrexian Pegasus +ManaCost:2 W +Types:Creature Phyrexian Pegasus +PT:2/2 +K:Flying +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target attacking creature without flying gains flying until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other+attacking+withoutFlying | TgtPrompt$ Select another target attacking creature without flying | KW$ Flying +SVar:HasAttackEffect:TRUE +Oracle:Flying\nWhenever Phyrexian Pegasus attacks, another target attacking creature without flying gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/referee_squad.txt b/forge-gui/res/cardsfolder/upcoming/referee_squad.txt new file mode 100644 index 00000000000..d3d742785a4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/referee_squad.txt @@ -0,0 +1,11 @@ +Name:Referee Squad +ManaCost:2 U +Types:Creature Homunculus +PT:2/2 +K:Convoke +K:Vigilance +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | SubAbility$ DBCounter +SVar:DBCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ Stun | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nVigilance\nWhen Referee Squad enters the battlefield, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) diff --git a/forge-gui/res/cardsfolder/upcoming/seedpod_caretaker.txt b/forge-gui/res/cardsfolder/upcoming/seedpod_caretaker.txt new file mode 100644 index 00000000000..f215dc76b94 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/seedpod_caretaker.txt @@ -0,0 +1,11 @@ +Name:Seedpod Caretaker +ManaCost:2 W +Types:Creature Phyrexian Cleric +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When CARDNAME enters the battlefield, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ P1P1,Transform +SVar:P1P1:DB$ PutCounter | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TgtPrompt$ Select target artifact or creature you control | CounterType$ P1P1 | SpellDescription$ Put a +1/+1 counter on target artifact or creature you control. +SVar:Transform:DB$ SetState | ValidTgts$ Incubator.token+YouCtrl | TgtPrompt$ Select target Incubator token you control | Mode$ Transform | SpellDescription$ Transform target Incubator token you control. +DeckHas:Ability$Counters +DeckHints:Ability$Token & Type$Artifact +Oracle:When Seedpod Caretaker enters the battlefield, choose one —\n• Put a +1/+1 counter on target artifact or creature you control.\n• Transform target Incubator token you control. From ce84ec9e4ef7a40b90caf891fb1aca570edb0de4 Mon Sep 17 00:00:00 2001 From: Simisays <67333662+Simisays@users.noreply.github.com> Date: Thu, 6 Apr 2023 13:57:25 +0200 Subject: [PATCH 11/24] update --- .../Shandalar/custom_cards/slobads_iron_boots.txt | 2 +- .../adventure/Shandalar/custom_cards/xira_boss_effect.txt | 8 ++++---- .../res/adventure/Shandalar/custom_cards/xiras_hive.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/slobads_iron_boots.txt b/forge-gui/res/adventure/Shandalar/custom_cards/slobads_iron_boots.txt index 4391be001eb..0122fb7f4e5 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/slobads_iron_boots.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/slobads_iron_boots.txt @@ -1,7 +1,7 @@ Name:Slobad's Iron Boots ManaCost:no cost Types:Artifact -S:Mode$ Continuous | Affected$ Creature.YouCtrl+Artifact | AddToughness$ 1 | EffectZone$ Command | Description$ Artifact Creatures you control get +1/+1 +S:Mode$ Continuous | Affected$ Creature.YouCtrl+Artifact | AddToughness$ 1 | AddPower$ 1 | EffectZone$ Command | Description$ Artifact Creatures you control get +1/+1 T:Mode$ ChangesZone | ValidCard$ Artifact.nonToken+YouCtrl | ActivationLimit$ 1 | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigToken | TriggerZones$ Command | TriggerDescription$ Whenever a nontoken artifact you control is put into a graveyard from the battlefield, create a colorless artifact token named Scrap. This ability triggers only once each turn. SVar:TrigToken:DB$ Token | TokenScript$ scrap A:AB$ Token | Cost$ 4 PayShards<2> Sac<3/Artifact> | ActivationLimit$ 1 | ActivationZone$ Command | TokenScript$ c_0_0_a_construct_total_artifacts | TokenOwner$ You | SubAbility$ DBExileSelf | SpellDescription$ Create a 0/0 colorless Construct artifact creature token with "This creature gets +1/+1 for each artifact you control."Exile Slobad's Iron Boots diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/xira_boss_effect.txt b/forge-gui/res/adventure/Shandalar/custom_cards/xira_boss_effect.txt index 50a25a59d82..3ed01a22a36 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/xira_boss_effect.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/xira_boss_effect.txt @@ -2,11 +2,11 @@ Name:Xira's Boss Effect ManaCost:no cost Colors:black,green,red Types:Enchantment -S:Mode$ Continuous | Affected$ Insect.YouCtrl | EffectZone$ Command | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double Team | Description$ Nontoken insects you control have +1/+1 and Double Team. +S:Mode$ Continuous | Affected$ Insect.YouCtrl | EffectZone$ Command | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double team | Description$ Nontoken insects you control have +1/+1 and Double Team. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ PutCounterAll | TriggerDescription$ At the beginning of your upkeep, put an egg counter on each nontoken creature. SVar:PutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.nonToken | CounterType$ EGG | CounterNum$ 1 -T:Mode$ ChangesZone | Origin$ Battlefield | TriggerZones$ Command | Destination$ Graveyard | ValidCard$ Creature.counters_GE1_EGG+OppCtrl | Execute$ TrigDraw | TriggerDescription$ Whenever a creature with an egg counter on it dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature. +T:Mode$ ChangesZone | Origin$ Battlefield | TriggerZones$ Command | Destination$ Graveyard | ValidCard$ Creature.counters_GE1_EGG | Execute$ TrigDraw | TriggerDescription$ Whenever a creature with an egg counter on it dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBToken -SVar:DBToken:DB$ Token | TokenScript$ b_1_1_insect_flying | TokenNum$ X +SVar:DBToken:DB$ Token | TokenScript$ b_1_1_insect_flying | TokenAmount$ X SVar:X:TriggeredCard$CardCounters.EGG -Oracle:Nontoken insects you control have +1/+1 and Double Team\nAt the beginning of your upkeep, put an egg counter on each creature.\nWhen a creature with an egg counter dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature. +Oracle:Nontoken insects you control have +1/+1 and Double Team\nAt the beginning of your upkeep, put an egg counter on each creature.\nWhen a creature with an egg counter dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/xiras_hive.txt b/forge-gui/res/adventure/Shandalar/custom_cards/xiras_hive.txt index f8ae5a8b47d..480e468905a 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/xiras_hive.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/xiras_hive.txt @@ -5,7 +5,7 @@ Types:Creature Insect PT:0/2 K:Defender K:Reach -S:Mode$ Continuous | Affected$ Insect.YouCtrl+nonToken | EffectZone$ Battlefield | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double Team | Description$ Nontoken Insects you control have +1/+1 and double team. +S:Mode$ Continuous | Affected$ Insect.YouCtrl+nonToken | EffectZone$ Battlefield | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double team | Description$ Nontoken Insects you control have +1/+1 and double team. T:Mode$ DamageDone | ActivationLimit$ 1 | ValidSource$ Card.OppCtrl,Emblem.OppCtrl | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ When a source an opponent controls deals damage to you for the first time each turn, put an egg counter on CARDNAME. SVar:TrigCounter:DB$ PutCounter | CounterType$ EGG | CounterNum$ 1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies, create X 1/1 black Insect tokens for each egg counter on CARDNAME. From 0041aa273c4bf31a596559c5356995520fd7dbd3 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 6 Apr 2023 20:35:18 +0800 Subject: [PATCH 12/24] Update your_temple_is_under_attack.txt --- forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt b/forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt index ebc8a8e1221..a0d2af955c8 100644 --- a/forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt +++ b/forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt @@ -3,5 +3,5 @@ ManaCost:2 W Types:Instant A:SP$ Charm | Choices$ DBPump,DBDraw SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SpellDescription$ Pray for Protection — Creatures you control gain indestructible until end of turn. -SVar:DBDraw:DB$ Draw | Defined$ TargetedAndYou | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SpellDescription$ Strike a Deal — You and target opponent each draw two cards. +SVar:DBDraw:DB$ Draw | NumCards$ 2 | Defined$ TargetedAndYou | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SpellDescription$ Strike a Deal — You and target opponent each draw two cards. Oracle:Choose one —\n• Pray for Protection — Creatures you control gain indestructible until end of turn.\n• Strike a Deal — You and target opponent each draw two cards. From 331a1df66ee052eff43850924141f18678c35163 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 6 Apr 2023 15:11:09 +0200 Subject: [PATCH 13/24] Update ezuris_predation.txt --- forge-gui/res/cardsfolder/e/ezuris_predation.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/e/ezuris_predation.txt b/forge-gui/res/cardsfolder/e/ezuris_predation.txt index b367c343962..7565fb1038f 100644 --- a/forge-gui/res/cardsfolder/e/ezuris_predation.txt +++ b/forge-gui/res/cardsfolder/e/ezuris_predation.txt @@ -1,10 +1,9 @@ Name:Ezuri's Predation ManaCost:5 G G G Types:Sorcery -A:SP$ RepeatEach | Cost$ 5 G G G | RepeatCards$ Creature.OppCtrl | UseImprinted$ True | RepeatSubAbility$ DBToken | ChangeZoneTable$ True | SubAbility$ DBCleanup2 | SpellDescription$ For each creature your opponents control, create a 4/4 green Phyrexian Beast creature token. Each of those Beasts fights a different one of those creatures. +A:SP$ RepeatEach | Cost$ 5 G G G | RepeatCards$ Creature.OppCtrl | ChooseOrder$ True | UseImprinted$ True | RepeatSubAbility$ DBToken | ChangeZoneTable$ True | SpellDescription$ For each creature your opponents control, create a 4/4 green Phyrexian Beast creature token. Each of those Beasts fights a different one of those creatures. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_4_4_phyrexian_beast | TokenOwner$ You | RememberTokens$ True | SubAbility$ DBFight SVar:DBFight:DB$ Fight | Defined$ Imprinted | ExtraDefined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:DBCleanup2:DB$ Cleanup | ClearImprinted$ True SVar:NeedsToPlay:Creature.OppCtrl+powerLE3 Oracle:For each creature your opponents control, create a 4/4 green Phyrexian Beast creature token. Each of those Beasts fights a different one of those creatures. From 8a280be77ffe767c823b4013f6ac6b1924888dfe Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 6 Apr 2023 19:08:35 +0200 Subject: [PATCH 14/24] Fix Gorex --- .../main/java/forge/game/CardTraitBase.java | 3 +-- .../src/main/java/forge/game/GameAction.java | 27 ++++++++++--------- .../game/ability/SpellAbilityEffect.java | 4 +-- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 761710e9781..38864c7cfa3 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -144,11 +144,10 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, public KeywordInterface getKeyword() { return this.keyword; } - public void setKeyword(final KeywordInterface kw) { this.keyword = kw; } - + /** *

* isSecondary. diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 88c35aff18d..9afed2cad46 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -478,12 +478,17 @@ public class GameAction { } } - // 400.7a Effects from static abilities that give a permanent spell on the stack an ability - // that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes. - if (zoneFrom.is(ZoneType.Stack) && toBattlefield && c.getCastSA() != null && !c.getCastSA().isIntrinsic() && c.getCastSA().getKeyword() != null) { - KeywordInterface ki = c.getCastSA().getKeyword(); - ki.setHostCard(copied); - copied.addChangedCardKeywordsInternal(ImmutableList.of(ki), null, false, copied.getTimestamp(), 0, true); + if (zoneFrom.is(ZoneType.Stack) && toBattlefield) { + // 400.7a Effects from static abilities that give a permanent spell on the stack an ability + // that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes. + if (c.getCastSA() != null && !c.getCastSA().isIntrinsic() && c.getCastSA().getKeyword() != null) { + KeywordInterface ki = c.getCastSA().getKeyword(); + ki.setHostCard(copied); + copied.addChangedCardKeywordsInternal(ImmutableList.of(ki), null, false, copied.getTimestamp(), 0, true); + } + + // 607.2q linked ability can find cards exiled as cost while it was a spell + copied.addExiledCards(c.getExiledCards()); } } @@ -580,12 +585,10 @@ public class GameAction { // 400.7g try adding keyword back into card if it doesn't already have it if (zoneTo.is(ZoneType.Stack) && cause != null && cause.isSpell() && !cause.isIntrinsic() && c.equals(cause.getHostCard())) { - if (cause.getKeyword() != null) { - if (!copied.getKeywords().contains(cause.getKeyword())) { - copied.addChangedCardKeywordsInternal(ImmutableList.of(cause.getKeyword()), null, false, game.getNextTimestamp(), 0, false); - // update Keyword Cache - copied.updateKeywords(); - } + if (cause.getKeyword() != null && !copied.getKeywords().contains(cause.getKeyword())) { + copied.addChangedCardKeywordsInternal(ImmutableList.of(cause.getKeyword()), null, false, game.getNextTimestamp(), 0, false); + // update Keyword Cache + copied.updateKeywords(); } } diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 354ed3b8835..dc80ac97a5c 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -911,8 +911,8 @@ public abstract class SpellAbilityEffect { if (cause.isReplacementAbility() && exilingSource.isLKI()) { exilingSource = exilingSource.getGame().getCardState(exilingSource); } - // only want this on permanents - if (exilingSource.isImmutable() || exilingSource.isInPlay()) { + // avoid storing this on "inactive" cards + if (exilingSource.isImmutable() || exilingSource.isInPlay() || exilingSource.isInZone(ZoneType.Stack)) { // make sure it gets updated exilingSource.removeExiledCard(movedCard); exilingSource.addExiledCard(movedCard); From f627603137ce4f714a173efed2bc331f54de198f Mon Sep 17 00:00:00 2001 From: paulsnoops Date: Thu, 6 Apr 2023 18:23:10 +0100 Subject: [PATCH 15/24] WIP: Edition updates: MOM, MOC, MAT, MUL, SLD --- .../March of the Machine Commander.txt | 386 ++++++++++++++++++ .../March of the Machine The Aftermath.txt | 1 + .../res/editions/March of the Machine.txt | 117 +++++- forge-gui/res/editions/Multiverse Legends.txt | 127 ++++++ .../res/editions/Secret Lair Drop Series.txt | 1 + 5 files changed, 631 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/March of the Machine Commander.txt b/forge-gui/res/editions/March of the Machine Commander.txt index 349cae30668..63c13cb0a55 100644 --- a/forge-gui/res/editions/March of the Machine Commander.txt +++ b/forge-gui/res/editions/March of the Machine Commander.txt @@ -11,23 +11,409 @@ ScryfallCode=MOC 3 M Gimbal, Gremlin Prodigy @Fajareka Setiawan 4 M Kasla, the Broken Halo @Martina Fackova 5 M Sidar Jabari of Zhalfir @Simon Dominic +6 M Elenda and Azor @Randy Vargas +7 M Moira and Teshar @Josh Hass +8 M Rashmi and Ragavan @Joshua Cairos +9 M Saint Traft and Rem Karolus @Lucas Graciano +10 M Shalai and Hallar @Mila Pesic +11 R Chivalric Alliance @Jim Pavelec +12 R Conjurer's Mantle @Fiona Hsieh +13 R Darksteel Splicer @Steven Belledin +14 R Excise the Imperfect @Denis Zhbankov +15 R Filigree Vector +16 R Guardian Scalelord @Victor Adame Minguez +17 R Nesting Dovehawk @Alessandra Pisano +18 R Path of the Ghosthunter @Eli Minaya +19 R Vulpine Harvester @Brent Hollowell +20 R Wand of the Worldsoul @Alessandra Pisano +21 R Deluxe Dragster @Gabor Szikszai +22 R Herald of Hoofbeats @Randy Vargas +23 R Path of the Enigma @Jeremy Wilson +24 R Schema Thief @Artur Treffner +25 R Blight Titan @Martin de Diego Sádaba +26 R Exsanguinator Cavalry @Quintin Gleim +27 R Locthwain Lancer @Lars Grant-West +28 R Path of the Schemer @Josu Hernaiz +29 R Dance with Calamity @Fajareka Setiawan +30 R Death-Greeter's Champion @Jason Rainville +31 R Hedron Detonator @Caroline Gariba +32 R Mirror-Style Master @Chris Rallis +33 R Pain Distributor @Olivier Bernard +34 R Path of the Pyromancer @Dominik Mayer +35 R Uncivil Unrest @Lorenzo Mastroianni +36 R Conclave Sledge-Captain @Ilse Gort +37 R Emergent Woodwurm @Mathias Kollros +38 R Path of the Animist @Liiga Smilshkalne +39 R Sandsteppe War Riders @Kekai Kotaki +40 R Cutthroat Negotiator @Lucas Graciano +41 R Flockchaser Phantom @Lorenzo Mastroianni +42 R Mistmeadow Vanisher @Iris Compiet +43 R Vodalian Wave-Knight @Olivier Bernard +44 R Wildfire Awakener @Andrew Mar +45 R Bitterthorn, Nissa's Animus @Titus Lunter +46 R Ichor Elixir @Warren Mahy 49 C Esper @Bruce Brenneise +55 C Ketria @Piotr Dura +57 C Megaflora Jungle +58 C Naktamun @Robin Olausson 61 C Nyx @Piotr Dura +63 C The Pit @Dave Kendall 67 C Towashi @Kamila Szutenberg +72 R Elspeth's Talent @Jeremy Wilson +73 R Firemane Commando @Andrew Mar +74 R Teferi's Talent @Dominik Mayer +75 M Infernal Sovereign @Chris Rallis +76 R Liliana's Talent @A. M. Sartor +77 R Rowan's Talent @Pauline Voss +78 R Vivien's Talent @Eli Minaya +79 M Begin the Invasion @Campbell White +80 R Elspeth's Talent @Jeremy Wilson +81 R Firemane Commando @Andrew Mar +82 R Teferi's Talent @Dominik Mayer +83 M Infernal Sovereign @Chris Rallis +84 R Liliana's Talent @A. M. Sartor +85 R Rowan's Talent @Pauline Voss +86 R Vivien's Talent @Eli Minaya +87 M Begin the Invasion @Campbell White 88 M Bright-Palm, Soul Awakener @Mila Pesic 89 M Brimaz, Blight of Oreskos @Uriah Voth +90 M Elenda and Azor @Randy Vargas 91 M Gimbal, Gremlin Prodigy @Fajareka Setiawan 92 M Kasla, the Broken Halo @Martina Fackova +93 M Moira and Teshar @Josh Hass +94 M Rashmi and Ragavan @Joshua Cairos +95 M Saint Traft and Rem Karolus @Lucas Graciano +96 M Shalai and Hallar @Mila Pesic 97 M Sidar Jabari of Zhalfir @Simon Dominic +98 R Chivalric Alliance @Jim Pavelec +99 R Conjurer's Mantle @Fiona Hsieh +100 R Darksteel Splicer @Steven Belledin +101 R Excise the Imperfect @Denis Zhbankov +102 R Filigree Vector +103 R Guardian Scalelord @Victor Adame Minguez +104 R Nesting Dovehawk @Alessandra Pisano +105 R Path of the Ghosthunter @Eli Minaya +106 R Vulpine Harvester @Brent Hollowell +107 R Wand of the Worldsoul @Alessandra Pisano +108 R Deluxe Dragster @Gabor Szikszai +109 R Herald of Hoofbeats @Randy Vargas +110 R Path of the Enigma @Jeremy Wilson +111 R Schema Thief @Artur Treffner +112 R Blight Titan @Martin de Diego Sádaba +113 R Exsanguinator Cavalry @Quintin Gleim +114 R Locthwain Lancer @Lars Grant-West +115 R Path of the Schemer @Josu Hernaiz +116 R Dance with Calamity @Fajareka Setiawan +117 R Death-Greeter's Champion @Jason Rainville +118 R Hedron Detonator @Caroline Gariba +119 R Mirror-Style Master @Chris Rallis +120 R Pain Distributor @Olivier Bernard +121 R Path of the Pyromancer @Dominik Mayer +122 R Uncivil Unrest @Lorenzo Mastroianni +123 R Conclave Sledge-Captain @Ilse Gort +124 R Emergent Woodwurm @Mathias Kollros +125 R Path of the Animist @Liiga Smilshkalne +126 R Sandsteppe War Riders @Kekai Kotaki +127 R Cutthroat Negotiator @Lucas Graciano +128 R Flockchaser Phantom @Lorenzo Mastroianni +129 R Mistmeadow Vanisher @Iris Compiet +130 R Vodalian Wave-Knight @Olivier Bernard +131 R Wildfire Awakener @Andrew Mar +132 R Bitterthorn, Nissa's Animus @Titus Lunter +133 R Ichor Elixir @Warren Mahy 134 M Bright-Palm, Soul Awakener @Mila Pesic 135 M Brimaz, Blight of Oreskos @Uriah Voth 136 M Gimbal, Gremlin Prodigy @Fajareka Setiawan 137 M Kasla, the Broken Halo @Martina Fackova 138 M Sidar Jabari of Zhalfir @Simon Dominic +139 C The Aether Flues @Jason A. Engle +141 C Chaotic Aether @Dan Scott +144 C The Great Forest @Howard Lyon 147 C Isle of Vesuva @Zoltan Boros & Gabor Szikszai 148 C Jund @Aleksi Briclot 153 C Panopticon @John Avon 158 C Spatial Merging @Gabor Szikszai +163 C Undercity Reaches @Stephan Martiniere +164 U Abzan Battle Priest @Chris Rahn +165 U Abzan Falconer @Steven Belledin +166 R Acclaimed Contender @David Gaillet +167 R Adeline, Resplendent Cathar @Bryan Sola +168 U Alharu, Solemn Ritualist @Chris Rallis +169 R Angel of Finality @Howard Lyon +170 R Angel of Salvation @D. Alexander Gregory +171 R Angel of the Ruins @Viko Menezes +172 R Austere Command @Anna Steinbauer +173 U Banisher Priest @Willian Murai +174 U Battle Screech @Anastasia Ovchinnikova +175 R Blade Splicer @Greg Staples +176 M Cataclysmic Gearhulk @Victor Adame Minguez +177 U Chant of Vitu-Ghazi @Stephen Tappin +178 U Conclave Tribunal @Seb McKinnon +179 U Constable of the Realm @Alexander Mokhov +180 U Devouring Light @Slawomir Maniak +181 U Elite Scaleguard @Steve Prescott +182 M Elspeth, Sun's Champion @Tyler Jacobson +183 R Emeria Angel @Jim Murray +184 C Ephemeral Shields @Yohann Schepacz +185 R Fell the Mighty @Raymond Swanland +186 U Flight of Equenauts @Zezhou Chen +187 U Generous Gift @Kev Walker +188 C Hero of Bladehold @Steven Belledin +189 R High Sentinels of Arashin @James Ryman +190 R Hour of Reckoning @Joseph Meehan +191 R Keeper of the Accord @Denman Rooke +192 R Knight Exemplar @Jason Chan +193 R Knight of the White Orchid @Mark Zug +194 U Master Splicer @Chippy +196 U Mentor of the Meek @Jana Schirmer & Johannes Voss +197 R Mikaeus, the Lunarch @Steven Belledin +198 U Path to Exile @Todd Lockwood +199 R Phyrexian Rebirth @Scott Chou +200 R Promise of Loyalty @Sara Winters +201 R Restoration Angel @Jake Murray +202 U Return to Dust @Wayne Reynolds +203 R Secure the Wastes @Scott Murphy +204 R Semester's End @Alayna Danner +205 U Seraph of the Masses @Zoltan Boros +206 U Shattered Angel @Kev Walker +207 R Silverwing Squadron @Johannes Voss +208 C Spirited Companion @Ilse Gort +209 R Sunscorch Regent @Matt Stewart +210 C Suture Priest @Igor Kieryluk +211 U Swords to Plowshares @Jesper Ejsing +212 R Together Forever @Aaron Miller +213 R Unbreakable Formation @Matt Stewart +214 R Valiant Knight @Jakub Kasper +215 R Venerated Loxodon @Zack Stella +216 C Village Bell-Ringer @David Palumbo +217 R Worthy Knight @Yongjae Choi +218 R Chasm Skulker @Jack Wang +219 C Cloud of Faeries @Iris Compiet +220 C Distant Melody +221 R Echo Storm @Mark Poole +222 M Ethersworn Adjudicator @Dan Scott +223 U Fallowsage @Paolo Parente +224 R Imprisoned in the Moon @Ryan Alexander Lee +225 U Junk Winder @Campbell White +226 R Master of Etherium @Matt Cavotta +227 R Masterful Replication @Victor Adame Minguez +228 R Nadir Kraken @Dan Scott +229 R Perplexing Test @Fariba Khamseh +230 R Pull from Tomorrow @Sara Winters +231 U Reality Shift @Howard Lyon +232 U Reverse Engineer @Chase Stone +233 R Rise and Shine @Franz Vohwinkel +234 R Saheeli's Artistry @Kieran Yanner +235 R Sharding Sphinx @Michael Bruinsma +236 R Shimmer Dragon @Lie Setiawan +237 R Spell Swindle @Victor Adame Minguez +238 R Stroke of Genius @Rovina Cai +239 U Syr Elenora, the Discerning @Mila Pesic +240 U Tetsuko Umezawa, Fugitive @Randy Vargas +241 R Thopter Spy Network @Jung Park +242 C Thoughtcast @Greg Hildebrandt +243 R Vedalken Humiliator @Jehan Choo +244 U Whirler Rogue @Winona Nelson +245 R Workshop Elders @Iain McCaig +246 U Ambition's Cost @Zezhou Chen +247 U Bone Shredder @Ron Spencer +248 C First-Sphere Gargantua @Randy Vargas +249 U Foulmire Knight @Alex Brock +250 U Go for the Throat @Kristina Carroll +251 U Graveshifter @Jakub Kasper +252 R Haakon, Stromgald Scourge @Mark Zug +253 R Josu Vess, Lich Knight @Tyler Jacobson +254 U Keskit, the Flesh Sculptor @Yongjae Choi +255 R Liliana's Standard Bearer @Josh Hass +256 M Massacre Wurm @Jason Chan +257 R Midnight Reaper @Sidharth Chaturvedi +258 R Murderous Rider @Josh Hass +259 C Night's Whisper @John Severin Brassell +260 M Noxious Gearhulk @Lius Lasahido +261 U Order of Midnight @Victor Adame Minguez +262 R Painful Truths @Winona Nelson +263 R Phyrexian Delver @Igor Kieryluk +264 C Phyrexian Ghoul @Pete Venters +265 C Phyrexian Rager @Brock Grossman +266 M Phyrexian Scriptures @Joseph Meehan +267 C Read the Bones @Lars Grant-West +268 C Smitten Swordmaster @Taylor Ingvarsson +269 U Syr Konrad, the Grim @Anna Steinbauer +270 U Victimize @Craig J Spearing +271 R Yawgmoth's Vile Offering @Chase Stone +272 R Brass's Bounty @Grzegorz Rutkowski +273 R Chaos Warp @Trevor Claxton +274 U Curse of Opulence @Kieran Yanner +275 R Everquill Phoenix @Lie Setiawan +276 U Falkenrath Exterminator @Winona Nelson +277 M Feldon of the Third Path @Chase Stone +278 R Fiery Confluence @Kieran Yanner +279 R Flamerush Rider @Min Yum +280 R Flameshadow Conjuring @Seb McKinnon +281 U Ghirapur Aether Grid @Cynthia Sheppard +282 C Goblin Instigator @Filip Burburan +283 C Goblin Medics @Caio Monteiro +284 R Hellkite Igniter @Jason Chan +285 C Impact Tremors @Lake Hurwitz +286 R Ion Storm @Michael Sutfin +287 R Krenko, Tin Street Kingpin @Viko Menezes +288 R Pia and Kiran Nalaar @Eric Deschamps +289 U Vampires' Vengeance @Chris Cold +290 R Aid from the Cowl @Viktor Titov +291 U Armorcraft Judge @David Palumbo +292 U Brawn @Matt Cavotta +293 R Champion of Lambholt @Christopher Moeller +294 C Crack Open @Yeong-Hao Han +295 C Cultivate @Anthony Palumbo +296 C Fertilid @Wayne Reynolds +297 R Forgotten Ancient @Mark Tedin +298 R Genesis Hydra @Donato Giancola +299 R Gilded Goose @Lindsey Look +300 R Gyre Sage @Tyler Jacobson +301 U Hindervines @Svetlin Velinov +302 R Incubation Druid @Daniel Ljunggren +303 R Inscription of Abundance @Zoltan Boros +304 U Inspiring Call @Dan Scott +305 M Kalonian Hydra @Chris Rahn +306 C Kodama's Reach @John Avon +307 R Managorger Hydra @Lucas Graciano +308 C Pridemalkin @Karl Kopinski +309 C Return to Nature @Mark Poole +310 R Rishkar, Peema Renegade @Todd Lockwood +311 C Root Out @Daniel Ljunggren +312 U Slurrk, All-Ingesting @Jehan Choo +313 U Tireless Provisioner @Josu Hernaiz +314 R Tireless Tracker @Eric Deschamps +315 U Weirding Wood @Jung Park +316 C Wood Elves @Josh Hass +317 U Arvad the Cursed @Lius Lasahido +318 R Aryel, Knight of Windgrace @Grzegorz Rutkowski +319 U Combine Chrysalis @Hector Ortiz +320 U Conclave Mentor @Raoul Vitale +321 U Corpse Knight @Karl Kopinski +322 U Despark @Slawomir Maniak +323 R Dromoka's Command @James Ryman +324 U Duergar Hedge-Mage @Dave Allsop +325 U Enduring Scalelord @Clint Cearley +326 U Good-Fortune Unicorn @Kee Lo +327 U Hamza, Guardian of Arashin @Wisnu Tan +328 R Heaven // Earth @Jonas De Ro +329 U Improbable Alliance @Zoltan Boros +330 U Juniper Order Ranger @Greg Hildebrandt +331 U Knight of the Last Breath @Milivoj Ćeran +332 U Knights of the Black Rose @Mark Zug +333 R Knights' Charge @Paul Scott Canavan +334 M Kykar, Wind's Fury @G-host Lee +335 M The Locust God @Lius Lasahido +336 U Migratory Route @Winona Nelson +337 U Mortify @Anthony Palumbo +338 U Saheeli, Sublime Artificer @Wesley Burt +339 U Struggle // Survive @Eric Deschamps +340 R Time Wipe @Svetlin Velinov +341 R Utter End @Mark Winters +342 M Vona, Butcher of Magan @Volkan Baǵa +343 U Wear // Tear @Ryan Pancoast +344 R Whirlwind of Thought @Bram Sels +345 U Wintermoor Commander @Tyler Jacobson +346 R Academy Manufactor @Campbell White +347 R Ancient Stone Idol @Josh Hass +348 C Arcane Signet @Dan Scott +349 R Bloodforged Battle-Axe @Alayna Danner +350 U Bloodline Pretender @Slawomir Maniak +351 U Burnished Hart @Yeong-Hao Han +352 C Commander's Sphere @Ryan Alexander Lee +353 R Coveted Jewel @Jason A. Engle +354 R Cultivator's Caravan @Mark Zug +355 R Duplicant @Thomas M. Baxa +356 U Fellwar Stone @John Avon +357 C Fractured Powerstone @Rob Alexander +358 C Gruul Signet @Efrem Palacios +359 U Hedron Archive @Craig J Spearing +360 U Herald's Horn @Jason Felix +361 R Inspiring Statuary @Kirsten Zirngibl +362 C Izzet Signet @Raoul Vitale +363 U Meteor Golem @Lake Hurwitz +364 U Mind Stone @Adam Rex +365 U Mindless Automaton @Chris Seaman +366 R Myr Battlesphere @Franz Vohwinkel +367 R Nettlecyst @Vincent Proce +368 C Orzhov Locket @Volkan Baǵa +369 C Orzhov Signet @Martina Pilcerova +370 M Phyrexian Triniform @Adam Paquette +371 R Psychosis Crawler @Stephan Martiniere +372 U Replicating Ring @Olena Richards +373 R Scrap Trawler @Daarken +374 R Sculpting Steel @Heather Hudson +375 R Scytheclaw @James Paick +376 U Shimmer Myr @Jana Schirmer & Johannes Voss +377 R Sigiled Sword of Valeron @John Stanko +378 C Simic Signet @Mike Sass +379 U Skullclamp @Luca Zontini +380 R Skyclave Relic @Daniel Ljunggren +381 U Sol Ring @Mike Bierek +382 M Soul of New Phyrexia @Daarken +383 R Spine of Ish Sah @Daniel Ljunggren +384 R Strionic Resonator @Sam White +385 U Talisman of Hierarchy @Lindsey Look +386 R Thopter Assembly @Svetlin Velinov +387 R Triskelion @Christopher Moeller +388 R Vanquisher's Banner @Milivoj Ćeran +389 C Wayfarer's Bauble @Tomas Duchek +390 U Arcane Sanctum @Anthony Francisco +391 C Bojuka Bog @Howard Lyon +392 U Bretagard Stronghold @Jung Park +393 R Canopy Vista @Adam Paquette +394 R Choked Estuary @Vincent Proce +395 R Cinder Glade @Adam Paquette +396 C Command Tower @Evan Shipard +397 C Evolving Wilds @Cliff Childs +398 R Exotic Orchard @Steven Belledin +399 R Fetid Heath @Daarken +400 U Field of Ruin @Chris Ostrowski +401 R Fortified Village @Cliff Childs +402 U Frontier Bivouac @Titus Lunter +403 R Frostboil Snarl @Sam Burley +404 R Furycalm Snarl @Sam Burley +405 R Game Trail @Adam Paquette +406 R Gavony Township @Julian Kok Joon Wen +407 C Goldmire Bridge @Aaron Miller +408 U Jungle Shrine @Wayne Reynolds +409 R Karn's Bastion @Adam Paquette +410 R Kessig Wolf Run @Eytan Zana +411 R Kher Keep @Paolo Parente +412 U Krosan Verge @Ruxing Gao +413 U Llanowar Reborn @Philip Straub +414 R Mossfire Valley @Yeong-Hao Han +415 R Mosswort Bridge @Jeremy Jarvis +416 U Myriad Landscape @Jonas De Ro +417 U Mystic Monastery @Florian de Gesincourt +418 C Path of Ancestry @Alayna Danner +419 R Port Town @Kamila Szutenberg +420 R Prairie Stream @Adam Paquette +421 U Rogue's Passage @Christine Choi +422 R Shineshadow Snarl @Sam Burley +423 C Silverquill Campus @Titus Lunter +424 U Simic Growth Chamber @John Avon +425 R Skycloud Expanse @Sam Burley +426 R Spire of Industry @John Avon +427 R Sungrass Prairie @Ron Spencer +428 R Sunken Hollow @Adam Paquette +429 U Tainted Field @Don Hazeltine +430 R Temple of Abandon @Adam Paquette +431 R Temple of Deceit @Jonas De Ro +432 R Temple of Enlightenment @Piotr Dura +433 R Temple of Epiphany @Adam Paquette +434 R Temple of Mystery @Piotr Dura +435 R Temple of Plenty @Chris Ostrowski +436 R Temple of Silence @Adam Paquette +437 R Temple of the False God @Brian Snõddy +438 R Temple of Triumph @Piotr Dura +439 C Terramorphic Expanse @Dan Scott +440 C Thriving Heath @Alayna Danner +441 C Thriving Isle @Jonas De Ro +442 C Thriving Moor @Titus Lunter +443 R Vault of the Archangel @John Avon +444 R Vineglimmer Snarl @Sam Burley 445 M Goro-Goro and Satoru @Johannes Voss 446 M Katilda and Lier @Justyna Dura 447 M Slimefoot and Squee @Victor Adame Minguez diff --git a/forge-gui/res/editions/March of the Machine The Aftermath.txt b/forge-gui/res/editions/March of the Machine The Aftermath.txt index c837fe9f989..b68a33ebaf9 100644 --- a/forge-gui/res/editions/March of the Machine The Aftermath.txt +++ b/forge-gui/res/editions/March of the Machine The Aftermath.txt @@ -7,3 +7,4 @@ ScryfallCode=MAT [cards] 34 R The Kenriths' Royal Funeral @Manuel Castañón +230 Jolrael, Voice of Zhalfir @Ernanda Souza diff --git a/forge-gui/res/editions/March of the Machine.txt b/forge-gui/res/editions/March of the Machine.txt index 0f3b05a55d2..9bbbea0752e 100644 --- a/forge-gui/res/editions/March of the Machine.txt +++ b/forge-gui/res/editions/March of the Machine.txt @@ -7,120 +7,221 @@ ScryfallCode=MOM [cards] 1 M Invasion of Ravnica @Leon Tukker +2 C Aerial Boost @Artur Nakhodkin +3 C Alabaster Host Intercessor @Konstantin Porubov 4 C Alabaster Host Sanctifier @Konstantin Porubov +5 C Angelic Intervention @Awanqi (Angela Wang) 6 M Archangel Elspeth @Cynthia Sheppard +7 C Attentive Skywarden @Jodie Muir +8 C Bola Slinger @Hendry Iwanaga 9 R Boon-Bringer Valkyrie @Heonhwa Choe +10 C Cut Short @Tran Nguyen 11 R Dusk Legion Duelist @Ryan Valle 12 M Elesh Norn @Magali Villeneuve 13 U Elspeth's Smite @Livia Prima +14 C Enduring Bondwarden @Kim Sokol +15 C Golden-Scale Aeronaut @Javier Charro 16 R Guardian of Ghirapur @Cynthia Sheppard 17 R Heliod, the Radiant Dawn @Victor Adame Minguez +18 C Infected Defector @Nino Vecia +19 C Inspired Charge @Vladimir Krisetskiy 20 U Invasion of Belenon @Antonio José Manzanedo 21 U Invasion of Dominaria @Denys Tsiperko 22 R Invasion of Gobakhan @Andreas Zafiratos 23 R Invasion of Theros @Johan Grenier +24 C Kithkin Billyrider @Zara Alfonso +25 C Knight of the New Coalition @Jake Murray 26 R Knight-Errant of Eos @Kevin Sidharta +27 C Kor Halberd @Bastien L. Deharme 28 M Monastery Mentor @Brian Valeza 29 U Norn's Inquisitor @Denis Zhbankov 30 U Phyrexian Awakening @Artur Nakhodkin 31 U Phyrexian Censor @Alexey Kruglov +32 R Progenitor Exarch @Marie Magny +33 C Realmbreaker's Grasp @Artur Nakhodkin +34 C Scrollshift @Bram Sels 35 U Seal from Existence @Anato Finnstark 36 U Seraph of New Capenna @Aaron J. Riley +37 C Sigiled Sentinel @Volkan Baǵa 38 U Sun-Blessed Guardian @Brian Valeza +39 C Sunder the Gateway @Titus Lunter 40 R Sunfall @Kasia 'Kafis' Zielińska 41 U Surge of Salvation @Dominik Mayer +42 C Swordsworn Cavalier @Stella Spente +43 C Tarkir Duneshaper @Denys Tsiperko 44 U Tiller of Flesh @Nino Vecia 45 U Zhalfirin Lancer @Nino Vecia 46 U Artistic Refusal @Olivier Bernard +47 C Assimilate Essence @Konstantin Porubov 48 U Astral Wingspan @Joseph Weston 49 U Captive Weird @Manuel Castañón 50 U Change the Equation @Alix Branwyn 51 R Chrome Host Seedshark @Donato Giancola 52 R Complete the Circuit @Eelis Kyttanen 53 U Corruption of Towashi @Artur Nakhodkin +54 C Disturbing Conversion @Anna Mitura-Laskowska +55 C Ephara's Dispersal @Awanqi (Angela Wang) +56 C Expedition Lookout @Johan Grenier +57 C Eyes of Gitaxias @Cristi Balanescu 58 R Faerie Mastermind @Joshua Raphael +59 C Furtive Analyst @Marcela Bolívar +60 C Halo-Charged Skaab @Igor Kieryluk 61 R Invasion of Arcavios @Dmitry Burmak 62 U Invasion of Kamigawa @Kekai Kotaki 63 R Invasion of Segovia @Edgar Sánchez Hidalgo 64 U Invasion of Vryn @Leon Tukker 65 M Jin-Gitaxias @Ekaterina Burmak +66 C Meeting of Minds @Milivoj Ćeran 67 C Moment of Truth @Rovina Cai 68 C Negate @Viko Menezes +69 C Oculus Whelp @Donato Giancola 70 U Omen Hawker @Josh Hass 71 U Oracle of Tragedy @Pavel Kolomeyets +72 C Order of the Mirror @Andrew Mar +73 C Preening Champion @Alix Branwyn +74 C Protocol Knight @Volkan Baǵa 75 R Rona, Herald of Invasion @Victor Adame Minguez +76 C Saiba Cryptomancer @Aaron J. Riley 77 R See Double @Marc Simonetti 78 U Skyclave Aerialist @Michal Ivan +79 C Stasis Field @Jinho Bae +80 C Temporal Cleansing @Dominik Mayer +81 C Thunderhead Squadron @PINDURSKI +82 C Tidal Terror @Nicholas Gregory 83 R Transcendent Message @Liiga Smilshkalne +84 U Wicked Slumber @Anato Finnstark 85 U Xerex Strobe-Knight @Pavel Kolomeyets 86 R Zephyr Singer @Lie Setiawan +87 C Zhalfirin Shapecraft @Aldo Domínguez +88 C Aetherblade Agent @Alexander Mokhov 89 R Archpriest of Shadows @Fariba Khamseh 90 R Ayara, Widow of the Realm @Anna Podedworna +91 C Bladed Battle-Fan @Colin Boyer 92 U Blightreaper Thallid @Marta Nael 93 R Bloated Processor @Brock Grossman 94 R Breach the Multiverse @Liiga Smilshkalne 95 U Collective Nightmare @Rovina Cai +96 U Compleated Huntmaster @Alex Brock +97 C Consuming Aetherborn @Aldo Domínguez +98 C Corrupted Conviction @Joseph Weston 99 C Deadly Derision @Gaboleps +100 C Dreg Recycler @Campbell White +101 C Etched Familiar @Colin Boyer +102 C Etched Host Doombringer @Helge C. Balzer +103 C Failed Conversion @Jodie Muir +104 C Final Flourish @Raluca Marinescu +105 C Flitting Guerilla @Francisco Miyara 106 U Gift of Compleation @Artur Nakhodkin 107 U Glistening Deluge @Anastasia Balakchina +108 C Gloomfang Mauler @Denis Zhbankov 109 R Grafted Butcher @Zack Stella 110 R Hoarding Broodlord @Filip Burburan +111 C Ichor Drinker @Aurore Folny +112 C Ichor Shade @Nicholas Gregory 113 U Invasion of Eldraine @Cristi Balanescu 114 R Invasion of Fiora @Joshua Raphael 115 M Invasion of Innistrad @Alexey Kruglov 116 U Invasion of Ulgrotha @Viko Menezes 117 U Merciless Repurposing @Artur Nakhodkin 118 C Mirrodin Avenged @Scott Murphy +119 U Nezumi Freewheeler @Artur Nakhodkin +120 C Nezumi Informant @Steve Prescott 121 U Phyrexian Gargantua @Kevin Sidharta 122 R Pile On @Javier Charro 123 U Render Inert @Yigit Koroglu +124 U Scorn-Blade Berserker @Tuan Duong Chu 125 M Sheoldred @Ryan Pancoast +126 C Tenured Oilcaster @Francisco Miyara 127 C Traumatic Revelation @Cristi Balanescu +128 C Unseal the Necropolis @Isis +129 C Vanquish the Weak @Gaboleps +130 C Akki Scrapchomper @Wisnu Tan 131 C Beamtown Beatstick @Konstantin Porubov 132 R Bloodfeather Phoenix @Rudy Siswanto +133 C Burning Sun's Fury @Slawomir Maniak 134 M Chandra, Hope's Beacon @Kieran Yanner 135 R City on Fire @Jake Murray +136 C Coming In Hot @Cristi Balanescu 137 R Etali, Primal Conqueror @Ryan Pancoast 138 U Fearless Skald @Slawomir Maniak 139 U Furnace Gremlin @Tuan Duong Chu +140 C Furnace Host Charger @Andreas Zafiratos 141 U Furnace Reins @Brian Valeza +142 C Hangar Scrounger @Borja Pindado 143 U Harried Artisan @Caio Monteiro 144 R Into the Fire @Grzegorz Rutkowski 145 R Invasion of Kaldheim @Bryan Sola 146 R Invasion of Karsus @Zoltan Boros 147 U Invasion of Mercadia @Cristi Balanescu 148 U Invasion of Regatha @Daarken -149 M Invasion of Tarkir @Darren Tan +149 M Invasion of Tarkir @Darren Tan +150 C Karsus Depthguard @Tyler Jacobson 151 U Khenra Spellspear @Artur Nakhodkin 152 U Lithomantic Barrage @Viko Menezes +153 C Marauding Dreadship @Tiffany Turrill +154 C Mirran Banesplitter @Chris Seaman +155 R Nahiri's Warcrafting @Zara Alfonso +156 C Onakke Javelineer @Joseph Weston +157 C Pyretic Prankster @Francis Tneh +158 C Ral's Reinforcements @Nils Hamm 159 U Ramosian Greatsword @Jason A. Engle 160 R Rampaging Raptor @Denys Tsiperko +161 C Redcap Heelslasher @Alexey Kruglov 162 U Scrappy Bruiser @David Auden Nash +163 C Searing Barb @Tiffany Turrill +164 C Shatter the Source @Artur Nakhodkin 165 U Shivan Branch-Burner @Aaron Miller 166 U Stoke the Flames @Liiga Smilshkalne +167 C Thrashing Frontliner @Pavel Kolomeyets +168 C Trailblazing Historian @Jason A. Engle 169 M Urabrask @Campbell White +170 C Volcanic Spite @Kevin Sidharta 171 R Voldaren Thrillseeker @Viko Menezes +172 C War-Trained Slasher @Francis Tneh +173 C Wrenn's Resolve 174 R Ancient Imperiosaur @Piotr Foksowicz +175 C Arachnoid Adaptation @Isis +176 C Atraxa's Fall @Xavier Ribeiro +177 C Blighted Burgeoning @Piotr Foksowicz +178 C Bonded Herdbeast @Jokubas Uogintas +179 C Chomping Kavu @John Tedrick +180 C Converter Beast @Uriah Voth 181 U Copper Host Crusher @Nicholas Gregory +182 C Cosmic Hunger @Konstantin Porubov +183 C Crystal Carapace @Sam Burley 184 R Deeproot Wayfinder @Anna Pavleeva 185 R Doomskar Warrior @Chris Rallis +186 C Fertilid's Favor @Kevin Sidharta 187 R Glistening Dawn @Chris Ostrowski 188 U Gnottvold Hermit @Artur Nakhodkin +189 U Herbology Instructor @Sergey Glushakov 190 R Invasion of Ikoria @Antonio José Manzanedo 191 R Invasion of Ixalan @Viktor Titov 192 U Invasion of Muraganda @Adam Paquette 193 M Invasion of Shandalar @Adam Paquette 194 U Invasion of Zendikar @Diego Gisbert +195 C Iridescent Blademaster @Livia Prima 196 U Kami of Whispered Hopes @Filipe Pagliuso +197 C Overgrown Pest @Eelis Kyttanen 198 R Ozolith, the Shattered Spire @Daarken +199 C Placid Rottentail @Filip Burburan 200 R Polukranos Reborn @David Auden Nash +201 C Portent Tracker @Caroline Gariba 202 U Ravenous Sailback @Andrew Mar 203 U Sandstalker Moloch @Donato Giancola +204 C Seed of Hope @Gaboleps +205 C Serpent-Blade Assailant @Durion 206 U Storm the Seedcore @Jason Rainville 207 U Streetwise Negotiator @Brent Hollowell 208 U Tandem Takedown @Yigit Koroglu +209 U Tangled Skyline @Martin de Diego Sádaba +210 C Timberland Ancient @Pavel Kolomeyets 211 R Tribute to the World Tree @Kristina Carroll +212 C Vengeant Earth @Jonas De Ro 213 M Vorinclex @Daarken +214 C War Historian @Ryan Valle +215 C Wary Thespian @Billy Christian +216 C Wildwood Escort @Taras Susak 217 M Wrenn and Realmbreaker @Cristi Balanescu 218 R Baral and Kari Zev @Fariba Khamseh 219 M Borborygmos and Fblthp @Rudy Siswanto @@ -150,6 +251,7 @@ ScryfallCode=MOM 243 U Joyful Stormsculptor @Christina Kraus 244 R Kogla and Yidaro @Chris Rahn 245 M Kroxa and Kunoros @Ignatius Budi +246 U Marshal of Zhalfir @Darren Tan 247 U Mirror-Shield Hoplite @Alex Brock 248 U Mutagen Connoisseur @Alex Brock 249 R Omnath, Locus of All @Bryan Sola @@ -157,12 +259,19 @@ ScryfallCode=MOM 251 U Rampaging Geoderm @Randy Vargas 252 R Rankle and Torbran @Viko Menezes 253 U Sculpted Perfection @Chris Seaman +254 U Stormclaw Rager @Nicholas Elias 255 M Thalia and The Gitrog Monster @Howard Lyon 256 R Yargle and Multani @Slawomir Maniak 257 M Zimone and Dina @Lie Setiawan 258 M Zurgo and Ojutai @Daarken +259 C Flywheel Racer @Joshua Cairos +260 C Halo Hopper @Daniel Ljunggren +261 C Kitesail @Ben Hill +262 C Phyrexian Archivist @Daniel Romanovsky 263 R Realmbreaker, the Invasion Tree @Kekai Kotaki +264 C Skittering Surveyor @Igor Kieryluk 265 M Sword of Once and Future @Joshua Cairos +266 C Urn of Godfire @Ovidio Cartagena 267 C Bloodfell Caves @Jorge Jacinto 268 C Blossoming Sands @Robin Olausson 269 C Dismal Backwater @Chris Ostrowski @@ -191,8 +300,11 @@ ScryfallCode=MOM 292 M Elesh Norn @Kekai Kotaki 293 R Heliod, the Radiant Dawn @Jason A. Engle 294 M Jin-Gitaxias @Dominik Mayer +295 R Rona, Herald of Invasion @Daniel Lieske 296 R Ayara, Widow of the Realm @Josu Hernaiz +297 M Sheoldred @Dominik Mayer 298 R Etali, Primal Conqueror @Yeong-Hao Han +299 M Urabrask @Kekai Kotaki 300 R Polukranos Reborn @Jason A. Engle 301 M Vorinclex @Flavio Girón 302 R Baral and Kari Zev @Magali Villeneuve @@ -237,6 +349,7 @@ ScryfallCode=MOM 345 R Guardian of Ghirapur @Cynthia Sheppard 346 R Knight-Errant of Eos @Kevin Sidharta 347 M Monastery Mentor @Brian Valeza +348 R Progenitor Exarch @Marie Magny 349 R Sunfall @Kasia 'Kafis' Zielińska 350 R Chrome Host Seedshark @Donato Giancola 351 R Complete the Circuit @Eelis Kyttanen @@ -250,8 +363,10 @@ ScryfallCode=MOM 359 R Grafted Butcher @Zack Stella 360 R Hoarding Broodlord @Filip Burburan 361 R Pile On @Javier Charro +362 R Bloodfeather Phoenix @Rudy Siswanto 363 R City on Fire @Jake Murray 364 R Into the Fire @Grzegorz Rutkowski +365 R Nahiri's Warcrafting @Zara Alfonso 366 R Rampaging Raptor @Denys Tsiperko 367 R Voldaren Thrillseeker @Viko Menezes 368 R Ancient Imperiosaur @Piotr Foksowicz diff --git a/forge-gui/res/editions/Multiverse Legends.txt b/forge-gui/res/editions/Multiverse Legends.txt index 6b455f6ca21..144dbeedaf6 100644 --- a/forge-gui/res/editions/Multiverse Legends.txt +++ b/forge-gui/res/editions/Multiverse Legends.txt @@ -6,28 +6,74 @@ Type=Collector_Edition ScryfallCode=MUL [cards] +2 U Daxos, Blessed by the Sun @Jason A. Engle 3 M Elesh Norn, Grand Cenobite @Flavio Girón +4 M Kenrith, the Returned King @Aaron Miller +5 U Kwende, Pride of Femeref +6 R Sram, Senior Edificer @Adam Paquette 7 R Thalia, Guardian of Thraben @Joshua Alvarado +8 R Baral, Chief of Compliance @Yeong-Hao Han 9 R Emry, Lurker of the Loch @Wylie Beckert 10 U Inga Rune-Eyes @rishxxv 11 M Jin-Gitaxias, Core Augur @Kekai Kotaki +12 U Tetsuko Umezawa, Fugitive @Serena Malyon +13 R Ayara, First of Locthwain @Omar Rayyan 14 R Horobi, Death's Wail @Rorubei +15 R Seizan, Perverter of Truth @Maji 16 M Sheoldred, Whispering One @Flavio Girón 17 M Skithiryx, the Blight Dragon @Kekai Kotaki +18 U Tymaret, Chosen from Death @Jason A. Engle 19 U Yargle, Glutton of Urborg @Serena Malyon 20 R Captain Lannery Storm @Jody Clark 21 M Ragavan, Nimble Pilferer @Magali Villeneuve +22 R Squee, the Immortal @Eshpur 23 M Urabrask the Hidden @Flavio Girón +24 U Valduk, Keeper of the Flame @Tyler Crook 25 U Zada, Hedron Grinder @Dominik Mayer +26 U Fynn, the Fangbearer @GodMachine +27 R Goreclaw, Terror of Qal Sisma @Domenico Cava +28 U Renata, Called to the Hunt @Jason A. Engle 29 M Vorinclex, Voice of Hunger @JungShan 30 R Yedora, Grave Gardener @Matthew G. Lewis +31 U Aegar, the Freezing Flame @Richard Luong +32 R Arixmethes, Slumbering Isle @Jason A. Engle 33 M Atraxa, Praetors' Voice @Justin Hernandez & Alexis Hernandez +34 R Atris, Oracle of Half-Truths @Jason A. Engle +35 M Aurelia, the Warleader @Alex Dos Diaz +36 R Brudiclad, Telchor Engineer @JungShan +37 U Dina, Soul Steeper @Benjamin Ee +38 M Ezuri, Claw of Progress @JungShan +39 R Firesong and Sunspeaker @Daniel Lieske +40 U Firja, Judge of Valor @WolfSkullJack +41 M Grimgrin, Corpse-Born @Cabrol +42 R Gyruda, Doom of Depths @Steve Ellis 43 U Imoti, Celebrant of Bounty @Bastien L. Deharme 44 R Jegantha, the Wellspring @Steve Ellis +45 R Judith, the Scourge Diva @Benjamin Ee +46 U Juri, Master of the Revue @Julie Dillon +47 R Kaheera, the Orphanguard @Denis Medri +48 R Keruga, the Macrosage @Denis Medri 49 M Kroxa, Titan of Death's Hunger @Jason A. Engle +50 R Lathiel, the Bounteous Dawn @Shawn Wood +51 R Lurrus of the Dream-Den @Steve Ellis +52 R Lutri, the Spellchaser @Justine Mara Andersen 53 M Niv-Mizzet Reborn @Illustranesia +54 R Obosh, the Preypiercer @Denis Medri +55 U Radha, Coalition Warlord @Justin Hernandez & Alexis Hernandez +56 U Raff, Weatherlight Stalwart @Nino Vecia +57 U Reyav, Master Smith @Warren Mahy +58 U Rona, Sheoldred's Faithful @Serena Malyon +59 U Shanna, Sisay's Legacy @Rhonda Libbey 60 R Taigam, Ojutai Master @Domenico Cava +61 R Teysa Karlov @Barbara Rosiak +62 R Umori, the Collector @Daniel Warren Johnson +63 M Yarok, the Desecrated +64 R Yorion, Sky Nomad @Justine Mara Andersen +65 R Zirda, the Dawnwaker @Justine Mara Andersen 68 M Elesh Norn, Grand Cenobite @Igor Kieryluk +69 M Kenrith, the Returned King @Kieran Yanner +71 R Sram, Senior Edificer @Chris Rahn +73 R Baral, Chief of Compliance @Wesley Burt 76 M Jin-Gitaxias, Core Augur @Eric Deschamps 81 M Sheoldred, Whispering One @Jana Schirmer & Johannes Voss 82 M Skithiryx, the Blight Dragon @Chippy @@ -35,5 +81,86 @@ ScryfallCode=MUL 88 M Urabrask the Hidden @Brad Rigney 90 U Zada, Hedron Grinder @Chris Rallis 94 M Vorinclex, Voice of Hunger @Karl Kopinski +97 R Arixmethes, Slumbering Isle @Dimitar Marinski +101 R Brudiclad, Telchor Engineer @Daarken +102 U Dina, Soul Steeper @Chris Rahn +105 U Firja, Judge of Valor @Livia Prima +107 R Gyruda, Doom of Depths @Tyler Jacobson +112 R Kaheera, the Orphanguard @Ryan Pancoast +113 R Keruga, the Macrosage @Dan Scott 114 M Kroxa, Titan of Death's Hunger @Vincent Proce +115 R Lathiel, the Bounteous Dawn @Lucas Graciano +116 R Lurrus of the Dream-Den @Slawomir Maniak +117 R Lutri, the Spellchaser @Lie Setiawan 118 M Niv-Mizzet Reborn @Raymond Swanland +119 R Obosh, the Preypiercer @Daarken +121 U Raff, Weatherlight Stalwart @Eelis Kyttanen +127 R Umori, the Collector @Jehan Choo +128 M Yarok, the Desecrated @Daarken +129 R Yorion, Sky Nomad @Steven Belledin +130 R Zirda, the Dawnwaker @Jesper Ejsing +131 R Anafenza, Kin-Tree Spirit @Domenico Cava +132 U Daxos, Blessed by the Sun @Jason A. Engle +133 M Elesh Norn, Grand Cenobite @Flavio Girón +134 M Kenrith, the Returned King @Aaron Miller +135 U Kwende, Pride of Femeref @Jody Clark +136 R Sram, Senior Edificer @Adam Paquette +137 R Thalia, Guardian of Thraben @Joshua Alvarado +138 R Baral, Chief of Compliance @Yeong-Hao Han +139 R Emry, Lurker of the Loch @Wylie Beckert +140 U Inga Rune-Eyes @rishxxv +141 M Jin-Gitaxias, Core Augur @Kekai Kotaki +142 U Tetsuko Umezawa, Fugitive @Serena Malyon +143 R Ayara, First of Locthwain @Omar Rayyan +144 R Horobi, Death's Wail @Rorubei +145 R Seizan, Perverter of Truth @Maji +146 M Sheoldred, Whispering One @Flavio Girón +147 M Skithiryx, the Blight Dragon @Kekai Kotaki +148 U Tymaret, Chosen from Death @Jason A. Engle +149 U Yargle, Glutton of Urborg @Serena Malyon +150 R Captain Lannery Storm @Jody Clark +151 M Ragavan, Nimble Pilferer @Magali Villeneuve +152 R Squee, the Immortal @Eshpur +153 M Urabrask the Hidden @Flavio Girón +154 U Valduk, Keeper of the Flame @Tyler Crook +155 U Zada, Hedron Grinder @Dominik Mayer +156 U Fynn, the Fangbearer @GodMachine +157 R Goreclaw, Terror of Qal Sisma @Domenico Cava +158 U Renata, Called to the Hunt @Jason A. Engle +159 M Vorinclex, Voice of Hunger @JungShan +160 R Yedora, Grave Gardener @Matthew G. Lewis +161 U Aegar, the Freezing Flame @Richard Luong +162 R Arixmethes, Slumbering Isle @Jason A. Engle +163 M Atraxa, Praetors' Voice @Justin Hernandez & Alexis Hernandez +164 R Atris, Oracle of Half-Truths @Jason A. Engle +165 M Aurelia, the Warleader @Alex Dos Diaz +166 R Brudiclad, Telchor Engineer @JungShan +167 U Dina, Soul Steeper @Benjamin Ee +168 M Ezuri, Claw of Progress @JungShan +169 R Firesong and Sunspeaker @Daniel Lieske +170 U Firja, Judge of Valor @WolfSkullJack +171 M Grimgrin, Corpse-Born @Cabrol +172 R Gyruda, Doom of Depths @Steve Ellis +173 U Imoti, Celebrant of Bounty @Bastien L. Deharme +174 R Jegantha, the Wellspring @Steve Ellis +175 R Judith, the Scourge Diva @Benjamin Ee +176 U Juri, Master of the Revue @Julie Dillon +177 R Kaheera, the Orphanguard @Denis Medri +178 R Keruga, the Macrosage @Denis Medri +179 M Kroxa, Titan of Death's Hunger @Jason A. Engle +180 R Lathiel, the Bounteous Dawn @Shawn Wood +181 R Lurrus of the Dream-Den @Steve Ellis +182 R Lutri, the Spellchaser @Justine Mara Andersen +183 M Niv-Mizzet Reborn @Illustranesia +184 R Obosh, the Preypiercer @Denis Medri +185 U Radha, Coalition Warlord @Justin Hernandez & Alexis Hernandez +186 U Raff, Weatherlight Stalwart @Nino Vecia +187 U Reyav, Master Smith @Warren Mahy +188 U Rona, Sheoldred's Faithful @Serena Malyon +189 U Shanna, Sisay's Legacy @Rhonda Libbey +190 R Taigam, Ojutai Master @Domenico Cava +191 R Teysa Karlov @Barbara Rosiak +192 R Umori, the Collector @Daniel Warren Johnson +193 M Yarok, the Desecrated +194 R Yorion, Sky Nomad @Justine Mara Andersen +195 R Zirda, the Dawnwaker @Justine Mara Andersen diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index 8f3a7a2df9d..9daf0b5947a 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -684,6 +684,7 @@ ScryfallCode=SLD 724 R Lightning Strike @Frank Frazetta 726 R Zur the Enchanter @Chase Stone 727 R Fabled Passage @Warren Mahy +278 R Themberchaud @Yang Luo 900 R The Scarab God @Barely Human 1001 M Elspeth, Knight-Errant @Volkan Baǵa 1002 R Patron Wizard @Volkan Baǵa From 826e02d70f8e9c2f8892c7233d23dabbd698db53 Mon Sep 17 00:00:00 2001 From: Simisays <67333662+Simisays@users.noreply.github.com> Date: Thu, 6 Apr 2023 19:56:41 +0200 Subject: [PATCH 16/24] MOM 8 cards (#2811) --- .../java/forge/game/ability/AbilityUtils.java | 4 ++- .../upcoming/ancient_imperiosaur.txt | 11 +++++++ .../cardsfolder/upcoming/astral_wingspan.txt | 10 ++++++ ...widow_of_the_realm_ayara_furnace_queen.txt | 24 ++++++++++++++ .../captive_weird_completed_conjurer.txt | 22 +++++++++++++ .../upcoming/change_the_equation.txt | 7 ++++ .../upcoming/copper_host_crusher.txt | 7 ++++ .../upcoming/knight_errant_of_eos.txt | 10 ++++++ .../vorinclex_the_grand_evolution.txt | 33 +++++++++++++++++++ 9 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/change_the_equation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 5fce377cdf4..e5c27f2041e 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -568,7 +568,9 @@ public class AbilityUtils { val = c == null ? 0 : xCount(c, calcX[1], ability); } else if (calcX[0].startsWith("ExiledWith")) { val = handlePaid(card.getExiledCards(), calcX[1], card, ability); - } + } else if (calcX[0].startsWith("Convoked")) { + val = handlePaid(card.getConvoked(), calcX[1], card, ability); + } else if (calcX[0].startsWith("Remembered")) { // Add whole Remembered list to handlePaid final CardCollection list = new CardCollection(); diff --git a/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt b/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt new file mode 100644 index 00000000000..797a306646f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt @@ -0,0 +1,11 @@ +Name:Ancient Imperiosaur +ManaCost:5 G G +Types:Creature Dinosaur +PT:6/6 +K:Convoke +K:Trample +K:Ward:2 +K:etbCounter:P1P1:X +SVar:X:Convoked$Amount/Twice +DeckHas:Ability$Counters +Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nTrample, ward {2}\nAncient Imperiosaur enters the battlefield with two +1/+1 counters on it for each creature that convoked it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt b/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt new file mode 100644 index 00000000000..d4513ce9674 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt @@ -0,0 +1,10 @@ +Name:Astral Wingspan +ManaCost:4 U +Types:Enchantment Aura +K:Convoke +K:Enchant creature +A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Flying | Description$ Enchanted creature gets +2/+2 and has flying. +Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nEnchant creature\nWhen Astral Wingspan enters the battlefield, draw a card.\nEnchanted creature gets +2/+2 and has flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt b/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt new file mode 100644 index 00000000000..fb242d359aa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt @@ -0,0 +1,24 @@ +Name:Ayara, Widow of the Realm +ManaCost:1 B B +Types:Legendary Creature Elf Noble +PT:3/3 +A:AB$ DealDamage | Cost$ T Sac<1/Creature.Other;Artifact.Other/another creature or artifact> | ValidTgts$ Opponent,Battle | TgtPrompt$ Select target opponent or battle | SubAbility$ DBGainLife | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target opponent or battle and you gain X life, where X is the sacrificed permanent's mana value. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ X +SVar:X:Sacrificed$CardManaCost +A:AB$ SetState | Cost$ 5 RP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform NICKNAME. Activate only as a sorcery. +AlternateMode:DoubleFaced +DeckHas:Ability$Sacrifice|LifeGain +Oracle:{T}, Sacrifice another creature or artifact: Ayara, Widow of the Realm deals X damage to target opponent or battle and you gain X life, where X is the sacrificed permanent's mana value.\n{5}{R/P}: Transform Ayara. Activate only as a sorcery. ({R/P} can be paid with {R} or 2 life.) + +ALTERNATE + +Name:Ayara, Furnace Queen +ManaCost:no cost +Colors:black,red +Types:Legendary Creature Phyrexian Elf Noble +PT:4/4 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ At the beginning of combat on your turn, return up to one target artifact or creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. +SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Artifact.YouOwn,Creature.YouOwn | TgtPrompt$ Select up to one target artifact or creature from your graveyard | TargetMin$ 0 | TargetMax$ 1 | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Defined$ Targeted | Duration$ Permanent | AtEOT$ Exile +DeckHas:Ability$Sacrifice|Graveyard +Oracle:At the beginning of combat on your turn, return up to one target artifact or creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt b/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt new file mode 100644 index 00000000000..522fe9406b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt @@ -0,0 +1,22 @@ +Name:Captive Weird +ManaCost:U +Types:Creature Weird +PT:1/3 +K:Defender +A:AB$ SetState | Cost$ 3 RP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. +AlternateMode:DoubleFaced +Oracle:Defender\n{3}{R/P}: Transform Captive Weird. Activate only as a sorcery. ({R/P} can be paid with {R} or 2 life.) + +ALTERNATE + +Name:Compleated Conjurer +ManaCost:no cost +Colors:blue,red +Types:Creature Phyrexian Weird +PT:3/3 +T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this creature transforms into CARDNAME, exile the top card of your library. Until the end of your next turn, you may play that card. +SVar:TrigExile:DB$ Dig | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | Duration$ UntilTheEndOfYourNextTurn | StaticAbilities$ Play | SubAbility$ DBCleanup | ForgetOnMoved$ Exile +SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:When this creature transforms into Compleated Conjurer, exile the top card of your library. Until the end of your next turn, you may play that card. diff --git a/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt b/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt new file mode 100644 index 00000000000..c32d55f8f3e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt @@ -0,0 +1,7 @@ +Name:Change the Equation +ManaCost:1 U +Types:Instant +A:SP$ Charm | Choices$ DBCounter,DBCounterBis +SVar:DBCounter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell with mana value 2 or less | ValidTgts$ Card.cmcLE2 | SpellDescription$ Counter target spell with mana value 2 or less. +SVar:DBCounterBis:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell with mana value 2 or less | ValidTgts$ Card.cmcLE6+Red,Card.cmcLE6+Green| SpellDescription$ Counter target red or green spell with mana value 6 or less. +Oracle:Choose one —\n• Counter target spell with mana value 2 or less.\n• Counter target red or green spell with mana value 6 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt b/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt new file mode 100644 index 00000000000..a1b5febd10f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt @@ -0,0 +1,7 @@ +Name:Copper Host Crusher +ManaCost:6 G G +Types:Creature Phyrexian Bear Rhino +PT:8/8 +K:Trample +K:Hexproof +Oracle:Trample\nHexproof (This creature can’t be the target of spells or abilities your opponents control.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt b/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt new file mode 100644 index 00000000000..e08f0773fa6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt @@ -0,0 +1,10 @@ +Name:Knight-Errant of Eos +ManaCost:4 W +Types:Creature Human Knight +PT:4/4 +K:Convoke +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top six cards of your library. You may reveal up to two creature cards with mana value X or less from among them, where X is the number of creatures that convoked CARDNAME. Put the revealed cards into your hand, then shuffle. +SVar:TrigDig:DB$ Dig | DigNum$ 6 | ChangeNum$ 2 | Optional$ True | ChangeValid$ Creature.cmcLEX | SkipReorder$ True | SubAbility$ DBShuffle | ForceRevealToController$ True +SVar:DBShuffle:DB$ Shuffle | Defined$ You +SVar:X:Convoked$Amount +Oracle:Convoke\nWhen Knight-Errant of Eos enters the battlefield, look at the top six cards of your library. You may reveal up to two creature cards with mana value X or less from among them, where X is the number of creatures that convoked Knight-Errant of Eos. Put the revealed cards into your hand, then shuffle. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt b/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt new file mode 100644 index 00000000000..8e9662e6ee4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt @@ -0,0 +1,33 @@ +Name:Vorinclex +ManaCost:3 G G +Types:Legendary Creature Phyrexian Praetor +K:Trample +K:Reach +PT:6/6 +K:Trample +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, search your library for up to two Forest cards, reveal them, put them into your hand, then shuffle. +SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Forest | ChangeNum$ 2 +A:AB$ ChangeZone | Cost$ 6 G G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME, then return it to the battlefield transformed under its owner’s control. Activate only as a sorcery. +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AlternateMode:DoubleFaced +Oracle:Trample, reach\nWhen Vorinclex enters the battlefield, search your library for up to two Forest cards, reveal them, put them into your hand, then shuffle.\n{6}{G}{G}: Exile Vorinclex, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery. + +ALTERNATE + +Name:The Grand Evolution +ManaCost:no cost +Colors:green +Types:Enchantment Saga +K:Saga:3:DBMill,DBPutCounter,DBFight +SVar:DBMill:DB$ Mill | NumCards$ 10 | RememberMilled$ True | SubAbility$ DBChangeZone | SpellDescription$ Mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Hidden$ True | Destination$ Battlefield | ChangeType$ Creature.IsRemembered | ChangeTypeDesc$ creature cards milled this way | ChangeNum$ 2 | SelectPrompt$ Choose two creature cards milled this way | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select any number of creatures you control to distribute counters to | CounterType$ P1P1 | CounterNum$ 7 | TargetMin$ 1 | TargetMax$ 7 | DividedAsYouChoose$ 7 | SpellDescription$ Distribute seven +1/+1 counters among any number of target creatures you control. +SVar:DBFight:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Abilities$ Fight | Duration$ UntilEndOfTurn | SubAbility$ DBExileSelf | SpellDescription$ Until end of turn, creatures you control gain "{1}: This creature fights target creature you don't control." Exile CARDNAME, then return it to the battlefield (front face up). +SVar:Fight:AB$ Fight | Cost$ 1 | Defined$ Self | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | SpellDescription$ This creature fights target creature you don't control. +SVar:DBExileSelf:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBReturnSelf | RememberChanged$ True +SVar:DBReturnSelf:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup +DeckHas:Ability$Mill|Counters|Graveyard +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield.\nII — Distribute seven +1/+1 counters among any number of target creatures you control.\nIII — Until end of turn, creatures you control gain "{1}: This creature fights target creature you don't control." Exile The Grand Evolution, then return it to the battlefield (front face up). From 55253f9f77c8597d32a3a7ebfd5f5bd01c50828a Mon Sep 17 00:00:00 2001 From: Benjamin Perry Date: Thu, 6 Apr 2023 19:32:15 -0400 Subject: [PATCH 17/24] Missing card; not sure if this replacement was the intended card. Playtest ok. --- .../adventure/Shandalar/maps/map/main_story/templeofchandra.tmx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx index ec32f373d84..9e57d36d521 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx @@ -1514,7 +1514,7 @@ { - "startBattleWithCardInCommandZone": [ "Chandra, Supreme Pyromancer" ] + "startBattleWithCardInCommandZone": [ "Chandra, Bold Pyromancer" ] } From 8ea100fdba700cd4222626c1c8870b9075ec580f Mon Sep 17 00:00:00 2001 From: Chris H Date: Thu, 6 Apr 2023 21:27:47 -0400 Subject: [PATCH 18/24] Update rundvelt_hordemaster.txt --- forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt b/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt index c171afd4ef9..c426a2f855e 100644 --- a/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt +++ b/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt @@ -9,6 +9,7 @@ SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Pl SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ If it's a Goblin creature card, you may cast that card until the end of your next turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Z:Remembered$Valid Creature.Goblin +SVar:PlayMain1:TRUE DeckNeeds:Type$Goblin DeckHints:Type$Goblin Oracle:Other Goblins you control get +1/+1.\nWhenever Rundvelt Hordemaster or another Goblin you control dies, exile the top card of your library. If it's a Goblin creature card, you may cast that card until the end of your next turn. From ee418ded60ef31a217a7b3d83354f80e3fe038d0 Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Thu, 6 Apr 2023 22:32:41 -0400 Subject: [PATCH 19/24] MOM: Backup keyword and cards (#2799) * Backup keyword setup * Backup cards * KeywordWithAmount spacing * mirror_shield_hoplite.txt and support * fix for KeywordWithAmount * doomskar_warrior.txt fearless_skald.txt * add PlayMain1 * typo fix * add logic to ComputerUtil.castPermanentInMain1 instead of using PlayMain1 on cardscripts --- .../src/main/java/forge/ai/ComputerUtil.java | 9 ++++++ .../src/main/java/forge/game/ForgeScript.java | 2 ++ .../src/main/java/forge/game/card/Card.java | 12 ++++++-- .../java/forge/game/card/CardFactoryUtil.java | 29 +++++++++++++++++-- .../main/java/forge/game/keyword/Keyword.java | 1 + .../forge/game/keyword/KeywordWithAmount.java | 4 +-- .../forge/game/spellability/SpellAbility.java | 4 +++ .../upcoming/archpriest_of_shadows.txt | 13 +++++++++ .../upcoming/boon_bringer_valkyrie.txt | 11 +++++++ .../cardsfolder/upcoming/cragsmasher_yeti.txt | 10 +++++++ .../cardsfolder/upcoming/doomskar_warrior.txt | 13 +++++++++ .../cardsfolder/upcoming/fearless_skald.txt | 9 ++++++ .../upcoming/mirror_shield_hoplite.txt | 9 ++++++ .../upcoming/streetwise_negotiatior.txt | 10 +++++++ .../upcoming/voldaren_thrilseeker.txt | 11 +++++++ 15 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/fearless_skald.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 91bf2bb9334..64307ba3754 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1074,6 +1074,15 @@ public class ComputerUtil { } } + // cast Backup creatures in main 1 to pump attackers + if (cardState.hasKeyword(Keyword.BACKUP)) { + for (Card potentialAtkr: ai.getCreaturesInPlay()) { + if (ComputerUtilCard.doesCreatureAttackAI(ai, potentialAtkr)) { + return true; + } + } + } + // try not to cast Raid creatures in main 1 if an attack is likely if ("Count$AttackersDeclared".equals(card.getSVar("RaidTest")) && !cardState.hasKeyword(Keyword.HASTE)) { for (Card potentialAtkr: ai.getCreaturesInPlay()) { diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index c80b659dc4f..2ecb44a56e8 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -193,6 +193,8 @@ public class ForgeScript { } else if (property.equals("hasTapCost")) { Cost cost = sa.getPayCosts(); return cost != null && cost.hasTapCost(); + } else if (property.equals("Backup")) { + return sa.isBackup(); } else if (property.equals("Blitz")) { return sa.isBlitz(); } else if (property.equals("Buyback")) { 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 d31a52ff2f6..8088c700d5b 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2303,10 +2303,18 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.startsWith("Specialize") || keyword.equals("Ravenous") || keyword.equals("For Mirrodin")) { // keyword parsing takes care of adding a proper description - } else if(keyword.startsWith("Read ahead")) { + } else if (keyword.startsWith("Read ahead")) { sb.append(Localizer.getInstance().getMessage("lblReadAhead")).append(" (").append(Localizer.getInstance().getMessage("lblReadAheadDesc")); sb.append(" ").append(Localizer.getInstance().getMessage("lblSagaFooter")).append(" ").append(TextUtil.toRoman(getFinalChapterNr())).append("."); sb.append(")").append("\r\n\r\n"); + } else if (keyword.startsWith("Backup")) { + final String[] k = keyword.split(":"); + sb.append(k[0]).append(" ").append(k[1]).append(" ("); + String remStr = inst.getReminderText(); + if (k[2].endsWith("s")) { + remStr = remStr.replace("ability", "abilities"); + } + sb.append(remStr).append(")"); } else if (keyword.startsWith("MayEffectFromOpening")) { final String[] k = keyword.split(":"); // need to get SpellDescription from Svar @@ -2325,7 +2333,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { sbLong.append("\r\n"); } - if (keyword.equals("Flash")) { + if (keyword.equals("Flash") || keyword.startsWith("Backup")) { sb.append("\r\n\r\n"); i = 0; } else { 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 de058f5f264..605577a85ab 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -839,6 +839,31 @@ public class CardFactoryUtil { sa.setBlessing(true); } } + } else if (keyword.startsWith("Backup")) { + final String[] k = keyword.split(":"); + final String magnitude = k[1]; + final String backupVar = card.getSVar(k[2]); + + String descStr = "Backup " + magnitude; + + final String trigStr = "Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | " + + "Secondary$ True | TriggerDescription$ " + descStr; + + final String putCounter = "DB$ PutCounter | ValidTgts$ Creature | CounterNum$ " + magnitude + + " | CounterType$ P1P1 | Backup$ True"; + + final String addAbility = backupVar + " | ConditionDefined$ Targeted | " + + "ConditionPresent$ Card.Other | Defined$ Targeted"; + + SpellAbility sa = AbilityFactory.getAbility(putCounter, card); + AbilitySub backupSub = (AbilitySub) AbilityFactory.getAbility(addAbility, card); + sa.setSubAbility(backupSub); + + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); + sa.setIntrinsic(intrinsic); + trigger.setOverridingAbility(sa); + + inst.addTrigger(trigger); } else if (keyword.equals("Battle cry")) { final String trig = "Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Secondary$ True " + " | TriggerDescription$ " + keyword + " (" + inst.getReminderText() + ")"; @@ -1151,7 +1176,7 @@ public class CardFactoryUtil { } else if (keyword.equals("Extort")) { final String extortTrigger = "Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | " + "TriggerZones$ Battlefield | Secondary$ True" - + " | TriggerDescription$ Extort ("+ inst.getReminderText() +")"; + + " | TriggerDescription$ Extort (" + inst.getReminderText() + ")"; final String loseLifeStr = "AB$ LoseLife | Cost$ WB | Defined$ Player.Opponent | LifeAmount$ 1"; final String gainLifeStr = "DB$ GainLife | Defined$ You | LifeAmount$ AFLifeLost"; @@ -2687,7 +2712,7 @@ public class CardFactoryUtil { if (keyword.startsWith("Alternative Cost") && !host.isLand()) { final String[] kw = keyword.split(":"); String costStr = kw[1]; - for (SpellAbility sa: host.getBasicSpells()) { + for (SpellAbility sa : host.getBasicSpells()) { if (costStr.equals("ConvertedManaCost")) { costStr = Integer.toString(host.getCMC()); } 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 22073210873..ca735fef027 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -28,6 +28,7 @@ public enum Keyword { ASSIST("Assist", SimpleKeyword.class, true, "Another player can pay up to %s of this spell's cost."), AURA_SWAP("Aura swap", KeywordWithCost.class, false, "%s: You may exchange this Aura with an Aura card in your hand."), AWAKEN("Awaken", KeywordWithCostAndAmount.class, false, "If you cast this spell for %s, also put {%d:+1/+1 counter} on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land."), + BACKUP("Backup", KeywordWithAmount.class, false, "When this creature enters the battlefield, put {%1$d:+1/+1 counter} on target creature. If that's another creature, it gains the following ability until end of turn."), BANDING("Banding", SimpleKeyword.class, true, "Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking."), BATTLE_CRY("Battle cry", SimpleKeyword.class, false, "Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn."), BESTOW("Bestow", KeywordWithCost.class, false, "If you cast this card for its bestow cost, it's an Aura spell with enchant creature. It becomes a creature again if it's not attached to a creature."), diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java index dea434cbd2e..d39f3f93e7f 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java @@ -17,8 +17,8 @@ public class KeywordWithAmount extends KeywordInstance { if (details.contains(":")) { extra = details.split(":")[1]; } - } else { - amount = Integer.parseInt(details); + } else { + amount = details.contains(":") ? Integer.parseInt(details.split(":")[0]) : Integer.parseInt(details); } } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 1a4563b0a76..34649e4207c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -508,6 +508,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return isAlternativeCost(AlternativeCost.Cycling); } + public boolean isBackup() { + return this.hasParam("Backup"); + } + public boolean isBoast() { return this.hasParam("Boast"); } diff --git a/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt b/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt new file mode 100644 index 00000000000..ccb063ad085 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt @@ -0,0 +1,13 @@ +Name:Archpriest of Shadows +ManaCost:3 B B +Types:Creature Human Warlock +PT:4/4 +K:Backup:1:BackupAbilities +SVar:BackupAbilities:DB$ Animate | Keywords$ Deathtouch | Triggers$ DamageTrig +SVar:DamageTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigReturn | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield. +K:Deathtouch +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigReturn | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature from your graveyard | Origin$ Graveyard | Destination$ Battlefield +DeckHas:Ability$Counters|Graveyard +DeckHints:Ability$Discard|Sacrifice +Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that's another creature, it gains the following abilities until end of turn.)\nDeathtouch\nWhenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt b/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt new file mode 100644 index 00000000000..ed4e7889ca5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt @@ -0,0 +1,11 @@ +Name:Boon-Bringer Valkyrie +ManaCost:3 W W +Types:Creature Angel Warrior +PT:4/4 +K:Backup:1:BackupAbilities +SVar:BackupAbilities:DB$ Pump | KW$ Flying & First Strike & Lifelink +K:Flying +K:First Strike +K:Lifelink +DeckHas:Ability$Counters|LifeGain +Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that’s another creature, it gains the following abilities until end of turn.)\nFlying, first strike, lifelink diff --git a/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt b/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt new file mode 100644 index 00000000000..cb531538fb9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt @@ -0,0 +1,10 @@ +Name:Cragsmasher Yeti +ManaCost:4 R R +Types:Creature Yeti +PT:4/2 +K:TypeCycling:Mountain:2 +K:Backup:2:BackupAbility +SVar:BackupAbility:DB$ Pump | KW$ Trample +K:Trample +DeckHas:Ability$Counters +Oracle:Mountaincycling {2} ({2}, Discard this card: Search your library for a Mountain card, reveal it, put it into your hand, then shuffle.)\nBackup 2 (When this creature enters the battlefield, put two +1/+1 counters on target creature. If that's another creature, it gains the following ability until end of turn.)\nTrample diff --git a/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt b/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt new file mode 100644 index 00000000000..3f58448fcc8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt @@ -0,0 +1,13 @@ +Name:Doomskar Warrior +ManaCost:2 G G +Types:Creature Human Warrior +PT:4/3 +K:Backup:1:BackupAbilities +SVar:BackupAbilities:DB$ Animate | Keywords$ Trample | Triggers$ DamageTrig +SVar:DamageTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigDig | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ X | ChangeNum$ 1 | ChangeValid$ Creature,Land | Optional$ True | DestinationZone$ Hand | RestRandomOrder$ True +K:Trample +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Planeswalker | Execute$ TrigDig | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:X:TriggerCount$DamageAmount +DeckHas:Ability$Counters +Oracle:Backup 1\nTrample\nWhenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt b/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt new file mode 100644 index 00000000000..07431895a95 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt @@ -0,0 +1,9 @@ +Name:Fearless Skald +ManaCost:4 R +Types:Creature Dwarf Berserker +PT:3/2 +K:Backup:1:BackupAbility +SVar:BackupAbility:DB$ Pump | KW$ Double Strike +K:Double Strike +DeckHas:Ability$Counters +Oracle:Backup 1 (When this creature enters the battlefield, put a + 1/+ 1 counter on target creature. If that's another creature, it gains the following ability until end of turn.)\nDouble strike diff --git a/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt b/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt new file mode 100644 index 00000000000..d07273f28db --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt @@ -0,0 +1,9 @@ +Name:Mirror-Shield Hoplite +ManaCost:R W +Types:Creature Human Soldier +PT:2/2 +K:Vigilance +T:Mode$ BecomesTarget | ValidTarget$ Creature.inZoneBattlefield+YouCtrl | ValidSource$ Ability.Backup | TriggerZones$ Battlefield | Execute$ TrigCopy | ActivationLimit$ 1 | TriggerDescription$ Whenever a creature you control becomes the target of a backup ability, copy that ability. You may choose new targets for the copy. This ability triggers only once each turn. +SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredStackInstance | MayChooseTarget$ True +DeckNeeds:Keyword$Backup +Oracle:Vigilance\nWhenever a creature you control becomes the target of a backup ability, copy that ability. You may choose new targets for the copy. This ability triggers only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt b/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt new file mode 100644 index 00000000000..faae830750d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt @@ -0,0 +1,10 @@ +Name:Streetwise Negotiator +ManaCost:1 G +Types:Creature Cat Citizen +PT:0/2 +K:Backup:1:BackupAbility +SVar:BackupAbility:DB$ Animate | staticAbilities$ CDT +SVar:CDT:Mode$ CombatDamageToughness | ValidCard$ Card.Self | Description$ This creature assigns combat damage equal to its toughness rather than its power. +S:Mode$ CombatDamageToughness | ValidCard$ Card.Self | Description$ This creature assigns combat damage equal to its toughness rather than its power. +DeckHas:Ability$Counters +Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that's another creature, it gains the following ability until end of turn.)\nThis creature assigns combat damage equal to its toughness rather than its power. diff --git a/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt b/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt new file mode 100644 index 00000000000..534cd599a15 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt @@ -0,0 +1,11 @@ +Name:Voldaren Thrillseeker +ManaCost:2 R +Types:Creature Vampire Warrior +PT:1/1 +K:Backup:2:BackupAbility +SVar:BackupAbility:DB$ Animate | Abilities$ ABDealDamage +SVar:ABDealDamage:AB$ DealDamage | Cost$ 1 Sac<1/CARDNAME/this creature> | ValidTgts$ Player,Creature,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SpellDescription$ It deals damage equal to its power to any target. +A:AB$ DealDamage | Cost$ 1 Sac<1/CARDNAME/this creature> | ValidTgts$ Player,Creature,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SpellDescription$ It deals damage equal to its power to any target. +SVar:X:Sacrificed$CardPower +DeckHas:Ability$Counters|Sacrifice +Oracle:Backup 2 (When this creature enters the battlefield, put two +1/+1 counters on target creature. If that's another creature, it gains the following ability until end of turn.)\n{1}, Sacrifice this creature: It deals damage equal to its power to any target. From b81af7c10598bf539996fd84809ac4da1116688f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 7 Apr 2023 13:16:57 +0800 Subject: [PATCH 20/24] update planes-images --- .../src/forge/assets/FSkinTexture.java | 28 ++++++++++++++++++- forge-gui/res/lists/planes-images.txt | 25 +++++++++++++++++ .../properties/ForgeConstants.java | 25 +++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/assets/FSkinTexture.java b/forge-gui-mobile/src/forge/assets/FSkinTexture.java index aacdf772f0e..d2555ab31f0 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinTexture.java +++ b/forge-gui-mobile/src/forge/assets/FSkinTexture.java @@ -166,7 +166,33 @@ public enum FSkinTexture implements FImage { Interplanar_Tunnel(ForgeConstants.BG_83, false, true), Morphic_Tide(ForgeConstants.BG_84, false, true), Mutual_Epiphany(ForgeConstants.BG_85, false, true), - Time_Distortion(ForgeConstants.BG_86, false, true); + Time_Distortion(ForgeConstants.BG_86, false, true), + Enigma_Ridges(ForgeConstants.BG_87, false, true), + Esper(ForgeConstants.BG_88, false, true), + Ghirapur(ForgeConstants.BG_89, false, true), + Inys_Haen(ForgeConstants.BG_90, false, true), + Ketria(ForgeConstants.BG_91, false, true), + Littiara(ForgeConstants.BG_92, false, true), + Megaflora_Jungle(ForgeConstants.BG_93, false, true), + Naktamun(ForgeConstants.BG_94, false, true), + New_Argive(ForgeConstants.BG_95, false, true), + Norns_Seedcore(ForgeConstants.BG_96, false, true), + Nyx(ForgeConstants.BG_97, false, true), + Paliano(ForgeConstants.BG_98, false, true), + Riptide_Island(ForgeConstants.BG_99, false, true), + Strixhaven(ForgeConstants.BG_100, false, true), + Ten_Wizards_Mountain(ForgeConstants.BG_101, false, true), + The_Caldaia(ForgeConstants.BG_102, false, true), + The_Fertile_Lands_of_Saulvinia(ForgeConstants.BG_103, false, true), + The_Golden_City_of_Orazca(ForgeConstants.BG_104, false, true), + The_Great_Aerie(ForgeConstants.BG_105, false, true), + The_Pit(ForgeConstants.BG_106, false, true), + The_Western_Cloud(ForgeConstants.BG_107, false, true), + The_Wilds(ForgeConstants.BG_108, false, true), + Towashi(ForgeConstants.BG_109, false, true), + Unyaro(ForgeConstants.BG_110, false, true), + Valors_Reach(ForgeConstants.BG_111, false, true); + private final String filename; private final boolean repeat; diff --git a/forge-gui/res/lists/planes-images.txt b/forge-gui/res/lists/planes-images.txt index 2c96cfb0e68..c5cb7ac15ae 100644 --- a/forge-gui/res/lists/planes-images.txt +++ b/forge-gui/res/lists/planes-images.txt @@ -10,10 +10,13 @@ https://downloads.cardforge.org/images/planes/Chaotic_Aether.jpg https://downloads.cardforge.org/images/planes/Cliffside_Market.jpg https://downloads.cardforge.org/images/planes/Edge_of_Malacol.jpg https://downloads.cardforge.org/images/planes/Eloren_Wilds.jpg +https://downloads.cardforge.org/images/planes/Enigma_Ridges.jpg +https://downloads.cardforge.org/images/planes/Esper.jpg https://downloads.cardforge.org/images/planes/Feeding_Grounds.jpg https://downloads.cardforge.org/images/planes/Fields_of_Summer.jpg https://downloads.cardforge.org/images/planes/Furnace_Layer.jpg https://downloads.cardforge.org/images/planes/Gavony.jpg +https://downloads.cardforge.org/images/planes/Ghirapur.jpg https://downloads.cardforge.org/images/planes/Glen_Elendra.jpg https://downloads.cardforge.org/images/planes/Glimmervoid_Basin.jpg https://downloads.cardforge.org/images/planes/Goldmeadow.jpg @@ -24,16 +27,20 @@ https://downloads.cardforge.org/images/planes/Hedron_Fields_of_Agadeem.jpg https://downloads.cardforge.org/images/planes/Horizon_Boughs.jpg https://downloads.cardforge.org/images/planes/Immersturm.jpg https://downloads.cardforge.org/images/planes/Interplanar_Tunnel.jpg +https://downloads.cardforge.org/images/planes/Inys_Haen.jpg https://downloads.cardforge.org/images/planes/Isle_of_Vesuva.jpg https://downloads.cardforge.org/images/planes/Izzet_Steam_Maze.jpg https://downloads.cardforge.org/images/planes/Jund.jpg https://downloads.cardforge.org/images/planes/Kessig.jpg +https://downloads.cardforge.org/images/planes/Ketria.jpg https://downloads.cardforge.org/images/planes/Kharasha_Foothills.jpg https://downloads.cardforge.org/images/planes/Kilnspire_District.jpg https://downloads.cardforge.org/images/planes/Krosa.jpg https://downloads.cardforge.org/images/planes/Lair_of_the_Ashen_Idol.jpg https://downloads.cardforge.org/images/planes/Lethe_Lake.jpg +https://downloads.cardforge.org/images/planes/Littiara.jpg https://downloads.cardforge.org/images/planes/Llanowar.jpg +https://downloads.cardforge.org/images/planes/Megaflora_Jungle.jpg https://downloads.cardforge.org/images/planes/Minamo.jpg https://downloads.cardforge.org/images/planes/Mirrored_Depths.jpg https://downloads.cardforge.org/images/planes/Morphic_Tide.jpg @@ -41,13 +48,18 @@ https://downloads.cardforge.org/images/planes/Mount_Keralia.jpg https://downloads.cardforge.org/images/planes/Murasa.jpg https://downloads.cardforge.org/images/planes/Mutual_Epiphany.jpg https://downloads.cardforge.org/images/planes/Naar_Isle.jpg +https://downloads.cardforge.org/images/planes/Naktamun.jpg https://downloads.cardforge.org/images/planes/Naya.jpg https://downloads.cardforge.org/images/planes/Nephalia.jpg +https://downloads.cardforge.org/images/planes/New_Argive.jpg https://downloads.cardforge.org/images/planes/Norn's_Dominion.jpg +https://downloads.cardforge.org/images/planes/Norn's_Seedcore.jpg +https://downloads.cardforge.org/images/planes/Nyx.jpg https://downloads.cardforge.org/images/planes/Onakke_Catacomb.jpg https://downloads.cardforge.org/images/planes/Orochi_Colony.jpg https://downloads.cardforge.org/images/planes/Orzhova.jpg https://downloads.cardforge.org/images/planes/Otaria.jpg +https://downloads.cardforge.org/images/planes/Paliano.jpg https://downloads.cardforge.org/images/planes/Panopticon.jpg https://downloads.cardforge.org/images/planes/Planewide_Disaster.jpg https://downloads.cardforge.org/images/planes/Pools_of_Becoming.jpg @@ -55,6 +67,7 @@ https://downloads.cardforge.org/images/planes/Prahv.jpg https://downloads.cardforge.org/images/planes/Quicksilver_Sea.jpg https://downloads.cardforge.org/images/planes/Raven's_Run.jpg https://downloads.cardforge.org/images/planes/Reality_Shaping.jpg +https://downloads.cardforge.org/images/planes/Riptide_Island.jpg https://downloads.cardforge.org/images/planes/Sanctum_of_Serra.jpg https://downloads.cardforge.org/images/planes/Sea_of_Sand.jpg https://downloads.cardforge.org/images/planes/Selesnya_Loft_Gardens.jpg @@ -64,23 +77,35 @@ https://downloads.cardforge.org/images/planes/Sokenzan.jpg https://downloads.cardforge.org/images/planes/Spatial_Merging.jpg https://downloads.cardforge.org/images/planes/Stairs_to_Infinity.jpg https://downloads.cardforge.org/images/planes/Stensia.jpg +https://downloads.cardforge.org/images/planes/Strixhaven.jpg https://downloads.cardforge.org/images/planes/Stronghold_Furnace.jpg https://downloads.cardforge.org/images/planes/Takenuma.jpg https://downloads.cardforge.org/images/planes/Talon_Gates.jpg https://downloads.cardforge.org/images/planes/Tazeem.jpg https://downloads.cardforge.org/images/planes/Tember_City.jpg +https://downloads.cardforge.org/images/planes/Ten_Wizards_Mountain.jpg https://downloads.cardforge.org/images/planes/The_Aether_Flues.jpg +https://downloads.cardforge.org/images/planes/The_Caldaia.jpg https://downloads.cardforge.org/images/planes/The_Dark_Barony.jpg https://downloads.cardforge.org/images/planes/The_Eon_Fog.jpg +https://downloads.cardforge.org/images/planes/The_Fertile_Lands_of_Saulvinia.jpg https://downloads.cardforge.org/images/planes/The_Fourth_Sphere.jpg +https://downloads.cardforge.org/images/planes/The_Golden_City_of_Orazca.jpg +https://downloads.cardforge.org/images/planes/The_Great_Aerie.jpg https://downloads.cardforge.org/images/planes/The_Great_Forest.jpg https://downloads.cardforge.org/images/planes/The_Hippodrome.jpg https://downloads.cardforge.org/images/planes/The_Maelstrom.jpg +https://downloads.cardforge.org/images/planes/The_Pit.jpg +https://downloads.cardforge.org/images/planes/The_Western_Cloud.jpg +https://downloads.cardforge.org/images/planes/The_Wilds.jpg https://downloads.cardforge.org/images/planes/The_Zephyr_Maze.jpg https://downloads.cardforge.org/images/planes/Time_Distortion.jpg +https://downloads.cardforge.org/images/planes/Towashi.jpg https://downloads.cardforge.org/images/planes/Trail_of_the_Mage-Rings.jpg https://downloads.cardforge.org/images/planes/Truga_Jungle.jpg https://downloads.cardforge.org/images/planes/Turri_Island.jpg https://downloads.cardforge.org/images/planes/Undercity_Reaches.jpg +https://downloads.cardforge.org/images/planes/Unyaro.jpg +https://downloads.cardforge.org/images/planes/Valor's_Reach.jpg https://downloads.cardforge.org/images/planes/Velis_Vel.jpg https://downloads.cardforge.org/images/planes/Windriddle_Palaces.jpg \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java index d2224eec428..faa4cc7e27d 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -245,6 +245,31 @@ public final class ForgeConstants { public static final String BG_84 = "Morphic_Tide.jpg"; public static final String BG_85 = "Mutual_Epiphany.jpg"; public static final String BG_86 = "Time_Distortion.jpg"; + public static final String BG_87 = "Enigma_Ridges.jpg"; + public static final String BG_88 = "Esper.jpg"; + public static final String BG_89 = "Ghirapur.jpg"; + public static final String BG_90 = "Inys_Haen.jpg"; + public static final String BG_91 = "Ketria.jpg"; + public static final String BG_92 = "Littiara.jpg"; + public static final String BG_93 = "Megaflora_Jungle.jpg"; + public static final String BG_94 = "Naktamun.jpg"; + public static final String BG_95 = "New_Argive.jpg"; + public static final String BG_96 = "Norn's_Seedcore.jpg"; + public static final String BG_97 = "Nyx.jpg"; + public static final String BG_98 = "Paliano.jpg"; + public static final String BG_99 = "Riptide_Island.jpg"; + public static final String BG_100 = "Strixhaven.jpg"; + public static final String BG_101 = "Ten_Wizards_Mountain.jpg"; + public static final String BG_102 = "The_Caldaia.jpg"; + public static final String BG_103 = "The_Fertile_Lands_of_Saulvinia.jpg"; + public static final String BG_104 = "The_Golden_City_of_Orazca.jpg"; + public static final String BG_105 = "The_Great_Aerie.jpg"; + public static final String BG_106 = "The_Pit.jpg"; + public static final String BG_107 = "The_Western_Cloud.jpg"; + public static final String BG_108 = "The_Wilds.jpg"; + public static final String BG_109 = "Towashi.jpg"; + public static final String BG_110 = "Unyaro.jpg"; + public static final String BG_111 = "Valor's_Reach.jpg"; //CARD BG public static final String IMG_CARDBG_A = "IMG_CARDBG_A.png"; public static final String IMG_CARDBG_B = "IMG_CARDBG_B.png"; From 0b0a6ad4687c75d2baacac6cfa31fa8e970a2167 Mon Sep 17 00:00:00 2001 From: paulsnoops Date: Fri, 7 Apr 2023 09:54:03 +0100 Subject: [PATCH 21/24] Edition updates: MOM, MOC, MUL, PLIST --- .../March of the Machine Commander.txt | 42 +++++++++- .../res/editions/March of the Machine.txt | 19 ++++- forge-gui/res/editions/Multiverse Legends.txt | 1 + forge-gui/res/editions/The List.txt | 77 ++++++++++++++++++- 4 files changed, 133 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/editions/March of the Machine Commander.txt b/forge-gui/res/editions/March of the Machine Commander.txt index 63c13cb0a55..85c4c51755b 100644 --- a/forge-gui/res/editions/March of the Machine Commander.txt +++ b/forge-gui/res/editions/March of the Machine Commander.txt @@ -52,13 +52,31 @@ ScryfallCode=MOC 44 R Wildfire Awakener @Andrew Mar 45 R Bitterthorn, Nissa's Animus @Titus Lunter 46 R Ichor Elixir @Warren Mahy +47 C The Caldaia @Julian Kok Joon Wen +48 C Enigma Ridges @Eytan Zana 49 C Esper @Bruce Brenneise +50 C The Fertile Lands of Saulvinia @Lorenzo Lanfranconi +51 C Ghirapur @David Alvarez +52 C The Golden City of Orazca @Alayna Danner +53 C The Great Aerie @Julian Kok Joon Wen +54 C Inys Haen @Aldo Domínguez 55 C Ketria @Piotr Dura +56 C Littiara @Jonas De Ro 57 C Megaflora Jungle 58 C Naktamun @Robin Olausson +59 C New Argive @Leon Tukker +60 C Norn's Seedcore @Alexander Forssberg 61 C Nyx @Piotr Dura +62 C Paliano @Piotr Dura 63 C The Pit @Dave Kendall +64 C Riptide Island @Jesper Ejsing +65 C Strixhaven @Alexander Forssberg +66 C Ten Wizards Mountain @Iris Compiet 67 C Towashi @Kamila Szutenberg +68 C Unyaro @Robin Olausson +69 C Valor's Reach @Kamila Szutenberg +70 C The Western Cloud @Titus Lunter +71 C The Wilds @Chris Seaman 72 R Elspeth's Talent @Jeremy Wilson 73 R Firemane Commando @Andrew Mar 74 R Teferi's Talent @Dominik Mayer @@ -127,12 +145,29 @@ ScryfallCode=MOC 137 M Kasla, the Broken Halo @Martina Fackova 138 M Sidar Jabari of Zhalfir @Simon Dominic 139 C The Aether Flues @Jason A. Engle +140 C Bloodhill Bastion @Mark Hyzer 141 C Chaotic Aether @Dan Scott +142 C Gavony @Dave Kendall +143 C Glimmervoid Basin @Lars Grant-West 144 C The Great Forest @Howard Lyon +145 C Grove of the Dreampods @Erica Yang +146 C Hedron Fields of Agadeem @Vincent Proce 147 C Isle of Vesuva @Zoltan Boros & Gabor Szikszai 148 C Jund @Aleksi Briclot +149 C Kharasha Foothills @Trevor Claxton +150 C Krosa @Steven Belledin +151 C Mutual Epiphany @Jason Felix +152 C Orochi Colony @Charles Urbach 153 C Panopticon @John Avon +154 C Planewide Disaster @Dave Kendall +155 C Reality Shaping @Dan Scott +156 C Selesnya Loft Gardens @Martina Pilcerova +157 C Sokenzan @Brian Snõddy 158 C Spatial Merging @Gabor Szikszai +159 C Stensia @Vincent Proce +160 C Stronghold Furnace @Jim Pavelec +161 C Truga Jungle @Jim Nelson +162 C Turri Island @Raymond Swanland 163 C Undercity Reaches @Stephan Martiniere 164 U Abzan Battle Priest @Chris Rahn 165 U Abzan Falconer @Steven Belledin @@ -158,13 +193,14 @@ ScryfallCode=MOC 185 R Fell the Mighty @Raymond Swanland 186 U Flight of Equenauts @Zezhou Chen 187 U Generous Gift @Kev Walker -188 C Hero of Bladehold @Steven Belledin +188 M Hero of Bladehold @Steven Belledin 189 R High Sentinels of Arashin @James Ryman 190 R Hour of Reckoning @Joseph Meehan 191 R Keeper of the Accord @Denman Rooke 192 R Knight Exemplar @Jason Chan 193 R Knight of the White Orchid @Mark Zug 194 U Master Splicer @Chippy +195 R Maul of the Skyclaves @Joseph Meehan 196 U Mentor of the Meek @Jana Schirmer & Johannes Voss 197 R Mikaeus, the Lunarch @Steven Belledin 198 U Path to Exile @Todd Lockwood @@ -393,7 +429,7 @@ ScryfallCode=MOC 421 U Rogue's Passage @Christine Choi 422 R Shineshadow Snarl @Sam Burley 423 C Silverquill Campus @Titus Lunter -424 U Simic Growth Chamber @John Avon +424 C Simic Growth Chamber @John Avon 425 R Skycloud Expanse @Sam Burley 426 R Spire of Industry @John Avon 427 R Sungrass Prairie @Ron Spencer @@ -406,7 +442,7 @@ ScryfallCode=MOC 434 R Temple of Mystery @Piotr Dura 435 R Temple of Plenty @Chris Ostrowski 436 R Temple of Silence @Adam Paquette -437 R Temple of the False God @Brian Snõddy +437 U Temple of the False God @Brian Snõddy 438 R Temple of Triumph @Piotr Dura 439 C Terramorphic Expanse @Dan Scott 440 C Thriving Heath @Alayna Danner diff --git a/forge-gui/res/editions/March of the Machine.txt b/forge-gui/res/editions/March of the Machine.txt index 9bbbea0752e..447e45085e6 100644 --- a/forge-gui/res/editions/March of the Machine.txt +++ b/forge-gui/res/editions/March of the Machine.txt @@ -110,7 +110,7 @@ ScryfallCode=MOM 102 C Etched Host Doombringer @Helge C. Balzer 103 C Failed Conversion @Jodie Muir 104 C Final Flourish @Raluca Marinescu -105 C Flitting Guerilla @Francisco Miyara +105 C Flitting Guerrilla @Francisco Miyara 106 U Gift of Compleation @Artur Nakhodkin 107 U Glistening Deluge @Anastasia Balakchina 108 C Gloomfang Mauler @Denis Zhbankov @@ -297,6 +297,8 @@ ScryfallCode=MOM 289 L Mountain @Lucas Staniec 290 L Forest @Grady Frederick 291 L Forest @Henry Peters + +[showcase] 292 M Elesh Norn @Kekai Kotaki 293 R Heliod, the Radiant Dawn @Jason A. Engle 294 M Jin-Gitaxias @Dominik Mayer @@ -325,9 +327,14 @@ ScryfallCode=MOM 317 R Yargle and Multani @Lisa Heidhoff 318 M Zimone and Dina @Anato Finnstark 319 M Zurgo and Ojutai @Adrian Smith + +[borderless] 320 M Archangel Elspeth @Denys Tsiperko 321 M Chandra, Hope's Beacon @Randy Vargas 322 M Wrenn and Realmbreaker @Jehan Choo +339 M Jin-Gitaxias @Julian Kok Joon Wen + +[jumpstart] 323 R Essence of Orthodoxy @Oriana Menendez 324 C Phyrexian Pegasus @Carlos Palma Cruchaga 325 U Seedpod Caretaker @Slawomir Maniak @@ -343,7 +350,8 @@ ScryfallCode=MOM 335 C Fairgrounds Trumpeter @Samuel Perin 336 U Ruins Recluse @Lorenzo Mastroianni 337 R Surrak and Goreclaw @Lucas Graciano -339 M Jin-Gitaxias @Julian Kok Joon Wen + +[extended art] 343 R Boon-Bringer Valkyrie @Heonhwa Choe 344 R Dusk Legion Duelist @Ryan Valle 345 R Guardian of Ghirapur @Cynthia Sheppard @@ -382,10 +390,17 @@ ScryfallCode=MOM 378 R Terror of Towashi @Lius Lasahido 379 R Orthion, Hero of Lavabrink @Aaron Miller 380 R Surrak and Goreclaw @Lucas Graciano + +[promo] 381 U Norn's Inquisitor @Denis Zhbankov 382 U Scrappy Bruiser @David Auden Nash 383 U Kami of Whispered Hopes @Filipe Pagliuso 384 U Botanical Brawler @Jesper Ejsing 385 U Halo Forager @Kevin Sidharta 386 R Ghalta and Mavren @Betty Jiang + +[buy a box] 387 R Omnath, Locus of All @Helge C. Balzer + +[tokens] +incubator_c_0_0_a_phyrexian diff --git a/forge-gui/res/editions/Multiverse Legends.txt b/forge-gui/res/editions/Multiverse Legends.txt index 144dbeedaf6..c62f9e1a193 100644 --- a/forge-gui/res/editions/Multiverse Legends.txt +++ b/forge-gui/res/editions/Multiverse Legends.txt @@ -6,6 +6,7 @@ Type=Collector_Edition ScryfallCode=MUL [cards] +1 R Anafenza, Kin-Tree Spirit @Domenico Cava 2 U Daxos, Blessed by the Sun @Jason A. Engle 3 M Elesh Norn, Grand Cenobite @Flavio Girón 4 M Kenrith, the Returned King @Aaron Miller diff --git a/forge-gui/res/editions/The List.txt b/forge-gui/res/editions/The List.txt index 95f72f94310..0d024109fb8 100644 --- a/forge-gui/res/editions/The List.txt +++ b/forge-gui/res/editions/The List.txt @@ -182,7 +182,7 @@ ScryfallCode=PLIST 174 R Harmonize @Vance Kovacs 175 R Helix Pinnacle @Dan Scott 176 R Hua Tuo, Honored Physician @Gao Jianzhang -177 R Imperious Perfect @Scott M. Fischer +177 U Imperious Perfect @Scott M. Fischer 178 M Ishkanah, Grafwidow @Christine Choi 179 R Jadelight Ranger @Jason Rainville 180 M Kalonian Hydra @Chris Rahn @@ -1020,3 +1020,78 @@ F567 R Puresteel Angel @Lukas Litzsinger 1012 M Sword of War and Peace @Chris Rahn 1013 C Great Furnace @Rob Alexander 1014 U Interplanar Beacon @Adam Paquette +1015 R Austere Command @Wayne England +1016 C Brago's Representative @Anthony Palumbo +1017 M Heliod, God of the Sun @Jaime Jones +1018 U Ixalan's Binding @Chase Stone +1019 R Linden, the Steadfast Queen @Ryan Pancoast +1020 R Ravnica at War @Adam Paquette +1021 C Segovian Angel @Simon Dominic +1022 U Vryn Wingmare @Seb McKinnon +1023 R Archmage Emeritus @Caio Monteiro +1024 R Balance of Power @Adam Rex +1025 U Invasive Surgery @Steven Belledin +1026 R Laboratory Maniac @Jason Felix +1027 R Mass Polymorph @Christopher Moeller +1028 R Pulse of the Grid @Wayne England +1029 R Reshape @Jon Foster +1030 R Rite of Replication @Matt Cavotta +1031 R Rooftop Storm @John Stanko +1032 R Shared Fate @Matt Cavotta +1033 U Stormscape Battlemage @Christopher Moeller +1034 R Time Stretch @Paolo Parente +1035 R True-Name Nemesis @Zack Stella +1036 R Aether Snap @Kev Walker +1037 R Drinker of Sorrow @Carl Critchlow +1038 U Endless Obedience @Karl Kopinski +1039 U Ihsan's Shade @Daarken +1040 M Nashi, Moon Sage's Scion @Valera Lutfullina +1041 R Needle Specter @Christopher Moeller +1042 R Phyrexian Crusader @Eric Deschamps +1043 R Phyrexian Delver @Igor Kieryluk +1044 R Phyrexian Etchings @Ron Spears +1045 R Phyrexian Infiltrator @Darrell Riche +1046 R Phyrexian Vatmother @Stephan Martiniere +1047 R Rain of Daggers @Melissa A. Benson +1048 C Siege Zombie @Johann Bodin +1049 R Unmask @rk post +1050 R Eidolon of the Great Revel @Cyril Van Der Haegen +1051 R Etali, Primal Storm @Raymond Swanland +1052 R Five-Alarm Fire @Karl Kopinski +1053 U Mercadia's Downfall @Pete Venters +1054 R Pia and Kiran Nalaar @Eric Deschamps +1055 R Planeswalker's Fury @Christopher Moeller +1056 C Regathan Firecat @Eric Velhagen +1057 C Ruthless Invasion @Svetlin Velinov +1058 R Scorched Earth @Nicola Leonard +1059 R Siege of Towers @Anthony S. Waters +1060 R Slag Fiend @Mike Bierek +1061 M Soul of Shandalar @Raymond Swanland +1062 M Avenger of Zendikar @Zoltan Boros +1063 C Capenna Express @Viko Menezes +1064 R Dig Up @Slawomir Maniak +1065 R Ghalta, Primal Hunger @Chase Stone +1066 M The Great Aurora @Sam Burley +1067 R Muraganda Petroglyphs @Scott Altmann +1068 U Path to the World Tree @Daniel Ljunggren +1069 M Polukranos, World Eater @Johann Bodin +1070 C Primal Cocoon @Daniel Ljunggren +1071 C Sprout Swarm @Chippy +1072 R Anax and Cymede @Willian Murai +1073 M Borborygmos Enraged @Aleksi Briclot +1074 M Dragonlord Ojutai @Chase Stone +1075 M Gisa and Geralf @Karla Ortiz +1076 U Incubation // Incongruity @Mike Bierek +1077 M Kalamax, the Stormsire @Nicholas Gregory +1078 R Mina and Denn, Wildborn @Izzy +1079 U Reduce // Rubble @Eric Deschamps +1080 R Sarulf, Realm Eater @Chris Rahn +1081 R Dragon Throne of Tarkir @Daarken +1082 R Hope of Ghirapur @Lius Lasahido +1083 R Planar Portal @Mark Tedin +1084 R High Market @Carl Critchlow +1085 R Ketria Triome @Sam Burley +1086 R Okina, Temple to the Grandfathers @Keith Garletts +1087 R Sea of Clouds @Florian de Gesincourt +1088 R The World Tree @Anastasia Ovchinnikova +1089 U Zhalfirin Void @Chase Stone From 9531fd0341b565ba8e6c8f061bc523356a1601d4 Mon Sep 17 00:00:00 2001 From: Simisays <67333662+Simisays@users.noreply.github.com> Date: Fri, 7 Apr 2023 12:22:41 +0200 Subject: [PATCH 22/24] MOM 6 cards (#2816) --- .../upcoming/bloodfeather_phoenix.txt | 11 +++++++++++ .../upcoming/deeproot_wayfinder.txt | 9 +++++++++ .../upcoming/dusk_legion_duelist.txt | 9 +++++++++ .../upcoming/glistening_deluge.txt | 6 ++++++ .../gnottvold_hermit_chrome_host_hulk.txt | 19 +++++++++++++++++++ .../harried_artisan_phyrexian_skyflayer.txt | 19 +++++++++++++++++++ 6 files changed, 73 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/bloodfeather_phoenix.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/deeproot_wayfinder.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dusk_legion_duelist.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/glistening_deluge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gnottvold_hermit_chrome_host_hulk.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/harried_artisan_phyrexian_skyflayer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bloodfeather_phoenix.txt b/forge-gui/res/cardsfolder/upcoming/bloodfeather_phoenix.txt new file mode 100644 index 00000000000..c4a67b9855d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bloodfeather_phoenix.txt @@ -0,0 +1,11 @@ +Name:Bloodfeather Phoenix +ManaCost:1 R +Types:Creature Phoenix +PT:2/2 +K:Flying +K:CARDNAME can't block. +T:Mode$ DamageDone | ValidSource$ Instant.YouCtrl,Sorcery.YouCtrl | ValidTarget$ Opponent,Battle | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever an instant or sorcery spell you control deals damage to an opponent or battle, you may pay {R}. If you do, return CARDNAME from your graveyard to the battlefield. It gains haste until end of turn. +SVar:TrigReturn:AB$ ChangeZone | Cost$ R | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Defined$ Self +DeckHas:Ability$Graveyard +Oracle:Flying\nBloodfeather Phoenix can't block.\nWhenever an instant or sorcery spell you control deals damage to an opponent or battle, you may pay {R}. If you do, return Bloodfeather Phoenix from your graveyard to the battlefield. It gains haste until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/deeproot_wayfinder.txt b/forge-gui/res/cardsfolder/upcoming/deeproot_wayfinder.txt new file mode 100644 index 00000000000..bfc51b0c2c4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/deeproot_wayfinder.txt @@ -0,0 +1,9 @@ +Name:Deeproot Wayfinder +ManaCost:1 G +Types:Creature Merfolk Scout +PT:2/3 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | CombatDamage$ True | Execute$ TrigSurveil | TriggerDescription$ Whenever CARDNAME deals combat damage to a player or battle, surveil 1, then you may return a land card from your graveyard to the battlefield tapped. (To surveil 1, look at the top card of your library. You may put that card into your graveyard.) +SVar:TrigSurveil:DB$ Surveil | Amount$ 1 | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Optional$ True | ChangeType$ Land.YouOwn | Origin$ Graveyard | Destination$ Battlefield | Hidden$ True | ChangeNum$ 1 | Tapped$ True +DeckHas:Ability$Graveyard +Oracle:Whenever Deeproot Wayfinder deals combat damage to a player or battle, surveil 1, then you may return a land card from your graveyard to the battlefield tapped. (To surveil 1, look at the top card of your library. You may put that card into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/dusk_legion_duelist.txt b/forge-gui/res/cardsfolder/upcoming/dusk_legion_duelist.txt new file mode 100644 index 00000000000..9f0d9d3b3c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dusk_legion_duelist.txt @@ -0,0 +1,9 @@ +Name:Dusk Legion Duelist +ManaCost:1 W +Types:Creature Vampire Soldier +PT:2/2 +K:Vigilance +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | ActivationLimit$ 1 | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigDraw | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, draw a card. This ability triggers only once each turn. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +DeckHints:Ability$Counters +Oracle:Vigilance\nWhenever one or more +1/+1 counters are put on Dusk Legion Duelist, draw a card. This ability triggers only once each turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/glistening_deluge.txt b/forge-gui/res/cardsfolder/upcoming/glistening_deluge.txt new file mode 100644 index 00000000000..4d716cd75dd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glistening_deluge.txt @@ -0,0 +1,6 @@ +Name:Glistening Deluge +ManaCost:1 B B +Types:Sorcery +A:SP$ PumpAll | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 | SubAbility$ DBDebuff | SpellDescription$ All creatures get -1/-1 until end of turn. Creatures that are green and/or white get an additional -2/-2 until end of turn. +SVar:DBDebuff:DB$ PumpAll | ValidCards$ Creature.White,Creature.Green | NumAtt$ -2 | NumDef$ -2 +Oracle:All creatures get -1/-1 until end of turn. Creatures that are green and/or white get an additional -2/-2 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/gnottvold_hermit_chrome_host_hulk.txt b/forge-gui/res/cardsfolder/upcoming/gnottvold_hermit_chrome_host_hulk.txt new file mode 100644 index 00000000000..4070f5f22bf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gnottvold_hermit_chrome_host_hulk.txt @@ -0,0 +1,19 @@ +Name:Gnottvold Hermit +ManaCost:3 G +Types:Creature Troll +PT:4/4 +A:AB$ SetState | Cost$ 5 UP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. +AlternateMode:DoubleFaced +Oracle:{5}{U/P}: Transform Gnottvold Hermit. Activate only as a sorcery. ({U/P} can be paid with either {U} or 2 life.) + +ALTERNATE + +Name:Chrome Host Hulk +ManaCost:no cost +Colors:green,blue +Types:Creature Phyrexian Troll +PT:5/5 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigAnimate | TriggerDescription$ Whenever CARDNAME attacks, up to one other target creature has base power and toughness 5/5 until end of turn. +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Creature.Other | TgtPrompt$ Select up to one other target creature | TargetMin$ 0 | TargetMax$ 1 | Power$ 5 | Toughness$ 5 +SVar:HasAttackEffect:TRUE +Oracle:Whenever Chrome Host Hulk attacks, up to one other target creature has base power and toughness 5/5 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/harried_artisan_phyrexian_skyflayer.txt b/forge-gui/res/cardsfolder/upcoming/harried_artisan_phyrexian_skyflayer.txt new file mode 100644 index 00000000000..1907d6ab48c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/harried_artisan_phyrexian_skyflayer.txt @@ -0,0 +1,19 @@ +Name:Harried Artisan +ManaCost:2 R +Types:Creature Human Artificer +PT:2/3 +K:Haste +A:AB$ SetState | Cost$ 3 WP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. +AlternateMode:DoubleFaced +Oracle:Haste\n{3}{W/P}: Transform Harried Artisan. Activate only as a sorcery. ({W/P} can be paid with {W} or 2 life.) + +ALTERNATE + +Name:Phyrexian Skyflayer +ManaCost:no cost +Colors:red,white +Types:Creature Phyrexian Artificer +PT:3/4 +K:Flying +K:Haste +Oracle:Flying, haste \ No newline at end of file From 4da4a333d97cf67cce9c2b2c92ec885a414d0a5a Mon Sep 17 00:00:00 2001 From: tool4ever Date: Fri, 7 Apr 2023 12:23:17 +0200 Subject: [PATCH 23/24] Fix AI cheating with Avacyn's Judgement (#2853) --- .../src/main/java/forge/game/ability/AbilityUtils.java | 9 +++++---- .../main/java/forge/game/ability/effects/PlayEffect.java | 1 + forge-gui/res/cardsfolder/d/dark_apostle.txt | 2 +- forge-gui/res/cardsfolder/d/deep_gnome_terramancer.txt | 2 +- forge-gui/res/cardsfolder/f/followed_footsteps.txt | 2 +- .../cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt | 2 +- forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt | 2 +- 7 files changed, 11 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index e5c27f2041e..30047654ae3 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1783,6 +1783,11 @@ public class AbilityUtils { return doXMath(Integer.parseInt(kicked ? sq[1] : sq[2]), expr, c, ctb); } + // Count$Madness.. + if (sq[0].startsWith("Madness")) { + return doXMath(calculateAmount(c, sq[sa.isMadness() ? 1 : 2], ctb), expr, c, ctb); + } + //Count$HasNumChosenColors. if (sq[0].contains("HasNumChosenColors")) { int sum = 0; @@ -2006,10 +2011,6 @@ public class AbilityUtils { final boolean isMulti = c.getColor().isMulticolor(); return doXMath(Integer.parseInt(sq[isMulti ? 1 : 2]), expr, c, ctb); } - // Count$Madness.. - if (sq[0].startsWith("Madness")) { - return doXMath(calculateAmount(c, sq[c.isMadness() ? 1 : 2], ctb), expr, c, ctb); - } // Count$Foretold.. if (sq[0].startsWith("Foretold")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 2b6006e10ed..d2b8d03f7a3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -314,6 +314,7 @@ public class PlayEffect extends SpellAbilityEffect { // only one mode can be used tgtSA = sa.getActivatingPlayer().getController().getAbilityToPlay(tgtCard, sas); } + // in case player canceled from choice dialog if (tgtSA == null) { if (wasFaceDown) { diff --git a/forge-gui/res/cardsfolder/d/dark_apostle.txt b/forge-gui/res/cardsfolder/d/dark_apostle.txt index 8556399ca79..f5c133c6c1b 100644 --- a/forge-gui/res/cardsfolder/d/dark_apostle.txt +++ b/forge-gui/res/cardsfolder/d/dark_apostle.txt @@ -4,7 +4,7 @@ Types:Creature Astartes Warlock PT:3/3 A:AB$ Effect | PrecostDesc$ Gift of Chaos — | Cost$ 3 T | StaticAbilities$ GrantCascade | Triggers$ ExileEffect | SpellDescription$ The next noncreature spell you cast this turn has cascade. (When you cast that spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom of your library in a random order.) SVar:GrantCascade:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonCreature+YouCtrl | AffectedZone$ Stack | AddKeyword$ Cascade | Description$ The next noncreature spell you cast this turn has cascade. -SVar:ExileEffect:Mode$ SpellCast | EffectZone$ Command | Valid$ Card.nonCreature+YouCtrl | AffectedZone$ Stack | Execute$ RemoveEffect | Static$ True +SVar:ExileEffect:Mode$ SpellCast | EffectZone$ Command | ValidCard$ Card.nonCreature+YouCtrl | AffectedZone$ Stack | Execute$ RemoveEffect | Static$ True SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self DeckHas:Keyword$Cascade Oracle:Gift of Chaos — {3}, {T}: The next noncreature spell you cast this turn has cascade. (When you cast that spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom of your library in a random order.) diff --git a/forge-gui/res/cardsfolder/d/deep_gnome_terramancer.txt b/forge-gui/res/cardsfolder/d/deep_gnome_terramancer.txt index e013dd8dbd7..9f03d4c538b 100644 --- a/forge-gui/res/cardsfolder/d/deep_gnome_terramancer.txt +++ b/forge-gui/res/cardsfolder/d/deep_gnome_terramancer.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Creature Gnome Wizard PT:2/2 K:Flash -T:Mode$ ChangesZoneAll | ValidCards$ Land.OppCtrl | ValidCause$ !LandAbility | Destination$ Battlefield | TriggerZones$ Battlefield | ActivationLimit$ 1 | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ Mold Earth — Whenever one or more lands enter the battlefield under an opponent's control without being played, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle. Do this only once each turn. +T:Mode$ ChangesZoneAll | ValidCards$ Land.OppCtrl | ValidCause$ !LandAbility | Destination$ Battlefield | TriggerZones$ Battlefield | ResolvedLimit$ 1 | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ Mold Earth — Whenever one or more lands enter the battlefield under an opponent's control without being played, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle. Do this only once each turn. SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Card.Plains | ChangeNum$ 1 | ShuffleNonMandatory$ True AI:RemoveDeck:Random Oracle:Flash\nMold Earth — Whenever one or more lands enter the battlefield under an opponent's control without being played, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle. Do this only once each turn. diff --git a/forge-gui/res/cardsfolder/f/followed_footsteps.txt b/forge-gui/res/cardsfolder/f/followed_footsteps.txt index ce02d3e03a9..fdaea176075 100644 --- a/forge-gui/res/cardsfolder/f/followed_footsteps.txt +++ b/forge-gui/res/cardsfolder/f/followed_footsteps.txt @@ -4,5 +4,5 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | ValidTgts$ Creature | AILogic$ HighestEvaluation T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature. -SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted | SpellDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature. +SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted Oracle:Enchant creature\nAt the beginning of your upkeep, create a token that's a copy of enchanted creature. diff --git a/forge-gui/res/cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt b/forge-gui/res/cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt index 7b8fdcde79e..236cd106b80 100644 --- a/forge-gui/res/cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt +++ b/forge-gui/res/cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt @@ -18,7 +18,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ HighestEvaluation T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature, except it's a Spirit in addition to its other types. -SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted | AddTypes$ Spirit | SpellDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature, except it's a Spirit in addition to its other types. +SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted | AddTypes$ Spirit R:Event$ Moved | ValidCard$ Card.Self | Destination$ Graveyard | ReplaceWith$ Exile | Description$ If CARDNAME would be put into a graveyard from anywhere, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard Oracle:Enchant creature\nAt the beginning of your upkeep, create a token that's a copy of enchanted creature, except it's a Spirit in addition to its other types.\nIf Ghastly Mimicry would be put into a graveyard from anywhere, exile it instead. diff --git a/forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt b/forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt index ba5b6fb4583..49590bf287b 100644 --- a/forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt +++ b/forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt @@ -4,7 +4,7 @@ Types:Creature Demon PT:3/3 A:AB$ Effect | PrecostDesc$ Jolly Gutpipes — | Cost$ 2 T Sac<1/Creature> | StaticAbilities$ GrantCascade | Triggers$ ExileEffect | SpellDescription$ The next creature spell you cast this turn has cascade. (When you cast your next creature spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom of your library in a random order.) SVar:GrantCascade:Mode$ Continuous | EffectZone$ Command | Affected$ Card.Creature+YouCtrl | AffectedZone$ Stack | Execute$ ExileEff | AddKeyword$ Cascade | Description$ The next noncreature spell you cast this turn has cascade. -SVar:ExileEffect:Mode$ SpellCast | EffectZone$ Command | Valid$ Card.Creature+YouCtrl | AffectedZone$ Stack | Execute$ RemoveEffect | Static$ True +SVar:ExileEffect:Mode$ SpellCast | EffectZone$ Command | ValidCard$ Card.Creature+YouCtrl | AffectedZone$ Stack | Execute$ RemoveEffect | Static$ True SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self DeckHas:Keyword$Cascade & Ability$Sacrifice Oracle:Jolly Gutpipes — {2}, {T}, Sacrifice a creature: The next creature spell you cast this turn has cascade. (When you cast your next creature spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom of your library in a random order.) From 1f8242026146880dd9598e75ebe003985f14117f Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Fri, 7 Apr 2023 08:13:55 -0400 Subject: [PATCH 24/24] DamageEachEffect refactor + MOM Tandem Takedown / MOC Great Aerie (#2814) * DamageEachEffect refactor * AiAttackController refactor param * SpellAbilityEffect.tokenizeString use joinHomogenous * refactor old cards, add tandem_takedown.txt * the_great_aerie.txt + Support + refactor grim_contest.txt --- .../java/forge/ai/AiAttackController.java | 2 +- .../main/java/forge/ai/ability/FightAi.java | 4 - .../game/ability/SpellAbilityEffect.java | 20 ++--- .../ability/effects/DamageEachEffect.java | 81 +++++++++---------- .../game/ability/effects/FightEffect.java | 5 +- forge-gui/res/cardsfolder/a/alpha_brawl.txt | 9 +-- forge-gui/res/cardsfolder/b/band_together.txt | 8 +- forge-gui/res/cardsfolder/c/combo_attack.txt | 8 +- forge-gui/res/cardsfolder/g/grim_contest.txt | 4 +- .../res/cardsfolder/l/living_inferno.txt | 10 +-- .../res/cardsfolder/n/nissas_judgment.txt | 5 +- .../res/cardsfolder/s/sarkhan_the_mad.txt | 8 +- .../cardsfolder/s/sarkhan_the_masterless.txt | 3 +- forge-gui/res/cardsfolder/s/solar_blaze.txt | 3 +- .../res/cardsfolder/t/the_akroan_war.txt | 3 +- .../cardsfolder/upcoming/tandem_takedown.txt | 6 ++ .../cardsfolder/upcoming/the_great_aerie.txt | 11 +++ .../res/cardsfolder/w/wave_of_reckoning.txt | 4 +- 18 files changed, 83 insertions(+), 111 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/tandem_takedown.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/the_great_aerie.txt diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index dc114298e86..2857e710e9c 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -257,7 +257,7 @@ public class AiAttackController { continue; } - if (sa.getApi() == ApiType.EachDamage && "TriggeredAttacker".equals(sa.getParam("DefinedPlayers"))) { + if (sa.getApi() == ApiType.EachDamage && "TriggeredAttacker".equals(sa.getParam("Defined"))) { List valid = CardLists.getValidCards(c.getController().getCreaturesInPlay(), sa.getParam("ValidCards"), c.getController(), c, sa); // TODO: this assumes that 1 damage is dealt per creature. Improve this to check the parameter/X to determine // how much damage is dealt by each of the creatures in the valid list. diff --git a/forge-ai/src/main/java/forge/ai/ability/FightAi.java b/forge-ai/src/main/java/forge/ai/ability/FightAi.java index a1e5b42bff1..4a3765d8111 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FightAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FightAi.java @@ -24,10 +24,6 @@ import forge.util.MyRandom; public class FightAi extends SpellAbilityAi { @Override protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { - if (sa.hasParam("FightWithToughness")) { - // TODO: add ailogic - return false; - } return super.checkAiLogic(ai, sa, aiLogic); } diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index dc80ac97a5c..8380e925ee7 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -1,28 +1,15 @@ package forge.game.ability; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; - -import org.apache.commons.lang3.StringUtils; - import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Table; - import forge.GameCommand; import forge.card.MagicColor; import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObject; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardUtil; -import forge.game.card.CardZoneTable; +import forge.game.card.*; import forge.game.combat.Combat; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -41,6 +28,9 @@ import forge.util.Lang; import forge.util.Localizer; import forge.util.TextUtil; import forge.util.collect.FCollection; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; /** *

@@ -192,7 +182,7 @@ public abstract class SpellAbilityEffect { } else { objs = AbilityUtils.getDefinedObjects(sa.getHostCard(), t, sa); } - sb.append(StringUtils.join(objs, ", ")); + sb.append(Lang.joinHomogenous(objs)); } } else { sb.append(t); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java index 05bdcab6883..c8132d0b254 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java @@ -5,6 +5,7 @@ import forge.game.GameEntity; import forge.game.GameEntityCounterTable; import forge.game.ability.AbilityUtils; import forge.game.card.Card; +import forge.game.card.CardCollection; import forge.game.card.CardDamageMap; import forge.game.card.CardLists; import forge.game.spellability.SpellAbility; @@ -20,10 +21,9 @@ public class DamageEachEffect extends DamageBaseEffect { @Override protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - final String damage = sa.getParam("NumDmg"); - final int iDmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa); + final int iDmg = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumDmg"), sa); - String desc = sa.getParam("ValidCards"); + String desc = sa.getParamOrDefault("ValidCards", ""); if (sa.hasParam("ValidDescription")) { desc = sa.getParam("ValidDescription"); } @@ -35,18 +35,9 @@ public class DamageEachEffect extends DamageBaseEffect { dmg += iDmg + " damage"; } - if (sa.hasParam("StackDescription")) { - sb.append(sa.getParam("StackDescription")); - } else { - sb.append("Each ").append(desc).append(" deals ").append(dmg).append(" to "); - Lang.joinHomogenous(getTargetPlayers(sa)); - if (sa.hasParam("DefinedCards")) { - if (sa.getParam("DefinedCards").equals("Self")) { - sb.append(" itself"); - } - } - } - sb.append("."); + sb.append("Each ").append(desc).append(" deals ").append(dmg).append(" to "); + sb.append(Lang.joinHomogenous(getTargetEntities(sa))).append("."); + return sb.toString(); } @@ -58,10 +49,16 @@ public class DamageEachEffect extends DamageBaseEffect { public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); final Game game = card.getGame(); + final String num = sa.getParamOrDefault("NumDmg", "X"); - FCollectionView sources = game.getCardsIn(ZoneType.Battlefield); - if (sa.hasParam("ValidCards")) { - sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), sa.getActivatingPlayer(), card, sa); + FCollectionView sources; + if (sa.hasParam("DefinedDamagers")) { + sources = AbilityUtils.getDefinedCards(card, sa.getParam("DefinedDamagers"), sa); + } else { + sources = game.getCardsIn(ZoneType.Battlefield); + if (sa.hasParam("ValidCards")) { + sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), sa.getActivatingPlayer(), card, sa); + } } boolean usedDamageMap = true; @@ -77,12 +74,30 @@ public class DamageEachEffect extends DamageBaseEffect { usedDamageMap = false; } - for (final GameEntity ge : getTargetEntities(sa, "DefinedPlayers")) { + if (sa.hasParam("EachToItself")) { for (final Card source : sources) { final Card sourceLKI = game.getChangeZoneLKIInfo(source); - // TODO shouldn't that be using Num or something first? - final int dmg = AbilityUtils.calculateAmount(source, "X", sa); + final int dmg = AbilityUtils.calculateAmount(source, num, sa); + damageMap.put(sourceLKI, source, dmg); + } + } else if (sa.hasParam("ToEachOther")) { + final CardCollection targets = AbilityUtils.getDefinedCards(card, sa.getParam("ToEachOther"), sa); + for (final Card damager : targets) { + for (final Card c : targets) { + if (!c.equals(damager)) { + final Card sourceLKI = game.getChangeZoneLKIInfo(damager); + + final int dmg = AbilityUtils.calculateAmount(damager, num, sa); + damageMap.put(sourceLKI, c, dmg); + } + } + } + } else for (final GameEntity ge : getTargetEntities(sa)) { + for (final Card source : sources) { + final Card sourceLKI = game.getChangeZoneLKIInfo(source); + + final int dmg = AbilityUtils.calculateAmount(source, num, sa); if (ge instanceof Card) { final Card c = (Card) ge; @@ -95,30 +110,6 @@ public class DamageEachEffect extends DamageBaseEffect { } } - if (sa.hasParam("DefinedCards")) { - if (sa.getParam("DefinedCards").equals("Self")) { - for (final Card source : sources) { - final Card sourceLKI = game.getChangeZoneLKIInfo(source); - - final int dmg = AbilityUtils.calculateAmount(source, "X", sa); - damageMap.put(sourceLKI, source, dmg); - } - } - if (sa.getParam("DefinedCards").equals("Remembered")) { - for (final Card source : sources) { - final int dmg = AbilityUtils.calculateAmount(source, "X", sa); - final Card sourceLKI = source.getGame().getChangeZoneLKIInfo(source); - - for (final Object o : card.getRemembered()) { - if (o instanceof Card) { - Card rememberedcard = (Card) o; - damageMap.put(sourceLKI, rememberedcard, dmg); - } - } - } - } - } - if (!usedDamageMap) { game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java index eea60ea34ea..b9d7bba8d09 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java @@ -147,7 +147,6 @@ public class FightEffect extends DamageBaseEffect { } private void dealDamage(final SpellAbility sa, Card fighterA, Card fighterB) { - boolean fightToughness = sa.hasParam("FightWithToughness"); boolean usedDamageMap = true; CardDamageMap damageMap = sa.getDamageMap(); @@ -168,11 +167,11 @@ public class FightEffect extends DamageBaseEffect { // 701.12c If a creature fights itself, it deals damage to itself equal to twice its power. - final int dmg1 = fightToughness ? fighterA.getNetToughness() : fighterA.getNetPower(); + final int dmg1 = fighterA.getNetPower(); if (fighterA.equals(fighterB)) { damageMap.put(fighterA, fighterA, dmg1 * 2); } else { - final int dmg2 = fightToughness ? fighterB.getNetToughness() : fighterB.getNetPower(); + final int dmg2 = fighterB.getNetPower(); damageMap.put(fighterA, fighterB, dmg1); damageMap.put(fighterB, fighterA, dmg2); diff --git a/forge-gui/res/cardsfolder/a/alpha_brawl.txt b/forge-gui/res/cardsfolder/a/alpha_brawl.txt index 35b7b736ef1..1536ed25a2a 100644 --- a/forge-gui/res/cardsfolder/a/alpha_brawl.txt +++ b/forge-gui/res/cardsfolder/a/alpha_brawl.txt @@ -1,12 +1,9 @@ Name:Alpha Brawl ManaCost:6 R R Types:Sorcery -A:SP$ Pump | Cost$ 6 R R | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberTargets$ True | StackDescription$ None | SubAbility$ AlphaAttack | SpellDescription$ Target creature an opponent controls deals damage equal to its power to each other creature that player controls, then each of those creatures deals damage equal to its power to that creature. -SVar:AlphaAttack:DB$ DamageAll | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | DamageSource$ Targeted | NumDmg$ Y | SubAbility$ SucksToBeAlpha | StackDescription$ Targeted creature deals damage equal to its power to each other creature that player controls, -SVar:SucksToBeAlpha:DB$ EachDamage | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | ValidDescription$ of those creatures | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ then each of those creatures deals damage equal to its power to that creature -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. +A:SP$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberTargets$ True | SubAbility$ AlphaAttack | StackDescription$ {c:Targeted} | SpellDescription$ Target creature an opponent controls +SVar:AlphaAttack:DB$ DamageAll | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | DamageSource$ Targeted | NumDmg$ Remembered$CardPower | SubAbility$ SucksToBeAlpha | StackDescription$ SpellDescription | SpellDescription$ deals damage equal to its power to each other creature that player controls, +SVar:SucksToBeAlpha:DB$ EachDamage | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | NumDmg$ Count$CardPower | Defined$ Remembered | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ then each of those creatures deals damage equal to its power to that creature. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$CardPower -SVar:Y:Remembered$CardPower AI:RemoveDeck:All Oracle:Target creature an opponent controls deals damage equal to its power to each other creature that player controls, then each of those creatures deals damage equal to its power to that creature. diff --git a/forge-gui/res/cardsfolder/b/band_together.txt b/forge-gui/res/cardsfolder/b/band_together.txt index bccc9118373..d2aaf8bbe13 100644 --- a/forge-gui/res/cardsfolder/b/band_together.txt +++ b/forge-gui/res/cardsfolder/b/band_together.txt @@ -1,10 +1,6 @@ Name:Band Together ManaCost:2 G Types:Instant -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures you control | ImprintCards$ ThisTargetedCard | AILogic$ PowerDmg | SubAbility$ DBPump | TargetMin$ 0 | TargetMax$ 2 | StackDescription$ SpellDescription | SpellDescription$ Up to two target creatures you control each deal damage equal to their power to another target creature. -SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to be dealt damage | RememberObjects$ ThisTargetedCard | IsCurse$ True | SubAbility$ DBEachDamage | StackDescription$ None -SVar:DBEachDamage:DB$ EachDamage | ValidCards$ Creature.IsImprinted | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ None -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:X:Count$CardPower -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +A:SP$ Pump | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures you control | AILogic$ PowerDmg | SubAbility$ DBEachDamage | StackDescription$ {c:ThisTargetedCard} | SpellDescription$ Up to two target creatures you control +SVar:DBEachDamage:DB$ EachDamage | DefinedDamagers$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select another target creature | TargetUnique$ True | NumDmg$ Count$CardPower | StackDescription$ REP another target creature_{c:ThisTargetedCard} | SpellDescription$ each deal damage equal to their power to another target creature. Oracle:Up to two target creatures you control each deal damage equal to their power to another target creature. diff --git a/forge-gui/res/cardsfolder/c/combo_attack.txt b/forge-gui/res/cardsfolder/c/combo_attack.txt index 5c93f311137..616cb242fd2 100644 --- a/forge-gui/res/cardsfolder/c/combo_attack.txt +++ b/forge-gui/res/cardsfolder/c/combo_attack.txt @@ -1,10 +1,6 @@ Name:Combo Attack ManaCost:2 G Types:Sorcery -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature.YourTeamCtrl | TgtPrompt$ Select two target creatures your team controls | ImprintCards$ ThisTargetedCard | TargetMin$ 2 | TargetMax$ 2 | AILogic$ PowerDmg | SubAbility$ DBPump | StackDescription$ SpellDescription | SpellDescription$ Two target creatures your team controls each deal damage equal to their power to target creature. -SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to be dealt damage | RememberObjects$ ThisTargetedCard | IsCurse$ True | SubAbility$ DBEachDamage | StackDescription$ None -SVar:DBEachDamage:DB$ EachDamage | ValidCards$ Creature.IsImprinted | NumDmg$ X | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ None -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:X:Count$CardPower -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +A:SP$ Pump | ValidTgts$ Creature.YourTeamCtrl | TgtPrompt$ Select two target creatures your team controls | TargetMin$ 2 | TargetMax$ 2 | SubAbility$ DBEachDamage | StackDescription$ {c:ThisTargetedCard} | SpellDescription$ Two target creatures your team controls +SVar:DBEachDamage:DB$ EachDamage | ValidTgts$ Creature | DefinedDamagers$ ParentTarget | NumDmg$ Count$CardPower | StackDescription$ REP target creature_{c:ThisTargetedCard} | SpellDescription$ each deal damage equal to their power to target creature. Oracle:Two target creatures your team controls each deal damage equal to their power to target creature. diff --git a/forge-gui/res/cardsfolder/g/grim_contest.txt b/forge-gui/res/cardsfolder/g/grim_contest.txt index e4ee269a31f..f611e491109 100644 --- a/forge-gui/res/cardsfolder/g/grim_contest.txt +++ b/forge-gui/res/cardsfolder/g/grim_contest.txt @@ -1,7 +1,7 @@ Name:Grim Contest ManaCost:1 B G Types:Instant -A:SP$ Pump | Cost$ 1 B G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBFight | SpellDescription$ Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. -SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | FightWithToughness$ True +A:SP$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBEachDamage | StackDescription$ None | SpellDescription$ Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. +SVar:DBEachDamage:DB$ EachDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | ToEachOther$ Targeted | NumDmg$ Count$CardToughness | StackDescription$ {c:Targeted} each deal damage equal to its toughness to the other. AI:RemoveDeck:All Oracle:Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. diff --git a/forge-gui/res/cardsfolder/l/living_inferno.txt b/forge-gui/res/cardsfolder/l/living_inferno.txt index 4685a02324b..a4e908cb8e0 100644 --- a/forge-gui/res/cardsfolder/l/living_inferno.txt +++ b/forge-gui/res/cardsfolder/l/living_inferno.txt @@ -2,12 +2,8 @@ Name:Living Inferno ManaCost:6 R R Types:Creature Elemental PT:8/5 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ FirePower | TargetMin$ Min | TargetMax$ FirePower | DividedAsYouChoose$ FirePower | SubAbility$ Retribution | RememberTargets$ True | SpellDescription$ CARDNAME deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to CARDNAME. -SVar:Retribution:DB$ EachDamage | ValidCards$ Creature.IsRemembered | ValidDescription$ of those creatures | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedPlayers$ Self | SubAbility$ DBCleanup | StackDescription$ then each of those creatures deals damage equal to its power to CARDNAME -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$CardPower -SVar:FirePower:Count$CardPower -SVar:Min:SVar$FirePower/LimitMax.1 +A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select any number of target creatures | NumDmg$ Count$CardPower | TargetMin$ Min | TargetMax$ Count$CardPower | DividedAsYouChoose$ Count$CardPower | SubAbility$ Retribution | SpellDescription$ CARDNAME deals damage equal to its power divided as you choose among any number of target creatures. +SVar:Retribution:DB$ EachDamage | DefinedDamagers$ ParentTarget | NumDmg$ Count$CardPower | Defined$ Self | StackDescription$ SpellDescription | SpellDescription$ Each of those creatures deals damage equal to its power to CARDNAME. AI:RemoveDeck:Random +SVar:Min:Count$CardPower/LimitMax.1 Oracle:{T}: Living Inferno deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to Living Inferno. diff --git a/forge-gui/res/cardsfolder/n/nissas_judgment.txt b/forge-gui/res/cardsfolder/n/nissas_judgment.txt index f6279c660a3..faaca10f539 100644 --- a/forge-gui/res/cardsfolder/n/nissas_judgment.txt +++ b/forge-gui/res/cardsfolder/n/nissas_judgment.txt @@ -1,8 +1,9 @@ Name:Nissa's Judgment ManaCost:4 G Types:Sorcery -A:SP$ PutCounter | Cost$ 4 G | AILogic$ PowerDmg | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DealToCreature | SpellDescription$ Support 2. (Put a +1/+1 counter on each of up to two target creatures.) -SVar:DealToCreature:DB$ EachDamage | AILogic$ PowerDmg | ValidCards$ Creature.YouCtrl+counters_GE1_P1P1 | NumDmg$ X | TgtPrompt$ Choose target creature opponent controls | ValidTgts$ Creature.OppCtrl | TargetMin$ 0 | TargetMax$ 1 | SpellDescription$ Each creature you control with a +1/+1 counter deals damage equal to its power to target creature opponent controls. +A:SP$ PutCounter | AILogic$ PowerDmg | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creatures | CounterType$ P1P1 | SubAbility$ DealToCreature | StackDescription$ REP ._. ({c:ThisTargetedCard}) | SpellDescription$ Support 2. (Put a +1/+1 counter on each of up to two target creatures.) +SVar:DealToCreature:DB$ EachDamage | ValidCards$ Creature.YouCtrl+counters_GE1_P1P1 | NumDmg$ X | TgtPrompt$ Select up to one target creature an opponent controls | ValidTgts$ Creature.OppCtrl | TargetMin$ 0 | TargetMax$ 1 | StackDescription$ REP target creature opponent controls_{c:ThisTargetedCard} | SpellDescription$ Each creature you control with a +1/+1 counter deals damage equal to its power to target creature opponent controls. SVar:X:Count$CardPower +DeckHas:Ability$Counters AI:RemoveDeck:All Oracle:Support 2. (Put a +1/+1 counter on each of up to two target creatures.)\nChoose up to one target creature an opponent controls. Each creature you control with a +1/+1 counter on it deals damage equal to its power to that creature. diff --git a/forge-gui/res/cardsfolder/s/sarkhan_the_mad.txt b/forge-gui/res/cardsfolder/s/sarkhan_the_mad.txt index 749b6c12705..e260a5173db 100644 --- a/forge-gui/res/cardsfolder/s/sarkhan_the_mad.txt +++ b/forge-gui/res/cardsfolder/s/sarkhan_the_mad.txt @@ -6,10 +6,8 @@ A:AB$ Dig | Cost$ AddCounter<0/LOYALTY> | DigNum$ 1 | Reveal$ True | ChangeNum$ SVar:DBDamage:DB$ DealDamage | Defined$ Self | NumDmg$ Y | SubAbility$ DBCleanup | AILogic$ MadSarkhanDigDmg SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Y:Remembered$CardManaCost -A:AB$ Destroy | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Sacrifice$ True | SubAbility$ DBToken | Planeswalker$ True | AILogic$ MadSarkhanDragon | SpellDescription$ Target creature's controller sacrifices it, then that player creates a 5/5 red Dragon creature token with flying. +A:AB$ Destroy | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature | Sacrifice$ True | SubAbility$ DBToken | Planeswalker$ True | AILogic$ MadSarkhanDragon | SpellDescription$ Target creature's controller sacrifices it, then that player creates a 5/5 red Dragon creature token with flying. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_5_5_dragon_flying | TokenOwner$ TargetedController -#for this AF, the DefinedCards$ Self is the target for Each damaging. They EachDamage themselves. -A:AB$ EachDamage | Cost$ SubCounter<4/LOYALTY> | ValidCards$ Dragon.Creature+YouCtrl | ValidDescription$ Dragon creature you control | NumDmg$ X | DamageDesc$ damage equal to its power | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | Planeswalker$ True | Ultimate$ True | AILogic$ MadSarkhanUltimate | SpellDescription$ Each Dragon creature you control deals damage equal to its power to target player or planeswalker. -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:X:Count$CardPower +A:AB$ EachDamage | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Dragon.Creature+YouCtrl | ValidDescription$ Dragon creature you control | NumDmg$ Count$CardPower | DamageDesc$ damage equal to its power | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | AILogic$ MadSarkhanUltimate | SpellDescription$ Each Dragon creature you control deals damage equal to its power to target player or planeswalker. +DeckHas:Ability$Sacrifice|Token & Type$Dragon Oracle:[0]: Reveal the top card of your library and put it into your hand. Sarkhan the Mad deals damage to himself equal to that card's mana value.\n[-2]: Target creature's controller sacrifices it, then that player creates a 5/5 red Dragon creature token with flying.\n[-4]: Each Dragon creature you control deals damage equal to its power to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/s/sarkhan_the_masterless.txt b/forge-gui/res/cardsfolder/s/sarkhan_the_masterless.txt index 8be155f720e..ecf99149a3b 100644 --- a/forge-gui/res/cardsfolder/s/sarkhan_the_masterless.txt +++ b/forge-gui/res/cardsfolder/s/sarkhan_the_masterless.txt @@ -3,8 +3,7 @@ ManaCost:3 R R Types:Legendary Planeswalker Sarkhan Loyalty:5 T:Mode$ Attacks | ValidCard$ Creature | Attacked$ You,Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature attacks you or a planeswalker you control, each Dragon you control deals 1 damage to that creature. -SVar:TrigDamage:DB$ EachDamage | ValidCards$ Dragon.YouCtrl | DefinedPlayers$ TriggeredAttacker | StackDescription$ Each Dragon you control deals 1 damage to that creature. -SVar:X:Number$1 +SVar:TrigDamage:DB$ EachDamage | ValidCards$ Dragon.YouCtrl | NumDmg$ 1 | Defined$ TriggeredAttacker A:AB$ AnimateAll | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Power$ 4 | Toughness$ 4 | Types$ Creature,Dragon | Colors$ Red | OverwriteColors$ True | RemoveCardTypes$ True | Keywords$ Flying | ValidCards$ Planeswalker.YouCtrl | AILogic$ Always | SpellDescription$ Until end of turn, each planeswalker you control becomes a 4/4 red Dragon creature and gains flying. A:AB$ Token | Cost$ SubCounter<3/LOYALTY> | TokenAmount$ 1 | TokenScript$ r_4_4_dragon_flying | TokenOwner$ You | Planeswalker$ True | SpellDescription$ Create a 4/4 red Dragon creature token with flying. DeckHas:Ability$Token diff --git a/forge-gui/res/cardsfolder/s/solar_blaze.txt b/forge-gui/res/cardsfolder/s/solar_blaze.txt index 9023c23c6ee..c1543f5351e 100644 --- a/forge-gui/res/cardsfolder/s/solar_blaze.txt +++ b/forge-gui/res/cardsfolder/s/solar_blaze.txt @@ -1,8 +1,7 @@ Name:Solar Blaze ManaCost:2 R W Types:Sorcery -A:SP$ EachDamage | Cost$ 2 R W | ValidCards$ Creature | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each creature deals damage to itself equal to its power. -SVar:X:Count$CardPower +A:SP$ EachDamage | ValidCards$ Creature | EachToItself$ True | NumDmg$ Count$CardPower | StackDescription$ SpellDescription | SpellDescription$ Each creature deals damage to itself equal to its power. AI:RemoveDeck:All AI:RemoveDeck:Random Oracle:Each creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/t/the_akroan_war.txt b/forge-gui/res/cardsfolder/t/the_akroan_war.txt index f1700f0f7ac..1aa27ffe828 100644 --- a/forge-gui/res/cardsfolder/t/the_akroan_war.txt +++ b/forge-gui/res/cardsfolder/t/the_akroan_war.txt @@ -5,6 +5,5 @@ K:Saga:3:DBGainControl,DBAllAttack,DBDamageTapped SVar:DBGainControl:DB$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ LeavesPlay | SpellDescription$ Gain control of target creature for as long as CARDNAME remains on the battlefield. SVar:DBAllAttack:DB$ Effect | Duration$ UntilYourNextTurn | StaticAbilities$ MustAttack | SpellDescription$ Until your next turn, creatures your opponents control attack each combat if able. SVar:MustAttack:Mode$ MustAttack | ValidCreature$ Creature.OppCtrl | Description$ Until your next turn, creatures your opponents control attack each combat if able. -SVar:DBDamageTapped:DB$ EachDamage | ValidCards$ Creature.tapped | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each tapped creature deals damage to itself equal to its power. -SVar:X:Count$CardPower +SVar:DBDamageTapped:DB$ EachDamage | ValidCards$ Creature.tapped | NumDmg$ Count$CardPower | EachToItself$ True | SpellDescription$ Each tapped creature deals damage to itself equal to its power. Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Gain control of target creature for as long as The Akroan War remains on the battlefield.\nII — Until your next turn, creatures your opponents control attack each combat if able.\nIII — Each tapped creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/upcoming/tandem_takedown.txt b/forge-gui/res/cardsfolder/upcoming/tandem_takedown.txt new file mode 100644 index 00000000000..67a179cf6c6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tandem_takedown.txt @@ -0,0 +1,6 @@ +Name:Tandem Takedown +ManaCost:1 G G +Types:Instant +A:SP$ Pump | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures you control | NumAtt$ +1 | AILogic$ PowerDmg | SubAbility$ DBEachDamage | StackDescription$ REP Up to two target creatures you control_{c:ThisTargetedCard} | SpellDescription$ Up to two target creatures you control each get +1/+0 until end of turn. +SVar:DBEachDamage:DB$ EachDamage | ValidTgts$ Creature,Planeswalker,Battle | TgtPrompt$ Select another target creature, planeswalker, or battle | TargetUnique$ True | DefinedDamagers$ ParentTarget | NumDmg$ Count$CardPower | StackDescription$ REP another target creature, planeswalker, or battle_{c:ThisTargetedCard} | SpellDescription$ They each deal damage equal to their power to another target creature, planeswalker, or battle. +Oracle:Up to two target creatures you control each get +1/+0 until end of turn. They each deal damage equal to their power to another target creature, planeswalker, or battle. diff --git a/forge-gui/res/cardsfolder/upcoming/the_great_aerie.txt b/forge-gui/res/cardsfolder/upcoming/the_great_aerie.txt new file mode 100644 index 00000000000..fe758b5b931 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_great_aerie.txt @@ -0,0 +1,11 @@ +Name:The Great Aerie +ManaCost:no cost +Types:Plane Tarkir +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigBolster | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, bolster 3. (Choose a creature with the least toughness among creatures you control and put three +1/+1 counters on it.) +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBolster | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, bolster 3. (Choose a creature with the least toughness among creatures you control and put three +1/+1 counters on it.) +SVar:TrigBolster:DB$ PutCounter | Bolster$ True | CounterNum$ 3 | CounterType$ P1P1 +T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, choose up to one target creature you control and up to one target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. +SVar:RolledChaos:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose up to one target creature you control | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBEachDamage +SVar:DBEachDamage:DB$ EachDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose up to one target creature an opponent controls | TargetMin$ 0 | TargetMax$ 1 | ToEachOther$ Targeted | NumDmg$ Count$CardToughness +DeckHas:Ability$Counters +Oracle:When you planeswalk to The Great Aerie and at the beginning of your upkeep, bolster 3. (Choose a creature with the least toughness among creatures you control and put three +1/+1 counters on it.)\nWhenever chaos ensues, choose up to one target creature you control and up to one target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. diff --git a/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt b/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt index b8fe19278c8..c2504a0a110 100644 --- a/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt +++ b/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt @@ -1,9 +1,7 @@ Name:Wave of Reckoning ManaCost:4 W Types:Sorcery -#for this AF, the DefinedCards$ Self is the target for Each damaging. They EachDamage themselves. -A:SP$ EachDamage | Cost$ 4 W | ValidCards$ Creature | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each creature deals damage to itself equal to its power. -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. +A:SP$ EachDamage | ValidCards$ Creature | EachToItself$ True | NumDmg$ Count$CardPower | StackDescription$ SpellDescription | SpellDescription$ Each creature deals damage to itself equal to its power. SVar:X:Count$CardPower AI:RemoveDeck:All AI:RemoveDeck:Random