From 7ffd7b1d63c706c476f62c8a014fa619cd23aa5a Mon Sep 17 00:00:00 2001 From: misha-colbourne Date: Thu, 22 Aug 2024 01:19:25 +0100 Subject: [PATCH 01/33] Added check for frozen enemy to enemy idle anim condition --- .../src/forge/adventure/character/EnemySprite.java | 8 +++++--- forge-gui-mobile/src/forge/adventure/stage/MapStage.java | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java index aa1c2f1f4ad..a4652e3ca8f 100644 --- a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java @@ -324,7 +324,8 @@ public class EnemySprite extends CharacterSprite implements Steerable { if (_freeze){ //Mob has defeated player in battle, hold still until player has a chance to move away. //Without this moving enemies can immediately restart battle. - if (spriteToPlayer.len() < unfreezeRange) { + float distance = spriteToPlayer.len(); + if (distance < unfreezeRange) { timer += delta; return Vector2.Zero; } @@ -635,7 +636,8 @@ public class EnemySprite extends CharacterSprite implements Steerable { } - - + public boolean isFrozen() { + return _freeze; + } } diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index 4d2d6ff2be1..eb71fabadf7 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -959,10 +959,11 @@ public class MapStage extends GameStage { } else { Vector2 destination = mob.getTargetVector(player, verticesNearPlayer, delta); - if (destination.epsilonEquals(mob.pos()) && !mob.aggro) { + if (mob.isFrozen() || (destination.epsilonEquals(mob.pos()) && !mob.aggro)) { mob.setAnimation(CharacterSprite.AnimationTypes.Idle); continue; } + if (destination.equals(mob.targetVector) && mob.getNavPath() != null) navPath = mob.getNavPath(); From 663a712852e8b41dd08225f140c32abbc5889939 Mon Sep 17 00:00:00 2001 From: misha-colbourne Date: Thu, 22 Aug 2024 19:31:06 +0100 Subject: [PATCH 02/33] Fixed missing elements from HUD when not on world map (now translucent instead of invisible) --- forge-gui-mobile/src/forge/adventure/stage/GameHUD.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 091106d08c7..874a720dd0d 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -689,10 +689,10 @@ public class GameHUD extends Stage { setVisibility(mapborder, visible); setVisibility(openMapActor, visible); setVisibility(miniMapPlayer, visible); - setVisibility(gamehud, visible); - setVisibility(lifePoints, visible); - setVisibility(shards, visible); - setVisibility(money, visible); + setAlpha(gamehud, visible); + setAlpha(lifePoints, visible); + setAlpha(shards, visible); + setAlpha(money, visible); setVisibility(blank, visible); setDisabled(exitToWorldMapActor, !MapStage.getInstance().isInMap(), "[%120][+ExitToWorldMap]", "---"); setDisabled(bookmarkActor, !MapStage.getInstance().isInMap(), "[%120][+Bookmark]", "---"); From 478ad3a1353e11fead13283d652d63eeedd9d6a9 Mon Sep 17 00:00:00 2001 From: misha-colbourne Date: Fri, 23 Aug 2024 00:24:49 +0100 Subject: [PATCH 03/33] Font tag size constants, cleaned up unused variables I added --- forge-gui-mobile/src/forge/adventure/stage/GameHUD.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 874a720dd0d..0417e9882d8 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -690,9 +690,12 @@ public class GameHUD extends Stage { setVisibility(openMapActor, visible); setVisibility(miniMapPlayer, visible); setAlpha(gamehud, visible); - setAlpha(lifePoints, visible); - setAlpha(shards, visible); - setAlpha(money, visible); + +// misha-colbourne: Commented these out to keep them visible in non-worldmap scenes +// setAlpha(lifePoints, visible); +// setAlpha(shards, visible); +// setAlpha(money, visible); + setVisibility(blank, visible); setDisabled(exitToWorldMapActor, !MapStage.getInstance().isInMap(), "[%120][+ExitToWorldMap]", "---"); setDisabled(bookmarkActor, !MapStage.getInstance().isInMap(), "[%120][+Bookmark]", "---"); From b9c576ad5d329fffe59929e39a965125635ea012 Mon Sep 17 00:00:00 2001 From: misha-colbourne Date: Fri, 23 Aug 2024 01:28:01 +0100 Subject: [PATCH 04/33] Font tag size constants, cleaned up unused variables I added --- forge-gui-mobile/src/forge/adventure/stage/GameHUD.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 0417e9882d8..39aed62ff52 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -689,12 +689,12 @@ public class GameHUD extends Stage { setVisibility(mapborder, visible); setVisibility(openMapActor, visible); setVisibility(miniMapPlayer, visible); - setAlpha(gamehud, visible); + setVisibility(gamehud, visible); // misha-colbourne: Commented these out to keep them visible in non-worldmap scenes -// setAlpha(lifePoints, visible); -// setAlpha(shards, visible); -// setAlpha(money, visible); + setAlpha(lifePoints, visible); + setAlpha(shards, visible); + setAlpha(money, visible); setVisibility(blank, visible); setDisabled(exitToWorldMapActor, !MapStage.getInstance().isInMap(), "[%120][+ExitToWorldMap]", "---"); From 2ec00616409d32bc136e50807b185b1a981d074a Mon Sep 17 00:00:00 2001 From: misha-colbourne Date: Fri, 23 Aug 2024 01:36:04 +0100 Subject: [PATCH 05/33] Removed lingering outdated comment --- forge-gui-mobile/src/forge/adventure/stage/GameHUD.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 39aed62ff52..97d3dc3614e 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -691,7 +691,6 @@ public class GameHUD extends Stage { setVisibility(miniMapPlayer, visible); setVisibility(gamehud, visible); -// misha-colbourne: Commented these out to keep them visible in non-worldmap scenes setAlpha(lifePoints, visible); setAlpha(shards, visible); setAlpha(money, visible); From 45353b6d73712f6f76bf524a37668b8567679422 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Aug 2024 07:38:42 +0300 Subject: [PATCH 06/33] Fix Scry AI that requires targeting (Kozilek's Command) (#5972) * - Fix Scry AI that requires targeting (Kozilek's Command) * - Slight tweak to targeted Scry AI. --- .../main/java/forge/ai/ability/ScryAi.java | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java index ee98d496455..0c14cd7c3e0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java @@ -26,11 +26,29 @@ public class ScryAi extends SpellAbilityAi { */ @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - if (sa.usesTargeting()) { // It doesn't appear that Scry ever targets + if (sa.usesTargeting()) { // ability is targeted sa.resetTargets(); - sa.getTargets().add(ai); + if (sa.canTarget(ai)) { + sa.getTargets().add(ai); + } else { + for (Player p : ai.getAllies()) { + if (sa.canTarget(p)) { + sa.getTargets().add(p); + break; + } + } + if (mandatory && !sa.isTargetNumberValid()) { + for (Player p : ai.getOpponents()) { + if (sa.canTarget(p)) { + sa.getTargets().add(p); + break; + } + } + } + } + return mandatory || sa.isTargetNumberValid(); } return true; @@ -132,6 +150,21 @@ public class ScryAi extends SpellAbilityAi { randomReturn = true; } + if (sa.usesTargeting()) { + sa.resetTargets(); + if (sa.canTarget(ai)) { + sa.getTargets().add(ai); + } else { + for (Player p : ai.getAllies()) { + if (sa.canTarget(p)) { + sa.getTargets().add(p); + break; + } + } + } + randomReturn = sa.isTargetNumberValid(); + } + return randomReturn; } From c7c2cd74fe638924c98565d93fc98626f9ca8ef4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 23 Aug 2024 16:53:07 +0800 Subject: [PATCH 07/33] Update NewGameScene - Hint TextButton -> ImageButton - add Random Avatar Listener - update NameGenerator Listener - update disabled Menu text - use AsyncAudio for Android --- forge-gui-android/src/forge/app/Main.java | 4 +- .../forge/adventure/scene/NewGameScene.java | 54 ++++++++++++++---- .../src/forge/adventure/stage/GameHUD.java | 8 +-- .../res/adventure/common/skin/ui_skin.json | 5 ++ .../res/adventure/common/skin/ui_skin.png | Bin 17658 -> 17803 bytes .../res/adventure/common/ui/new_game.json | 20 +++---- .../common/ui/new_game_portrait.json | 26 ++++----- 7 files changed, 78 insertions(+), 39 deletions(-) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index ba243981c01..de4e9f9a10d 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -51,6 +51,7 @@ import com.badlogic.gdx.Version; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; import com.badlogic.gdx.backends.android.AndroidAudio; +import com.badlogic.gdx.backends.android.AsynchronousAndroidAudio; import com.getkeepsafe.relinker.ReLinker; import de.cketti.fileprovider.PublicFileProvider; import forge.Forge; @@ -122,7 +123,8 @@ public class Main extends AndroidApplication { @Override public AndroidAudio createAudio(Context context, AndroidApplicationConfiguration config) { - return super.createAudio(context, config); + return new AsynchronousAndroidAudio(context, config); + //return super.createAudio(context, config); } @Override diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index a0dd409be82..8e59d5cb972 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -3,12 +3,12 @@ package forge.adventure.scene; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Array; -import com.github.tommyettinger.textra.TextraButton; import com.github.tommyettinger.textra.TextraLabel; import forge.Forge; import forge.adventure.data.DialogData; @@ -48,17 +48,17 @@ public class NewGameScene extends MenuScene { private final TextraLabel starterEditionLabel; private final Array custom; private final TextraLabel colorLabel; - private final TextraButton difficultyHelp; + private final ImageButton difficultyHelp; private DialogData difficultySummary; - private final TextraButton modeHelp; + private final ImageButton modeHelp; private DialogData modeSummary; + private final Random rand = new Random(); private final Array modes = new Array<>(); private NewGameScene() { super(Forge.isLandscapeMode() ? "ui/new_game.json" : "ui/new_game_portrait.json"); - gender = ui.findActor("gender"); selectedName = ui.findActor("nameField"); selectedName.setText(NameGenerator.getRandomName(gender.getCurrentIndex() > 0 ? "Female" : "Male", "Any", "")); @@ -127,13 +127,12 @@ public class NewGameScene extends MenuScene { modeNames[i] = modes.get(i).getName(); mode.setTextList(modeNames); - gender.setTextList(new String[]{Forge.getLocalizer().getMessage("lblMale"), Forge.getLocalizer().getMessage("lblFemale")}); + gender.setTextList(new String[]{Forge.getLocalizer().getMessage("lblMale") + "[%120][CYAN] \u2642", + Forge.getLocalizer().getMessage("lblFemale") + "[%120][MAGENTA] \u2640"}); gender.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { - //gender should be either Male or Female - String val = gender.getCurrentIndex() > 0 ? "Female" : "Male"; - selectedName.setText(NameGenerator.getRandomName(val, "Any", "")); + nameTT = 0.8f; super.clicked(event, x, y); } }); @@ -150,6 +149,13 @@ public class NewGameScene extends MenuScene { } }); race = ui.findActor("race"); + race.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + avatarTT = 0.7f; + super.clicked(event, x, y); + } + }); race.addListener(event -> NewGameScene.this.updateAvatar()); race.setTextList(HeroListData.getRaces()); difficulty = ui.findActor("difficulty"); @@ -167,9 +173,7 @@ public class NewGameScene extends MenuScene { difficulty.setTextList(diffList); difficulty.setCurrentIndex(startingDifficulty); - Random rand = new Random(); - avatarIndex = rand.nextInt(); - updateAvatar(); + generateAvatar(); gender.setCurrentIndex(rand.nextInt()); colorId.setCurrentIndex(rand.nextInt()); race.setCurrentIndex(rand.nextInt()); @@ -189,6 +193,34 @@ public class NewGameScene extends MenuScene { return object; } + float avatarT = 1f, avatarTT = 1f; + float nameT = 1f, nameTT = 1f; + @Override + public void act(float delta) { + super.act(delta); + if (avatarT > avatarTT) { + avatarTT += (delta / 0.5f); + generateAvatar(); + } else { + avatarTT = avatarT; + } + if (nameT > nameTT) { + nameTT += (delta / 0.5f); + generateName(); + } else { + nameTT = nameT; + } + } + private void generateAvatar() { + avatarIndex = rand.nextInt(); + updateAvatar(); + } + private void generateName() { + //gender should be either Male or Female + String val = gender.getCurrentIndex() > 0 ? "Female" : "Male"; + selectedName.setText(NameGenerator.getRandomName(val, "Any", "")); + } + boolean started = false; public boolean start() { diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 091106d08c7..b73035b0c22 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -694,8 +694,8 @@ public class GameHUD extends Stage { setVisibility(shards, visible); setVisibility(money, visible); setVisibility(blank, visible); - setDisabled(exitToWorldMapActor, !MapStage.getInstance().isInMap(), "[%120][+ExitToWorldMap]", "---"); - setDisabled(bookmarkActor, !MapStage.getInstance().isInMap(), "[%120][+Bookmark]", "---"); + setDisabled(exitToWorldMapActor, !MapStage.getInstance().isInMap(), "[%120][+ExitToWorldMap]", "\uFF0F"); + setDisabled(bookmarkActor, !MapStage.getInstance().isInMap(), "[%120][+Bookmark]", "\uFF0F"); setAlpha(avatarborder, visible); setAlpha(avatar, visible); setAlpha(deckActor, visible); @@ -810,8 +810,8 @@ public class GameHUD extends Stage { public boolean act(float v) { if (exitDungeon) { MapStage.getInstance().exitDungeon(); - setDisabled(exitToWorldMapActor, true, "[%120][+ExitToWorldMap]", "---"); - setDisabled(bookmarkActor, true, "[%120][+Bookmark]", "---"); + setDisabled(exitToWorldMapActor, true, "[%120][+ExitToWorldMap]", "\uFF0F"); + setDisabled(bookmarkActor, true, "[%120][+Bookmark]", "\uFF0F"); } return true; } diff --git a/forge-gui/res/adventure/common/skin/ui_skin.json b/forge-gui/res/adventure/common/skin/ui_skin.json index 823c89333bb..4a2bb85a668 100644 --- a/forge-gui/res/adventure/common/skin/ui_skin.json +++ b/forge-gui/res/adventure/common/skin/ui_skin.json @@ -458,6 +458,11 @@ "down": "right_down", "focused": "right_f" }, + "roundhint": { + "up": "unpressedround", + "down": "pressedround", + "focused": "unpressedround" + }, "item_frame": { "imageCheckedOver": "item_frame_selected_hover", "up": "item_frame", diff --git a/forge-gui/res/adventure/common/skin/ui_skin.png b/forge-gui/res/adventure/common/skin/ui_skin.png index f11f48b346b979f640bfb65fd4af3f4b1b1da1c9..67ddef59216cf023419b55f8ebf12700b7e77cac 100644 GIT binary patch literal 17803 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 literal 17658 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 diff --git a/forge-gui/res/adventure/common/ui/new_game.json b/forge-gui/res/adventure/common/ui/new_game.json index b5449cf0f3a..8fabf16c6f5 100644 --- a/forge-gui/res/adventure/common/ui/new_game.json +++ b/forge-gui/res/adventure/common/ui/new_game.json @@ -65,14 +65,14 @@ "yOffset": 8 }, { - "type": "TextButton", + "type": "ImageButton", "name": "difficultyHelp", - "text": "[GOLD]?", + "style": "roundhint", "selectable": true, - "width": 16, - "height": 16, + "width": 12, + "height": 15, "x": 145, - "yOffset": -16 + "yOffset": -17 }, { "type": "Label", @@ -93,14 +93,14 @@ "yOffset": 8 }, { - "type": "TextButton", + "type": "ImageButton", "name": "modeHelp", - "text": "[GOLD]?", + "style": "roundhint", "selectable": true, - "width": 16, - "height": 16, + "width": 12, + "height": 15, "x": 145, - "yOffset": -16 + "yOffset": -17 }, { "type": "Label", diff --git a/forge-gui/res/adventure/common/ui/new_game_portrait.json b/forge-gui/res/adventure/common/ui/new_game_portrait.json index b6bf4453c41..a04cfe2b010 100644 --- a/forge-gui/res/adventure/common/ui/new_game_portrait.json +++ b/forge-gui/res/adventure/common/ui/new_game_portrait.json @@ -35,7 +35,7 @@ "width": 128, "height": 24, "x": 16, - "y": 140 + "y": 148 }, { "type": "Label", @@ -65,14 +65,14 @@ "yOffset": 8 }, { - "type": "TextButton", + "type": "ImageButton", "name": "difficultyHelp", - "text": "[GOLD]?", + "style": "roundhint", "selectable": true, - "width": 24, - "height": 24, - "x": 72, - "yOffset": -24 + "width": 12, + "height": 15, + "x": 80, + "yOffset": -17 }, { "type": "Label", @@ -93,14 +93,14 @@ "yOffset": 8 }, { - "type": "TextButton", + "type": "ImageButton", "name": "modeHelp", - "text": "[GOLD]?", + "style": "roundhint", "selectable": true, - "width": 24, - "height": 24, - "x": 72, - "yOffset": -24 + "width": 12, + "height": 15, + "x": 80, + "yOffset": -17 }, { "type": "Label", From 77710cf1b03b7f0a64a1ff33596ff7a2cdb27a01 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 23 Aug 2024 10:57:33 +0200 Subject: [PATCH 08/33] refactor LandAbility to be created by CardFactory (#5047) --------- Co-authored-by: tool4EvEr --- .../src/main/java/forge/ai/AiController.java | 31 ++---- .../java/forge/ai/ComputerUtilAbility.java | 2 +- .../java/forge/ai/PlayerControllerAi.java | 2 +- .../java/forge/ai/ability/DiscoverAi.java | 4 +- .../main/java/forge/ai/ability/PlayAi.java | 2 +- .../forge/ai/simulation/GameSimulator.java | 6 +- .../ai/simulation/GameStateEvaluator.java | 5 +- .../ai/simulation/SpellAbilityPicker.java | 12 +-- .../main/java/forge/game/CardTraitBase.java | 2 +- .../main/java/forge/game/GameActionUtil.java | 4 +- .../java/forge/game/ability/AbilityUtils.java | 6 +- .../game/ability/effects/DiscoverEffect.java | 6 +- .../game/ability/effects/PlayEffect.java | 4 +- .../effects/PlayLandVariantEffect.java | 2 +- .../src/main/java/forge/game/card/Card.java | 102 +----------------- .../java/forge/game/card/CardFactory.java | 15 ++- .../java/forge/game/phase/PhaseHandler.java | 4 +- .../main/java/forge/game/player/Player.java | 14 +-- .../forge/game/spellability/LandAbility.java | 63 +++++++++-- .../java/forge/game/spellability/Spell.java | 1 + .../forge/game/spellability/SpellAbility.java | 9 +- .../SpellAbilityPickerSimulationTest.java | 4 +- .../match/input/InputPassPriority.java | 4 +- .../src/main/java/forge/player/HumanPlay.java | 4 +- 24 files changed, 115 insertions(+), 193 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 2ad89291285..7c2a25b1efe 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -468,8 +468,7 @@ public class AiController { } } } - - return player.canPlayLand(c); + return Iterables.any(c.getAllPossibleAbilities(player, true), SpellAbility::isLandAbility); }); return landList; } @@ -1376,30 +1375,12 @@ public class AiController { Card land = chooseBestLandToPlay(landsWannaPlay); if ((!player.canLoseLife() || player.cantLoseForZeroOrLessLife() || ComputerUtil.getDamageFromETB(player, land) < player.getLife()) && (!game.getPhaseHandler().is(PhaseType.MAIN1) || !isSafeToHoldLandDropForMain2(land))) { - final List abilities = Lists.newArrayList(); + final List abilities = land.getAllPossibleAbilities(player, true); + // skip non Land Abilities + abilities.removeIf(sa -> !sa.isLandAbility()); - // TODO extend this logic to evaluate MDFC with both sides land - // this can only happen if its a MDFC land - if (!land.isLand()) { - land.setState(CardStateName.Modal, true); - land.setBackSide(true); - } - - LandAbility la = new LandAbility(land, player, null); - la.setCardState(land.getCurrentState()); - if (la.canPlay()) { - abilities.add(la); - } - - // add mayPlay option - for (CardPlayOption o : land.mayPlay(player)) { - la = new LandAbility(land, player, o); - la.setCardState(land.getCurrentState()); - if (la.canPlay()) { - abilities.add(la); - } - } if (!abilities.isEmpty()) { + // TODO extend this logic to evaluate MDFC with both sides land return abilities; } } @@ -1570,7 +1551,7 @@ public class AiController { Iterables.removeIf(saList, spellAbility -> { //don't include removedAI cards if somehow the AI can play the ability or gain control of unsupported card // TODO allow when experimental profile? - return spellAbility instanceof LandAbility || (spellAbility.getHostCard() != null && ComputerUtilCard.isCardRemAIDeck(spellAbility.getHostCard())); + return spellAbility.isLandAbility() || (spellAbility.getHostCard() != null && ComputerUtilCard.isCardRemAIDeck(spellAbility.getHostCard())); }); //update LivingEndPlayer useLivingEnd = Iterables.any(player.getZone(ZoneType.Library), CardPredicates.nameEquals("Living End")); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 1add3ce299d..d316ea836a5 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -45,7 +45,7 @@ public class ComputerUtilAbility { return false; } } - return player.canPlayLand(c); + return player.canPlayLand(c, false, c.getFirstSpellAbility()); }); final CardCollection landsNotInHand = new CardCollection(player.getCardsIn(ZoneType.Graveyard)); diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 2c15791a6d6..b1a282a20b8 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -810,7 +810,7 @@ public class PlayerControllerAi extends PlayerController { @Override public boolean playChosenSpellAbility(SpellAbility sa) { - if (sa instanceof LandAbility) { + if (sa.isLandAbility()) { if (sa.canPlay()) { sa.resolve(); } diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscoverAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscoverAi.java index 9541d8266d5..c0ac69a99b7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DiscoverAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DiscoverAi.java @@ -8,7 +8,7 @@ import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; -import forge.game.spellability.LandAbility; + import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; @@ -45,7 +45,7 @@ public class DiscoverAi extends SpellAbilityAi { public boolean confirmAction(Player ai, SpellAbility sa, PlayerActionConfirmMode mode, String message, Map params) { Card c = (Card)params.get("Card"); for (SpellAbility s : AbilityUtils.getBasicSpellsFromPlayEffect(c, ai)) { - if (s instanceof LandAbility) { + if (s.isLandAbility()) { // return false or we get a ClassCastException later if the AI encounters MDFC with land backside return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index 5736c4f8486..5e7e9c482ff 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -154,7 +154,7 @@ public class PlayAi extends SpellAbilityAi { if (!sa.matchesValidParam("ValidSA", s)) { continue; } - if (s instanceof LandAbility) { + if (s.isLandAbility()) { // might want to run some checks here but it's rare anyway return true; } diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java index e78415429a9..c6b354ef553 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java @@ -1,6 +1,6 @@ package forge.ai.simulation; -import forge.game.spellability.LandAbility; + import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -158,9 +158,9 @@ public class GameSimulator { } public Score simulateSpellAbility(SpellAbility origSa, GameStateEvaluator eval, boolean resolve) { SpellAbility sa; - if (origSa instanceof LandAbility) { + if (origSa.isLandAbility()) { Card hostCard = (Card) copier.find(origSa.getHostCard()); - if (!aiPlayer.playLand(hostCard, false)) { + if (!aiPlayer.playLand(hostCard, false, origSa)) { System.err.println("Simulation: Couldn't play land! " + origSa); } sa = origSa; diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java b/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java index de05636ddc8..eeab7621bb0 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java @@ -260,7 +260,10 @@ public class GameStateEvaluator { // The value should be more than the value of having a card in hand, so if a land has an // activated ability but not a mana ability, it will still be played. for (SpellAbility m: c.getNonManaAbilities()) { - if (!m.getPayCosts().hasTapCost()) { + if (m.isLandAbility()) { + // Land Ability has no extra Score + continue; + } if (!m.getPayCosts().hasTapCost()) { // probably a manland, rate it higher than a rainbow land value += 25; } else if (m.getPayCosts().hasSpecificCostType(CostSacrifice.class)) { diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java index 28dfb46d184..483449ace0a 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java @@ -24,7 +24,7 @@ import forge.game.card.CardPredicates; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.AbilitySub; -import forge.game.spellability.LandAbility; + import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityCondition; import forge.game.zone.ZoneType; @@ -136,7 +136,7 @@ public class SpellAbilityPicker { private static boolean isSorcerySpeed(SpellAbility sa, Player player) { // TODO: Can we use the actual rules engine for this instead of trying to do the logic ourselves? - if (sa instanceof LandAbility) { + if (sa.isLandAbility()) { return true; } if (sa.isSpell()) { @@ -327,16 +327,16 @@ public class SpellAbilityPicker { } private AiPlayDecision canPlayAndPayForSim(final SpellAbility sa) { - if (!sa.isLegalAfterStack()) { - return AiPlayDecision.CantPlaySa; - } if (!sa.checkRestrictions(sa.getHostCard(), player)) { return AiPlayDecision.CantPlaySa; } - if (sa instanceof LandAbility) { + if (sa.isLandAbility()) { return AiPlayDecision.WillPlay; } + if (!sa.isLegalAfterStack()) { + return AiPlayDecision.CantPlaySa; + } if (!sa.canPlay()) { return AiPlayDecision.CantPlaySa; } diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 96aaabeaee9..4c33fc82c94 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -170,7 +170,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, * * @return a boolean. */ - public final boolean isSecondary() { + public boolean isSecondary() { return getParamOrDefault("Secondary", "False").equals("True"); } diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index d39e690c43a..e321a159155 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -91,10 +91,10 @@ public final class GameActionUtil { return alternatives; } - if (sa.isSpell()) { + if (sa.isSpell() || sa.isLandAbility()) { boolean lkicheck = false; - Card newHost = ((Spell)sa).getAlternateHost(source); + Card newHost = sa.getAlternateHost(source); if (newHost != null) { source = newHost; lkicheck = true; 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 c5ff9a72f14..0ed80f17159 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2953,7 +2953,7 @@ public class AbilityUtils { } for (SpellAbility s : list) { - if (s instanceof LandAbility) { + if (s.isLandAbility()) { // CR 305.3 if (controller.getGame().getPhaseHandler().isPlayerTurn(controller) && controller.canPlayLand(tgtCard, true, s)) { sas.add(s); @@ -2981,9 +2981,7 @@ public class AbilityUtils { private static void collectSpellsForPlayEffect(final List result, final CardState state, final Player controller, final boolean withAltCost) { if (state.getType().isLand()) { - LandAbility la = new LandAbility(state.getCard(), controller, null); - la.setCardState(state); - result.add(la); + result.add(state.getFirstSpellAbility()); } final Iterable spells = state.getSpellAbilities(); for (SpellAbility sa : spells) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscoverEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscoverEffect.java index 0d9333ce947..31f38e3dd13 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscoverEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscoverEffect.java @@ -1,7 +1,5 @@ package forge.game.ability.effects; -import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; import forge.game.Game; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; @@ -15,7 +13,7 @@ import forge.game.cost.CostPart; import forge.game.cost.CostReveal; import forge.game.player.Player; import forge.game.player.PlayerCollection; -import forge.game.spellability.LandAbility; + import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.PlayerZone; @@ -94,7 +92,7 @@ public class DiscoverEffect extends SpellAbilityEffect { List sas = AbilityUtils.getBasicSpellsFromPlayEffect(found, p); // filter out land abilities due to MDFC or similar - Iterables.removeIf(sas, Predicates.instanceOf(LandAbility.class)); + sas.removeIf(sp -> sp.isLandAbility()); // the spell must also have a mana value equal to or less than the discover number sas.removeIf(sp -> sp.getPayCosts().getTotalMana().getCMC() > num); 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 4ceb5ea64ad..70f41014817 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 @@ -39,7 +39,7 @@ import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementLayer; import forge.game.spellability.AlternativeCost; -import forge.game.spellability.LandAbility; + import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityPredicates; import forge.game.zone.Zone; @@ -343,7 +343,7 @@ public class PlayEffect extends SpellAbilityEffect { final Zone originZone = tgtCard.getZone(); // lands will be played - if (tgtSA instanceof LandAbility) { + if (tgtSA.isLandAbility()) { tgtSA.resolve(); amount--; if (remember) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java index 8e68bf65b3d..6361442621f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java @@ -57,7 +57,7 @@ public class PlayLandVariantEffect extends SpellAbilityEffect { PaperCard ran = Aggregates.random(cards); random = CardFactory.getCard(ran, activator, game); cards.remove(ran); - } while (!activator.canPlayLand(random, false)); + } while (!activator.canPlayLand(random, false, random.getFirstSpellAbility())); source.addCloneState(CardFactory.getCloneStates(random, source, sa), game.getNextTimestamp()); source.updateStateForView(); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 6e73894e478..f94ad7292d5 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -7430,7 +7430,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { for (SpellAbility sa : getState(CardStateName.Modal).getSpellAbilities()) { //add alternative costs as additional spell abilities // only add Spells there - if (sa.isSpell()) { + if (sa.isSpell() || sa.isLandAbility()) { abilities.add(sa); abilities.addAll(GameActionUtil.getAlternativeCosts(sa, player, false)); } @@ -7466,106 +7466,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } abilities.removeAll(toRemove); - // Land Abilities below, move them to CardFactory after MayPlayRefactor - if (getLastKnownZone().is(ZoneType.Battlefield)) { - return abilities; - } - if (getState(CardStateName.Original).getType().isLand()) { - LandAbility la = new LandAbility(this, player, null); - la.setCardState(oState); - if (la.canPlay()) { - abilities.add(la); - } - - Card source = this; - boolean lkicheck = false; - - // if Card is Facedown, need to check if MayPlay still applies - if (isFaceDown()) { - lkicheck = true; - source = CardCopyService.getLKICopy(source); - source.forceTurnFaceUp(); - } - - if (lkicheck) { - // double freeze tracker, so it doesn't update view - game.getTracker().freeze(); - CardCollection preList = new CardCollection(source); - game.getAction().checkStaticAbilities(false, Sets.newHashSet(source), preList); - } - - // extra for MayPlay - for (CardPlayOption o : source.mayPlay(player)) { - la = new LandAbility(this, player, o); - la.setCardState(oState); - if (la.canPlay()) { - abilities.add(la); - } - } - - // reset static abilities - if (lkicheck) { - game.getAction().checkStaticAbilities(false); - // clear delayed changes, this check should not have updated the view - game.getTracker().clearDelayed(); - // need to unfreeze tracker - game.getTracker().unfreeze(); - } - } - - if (isModal() && hasState(CardStateName.Modal)) { - CardState modal = getState(CardStateName.Modal); - if (modal.getType().isLand()) { - LandAbility la = new LandAbility(this, player, null); - la.setCardState(modal); - - Card source = CardCopyService.getLKICopy(this); - boolean lkicheck = true; - - // if Card is Facedown, need to check if MayPlay still applies - if (isFaceDown()) { - source.forceTurnFaceUp(); - } - - // the modal state is not copied with lki, need to copy it extra - if (!source.hasState(CardStateName.Modal)) { - source.addAlternateState(CardStateName.Modal, false); - source.getState(CardStateName.Modal).copyFrom(this.getState(CardStateName.Modal), true); - } - - source.setSplitStateToPlayAbility(la); - - if (la.canPlay(source)) { - abilities.add(la); - } - - if (lkicheck) { - // double freeze tracker, so it doesn't update view - game.getTracker().freeze(); - CardCollection preList = new CardCollection(source); - game.getAction().checkStaticAbilities(false, Sets.newHashSet(source), preList); - } - - // extra for MayPlay - for (CardPlayOption o : source.mayPlay(player)) { - la = new LandAbility(this, player, o); - la.setCardState(modal); - if (la.canPlay(source)) { - abilities.add(la); - } - } - - // reset static abilities - if (lkicheck) { - game.getAction().checkStaticAbilities(false); - // clear delayed changes, this check should not have updated the view - game.getTracker().clearDelayed(); - // need to unfreeze tracker - game.getTracker().unfreeze(); - } - } - } - return abilities; } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 81885497755..dbf3ab681e5 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -413,17 +413,16 @@ public class CardFactory { // SpellPermanent only for Original State if (c.getCurrentStateName() == CardStateName.Original || c.getCurrentStateName() == CardStateName.Modal || c.getCurrentStateName().toString().startsWith("Specialize")) { - // this is the "default" spell for permanents like creatures and artifacts - if (c.isPermanent() && !c.isAura() && !c.isLand()) { + if (c.isLand()) { + SpellAbility sa = new LandAbility(c); + sa.setCardState(c.getCurrentState()); + c.addSpellAbility(sa); + } else if (c.isPermanent() && !c.isAura()) { + // this is the "default" spell for permanents like creatures and artifacts SpellAbility sa = new SpellPermanent(c); - - // Currently only for Modal, might react different when state is always set - //if (c.getCurrentStateName() == CardStateName.Modal) { - sa.setCardState(c.getCurrentState()); - //} + sa.setCardState(c.getCurrentState()); c.addSpellAbility(sa); } - // TODO add LandAbility there when refactor MayPlay } CardFactoryUtil.addAbilityFactoryAbilities(c, face.getAbilities()); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 1cf780a538a..dd00c35e796 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -32,7 +32,7 @@ import forge.game.event.*; import forge.game.player.Player; import forge.game.replacement.ReplacementResult; import forge.game.replacement.ReplacementType; -import forge.game.spellability.LandAbility; + import forge.game.spellability.SpellAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; @@ -1064,7 +1064,7 @@ public class PhaseHandler implements java.io.Serializable { final Zone currentZone = saHost.getZone(); // Need to check if Zone did change - if (currentZone != null && originZone != null && !currentZone.equals(originZone) && (sa.isSpell() || sa instanceof LandAbility)) { + if (currentZone != null && originZone != null && !currentZone.equals(originZone) && (sa.isSpell() || sa.isLandAbility())) { // currently there can be only one Spell put on the Stack at once, or Land Abilities be played final CardZoneTable triggerList = new CardZoneTable(game.getLastStateBattlefield(), game.getLastStateGraveyard()); triggerList.put(originZone.getZoneType(), currentZone.getZoneType(), saHost); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 35f655d96f8..f51e1eab79c 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -43,7 +43,7 @@ import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementResult; import forge.game.replacement.ReplacementType; import forge.game.spellability.AbilitySub; -import forge.game.spellability.LandAbility; + import forge.game.spellability.SpellAbility; import forge.game.staticability.*; import forge.game.trigger.Trigger; @@ -1691,9 +1691,9 @@ public class Player extends GameEntity implements Comparable { game.fireEvent(new GameEventShuffle(this)); } - public final boolean playLand(final Card land, final boolean ignoreZoneAndTiming) { + public final boolean playLand(final Card land, final boolean ignoreZoneAndTiming, SpellAbility cause) { // Dakkon Blackblade Avatar will use a similar effect - if (canPlayLand(land, ignoreZoneAndTiming)) { + if (canPlayLand(land, ignoreZoneAndTiming, cause)) { playLandNoCheck(land, null); return true; } @@ -1706,7 +1706,7 @@ public class Player extends GameEntity implements Comparable { land.setController(this, 0); if (land.isFaceDown()) { land.turnFaceUp(null); - if (cause instanceof LandAbility) { + if (cause.isLandAbility()) { land.changeToState(cause.getCardStateName()); } } @@ -1730,12 +1730,6 @@ public class Player extends GameEntity implements Comparable { return c; } - public final boolean canPlayLand(final Card land) { - return canPlayLand(land, false); - } - public final boolean canPlayLand(final Card land, final boolean ignoreZoneAndTiming) { - return canPlayLand(land, ignoreZoneAndTiming, null); - } public final boolean canPlayLand(final Card land, final boolean ignoreZoneAndTiming, SpellAbility landSa) { if (!ignoreZoneAndTiming) { // CR 305.3 diff --git a/forge-game/src/main/java/forge/game/spellability/LandAbility.java b/forge-game/src/main/java/forge/game/spellability/LandAbility.java index f8901a57d76..f58c58b8337 100644 --- a/forge-game/src/main/java/forge/game/spellability/LandAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/LandAbility.java @@ -21,24 +21,20 @@ import forge.card.CardStateName; import forge.card.mana.ManaCost; import forge.game.card.Card; import forge.game.card.CardCopyService; -import forge.game.card.CardPlayOption; -import forge.game.cost.Cost; import forge.game.player.Player; import forge.game.staticability.StaticAbility; +import forge.game.zone.ZoneType; import forge.util.CardTranslation; import forge.util.Localizer; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; -public class LandAbility extends Ability { +public class LandAbility extends AbilityStatic { - public LandAbility(Card sourceCard, Player p, CardPlayOption mayPlay) { - super(sourceCard, new Cost(ManaCost.NO_COST, false)); - setActivatingPlayer(p); - setMayPlay(mayPlay); - } public LandAbility(Card sourceCard) { - this(sourceCard, sourceCard.getController(), null); + super(sourceCard, ManaCost.NO_COST); + + getRestrictions().setZone(ZoneType.Hand); } public boolean canPlay(Card newHost) { @@ -46,11 +42,21 @@ public class LandAbility extends Ability { return p.canPlayLand(newHost, false, this); } + @Override + public boolean isLandAbility() { return true; } + + @Override + public boolean isSecondary() { + return true; + } + @Override public boolean canPlay() { Card land = this.getHostCard(); final Player p = this.getActivatingPlayer(); - + if (p == null) { + return false; + } if (this.getCardState() != null && land.getCurrentStateName() != this.getCardStateName()) { if (!land.isLKI()) { land = CardCopyService.getLKICopy(land); @@ -113,4 +119,41 @@ public class LandAbility extends Ability { return sb.toString(); } + @Override + public Card getAlternateHost(Card source) { + boolean lkicheck = false; + + // need to be done before so it works with Vivien and Zoetic Cavern + if (source.isFaceDown() && source.isInZone(ZoneType.Exile)) { + if (!source.isLKI()) { + source = CardCopyService.getLKICopy(source); + } + + source.forceTurnFaceUp(); + lkicheck = true; + } + + if (getCardState() != null && source.getCurrentStateName() != getCardStateName()) { + if (!source.isLKI()) { + source = CardCopyService.getLKICopy(source); + } + CardStateName stateName = getCardState().getStateName(); + if (!source.hasState(stateName)) { + source.addAlternateState(stateName, false); + source.getState(stateName).copyFrom(getHostCard().getState(stateName), true); + } + + source.setState(stateName, false); + if (getHostCard().isDoubleFaced()) { + source.setBackSide(getHostCard().getRules().getSplitType().getChangedStateName().equals(stateName)); + } + + // need to reset CMC + source.setLKICMC(-1); + source.setLKICMC(source.getCMC()); + lkicheck = true; + } + + return lkicheck ? source : null; + } } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 32ff21ec841..c3cfcce3e9d 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -153,6 +153,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable this.castFaceDown = faceDown; } + @Override public Card getAlternateHost(Card source) { boolean lkicheck = false; 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 2429b3c0992..aa6bfafb962 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -527,6 +527,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public boolean isSpell() { return false; } public boolean isAbility() { return true; } public boolean isActivatedAbility() { return false; } + public boolean isLandAbility() { return false; } public boolean isTurnFaceUp() { return isMorphUp() || isDisguiseUp() || isManifestUp() || isCloakUp(); @@ -2185,7 +2186,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } } else if (incR[0].contains("LandAbility")) { - if (!(root instanceof LandAbility)) { + if (!(root.isLandAbility())) { return testFailed; } } @@ -2544,7 +2545,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (getRestrictions().isInstantSpeed()) { return true; } - if ((isSpell() || this instanceof LandAbility) && (isCastFromPlayEffect() || host.isInstant() || host.hasKeyword(Keyword.FLASH))) { + if ((isSpell() || this.isLandAbility()) && (isCastFromPlayEffect() || host.isInstant() || host.hasKeyword(Keyword.FLASH))) { return true; } @@ -2589,6 +2590,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return true; } + public Card getAlternateHost(Card source) { + return null; + } + public boolean hasOptionalKeywordAmount(KeywordInterface kw) { return this.optionalKeywordAmount.contains(kw.getKeyword(), Pair.of(kw.getIdx(), kw.getStaticId())); } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java index 367987c4f7d..df3a5b2d282 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java @@ -1,6 +1,6 @@ package forge.ai.simulation; -import forge.game.spellability.LandAbility; + import java.util.ArrayList; import java.util.List; @@ -84,7 +84,7 @@ public class SpellAbilityPickerSimulationTest extends SimulationTest { SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertTrue(sa instanceof LandAbility); + AssertJUnit.assertTrue(sa.isLandAbility()); AssertJUnit.assertEquals(mountain, sa.getHostCard()); Plan plan = picker.getPlan(); diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPassPriority.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPassPriority.java index 13d8fe9f832..c134489837d 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPassPriority.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPassPriority.java @@ -25,7 +25,7 @@ import forge.game.card.Card; import forge.game.player.Player; import forge.game.player.PlayerController; import forge.game.player.actions.PassPriorityAction; -import forge.game.spellability.LandAbility; + import forge.game.spellability.SpellAbility; import forge.localinstance.properties.ForgePreferences.FPref; import forge.model.FModel; @@ -169,7 +169,7 @@ public class InputPassPriority extends InputSyncronizedBase { if (sa.isSpell()) { return Localizer.getInstance().getMessage("lblCastSpell"); } - if (sa instanceof LandAbility) { + if (sa.isLandAbility()) { return Localizer.getInstance().getMessage("lblPlayLand"); } return Localizer.getInstance().getMessage("lblActivateAbility"); diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index b8887145913..1d9323108a3 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -33,7 +33,7 @@ import forge.game.mana.ManaRefundService; import forge.game.player.Player; import forge.game.player.PlayerController; import forge.game.player.PlayerView; -import forge.game.spellability.LandAbility; + import forge.game.spellability.OptionalCostValue; import forge.game.spellability.SpellAbility; import forge.game.staticability.StaticAbilityManaConvert; @@ -70,7 +70,7 @@ public class HumanPlay { Card source = sa.getHostCard(); sa.setActivatingPlayer(p); - if (sa instanceof LandAbility) { + if (sa.isLandAbility()) { if (sa.canPlay()) { sa.resolve(); } From 6bba3ee9541a2cc54094e6f374b3de0f508b0f62 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 23 Aug 2024 17:02:13 +0800 Subject: [PATCH 09/33] minor cleanup --- .../forge/adventure/scene/NewGameScene.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index 8e59d5cb972..6db9efa4b25 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -181,8 +181,16 @@ public class NewGameScene extends MenuScene { ui.onButtonPress("start", NewGameScene.this::start); ui.onButtonPress("leftAvatar", NewGameScene.this::leftAvatar); ui.onButtonPress("rightAvatar", NewGameScene.this::rightAvatar); - difficultyHelp.addListener(new ClickListener(){ public void clicked(InputEvent e, float x, float y){ showDifficultyHelp(); }}); - modeHelp.addListener(new ClickListener(){ public void clicked(InputEvent e, float x, float y){ showModeHelp(); }}); + difficultyHelp.addListener(new ClickListener() { + public void clicked(InputEvent e, float x, float y) { + showDifficultyHelp(); + } + }); + modeHelp.addListener(new ClickListener() { + public void clicked(InputEvent e, float x, float y) { + showModeHelp(); + } + }); } private static NewGameScene object; @@ -195,6 +203,7 @@ public class NewGameScene extends MenuScene { float avatarT = 1f, avatarTT = 1f; float nameT = 1f, nameTT = 1f; + @Override public void act(float delta) { super.act(delta); @@ -211,10 +220,12 @@ public class NewGameScene extends MenuScene { nameTT = nameT; } } + private void generateAvatar() { avatarIndex = rand.nextInt(); updateAvatar(); } + private void generateName() { //gender should be either Male or Female String val = gender.getCurrentIndex() > 0 ? "Female" : "Male"; @@ -327,11 +338,11 @@ public class NewGameScene extends MenuScene { dismiss.name = "OK"; DialogData matchImpacts = new DialogData(); - matchImpacts.text = String.format("Difficulty: %s\nStarting Life: %d\nEnemy Health: %d%%\nGold loss on defeat: %d%%\nLife loss on defeat: %d%%", selectedDifficulty.name, selectedDifficulty.startingLife, (int)(selectedDifficulty.enemyLifeFactor * 100) , (int)(selectedDifficulty.goldLoss*100), (int)(selectedDifficulty.lifeLoss*100)); + matchImpacts.text = String.format("Difficulty: %s\nStarting Life: %d\nEnemy Health: %d%%\nGold loss on defeat: %d%%\nLife loss on defeat: %d%%", selectedDifficulty.name, selectedDifficulty.startingLife, (int) (selectedDifficulty.enemyLifeFactor * 100), (int) (selectedDifficulty.goldLoss * 100), (int) (selectedDifficulty.lifeLoss * 100)); matchImpacts.name = "Duels"; DialogData economyImpacts = new DialogData(); - economyImpacts.text = String.format("Difficulty: %s\nStarting Gold: %d\nStarting Mana Shards: %d\nCard Sale Price: %d%%\nMana Shard Sale Price: %d%%\nRandom loot rate: %d%%", selectedDifficulty.name, selectedDifficulty.staringMoney, selectedDifficulty.startingShards, (int)(selectedDifficulty.sellFactor*100), (int)(selectedDifficulty.shardSellRatio*100), (int)(selectedDifficulty.rewardMaxFactor*100)); + economyImpacts.text = String.format("Difficulty: %s\nStarting Gold: %d\nStarting Mana Shards: %d\nCard Sale Price: %d%%\nMana Shard Sale Price: %d%%\nRandom loot rate: %d%%", selectedDifficulty.name, selectedDifficulty.staringMoney, selectedDifficulty.startingShards, (int) (selectedDifficulty.sellFactor * 100), (int) (selectedDifficulty.shardSellRatio * 100), (int) (selectedDifficulty.rewardMaxFactor * 100)); economyImpacts.name = "Economy"; difficultySummary.options = new DialogData[3]; From 3df84ca71e9b6d878ce5aee4a22d41e784b9c878 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 23 Aug 2024 17:16:33 +0800 Subject: [PATCH 10/33] remove duplicate function --- forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index 6db9efa4b25..a7671483498 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -61,7 +61,7 @@ public class NewGameScene extends MenuScene { super(Forge.isLandscapeMode() ? "ui/new_game.json" : "ui/new_game_portrait.json"); gender = ui.findActor("gender"); selectedName = ui.findActor("nameField"); - selectedName.setText(NameGenerator.getRandomName(gender.getCurrentIndex() > 0 ? "Female" : "Male", "Any", "")); + generateName(); avatarImage = ui.findActor("avatarPreview"); mode = ui.findActor("mode"); modeHelp = ui.findActor("modeHelp"); @@ -239,7 +239,7 @@ public class NewGameScene extends MenuScene { return true; started = true; if (selectedName.getText().isEmpty()) { - selectedName.setText(NameGenerator.getRandomName("Any", "Any", "")); + generateName(); } Runnable runnable = () -> { started = false; From b6485e709407ee6d12312151f5744671b7f60da4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 23 Aug 2024 17:35:19 +0800 Subject: [PATCH 11/33] minor --- forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java | 2 +- forge-gui-mobile/src/forge/adventure/stage/GameHUD.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index a7671483498..b00ab82d761 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -167,7 +167,7 @@ public class NewGameScene extends MenuScene { for (DifficultyData diff : Config.instance().getConfigData().difficulties) { if (diff.startingDifficulty) startingDifficulty = i; - diffList.add(Forge.getLocalizer().getInstance().getMessageorUseDefault("lbl" + diff.name, diff.name)); + diffList.add(Forge.getLocalizer().getMessageorUseDefault("lbl" + diff.name, diff.name)); i++; } difficulty.setTextList(diffList); diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index b73035b0c22..db9f695e05d 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -51,7 +51,7 @@ public class GameHUD extends Stage { private final TextraLabel money; private final TextraLabel shards; private final TextraLabel keys; - private TextraLabel notificationText = Controls.newTextraLabel(""); + private final TextraLabel notificationText = Controls.newTextraLabel(""); private final Image miniMap, gamehud, mapborder, avatarborder, blank; private final InputEvent eventTouchDown, eventTouchUp; private final TextraButton deckActor, openMapActor, menuActor, logbookActor, inventoryActor, exitToWorldMapActor, bookmarkActor; From 8d433e019d1b5b3eb6f56b68a1bb9883650fbf73 Mon Sep 17 00:00:00 2001 From: Lykrast Date: Fri, 23 Aug 2024 11:35:52 +0200 Subject: [PATCH 12/33] 73 cards from Unknown Events 2023 (some being in mb2) (#5913) * Unknown Philadelphia 2023 and Minenapolis 2023 * Barcelona 2023 what I could * A few of the las vegas ones * Questing role give to creature instead of being on aura * Changed prizes to promo, should fix phila And also put the you make the card on a special sheet, should fix a future issue if I got it right * Fix the etb tapped from bloomburrow patch Kept old wording for now cause those cards don't have oracle texts, might change if asked * Las Vegas 2023 (what I could) * Shortened set codes as suggested * Fix edition change on las vegas ymtc --- .../anax_and_cymede_and_kynaios_and_tiro.txt | 12 ++++ .../cardsfolder/a/artifact_unknown_shores.txt | 8 +++ .../cardsfolder/a/avacyn_and_griselbrand.txt | 11 +++ .../cardsfolder/b/believe_in_the_cleave.txt | 7 ++ .../cardsfolder/b/bram_baguette_brawler.txt | 11 +++ .../b/bringer_of_green_zeniths_twilight.txt | 14 ++++ forge-gui/res/cardsfolder/c/cat_oven.txt | 12 ++++ .../c/chatterstorm_and_awaken_the_woods.txt | 7 ++ .../cardsfolder/c/cinnamon_seasoned_steed.txt | 14 ++++ .../c/colossal_dreadmaw_and_storm_crow.txt | 7 ++ .../res/cardsfolder/d/delve_too_deep.txt | 9 +++ .../e/eldest_dragon_highlander.txt | 10 +++ forge-gui/res/cardsfolder/e/ensoul_ring.txt | 9 +++ .../res/cardsfolder/f/force_of_rowan.txt | 7 ++ forge-gui/res/cardsfolder/f/forestfolk.txt | 10 +++ ...s_lost_wolf_hey_has_anyone_seen_garruk.txt | 19 +++++ .../res/cardsfolder/g/gingerbehemoth.txt | 12 ++++ .../res/cardsfolder/g/glorious_dragon_kin.txt | 9 +++ forge-gui/res/cardsfolder/h/honk.txt | 10 +++ .../res/cardsfolder/h/hound_of_urabrask.txt | 11 +++ forge-gui/res/cardsfolder/i/incisor_steed.txt | 10 +++ forge-gui/res/cardsfolder/i/incubob.txt | 7 ++ .../res/cardsfolder/i/innistrad_charm.txt | 11 +++ .../cardsfolder/i/isamaru_and_yoshimaru.txt | 9 +++ .../res/cardsfolder/j/jeska_and_kamahl.txt | 8 +++ .../res/cardsfolder/j/joven_and_chandler.txt | 12 ++++ .../res/cardsfolder/k/kamigawa_charm.txt | 14 ++++ .../cardsfolder/k/kevin_questing_dragon.txt | 17 +++++ .../cardsfolder/k/knowing_half_the_battle.txt | 15 ++++ .../k/koma_and_toski_compleated.txt | 14 ++++ forge-gui/res/cardsfolder/l/leech_medic.txt | 7 ++ forge-gui/res/cardsfolder/l/life_cloud.txt | 11 +++ forge-gui/res/cardsfolder/l/locus_cobra.txt | 11 +++ .../cardsfolder/l/luxior_and_shadowspear.txt | 10 +++ .../cardsfolder/m/manakin_and_millikin.txt | 8 +++ .../m/more_of_that_strange_oil.txt | 10 +++ forge-gui/res/cardsfolder/m/mox_poison.txt | 6 ++ .../myojin_of_nights_reach_grim_betrayal.txt | 10 +++ .../cardsfolder/m/mysterious_confluence.txt | 7 ++ .../res/cardsfolder/n/night_out_in_vegas.txt | 15 ++++ forge-gui/res/cardsfolder/n/nim_mongoose.txt | 11 +++ .../res/cardsfolder/n/norin_and_feldon.txt | 9 +++ .../res/cardsfolder/o/original_skullclamp.txt | 8 +++ .../res/cardsfolder/p/phila_unsealed.txt | 7 ++ .../res/cardsfolder/p/phyrexian_adapter.txt | 14 ++++ .../res/cardsfolder/p/phyrexian_broodstar.txt | 12 ++++ .../cardsfolder/p/phyrexian_chimney_imp.txt | 8 +++ .../cardsfolder/p/phyrexian_esthetician.txt | 8 +++ .../cardsfolder/p/phyrexian_ornithopter.txt | 7 ++ forge-gui/res/cardsfolder/p/potatoes.txt | 10 +++ .../res/cardsfolder/q/questing_cosplayer.txt | 9 +++ .../cardsfolder/r/really_charming_prince.txt | 11 +++ .../cardsfolder/r/red_priest_of_yawgmoth.txt | 8 +++ forge-gui/res/cardsfolder/r/riku_and_riku.txt | 8 +++ .../riven_turnbull_and_princess_lucrezia.txt | 6 ++ .../res/cardsfolder/s/sagrada_familiar.txt | 12 ++++ .../res/cardsfolder/s/segovian_sword.txt | 11 +++ .../res/cardsfolder/s/soul_of_mirrodin.txt | 8 +++ ...word_of_fire_and_ice_and_war_and_peace.txt | 14 ++++ forge-gui/res/cardsfolder/t/tarkir_charm.txt | 10 +++ .../res/cardsfolder/t/the_alright_henge.txt | 8 +++ .../t/the_belligerent_and_useless_island.txt | 12 ++++ .../res/cardsfolder/t/the_dilu_horse.txt | 10 +++ .../res/cardsfolder/t/the_forgotten_place.txt | 9 +++ .../t/then_dreadmaws_ate_everyone.txt | 7 ++ forge-gui/res/cardsfolder/t/theros_charm.txt | 9 +++ .../res/cardsfolder/t/toe_breaking_helmet.txt | 8 +++ .../res/cardsfolder/t/toothy_and_zndrsplt.txt | 14 ++++ .../cardsfolder/t/try_my_deck_elemental.txt | 8 +++ .../res/cardsfolder/u/ulgrotha_charm.txt | 11 +++ .../cardsfolder/w/welcome_to_miniapolis.txt | 6 ++ .../res/cardsfolder/w/white_rhystic_study.txt | 6 ++ forge-gui/res/cardsfolder/w/wrath_of_oko.txt | 5 ++ ...wn Event Barcelona 2023 Playtest Cards.txt | 71 +++++++++++++++++++ ...nown Event Indiana 2023 Playtest Cards.txt | 70 ++++++++++++++++++ ...wn Event Las Vegas 2023 Playtest Cards.txt | 48 +++++++++++++ ... Event Minneapolis 2023 Playtest Cards.txt | 71 +++++++++++++++++++ ...Event Philadelphia 2023 Playtest Cards.txt | 71 +++++++++++++++++++ .../tokenscripts/all_1_1_a_stained_glass.txt | 7 ++ forge-gui/res/tokenscripts/b_1_1_cat.txt | 6 ++ forge-gui/res/tokenscripts/br_7_7_demon.txt | 6 ++ .../res/tokenscripts/colossal_dreadmaw.txt | 7 ++ .../tokenscripts/incubator_dark_confidant.txt | 18 +++++ forge-gui/res/tokenscripts/role_huntsman.txt | 8 +++ forge-gui/res/tokenscripts/role_questing.txt | 12 ++++ forge-gui/res/tokenscripts/toskis_coil.txt | 7 ++ forge-gui/res/tokenscripts/u_m1_m1_squid.txt | 6 ++ .../res/tokenscripts/w_2_2_performer.txt | 6 ++ 88 files changed, 1139 insertions(+) create mode 100644 forge-gui/res/cardsfolder/a/anax_and_cymede_and_kynaios_and_tiro.txt create mode 100644 forge-gui/res/cardsfolder/a/artifact_unknown_shores.txt create mode 100644 forge-gui/res/cardsfolder/a/avacyn_and_griselbrand.txt create mode 100644 forge-gui/res/cardsfolder/b/believe_in_the_cleave.txt create mode 100644 forge-gui/res/cardsfolder/b/bram_baguette_brawler.txt create mode 100644 forge-gui/res/cardsfolder/b/bringer_of_green_zeniths_twilight.txt create mode 100644 forge-gui/res/cardsfolder/c/cat_oven.txt create mode 100644 forge-gui/res/cardsfolder/c/chatterstorm_and_awaken_the_woods.txt create mode 100644 forge-gui/res/cardsfolder/c/cinnamon_seasoned_steed.txt create mode 100644 forge-gui/res/cardsfolder/c/colossal_dreadmaw_and_storm_crow.txt create mode 100644 forge-gui/res/cardsfolder/d/delve_too_deep.txt create mode 100644 forge-gui/res/cardsfolder/e/eldest_dragon_highlander.txt create mode 100644 forge-gui/res/cardsfolder/e/ensoul_ring.txt create mode 100644 forge-gui/res/cardsfolder/f/force_of_rowan.txt create mode 100644 forge-gui/res/cardsfolder/f/forestfolk.txt create mode 100644 forge-gui/res/cardsfolder/g/garruks_lost_wolf_hey_has_anyone_seen_garruk.txt create mode 100644 forge-gui/res/cardsfolder/g/gingerbehemoth.txt create mode 100644 forge-gui/res/cardsfolder/g/glorious_dragon_kin.txt create mode 100644 forge-gui/res/cardsfolder/h/honk.txt create mode 100644 forge-gui/res/cardsfolder/h/hound_of_urabrask.txt create mode 100644 forge-gui/res/cardsfolder/i/incisor_steed.txt create mode 100644 forge-gui/res/cardsfolder/i/incubob.txt create mode 100644 forge-gui/res/cardsfolder/i/innistrad_charm.txt create mode 100644 forge-gui/res/cardsfolder/i/isamaru_and_yoshimaru.txt create mode 100644 forge-gui/res/cardsfolder/j/jeska_and_kamahl.txt create mode 100644 forge-gui/res/cardsfolder/j/joven_and_chandler.txt create mode 100644 forge-gui/res/cardsfolder/k/kamigawa_charm.txt create mode 100644 forge-gui/res/cardsfolder/k/kevin_questing_dragon.txt create mode 100644 forge-gui/res/cardsfolder/k/knowing_half_the_battle.txt create mode 100644 forge-gui/res/cardsfolder/k/koma_and_toski_compleated.txt create mode 100644 forge-gui/res/cardsfolder/l/leech_medic.txt create mode 100644 forge-gui/res/cardsfolder/l/life_cloud.txt create mode 100644 forge-gui/res/cardsfolder/l/locus_cobra.txt create mode 100644 forge-gui/res/cardsfolder/l/luxior_and_shadowspear.txt create mode 100644 forge-gui/res/cardsfolder/m/manakin_and_millikin.txt create mode 100644 forge-gui/res/cardsfolder/m/more_of_that_strange_oil.txt create mode 100644 forge-gui/res/cardsfolder/m/mox_poison.txt create mode 100644 forge-gui/res/cardsfolder/m/myojin_of_nights_reach_grim_betrayal.txt create mode 100644 forge-gui/res/cardsfolder/m/mysterious_confluence.txt create mode 100644 forge-gui/res/cardsfolder/n/night_out_in_vegas.txt create mode 100644 forge-gui/res/cardsfolder/n/nim_mongoose.txt create mode 100644 forge-gui/res/cardsfolder/n/norin_and_feldon.txt create mode 100644 forge-gui/res/cardsfolder/o/original_skullclamp.txt create mode 100644 forge-gui/res/cardsfolder/p/phila_unsealed.txt create mode 100644 forge-gui/res/cardsfolder/p/phyrexian_adapter.txt create mode 100644 forge-gui/res/cardsfolder/p/phyrexian_broodstar.txt create mode 100644 forge-gui/res/cardsfolder/p/phyrexian_chimney_imp.txt create mode 100644 forge-gui/res/cardsfolder/p/phyrexian_esthetician.txt create mode 100644 forge-gui/res/cardsfolder/p/phyrexian_ornithopter.txt create mode 100644 forge-gui/res/cardsfolder/p/potatoes.txt create mode 100644 forge-gui/res/cardsfolder/q/questing_cosplayer.txt create mode 100644 forge-gui/res/cardsfolder/r/really_charming_prince.txt create mode 100644 forge-gui/res/cardsfolder/r/red_priest_of_yawgmoth.txt create mode 100644 forge-gui/res/cardsfolder/r/riku_and_riku.txt create mode 100644 forge-gui/res/cardsfolder/r/riven_turnbull_and_princess_lucrezia.txt create mode 100644 forge-gui/res/cardsfolder/s/sagrada_familiar.txt create mode 100644 forge-gui/res/cardsfolder/s/segovian_sword.txt create mode 100644 forge-gui/res/cardsfolder/s/soul_of_mirrodin.txt create mode 100644 forge-gui/res/cardsfolder/s/sword_of_fire_and_ice_and_war_and_peace.txt create mode 100644 forge-gui/res/cardsfolder/t/tarkir_charm.txt create mode 100644 forge-gui/res/cardsfolder/t/the_alright_henge.txt create mode 100644 forge-gui/res/cardsfolder/t/the_belligerent_and_useless_island.txt create mode 100644 forge-gui/res/cardsfolder/t/the_dilu_horse.txt create mode 100644 forge-gui/res/cardsfolder/t/the_forgotten_place.txt create mode 100644 forge-gui/res/cardsfolder/t/then_dreadmaws_ate_everyone.txt create mode 100644 forge-gui/res/cardsfolder/t/theros_charm.txt create mode 100644 forge-gui/res/cardsfolder/t/toe_breaking_helmet.txt create mode 100644 forge-gui/res/cardsfolder/t/toothy_and_zndrsplt.txt create mode 100644 forge-gui/res/cardsfolder/t/try_my_deck_elemental.txt create mode 100644 forge-gui/res/cardsfolder/u/ulgrotha_charm.txt create mode 100644 forge-gui/res/cardsfolder/w/welcome_to_miniapolis.txt create mode 100644 forge-gui/res/cardsfolder/w/white_rhystic_study.txt create mode 100644 forge-gui/res/cardsfolder/w/wrath_of_oko.txt create mode 100644 forge-gui/res/editions/Unknown Event Barcelona 2023 Playtest Cards.txt create mode 100644 forge-gui/res/editions/Unknown Event Indiana 2023 Playtest Cards.txt create mode 100644 forge-gui/res/editions/Unknown Event Las Vegas 2023 Playtest Cards.txt create mode 100644 forge-gui/res/editions/Unknown Event Minneapolis 2023 Playtest Cards.txt create mode 100644 forge-gui/res/editions/Unknown Event Philadelphia 2023 Playtest Cards.txt create mode 100644 forge-gui/res/tokenscripts/all_1_1_a_stained_glass.txt create mode 100644 forge-gui/res/tokenscripts/b_1_1_cat.txt create mode 100644 forge-gui/res/tokenscripts/br_7_7_demon.txt create mode 100644 forge-gui/res/tokenscripts/colossal_dreadmaw.txt create mode 100644 forge-gui/res/tokenscripts/incubator_dark_confidant.txt create mode 100644 forge-gui/res/tokenscripts/role_huntsman.txt create mode 100644 forge-gui/res/tokenscripts/role_questing.txt create mode 100644 forge-gui/res/tokenscripts/toskis_coil.txt create mode 100644 forge-gui/res/tokenscripts/u_m1_m1_squid.txt create mode 100644 forge-gui/res/tokenscripts/w_2_2_performer.txt diff --git a/forge-gui/res/cardsfolder/a/anax_and_cymede_and_kynaios_and_tiro.txt b/forge-gui/res/cardsfolder/a/anax_and_cymede_and_kynaios_and_tiro.txt new file mode 100644 index 00000000000..34d261e7d11 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/anax_and_cymede_and_kynaios_and_tiro.txt @@ -0,0 +1,12 @@ +Name:Anax and Cymede and Kynaios and Tiro +ManaCost:1 W U R G +Types:Legendary Creature Human Soldier +PT:3/8 +K:First Strike +K:Vigilance +T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, draw a card. Each player may put a land card from their hand onto the battlefield, then each opponent who didn't draws a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ EachPlayLand +SVar:EachPlayLand:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | DefinedPlayer$ Player | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ DrawAbstainers +SVar:DrawAbstainers:DB$ Draw | Defined$ OppNonRememberedOwner | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:First strike, vigilance\nHeroic — Whenever you cast a spell that targets Anax and Cymede and Kynaios and Tiro, draw a card. Each player may put a land card from their hand onto the battlefield, then each opponent who didn't draws a card. diff --git a/forge-gui/res/cardsfolder/a/artifact_unknown_shores.txt b/forge-gui/res/cardsfolder/a/artifact_unknown_shores.txt new file mode 100644 index 00000000000..0cc0c8693cb --- /dev/null +++ b/forge-gui/res/cardsfolder/a/artifact_unknown_shores.txt @@ -0,0 +1,8 @@ +Name:Artifact Unknown Shores +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. +AI:RemoveDeck:Random +DeckHas:Ability$Mana.Colorless +Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/a/avacyn_and_griselbrand.txt b/forge-gui/res/cardsfolder/a/avacyn_and_griselbrand.txt new file mode 100644 index 00000000000..829d5609634 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/avacyn_and_griselbrand.txt @@ -0,0 +1,11 @@ +Name:Avacyn and Griselbrand +ManaCost:4 W W B B +Types:Legendary Creature Angel Demon +PT:8/8 +K:Flying +K:Vigilance +K:Lifelink +A:AB$ PumpAll | Cost$ PayLife<8> | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SubAbility$ DBDraw | SpellDescription$ Each creature you control gains indestructible until end of turn. Then, draw a card for each creature you control. +SVar:DBDraw:DB$ Draw | NumCards$ X +SVar:X:Count$TypeYouCtrl.Creature +Oracle:Flying, vigilance, lifelink\nPay 8 life: Each creature you control gains indestructible until end of turn. Then, draw a card for each creature you control. diff --git a/forge-gui/res/cardsfolder/b/believe_in_the_cleave.txt b/forge-gui/res/cardsfolder/b/believe_in_the_cleave.txt new file mode 100644 index 00000000000..c8eeb1c6a11 --- /dev/null +++ b/forge-gui/res/cardsfolder/b/believe_in_the_cleave.txt @@ -0,0 +1,7 @@ +Name:Believe in the Cleave +ManaCost:3 R +Types:Instant +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each attacking creature you control. +SVar:X:Count$Valid Creature.attacking+YouCtrl +A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 | KW$ Double Strike | SpellDescription$ Target creature gets +1/+1 and gains double strike until end of turn. | StackDescription$ SpellDescription +Oracle:Believe in the Cleave costs {1} less to cast for each attacking creature you control.\nTarget creature gets +1/+1 and gains double strike until end of turn. diff --git a/forge-gui/res/cardsfolder/b/bram_baguette_brawler.txt b/forge-gui/res/cardsfolder/b/bram_baguette_brawler.txt new file mode 100644 index 00000000000..459fbf389e2 --- /dev/null +++ b/forge-gui/res/cardsfolder/b/bram_baguette_brawler.txt @@ -0,0 +1,11 @@ +Name:Bram, Baguette Brawler +ManaCost:1 W +Types:Legendary Creature Human Peasant +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You +S:Mode$ Continuous | Affected$ Food.nonCreature+YouCtrl | AddType$ Equipment | AddStaticAbility$ FoodEquip | AddKeyword$ Equip:1 | Description$ Each noncreature Food you control is an Equipment with equip {1} and "Equipped creature gets +1/+1." +SVar:FoodEquip:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. +DeckHas:Ability$Token|Sacrifice & Type$Food|Artifact|Equipment +DeckHints:Type$Food +Oracle:When Bram, Baguette Brawler enters the battlefield, create a Food token.\nEach noncreature Food you control is an Equipment with equip {1} and "Equipped creature gets +1/+1." diff --git a/forge-gui/res/cardsfolder/b/bringer_of_green_zeniths_twilight.txt b/forge-gui/res/cardsfolder/b/bringer_of_green_zeniths_twilight.txt new file mode 100644 index 00000000000..b78c29c0a19 --- /dev/null +++ b/forge-gui/res/cardsfolder/b/bringer_of_green_zeniths_twilight.txt @@ -0,0 +1,14 @@ +Name:Bringer of Green Zenith's Twilight +ManaCost:X G G +Types:Creature Phyrexian Bringer +PT:2/2 +S:Mode$ AlternativeCost | ValidSA$ Spell.Self | EffectZone$ All | Cost$ W U B R G | Description$ You may pay {W}{U}{B}{R}{G} rather than pay this spell's mana cost. If you do, X is 5. +K:etbCounter:P1P1:Y:no condition:CARDNAME enters the battlefield with X +1/+1 counters on it. If X was 5 or greater, it enters with twice that many counters instead. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME dies, shuffle it into its owner's library. +SVar:TrigChange:DB$ ChangeZone | Destination$ Library | Shuffle$ True | Defined$ TriggeredNewCardLKICopy +SVar:X:Count$xPaid +SVar:AltCostPaid:Count$AltCost.5.X +SVar:Y:Count$Compare AltCostPaid LT5.AltCostPaid.Z +SVar:Z:SVar$AltCostPaid/Twice +DeckHas:Ability$Counters +Oracle:You may pay {W}{U}{B}{R}{G} rather than pay this spell's mana cost. If you do, X is 5.\nBringer of Green Zenith's Twilight enters the battlefield with X +1/+1 counters on it. If X was 5 or greater, it enters with twice that many counters instead.\nWhen Bringer of Green Zenith's Twilight dies, shuffle it into its owner's library. diff --git a/forge-gui/res/cardsfolder/c/cat_oven.txt b/forge-gui/res/cardsfolder/c/cat_oven.txt new file mode 100644 index 00000000000..d90e3777c76 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/cat_oven.txt @@ -0,0 +1,12 @@ +Name:Cat Oven +ManaCost:1 +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFood | TriggerDescription$ When CARDNAME enters the battlefield, create a Food token. +SVar:TrigFood:DB$ Token | TokenScript$ c_a_food_sac | TokenAmount$ 1 +A:AB$ Token | Cost$ T Sac<1/Food> | TokenScript$ b_1_1_cat | TokenAmount$ 1 | SubAbility$ DBDrain | SpellDescription$ Create a 1/1 black Cat creature token. Each opponent loses 1 life and you gain 1 life. +SVar:DBDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +SVar:AIPreference:SacCost$Food.token +DeckHas:Ability$Token|Sacrifice|LifeGain & Type$Food|Artifact|Cat +DeckHints:Type$Food +Oracle:When Cat Oven enters the battlefield, create a Food token.\n{T}, Sacrifice a Food: Create a 1/1 black Cat creature token. Each opponent loses 1 life and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/c/chatterstorm_and_awaken_the_woods.txt b/forge-gui/res/cardsfolder/c/chatterstorm_and_awaken_the_woods.txt new file mode 100644 index 00000000000..ff6528fdc87 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/chatterstorm_and_awaken_the_woods.txt @@ -0,0 +1,7 @@ +Name:Chatterstorm and Awaken the Woods +ManaCost:1 G +Types:Sorcery +K:Storm +A:SP$ Token | TokenAmount$ 1 | TokenScript$ g_1_1_forest_dryad_squirrel | TokenOwner$ You | SpellDescription$ Create a 1/1 green Forest Dryad Squirrel land creature token. +DeckHas:Ability$Token +Oracle:Create a 1/1 green Forest Dryad Squirrel land creature token. (It's affected by summoning sickness.)\nStorm (When you cast this spell, copy it for each spell cast before it this turn.) diff --git a/forge-gui/res/cardsfolder/c/cinnamon_seasoned_steed.txt b/forge-gui/res/cardsfolder/c/cinnamon_seasoned_steed.txt new file mode 100644 index 00000000000..69ae8f5a495 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/cinnamon_seasoned_steed.txt @@ -0,0 +1,14 @@ +Name:Cinnamon, Seasoned Steed +ManaCost:1 +Types:Legendary Artifact Creature Food Horse +PT:1/1 +S:Mode$ Continuous | Affected$ Creature.Food+Other+YouCtrl | AddKeyword$ Horsemanship | Description$ Other Food creatures you control have horsemanship. (They can't be blocked except by creatures with horsemanship.) +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your combat step, you may put a +1/+1 counter on target non-creature Food you control. If you do, it becomes a 0/0 Knight creature in addition to its other types. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Food.nonCreature+YouCtrl | TgtPrompt$ Select target noncreature Food you control | CounterType$ P1P1 | CounterNum$ 1 | RememberCards$ True | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 0 | Toughness$ 0 | Types$ Creature,Knight | Duration$ Permanent | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +SVar:PlayMain1:TRUE +DeckHas:Ability$LifeGain|Counters & Type$Knight +DeckHints:Type$Food +Oracle:Other Food creatures you control have horsemanship. (They can't be blocked except by creatures with horsemanship.)\nAt the beginning of your combat step, you may put a +1/+1 counter on target non-creature Food you control. If you do, it becomes a 0/0 Knight creature in addition to its other types.\n{2}, {T}, Sacrifice Cinnamon, Seasoned Steed: You gain 3 life. diff --git a/forge-gui/res/cardsfolder/c/colossal_dreadmaw_and_storm_crow.txt b/forge-gui/res/cardsfolder/c/colossal_dreadmaw_and_storm_crow.txt new file mode 100644 index 00000000000..c979c78910e --- /dev/null +++ b/forge-gui/res/cardsfolder/c/colossal_dreadmaw_and_storm_crow.txt @@ -0,0 +1,7 @@ +Name:Colossal Dreadmaw and Storm Crow +ManaCost:5 U G +Types:Legendary Creature Dinosaur Bird +PT:7/8 +K:Flying +K:Trample +Oracle:Flying, trample diff --git a/forge-gui/res/cardsfolder/d/delve_too_deep.txt b/forge-gui/res/cardsfolder/d/delve_too_deep.txt new file mode 100644 index 00000000000..1545f121692 --- /dev/null +++ b/forge-gui/res/cardsfolder/d/delve_too_deep.txt @@ -0,0 +1,9 @@ +Name:Delve too Deep +ManaCost:X B +Types:Sorcery +K:Delve +A:SP$ Pump | ValidTgts$ Creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SubAbility$ DBToken | SpellDescription$ Target creature gets -X/-X until end of turn. If X was 7 or greater, create a 7/7 black and red Demon creature token. +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ br_7_7_demon | TokenOwner$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ GE7 +SVar:X:Count$xPaid +DeckHas:Ability$Token & Type$Demon +Oracle:Delve\nTarget creature gets -X/-X until end of turn. If X was 7 or greater, create a 7/7 black and red Demon creature token. diff --git a/forge-gui/res/cardsfolder/e/eldest_dragon_highlander.txt b/forge-gui/res/cardsfolder/e/eldest_dragon_highlander.txt new file mode 100644 index 00000000000..499d218bd5a --- /dev/null +++ b/forge-gui/res/cardsfolder/e/eldest_dragon_highlander.txt @@ -0,0 +1,10 @@ +Name:Eldest Dragon Highlander +ManaCost:W W U U B B R R G G +Types:Legendary Creature Elder Dragon +PT:7/7 +K:Flying +K:Trample +K:Rampage:2 +A:AB$ PumpAll | Cost$ W U B R G | ValidCards$ Dragon.Elder+YouCtrl | NumAtt$ 7 | NumDef$ 7 | SpellDescription$ Elder Dragons you control get +7/+7 until end of turn. +K:UpkeepCost:W U B R G +Oracle:Flying, trample, rampage 2\n{W}{U}{B}{R}{G}: Elder Dragons you control get +7/+7 until end of turn.\nAt the beginning of your upkeep, sacrifice Eldest Dragon Highlander unless you pay {W}{U}{B}{R}{G}. diff --git a/forge-gui/res/cardsfolder/e/ensoul_ring.txt b/forge-gui/res/cardsfolder/e/ensoul_ring.txt new file mode 100644 index 00000000000..762e1340bbc --- /dev/null +++ b/forge-gui/res/cardsfolder/e/ensoul_ring.txt @@ -0,0 +1,9 @@ +Name:Ensoul Ring +ManaCost:1 U +Types:Enchantment Aura +K:Enchant nonland permanent +A:SP$ Attach | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | AILogic$ Curse +S:Mode$ Continuous | Affected$ Permanent.EnchantedBy | SetColor$ Colorless | AddType$ Artifact | RemoveCardTypes$ True | RemoveArtifactTypes$ True | AddAbility$ SolMana | SetName$ Sol Ring | RemoveAllAbilities$ True | Description$ Enchanted permanent is a Sol Ring. (It's no longer anything else.) +SVar:SolMana:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C}. +SVar:NonStackingAttachEffect:True +Oracle:Enchant nonland permanent.\nEnchanted permanent is a Sol Ring. (It's no longer anything else.) diff --git a/forge-gui/res/cardsfolder/f/force_of_rowan.txt b/forge-gui/res/cardsfolder/f/force_of_rowan.txt new file mode 100644 index 00000000000..bb13d415dcd --- /dev/null +++ b/forge-gui/res/cardsfolder/f/force_of_rowan.txt @@ -0,0 +1,7 @@ +Name:Force of Rowan +ManaCost:3 R R +Types:Instant +S:Mode$ AlternativeCost | ValidSA$ Spell.Self | EffectZone$ All | Cost$ PayLife<1> ExileFromHand<1/Card.Red+Other> | Description$ You may pay 1 life and exile a red card from your hand rather than pay this spell's mana cost. +A:SP$ CopySpellAbility | ValidTgts$ Instant,Sorcery | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. +DeckHints:Type$Instant|Sorcery +Oracle:You may pay 1 life and exile a red card from your hand rather than pay this spell's mana cost.\nCopy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/f/forestfolk.txt b/forge-gui/res/cardsfolder/f/forestfolk.txt new file mode 100644 index 00000000000..8b6286097c4 --- /dev/null +++ b/forge-gui/res/cardsfolder/f/forestfolk.txt @@ -0,0 +1,10 @@ +Name:Forestfolk +ManaCost:2 G U +Types:Creature Elf Wizard +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle. +SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | ShuffleNonMandatory$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME leaves the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ TriggeredCardController | NumCards$ 1 +SVar:SacMe:1 +Oracle:When Forestfolk enters the battlefield, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.\nWhen Forestfolk leaves the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/g/garruks_lost_wolf_hey_has_anyone_seen_garruk.txt b/forge-gui/res/cardsfolder/g/garruks_lost_wolf_hey_has_anyone_seen_garruk.txt new file mode 100644 index 00000000000..d2e9957ced7 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/garruks_lost_wolf_hey_has_anyone_seen_garruk.txt @@ -0,0 +1,19 @@ +Name:Garruk's Lost Wolf +ManaCost:3 G +Types:Creature Wolf +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Huntsman Role token attached to another target creature you control. (Enchanted creature gets +1/+1 and has "{T}: Add {G}") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ role_huntsman | TokenOwner$ You | AttachedTo$ Targeted | ValidTgts$ Creature.YouCtrl+Other | TgtPrompt$ Select another target creature you control +DeckHas:Ability$Mill|Graveyard|Token & Type$Aura|Enchantment|Role +AlternateMode:Adventure +Oracle:When Garruk's Lost Wolf enters the battlefield, create a Huntsman Role token attached to another target creature you control. (Enchanted creature gets +1/+1 and has "{T}: Add {G}") + +ALTERNATE + +Name:Hey, Has Anyone Seen Garruk? +ManaCost:1 G +Types:Sorcery Adventure +A:SP$ Mill | NumCards$ 4 | RememberMilled$ True | SubAbility$ DBChangeZone | SpellDescription$ Mill the top four cards of your library. Return a creature or planeswalker card milled this way to your hand. +SVar:DBChangeZone:DB$ ChangeZone | Hidden$ True | Origin$ Graveyard,Exile | Mandatory$ True | Destination$ Hand | ChangeType$ Card.IsRemembered+Creature,Card.IsRemembered+Planeswalker | SelectPrompt$ Return a creature or planeswalker card milled this way to your hand | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Mill the top four cards of your library. Return a creature or planeswalker card milled this way to your hand. diff --git a/forge-gui/res/cardsfolder/g/gingerbehemoth.txt b/forge-gui/res/cardsfolder/g/gingerbehemoth.txt new file mode 100644 index 00000000000..3ba1da1f695 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/gingerbehemoth.txt @@ -0,0 +1,12 @@ +Name:Gingerbehemoth +ManaCost:6 +Types:Artifact Creature Food Golem +PT:6/6 +K:Vigilance +K:Trample +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Secondary$ True | Description$ CARDNAME costs {2} less to cast for each Food you've sacrificed this turn. +SVar:X:PlayerCountPropertyYou$SacrificedThisTurn Food/Times.2 +A:AB$ GainLife | Cost$ 4 T Sac<1/CARDNAME> | LifeAmount$ 6 | SpellDescription$ You gain 6 life. +DeckHas:Ability$LifeGain +DeckHints:Type$Food +Oracle:Gingerbehemoth costs {2} less to cast for each Food you've sacrificed this turn.\nVigilance, trample\n{4}, {T}, Sacrifice Gingerbehemoth: You gain 6 life. diff --git a/forge-gui/res/cardsfolder/g/glorious_dragon_kin.txt b/forge-gui/res/cardsfolder/g/glorious_dragon_kin.txt new file mode 100644 index 00000000000..a8fee7e2fdb --- /dev/null +++ b/forge-gui/res/cardsfolder/g/glorious_dragon_kin.txt @@ -0,0 +1,9 @@ +Name:Glorious Dragon-Kin +ManaCost:7 +Types:Artifact Creature Dragon +PT:6/6 +K:Flying +K:ETBReplacement:Other:ChooseColor +SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a color. | AILogic$ MostProminentInHumanDeck +S:Mode$ Continuous | Affected$ Creature.Artifact+YouCtrl,Dragon.YouCtrl | AddKeyword$ Protection:Card.ChosenColor:chosenColor | Description$ Artifact creatures and Dragons you control have protection from the chosen color. +Oracle:Flying\nAs Glorious Dragon-Kin enters the battlefield, choose a color.\nArtifact creatures and Dragons you control have protection from the chosen color. diff --git a/forge-gui/res/cardsfolder/h/honk.txt b/forge-gui/res/cardsfolder/h/honk.txt new file mode 100644 index 00000000000..7065108c383 --- /dev/null +++ b/forge-gui/res/cardsfolder/h/honk.txt @@ -0,0 +1,10 @@ +Name:HONK! +ManaCost:G +Types:Instant +A:SP$ Charm | Choices$ TheGooseIsLoose,TheGooseLaidAnEgg +SVar:TheGooseIsLoose:DB$ Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ DBGiveFood | SpellDescription$ The Goose is Loose — Destroy target artifact or enchantment. Its controller creates a Food token. +SVar:DBGiveFood:DB$ Token | TokenScript$ c_a_food_sac | TokenOwner$ TargetedController | TokenAmount$ 1 +SVar:TheGooseLaidAnEgg:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBGetFood | SpellDescription$ The Goose Laid an Egg — Put a +1/+1 counter on target creature. You create a Food token. +SVar:DBGetFood:DB$ Token | TokenScript$ c_a_food_sac | TokenAmount$ 1 +DeckHas:Ability$Token|Counters|LifeGain & Type$Food|Artifact +Oracle:Choose one —\n• The Goose is Loose — Destroy target artifact or enchantment. Its controller creates a Food token.\n• The Goose Laid an Egg — Put a +1/+1 counter on target creature. You create a Food token. diff --git a/forge-gui/res/cardsfolder/h/hound_of_urabrask.txt b/forge-gui/res/cardsfolder/h/hound_of_urabrask.txt new file mode 100644 index 00000000000..6614c7682dd --- /dev/null +++ b/forge-gui/res/cardsfolder/h/hound_of_urabrask.txt @@ -0,0 +1,11 @@ +Name:Hound of Urabrask +ManaCost:3 R R +Types:Creature Phyrexian +PT:3/3 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_EQ0_OIL | TriggerZones$ Battlefield | Execute$ DBReturn | TriggerDescription$ Oildying (When this creature dies, if it had no oil counters on it, return it to the battlefield under its owner's control with an oil counter on it.) +SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield | WithCountersType$ OIL +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each oil counter on it. +S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_OIL | AddKeyword$ Double Strike | Description$ As long as CARDNAME has an oil counter on it, it has double strike. +SVar:X:Count$CardCounters.OIL +DeckHas:Ability$Counters +Oracle:Oildying (When this creature dies, if it had no oil counters on it, return it to the battlefield under its owner's control with an oil counter on it.)\nHound of Urabrask gets +1/+1 for each oil counter on it.\nAs long as Hound of Urabrask has an oil counter on it, it has double strike. diff --git a/forge-gui/res/cardsfolder/i/incisor_steed.txt b/forge-gui/res/cardsfolder/i/incisor_steed.txt new file mode 100644 index 00000000000..6c0248619af --- /dev/null +++ b/forge-gui/res/cardsfolder/i/incisor_steed.txt @@ -0,0 +1,10 @@ +Name:Incisor Steed +ManaCost:1 W +Types:Artifact Creature Phyrexian Horse +PT:1/4 +K:Vigilance +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 3 | CheckSVar$ X | SVarCompare$ GE3 | Condition$ Metalcraft | Description$ Corrupted Metalcraft — As long as you control three or more artifacts and an opponent has three or more poison counters, CARDNAME gets +3/+0. +SVar:X:PlayerCountOpponents$HighestCounters.Poison +SVar:BuffedBy:Artifact +DeckHints:Keyword$Toxic|Infect & Type$Artifact +Oracle:Vigilance\nCorrupted Metalcraft — As long as you control three or more artifacts and an opponent has three or more poison counters, Incisor Steed gets +3/+0. diff --git a/forge-gui/res/cardsfolder/i/incubob.txt b/forge-gui/res/cardsfolder/i/incubob.txt new file mode 100644 index 00000000000..72674a4c7fa --- /dev/null +++ b/forge-gui/res/cardsfolder/i/incubob.txt @@ -0,0 +1,7 @@ +Name:Incubob +ManaCost:1 B +Types:Sorcery +K:Flashback:3 B PayLife<3> +A:SP$ Token | TokenScript$ incubator_dark_confidant | WithCountersType$ P1P1 | WithCountersAmount$ 1 | SpellDescription$ Incubate Dark Confidant 1. (Create an Incubator Dark Confidant token with a +1/+1 counter on it and "{2}: Transform this artifact." It transforms into Dark Confidant, except it's also a Phyrexian.) +DeckHas:Ability$Token|Counters & Type$Incubator|Artifact|Phyrexian|Human|Wizard +Oracle:Incubate Dark Confidant 1. (Create an Incubator Dark Confidant token with a +1/+1 counter on it and "{2}: Transform this artifact." It transforms into Dark Confidant, except it's also a Phyrexian.)\nFlashback—{3}{B}, Pay 3 life. diff --git a/forge-gui/res/cardsfolder/i/innistrad_charm.txt b/forge-gui/res/cardsfolder/i/innistrad_charm.txt new file mode 100644 index 00000000000..95cfda485b4 --- /dev/null +++ b/forge-gui/res/cardsfolder/i/innistrad_charm.txt @@ -0,0 +1,11 @@ +Name:Innistrad Charm +ManaCost:1 B +Types:Sorcery +A:SP$ Charm | Choices$ CemeteryRecruitment,Duress,HumanFrailty | Defined$ You +SVar:CemeteryRecruitment:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SubAbility$ DBDraw | RememberChanged$ True | SpellDescription$ Return target creature card from your graveyard to your hand. If it's a Zombie card, draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Zombie | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Duress:DB$ Discard | ValidTgts$ Opponent | Mode$ RevealYouChoose | DiscardValid$ Card.nonCreature+nonLand | NumCards$ 1 | SpellDescription$ Target opponent reveals their hand. You choose a noncreature, nonland card from it. That player discards that card. +SVar:HumanFrailty:DB$ Destroy | ValidTgts$ Creature.Human | TgtPrompt$ Choose target Human creature. | SpellDescription$ Destroy target Human creature. +DeckHints:Type$Zombie +Oracle:Choose one —\n• Cemetery Recruitment (Return a creature card from graveyard to hand, draw a card if it's a Zombie.)\n• Duress (Look at their hand, make them discard a noncreature, nonland.)\n• Human Frailty (Destroy target Human.) diff --git a/forge-gui/res/cardsfolder/i/isamaru_and_yoshimaru.txt b/forge-gui/res/cardsfolder/i/isamaru_and_yoshimaru.txt new file mode 100644 index 00000000000..f0496cee645 --- /dev/null +++ b/forge-gui/res/cardsfolder/i/isamaru_and_yoshimaru.txt @@ -0,0 +1,9 @@ +Name:Isamaru and Yoshimaru +ManaCost:W +Types:Legendary Creature Dog +PT:2/2 +T:Mode$ ChangesZone | ValidCard$ Creature.Legendary+Other+YouCtrl,Creature.cmcEQ1+Other+YouCtrl | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever another legendary creature or creature with mana value one enters the battlefield under your control, put a +1/+1 counter on CARDNAME. +SVar:TrigCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Creature.Legendary,Creature.cmcEQ1 +DeckHas:Ability$Counters +Oracle:Whenever another legendary creature or creature with mana value one enters the battlefield under your control, put a +1/+1 counter on Isamaru and Yoshimaru. diff --git a/forge-gui/res/cardsfolder/j/jeska_and_kamahl.txt b/forge-gui/res/cardsfolder/j/jeska_and_kamahl.txt new file mode 100644 index 00000000000..62eafd48800 --- /dev/null +++ b/forge-gui/res/cardsfolder/j/jeska_and_kamahl.txt @@ -0,0 +1,8 @@ +Name:Jeska and Kamahl +ManaCost:3 R +Types:Legendary Creature Human Barbarian Warrior +PT:4/1 +K:First Strike +K:Haste +A:AB$ DealDamage | Cost$ T | ValidTgts$ Opponent,Planeswalker,Battle | TgtPrompt$ Select target opponent, battle, or planeswalker | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target opponent, battle, or planeswalker. +Oracle:Haste, first strike\n{T}: Jeska and Kamahl deals 2 damage to target opponent, battle, or planeswalker. diff --git a/forge-gui/res/cardsfolder/j/joven_and_chandler.txt b/forge-gui/res/cardsfolder/j/joven_and_chandler.txt new file mode 100644 index 00000000000..6203ed0d458 --- /dev/null +++ b/forge-gui/res/cardsfolder/j/joven_and_chandler.txt @@ -0,0 +1,12 @@ +Name:Joven and Chandler +ManaCost:3 R R +Types:Legendary Creature Human Rogue +PT:3/3 +K:Backup:2:BackupAbilities +SVar:BackupAbilities:DB$ Animate | Keywords$ Haste | Triggers$ DamageTrig +SVar:DamageTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDestroy | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to an opponent, destroy target artifact that player controls. +K:Haste +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDestroy | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to an opponent, destroy target artifact that player controls. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.ControlledBy TriggeredTarget | TgtPrompt$ Select target artifact damaged player controls +DeckHas:Ability$Counters +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 abilities until end of turn.)\nHaste\nWhenever this creature deals combat damage to an opponent, destroy target artifact that player controls. diff --git a/forge-gui/res/cardsfolder/k/kamigawa_charm.txt b/forge-gui/res/cardsfolder/k/kamigawa_charm.txt new file mode 100644 index 00000000000..b26dba91fd9 --- /dev/null +++ b/forge-gui/res/cardsfolder/k/kamigawa_charm.txt @@ -0,0 +1,14 @@ +Name:Kamigawa Charm +ManaCost:1 G G +Types:Sorcery +A:SP$ Charm | Choices$ DosansOldestChant,KodamasReach,TimeOfNeed | Defined$ You +SVar:DosansOldestChant:DB$ GainLife | LifeAmount$ 6 | SubAbility$ DBDraw | SpellDescription$ You gain 6 life. Draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 +SVar:KodamasReach:DB$ ChangeZone | Origin$ Library | Destination$ Library | ChangeType$ Land.Basic | ChangeNum$ 2 | RememberChanged$ True | Reveal$ True | Shuffle$ False | StackDescription$ SpellDescription | SubAbility$ DBChangeZone1 | SpellDescription$ Search your library for up to two basic land cards, reveal those cards, put one onto the battlefield tapped and the other into your hand, then shuffle. +SVar:DBChangeZone1:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.IsRemembered | ChangeNum$ 1 | Mandatory$ True | NoLooking$ True | SelectPrompt$ Select a card for the battlefield | Tapped$ True | Shuffle$ False | SubAbility$ DBChangeZone2 | StackDescription$ None +SVar:DBChangeZone2:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.IsRemembered | Mandatory$ True | NoLooking$ True | SelectPrompt$ Select a card for your hand | StackDescription$ None | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TimeOfNeed:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Legendary | ChangeNum$ 1 | SpellDescription$ Search your library for a legendary creature card, reveal it, put it into your hand, then shuffle. +DeckHas:Ability$LifeGain +DeckHints:Type$Legendary +Oracle:Choose one —\n• Dosan's Oldest Chant (Gain 6 life, draw a card.)\n• Kodama's Reach (Search for two basic lands, put one onto the battlefield tapped and one to hand.)\n• Time of Need (Search for a legend.) diff --git a/forge-gui/res/cardsfolder/k/kevin_questing_dragon.txt b/forge-gui/res/cardsfolder/k/kevin_questing_dragon.txt new file mode 100644 index 00000000000..3e0c3f16c6e --- /dev/null +++ b/forge-gui/res/cardsfolder/k/kevin_questing_dragon.txt @@ -0,0 +1,17 @@ +Name:Kevin, Questing Dragon +ManaCost:4 R R R R +Types:Legendary Creature Dragon +PT:8/8 +K:Devour:2 +K:Flying +K:Landwalk:Mountain +K:Rampage:2 +K:Bushido:2 +K:Trample:Planeswalker +R:Event$ Counter | ValidCard$ Card.Self | ValidSA$ Spell | Layer$ CantHappen | Description$ This spell can't be countered. +S:Mode$ CantPreventDamage | Description$ Damage can't be prevented. +S:Mode$ CantGainLife | ValidPlayer$ Player | Description$ Players can't gain life. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigControl | TriggerZones$ Battlefield | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, gain control of target land that player controls. Untap it. +SVar:TrigControl:DB$ GainControl | ValidTgts$ Land.ControlledBy TriggeredTarget | TgtPrompt$ Select target land damaged player controls | SubAbility$ DBUntap +SVar:DBUntap:DB$ Untap | Defined$ Targeted | SpellDescription$ Untap it. +Oracle:Kevin can't be countered, devour 2\nFlying, mountainwalk, rampage 2, bushido 2, trample over planeswalkers\nDamage can't be prevented.\nPlayers can't gain life.\nWhenever Kevin deals combat damage to a player, gain control of target land that player controls. Untap it. diff --git a/forge-gui/res/cardsfolder/k/knowing_half_the_battle.txt b/forge-gui/res/cardsfolder/k/knowing_half_the_battle.txt new file mode 100644 index 00000000000..91cf1902b37 --- /dev/null +++ b/forge-gui/res/cardsfolder/k/knowing_half_the_battle.txt @@ -0,0 +1,15 @@ +Name:Knowing +ManaCost:3 U U +Types:Sorcery +A:SP$ Draw | NumCards$ 3 | SpellDescription$ Draw three cards. +AlternateMode:Split +Oracle:Draw three cards. + +ALTERNATE + +Name:Half the Battle +ManaCost:2 R +Types:Sorcery +DeckHints:Type$Battle +A:SP$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Battle | ChangeNum$ 1 | SpellDescription$ Search your library for a Battle card, reveal it, put it into your hand, then shuffle. +Oracle:Search your library for a Battle card, reveal it, put it into your hand, then shuffle. diff --git a/forge-gui/res/cardsfolder/k/koma_and_toski_compleated.txt b/forge-gui/res/cardsfolder/k/koma_and_toski_compleated.txt new file mode 100644 index 00000000000..f8d2937ce62 --- /dev/null +++ b/forge-gui/res/cardsfolder/k/koma_and_toski_compleated.txt @@ -0,0 +1,14 @@ +Name:Koma and Toski, Compleated +ManaCost:6 U G +Types:Legendary Creature Phyrexian Serpent Squirrel +PT:7/7 +R:Event$ Counter | ValidCard$ Card.Self | ValidSA$ Spell | Layer$ CantHappen | Description$ This spell can't be countered. +T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of each upkeep, create a 1/1 Phyrexian Serpent Squirrel artifact creature token named Toski's Coil with "Whenever this creature deals combat damage to a player, draw a card." +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ toskis_coil | TokenOwner$ You +A:AB$ Charm | Cost$ Sac<1/Serpent.Other;Squirrel.Other/another Serpent or Squirrel> | Choices$ DBEffect,DBPump +SVar:DBEffect:DB$ Effect | ValidTgts$ Creature | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | StaticAbilities$ MustAttack | SubAbility$ DBConstrict | SpellDescription$ Target creature attacks this turn if able. Its activated abilities can't be activated this turn. +SVar:MustAttack:Mode$ MustAttack | ValidCreature$ Card.IsRemembered | Description$ This creature attacks this turn if able. +SVar:DBConstrict:DB$ Pump | Defined$ ParentTarget | KW$ HIDDEN CARDNAME's activated abilities can't be activated. | StackDescription$ None +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Indestructible | SpellDescription$ CARDNAME gains indestructible until end of turn. +DeckHas:Ability$Token|Sacrifice & Type$Artifact +Oracle:This spell can't be countered.\nAt the beginning of each upkeep, create a 1/1 Phyrexian Serpent Squirrel artifact creature token named Toski's Coil with "Whenever this creature deals combat damage to a player, draw a card."\nSacrifice another Serpent or Squirrel: Choose one —\n• Target creature attacks this turn if able. Its activated abilities can't be activated this turn.\n• Koma and Toski, Compleated gains indestructible until end of turn. diff --git a/forge-gui/res/cardsfolder/l/leech_medic.txt b/forge-gui/res/cardsfolder/l/leech_medic.txt new file mode 100644 index 00000000000..51dc11b0c0d --- /dev/null +++ b/forge-gui/res/cardsfolder/l/leech_medic.txt @@ -0,0 +1,7 @@ +Name:Leech Medic +ManaCost:3 W +Types:Creature Leech Cleric +PT:3/4 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigConjure | TriggerDescription$ When CARDNAME enters the battlefield, create a Leeches token card and put it into your hand. +SVar:TrigConjure:DB$ MakeCard | Name$ Leeches | TokenCard$ True | Zone$ Hand +Oracle:When Leech Medic enters the battlefield, create a Leeches token card and put it into your hand. diff --git a/forge-gui/res/cardsfolder/l/life_cloud.txt b/forge-gui/res/cardsfolder/l/life_cloud.txt new file mode 100644 index 00000000000..6610ea329f3 --- /dev/null +++ b/forge-gui/res/cardsfolder/l/life_cloud.txt @@ -0,0 +1,11 @@ +Name:Life Cloud +ManaCost:X W W W +Types:Sorcery +A:SP$ GainLife | Defined$ Player | LifeAmount$ X | SubAbility$ DBDraw | SpellDescription$ Each player gains X life, draws X cards, returns X creatures from their graveyard to the battlefield, then returns X lands from their graveyard to the battlefield. +SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ Player | SubAbility$ DBRepeatCreature +SVar:DBRepeatCreature:DB$ RepeatEach | RepeatSubAbility$ DBReturnCreature | RepeatPlayers$ Player | SubAbility$ DBRepeatLand +SVar:DBReturnCreature:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeNum$ X | Hidden$ True | Mandatory$ True +SVar:DBRepeatLand:DB$ RepeatEach | RepeatSubAbility$ DBReturnLand | RepeatPlayers$ Player +SVar:DBReturnLand:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Land.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeNum$ X | Hidden$ True | Mandatory$ True +SVar:X:Count$xPaid +Oracle:Each player gains X life, draws X cards, returns X creatures from their graveyard to the battlefield, then returns X lands from their graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/l/locus_cobra.txt b/forge-gui/res/cardsfolder/l/locus_cobra.txt new file mode 100644 index 00000000000..4b202e55de0 --- /dev/null +++ b/forge-gui/res/cardsfolder/l/locus_cobra.txt @@ -0,0 +1,11 @@ +Name:Locus Cobra +ManaCost:1 G +Types:Creature Phyrexian Snake +PT:1/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMana | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, add one mana of any color. If it was a Locus or Sphere land, put a +1/+1 counter on CARDNAME. +SVar:TrigMana:DB$ Mana | Produced$ Any | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | ConditionDefined$ TriggeredCard | ConditionPresent$ Locus,Sphere +SVar:BuffedBy:Locus,Sphere +DeckHas:Ability$Counters +DeckHints:Type$Locus|Sphere +Oracle:Landfall — Whenever a land enters the battlefield under your control, add one mana of any color. If it was a Locus or Sphere land, put a +1/+1 counter on Locus Cobra. diff --git a/forge-gui/res/cardsfolder/l/luxior_and_shadowspear.txt b/forge-gui/res/cardsfolder/l/luxior_and_shadowspear.txt new file mode 100644 index 00000000000..9e6e4d5071f --- /dev/null +++ b/forge-gui/res/cardsfolder/l/luxior_and_shadowspear.txt @@ -0,0 +1,10 @@ +Name:Luxior and Shadowspear +ManaCost:2 +Types:Legendary Artifact Equipment +K:Equip:3:Planeswalker.YouCtrl:planeswalker +K:Equip:3 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ X | AddToughness$ X | AddKeyword$ Trample & Lifelink | Description$ Equipped creature gets +1/+1 for each counter on it, and has trample and lifelink. +SVar:X:Equipped$CardCounters.ALL +S:Mode$ Continuous | Affected$ Permanent.EquippedBy | RemoveType$ Planeswalker | AddType$ Creature | Description$ Equipped permanent isn't a planeswalker and is a creature in addition it its other types. (Loyalty abilities can still be activated.) +A:AB$ AnimateAll | Cost$ 1 | ValidCards$ Permanent.OppCtrl | RemoveKeywords$ Hexproof & Indestructible | SpellDescription$ Permanents your opponents control lose hexproof and indestructible until end of turn. | StackDescription$ SpellDescription +Oracle:Equipped creature gets +1/+1 for each counter on it, and has trample and lifelink.\n{1}: Permanents your opponents control lose hexproof and indestructible until end of turn.\nEquipped permanent isn't a planeswalker and is a creature in addition it its other types. (Loyalty abilities can still be activated.)\Equip creature or planeswalker {3} diff --git a/forge-gui/res/cardsfolder/m/manakin_and_millikin.txt b/forge-gui/res/cardsfolder/m/manakin_and_millikin.txt new file mode 100644 index 00000000000..3f483ebfc41 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/manakin_and_millikin.txt @@ -0,0 +1,8 @@ +Name:Manakin and Millikin +ManaCost:3 +Types:Artifact Creature Construct +PT:1/2 +A:AB$ Mana | Cost$ T Mill<1> | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C}. +DeckHas:Ability$Mill +DeckHints:Ability$Graveyard +Oracle:{T}, Mill a card: Add {C}{C}. diff --git a/forge-gui/res/cardsfolder/m/more_of_that_strange_oil.txt b/forge-gui/res/cardsfolder/m/more_of_that_strange_oil.txt new file mode 100644 index 00000000000..9f2c6b50856 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/more_of_that_strange_oil.txt @@ -0,0 +1,10 @@ +Name:More of That Strange Oil... +ManaCost:2 U +Types:Instant +A:SP$ Charm | Choices$ DBProliferate,DBCounter +SVar:DBProliferate:DB$ Proliferate | SubAbility$ DBDraw | SpellDescription$ It's Probably Nothing — Proliferate. Draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 +SVar:DBCounter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target creature, artifact, or planeswalker spell | ValidTgts$ Creature,Artifact,Planeswalker | SubAbility$ DBScry | SpellDescription$ That Could Actually Be Dangerous — Counter target creature, artifact, or planeswalker spell. Scry 1. +SVar:DBScry:DB$ Scry | ScryNum$ 1 +DeckHas:Ability$Proliferate +Oracle:Choose one —\n• It's Probably Nothing — Proliferate. Draw a card.\n• That Could Actually Be Dangerous — Counter target creature, artifact, or planeswalker spell. Scry 1. diff --git a/forge-gui/res/cardsfolder/m/mox_poison.txt b/forge-gui/res/cardsfolder/m/mox_poison.txt new file mode 100644 index 00000000000..6747b294fc7 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/mox_poison.txt @@ -0,0 +1,6 @@ +Name:Mox Poison +ManaCost:0 +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ Any | SubAbility$ DBPain | SpellDescription$ Add one mana of any color. You get two poison counters +SVar:DBPain:DB$ Poison | Defined$ You | Num$ 2 +Oracle:{T}: Add one mana of any color. You get two poison counters diff --git a/forge-gui/res/cardsfolder/m/myojin_of_nights_reach_grim_betrayal.txt b/forge-gui/res/cardsfolder/m/myojin_of_nights_reach_grim_betrayal.txt new file mode 100644 index 00000000000..156c2373efc --- /dev/null +++ b/forge-gui/res/cardsfolder/m/myojin_of_nights_reach_grim_betrayal.txt @@ -0,0 +1,10 @@ +Name:Myojin of Night's Reach Grim Betrayal +ManaCost:5 B B B +Types:Legendary Creature Spirit +PT:10/4 +K:etbCounter:Indestructible:1:CheckSVar$ FromHand:CARDNAME enters the battlefield with an indestructible counter on it if you cast it from your hand. +SVar:FromHand:Count$wasCastFromYourHandByYou.1.0 +A:AB$ Discard | Cost$ SubCounter<1/Indestructible> | Defined$ Player.Opponent | Mode$ Hand | SubAbility$ DBReturn | SpellDescription$ Each opponent discards their hand. Put onto the battlefield under your control all creature cards in all graveyards that were put there from anywhere this turn. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ ValidGraveyard Creature.ThisTurnEntered | GainControl$ True +DeckHas:Ability$Graveyard +Oracle:Myojin of Night's Reach Grim Betrayal enters the battlefield with an indestructible counter on it if you cast it from your hand.\nRemove an indestructible counter from Myojin of Night's Reach Grim Betrayal: Each opponent discards their hand. Put onto the battlefield under your control all creature cards in all graveyards that were put there from anywhere this turn. diff --git a/forge-gui/res/cardsfolder/m/mysterious_confluence.txt b/forge-gui/res/cardsfolder/m/mysterious_confluence.txt new file mode 100644 index 00000000000..84dc3c63011 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/mysterious_confluence.txt @@ -0,0 +1,7 @@ +Name:Mysterious Confluence +ManaCost:5 +Types:Instant +A:SP$ NameCard | AtRandom$ True | ChooseFromList$ Righteous Confluence,Mystic Confluence,Wretched Confluence,Fiery Confluence,Verdant Confluence,Brokers Confluence,Cabaretti Confluence,Maestros Confluence,Obscura Confluence,Riveteers Confluence | SubAbility$ DBCast | StackDescription$ SpellDescription | SpellDescription$ Choose a card at random from among Righteous Confluence, Mystic Confluence, Wretched Confluence, Fiery Confluence, Verdant Confluence, Brokers Confluence, Cabaretti Confluence, Maestros Confluence, Obscura Confluence, and Riveteers Confluence. Create a copy of that card. You may cast the copy without paying its mana cost. +SVar:DBCast:DB$ Play | WithoutManaCost$ True | CopyFromChosenName$ True | Optional$ True | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +Oracle:Choose a card at random from among Righteous Confluence, Mystic Confluence, Wretched Confluence, Fiery Confluence, Verdant Confluence, Brokers Confluence, Cabaretti Confluence, Maestros Confluence, Obscura Confluence, and Riveteers Confluence. Create a copy of that card. You may cast the copy without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/n/night_out_in_vegas.txt b/forge-gui/res/cardsfolder/n/night_out_in_vegas.txt new file mode 100644 index 00000000000..bcce1fc99b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/n/night_out_in_vegas.txt @@ -0,0 +1,15 @@ +Name:Night Out in Vegas +ManaCost:2 B B +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCharm | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ Buffet,SeeAShow,PlayGames,GoToSleep | ChoiceRestriction$ ThisGame | CharmNum$ 1 +SVar:Buffet:DB$ Token | TokenScript$ c_a_food_sac | TokenAmount$ 3 | SpellDescription$ Buffet — Create three Food tokens. +SVar:SeeAShow:DB$ Token | TokenScript$ w_2_2_performer | TokenAmount$ 2 | SpellDescription$ See a Show — Create two 2/2 white Performer creature tokens. +SVar:PlayGames:DB$ ChangeZone | Origin$ Library | NoShuffle$ True | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | SubAbility$ DBDiscard | Mandatory$ True | SpellDescription$ Play Games — Search your library for a card, put that card into your hand, discard a card at random, then shuffle. +SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ Random | SubAbility$ DBShuffle +SVar:DBShuffle:DB$ Shuffle | Defined$ You +SVar:GoToSleep:DB$ LoseLife | LifeAmount$ 15 | SubAbility$ DBSacSelf | SpellDescription$ Go to Sleep — You lose 15 life. Sacrifice CARDNAME. +SVar:DBSacSelf:DB$ Sacrifice +DeckHas:Ability$Token|Sacrifice|LifeGain & Type$Food|Artifact|Performer +AI:RemoveDeck:All +Oracle:At the beginning of your upkeep, choose one that hasn't been chosen —\n• Buffet — Create three Food tokens.\n• See a Show — Create two 2/2 white Performer creature tokens.\n• Play Games — Search your library for a card, put that card into your hand, discard a card at random, then shuffle.\n• Go to Sleep — You lose 15 life. Sacrifice Night Out in Vegas. diff --git a/forge-gui/res/cardsfolder/n/nim_mongoose.txt b/forge-gui/res/cardsfolder/n/nim_mongoose.txt new file mode 100644 index 00000000000..65977c77fe6 --- /dev/null +++ b/forge-gui/res/cardsfolder/n/nim_mongoose.txt @@ -0,0 +1,11 @@ +Name:Nim Mongoose +ManaCost:B +Types:Creature Zombie Mongoose +PT:2/1 +K:Shroud +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated | ReplaceWith$ ETBTapped | Description$ CARDNAME enters the battlefield tapped. +SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | Condition$ Threshold | Description$ Threshold — CARDNAME gets +1/+0 for each artifact you control as long as seven or more cards are in your graveyard. +SVar:X:Count$Valid Artifact.YouCtrl +SVar:BuffedBy:Artifact +Oracle:Shroud\nNim Mongoose enters the battlefield tapped.\nThreshold — Nim Mongoose gets +1/+0 for each artifact you control as long as seven or more cards are in your graveyard. diff --git a/forge-gui/res/cardsfolder/n/norin_and_feldon.txt b/forge-gui/res/cardsfolder/n/norin_and_feldon.txt new file mode 100644 index 00000000000..29e496e9463 --- /dev/null +++ b/forge-gui/res/cardsfolder/n/norin_and_feldon.txt @@ -0,0 +1,9 @@ +Name:Norin and Feldon +ManaCost:1 R +Types:Legendary Creature Human Warrior Artificer +PT:2/2 +A:AB$ CopyPermanent | Cost$ 2 R T | SorcerySpeed$ True | TgtZone$ Graveyard | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature card in your graveyard | NumCopies$ 1 | AddTypes$ Artifact | PumpKeywords$ Haste | AddSVars$ NorinExile | AddTriggers$ Norin1,Norin2 | SpellDescription$ Create a token that's a copy of target creature card in your graveyard, except it's an artifact in addition to its other types, gains haste, and has "Whenever a player casts a spell or a creature attacks, exile this token." Activate only as a sorcery. +SVar:Norin1:Mode$ SpellCast | ValidCard$ Card | Execute$ NorinExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a spell or a creature attacks, exile this token. +SVar:Norin2:Mode$ Attacks | ValidCard$ Creature | Execute$ NorinExile | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever a player casts a spell or a creature attacks, exile this token. +SVar:NorinExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile +Oracle:{2}{R}, {T}: Create a token that's a copy of target creature card in your graveyard, except it's an artifact in addition to its other types, gains haste, and has "Whenever a player casts a spell or a creature attacks, exile this token." Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/o/original_skullclamp.txt b/forge-gui/res/cardsfolder/o/original_skullclamp.txt new file mode 100644 index 00000000000..85459fb185f --- /dev/null +++ b/forge-gui/res/cardsfolder/o/original_skullclamp.txt @@ -0,0 +1,8 @@ +Name:Original Skullclamp +ManaCost:1 +Types:Artifact Equipment +K:Equip:1 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.EquippedBy | Execute$ TrigDraw | TriggerDescription$ Whenever equipped creature dies, draw two cards. +SVar:TrigDraw:DB$ Draw | NumCards$ 2 +Oracle:Equipped creature gets +1/+1.\nWhenever equipped creature dies, draw two cards.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/p/phila_unsealed.txt b/forge-gui/res/cardsfolder/p/phila_unsealed.txt new file mode 100644 index 00000000000..c43f34ec781 --- /dev/null +++ b/forge-gui/res/cardsfolder/p/phila_unsealed.txt @@ -0,0 +1,7 @@ +Name:Phila, Unsealed +ManaCost:4 +Types:Legendary Artifact Creature Rebel Golem +PT:4/4 +S:Mode$ CantPutCounter | ValidPlayer$ You | CounterType$ POISON | Description$ You can't get poison counters. +A:AB$ ChangeZone | Cost$ W U B R G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target artifact. +Oracle:You can't get poison counters.\n{W}{U}{B}{R}{G}: Exile target artifact. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_adapter.txt b/forge-gui/res/cardsfolder/p/phyrexian_adapter.txt new file mode 100644 index 00000000000..81af600549b --- /dev/null +++ b/forge-gui/res/cardsfolder/p/phyrexian_adapter.txt @@ -0,0 +1,14 @@ +Name:Phyrexian Adapter +ManaCost:1 U +Types:Creature Phyrexian Wizard +PT:1/3 +K:Flying +S:Mode$ Continuous | Affected$ Incubator.token+YouCtrl | AddType$ Food,Blood,Clue,Treasure,Powerstone | AddAbility$ FoodSac & BloodSac & ClueSac & TreasureSac & PowerstoneTap | Description$ All Incubator tokens you control become Food, Blood, Clue, Treasure, and Powerstone in addition to their other types, and have the respective abilities of those tokens. (Once they transform, they're no longer Incubator tokens.) +SVar:FoodSac:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME/this artifact> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +SVar:BloodSac:AB$ Draw | Cost$ 1 T Discard<1/Card> Sac<1/CARDNAME/this artifact> | NumCards$ 1 | SpellDescription$ Draw a card. +SVar:ClueSac:AB$ Draw | Cost$ 2 Sac<1/CARDNAME/this artifact> | NumCards$ 1 | SpellDescription$ Draw a card. +SVar:TreasureSac:AB$ Mana | Cost$ T Sac<1/CARDNAME/this artifact> | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. +SVar:PowerstoneTap:AB$ Mana | Cost$ T | Produced$ C | RestrictValid$ CantCastNonArtifactSpells | SpellDescription$ Add {C}. This mana can't be spent to cast a nonartifact spell. +DeckHas:Ability$Sacrifice & Type$Food|Blood|Clue|Treasure|Powerstone +DeckHints:Type$Incubator +Oracle:Flying\nAll Incubator tokens you control become Food, Blood, Clue, Treasure, and Powerstone in addition to their other types, and have the respective abilities of those tokens. (Once they transform, they're no longer Incubator tokens.) diff --git a/forge-gui/res/cardsfolder/p/phyrexian_broodstar.txt b/forge-gui/res/cardsfolder/p/phyrexian_broodstar.txt new file mode 100644 index 00000000000..0eee15bce1b --- /dev/null +++ b/forge-gui/res/cardsfolder/p/phyrexian_broodstar.txt @@ -0,0 +1,12 @@ +Name:Phyrexian Broodstar +ManaCost:6 U U +Types:Creature Phyrexian Beast +PT:*/* +K:Affinity:Phyrexian +K:Flying +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of Phyrexians you control. +SVar:X:Count$Valid Phyrexian.YouCtrl +SVar:NoZeroToughnessAI:True +SVar:BuffedBy:Phyrexian +DeckNeeds:Type$Phyrexian +Oracle:Affinity for Phyrexians (This spell costs {1} less to cast for each Phyrexian you control.)\nFlying\nPhyrexian Broodstar's power and toughness are each equal to the number of Phyrexians you control. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_chimney_imp.txt b/forge-gui/res/cardsfolder/p/phyrexian_chimney_imp.txt new file mode 100644 index 00000000000..b1041f88872 --- /dev/null +++ b/forge-gui/res/cardsfolder/p/phyrexian_chimney_imp.txt @@ -0,0 +1,8 @@ +Name:Phyrexian Chimney Imp +ManaCost:4 PB +Types:Creature Phyrexian Imp +PT:2/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME dies, target opponent puts two cards from their hand on top of their library in any order. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Opponent | Chooser$ Targeted | ChangeType$ Card | ChangeNum$ 2 | Mandatory$ True | Reorder$ True | IsCurse$ True +Oracle:Flying\nWhen Phyrexian Chimney Imp dies, target opponent puts two cards from their hand on top of their library in any order. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_esthetician.txt b/forge-gui/res/cardsfolder/p/phyrexian_esthetician.txt new file mode 100644 index 00000000000..45fc8721a8d --- /dev/null +++ b/forge-gui/res/cardsfolder/p/phyrexian_esthetician.txt @@ -0,0 +1,8 @@ +Name:Phyrexian Esthetician +ManaCost:3 R +Types:Artifact Creature Phyrexian Cleric +PT:4/3 +K:Haste +A:AB$ PutCounter | Cost$ 3 R ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Creature | CounterType$ OIL | CounterNum$ ScavengeX | SorcerySpeed$ True | PrecostDesc$ Oil Scavenge | CostDesc$ {3}{R} | SpellDescription$ ({3}{R}, Exile this card from your graveyard: Put a number of oil counters equal to this card's power on target creature. Oil Scavenge only as a sorcery.) +SVar:ScavengeX:Exiled$CardPower +Oracle:Haste\nOil Scavenge {3}{R} ({3}{R}, Exile this card from your graveyard: Put a number of oil counters equal to this card's power on target creature. Oil Scavenge only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/p/phyrexian_ornithopter.txt b/forge-gui/res/cardsfolder/p/phyrexian_ornithopter.txt new file mode 100644 index 00000000000..2c70b87495a --- /dev/null +++ b/forge-gui/res/cardsfolder/p/phyrexian_ornithopter.txt @@ -0,0 +1,7 @@ +Name:Phyrexian Ornithopter +ManaCost:1 +Types:Artifact Creature Thopter +PT:0/2 +K:Flying +K:Toxic:1 +Oracle:Flying\nToxic 1 (Players dealt combat damage by this creature also get a poison counter.) diff --git a/forge-gui/res/cardsfolder/p/potatoes.txt b/forge-gui/res/cardsfolder/p/potatoes.txt new file mode 100644 index 00000000000..34e816768d3 --- /dev/null +++ b/forge-gui/res/cardsfolder/p/potatoes.txt @@ -0,0 +1,10 @@ +Name:Potatoes +ManaCost:0 +Types:Artifact Food +A:AB$ Charm | Cost$ 2 T Sac<1/CARDNAME> | Choices$ Boil,Mash,Stew +SVar:Boil:DB$ DealDamage | ValidTgts$ Any | NumDmg$ 1 | SpellDescription$ Boil — CARDNAME deals 1 damage to any target. +SVar:Mash:DB$ Token | TokenScript$ c_a_food_sac | TokenAmount$ 2 | SpellDescription$ Mash — Create two Food tokens. +SVar:Stew:DB$ GainLife | LifeAmount$ 3 | SubAbility$ DBDraw | SpellDescription$ Stew — Gain 3 life. Draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 +DeckHas:Ability$Sacrifice +Oracle:{2}, {T}, Sacrifice Potatoes: Choose one —\n• Boil — Potatoes deals 1 damage to any target.\n• Mash — Create two Food tokens.\n• Stew — Gain 3 life. Draw a card. diff --git a/forge-gui/res/cardsfolder/q/questing_cosplayer.txt b/forge-gui/res/cardsfolder/q/questing_cosplayer.txt new file mode 100644 index 00000000000..a1df0385b6d --- /dev/null +++ b/forge-gui/res/cardsfolder/q/questing_cosplayer.txt @@ -0,0 +1,9 @@ +Name:Questing Cosplayer +ManaCost:1 G +Types:Creature Human Bard +PT:1/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When Questing Cosplayer enters the battlefield, create a Questing Role token and attach it to target creature. (If you control another Role on it, put that one into the graveyard. Enchanted creature has all the abilities of Questing Beast.) +SVar:TrigToken:DB$ Token | TokenScript$ role_questing | AttachedTo$ Targeted | ValidTgts$ Creature +DeckHas:Type$Aura|Role & Ability$Token +DeckHints:Type$Aura +Oracle:When Questing Cosplayer enters the battlefield, create a Questing Role token and attach it to target creature. (If you control another Role on it, put that one into the graveyard. Enchanted creature has all the abilities of Questing Beast.) diff --git a/forge-gui/res/cardsfolder/r/really_charming_prince.txt b/forge-gui/res/cardsfolder/r/really_charming_prince.txt new file mode 100644 index 00000000000..d28327bb723 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/really_charming_prince.txt @@ -0,0 +1,11 @@ +Name:Really Charming Prince +ManaCost:1 U +Types:Creature Faerie Noble +PT:2/1 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ When CARDNAME enters the battlefield, choose one of the following four cards at random: Piracy Charm, Sapphire Charm, Trickery Charm, and Vision Charm. You may create a copy of the chosen card and cast that copy without paying its mana cost. +SVar:TrigChoose:DB$ NameCard | AtRandom$ True | ChooseFromList$ Piracy Charm,Sapphire Charm,Trickery Charm,Vision Charm | SubAbility$ DBCast | StackDescription$ SpellDescription +SVar:DBCast:DB$ Play | WithoutManaCost$ True | CopyFromChosenName$ True | Optional$ True | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True +SVar:PlayMain1:TRUE +Oracle:Flying\nWhen Really Charming Prince enters the battlefield, choose one of the following four cards at random: Piracy Charm, Sapphire Charm, Trickery Charm, and Vision Charm. You may create a copy of the chosen card and cast that copy without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/r/red_priest_of_yawgmoth.txt b/forge-gui/res/cardsfolder/r/red_priest_of_yawgmoth.txt new file mode 100644 index 00000000000..c09aa4a917f --- /dev/null +++ b/forge-gui/res/cardsfolder/r/red_priest_of_yawgmoth.txt @@ -0,0 +1,8 @@ +Name:Red Priest of Yawgmoth +ManaCost:1 R +Types:Artifact Creature Phyrexian Cleric +PT:1/2 +A:AB$ Mana | Cost$ T Sac<1/Artifact> | Produced$ R | Amount$ X | SpellDescription$ Add an amount of {R} equal to the sacrificed artifact's mana value. +SVar:X:Sacrificed$CardManaCost +DeckHas:Ability$Sacrifice +Oracle:{T}, Sacrifice an artifact: Add an amount of {R} equal to the sacrificed artifact's mana value. diff --git a/forge-gui/res/cardsfolder/r/riku_and_riku.txt b/forge-gui/res/cardsfolder/r/riku_and_riku.txt new file mode 100644 index 00000000000..3fedb2b674e --- /dev/null +++ b/forge-gui/res/cardsfolder/r/riku_and_riku.txt @@ -0,0 +1,8 @@ +Name:Riku and Riku +ManaCost:2 RG U +Types:Legendary Creature Human Wizard +PT:2/2 +K:Double Strike +A:AB$ CopySpellAbility | Cost$ U R | GameActivationLimit$ 1 | TgtPrompt$ Select target instant or sorcery spell you control | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell you control. Activate this ability only once. +A:AB$ CopySpellAbility | Cost$ G U | GameActivationLimit$ 1 | TgtPrompt$ Select target creature spell you control | ValidTgts$ Creature.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target creature spell you control. Activate this ability only once. +Oracle:Double strike\n{U}{R}: Copy target instant or sorcery spell you control. Activate this ability only once.\n{G}{U}: Copy target creature spell you control. Activate this ability only once. (Copies of permanent spells enter the battlefield as tokens.) diff --git a/forge-gui/res/cardsfolder/r/riven_turnbull_and_princess_lucrezia.txt b/forge-gui/res/cardsfolder/r/riven_turnbull_and_princess_lucrezia.txt new file mode 100644 index 00000000000..cc7b653bc23 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/riven_turnbull_and_princess_lucrezia.txt @@ -0,0 +1,6 @@ +Name:Riven Turnbull and Princess Lucrezia +ManaCost:5 U B +Types:Legendary Creature Human Advisor Wizard +PT:10/11 +A:AB$ Mana | Cost$ T | Produced$ U B | SpellDescription$ Add {U}{B}. +Oracle:{T}: Add {U}{B}. diff --git a/forge-gui/res/cardsfolder/s/sagrada_familiar.txt b/forge-gui/res/cardsfolder/s/sagrada_familiar.txt new file mode 100644 index 00000000000..bad8161032c --- /dev/null +++ b/forge-gui/res/cardsfolder/s/sagrada_familiar.txt @@ -0,0 +1,12 @@ +Name:Sagrada Familiar +ManaCost:3 +Types:Artifact Creature Wall +PT:0/5 +K:Reach +K:Defender +S:Mode$ ReduceCost | ValidCard$ Card.IsCommander+YouCtrl | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Commander spells you cast cost {1} less to cast. +T:Mode$ SpellCast | ValidCard$ Card.IsCommander+YouCtrl | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a commander spell, create X 1/1 Stained Glass artifact creature tokens that are all colors, where X is the number of colors of that commander. +SVar:TrigToken:DB$ Token | TokenScript$ all_1_1_a_stained_glass | TokenAmount$ X +SVar:X:TriggeredCard$CardNumColors +DeckHas:Ability$Token +Oracle:Reach, defender\nCommander spells you cast cost {1} less to cast.\nWhenever you cast a commander spell, create X 1/1 Stained Glass artifact creature tokens that are all colors, where X is the number of colors of that commander. diff --git a/forge-gui/res/cardsfolder/s/segovian_sword.txt b/forge-gui/res/cardsfolder/s/segovian_sword.txt new file mode 100644 index 00000000000..5dd90e16cd8 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/segovian_sword.txt @@ -0,0 +1,11 @@ +Name:Segovian Sword +ManaCost:3 +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ For Segovia! (When this Equipment enters the battlefield, create a -1/-1 blue Squid creature token, then attach this to it. Yes, it's a -1/-1 creature.) +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_m1_m1_squid | TokenOwner$ You | RememberTokens$ True | SubAbility$ DBAttach +SVar:DBAttach:DB$ Attach | Defined$ Remembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Token & Type$Squid +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Skulk | Description$ Equipped creature gets +2/+2 and has skulk. +K:Equip:3 +Oracle:For Segovia! (When this Equipment enters the battlefield, create a -1/-1 blue Squid creature token, then attach this to it. Yes, it's a -1/-1 creature.)\nEquipped creature gets +2/+2 and has skulk. (It can't be blocked by creatures with greater power.)\nEquip {3} diff --git a/forge-gui/res/cardsfolder/s/soul_of_mirrodin.txt b/forge-gui/res/cardsfolder/s/soul_of_mirrodin.txt new file mode 100644 index 00000000000..3ea0697331d --- /dev/null +++ b/forge-gui/res/cardsfolder/s/soul_of_mirrodin.txt @@ -0,0 +1,8 @@ +Name:Soul of Mirrodin +ManaCost:6 +Types:Artifact Creature Spirit +PT:6/6 +K:Trample +A:AB$ ChangeZone | Cost$ 5 | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact.cmcLE5 | Tapped$ True | ChangeNum$ 1 | Shuffle$ True | SpellDescription$ Search your library for an artifact card with mana value 5 or less, put it onto the battlefield tapped, then shuffle. +A:AB$ ChangeZone | Cost$ 5 ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact.cmcLE5 | Tapped$ True | ChangeNum$ 1 | Shuffle$ True | SpellDescription$ Search your library for an artifact card with mana value 5 or less, put it onto the battlefield tapped, then shuffle. +Oracle:Trample\n{5}: Search your library for an artifact card with mana value 5 or less, put it onto the battlefield tapped, then shuffle.\n{5}, Exile Soul of Mirrodin from your graveyard: Search your library for an artifact card with mana value 5 or less, put it onto the battlefield tapped, then shuffle. diff --git a/forge-gui/res/cardsfolder/s/sword_of_fire_and_ice_and_war_and_peace.txt b/forge-gui/res/cardsfolder/s/sword_of_fire_and_ice_and_war_and_peace.txt new file mode 100644 index 00000000000..c5276c05fcf --- /dev/null +++ b/forge-gui/res/cardsfolder/s/sword_of_fire_and_ice_and_war_and_peace.txt @@ -0,0 +1,14 @@ +Name:Sword of Fire and Ice and War and Peace +ManaCost:6 +Types:Artifact Equipment +K:Equip:4 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 4 | AddToughness$ 4 | AddSVar$ SwordOfFireAndIceCE | AddKeyword$ Protection from white & Protection from blue & Protection from red | Description$ Equipped creature gets +4/+4 and has protection from white, blue, and red. +T:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to an opponent, CARDNAME deals 2 damage to any target and you draw a card. Then, it deals damage to defending player equal to the number of cards in their hand and you gain 1 life for each card in your hand. +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ 2 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBWar +SVar:DBWar:DB$ DealDamage | Defined$ TriggeredTarget | NumDmg$ X | SubAbility$ DBGain +SVar:X:TriggeredTarget$CardsInHand +SVar:DBGain:DB$ GainLife | Defined$ You | LifeAmount$ Y +SVar:Y:Count$CardsInYourHand +SVar:SwordOfFireAndIceCE:SVar:MustBeBlocked:AttackingPlayerConservative +Oracle:Equipped creature gets +4/+4 and has protection from white, blue, and red.\nWhenever equipped creature deals combat damage to an opponent, Sword of Fire and Ice and War and Peace deals 2 damage to any target and you draw a card. Then, it deals damage to defending player equal to the number of cards in their hand and you gain 1 life for each card in your hand.\nEquip {4} diff --git a/forge-gui/res/cardsfolder/t/tarkir_charm.txt b/forge-gui/res/cardsfolder/t/tarkir_charm.txt new file mode 100644 index 00000000000..93d7a1331b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/tarkir_charm.txt @@ -0,0 +1,10 @@ +Name:Tarkir Charm +ManaCost:3 R +Types:Sorcery +A:SP$ Charm | Choices$ BatheInDragonfire,HordelingOutburst,SarkhansTriumph | Defined$ You +SVar:BatheInDragonfire:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. +SVar:HordelingOutburst:DB$ Token | TokenAmount$ 3 | TokenScript$ r_1_1_goblin | TokenOwner$ You | SpellDescription$ Create three 1/1 red Goblin creature tokens. +SVar:SarkhansTriumph:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Dragon | ChangeNum$ 1 | SpellDescription$ Search your library for a Dragon creature card, reveal it, put it into your hand, then shuffle. +DeckHas:Ability$Token & Type$Goblin +DeckHints:Type$Dragon +Oracle:Choose one —\n• Bathe in Dragonfire (4 damage to a creature.)\n• Hordeling Outburst (Create three 1/1 Goblin tokens.)\n• Sarkhan's Triumph (Search for a dragon.) diff --git a/forge-gui/res/cardsfolder/t/the_alright_henge.txt b/forge-gui/res/cardsfolder/t/the_alright_henge.txt new file mode 100644 index 00000000000..f2579d1c9bd --- /dev/null +++ b/forge-gui/res/cardsfolder/t/the_alright_henge.txt @@ -0,0 +1,8 @@ +Name:The Alright Henge +ManaCost:3 G +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, put a +1/+1 counter on it. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:{T}: Add {G}{G}. You gain 2 life.\nWhenever a nontoken creature enters the battlefield under your control, put a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/t/the_belligerent_and_useless_island.txt b/forge-gui/res/cardsfolder/t/the_belligerent_and_useless_island.txt new file mode 100644 index 00000000000..ad72b4ff530 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/the_belligerent_and_useless_island.txt @@ -0,0 +1,12 @@ +Name:The Belligerent and Useless Island +ManaCost:no cost +Types:Legendary Artifact Land Vehicle Island +PT:2/2 +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated | ReplaceWith$ ETBTapped | Description$ CARDNAME enters the battlefield tapped. +SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigDraw | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player or battle, draw a card then discard a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ You | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +K:Crew:2 +DeckHas:Ability$Discard +Oracle:The Belligerent and Useless Island enters the battlefield tapped.\nWhenever The Belligerent and Useless Island deals combat damage to a player or battle, draw a card then discard a card.\nCrew 2 diff --git a/forge-gui/res/cardsfolder/t/the_dilu_horse.txt b/forge-gui/res/cardsfolder/t/the_dilu_horse.txt new file mode 100644 index 00000000000..8ac1a85f058 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/the_dilu_horse.txt @@ -0,0 +1,10 @@ +Name:The Dilu Horse +ManaCost:2 G +Types:Legendary Creature Horse +PT:2/2 +K:Horsemanship +K:Partner +S:Mode$ Continuous | Affected$ Card.YouCtrl+IsCommander | AddKeyword$ Horsemanship | Description$ Commanders you control have horsemanship. +SVar:PlayMain1:TRUE +AI:RemoveDeck:NonCommander +Oracle:Horsemanship (This creature can't be blocked except by creatures with horsemanship.)\nCommanders you control have horsemanship.\nPartner (You can have two commanders if both have partner.) diff --git a/forge-gui/res/cardsfolder/t/the_forgotten_place.txt b/forge-gui/res/cardsfolder/t/the_forgotten_place.txt new file mode 100644 index 00000000000..1c8d32f0105 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/the_forgotten_place.txt @@ -0,0 +1,9 @@ +Name:The Forgotten Place +ManaCost:no cost +Types:Land Locus Sphere +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Draw | Cost$ 2 T Sac<1/CARDNAME> | NumCards$ X | SpellDescription$ Draw a card for each Locus and/or Sphere in your graveyard. +SVar:X:Count$ValidGraveyard Locus.YouOwn,Sphere.YouOwn +DeckHas:Ability$Sacrifice|Mana.Colorless +DeckHints:Type$Locus|Sphere +Oracle:{T}: Add {C}.\n{2}, {T}, Sacrifice The Forgotten Place: Draw a card for each Locus and/or Sphere in your graveyard. diff --git a/forge-gui/res/cardsfolder/t/then_dreadmaws_ate_everyone.txt b/forge-gui/res/cardsfolder/t/then_dreadmaws_ate_everyone.txt new file mode 100644 index 00000000000..00d7fde5d51 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/then_dreadmaws_ate_everyone.txt @@ -0,0 +1,7 @@ +Name:Then, Dreadmaws Ate Everyone +ManaCost:X 4 G G +Types:Sorcery +A:SP$ Token | TokenAmount$ X | TokenScript$ colossal_dreadmaw | TokenOwner$ You | SpellDescription$ Create X 6/6 green Dinosaur creature tokens with trample named Colossal Dreadmaw. +SVar:X:Count$xPaid +DeckHas:Ability$Token & Type$Dinosaur +Oracle:Create X 6/6 green Dinosaur creature tokens with trample named Colossal Dreadmaw. diff --git a/forge-gui/res/cardsfolder/t/theros_charm.txt b/forge-gui/res/cardsfolder/t/theros_charm.txt new file mode 100644 index 00000000000..7b5286c0bea --- /dev/null +++ b/forge-gui/res/cardsfolder/t/theros_charm.txt @@ -0,0 +1,9 @@ +Name:Theros Charm +ManaCost:3 W +Types:Instant +A:SP$ Charm | Choices$ IdyllicTutor,RevokeExistence,Reprisal | Defined$ You +SVar:IdyllicTutor:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an enchantment card, reveal it, put it into your hand, then shuffle. +SVar:RevokeExistence:DB$ ChangeZone | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target artifact or enchantment. +SVar:Reprisal:DB$ Destroy | ValidTgts$ Creature.powerGE4 | TgtPrompt$ Select target creature with power 4 or greater | NoRegen$ True | SpellDescription$ Destroy target creature with power 4 or greater. It can't be regenerated. +DeckHints:Type$Enchantment +Oracle:Choose one —\n• Idyllic Tutor (Search for an enchantment.)\n• Revoke Existence (Exile an artifact or enchantment.)\n• Reprisal (Destroy a creature with power 4 or greater. It can't be regenerated.) diff --git a/forge-gui/res/cardsfolder/t/toe_breaking_helmet.txt b/forge-gui/res/cardsfolder/t/toe_breaking_helmet.txt new file mode 100644 index 00000000000..6ef9d66a801 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/toe_breaking_helmet.txt @@ -0,0 +1,8 @@ +Name:Toe-Breaking Helmet +ManaCost:1 +Types:Artifact Equipment +K:Equip:1 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. +A:AB$ PutCounter | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Creature | IsCurse$ True | CounterType$ M1M1 | CounterNum$ 2 | SorcerySpeed$ True | SpellDescription$ Put two -1/-1 counters on target creature. Activate only as a sorcery. +DeckHas:Ability$Counters +Oracle:Equipped creature gets +1/+1.\n{2}, {T}, Sacrifice Toe-Breaking Helmet: Put two -1/-1 counters on target creature. Activate only as a sorcery.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/t/toothy_and_zndrsplt.txt b/forge-gui/res/cardsfolder/t/toothy_and_zndrsplt.txt new file mode 100644 index 00000000000..86519d42f95 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/toothy_and_zndrsplt.txt @@ -0,0 +1,14 @@ +Name:Toothy and Zndrsplt +ManaCost:3 U +Types:Legendary Creature Homunculus Illusion +PT:2/2 +T:Mode$ FlippedCoin | ValidPlayer$ You | ValidResult$ Win | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you win a coin flip, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigFlip | TriggerDescription$ At the beginning of combat on your turn, flip a coin until you lose a flip. +SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME leaves the battlefield, draw a card for each +1/+1 counter on it. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X +SVar:X:TriggeredCard$CardCounters.P1P1 +SVar:PlayMain1:TRUE +DeckHas:Ability$Counters +Oracle:Whenever you win a coin flip, put a +1/+1 counter on Toothy and Zndrsplt.\nAt the beginning of combat on your turn, flip a coin until you lose a flip.\nWhen Toothy and Zndrsplt leaves the battlefield, draw a card for each +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/t/try_my_deck_elemental.txt b/forge-gui/res/cardsfolder/t/try_my_deck_elemental.txt new file mode 100644 index 00000000000..6fe86d12025 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/try_my_deck_elemental.txt @@ -0,0 +1,8 @@ +Name:Try-My-Deck Elemental +ManaCost:3 W +Types:Creature Elemental +PT:4/3 +K:Flying +S:Mode$ Continuous | Affected$ Card.IsCommander+YouCtrl | AffectedZone$ Stack | AddKeyword$ Demonstrate | Description$ Commander spells you cast have demonstrate. (When you cast a commander spell, you may copy it. If you do, choose an opponent to also copy it. The copies become tokens.) +S:Mode$ IgnoreLegendRule | ValidCard$ Card.IsCommander+YouCtrl | Description$ The "legend rule" doesn't apply to commanders you control. +Oracle:Flying\nCommander spells you cast have demonstrate. (When you cast a commander spell, you may copy it. If you do, choose an opponent to also copy it. The copies become tokens.)\nThe "legend rule" doesn't apply to commanders you control. diff --git a/forge-gui/res/cardsfolder/u/ulgrotha_charm.txt b/forge-gui/res/cardsfolder/u/ulgrotha_charm.txt new file mode 100644 index 00000000000..de267cddeab --- /dev/null +++ b/forge-gui/res/cardsfolder/u/ulgrotha_charm.txt @@ -0,0 +1,11 @@ +Name:Ulgrotha Charm +ManaCost:2 U +Types:Instant +A:SP$ Charm | Choices$ MerchantScroll,MemoryLapse,Forget | Defined$ You +SVar:MerchantScroll:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Instant.Blue | ChangeNum$ 1 | SpellDescription$ Search your library for a blue instant card, reveal that card, put it into your hand, then shuffle. +SVar:MemoryLapse:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ TopOfLibrary | SpellDescription$ Counter target spell. If that spell is countered this way, put it on top of its owner's library instead of into that player's graveyard. +SVar:Forget:DB$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose | NumCards$ 2 | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ Target player discards two cards, then draws as many cards as they discarded this way. +SVar:DBDraw:DB$ Draw | Defined$ Targeted | NumCards$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$Amount +Oracle:Choose one —\n• Merchant Scroll (Search for a blue instant.)\n• Memory Lapse (Counter a spell and put it on top of its owner's library.)\n• Forget (Target player discards 2, then draws that many.) diff --git a/forge-gui/res/cardsfolder/w/welcome_to_miniapolis.txt b/forge-gui/res/cardsfolder/w/welcome_to_miniapolis.txt new file mode 100644 index 00000000000..6afb665aa60 --- /dev/null +++ b/forge-gui/res/cardsfolder/w/welcome_to_miniapolis.txt @@ -0,0 +1,6 @@ +Name:Welcome to Mini-apolis +ManaCost:3 U U +Types:Enchantment +T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigCopySpell | TriggerDescription$ Whenever an opponent casts a creature spell, create a token that's a copy of it, except it's 1/1. +SVar:TrigCopySpell:DB$ CopySpellAbility | Controller$ You | Defined$ TriggeredSpellAbility | SetPower$ 1 | SetToughness$ 1 +Oracle:Whenever an opponent casts a creature spell, create a token that's a copy of it, except it's 1/1. diff --git a/forge-gui/res/cardsfolder/w/white_rhystic_study.txt b/forge-gui/res/cardsfolder/w/white_rhystic_study.txt new file mode 100644 index 00000000000..bf894c53327 --- /dev/null +++ b/forge-gui/res/cardsfolder/w/white_rhystic_study.txt @@ -0,0 +1,6 @@ +Name:White Rhystic Study +ManaCost:2 W +Types:Enchantment +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent casts a spell, you may draw a card unless that player pays {1}. +SVar:TrigDraw:DB$ Draw | Defined$ You | UnlessCost$ 1 | UnlessPayer$ TriggeredPlayer | NumCards$ 1 | OptionalDecider$ You +Oracle:Whenever an opponent casts a spell, you may draw a card unless that player pays {1}. diff --git a/forge-gui/res/cardsfolder/w/wrath_of_oko.txt b/forge-gui/res/cardsfolder/w/wrath_of_oko.txt new file mode 100644 index 00000000000..c1db8b86998 --- /dev/null +++ b/forge-gui/res/cardsfolder/w/wrath_of_oko.txt @@ -0,0 +1,5 @@ +Name:Wrath of Oko +ManaCost:2 U U +Types:Sorcery +A:SP$ AnimateAll | ValidCards$ Creature | Power$ 3 | Toughness$ 3 | RemoveAllAbilities$ True | Colors$ Green | OverwriteColors$ True | Types$ Creature,Elk | RemoveCreatureTypes$ True | RemoveCardTypes$ True | Duration$ Permanent | SpellDescription$ All creatures loose all abilities and become green Elk creatures with base power and toughness 3/3. (This effect lasts indefinitely. Just like Oko. Unfortunately.) +Oracle:All creatures loose all abilities and become green Elk creatures with base power and toughness 3/3. (This effect lasts indefinitely. Just like Oko. Unfortunately.) diff --git a/forge-gui/res/editions/Unknown Event Barcelona 2023 Playtest Cards.txt b/forge-gui/res/editions/Unknown Event Barcelona 2023 Playtest Cards.txt new file mode 100644 index 00000000000..58c845eddf4 --- /dev/null +++ b/forge-gui/res/editions/Unknown Event Barcelona 2023 Playtest Cards.txt @@ -0,0 +1,71 @@ +[metadata] +Code=UEBAR23 +Date=2023-07-28 +Name=Unknown Event Barcelona 2023 Playtest Cards +Type=Funny + +[cards] +1 R Command From the Shadows +2 R Enolc, Perfect Clone +3 R Mysterious Confluence +4 R Your Favorite Character +5 R Fioran Reformist +6 R Form of the Stax Player +7 U Gather, the Townsfolk +8 C Taught by Serra +9 U Tax Hounds +10 R Theopholos, Order Acolyte +11 R Try-My-Deck Elemental +12 R White Rhystic Study +13 U Clear, the Mind +14 R Dockbreacher +15 U Ensoul Ring +16 R Lorthos, Tentacled Terror +17 C One Does Not +18 U Ring Out +19 C Taught by Narset +20 U Tax Draw +21 R Auntie Flint +22 U Delve too Deep +23 U Ransack, the Lab +24 C Shedding Snake +25 U Soul Drainer +26 C Taught by Vito +27 U Tax Sweeper +28 U Lava, Axe +29 R Math is for Blockers +30 C My Deck is About a Seven +31 R Mzed, Mercenary Leader +32 C Taught by Bruce Tarl +33 U Tax Bolt +34 R Triple Threat +35 R The Colossal Dreadmaw +36 R The Dilu Horse +37 R Maître Tree +38 R Mr. Wiggles, Helpful Butterfly +39 U Rampant, Growth +40 C Taught by Surrak +41 U Tax Keeper +42 R Ano'thr, Equipment Commander +43 R Arvad of the Weatherlight +44 R Awoken Nephilim +45 R Daxiver, Izzet Electromancer +46 R Eldest Dragon Highlander +47 R Groaaaaag, Hungry Monster +48 R Hadran, Naya Sunseeder +49 R Kallist Rhoka +50 R Margle, Cousin of Yargle +51 R Simic, Value Engine +52 R Slobad, Actually Just Fine +53 R Valko Indorian, Researcher +54 C Potatoes +55 U Power Level Analyzer +56 U Sagrada Familiar +57 R Spice Rack +58 C Toe-Breaking Helmet +59 C Your Mana Rock +60 U Mana Conference + +[promo] +61 M Barce, Friend Finder +62 R Lona, Tracker of the Known \ No newline at end of file diff --git a/forge-gui/res/editions/Unknown Event Indiana 2023 Playtest Cards.txt b/forge-gui/res/editions/Unknown Event Indiana 2023 Playtest Cards.txt new file mode 100644 index 00000000000..c9449103a5e --- /dev/null +++ b/forge-gui/res/editions/Unknown Event Indiana 2023 Playtest Cards.txt @@ -0,0 +1,70 @@ +[metadata] +Code=UEIND23 +Date=2023-08-03 +Name=Unknown Event Indiana 2023 Playtest Cards +Type=Funny + +[cards] +1 R Command From the Shadows +2 R Enolc, Perfect Clone +3 R Mysterious Confluence +4 R Your Favorite Character +5 R Fioran Reformist +6 R Form of the Stax Player +7 U Gather, the Townsfolk +8 C Taught by Serra +9 U Tax Hounds +10 R Theopholos, Order Acolyte +11 R Try-My-Deck Elemental +12 R White Rhystic Study +13 U Clear, the Mind +14 R Dockbreacher +15 U Ensoul Ring +16 R Lorthos, Tentacled Terror +17 C One Does Not +18 U Ring Out +19 C Taught by Narset +20 U Tax Draw +21 R Auntie Flint +22 U Delve too Deep +23 U Ransack, the Lab +24 C Shedding Snake +25 U Soul Drainer +26 C Taught by Vito +27 U Tax Sweeper +28 U Lava, Axe +29 R Math is for Blockers +30 C My Deck is About a Seven +31 R Mzed, Mercenary Leader +32 C Taught by Bruce Tarl +33 U Tax Bolt +34 R Triple Threat +35 R The Colossal Dreadmaw +36 R The Dilu Horse +37 R Maître Tree +38 R Mr. Wiggles, Helpful Butterfly +39 U Rampant, Growth +40 C Taught by Surrak +41 U Tax Keeper +42 R Ano'thr, Equipment Commander +43 R Arvad of the Weatherlight +44 R Awoken Nephilim +45 R Daxiver, Izzet Electromancer +46 R Eldest Dragon Highlander +47 R Groaaaaag, Hungry Monster +48 R Hadran, Naya Sunseeder +49 R Kallist Rhoka +50 R Margle, Cousin of Yargle +51 R Simic, Value Engine +52 R Slobad, Actually Just Fine +53 R Valko Indorian, Researcher +54 C Potatoes +55 U Power Level Analyzer +56 U Sagrada Familiar +57 R Spice Rack +58 C Toe-Breaking Helmet +59 C Your Mana Rock +60 U Mana Conference + +[promo] +61 M Gen, Confider of Ages \ No newline at end of file diff --git a/forge-gui/res/editions/Unknown Event Las Vegas 2023 Playtest Cards.txt b/forge-gui/res/editions/Unknown Event Las Vegas 2023 Playtest Cards.txt new file mode 100644 index 00000000000..a5b932312e5 --- /dev/null +++ b/forge-gui/res/editions/Unknown Event Las Vegas 2023 Playtest Cards.txt @@ -0,0 +1,48 @@ +[metadata] +Code=UELAS23 +Date=2023-09-22 +Name=Unknown Event Las Vegas 2023 Playtest Cards +Type=Funny + +[cards] +1 R The Companion of the Wilds +2 R Banned Eldraine Card +3 U Magic Designer +4 R Playtest Wish +5 R Bram, Baguette Brawler +6 R Ratatwotwo +7 R Stika, Playtestress +8 U Adventurer Beguiler +9 R Really Charming Prince +10 C Wistful Puppeteer +11 R Wrath of Oko +12 R Dan, Shrewd Trader +13 R Night Out in Vegas +14 R Rankle, Master of Pranksters +15 C Syr Konrad's Squire +16 C Believe in the Cleave +17 R Force of Rowan +18 U Must Be Knights +19 U The Alright Henge +20 C Garruk's Lost Wolf +21 R Grek the Ogre +22 R HONK! +23 R Questing Cosplayer +24 R Maeve, Wearer of Many Hats +25 R Princess Snowfall +26 U Cat Oven +27 R Cinnamon, Seasoned Steed +28 U Gingerbehemoth +29 C Command Mine +30 C Command Power Plant +31 R Kevin, Questing Dragon +32 R Takesies // Backsies +33 R Trampled Lotus + +[promo] +34 M You, Magic Playtester + +[You Make The Card] +1 Kevin, Questing Dragon|UELAS23 +1 Takesies // Backsies|UELAS23 +1 Trampled Lotus|UELAS23 \ No newline at end of file diff --git a/forge-gui/res/editions/Unknown Event Minneapolis 2023 Playtest Cards.txt b/forge-gui/res/editions/Unknown Event Minneapolis 2023 Playtest Cards.txt new file mode 100644 index 00000000000..db7db1fcaad --- /dev/null +++ b/forge-gui/res/editions/Unknown Event Minneapolis 2023 Playtest Cards.txt @@ -0,0 +1,71 @@ +[metadata] +Code=UEMIN23 +Date=2023-05-05 +Name=Unknown Event Minneapolis 2023 Playtest Cards +Type=Funny + +[cards] +1 U Hero's Uncle +2 U Theros Charm +3 R Isamaru and Yoshimaru +4 R Azorius Traffic Enforcement +5 R Kylem All-Star +6 R Gerrard and Hanna +7 R Agoraphobic Phyrexian +8 C Shadowmoor Draw Spell +9 U Ulgrotha Charm +10 U Xerex Squire +11 U Farseeing Flockmate +12 R Phyrexian Adapter +13 R Toothy and Zndrsplt +14 R Welcome to Mini-apolis +15 C May of the Machine +16 U Incubob +17 U Innistrad Charm +18 R Incubation Triformer +19 R Quest Compleated Best +20 R Invasion Specialist +21 R Myojin of Night's Reach Grim Betrayal +22 C Azra Matchthrower +23 U Tarkir Charm +24 U Jeska and Kamahl +25 U Joven and Chandler +26 U Nevermind +27 R Across the Multiverse +28 R Norin and Feldon +29 C That's No Moonmist +30 C Merfolk Surveyor +31 R Occupation of Llanowar +32 U Kamigawa Charm +33 R Chatterstorm and Awaken the Woods +34 R Phyrexian Cytoshaper +35 R Praetorhoof Behemoth +36 R Emrakul and Chatterfang +37 R Anax and Cymede and Kynaios and Tiro +38 R Shahrazad and Sindbad +39 R Riku and Riku +40 R Halana and Alena and Gisa and Geralf +41 R Autumn Willow and Baron Sengir +42 R Colossal Dreadmaw and Storm Crow +43 R Riven Turnbull and Princess Lucrezia +44 R Avacyn and Griselbrand +45 R Koma and Toski, Compleated +46 R Knowing // Half the Battle +47 C Unicycling Automaton +48 U Segovian Sword +49 R Huge Truck +50 R Jitte and Divining Top +51 R Manakin and Millikin +52 R Luxior and Shadowspear +53 R Bob the Claymore +54 R Phyrexian Incubator +55 R Sword of Fire and Ice and War and Peace +56 R Battle Myrsphere +57 R Guildmark +58 C Unknown Event Shores +59 R The Belligerent and Useless Island +60 C Common Curve Filler + +[promo] +61 M Minnea, Planar Tourist +62 M Polis the Planeshifter \ No newline at end of file diff --git a/forge-gui/res/editions/Unknown Event Philadelphia 2023 Playtest Cards.txt b/forge-gui/res/editions/Unknown Event Philadelphia 2023 Playtest Cards.txt new file mode 100644 index 00000000000..104a523c33f --- /dev/null +++ b/forge-gui/res/editions/Unknown Event Philadelphia 2023 Playtest Cards.txt @@ -0,0 +1,71 @@ +[metadata] +Code=UEPHI23 +Date=2023-02-17 +Name=Unknown Event Philadelphia 2023 Playtest Cards +Type=Funny + +[cards] +1 C Unclaimed Cat +2 C Incisor Steed +3 U Good Knight +4 U Rosewater's Nemesis +5 U Echoing Echo +6 R Leech Medic +7 R Life Cloud +8 R Crux of Mirrodin +9 C Drake with Set's Mechanic +10 C Unclaimed Bird +11 C Point to the Scoreboard +12 C More of That Strange Oil... +13 U Tricky Mage +14 R Memnarchitect +15 R Phyrexian Broodstar +16 R Untap, Upkeep, Draw +17 C Unclaimed Blessing +18 C Long-Term Phyresis Study +19 U Nim Mongoose +20 U Bad Knight +21 U Phyrexian Chimney Imp +22 U Sheoldred's Terror +23 R Old Way Phyrexian +24 R Hidetsugu's Poison Rite +25 C Join the Winning Team +26 C Phyrexian Esthetician +27 C Burn the Phyresis +28 U Unclaimed Battle Axe +29 U Red Priest of Yawgmoth +30 U Furnace Oriflamme +31 R Snapsail Rider +32 R Hound of Urabrask +33 C Naturalize the Phyresis +34 C Unclaimed Tanadon +35 C Take the High Ground +36 U Arcbound Mamba +37 R Bringer of Green Zenith's Twilight +38 R Locus Cobra +39 R Pulse of the Hunter Maze +40 R Then, Dreadmaws Ate Everyone +41 R Forestfolk +42 C Phyrexian Ornithopter +43 C Sojourner's Enforcermite +44 C Melira's Snacks +45 U Compleated Clone Shell +46 U Sawtooth Avenger +47 U Original Skullclamp +48 R Goblin Savant +49 R Glorious Dragon-Kin +50 R Oilskelion +51 R Soul of Mirrodin +52 R Platinum Persecutor +53 R Chancellor of the Mulligan +54 R Mindslaver Toolkit +55 R Mox Poison +56 R Sort of ____ and ____ +57 C The Forgotten Place +58 C Artifact Unknown Shores +59 R Who's That Praetor? +60 R Call Up Emrakul to Help + +[promo] +61 M Phila, Unsealed +62 M Delphia, Undecided \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/all_1_1_a_stained_glass.txt b/forge-gui/res/tokenscripts/all_1_1_a_stained_glass.txt new file mode 100644 index 00000000000..c421a91e2a0 --- /dev/null +++ b/forge-gui/res/tokenscripts/all_1_1_a_stained_glass.txt @@ -0,0 +1,7 @@ +Name:Stained Glass Token +ManaCost:no cost +Colors:all +Types:Artifact Creature Stained Glass +PT:1/1 +Text:This creature is all colors. +Oracle:This creature is all colors. diff --git a/forge-gui/res/tokenscripts/b_1_1_cat.txt b/forge-gui/res/tokenscripts/b_1_1_cat.txt new file mode 100644 index 00000000000..963c09790d7 --- /dev/null +++ b/forge-gui/res/tokenscripts/b_1_1_cat.txt @@ -0,0 +1,6 @@ +Name:Cat Token +ManaCost:no cost +Types:Creature Cat +Colors:black +PT:1/1 +Oracle: diff --git a/forge-gui/res/tokenscripts/br_7_7_demon.txt b/forge-gui/res/tokenscripts/br_7_7_demon.txt new file mode 100644 index 00000000000..9c1bf6b6fe4 --- /dev/null +++ b/forge-gui/res/tokenscripts/br_7_7_demon.txt @@ -0,0 +1,6 @@ +Name:Demon Token +ManaCost:no cost +Types:Creature Demon +Colors:black,red +PT:7/7 +Oracle: diff --git a/forge-gui/res/tokenscripts/colossal_dreadmaw.txt b/forge-gui/res/tokenscripts/colossal_dreadmaw.txt new file mode 100644 index 00000000000..f3eb7200cca --- /dev/null +++ b/forge-gui/res/tokenscripts/colossal_dreadmaw.txt @@ -0,0 +1,7 @@ +Name:Colossal Dreadmaw +ManaCost:no cost +Types:Creature Dinosaur +Colors:green +PT:6/6 +K:Trample +Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.) diff --git a/forge-gui/res/tokenscripts/incubator_dark_confidant.txt b/forge-gui/res/tokenscripts/incubator_dark_confidant.txt new file mode 100644 index 00000000000..b10cb72c62d --- /dev/null +++ b/forge-gui/res/tokenscripts/incubator_dark_confidant.txt @@ -0,0 +1,18 @@ +Name:Incubator Dark Confidant Token +Types:Artifact Incubator +A:AB$ SetState | Cost$ 2 | Mode$ Transform | SpellDescription$ Transform this artifact. +AlternateMode:DoubleFaced +Oracle:{2}: Transform this artifact. + +ALTERNATE + +Name:Dark Confidant +ManaCost:1 B +Types:Creature Phyrexian Human Wizard +PT:2/1 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal the top card of your library and put that card into your hand. You lose life equal to its mana value. +SVar:TrigDig:DB$ Dig | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card | DestinationZone$ Hand | RememberChanged$ True | SubAbility$ DBLose +SVar:DBLose:DB$ LoseLife | LifeAmount$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$CardManaCost +Oracle:At the beginning of your upkeep, reveal the top card of your library and put that card into your hand. You lose life equal to its mana value. diff --git a/forge-gui/res/tokenscripts/role_huntsman.txt b/forge-gui/res/tokenscripts/role_huntsman.txt new file mode 100644 index 00000000000..9353393caa0 --- /dev/null +++ b/forge-gui/res/tokenscripts/role_huntsman.txt @@ -0,0 +1,8 @@ +Name:Huntsman +ManaCost:no cost +Types:Enchantment Aura Role +K:Enchant creature +A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddAbility$ Mana | Description$ Enchanted creature gets +1/+1 and has "{T}: Add {G}." +SVar:Mana:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Enchant Creature\nEnchanted creature gets +1/+1 and has "{T}: Add {G}." diff --git a/forge-gui/res/tokenscripts/role_questing.txt b/forge-gui/res/tokenscripts/role_questing.txt new file mode 100644 index 00000000000..00a61e14eb6 --- /dev/null +++ b/forge-gui/res/tokenscripts/role_questing.txt @@ -0,0 +1,12 @@ +Name:Questing +ManaCost:no cost +Types:Enchantment Aura Role +K:Enchant creature +A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Vigilance & Deathtouch & Haste | AddTrigger$ TrigChomp | AddStaticAbility$ StaticNoBlock & StaticNoFog | Description$ Enchanted creature has vigilance, deathtouch, and haste, and has "This creature can't be blocked by creatures with power 2 or less.", "Combat damage that would be dealt by creatures you control can't be prevented.", and "Whenever this creature deals combat damage to an opponent, it deals that much damage to target planeswalker that player controls." +SVar:StaticNoBlock:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ This creature can't be blocked by creatures with power 2 or less. +SVar:StaticNoFog:Mode$ CantPreventDamage | IsCombat$ True | ValidSource$ Creature.YouCtrl | Description$ Combat damage that would be dealt by creatures you control can't be prevented. +SVar:TrigChomp:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ MoreDamage | TriggerDescription$ Whenever this creature deals combat damage to an opponent, it deals that much damage to target planeswalker that player controls. +SVar:MoreDamage:DB$ DealDamage | ValidTgts$ Planeswalker.ControlledBy TriggeredTarget | TgtPrompt$ Select target planeswalker that player controls | NumDmg$ X +SVar:X:TriggerCount$DamageAmount +Oracle:Enchant Creature\nEnchanted creature has vigilance, deathtouch, and haste, and has "This creature can't be blocked by creatures with power 2 or less.", "Combat damage that would be dealt by creatures you control can't be prevented.", and "Whenever this creature deals combat damage to an opponent, it deals that much damage to target planeswalker that player controls." \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/toskis_coil.txt b/forge-gui/res/tokenscripts/toskis_coil.txt new file mode 100644 index 00000000000..75f43bcf2bc --- /dev/null +++ b/forge-gui/res/tokenscripts/toskis_coil.txt @@ -0,0 +1,7 @@ +Name:Toski's Coil +ManaCost:no cost +Types:Artifact Creature Phyrexian Serpent Squirrel +PT:1/1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:Whenever this creature deals combat damage to a player, draw a card. diff --git a/forge-gui/res/tokenscripts/u_m1_m1_squid.txt b/forge-gui/res/tokenscripts/u_m1_m1_squid.txt new file mode 100644 index 00000000000..9c9417adeb8 --- /dev/null +++ b/forge-gui/res/tokenscripts/u_m1_m1_squid.txt @@ -0,0 +1,6 @@ +Name:Squid Token +ManaCost:no cost +Types:Creature Squid +Colors:blue +PT:-1/-1 +Oracle: diff --git a/forge-gui/res/tokenscripts/w_2_2_performer.txt b/forge-gui/res/tokenscripts/w_2_2_performer.txt new file mode 100644 index 00000000000..357a91d14fa --- /dev/null +++ b/forge-gui/res/tokenscripts/w_2_2_performer.txt @@ -0,0 +1,6 @@ +Name:Performer Token +ManaCost:no cost +Types:Creature Performer +Colors:white +PT:2/2 +Oracle: From 33e5d14ea58ee14a31f23e7336df7ff3b199f4bb Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Fri, 23 Aug 2024 10:36:02 +0100 Subject: [PATCH 13/33] Add files via upload (#5971) --- .../res/cardsfolder/upcoming/new_master_of_arms.txt | 8 ++++++++ .../res/cardsfolder/upcoming/teferi_druid_of_argoth.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/wisedrafters_will.txt | 9 +++++++++ 3 files changed, 25 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/new_master_of_arms.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/teferi_druid_of_argoth.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wisedrafters_will.txt diff --git a/forge-gui/res/cardsfolder/upcoming/new_master_of_arms.txt b/forge-gui/res/cardsfolder/upcoming/new_master_of_arms.txt new file mode 100644 index 00000000000..8b185a9905f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/new_master_of_arms.txt @@ -0,0 +1,8 @@ +Name:New Master of Arms +ManaCost:2 W +Types:Creature Human Soldier +PT:2/2 +K:First Strike +R:Event$ DamageDone | Prevent$ True | IsCombat$ True | ValidSource$ Creature.blocking+tapped | Description$ Prevent all combat damage that would be dealt by blocking creatures that are tapped. +A:AB$ Tap | Cost$ 1 W | ValidTgts$ Creature.blockingSource | TgtPrompt$ Select target creature blocking CARDNAME | SpellDescription$ Tap target creature blocking CARDNAME. +Oracle:First strike\nPrevent all combat damage that would be dealt by blocking creatures that are tapped.\n{1}{W}: Tap target creature blocking New Master of Arms. diff --git a/forge-gui/res/cardsfolder/upcoming/teferi_druid_of_argoth.txt b/forge-gui/res/cardsfolder/upcoming/teferi_druid_of_argoth.txt new file mode 100644 index 00000000000..ca27018577b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/teferi_druid_of_argoth.txt @@ -0,0 +1,8 @@ +Name:Teferi, Druid of Argoth +ManaCost:2 G G G +Types:Legendary Creature Human Druid +PT:3/4 +K:Flash +S:Mode$ Continuous | Affected$ Creature.YouOwn+nonToken | AffectedZone$ Hand,Graveyard,Exile,Library,Command,Stack | AddKeyword$ Flash | Description$ Creature cards you own that aren't on the battlefield have flash. +S:Mode$ CantBeCast | ValidCard$ Card | OnlySorcerySpeed$ True | Caster$ Opponent | Description$ Each opponent can cast spells only any time they could cast a sorcery. +Oracle:Flash\nCreature cards you own that aren't on the battlefield have flash.\nEach opponent can cast spells only any time they could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/wisedrafters_will.txt b/forge-gui/res/cardsfolder/upcoming/wisedrafters_will.txt new file mode 100644 index 00000000000..a00ed56f1f8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wisedrafters_will.txt @@ -0,0 +1,9 @@ +Name:Wisedrafter's Will +ManaCost:U +Types:Enchantment +S:Mode$ Continuous | AffectedZone$ Hand | Affected$ Card.OppOwn | MayLookAt$ Player | Description$ Your opponents play with their hands revealed. +A:AB$ Draw | Cost$ U Sac<1/CARDNAME> | SpellDescription$ Draw a card. +A:AB$ Counter | Cost$ U U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. +SVar:NonStackingEffect:True +AI:RemoveDeck:All +Oracle:Your opponents play with their hands revealed.\n{U}, Sacrifice Wisedrafter’s Will: Draw a card.\n{U}{U}, Sacrifice Wisedrafter’s Will: Counter target spell. From 76f4113fb7da1059fbe7d35376d2e94f370ad267 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Aug 2024 12:37:23 +0300 Subject: [PATCH 14/33] - First draft: fix AI for Fireball and Shatterskull Smashing (#5975) --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 36a61d50e25..3b6ee61a44c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -95,8 +95,8 @@ public class DamageDealAi extends DamageAiBase { final String damage = sa.getParam("NumDmg"); int dmg = AbilityUtils.calculateAmount(source, damage, sa); - if (damage.equals("X") || sourceName.equals("Crater's Claws")) { - if (sa.getSVar(damage).equals("Count$xPaid") || sourceName.equals("Crater's Claws")) { + if (damage.equals("X") || source.getSVar("X").equals("Count$xPaid") || sourceName.equals("Crater's Claws")) { + if (sa.getSVar("X").equals("Count$xPaid") || sa.getSVar(damage).equals("Count$xPaid") || sourceName.equals("Crater's Claws")) { dmg = ComputerUtilCost.getMaxXValue(sa, ai, sa.isTrigger()); // Try not to waste spells like Blaze or Fireball on early targets, try to do more damage with them if possible From 45b333b8acc904d37caf9dd1889b381dfc61bcf6 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Fri, 23 Aug 2024 11:34:14 +0200 Subject: [PATCH 15/33] Fix NPE with Brilliant Ultimatum --- forge-game/src/main/java/forge/game/ability/AbilityUtils.java | 1 + .../forge/game/ability/effects/InternalRadiationEffect.java | 4 ++-- 2 files changed, 3 insertions(+), 2 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 0ed80f17159..036fff0cd28 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2954,6 +2954,7 @@ public class AbilityUtils { for (SpellAbility s : list) { if (s.isLandAbility()) { + s.setActivatingPlayer(controller); // CR 305.3 if (controller.getGame().getPhaseHandler().isPlayerTurn(controller) && controller.canPlayLand(tgtCard, true, s)) { sas.add(s); diff --git a/forge-game/src/main/java/forge/game/ability/effects/InternalRadiationEffect.java b/forge-game/src/main/java/forge/game/ability/effects/InternalRadiationEffect.java index acd621049aa..4d20ed979c3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/InternalRadiationEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/InternalRadiationEffect.java @@ -35,7 +35,7 @@ public class InternalRadiationEffect extends SpellAbilityEffect { final CardCollectionView milled = game.getAction().mill(new PlayerCollection(p), numRad, ZoneType.Graveyard, sa, moveParams); table.triggerChangesZoneAll(game, sa); int n = CardLists.count(milled, Predicates.not(CardPredicates.Presets.LANDS)); - + if (StaticAbilityGainLifeRadiation.gainLifeRadiation(p)) { p.gainLife(n, sa.getHostCard(), sa); } else { @@ -49,7 +49,7 @@ public class InternalRadiationEffect extends SpellAbilityEffect { game.getTriggerHandler().runTrigger(TriggerType.LifeLostAll, runParams, false); } } - + // and remove n rad counter p.removeRadCounters(n); } From ab11c10fd404bd4918ab0f2ba21bef3abf8acc48 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Fri, 23 Aug 2024 23:45:32 +0800 Subject: [PATCH 16/33] Update config.json general playtest and some funny cards shouldn't be on adventure unless specified otherwise --- forge-gui/res/adventure/common/config.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/adventure/common/config.json b/forge-gui/res/adventure/common/config.json index c2e7ae5027d..d389636df14 100644 --- a/forge-gui/res/adventure/common/config.json +++ b/forge-gui/res/adventure/common/config.json @@ -66,7 +66,14 @@ "UNH", "PPC1", "UND", - "PUST" + "PUST", + "UEPHI23", + "UEMIN23", + "UELAS23", + "UEIND23", + "UEBAR23", + "MB2", + "UNF" ], "difficulties": [ { From 3bfef56d516c7b308fbcc5817d17d6a5ffad2bf4 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Sat, 24 Aug 2024 07:45:35 +0800 Subject: [PATCH 17/33] Update insatiable_frugivore.txt - fixes 5977 --- forge-gui/res/cardsfolder/upcoming/insatiable_frugivore.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/insatiable_frugivore.txt b/forge-gui/res/cardsfolder/upcoming/insatiable_frugivore.txt index 97dc4c2a5ae..c54902929b6 100644 --- a/forge-gui/res/cardsfolder/upcoming/insatiable_frugivore.txt +++ b/forge-gui/res/cardsfolder/upcoming/insatiable_frugivore.txt @@ -6,8 +6,8 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ c_a_food_sac | SubAbility$ DBStoreSVar SVar:DBStoreSVar:DB$ StoreSVar | SVar$ CheckNotPaid | Type$ Number | Expression$ 1 | SubAbility$ DBRepeat SVar:DBRepeat:DB$ Repeat | RepeatSubAbility$ DBToken | RepeatCheckSVar$ CheckNotPaid | RepeatSVarCompare$ GT0 -SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | UnlessCost$ ExileFromGrave<3/Card> | UnlessPayer$ You | UnlessSwitched$ True | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DBStoreSVar | TokenScript$ c_a_food_sac -SVar:DBStoreSVar:DB$ StoreSVar | SVar$ CheckNotPaid | Type$ Number | Expression$ 0 +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | UnlessCost$ ExileFromGrave<3/Card> | UnlessPayer$ You | UnlessSwitched$ True | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DBStoreSVarT | TokenScript$ c_a_food_sac +SVar:DBStoreSVarT:DB$ StoreSVar | SVar$ CheckNotPaid | Type$ Number | Expression$ 0 A:AB$ PumpAll | Cost$ 3 B Sac | ValidCards$ Creature.YouCtrl | NumAtt$ +X | KW$ Menace | SpellDescription$ Creatures you control get +X/+0 and gain menace until end of turn. SVar:CheckNotPaid:Number$1 SVar:X:Count$xPaid From e04451b962c62d0d8193d3d448c7d79fe9e2df09 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 24 Aug 2024 12:47:30 +0800 Subject: [PATCH 18/33] update PlayerStatisticScene, BlurUtils - make blur pixelized --- .../forge/adventure/player/AdventurePlayer.java | 4 ++++ .../adventure/scene/PlayerStatisticScene.java | 8 ++++++-- forge-gui-mobile/src/forge/util/BlurUtils.java | 2 +- forge-gui/res/adventure/common/ui/statistic.json | 14 +++++++------- .../adventure/common/ui/statistic_portrait.json | 2 +- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 079a2fdfa43..8b179250c95 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -223,6 +223,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent { return name; } + public Boolean isFemale() { + return isFemale; + } + public float getWorldPosX() { return worldPosX; } diff --git a/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java b/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java index c95d826a21a..1f010a15269 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java @@ -12,6 +12,7 @@ import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Scaling; import com.github.tommyettinger.textra.TextraButton; import com.github.tommyettinger.textra.TextraLabel; +import com.github.tommyettinger.textra.TypingLabel; import forge.Forge; import forge.adventure.character.EnemySprite; import forge.adventure.data.EnemyData; @@ -44,7 +45,8 @@ public class PlayerStatisticScene extends UIScene { TextraLabel wins, totalWins, eventWins, eventMatchWins; TextraLabel loss, totalLoss, eventLosses, eventMatchLosses; TextraLabel winloss, lossWinRatio, eventLossWinRatio, eventMatchLossWinRatio; - TextraLabel playerName, headerAchievements, headerAvatar, headerName, headerWinLoss; + TextraLabel headerAchievements, headerAvatar, headerName, headerWinLoss; + TypingLabel playerName; TextraButton back, toggleAward; private final Table scrollContainer, achievementContainer; TextraLabel blessingScroll; @@ -196,7 +198,9 @@ public class PlayerStatisticScene extends UIScene { scrollContainer.clear(); if (playerName != null) { - playerName.setText(GamePlayerUtil.getGuiPlayer().getName()); + String gender = Current.player().isFemale() ? "{GRADIENT=MAGENTA;MAUVE;1;1}\u2640{ENDGRADIENT}[BLACK] " : "{GRADIENT=CYAN;BLUE;1;1}\u2642{ENDGRADIENT}[BLACK] "; + playerName.setText(gender + GamePlayerUtil.getGuiPlayer().getName()); + playerName.skipToTheEnd(); } if (avatar != null) { avatar.setDrawable(new TextureRegionDrawable(Current.player().avatar())); diff --git a/forge-gui-mobile/src/forge/util/BlurUtils.java b/forge-gui-mobile/src/forge/util/BlurUtils.java index 087995c1b07..ea9f303aab4 100644 --- a/forge-gui-mobile/src/forge/util/BlurUtils.java +++ b/forge-gui-mobile/src/forge/util/BlurUtils.java @@ -275,7 +275,7 @@ public class BlurUtils { int y = (int)(pixmap.getHeight()*0.35f); int width = pixmap.getWidth()-x; int height = pixmap.getHeight()-y; - return blur(pixmap, x/2, y/2, width, height, 0, 0, width, height, radius, iterations, disposePixmap); + return blur(pixmap, x/2, y/2, width, height, 0, 0, width/4, height/4, radius, iterations, disposePixmap); } /** diff --git a/forge-gui/res/adventure/common/ui/statistic.json b/forge-gui/res/adventure/common/ui/statistic.json index 1feba1b9185..b8e84cecf1d 100644 --- a/forge-gui/res/adventure/common/ui/statistic.json +++ b/forge-gui/res/adventure/common/ui/statistic.json @@ -37,7 +37,7 @@ { "type": "Image", "name": "avatar", - "x": 321, + "x": 384, "y": 28, "width": 64, "height": 64 @@ -46,7 +46,7 @@ "type": "Image", "name": "colorFrame", "image": "ui/colorC.png", - "x": 305, + "x": 368, "y": 45, "width": 64, "height": 64 @@ -137,9 +137,9 @@ "y": 224 }, { - "type": "Label", + "type": "TypingLabel", "name": "playerName", - "x": 394, + "x": 310, "y": 20, "width": 80, "height": 24, @@ -150,7 +150,7 @@ "name": "lifePoints", "width": 64, "height": 16, - "x": 394, + "x": 310, "y": 40 }, { @@ -158,7 +158,7 @@ "name": "money", "width": 64, "height": 16, - "x": 394, + "x": 310, "y": 80 }, { @@ -166,7 +166,7 @@ "name": "shards", "width": 64, "height": 16, - "x": 394, + "x": 310, "y": 60 }, { diff --git a/forge-gui/res/adventure/common/ui/statistic_portrait.json b/forge-gui/res/adventure/common/ui/statistic_portrait.json index 3f8b45b6187..2e7f09f5b85 100644 --- a/forge-gui/res/adventure/common/ui/statistic_portrait.json +++ b/forge-gui/res/adventure/common/ui/statistic_portrait.json @@ -136,7 +136,7 @@ "y": 440 }, { - "type": "Label", + "type": "TypingLabel", "name": "playerName", "x": 98, "y": 4, From 3522492c85dfd8f4ea10c2b7a5f503063c88f4c2 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 24 Aug 2024 00:51:57 -0400 Subject: [PATCH 19/33] Fix bad logic check (#5981) --- .../src/main/java/forge/gamemodes/limited/LimitedPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/LimitedPlayer.java b/forge-gui/src/main/java/forge/gamemodes/limited/LimitedPlayer.java index b55c1213a6b..1a9bae2da9c 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/LimitedPlayer.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/LimitedPlayer.java @@ -414,7 +414,7 @@ public class LimitedPlayer { } public boolean hasCanalDredger() { - return (playerFlags & CanalDredgerLastPick) != CanalDredgerLastPick; + return (playerFlags & CanalDredgerLastPick) == CanalDredgerLastPick; } public void receiveUnopenedPack(DraftPack pack) { From 1716fd2e1aecf4fd8cb5447c3763912923826c08 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Sat, 24 Aug 2024 09:26:43 +0100 Subject: [PATCH 20/33] Edition updates: DSK, SLD, YBLB (also add YBLB to formats) --- forge-gui/res/editions/Duskmourn House of Horror.txt | 1 + forge-gui/res/editions/Secret Lair Drop Series.txt | 11 +++++++++++ forge-gui/res/formats/Archived/Alchemy/2024-08-20.txt | 6 ++++++ .../res/formats/Archived/Historic/2024-08-20.txt | 8 ++++++++ .../res/formats/Archived/Timeless/2024-08-20.txt | 8 ++++++++ forge-gui/res/formats/Sanctioned/Historic.txt | 2 +- 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/formats/Archived/Alchemy/2024-08-20.txt create mode 100644 forge-gui/res/formats/Archived/Historic/2024-08-20.txt create mode 100644 forge-gui/res/formats/Archived/Timeless/2024-08-20.txt diff --git a/forge-gui/res/editions/Duskmourn House of Horror.txt b/forge-gui/res/editions/Duskmourn House of Horror.txt index 6f6339126ab..b106c64e344 100644 --- a/forge-gui/res/editions/Duskmourn House of Horror.txt +++ b/forge-gui/res/editions/Duskmourn House of Horror.txt @@ -24,6 +24,7 @@ ScryfallCode=DSK 275 L Mountain @Dan Mumford 276 L Forest @Dan Mumford 292 R Come Back Wrong @David Auden Nash +296 R Cursed Recording @Kim Sokol 309 R Come Back Wrong @Alexis Ziritt 314 R Chainsaw @Alexis Ziritt 346 R Doomsday Excruciator @Jarel Threat diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index e6f6fc8c275..b1fce77e115 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -755,6 +755,7 @@ ScryfallCode=SLD 777 R Reclamation Sage @Christopher Moeller 779 R Sylvan Ranger @Ciruelo 780 R Timberwatch Elf @Dave Dorman +782 R Viridian Shaman @Scott M. Fischer 783 R Wellwisher @Christopher Rush 785 R Wirewood Symbiote @Thomas M. Baxa 786 R Frilled Mystic @Randy Vargas @@ -1599,12 +1600,22 @@ F1540 M Rainbow Dash @John Thacker 1788 R Delay @Jordan Speer 1789 M Blood Money @Ricardo Diseño 1790 R Drown in the Loch @Wojtek Łebski +1791 M Karazikar, the Eye Tyrant @Skinner +1792 R Snuff Out @Ed Repka +1793 R Defile @Cabrol +1794 R Oubliette @Will Sweeney +1795 R Fling @Jon Vermilyea +1796 R Fire Covenant @Dan Mumford 1797 R Astarion, the Decadent @Nereida 1798 R Exquisite Blood @Justyna Dura 1799 R Sanguine Bond @Livia Prima 1800 R Anguished Unmaking @Mila Pesic 1801 R Mortify @Bartek Fedyczak 1802 M Karlach, Fury of Avernus @Mila Pesic +1803 R City on Fire @Fajareka Setiawan +1804 R Stranglehold @Bartek Fedyczak +1805 R Thrill of Possibility @Johannes Voss +1806 R Dolmen Gate @Justyna Dura 8001 M Jace, the Mind Sculptor @Wizard of Barge 9990 R Doom Blade @Cynthia Sheppard 9991 R Massacre @Andrey Kuzinskiy diff --git a/forge-gui/res/formats/Archived/Alchemy/2024-08-20.txt b/forge-gui/res/formats/Archived/Alchemy/2024-08-20.txt new file mode 100644 index 00000000000..13689bd708f --- /dev/null +++ b/forge-gui/res/formats/Archived/Alchemy/2024-08-20.txt @@ -0,0 +1,6 @@ +[format] +Name:Alchemy (YBLB) +Type:Archived +Subtype:Arena +Effective:2024-08-20 +Sets:ANA, ANB, WOE, YWOE, LCI, YLCI, MKM, YMKM, OTJ, BIG, YOTJ, BLB, YBLB diff --git a/forge-gui/res/formats/Archived/Historic/2024-08-20.txt b/forge-gui/res/formats/Archived/Historic/2024-08-20.txt new file mode 100644 index 00000000000..f0ea6c1db92 --- /dev/null +++ b/forge-gui/res/formats/Archived/Historic/2024-08-20.txt @@ -0,0 +1,8 @@ +[format] +Name:Historic (YBLB) +Type:Archived +Subtype:Arena +Effective:2024-08-20 +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB +Banned:Agent of Treachery; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Commandeer; Counterspell; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Subtlety; Swords to Plowshares; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills +Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Enlisted Wurm; Evolutionary Leap; Fabricate; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Slimefoot and Squee; Smuggler's Copter; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Archived/Timeless/2024-08-20.txt b/forge-gui/res/formats/Archived/Timeless/2024-08-20.txt new file mode 100644 index 00000000000..d2f26d31059 --- /dev/null +++ b/forge-gui/res/formats/Archived/Timeless/2024-08-20.txt @@ -0,0 +1,8 @@ +[format] +Name:Timeless (YBLB) +Type:Archived +Subtype:Vintage +Effective:2024-08-20 +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB +Restricted:Channel; Demonic Tutor; Tibalt's Trickery +Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Endurance; Enlisted Wurm; Evolutionary Leap; Fabricate; Fury; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Grief; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Show and Tell; Slimefoot and Squee; Smuggler's Copter; Solitude; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Subtlety; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Sanctioned/Historic.txt b/forge-gui/res/formats/Sanctioned/Historic.txt index bc69df5556f..fa3b9bba362 100644 --- a/forge-gui/res/formats/Sanctioned/Historic.txt +++ b/forge-gui/res/formats/Sanctioned/Historic.txt @@ -4,6 +4,6 @@ Type:Digital Subtype:Arena Effective:2019-11-21 Order:142 -Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB Banned:Agent of Treachery; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Commandeer; Counterspell; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Subtlety; Swords to Plowshares; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Enlisted Wurm; Evolutionary Leap; Fabricate; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Slimefoot and Squee; Smuggler's Copter; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector From 30a358dda1304f64b2df43685dcb31a802efca9a Mon Sep 17 00:00:00 2001 From: tool4ever Date: Sat, 24 Aug 2024 11:25:36 +0000 Subject: [PATCH 21/33] Fix Wheel of Potential (#5983) * Wheel of Potential revision * Logic cleanup --------- Co-authored-by: tool4EvEr --- forge-ai/src/main/java/forge/ai/AiController.java | 10 +++------- .../main/java/forge/ai/ComputerUtilAbility.java | 15 ++++----------- .../main/java/forge/game/GameLogFormatter.java | 7 +------ .../src/main/java/forge/game/card/Card.java | 2 ++ .../main/java/forge/game/card/CardPredicates.java | 3 +-- forge-gui/res/cardsfolder/i/ignite_the_future.txt | 2 +- .../res/cardsfolder/n/nahiris_lithoforming.txt | 9 ++++----- forge-gui/res/cardsfolder/n/nyssa_of_traken.txt | 6 +++--- .../res/cardsfolder/w/wheel_of_potential.txt | 14 +++++++------- 9 files changed, 26 insertions(+), 42 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 7c2a25b1efe..e2bf5ae96e7 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -64,7 +64,6 @@ import forge.util.Aggregates; import forge.util.ComparatorUtil; import forge.util.Expressions; import forge.util.MyRandom; -import forge.util.collect.FCollectionView; import io.sentry.Breadcrumb; import io.sentry.Sentry; @@ -437,11 +436,11 @@ public class AiController { } landList = CardLists.filter(landList, c -> { - CardCollectionView battlefield = player.getCardsIn(ZoneType.Battlefield); if (canPlaySpellBasic(c, null) != AiPlayDecision.WillPlay) { return false; } String name = c.getName(); + CardCollectionView battlefield = player.getCardsIn(ZoneType.Battlefield); if (c.getType().isLegendary() && !name.equals("Flagstones of Trokair")) { if (Iterables.any(battlefield, CardPredicates.nameEquals(name))) { return false; @@ -461,11 +460,8 @@ public class AiController { } // don't play the land if it has cycling and enough lands are available - final FCollectionView spellAbilities = c.getSpellAbilities(); - for (final SpellAbility sa : spellAbilities) { - if (sa.isCycling()) { - return false; - } + if (c.hasKeyword(Keyword.CYCLING)) { + return false; } } return Iterables.any(c.getAllPossibleAbilities(player, true), SpellAbility::isLandAbility); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index d316ea836a5..b08e4e3bd3e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -14,7 +14,6 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; -import forge.game.card.CardPredicates.Presets; import forge.game.cost.CostPart; import forge.game.cost.CostPayEnergy; import forge.game.cost.CostPutCounter; @@ -32,18 +31,12 @@ public class ComputerUtilAbility { if (!game.getStack().isEmpty() || !game.getPhaseHandler().getPhase().isMain()) { return null; } - final CardCollection hand = new CardCollection(player.getCardsIn(ZoneType.Hand)); - hand.addAll(player.getCardsIn(ZoneType.Exile)); - CardCollection landList = CardLists.filter(hand, Presets.LANDS); + CardCollection landList = new CardCollection(player.getCardsIn(ZoneType.Hand)); //filter out cards that can't be played landList = CardLists.filter(landList, c -> { - if (!c.getSVar("NeedsToPlay").isEmpty()) { - final String needsToPlay = c.getSVar("NeedsToPlay"); - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), needsToPlay, c.getController(), c, null); - if (list.isEmpty()) { - return false; - } + if (!c.hasPlayableLandFace()) { + return false; } return player.canPlayLand(c, false, c.getFirstSpellAbility()); }); @@ -54,7 +47,7 @@ public class ComputerUtilAbility { landsNotInHand.add(player.getCardsIn(ZoneType.Library).get(0)); } for (final Card crd : landsNotInHand) { - if (!(crd.isLand() || (crd.isFaceDown() && crd.getState(CardStateName.Original).getType().isLand()))) { + if (!(crd.hasPlayableLandFace() || (crd.isFaceDown() && crd.getState(CardStateName.Original).getType().isLand()))) { continue; } if (!crd.mayPlay(player).isEmpty()) { diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index faf9fe64314..9027a6d3bbb 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -2,7 +2,6 @@ package forge.game; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map.Entry; import com.google.common.collect.Iterables; @@ -93,11 +92,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { if (event.sa.getTargetRestrictions() != null) { StringBuilder sb = new StringBuilder(); - List targets = event.sa.getAllTargetChoices(); - // Include the TargetChoices from the stack instance, since the real target choices - // are on that object at this point (see SpellAbilityStackInstance constructor). - targets.add(event.si.getTargetChoices()); - for (TargetChoices ch : targets) { + for (TargetChoices ch : event.sa.getAllTargetChoices()) { if (null != ch) { sb.append(ch); } 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 f94ad7292d5..ddbf16e1a2f 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -5524,6 +5524,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return isInstant() || isSorcery() || (isAura() && !isInZone(ZoneType.Battlefield)); } + public final boolean hasPlayableLandFace() { return isLand() || (isModal() && getState(CardStateName.Modal).getType().isLand()); } + public final boolean isLand() { return getType().isLand(); } public final boolean isBasicLand() { return getType().isBasicLand(); } public final boolean isSnow() { return getType().isSnow(); } diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 5a75387682f..5e2289da035 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -22,7 +22,6 @@ import java.util.Comparator; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; -import forge.card.CardStateName; import forge.game.CardTraitBase; import forge.game.GameEntity; import forge.game.combat.CombatUtil; @@ -379,7 +378,7 @@ public final class CardPredicates { /** * a Predicate to get all lands. */ - public static final Predicate LANDS = c -> c.isLand() || (!c.isInZone(ZoneType.Battlefield) && c.isModal() && c.getState(CardStateName.Modal).getType().isLand()); + public static final Predicate LANDS = c -> c.isLand(); /** * a Predicate to get all mana-producing lands. */ diff --git a/forge-gui/res/cardsfolder/i/ignite_the_future.txt b/forge-gui/res/cardsfolder/i/ignite_the_future.txt index 742fe2f0e6e..fd2bd99348a 100644 --- a/forge-gui/res/cardsfolder/i/ignite_the_future.txt +++ b/forge-gui/res/cardsfolder/i/ignite_the_future.txt @@ -2,7 +2,7 @@ Name:Ignite the Future ManaCost:3 R Types:Sorcery A:SP$ Dig | Defined$ You | DigNum$ 3 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top three cards of your library. Until the end of your next turn, you may play those cards. If this spell was cast from a graveyard, you may play cards this way without paying their mana costs. -SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ UntilTheEndOfYourNextTurn | ConditionDefined$ Self | ConditionPresent$ Card.wasCastFromGraveyard | ConditionCompare$ EQ0 | SubAbility$ DBEffect2 +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ UntilTheEndOfYourNextTurn | SubAbility$ DBEffect2 SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. SVar:DBEffect2:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play2 | ForgetOnMoved$ Exile | Duration$ UntilTheEndOfYourNextTurn | ConditionDefined$ Self | ConditionPresent$ Card.wasCastFromGraveyard | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:Play2:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/n/nahiris_lithoforming.txt b/forge-gui/res/cardsfolder/n/nahiris_lithoforming.txt index d091434a374..c03aff4a5ac 100644 --- a/forge-gui/res/cardsfolder/n/nahiris_lithoforming.txt +++ b/forge-gui/res/cardsfolder/n/nahiris_lithoforming.txt @@ -2,16 +2,15 @@ Name:Nahiri's Lithoforming ManaCost:X R R Types:Sorcery A:SP$ Sacrifice | SacValid$ Land | Amount$ X | RememberSacrificed$ True | SubAbility$ DBDraw | StackDescription$ SpellDescription | SpellDescription$ Sacrifice X lands. For each land sacrificed this way, draw a card. You may play X additional lands this turn. Lands you control enter tapped this turn. -SVar:DBDraw:DB$ Draw | NumCards$ Y | SubAbility$ DBStoreSVar | StackDescription$ None -SVar:DBStoreSVar:DB$ StoreSVar | SVar$ XLands | Type$ CountSVar | Expression$ X | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PlayMoreLand | ReplacementEffects$ LandETB | SubAbility$ DBCleanup -SVar:PlayMoreLand:Mode$ Continuous | Affected$ You | AdjustLandPlays$ XLands | EffectZone$ Command | Description$ You may play X additional lands this turn. +SVar:DBDraw:DB$ Draw | NumCards$ Y | SubAbility$ DBEffect | StackDescription$ None +SVar:DBEffect:DB$ Effect | SetChosenNumber$ X | StaticAbilities$ PlayMoreLand | ReplacementEffects$ LandETB | SubAbility$ DBCleanup +SVar:PlayMoreLand:Mode$ Continuous | Affected$ You | AdjustLandPlays$ Z | EffectZone$ Command | Description$ You may play X additional lands this turn. SVar:LandETB:Event$ Moved | ValidCard$ Land.YouCtrl | Destination$ Battlefield | ReplaceWith$ ETBTapped | ReplacementResult$ Updated | Description$ Lands you control enter tapped this turn. SVar:ETBTapped:DB$ Tap | ETB$ True | Defined$ ReplacedCard SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid SVar:Y:Count$RememberedSize -SVar:XLands:Number$0 +SVar:Z:Count$ChosenNumber DeckHas:Ability$Sacrifice AI:RemoveDeck:All Oracle:Sacrifice X lands. For each land sacrificed this way, draw a card. You may play X additional lands this turn. Lands you control enter tapped this turn. diff --git a/forge-gui/res/cardsfolder/n/nyssa_of_traken.txt b/forge-gui/res/cardsfolder/n/nyssa_of_traken.txt index 1d56a8be081..ca2392612fa 100644 --- a/forge-gui/res/cardsfolder/n/nyssa_of_traken.txt +++ b/forge-gui/res/cardsfolder/n/nyssa_of_traken.txt @@ -3,8 +3,8 @@ ManaCost:3 U Types:Legendary Creature Human Scientist PT:3/4 S:Mode$ Continuous | Affected$ You | SetMaxHandSize$ Unlimited | Description$ You have no maximum hand size. -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigImmediateTrig | OptionalDecider$ You | TriggerDescription$ Sonic Booster — Whenever CARDNAME attacks, sacrifice X artifacts. When you sacrifice one or more artifacts this way, tap up to X target creatures and you draw X cards. -SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ Sac | Execute$ TrigTap | TriggerDescription$ When you sacrifice one or more artifacts this way, tap up to X target creatures and you draw X cards. +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigImmediateTrig | OptionalDecider$ You | TriggerDescription$ Sonic Booster — Whenever CARDNAME attacks, sacrifice any number artifacts. When you sacrifice one or more artifacts this way, tap up to that many target creatures and draw that many cards. +SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ Sac | Execute$ TrigTap | TriggerDescription$ When you sacrifice one or more artifacts this way, tap up to that many target creatures and draw that many cards. SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select up to X target creatures to tap | ValidTgts$ Creature | SubAbility$ TrigDraw SVar:TrigDraw:DB$ Draw | NumCards$ X SVar:X:Count$xPaid @@ -12,4 +12,4 @@ K:Doctor's companion SVar:HasAttackEffect:TRUE DeckHas:Ability$Sacrifice DeckNeeds:Type$Artifact -Oracle:You have no maximum hand size.\nSonic Booster — Whenever Nyssa of Traken attacks, sacrifice X artifacts. When you sacrifice one or more artifacts this way, tap up to X target creatures and you draw X cards.\nDoctor's companion (You can have two commanders if the other is the Doctor.) +Oracle:You have no maximum hand size.\nSonic Booster — Whenever Nyssa of Traken attacks, sacrifice any number of artifacts. When you sacrifice one or more artifacts this way, tap up to that many target creatures and draw that many cards.\nDoctor's companion (You can have two commanders if the other is the Doctor.) diff --git a/forge-gui/res/cardsfolder/w/wheel_of_potential.txt b/forge-gui/res/cardsfolder/w/wheel_of_potential.txt index 453284c8ec5..a862ebbc54b 100644 --- a/forge-gui/res/cardsfolder/w/wheel_of_potential.txt +++ b/forge-gui/res/cardsfolder/w/wheel_of_potential.txt @@ -1,18 +1,18 @@ Name:Wheel of Potential ManaCost:2 R Types:Sorcery -A:SP$ PutCounter | Defined$ You | CounterType$ ENERGY | CounterNum$ 3 | SubAbility$ ChooseX | StackDescription$ REP You get_{p:You} gets & you_ | SpellDescription$ You get {E}{E}{E} (three energy counters), then you may pay X {E}.,,,,,, +A:SP$ PutCounter | Defined$ You | CounterType$ ENERGY | CounterNum$ 3 | SubAbility$ ChooseX | StackDescription$ REP You get_{p:You} gets & you_ | SpellDescription$ You get {E}{E}{E} (three energy counters), then you may pay any amount of {E}.,,,,,, SVar:ChooseX:DB$ ChooseNumber | Max$ Count$YourCountersEnergy | ListTitle$ amount of energy to pay | SubAbility$ Pay | StackDescription$ None SVar:Pay:DB$ Pump | UnlessCost$ Mandatory PayEnergy | UnlessPayer$ You | UnlessSwitched$ True | SubAbility$ Choose | StackDescription$ None -SVar:Choose:DB$ GenericChoice | TempRemember$ Chooser | ShowChoice$ ExceptSelf | Defined$ Player | Choices$ ExileDraw,No | SubAbility$ DBExile | StackDescription$ SpellDescription | SpellDescription$ Each player may exile their hand and draw X cards. +SVar:Choose:DB$ GenericChoice | TempRemember$ Chooser | ShowChoice$ ExceptSelf | Defined$ Player | Choices$ ExileDraw,No | SubAbility$ Exile | StackDescription$ SpellDescription | SpellDescription$ Each player may exile their hand and draw cards equal to the amount of {E} paid this way. SVar:ExileDraw:DB$ Pump | Defined$ Remembered | NoteCards$ Self | NoteCardsFor$ ExileDraw | SpellDescription$ Exile your hand and draw X cards. SVar:No:DB$ Pump | SpellDescription$ Keep your hand. -SVar:ExileDraw:DB$ ChangeZoneAll | Origin$ Hand | Destination$ Exile | ChangeType$ Card.OwnedBy Player.NotedForExile | RememberChanged$ True | SubAbility$ Draw | StackDescription$ None -SVar:Draw:DB$ Draw | Defined$ Player.NotedForExile | NumCards$ X | SubAbility$ Effect | StackDescription$ None -SVar:Effect:DB$ Effect | ConditionCheckSVar$ X | ConditionSVarCompare$ GE7 | RememberObjects$ Remembered.YouOwn | StaticAbilities$ Play | Duration$ UntilTheEndOfYourNextTurn | ForgetOnMoved$ Exile | SubAbility$ DBCleanup | SpellDescription$ If X is 7 or more, you may play cards you own exiled this way until the end of your next turn. +SVar:Exile:DB$ ChangeZoneAll | Origin$ Hand | Destination$ Exile | Defined$ Player.NotedForExileDraw | RememberChanged$ True | SubAbility$ Draw | StackDescription$ None +SVar:Draw:DB$ Draw | Defined$ Player.NotedForExileDraw | NumCards$ X | SubAbility$ Effect | StackDescription$ None +SVar:Effect:DB$ Effect | ConditionCheckSVar$ X | ConditionSVarCompare$ GE7 | RememberObjects$ Remembered.YouOwn | StaticAbilities$ Play | Duration$ UntilTheEndOfYourNextTurn | ForgetOnMoved$ Exile | SubAbility$ DBCleanup | SpellDescription$ If 7 or more {E} was paid this way, you may play cards you own exiled this way until the end of your next turn. SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.YouOwn+IsRemembered | AffectedZone$ Exile | Description$ You may play cards you own exiled this way until the end of your next turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBClearNotes -SVar:DBClearNotes:DB$ Pump | Defined$ Player | ClearNotedCardsFor$ Exile +SVar:DBClearNotes:DB$ Pump | Defined$ Player | ClearNotedCardsFor$ ExileDraw SVar:X:Count$ChosenNumber AI:RemoveDeck:All -Oracle:You get {E}{E}{E} (three energy counters), then you may pay X {E}.\nEach player may exile their hand and draw X cards. If X is 7 or more, you may play cards you own exiled this way until the end of your next turn. +Oracle:You get {E}{E}{E} (three energy counters), then you may pay any amount of {E}.\nEach player may exile their hand and draw cards equal to the amount of {E} paid this way. If 7 or more {E} was paid this way, you may play cards you own exiled this way until the end of your next turn. From 2dc025bf679b0abfc1febab9ca099375191a8866 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Sat, 24 Aug 2024 23:01:48 +0800 Subject: [PATCH 22/33] LDA Standard - August 7, 2024 --- forge-gui/res/deckgendecks/Standard.lda.dat | Bin 210735 -> 95779 bytes forge-gui/res/deckgendecks/Standard.raw.dat | Bin 209380 -> 82647 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/forge-gui/res/deckgendecks/Standard.lda.dat b/forge-gui/res/deckgendecks/Standard.lda.dat index 00b6d800294cd995811dc5d5ad2926005b1b950d..0e7e024cc756054bd9b9ed8963e51a6fc23304f6 100644 GIT binary patch literal 95779 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 literal 210735 zcma&P2Y6J)_dlG3gtqAk9c0CVh0qiQENglol_VqrwoS50mTY#zmK1vLy^El9q!XGn z5fxCeV;37@L$IOpwV=MAGwtrZEWh{f9dhz1<`zBrT|=!(}Z?vzB^Y?g2q9yp?X7r_$vptFN&<5QP7l z2GunW3c~+EO+NMpg{NC>)~+6Nw!Na#3)*oS?L@cR+K^@UcTb{f(HbJ zdh8=@^)+Z7To+3JdPW3|4Qhg)Ze_pU3L@QH?uzc#8f$5#t$V4fy4vORbaz;t6?b&^ z`f41u?gOf;eO_yc!5*G9+*azn zCo3q-O=G0qn$^35ZutM{Lr*%WzQ!9Am*}o`xou_Uf>O7&rUC?PZj3gXeKPgcJ;mk2 zsK)PkVc@M*e}{$y1*Zgs)mj}s8#?qu%kfp0*xXaME$L)h{Kc%0AW*j)IQF|c=I1&# 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%0DIsVFUz8B~k~#eUF+5 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 K#K|=}?*9Q)Y<2$t diff --git a/forge-gui/res/deckgendecks/Standard.raw.dat b/forge-gui/res/deckgendecks/Standard.raw.dat index f740b961aacb2886f169495b9bebbe0e654ee254..3192fb60758e3957bbb78d8442b46b4c66a6b169 100644 GIT binary patch literal 82647 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 C!1M_K literal 209380 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𝔞P7e)+c@ds3H%=q6hyCZRM?Cih2x6oElPjLat3 zS?e9rD>yj#M}#2S>d}t?P#peRs4j#9ITmZPB&ASH6QDu*5eDf%q#}V-G}7J+#Z)?7 zR+g?8xiasGKKamNy(Ao56c?DfByS3DIb3go4GwS?Si^aCZ9HbDouQP__i}j*$i081 zb^dOuzd(e8uR)b6ZR_~LZRhA3=I%}Fap~J4-cW@IHCz*>h=7_r{yKBBhSqEk>N4chnx$Ky|Wb<_sQu51S=3E3Mq0t?9W8$8}S}EbWx>} z{8OnwcI)h=XHI-@(NJ?7od`^wI|w_b!zi^ zn-hnBkE9Kfx4oAEo0@ljP*p?K5wzh5UlxD~LyR$0*}+dnw(fE2%^F>XAb+{a3|Jcy z>$I@34+1i7h_j5FcC_*-qyU*lY2+*$+0cQSbZ;{Rc2pfg`AOq#%25Nab4q)-jbEJx z!wnjRlPu9+_`T8A2u|WccKzr@$fT#zik2{__G+KqwrY|Mr*w?aN;{)u6B3>VwZ!O! zHf7crUm_WlgFrDc`BD*VUBLw{Oj^ptBg?kbTFuGeSTyX(L4h;8O>c6AHK&VDZ}r#K z&s{kkDZ&AtoJ?I`xMvW)gn+jtMxTxv`XLG%t^!BMbn0}d*9Y~fHbJQ*d<_8fwm8!k z{`{Bs6>E!;$2c|c{KJ&@efRM;9ZB7hf*YPFA)t{rkHi3VEP}9$0q+F{Urh0I1saN)3$eg z1i(99;8Op_$kT}wfQYe&nbemO^$DM8ie=n+-LoS$g)@x|{qCwVBx}i+aY#L`&``PG zI!;V$GLg%IDa5l)JVOf`=CLM4EPfIA6bZ7F=OAb(3RP=G;>trw9Lx%M8ovAor@CAD97Z)!GuSi?zFndthu)-bAb?GjVw^zo9R)mx z+2dNdKHYyQ;!jl`3ZdPjLSuseA#uWzCuUU3X(O4EQ!l+|jBp5;oJ;d#3WlK?32$U3PG+ckkl|v~Cxj&>v zlEFBcL4#|5++IaEK^iBmszBHd;R9Gg5WFG`{YwDk)F)UE4U9p6Dh0h-MkDk|>i?q< zyR-*leUW*;&qqMUUuB+0)tlcJh#*+(0Zi#S`&DpR!NG0s z#>E}Ft~$O50o*`czpr^}!p_kMV0L}=_MiUoat)#Y3}08326k@XT@5oQYNUS!(`pQ9 zQmKnsY^3IZaFlJp+A!;K zCq+g~Mh-mhH_%~ahu;#tC;&OKp5)s-uqOz2AVFdds$#(z#ohj1Yf_)yX-wZL5pNaE z#0OfZ->W{44jOn=mBQdcY;_vR*1=9;$>Y+^BYTb7)xeiG2%ixn*J8sZ)iA^1O44}P zKm*ATUX&tqm(r2a*M1`4cr{diLjOWh6PBO`0hnDb4an?&Bp*1+RsRtH4s~Bm67f?> zdwv=?f>fe=Y4Dd_3PiD`u73I-+XkhNI%17Y@xOO2ox7eX373YJPqcz{{ttVvrN)c^ zm>tWj-0;NXvLexDL%m6`uv@w>x#&6#Md4}t+$>GlZg(pLY@V}c$(hl!_4m%@1aOxF z$J~%!9nvEaI~UFYSl4^gsHN5#oE{w<~i@f(<#V- zZcg^|myL`y0t7Ieabzin{`TQ2bF*Pc%G6=N0!6^x?UULghs_5D%o)0oE)%B^zS;_%1 zT7(+zVFvRZ1>rg44et1$PtRMwa1yAqNJ@en7~~wt*>*UKhpV|1B^(@r-HR}CO+DNT z3=aTn@aJPs;&W=U;emAxm8j|@5-^YugdDO1pMjCqJMzo&7|(9BUEoFoQv!hH1lL!P zl2=G|smT4pCE3%YKj8~!GFVep@F+X|$Ql0GfHq2pi|oc#k`jNFuyI)xCbmecU34$0 zl>q2yLxqT8#kC`Ym`gw&md~NWv~yK9^Q)zF8UVIV_Uv@20z4{zq_7F9(3bo&I*};w%8J z#kOyq+N0uLPXW*X8|vp0hu@tS-dF&1F2kYYl^*>@4x|G_CKn#}Tm8*#+3NB?364(E zPq}i%l=%fomql11Ys!H6wW4zejTY7s1L3(-mTzdWut13NW*l>6{XW(15-ET#3>bH1 zcv|&*s`R8@wPrwaZ2sOWq0K1=#Q8xgE##x5jX6dU81Sz4^0v>#)FEH`r70P3@1*Zy z{wTaET~dkXV~Zat^m{(FqbTtZQi36#?9jD6BQ;?SM@$ z5kOZdr~k^7Z++JxfF}#K=M}x4SiL_2=oM}q+HlUp1fle>f^K8AGM#R|paV=s4sHI1 zQDfxC2mFbm(79SWvB{|py_r@gMd%t5roooAkyKqv^m1iZ?TdSZgU2H`Zj3CeF*@Uj z4YkswJ=|1S`t)04mr>%GFw4I%?vD1nt5|DRF076Dea;#0|2YiX!1~d7HBLAcA3sO| zh^L@f47RwW}Nie}Bowyj8d`}Ll-w7EAk)Nn)!3M=7bC3vS%$IRU)zK2!gLhK>o zKyKxWNY`R{JFE%1viIDMeA@Qyk>`e2MT)aYowo?&00PbezuHlS4Qjt04(5 zIAXw`n9&F=qXTc5I(>XUYS18^ULQS(2B5+?l_(W~1%o>f1#|!0wEC@BxwhON%b#`8 zuefj-?GJF+a_=f%mE?5%_aFo?-p@OIE4%$A>h6$5Y5O;Ow7i4k?~GiUg&bJfkr!W> zzV!G<1Te>zJ0W-2;|}2hpw9zV>ve6{-hMI)5JOI?2Ti3n$+s!TEKpzl4cW1pV{88r z3v;`ODUKB*tN+Zu-emkn^2#@`lt0~Oec{J?#Ab7~_;IqJH?){@)rb2{9a zjR0<$l>lH;lMi!9CB2rPfShyAU$btk1LZc!YW5;dQ$&&qYWbjSfPWqwiv4wvYsPHJ ztZ74Tt)F3`>PmWLtq8 zL?jNxTdc1Du2VEu7ERSarN&xTx zuz3Z?x#995i*!MDUqjkDd4_178Yd`7n>^~@l)lRaKzjnms-DbFs5FhPB$BiswSgn+P!d-QX9=yHqbPR9IMSPAN?g58;j>MHd=JS=$y*$VK zTF_wLdRm?7r-CH}cjGaE<_g_%Diog(Em2bk-?H5CqRSuyjc25Ve4242ZF=f`>HT@+ zC`Xy)N^Q09Z}Ov6C;(?Z$js~}`R3AbYZz*BlR6yLBo>$~HE`~XnJo+3yx}ZP;b5A< zOO~!ofo(QCAlKi|wVhoHe@^F4Km6nw0#gA7Is*1&r5nMS)IJTL_xa_#yw6al*}jH82lihZxh+X$4u$bcq2C*N$ejmDbN@X(ndSC#-^ zAwKX3HlT~oz5$WrOpVoUb+U4-4H5Q9!T$K?6O&S1(-nDd*o@E z{&(l#$YBs!6yCjkNSl@j;N5sdvT5Jl8s-XMhx8M&9%o1RWJH`40DT{DbH$<)i)QU& z3XVMK2F6j)W6$;-6Q~~|y`4P_$ayK>>e5hwqA>o*I^sX_i75pEJdC#T!|7kv?{q}~ zcL5eo@w+rk5raUPsnSoma^Am9Y)%yPLjY6vbG8oiOf9AwUg}jx#*sPrL{zb+mt{$iCOqX1N|`|08O3-}Hfl*^JEm`Sxfxlj_1pNAcM^hc`%`h;LxDvIyTTb!zD z@#S{$$K7tCHLl1QAZC36=w2EE(b|{)G38rJo{WV8G_&W*yZ>rzr>BFkCA(%E@U6di zaZhv^+``Q9{PST!Dw5AMCW;UD=Gx3T+1-=Q88R7gM>%KIkg0wx*|0%QC^(HAoCEy< zU;8OpK(+nNgiKSCFwN|aezHFgRW$hVxy_M@iK{ydq5Xwt_kqLFa5pRj1SUlva79Vk z4SRwORjzhAxz7$C4I`2DgS9zRXXB%Z(qQSsf21UkNm%bVdC!hxbg1B6xns2%_`YiJ z$E1%C;>P8=8-DuH3+nQ&$;06+R~)%usuxf*iR*0Jc3Az#J?s;HF>Cef1#N~s*o}Z) zAI7oz^1F;XU0o2c`pyAu();8mLlLlvX27bO?^}j{m`?$i(a>42+)^kF7o4F(Rf3F6 z@n$r!KWFG;1R%MgsWrWw6?{SmnG=Q zleA-kCRLtj*YyU~qwplIaN!?(7!@+#P(BJLQA^yTIPP%R&sUE!9~EfXra6?zm`S7F zaL*dvbvNp6n}erf>hliT`>J(tQk~S>V*Vtp?dht2ws+zrj$QTeDI947tB(fypl3Za zwjX(W=VH_baIygI-)jn$@sMdFhuADW31Em#-gM(4E+y9>v&tlW#9a@!|A4-Nl4dOT z8JZDe`d;xXZ@s(^>?@=ui0dtqclGLAJ9rnzCBHjDTF=R_F5y^18dk08PtI|hZugRs zlBGR^b-gqoaS(@#I2l7vP2@o5#yK9B5)!tLmEf>^Z9 zwU%khu3SbHNI665OBz3K@E%}@$i1heUV`-|I(^^qeFaB2gM&Y8no9So(fg;0IrQediDN1FAAkC~Fuwm3IDu&c|ng-T{^At@6G zo35a=;C>Twr#ST{pn7}tX5U;_x<-kLv<+r0MRqqQcakwDT`ITZ%gt9hzm3;ShyB}m z*~#bKdFLyIo1>wEOO)(deB`MVse2%lP@AClP{RRtyOU41T7EjpZ_U={C&tl{gk@3* zipL;f2oD*ghr%;b`hXLwNwBB3~#a`5)GjXV)RA?}{7pVQ>sL$H#-;90bleIrq*dL@Bb05NS!- zCi2k*RPZH;pg&ln^Bxi>HQqRC@^St=<$d5|ETr6rn~c1qppEsfQU`!A;tjkx2lIDabFih10N|EK&d=kV zDy3{j02S-jX}#a|yN(vh2_`*gW&@nAiv<-2m6s9=d|lnJ-bTIuHzD9V1G2v~=)TaK z^%a^#o3Xk22*pXS#gqf=ypI`5kE8?#G(aninTQgU_Bxj%J50E6kQy8-<=_FYN=NCiWArY@FzE}B%J!UK`7eB*-7s=e*Pv+K0POeZo@9(p+>`k1E()d5S}C^ z3-q0j4XnHU8FFC4dBF4Wnn%oBf%bwAYk`{p2Lg0PqIcK>mL_5!f(logEpi%t-`DF} zC+H4s0+u!P5{M!UgDX-r(QrR8D#Gq<`>gWxtjcNOGt*#QnXdp9b>NfYHlELbd-W8< zPH|GFo;oN^gj^F*THvu_)qT7B!DoN=^`mq!SQwr+c3QnLwALdoz*)Kq5HiJ*dX+xF zBtddzDMAO5Vvmg@*9ZBM>VzLt!5NAa2OfN#jKPyYVk7W@)l3nYr*D(m0g!iKL*PuA1N1ps5}T^~YytPk1?fQQb-A9e-B z-p@b)!`dBJ?e;`XVY8I9v4OQw*l=%D^_p}tlX;EhTlt!_)j?O-SQCy1j3cl8KgG8O zj>R@`CnUE^e}`-Rsj`xmhzsM`nD%ymq%VzrC4ev7b=U24U9XyisE&+d-I4}|ZG-0_ zAOiZ`N1F^;F-rhEre5{ME&1m*!aKuAf63=6a`zt8&6FC?V{J^bnfJ($&r}gSAS#D( z6Dy23S@#{bfe~`={w=>=eRLE749`0sIeP5&koGLI5i^GGAW2Y?o@G&?ibXa^=kVpC48{`3*U6>vd{K_iFa* zndb-3Va-F4ajVW)4O}O@Qp^*j-JUwdUhj{h@Hn)o%ES8wJH-QH=6Vq_LKvH z-#~K`D7|E`02(-{flg=%GU!U##;o(&qwC7X?A*xtm*pQQI{?Quoq;q9+u9rwxFU_^|Z?XA0n&e>k?tS}H~6+*h9t zpUi~YHBwZbk$PP`oLHbwR*KM3TJ9w7gjkFm%KtH$t5o(&LK$5QiNzukRIz#Y^R9PDTf`cSQhCR2MFr(c|W( zMF`;G>_XR%4%eS}Ab^Ln^Y7|!C#PCW`-2h<9GrHWJv`~sO5{MVJ+E)W@OGXw2O=pI znxKMWQsuOH@j28tmjG%9NO4G|lOsOM8;qLZ=-L109bfUJ7bQd?B=3Oot z)1oG|juNn3k}6k@Kl9opBu*rsu{bH^RG&wKmx(s;RJHk?ZSZW_KiDh0uh?8IFZ)0& z>n_~32CKoSfg4!(1Wk6_^ZmhI3oo0S-uRuZ?`(;#hZ4(wWStxQbPpIVbS|+te!%ca0FVX=3W^%F&lEsok z=MUR}7KX7DWrZGQ*nosU-W*HcmR#v~(_>-i)4|w7tOhFqKuqpWk5ob@BVgx+56Le+ zpH%Ce|3r2yUh`Z!x>4`-Vm08NOlbhm12aIZ)j?qL|DQ+3J*3Fk13Mt=#s=x&inCcy z-qBSnP5kN%$X_`l@MYyl!J**5FsGp&o;0%}anQv9hdjU5UibckyB~?1xdtO*VC;QDCbT(a8bR4fURe#NmB3ddp@+qX93td{6VjK{ zHc5x^bad#A<bVmS#n{7W`ZdSFmF9LYe?B-TuXHPmeL;!q- zZfy6uR*!Xi5Wpk5>sq#qTJS6d0SxO_O$&U~@b*s#;3<$5`j0X5F@ZC4~$hd^U?IQik4V~NdH%{v$T>(jmgLScRmmL;dEWYKw zY|KH*B~79VOu&LA`@2<9P_+Q6+L@H+gO3Esd49x(6Ao%{OxK=TR3NMn2_-V{rPoL( z@Awe~(L%R5P$$FtV7O2nHgqA&l?zG%SP?rvdtjR(6PT3+S1}Zh$E0e&|084YpMscq z0jDa(c>E=`Mjj4tHkxyGLajPRDVa$EmA9pGJ2gx|(&c*~`-^ z3F6|1 zxkT2x5s8NRxJU*LWKw>gnG>o9<2B^K3!JGJU%D?vUC|d7GFg`Jg*}r=FA0J3Yb8ZG zuodY;_Mn0Ke^7k5DLRstupa@p*BGHV z4L(^4)oO5QCb=?8p)R4^g`IGc>;&5~B-5E^6%G{rYPaO^1sq-s)Au*A3w|8vF94oZ zC^|EF)P#v=1dzj?wJ5^({;>MJ1yIa@!qjuIcHe^pu!92?8x`;PAacg|Eyw)y2G$K4 zZxkF<=Yy|x!XfkR(HjDw$`@R!ohN?nvy`qEqJ_``fXM3 z{c8f?bFegk@$7od#(%zDdW{^IDqavWX3X)5lPLh(hTiabSGeznxOcGqO3Eeixb`gV z(49Mi@1P8vF;n{VzQ3A(7?%tyow;)5|Q0l&FWH@G%b?7E@viwG?SpN(yBMP?#Xy7yz}{ z%=u-lG7h5E^DEBy29oeUFN-dl1!{@e-jiNi{9MPr;C)p$pEwd?!s2{Z0iz*9hVp2B3<_0jo~(2 z9#@|HnP9cXrd9RLE$R@3$T5#{qt%`kwCe0k0IiUfbzT%dmROqrlE7C)UTgj&EuI5d zA-En=@*E+w3w{BJtCnBO@~U$$l&)nhdHkjPggCv$^UB3EscYH(D}c!dEF~OH%3jHp zW5UVgW;HVSVGFU?MHM~Z-X4*_ytdiuhBNSuGPBP$mNJ{|M*+m%?tO2`tSsd(&^yC7 z7~$}W^Ez(vR9SG)Fa6*4*?on#VjM>aay?+j_dEj$v2QF=$jl+FfHTBbh*~- zR0Th{N|E6K?_a1R!9|`aISCn_Vlp5}wM`>u*7l?8?O5x0lQ>hB;Z}>=7&b2Jt}<{& zgg*+;!>K$uw_}#B6)LhvvGUwu@HsIvw=;#@V5}3q;cB1WVqWmXYh$U6&X-EJ#(`(4%)S)d1pz~)++W%#PW4lgp0A@R+=STW2VL%XsBQ0b

m0 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 W(vlmbxspfH;aoZLWz$JLKKFm=2q`B3 From 3ef0479d76b51f43b984f4949e5281e03e8290af Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 25 Aug 2024 09:12:55 +0200 Subject: [PATCH 23/33] LandAbility: skip if already in Battlefield --- .../src/main/java/forge/game/spellability/LandAbility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/spellability/LandAbility.java b/forge-game/src/main/java/forge/game/spellability/LandAbility.java index f58c58b8337..588c06cc809 100644 --- a/forge-game/src/main/java/forge/game/spellability/LandAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/LandAbility.java @@ -54,7 +54,7 @@ public class LandAbility extends AbilityStatic { public boolean canPlay() { Card land = this.getHostCard(); final Player p = this.getActivatingPlayer(); - if (p == null) { + if (p == null || land.isInZone(ZoneType.Battlefield)) { return false; } if (this.getCardState() != null && land.getCurrentStateName() != this.getCardStateName()) { From c3a2e671308368cb4d5f4bbaab7c7455f5cb9595 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 25 Aug 2024 10:44:15 +0200 Subject: [PATCH 24/33] CopyPermanentEffect: use DefinedName for special copies (#5988) * CopyPermanentEffect: use DefinedName for special copies --- .../src/main/java/forge/card/CardRarity.java | 2 +- .../src/main/java/forge/item/PaperToken.java | 2 +- .../main/java/forge/game/CardTraitBase.java | 2 +- .../ability/effects/CopyPermanentEffect.java | 164 ++++++++++-------- .../res/cardsfolder/d/disa_the_restless.txt | 2 +- .../res/cardsfolder/p/peacekeeper_avatar.txt | 2 +- .../r/ral_and_the_implicit_maze.txt | 2 +- .../res/cardsfolder/t/tarmogoyf_nest.txt | 2 +- .../res/tokenscripts/spellgorger_weird.txt | 7 - forge-gui/res/tokenscripts/tarmogoyf.txt | 8 - 10 files changed, 99 insertions(+), 94 deletions(-) delete mode 100644 forge-gui/res/tokenscripts/spellgorger_weird.txt delete mode 100644 forge-gui/res/tokenscripts/tarmogoyf.txt diff --git a/forge-core/src/main/java/forge/card/CardRarity.java b/forge-core/src/main/java/forge/card/CardRarity.java index cad70efa046..c6663162bf3 100644 --- a/forge-core/src/main/java/forge/card/CardRarity.java +++ b/forge-core/src/main/java/forge/card/CardRarity.java @@ -24,7 +24,7 @@ public enum CardRarity { Rare("R", "Rare"), MythicRare("M", "Mythic Rare"), Special("S", "Special"), // Timeshifted - None("N", "None"), // Tokens + Token("T", "Token"), // Tokens Unknown("?", "Unknown"); // In development public static final CardRarity[] FILTER_OPTIONS = new CardRarity[] { diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index 91b900591f8..c13b0435880 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -169,7 +169,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { @Override public CardRarity getRarity() { - return CardRarity.None; + return CardRarity.Token; } @Override diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 4c33fc82c94..c01f1c7c0d9 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -64,7 +64,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, * Keys that should not changed */ private static final ImmutableList noChangeKeys = ImmutableList.builder() - .add("TokenScript", "TokenImage", "NewName", "ChooseFromList") + .add("TokenScript", "TokenImage", "NewName" , "DefinedName", "ChooseFromList") .add("AddAbility").build(); /** diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 23376bfa6b4..2e3aff67e86 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -13,7 +13,9 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.ImageKeys; import forge.StaticData; +import forge.card.CardRarity; import forge.card.CardRulesPredicates; import forge.card.CardStateName; import forge.game.Game; @@ -46,53 +48,59 @@ public class CopyPermanentEffect extends TokenEffectBase { final StringBuilder sb = new StringBuilder(); final Player activator = sa.getActivatingPlayer(); - final List tgtCards = getTargetCards(sa); - boolean justOne = tgtCards.size() == 1; - boolean addKWs = sa.hasParam("AddKeywords"); final int numCopies = sa.hasParam("NumCopies") ? AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCopies"), sa) : 1; - sb.append(activator).append(" creates ").append(Lang.nounWithNumeralExceptOne(numCopies, "token")); - sb.append(numCopies == 1 ? " that's a copy" : " that are copies").append(" of "); - sb.append(Lang.joinHomogenous(tgtCards)); - - if (addKWs) { - final List keywords = Lists.newArrayList(); - keywords.addAll(Arrays.asList(sa.getParam("AddKeywords").split(" & "))); - if (sa.getDescription().contains("except")) { - sb.append(", except ").append(justOne ? "it has " : "they have "); - } else { - sb.append(". ").append(justOne ? "It gains " : "They gain "); - } - sb.append(Lang.joinHomogenous(keywords).toLowerCase()); - } - - if (sa.hasParam("AddTriggers")) { - final String oDesc = sa.getDescription(); - final String trigStg = oDesc.contains("\"") ? - oDesc.substring(oDesc.indexOf("\""),oDesc.lastIndexOf("\"") + 1) : - "[trigger text parsing error]"; - if (addKWs) { - sb.append(" and ").append(trigStg); - } else { - sb.append(". ").append(justOne ? "It gains " : "They gain ").append(trigStg); - } + sb.append(activator).append(" creates "); + if (sa.hasParam("DefinedName")) { + sb.append(Lang.nounWithNumeralExceptOne(numCopies, sa.getParam("DefinedName") + " token")); } else { - sb.append("."); - } + final List tgtCards = getTargetCards(sa); + boolean justOne = tgtCards.size() == 1; + boolean addKWs = sa.hasParam("AddKeywords"); - if (sa.hasParam("AtEOT")) { - String atEOT = sa.getParam("AtEOT"); - String verb = "Sacrifice "; - if (atEOT.startsWith("Exile")) { - verb = "Exile "; + sb.append(Lang.nounWithNumeralExceptOne(numCopies, "token")); + sb.append(numCopies == 1 ? " that's a copy" : " that are copies").append(" of "); + sb.append(Lang.joinHomogenous(tgtCards)); + + if (addKWs) { + final List keywords = Lists.newArrayList(); + keywords.addAll(Arrays.asList(sa.getParam("AddKeywords").split(" & "))); + if (sa.getDescription().contains("except")) { + sb.append(", except ").append(justOne ? "it has " : "they have "); + } else { + sb.append(". ").append(justOne ? "It gains " : "They gain "); + } + sb.append(Lang.joinHomogenous(keywords).toLowerCase()); } - sb.append(" ").append(verb).append(justOne ? "it " : "them ").append("at "); - String when = "the beginning of the next end step."; - if (atEOT.endsWith("Combat")) { - when = "end of combat."; + + if (sa.hasParam("AddTriggers")) { + final String oDesc = sa.getDescription(); + final String trigStg = oDesc.contains("\"") ? + oDesc.substring(oDesc.indexOf("\""),oDesc.lastIndexOf("\"") + 1) : + "[trigger text parsing error]"; + if (addKWs) { + sb.append(" and ").append(trigStg); + } else { + sb.append(". ").append(justOne ? "It gains " : "They gain ").append(trigStg); + } + } else { + sb.append("."); + } + + if (sa.hasParam("AtEOT")) { + String atEOT = sa.getParam("AtEOT"); + String verb = "Sacrifice "; + if (atEOT.startsWith("Exile")) { + verb = "Exile "; + } + sb.append(" ").append(verb).append(justOne ? "it " : "them ").append("at "); + String when = "the beginning of the next end step."; + if (atEOT.endsWith("Combat")) { + when = "end of combat."; + } + sb.append(when); } - sb.append(when); } return sb.toString(); @@ -180,20 +188,21 @@ public class CopyPermanentEffect extends TokenEffectBase { tgtCards = choice; System.err.println("Copying random permanent(s): " + tgtCards.toString()); - } else if (sa.hasParam("DefinedName")) { - String name = sa.getParam("DefinedName"); - if (name.equals("NamedCard")) { - if (!host.getNamedCard().isEmpty()) { - name = host.getNamedCard(); - } + } + } else if (sa.hasParam("DefinedName")) { + List cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); + String name = sa.getParam("DefinedName"); + if (name.equals("NamedCard")) { + if (!host.getNamedCard().isEmpty()) { + name = host.getNamedCard(); } + } - Predicate cpp = Predicates.compose(CardRulesPredicates.name(StringOp.EQUALS, name), PaperCard::getRules); - cards = Lists.newArrayList(Iterables.filter(cards, cpp)); + Predicate cpp = Predicates.compose(CardRulesPredicates.name(StringOp.EQUALS, name), PaperCard::getRules); + cards = Lists.newArrayList(Iterables.filter(cards, cpp)); - if (!cards.isEmpty()) { - tgtCards.add(Card.fromPaperCard(cards.get(0), controller)); - } + if (!cards.isEmpty()) { + tgtCards.add(Card.fromPaperCard(cards.get(0), controller)); } } else if (sa.hasParam("Choices")) { Player chooser = activator; @@ -272,31 +281,42 @@ public class CopyPermanentEffect extends TokenEffectBase { } public static Card getProtoType(final SpellAbility sa, final Card original, final Player newOwner) { - final Card host = sa.getHostCard(); - int id = newOwner == null ? 0 : newOwner.getGame().nextCardId(); - // need to create a physical card first, i need the original card faces - final Card copy = CardFactory.getCard(original.getPaperCard(), newOwner, id, host.getGame()); + final Card copy; + if (sa.hasParam("DefinedName")) { + copy = original; + String name = TextUtil.fastReplace(TextUtil.fastReplace(original.getName(), ",", ""), " ", "_").toLowerCase(); + String set = sa.getOriginalHost().getSetCode(); + copy.getCurrentState().setRarity(CardRarity.Token); + copy.getCurrentState().setSetCode(set); + copy.getCurrentState().setImageKey(ImageKeys.getTokenKey(name + "_" + set.toLowerCase())); + } else { + final Card host = sa.getHostCard(); - copy.setTokenSpawningAbility(sa); - if (original.isTransformable()) { - // 707.8a If an effect creates a token that is a copy of a transforming permanent or a transforming double-faced card not on the battlefield, - // the resulting token is a transforming token that has both a front face and a back face. - // The characteristics of each face are determined by the copiable values of the same face of the permanent it is a copy of, as modified by any other copy effects that apply to that permanent. - // If the token is a copy of a transforming permanent with its back face up, the token enters the battlefield with its back face up. - // This rule does not apply to tokens that are created with their own set of characteristics and enter the battlefield as a copy of a transforming permanent due to a replacement effect. - copy.setBackSide(original.isBackSide()); - if (original.isTransformed()) { - copy.incrementTransformedTimestamp(); + int id = newOwner == null ? 0 : newOwner.getGame().nextCardId(); + // need to create a physical card first, i need the original card faces + copy = CardFactory.getCard(original.getPaperCard(), newOwner, id, host.getGame()); + if (original.isTransformable()) { + // 707.8a If an effect creates a token that is a copy of a transforming permanent or a transforming double-faced card not on the battlefield, + // the resulting token is a transforming token that has both a front face and a back face. + // The characteristics of each face are determined by the copiable values of the same face of the permanent it is a copy of, as modified by any other copy effects that apply to that permanent. + // If the token is a copy of a transforming permanent with its back face up, the token enters the battlefield with its back face up. + // This rule does not apply to tokens that are created with their own set of characteristics and enter the battlefield as a copy of a transforming permanent due to a replacement effect. + copy.setBackSide(original.isBackSide()); + if (original.isTransformed()) { + copy.incrementTransformedTimestamp(); + } + } + + copy.setStates(CardFactory.getCloneStates(original, copy, sa)); + // force update the now set State + if (original.isTransformable()) { + copy.setState(original.isTransformed() ? CardStateName.Transformed : CardStateName.Original, true, true); + } else { + copy.setState(copy.getCurrentStateName(), true, true); } } - copy.setStates(CardFactory.getCloneStates(original, copy, sa)); - // force update the now set State - if (original.isTransformable()) { - copy.setState(original.isTransformed() ? CardStateName.Transformed : CardStateName.Original, true, true); - } else { - copy.setState(copy.getCurrentStateName(), true, true); - } + copy.setTokenSpawningAbility(sa); copy.setGamePieceType(GamePieceType.TOKEN); return copy; diff --git a/forge-gui/res/cardsfolder/d/disa_the_restless.txt b/forge-gui/res/cardsfolder/d/disa_the_restless.txt index 32d89bc2f32..e6bf5818472 100644 --- a/forge-gui/res/cardsfolder/d/disa_the_restless.txt +++ b/forge-gui/res/cardsfolder/d/disa_the_restless.txt @@ -5,7 +5,7 @@ PT:5/6 T:Mode$ ChangesZone | ValidCard$ Permanent.Lhurgoyf+YouOwn | Origin$ Library,Hand,Exile,Command,Stack | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ Whenever a Lhurgoyf permanent card is put into your graveyard from anywhere other than the battlefield, put it onto the battlefield. SVar:TrigChangeZone:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield T:Mode$ DamageDoneOnce | ValidSource$ Creature.YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigToken | TriggerDescription$ Whenever one or more creatures you control deal combat damage to a player, create a Tarmogoyf token. (It's a {1}{G} Lhurgoyf creature with "Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1.") -SVar:TrigToken:DB$ Token | TokenScript$ tarmogoyf +SVar:TrigToken:DB$ CopyPermanent | DefinedName$ Tarmogoyf DeckNeeds:Type$Lhurgoyf DeckHas:Ability$Token & Type$Lhurgoyf DeckHints:Ability$Mill diff --git a/forge-gui/res/cardsfolder/p/peacekeeper_avatar.txt b/forge-gui/res/cardsfolder/p/peacekeeper_avatar.txt index fe610d9520b..de9ddc26d4c 100644 --- a/forge-gui/res/cardsfolder/p/peacekeeper_avatar.txt +++ b/forge-gui/res/cardsfolder/p/peacekeeper_avatar.txt @@ -4,5 +4,5 @@ Types:Vanguard HandLifeModifier:+0/+9 A:AB$ RepeatEach | Cost$ 3 | ActivationZone$ Command | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ ArrestEach | StackDescription$ SpellDescription | SpellDescription$ For each opponent who controls a creature, create a token that's a copy of a card named Arrest and attach it to a creature that player controls chosen at random. SVar:ArrestEach:DB$ ChooseCard | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | AtRandom$ True | SubAbility$ DBAttach -SVar:DBAttach:DB$ CopyPermanent | NumCopies$ 1 | ValidSupportedCopy$ Card.namedArrest | DefinedName$ Arrest | AttachAfter$ True | AttachedTo$ ChosenCard | ConditionDefined$ ChosenCard | ConditionPresent$ Creature | ConditionCompare$ GE1 +SVar:DBAttach:DB$ CopyPermanent | NumCopies$ 1 | DefinedName$ Arrest | AttachAfter$ True | AttachedTo$ ChosenCard | ConditionDefined$ ChosenCard | ConditionPresent$ Creature | ConditionCompare$ GE1 Oracle:Hand +0, life +9\n{3}: For each opponent who controls a creature, create a token that's a copy of a card named Arrest and attach it to a creature that player controls chosen at random. diff --git a/forge-gui/res/cardsfolder/r/ral_and_the_implicit_maze.txt b/forge-gui/res/cardsfolder/r/ral_and_the_implicit_maze.txt index 618c46c6a6b..ff178e89f71 100644 --- a/forge-gui/res/cardsfolder/r/ral_and_the_implicit_maze.txt +++ b/forge-gui/res/cardsfolder/r/ral_and_the_implicit_maze.txt @@ -7,7 +7,7 @@ SVar:DBImpulseDraw:AB$ Dig | Cost$ Discard<1/Card> | Defined$ You | DigNum$ 2 | SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ STPlay | SubAbility$ DBCleanup | ForgetOnMoved$ Exile | Duration$ UntilTheEndOfYourNextTurn SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play them until the end of your next turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ spellgorger_weird | TokenOwner$ You | SpellDescription$ Create a Spellgorger Weird token. (It's a {2}{R} 2/2 Weird creature with "Whenever you cast a noncreature spell, put a +1/+1 counter on Spellgorger Weird.") +SVar:DBToken:DB$ CopyPermanent | DefinedName$ Spellgorger Weird | SpellDescription$ Create a Spellgorger Weird token. (It's a {2}{R} 2/2 Weird creature with "Whenever you cast a noncreature spell, put a +1/+1 counter on Spellgorger Weird.") SVar:BuffedBy:nonCreature DeckHas:Ability$Counters Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Ral and the Implicit Maze deals 2 damage to each creature and planeswalker your opponents control.\nII — You may discard a card. If you do, exile the top two cards of your library. You may play them until the end of your next turn.\nIII — Create a Spellgorger Weird token. (It's a {2}{R} 2/2 Weird creature with "Whenever you cast a noncreature spell, put a +1/+1 counter on Spellgorger Weird.") diff --git a/forge-gui/res/cardsfolder/t/tarmogoyf_nest.txt b/forge-gui/res/cardsfolder/t/tarmogoyf_nest.txt index 58947bb0f0c..aa6a645b1f6 100644 --- a/forge-gui/res/cardsfolder/t/tarmogoyf_nest.txt +++ b/forge-gui/res/cardsfolder/t/tarmogoyf_nest.txt @@ -4,6 +4,6 @@ Types:Kindred Enchantment Lhurgoyf Aura K:Enchant land A:SP$ Attach | Cost$ 2 G | ValidTgts$ Land | AILogic$ Pump S:Mode$ Continuous | Affected$ Land.AttachedBy | AddAbility$ Token | Description$ Enchanted land has "{T}: Create a Tarmogoyf token. (It's a {1}{G} Lhurgoyf creature with "Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1.") -SVar:Token:AB$ Token | Cost$ 1 G T | TokenAmount$ 1 | TokenScript$ tarmogoyf | TokenOwner$ You | SpellDescription$ Create a Tarmogoyf token. (It's a {1}{G} Lhurgoyf creature with "Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1.") +SVar:Token:AB$ CopyPermanent | Cost$ 1 G T | DefinedName$ Tarmogoyf | SpellDescription$ Create a Tarmogoyf token. (It's a {1}{G} Lhurgoyf creature with "Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1.") DeckHas:Ability$Token & Type$Lhurgoyf Oracle:Enchant land\nEnchanted land has "{1}{G}, {T}: Create a Tarmogoyf token. (It's a {1}{G} Lhurgoyf creature with "Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1.") diff --git a/forge-gui/res/tokenscripts/spellgorger_weird.txt b/forge-gui/res/tokenscripts/spellgorger_weird.txt deleted file mode 100644 index d758cb137c3..00000000000 --- a/forge-gui/res/tokenscripts/spellgorger_weird.txt +++ /dev/null @@ -1,7 +0,0 @@ -Name:Spellgorger Weird -ManaCost:2 R -Types:Creature Weird -PT:2/2 -T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a noncreature spell, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -Oracle:Whenever you cast a noncreature spell, put a +1/+1 counter on Spellgorger Weird. diff --git a/forge-gui/res/tokenscripts/tarmogoyf.txt b/forge-gui/res/tokenscripts/tarmogoyf.txt deleted file mode 100644 index 36625d6adc9..00000000000 --- a/forge-gui/res/tokenscripts/tarmogoyf.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Tarmogoyf -ManaCost:1 G -Types:Creature Lhurgoyf -PT:*/1+* -S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ Y | Description$ CARDNAME's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1. -SVar:X:Count$ValidGraveyard Card$CardTypes -SVar:Y:SVar$X/Plus.1 -Oracle:Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1. From c13396f9843f71ba0f030cd53b7602fbbee7111e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 25 Aug 2024 22:51:15 +0800 Subject: [PATCH 25/33] update GameHUD --- .../adventure/player/AdventurePlayer.java | 27 ++++++++ .../src/forge/adventure/stage/GameHUD.java | 64 +++++++++---------- .../src/forge/adventure/stage/MapStage.java | 39 ++++++++--- forge-gui/res/adventure/common/ui/hud.json | 6 +- .../adventure/common/ui/hud_landscape.json | 6 +- .../res/adventure/common/ui/hud_portrait.json | 6 +- 6 files changed, 99 insertions(+), 49 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 8b179250c95..6f0f774ffc0 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -2,15 +2,20 @@ package forge.adventure.player; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Null; +import com.github.tommyettinger.textra.TextraLabel; import com.google.common.collect.Lists; import forge.Forge; import forge.adventure.data.*; import forge.adventure.pointofintrest.PointOfInterestChanges; import forge.adventure.scene.AdventureDeckEditor; import forge.adventure.scene.DeckEditScene; +import forge.adventure.stage.GameHUD; +import forge.adventure.stage.GameStage; import forge.adventure.stage.MapStage; +import forge.adventure.stage.WorldStage; import forge.adventure.util.*; import forge.adventure.world.WorldSave; import forge.card.ColorSet; @@ -598,6 +603,28 @@ public class AdventurePlayer implements Serializable, SaveFileContent { return HeroListData.getRaces().get(Current.player().heroRace); } + public GameStage getCurrentGameStage() { + if (MapStage.getInstance().isInMap()) + return MapStage.getInstance(); + return WorldStage.getInstance(); + } + public void addStatusMessage(String iconName, String message, Integer itemCount, float x, float y) { + String symbol = itemCount == null || itemCount < 0 ? "" : " +"; + String icon = iconName == null ? "" : "[+" + iconName + "]"; + String count = itemCount == null ? "" : String.valueOf(itemCount); + TextraLabel actor = Controls.newTextraLabel("[%95]" + icon + "[WHITE]" + symbol + count + " " + message); + actor.setPosition(x, y); + actor.addAction(Actions.after( + Actions.sequence( + Actions.parallel( + Actions.moveBy(0f, 5f, 4f), + Actions.fadeIn(2f) + ), + Actions.fadeOut(3f), + Actions.removeActor() + ))); + GameHUD.getInstance().addActor(actor); + } public void addCard(PaperCard card) { cards.add(card); newCards.add(card); diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index db9f695e05d..5090afb5876 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -47,9 +47,9 @@ public class GameHUD extends Stage { static public GameHUD instance; private final GameStage gameStage; private final Image avatar, miniMapPlayer; - private final TextraLabel lifePoints; - private final TextraLabel money; - private final TextraLabel shards; + private final TypingLabel lifePoints; + private final TypingLabel money; + private final TypingLabel shards; private final TextraLabel keys; private final TextraLabel notificationText = Controls.newTextraLabel(""); private final Image miniMap, gamehud, mapborder, avatarborder, blank; @@ -60,7 +60,7 @@ public class GameHUD extends Stage { private final Console console; float TOUCHPAD_SCALE = 70f, referenceX; float opacity = 1f; - private boolean debugMap, updatelife; + private boolean debugMap; private final Dialog dialog; private boolean dialogOnlyInput; @@ -129,8 +129,11 @@ public class GameHUD extends Stage { ui.onButtonPress("exittoworldmap", this::exitToWorldMap); ui.onButtonPress("bookmark", this::bookmark); lifePoints = ui.findActor("lifePoints"); + lifePoints.skipToTheEnd(); shards = ui.findActor("shards"); + shards.skipToTheEnd(); money = ui.findActor("money"); + money.skipToTheEnd(); shards.setText("[%95][+Shards] 0"); money.setText("[%95][+Gold] "); lifePoints.setText("[%95][+Life] 20/20"); @@ -139,11 +142,31 @@ public class GameHUD extends Stage { scrollPane.setPosition(2, 2); scrollPane.setStyle(Controls.getSkin().get("translucent", ScrollPane.ScrollPaneStyle.class)); addActor(scrollPane); - AdventurePlayer.current().onLifeChange(() -> lifePoints.setText("[%95][+Life]" + lifepointsTextColor + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife())); - AdventurePlayer.current().onShardsChange(() -> shards.setText("[%95][+Shards] " + AdventurePlayer.current().getShards())); - AdventurePlayer.current().onEquipmentChanged(this::updateAbility); + AdventurePlayer.current().onLifeChange(() -> { + String effect = "{EMERGE}"; + String heartbeat = ""; + //colored lifepoints + if (Current.player().getLife() >= Current.player().getMaxLife()) { + //color green if max life + lifepointsTextColor = "[GREEN]"; + } else if (Current.player().getLife() <= 5) { + //color red if critical + effect = ""; + heartbeat = "{HEARTBEAT=0.5;0.5}"; + lifepointsTextColor = "{ENDHEARTBEAT}[RED]"; + } + else { + lifepointsTextColor = "[WHITE]"; + } + lifePoints.restart("[%95]" + heartbeat + "[+Life]" + lifepointsTextColor + effect + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()); - WorldSave.getCurrentSave().getPlayer().onGoldChange(() -> money.setText("[%95][+Gold] " + AdventurePlayer.current().getGold())); + }); + AdventurePlayer.current().onShardsChange(() -> { + + shards.restart("[%95][+Shards] {EMERGE}" + AdventurePlayer.current().getShards()); + }); + AdventurePlayer.current().onGoldChange(() -> money.restart("[%95][+Gold] {EMERGE}" + AdventurePlayer.current().getGold())); + AdventurePlayer.current().onEquipmentChanged(this::updateAbility); addActor(ui); addActor(miniMapPlayer); console = new Console(); @@ -268,7 +291,6 @@ public class GameHUD extends Stage { @Override public void draw() { - updatelife = false; int yPos = (int) gameStage.player.getY(); int xPos = (int) gameStage.player.getX(); act(Gdx.graphics.getDeltaTime()); //act the Hud @@ -281,29 +303,7 @@ public class GameHUD extends Stage { !Controls.actorContainsVector(notificationPane, new Vector2(miniMapPlayer.getX(),miniMapPlayer.getY())) && (!Controls.actorContainsVector(console, new Vector2(miniMapPlayer.getX(),miniMapPlayer.getY())) || !console.isVisible())); // prevent drawing on top of console or notifications - //colored lifepoints - if (Current.player().getLife() >= Current.player().getMaxLife()) { - //color green if max life - if (!lifepointsTextColor.equals("[GREEN]")) { - lifepointsTextColor = "[GREEN]"; - updatelife = true; - } - } else if (Current.player().getLife() <= 5) { - //color red if critical - if (!lifepointsTextColor.equals("[RED]")) { - lifepointsTextColor = "[RED]"; - updatelife = true; - } - } else { - if (!lifepointsTextColor.isEmpty()) { - lifepointsTextColor = ""; - updatelife = true; - } - } - if (updatelife) { - updatelife = false; - lifePoints.setText("[%95][+Life]" + lifepointsTextColor + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()); - } + if (!MapStage.getInstance().isInMap()) updateMusic(); else diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index eb71fabadf7..42928ee39f8 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -27,6 +27,7 @@ import com.github.tommyettinger.textra.TypingLabel; import forge.Forge; import forge.adventure.character.*; import forge.adventure.data.*; +import forge.adventure.player.AdventurePlayer; import forge.adventure.pointofintrest.PointOfInterestChanges; import forge.adventure.scene.*; import forge.adventure.util.*; @@ -1026,20 +1027,42 @@ public class MapStage extends GameStage { Gdx.input.vibrate(50); if (Controllers.getCurrent() != null && Controllers.getCurrent().canVibrate()) Controllers.getCurrent().startVibration(100, 1); - startPause(0.1f, () -> { //Switch to item pickup scene. - RewardSprite RS = (RewardSprite) actor; - RewardScene.instance().loadRewards(RS.getRewards(), RewardScene.Type.Loot, null); - RS.remove(); - actors.removeValue(RS, true); - changes.deleteObject(RS.getId()); - Forge.switchScene(RewardScene.instance()); - }); + RewardSprite RS = (RewardSprite) actor; + Array rewards = RS.getRewards(); + + if (rewards.size == 1) { + Reward reward = rewards.get(0); + switch (reward.getType()) { + case Life: + case Shards: + case Gold: + String message = Forge.getLocalizer().getMessageorUseDefault("lbl" + reward.getType().name(), reward.getType().name()); + AdventurePlayer.current().addStatusMessage(reward.getType().name(), message, reward.getCount(), actor.getX(), actor.getY() + player.getHeight()); + AdventurePlayer.current().addReward(reward); + break; + default: + showRewardScene(rewards); + break; + } + } else { + showRewardScene(rewards); + } + RS.remove(); + actors.removeValue(RS, true); + changes.deleteObject(RS.getId()); break; } } } } + private void showRewardScene(Array rewards) { + startPause(0.1f, () -> { + RewardScene.instance().loadRewards(rewards, RewardScene.Type.Loot, null); + Forge.switchScene(RewardScene.instance()); + }); + } + boolean started = false; public void beginDuel(EnemySprite mob) { if (mob == null) return; diff --git a/forge-gui/res/adventure/common/ui/hud.json b/forge-gui/res/adventure/common/ui/hud.json index b1521c98667..8650ab30893 100644 --- a/forge-gui/res/adventure/common/ui/hud.json +++ b/forge-gui/res/adventure/common/ui/hud.json @@ -56,7 +56,7 @@ "y": 10 }, { - "type": "Label", + "type": "TypingLabel", "name": "lifePoints", "font": "default", "width": 64, @@ -65,7 +65,7 @@ "y": 56 }, { - "type": "Label", + "type": "TypingLabel", "name": "shards", "font": "default", "width": 64, @@ -74,7 +74,7 @@ "y": 70 }, { - "type": "Label", + "type": "TypingLabel", "name": "money", "font": "default", "width": 64, diff --git a/forge-gui/res/adventure/common/ui/hud_landscape.json b/forge-gui/res/adventure/common/ui/hud_landscape.json index ece911e40b7..3bf3db4726d 100644 --- a/forge-gui/res/adventure/common/ui/hud_landscape.json +++ b/forge-gui/res/adventure/common/ui/hud_landscape.json @@ -56,7 +56,7 @@ "y": 10 }, { - "type": "Label", + "type": "TypingLabel", "name": "lifePoints", "font": "default", "width": 64, @@ -65,7 +65,7 @@ "y": 56 }, { - "type": "Label", + "type": "TypingLabel", "name": "shards", "font": "default", "width": 64, @@ -74,7 +74,7 @@ "y": 70 }, { - "type": "Label", + "type": "TypingLabel", "name": "money", "font": "default", "width": 64, diff --git a/forge-gui/res/adventure/common/ui/hud_portrait.json b/forge-gui/res/adventure/common/ui/hud_portrait.json index d345e47c81a..c3363b314b3 100644 --- a/forge-gui/res/adventure/common/ui/hud_portrait.json +++ b/forge-gui/res/adventure/common/ui/hud_portrait.json @@ -56,7 +56,7 @@ "y": 10 }, { - "type": "Label", + "type": "TypingLabel", "name": "lifePoints", "width": 48, "height": 3, @@ -64,7 +64,7 @@ "y": 62 }, { - "type": "Label", + "type": "TypingLabel", "name": "shards", "font": "default", "width": 48, @@ -73,7 +73,7 @@ "y": 76 }, { - "type": "Label", + "type": "TypingLabel", "name": "money", "font": "default", "width": 48, From 17ffe17e9dfaf525af27b50edc676499a0fcb4df Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Mon, 26 Aug 2024 05:04:35 +0100 Subject: [PATCH 26/33] MB2: Slumbering Waterways, Temur Elevator, Under-Construction Skyscraper, Wrenn and One (#5980) * Add files via upload * Add files via upload * Add files via upload * Add files via upload --- .../cardsfolder/upcoming/slumbering_waterways.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/temur_elevator.txt | 8 ++++++++ .../upcoming/under_construction_skyscraper.txt | 13 +++++++++++++ .../res/cardsfolder/upcoming/wrenn_and_one.txt | 13 +++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/slumbering_waterways.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/temur_elevator.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/under_construction_skyscraper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wrenn_and_one.txt diff --git a/forge-gui/res/cardsfolder/upcoming/slumbering_waterways.txt b/forge-gui/res/cardsfolder/upcoming/slumbering_waterways.txt new file mode 100644 index 00000000000..3b16468534b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slumbering_waterways.txt @@ -0,0 +1,10 @@ +Name:Slumbering Waterways +ManaCost:no cost +Types:Land +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated | ReplaceWith$ ETBTapped | Description$ CARDNAME enters tapped. +SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True +A:AB$ Mana | Cost$ T | Produced$ Combo G U | SpellDescription$ Add {G} or {U}. +K:Flying +K:Vigilance +K:Trample +Oracle:Slumbering Waterways enters tapped.\n{T}: Add {G} or {U}.\nFlying, vigilance, trample diff --git a/forge-gui/res/cardsfolder/upcoming/temur_elevator.txt b/forge-gui/res/cardsfolder/upcoming/temur_elevator.txt new file mode 100644 index 00000000000..84e9621b34b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/temur_elevator.txt @@ -0,0 +1,8 @@ +Name:Temur Elevator +ManaCost:no cost +Types:Land +K:Ascend +A:AB$ Mana | Cost$ T | Produced$ Combo G U R | SubAbility$ DBLoseLife | SpellDescription$ Add {G}, {U}, or {R}. If you don’t have the city’s blessing, you lose 1 life. +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | Defined$ You +SVar:X:Count$Blessing.0.1 +Oracle:Ascend (If you control ten or more permanents, you get the city’s blessing for the rest of the game.)\n{T}: Add {G}, {U}, or {R}. If you don’t have the city’s blessing, you lose 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/under_construction_skyscraper.txt b/forge-gui/res/cardsfolder/upcoming/under_construction_skyscraper.txt new file mode 100644 index 00000000000..bf36753b000 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/under_construction_skyscraper.txt @@ -0,0 +1,13 @@ +Name:Under-Construction Skyscraper +ManaCost:no cost +Types:Land +K:Level up:1 +SVar:maxLevel:8 +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +DeckHas:Ability$Mana.Colorless +S:Mode$ Continuous | Affected$ Card.Self | AddAbility$ ABManaAbzan | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE7_LEVEL | Description$ LEVEL 1-7 {T}: Add {W}, {B}, {G}, or {C}. +SVar:ABManaAbzan:AB$ Mana | Cost$ T | Produced$ Combo W B G C | SpellDescription$ Add {W}, {B}, {G}, or {C}. +S:Mode$ Continuous | Affected$ Card.Self | AddAbility$ ABManaScry | IsPresent$ Card.Self+counters_GE8_LEVEL | Description$ LEVEL 8+ {T}: Add {W}, {B}, {G}, or {C}. Scry 1. +SVar:ABManaScry:AB$ Mana | Cost$ T | Produced$ Combo W B G C | Subability$ DBScry | SpellDescription$ Add {W}, {B}, {G}, or {C}. Scry 1. +SVar:DBScry:DB$ Scry | ScryNum$ 1 +Oracle:Level up {1} ({1}: Put a level counter on this. Level up only as a sorcery.)\n{T}: Add {C}.\nLEVEL 1-7\n{T}: Add {W}, {B}, {G}, or {C}.\nLEVEL 8+\n{T}: Add {W}, {B}, {G}, or {C}. Scry 1. diff --git a/forge-gui/res/cardsfolder/upcoming/wrenn_and_one.txt b/forge-gui/res/cardsfolder/upcoming/wrenn_and_one.txt new file mode 100644 index 00000000000..2f12f433cc9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wrenn_and_one.txt @@ -0,0 +1,13 @@ +Name:Wrenn and One +ManaCost:no cost +Colors:green +Types:Land Planeswalker Wrenn +Loyalty:1 +A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ Self | Abilities$ ABMana | Duration$ UntilYourNextTurn | StackDescription$ SpellDescription | SpellDescription$ CARDNAME gains "{T}: Add {G}" until your next turn. +SVar:ABMana:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenScript$ g_1_1_squirrel | StackDescription$ REP Create_{p:You} creates | SpellDescription$ Create a 1/1 green Squirrel creature token. +A:AB$ Effect | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem — Wrenn and One | Image$ emblem_wrenn_and_one | Triggers$ TrigCradle | Duration$ Permanent | StackDescription$ REP You get_{p:You} gets | SpellDescription$ You get an emblem with "At the beginning of your precombat main phase, add {G} for each creature you control." +SVar:TrigCradle:Mode$ Phase | Phase$ Main1 | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigMana | TriggerDescription$ At the beginning of your precombat main phase, add {G} for each creature you control. +SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ X | Defined$ You +SVar:X:Count$Valid Creature.YouCtrl +Oracle:[+1]: Wrenn and One gains "{T}: Add {G}" until your next turn.\n[−1]: Create a 1/1 green Squirrel creature token.\n[−4]: You get an emblem with "At the beginning of your precombat main phase, add {G} for each creature you control." From 4a8776a2f793f071699ca04f2a61d57791af8014 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 26 Aug 2024 16:58:45 +0800 Subject: [PATCH 27/33] fix actor placement GameHUD -> currentStage - add hud transluscency via avatar/gamehud double click/tap --- .../adventure/player/AdventurePlayer.java | 24 +++--- .../src/forge/adventure/stage/GameHUD.java | 80 +++++++++++++++---- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 6f0f774ffc0..6a564fd554c 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -12,7 +12,6 @@ import forge.adventure.data.*; import forge.adventure.pointofintrest.PointOfInterestChanges; import forge.adventure.scene.AdventureDeckEditor; import forge.adventure.scene.DeckEditScene; -import forge.adventure.stage.GameHUD; import forge.adventure.stage.GameStage; import forge.adventure.stage.MapStage; import forge.adventure.stage.WorldStage; @@ -614,16 +613,12 @@ public class AdventurePlayer implements Serializable, SaveFileContent { String count = itemCount == null ? "" : String.valueOf(itemCount); TextraLabel actor = Controls.newTextraLabel("[%95]" + icon + "[WHITE]" + symbol + count + " " + message); actor.setPosition(x, y); - actor.addAction(Actions.after( - Actions.sequence( - Actions.parallel( - Actions.moveBy(0f, 5f, 4f), - Actions.fadeIn(2f) - ), - Actions.fadeOut(3f), - Actions.removeActor() - ))); - GameHUD.getInstance().addActor(actor); + actor.addAction(Actions.sequence( + Actions.parallel(Actions.moveBy(0f, 5f, 3f), Actions.fadeIn(2f)), + Actions.hide(), + Actions.removeActor()) + ); + getCurrentGameStage().addActor(actor); } public void addCard(PaperCard card) { cards.add(card); @@ -783,8 +778,11 @@ public class AdventurePlayer implements Serializable, SaveFileContent { } public void setShards(int number) { - shards = number; - onShardsChangeList.emit(); + boolean changed = shards != number; + if (changed) { + shards = number; + onShardsChangeList.emit(); + } } public void addBlessing(EffectData bless) { diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 3d7823fd465..875f22c5f67 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -60,7 +60,7 @@ public class GameHUD extends Stage { private final Console console; float TOUCHPAD_SCALE = 70f, referenceX; float opacity = 1f; - private boolean debugMap; + private boolean debugMap, transluscent; private final Dialog dialog; private boolean dialogOnlyInput; @@ -134,9 +134,9 @@ public class GameHUD extends Stage { shards.skipToTheEnd(); money = ui.findActor("money"); money.skipToTheEnd(); - shards.setText("[%95][+Shards] 0"); - money.setText("[%95][+Gold] "); - lifePoints.setText("[%95][+Life] 20/20"); + shards.setText("[%95][+Shards]"); + money.setText("[%95][+Gold]"); + lifePoints.setText("[%95][+Life]"); keys = Controls.newTextraLabel(""); scrollPane = new ScrollPane(keys); scrollPane.setPosition(2, 2); @@ -144,6 +144,7 @@ public class GameHUD extends Stage { addActor(scrollPane); AdventurePlayer.current().onLifeChange(() -> { String effect = "{EMERGE}"; + String effectEnd = "{ENDEMERGE}"; String heartbeat = ""; //colored lifepoints if (Current.player().getLife() >= Current.player().getMaxLife()) { @@ -152,20 +153,20 @@ public class GameHUD extends Stage { } else if (Current.player().getLife() <= 5) { //color red if critical effect = ""; + effectEnd = ""; heartbeat = "{HEARTBEAT=0.5;0.5}"; lifepointsTextColor = "{ENDHEARTBEAT}[RED]"; } else { lifepointsTextColor = "[WHITE]"; } - lifePoints.restart("[%95]" + heartbeat + "[+Life]" + lifepointsTextColor + effect + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()); - + lifePoints.restart("[%95]" + heartbeat + "[+Life]" + lifepointsTextColor + effect + " " + AdventurePlayer.current().getLife() + effectEnd + "/" + AdventurePlayer.current().getMaxLife()); }); AdventurePlayer.current().onShardsChange(() -> { - shards.restart("[%95][+Shards] {EMERGE}" + AdventurePlayer.current().getShards()); + shards.restart("[%95][+Shards]{EMERGE} " + AdventurePlayer.current().getShards() + "{ENDEMERGE}"); }); - AdventurePlayer.current().onGoldChange(() -> money.restart("[%95][+Gold] {EMERGE}" + AdventurePlayer.current().getGold())); + AdventurePlayer.current().onGoldChange(() -> money.restart("[%95][+Gold]{EMERGE} " + AdventurePlayer.current().getGold() + "{ENDEMERGE}")); AdventurePlayer.current().onEquipmentChanged(this::updateAbility); addActor(ui); addActor(miniMapPlayer); @@ -173,11 +174,9 @@ public class GameHUD extends Stage { console.setBounds(0, GuiBase.isAndroid() ? getHeight() : 0, getWidth(), getHeight() / 2); console.setVisible(false); ui.addActor(console); - if (GuiBase.isAndroid()) { - avatar.addListener(new ConsoleToggleListener()); - avatarborder.addListener(new ConsoleToggleListener()); - gamehud.addListener(new ConsoleToggleListener()); - } + avatar.addListener(new ConsoleToggleListener()); + avatarborder.addListener(new ConsoleToggleListener()); + gamehud.addListener(new ConsoleToggleListener()); WorldSave.getCurrentSave().onLoad(this::enter); eventTouchDown = new InputEvent(); @@ -685,17 +684,18 @@ public class GameHUD extends Stage { } public void showHideMap(boolean visible) { + transluscent = !visible; setVisibility(miniMap, visible); setVisibility(mapborder, visible); setVisibility(openMapActor, visible); setVisibility(miniMapPlayer, visible); - setVisibility(gamehud, visible); + setAlpha(gamehud, visible); setAlpha(lifePoints, visible); setAlpha(shards, visible); setAlpha(money, visible); - setVisibility(blank, visible); + setAlpha(blank, visible); setDisabled(exitToWorldMapActor, !MapStage.getInstance().isInMap(), "[%120][+ExitToWorldMap]", "\uFF0F"); setDisabled(bookmarkActor, !MapStage.getInstance().isInMap(), "[%120][+Bookmark]", "\uFF0F"); setAlpha(avatarborder, visible); @@ -711,6 +711,45 @@ public class GameHUD extends Stage { } opacity = visible ? 1f : 0.4f; } + public void updateHUD(boolean translucent) { + if (translucent) { + setAlpha(lifePoints, false); + setAlpha(shards, false); + setAlpha(money, false); + setAlpha(avatarborder, false); + setAlpha(avatar, false); + setAlpha(deckActor, false); + setAlpha(menuActor, false); + setAlpha(logbookActor, false); + setAlpha(inventoryActor, false); + setAlpha(exitToWorldMapActor, false); + setAlpha(bookmarkActor, false); + setAlpha(gamehud, false); + setAlpha(blank, false); + for (TextraButton button : abilityButtonMap) { + setAlpha(button, false); + } + transluscent = true; + } else { + setAlpha(lifePoints, true); + setAlpha(shards, true); + setAlpha(money, true); + setAlpha(avatarborder, true); + setAlpha(avatar, true); + setAlpha(deckActor, true); + setAlpha(menuActor, true); + setAlpha(logbookActor, true); + setAlpha(inventoryActor, true); + setAlpha(exitToWorldMapActor, true); + setAlpha(bookmarkActor, true); + setAlpha(gamehud, true); + setAlpha(blank, true); + for (TextraButton button : abilityButtonMap) { + setAlpha(button, true); + } + transluscent = false; + } + } void toggleConsole() { console.toggle(); @@ -863,9 +902,18 @@ public class GameHUD extends Stage { @Override public boolean longPress(Actor actor, float x, float y) { - toggleConsole(); + if (GuiBase.isAndroid()) + toggleConsole(); return super.longPress(actor, x, y); } + + @Override + public void tap(InputEvent event, float x, float y, int count, int button) { + if (count > 1 && MapStage.getInstance().isInMap()) + updateHUD(!transluscent); + super.tap(event, x, y, count, button); + } + } public void updateMusic() { From 284a4daf8846abb0400b7f84db93ea1cc2cb8e3c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 26 Aug 2024 17:28:24 +0800 Subject: [PATCH 28/33] update actor groupings --- .../src/forge/adventure/stage/GameHUD.java | 144 +++++++++--------- 1 file changed, 76 insertions(+), 68 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 875f22c5f67..854aee00d70 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -8,10 +8,20 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.scenes.scene2d.*; +import com.badlogic.gdx.scenes.scene2d.Action; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Group; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction; -import com.badlogic.gdx.scenes.scene2d.ui.*; +import com.badlogic.gdx.scenes.scene2d.ui.Button; +import com.badlogic.gdx.scenes.scene2d.ui.Dialog; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.ui.Touchpad; import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; @@ -28,8 +38,19 @@ import forge.adventure.character.CharacterSprite; import forge.adventure.data.AdventureQuestData; import forge.adventure.data.ItemData; import forge.adventure.player.AdventurePlayer; -import forge.adventure.scene.*; -import forge.adventure.util.*; +import forge.adventure.scene.DeckSelectScene; +import forge.adventure.scene.GameScene; +import forge.adventure.scene.InventoryScene; +import forge.adventure.scene.MapViewScene; +import forge.adventure.scene.QuestLogScene; +import forge.adventure.scene.Scene; +import forge.adventure.scene.TileMapScene; +import forge.adventure.util.AdventureQuestController; +import forge.adventure.util.Config; +import forge.adventure.util.Controls; +import forge.adventure.util.Current; +import forge.adventure.util.KeyBinding; +import forge.adventure.util.UIActor; import forge.adventure.world.WorldSave; import forge.deck.Deck; import forge.gui.GuiBase; @@ -70,6 +91,9 @@ public class GameHUD extends Stage { private String lifepointsTextColor = ""; private final ScrollPane scrollPane; private final ScrollPane notificationPane; + private final Group mapGroup = new Group(); + private final Group hudGroup = new Group(); + private final Group menuGroup = new Group(); private GameHUD(GameStage gameStage) { super(new ScalingViewport(Scaling.stretch, Scene.getIntendedWidth(), Scene.getIntendedHeight()), gameStage.getBatch()); @@ -156,16 +180,12 @@ public class GameHUD extends Stage { effectEnd = ""; heartbeat = "{HEARTBEAT=0.5;0.5}"; lifepointsTextColor = "{ENDHEARTBEAT}[RED]"; - } - else { + } else { lifepointsTextColor = "[WHITE]"; } lifePoints.restart("[%95]" + heartbeat + "[+Life]" + lifepointsTextColor + effect + " " + AdventurePlayer.current().getLife() + effectEnd + "/" + AdventurePlayer.current().getMaxLife()); }); - AdventurePlayer.current().onShardsChange(() -> { - - shards.restart("[%95][+Shards]{EMERGE} " + AdventurePlayer.current().getShards() + "{ENDEMERGE}"); - }); + AdventurePlayer.current().onShardsChange(() -> shards.restart("[%95][+Shards]{EMERGE} " + AdventurePlayer.current().getShards() + "{ENDEMERGE}")); AdventurePlayer.current().onGoldChange(() -> money.restart("[%95][+Gold]{EMERGE} " + AdventurePlayer.current().getGold() + "{ENDEMERGE}")); AdventurePlayer.current().onEquipmentChanged(this::updateAbility); addActor(ui); @@ -188,11 +208,34 @@ public class GameHUD extends Stage { notificationPane = new ScrollPane(notificationText); notificationPane.setTouchable(Touchable.childrenOnly); - notificationPane.setBounds(5, GuiBase.isAndroid() ? getHeight() : -notificationText.getPrefHeight(), getWidth()*0.4f, 25); + notificationPane.setBounds(5, GuiBase.isAndroid() ? getHeight() : -notificationText.getPrefHeight(), getWidth() * 0.4f, 25); notificationPane.setStyle(Controls.getSkin().get("paper", ScrollPane.ScrollPaneStyle.class)); notificationPane.getColor().a = 0f; ui.addActor(notificationPane); + //MAP + mapGroup.addActor(miniMap); + mapGroup.addActor(mapborder); + mapGroup.addActor(openMapActor); + mapGroup.addActor(miniMapPlayer); + ui.addActor(mapGroup); + //HUD + hudGroup.addActor(gamehud); + hudGroup.addActor(lifePoints); + hudGroup.addActor(shards); + hudGroup.addActor(money); + hudGroup.addActor(blank); + hudGroup.addActor(avatarborder); + hudGroup.addActor(avatar); + ui.addActor(hudGroup); + //MENU + menuGroup.addActor(deckActor); + menuGroup.addActor(menuActor); + menuGroup.addActor(logbookActor); + menuGroup.addActor(inventoryActor); + menuGroup.addActor(exitToWorldMapActor); + menuGroup.addActor(bookmarkActor); + ui.addActor(menuGroup); } private void openMap() { @@ -299,8 +342,8 @@ public class GameHUD extends Stage { miniMapPlayer.setPosition(miniMap.getX() + xPosMini - miniMapPlayer.getWidth() / 2, miniMap.getY() + yPosMini - miniMapPlayer.getHeight() / 2); miniMapPlayer.setVisible(miniMap.isVisible() && - !Controls.actorContainsVector(notificationPane, new Vector2(miniMapPlayer.getX(),miniMapPlayer.getY())) - && (!Controls.actorContainsVector(console, new Vector2(miniMapPlayer.getX(),miniMapPlayer.getY())) + !Controls.actorContainsVector(notificationPane, new Vector2(miniMapPlayer.getX(), miniMapPlayer.getY())) + && (!Controls.actorContainsVector(console, new Vector2(miniMapPlayer.getX(), miniMapPlayer.getY())) || !console.isVisible())); // prevent drawing on top of console or notifications if (!MapStage.getInstance().isInMap()) @@ -355,7 +398,7 @@ public class GameHUD extends Stage { switch (GameScene.instance().getAdventurePlayerLocation(false, false)) { case "capital": case "town": - if(MapStage.getInstance().isInMap()) { + if (MapStage.getInstance().isInMap()) { int rep = TileMapScene.instance().getPointOfInterestChanges().getMapReputation(); String reputationText = TileMapScene.instance().rootPoint.getDisplayName() + "\nReputation: " + (rep > 0 ? "[GREEN]" : rep < 0 ? "[RED]" : "[WHITE]") + rep + "[/]"; if (fromWorldMap) { @@ -685,65 +728,30 @@ public class GameHUD extends Stage { public void showHideMap(boolean visible) { transluscent = !visible; - setVisibility(miniMap, visible); - setVisibility(mapborder, visible); - setVisibility(openMapActor, visible); - setVisibility(miniMapPlayer, visible); - setAlpha(gamehud, visible); + setVisibility(mapGroup, visible); + setAlpha(hudGroup, visible); + setAlpha(menuGroup, visible); - setAlpha(lifePoints, visible); - setAlpha(shards, visible); - setAlpha(money, visible); - - setAlpha(blank, visible); setDisabled(exitToWorldMapActor, !MapStage.getInstance().isInMap(), "[%120][+ExitToWorldMap]", "\uFF0F"); setDisabled(bookmarkActor, !MapStage.getInstance().isInMap(), "[%120][+Bookmark]", "\uFF0F"); - setAlpha(avatarborder, visible); - setAlpha(avatar, visible); - setAlpha(deckActor, visible); - setAlpha(menuActor, visible); - setAlpha(logbookActor, visible); - setAlpha(inventoryActor, visible); - setAlpha(exitToWorldMapActor, visible); - setAlpha(bookmarkActor, visible); + for (TextraButton button : abilityButtonMap) { setAlpha(button, visible); } opacity = visible ? 1f : 0.4f; } - public void updateHUD(boolean translucent) { + + public void setHUDOpacity(boolean translucent) { if (translucent) { - setAlpha(lifePoints, false); - setAlpha(shards, false); - setAlpha(money, false); - setAlpha(avatarborder, false); - setAlpha(avatar, false); - setAlpha(deckActor, false); - setAlpha(menuActor, false); - setAlpha(logbookActor, false); - setAlpha(inventoryActor, false); - setAlpha(exitToWorldMapActor, false); - setAlpha(bookmarkActor, false); - setAlpha(gamehud, false); - setAlpha(blank, false); + setAlpha(hudGroup, false); + setAlpha(menuGroup, false); for (TextraButton button : abilityButtonMap) { setAlpha(button, false); } transluscent = true; } else { - setAlpha(lifePoints, true); - setAlpha(shards, true); - setAlpha(money, true); - setAlpha(avatarborder, true); - setAlpha(avatar, true); - setAlpha(deckActor, true); - setAlpha(menuActor, true); - setAlpha(logbookActor, true); - setAlpha(inventoryActor, true); - setAlpha(exitToWorldMapActor, true); - setAlpha(bookmarkActor, true); - setAlpha(gamehud, true); - setAlpha(blank, true); + setAlpha(hudGroup, true); + setAlpha(menuGroup, true); for (TextraButton button : abilityButtonMap) { setAlpha(button, true); } @@ -910,7 +918,7 @@ public class GameHUD extends Stage { @Override public void tap(InputEvent event, float x, float y, int count, int button) { if (count > 1 && MapStage.getInstance().isInMap()) - updateHUD(!transluscent); + setHUDOpacity(!transluscent); super.tap(event, x, y, count, button); } @@ -977,13 +985,13 @@ public class GameHUD extends Stage { notificationText.setWrap(false); notificationText.setText(text); notificationText.setColor(Color.BLACK); - notificationText.setWidth(Math.min(notificationText.getPrefWidth(), Forge.isLandscapeMode()?getWidth() * 0.25f : getWidth() - 25)); + notificationText.setWidth(Math.min(notificationText.getPrefWidth(), Forge.isLandscapeMode() ? getWidth() * 0.25f : getWidth() - 25)); notificationText.setWrap(true); notificationText.layout(); notificationPane.setSize(notificationText.getWidth() + 10, notificationText.getPrefHeight() + 20); - notificationPane.setPosition(5, Forge.isLandscapeMode()? -notificationPane.getHeight(): getHeight()); + notificationPane.setPosition(5, Forge.isLandscapeMode() ? -notificationPane.getHeight() : getHeight()); notificationPane.getColor().a = 1f; notificationPane.layout(); @@ -998,22 +1006,22 @@ public class GameHUD extends Stage { newNotification = Actions.after(Actions.sequence(preconfigureNotification, Actions.moveTo(5, 0, 2f), Actions.delay(10f), - Actions.alpha(0f,3f), - Actions.sizeTo(0,0))); + Actions.alpha(0f, 3f), + Actions.sizeTo(0, 0))); } else { newNotification = Actions.after(Actions.sequence(preconfigureNotification, Actions.moveToAligned(5, getHeight(), Align.topLeft, 2f), Actions.delay(10f), - Actions.alpha(0f,3f), - Actions.sizeTo(0,0))); + Actions.alpha(0f, 3f), + Actions.sizeTo(0, 0))); } notificationPane.addAction(newNotification); } - public void clearNotifications(){ + public void clearNotifications() { notificationText.setText(""); - notificationPane.setBounds(5, Forge.isLandscapeMode() ? -notificationText.getPrefHeight() : getHeight(), getWidth()*0.4f, 25); + notificationPane.setBounds(5, Forge.isLandscapeMode() ? -notificationText.getPrefHeight() : getHeight(), getWidth() * 0.4f, 25); notificationPane.setStyle(Controls.getSkin().get("paper", ScrollPane.ScrollPaneStyle.class)); notificationPane.getColor().a = 0f; } From c212c41a30197fc5851b741b545a10cf29fecf23 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 26 Aug 2024 20:00:17 +0800 Subject: [PATCH 29/33] update avatar listener single tap/click set translucency, double tap/click set hud visibility --- .../forge/adventure/scene/InventoryScene.java | 2 +- .../src/forge/adventure/stage/GameHUD.java | 53 ++++++++++++++----- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java index 2f4ecc78bf6..442081fa5c1 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java @@ -161,7 +161,7 @@ public class InventoryScene extends UIScene { ConsoleCommandInterpreter.getInstance().command(data.commandOnUse); if (data.dialogOnUse != null && data.dialogOnUse.text != null && !data.dialogOnUse.text.isEmpty()) { MapDialog dialog = new MapDialog(data.dialogOnUse, MapStage.getInstance(),0,null); - MapStage.instance.showDialog(); + MapStage.getInstance().showDialog(); dialog.activate(); ChangeListener listen = new ChangeListener() { @Override diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 854aee00d70..0b4200c2ada 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -81,7 +81,7 @@ public class GameHUD extends Stage { private final Console console; float TOUCHPAD_SCALE = 70f, referenceX; float opacity = 1f; - private boolean debugMap, transluscent; + private boolean debugMap, transluscent, hidden; private final Dialog dialog; private boolean dialogOnlyInput; @@ -94,6 +94,7 @@ public class GameHUD extends Stage { private final Group mapGroup = new Group(); private final Group hudGroup = new Group(); private final Group menuGroup = new Group(); + private final Group avatarGroup = new Group(); private GameHUD(GameStage gameStage) { super(new ScalingViewport(Scaling.stretch, Scene.getIntendedWidth(), Scene.getIntendedHeight()), gameStage.getBatch()); @@ -225,8 +226,6 @@ public class GameHUD extends Stage { hudGroup.addActor(shards); hudGroup.addActor(money); hudGroup.addActor(blank); - hudGroup.addActor(avatarborder); - hudGroup.addActor(avatar); ui.addActor(hudGroup); //MENU menuGroup.addActor(deckActor); @@ -236,6 +235,10 @@ public class GameHUD extends Stage { menuGroup.addActor(exitToWorldMapActor); menuGroup.addActor(bookmarkActor); ui.addActor(menuGroup); + //AVATAR + avatarGroup.addActor(avatar); + avatarGroup.addActor(avatarborder); + ui.addActor(avatarGroup); } private void openMap() { @@ -447,6 +450,7 @@ public class GameHUD extends Stage { } if (MapStage.getInstance().isInMap()) updateBookmarkActor(MapStage.getInstance().getChanges().isBookmarked()); + avatarGroup.setZIndex(ui.getChildren().size); } void clearAbility() { @@ -705,11 +709,6 @@ public class GameHUD extends Stage { gameStage.openMenu(); } - private void setVisibility(Actor actor, boolean visible) { - if (actor != null) - actor.setVisible(visible); - } - private void setDisabled(Actor actor, boolean value, String enabled, String disabled) { if (actor instanceof TextraButton) { ((TextraButton) actor).setDisabled(value); @@ -720,17 +719,18 @@ public class GameHUD extends Stage { private void setAlpha(Actor actor, boolean visible) { if (actor != null) { if (visible) - actor.getColor().a = 1f; + actor.addAction(Actions.alpha(1f, 0.5f)); else - actor.getColor().a = 0.4f; + actor.addAction(Actions.alpha(actor == mapGroup ? 0f : 0.4f, 0.5f)); } } public void showHideMap(boolean visible) { transluscent = !visible; - setVisibility(mapGroup, visible); + setAlpha(mapGroup, visible); setAlpha(hudGroup, visible); setAlpha(menuGroup, visible); + setAlpha(avatarGroup, visible); setDisabled(exitToWorldMapActor, !MapStage.getInstance().isInMap(), "[%120][+ExitToWorldMap]", "\uFF0F"); setDisabled(bookmarkActor, !MapStage.getInstance().isInMap(), "[%120][+Bookmark]", "\uFF0F"); @@ -743,8 +743,11 @@ public class GameHUD extends Stage { public void setHUDOpacity(boolean translucent) { if (translucent) { + if (!MapStage.getInstance().isInMap()) + return; //WorldStage opacity issue setAlpha(hudGroup, false); setAlpha(menuGroup, false); + setAlpha(avatarGroup, false); for (TextraButton button : abilityButtonMap) { setAlpha(button, false); } @@ -752,6 +755,7 @@ public class GameHUD extends Stage { } else { setAlpha(hudGroup, true); setAlpha(menuGroup, true); + setAlpha(avatarGroup, true); for (TextraButton button : abilityButtonMap) { setAlpha(button, true); } @@ -759,6 +763,26 @@ public class GameHUD extends Stage { } } + public void showHideHUD(boolean hide) { + if (hide) { + hudGroup.addAction(Actions.fadeOut(0.5f)); + menuGroup.addAction(Actions.fadeOut(0.5f)); + if (!MapStage.getInstance().isInMap()) + mapGroup.addAction(Actions.fadeOut(0.5f)); + if (MapStage.getInstance().isInMap()) + avatarGroup.addAction(Actions.alpha(0.4f, 0.5f)); + hidden = true; + } else { + float alpha = MapStage.getInstance().isInMap() ? 0.4f : 1f; + avatarGroup.addAction(Actions.alpha(alpha, 0.5f)); + hudGroup.addAction(Actions.alpha(alpha, 0.5f)); + menuGroup.addAction(Actions.alpha(alpha, 0.5f)); + if (!MapStage.getInstance().isInMap()) + mapGroup.addAction(Actions.fadeIn(0.5f)); + hidden = false; + } + } + void toggleConsole() { console.toggle(); if (console.isVisible()) { @@ -917,11 +941,14 @@ public class GameHUD extends Stage { @Override public void tap(InputEvent event, float x, float y, int count, int button) { - if (count > 1 && MapStage.getInstance().isInMap()) + if (console.isVisible()) + return; + if (count > 1 && button == 0) + showHideHUD(!hidden); + else if (button == 0) setHUDOpacity(!transluscent); super.tap(event, x, y, count, button); } - } public void updateMusic() { From 2442883501af18d16659bb0e938586b89a86bf5d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 26 Aug 2024 20:27:47 +0800 Subject: [PATCH 30/33] adjust blur divisor --- .../src/forge/adventure/util/Config.java | 24 +++++++++++++++++++ .../adventure/world/WorldSaveHeader.java | 3 ++- .../src/forge/util/BlurUtils.java | 4 ++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/util/Config.java b/forge-gui-mobile/src/forge/adventure/util/Config.java index 5e97187bdb5..d2bf9ca66c6 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Config.java +++ b/forge-gui-mobile/src/forge/adventure/util/Config.java @@ -139,6 +139,30 @@ public class Config { return configData; } + public int getBlurDivisor() { + int val = 1; + try { + switch(settingsData.videomode) { + case "720p": + case "768p": + val = 8; + break; + case "900p": + case "1080p": + val = 16; + break; + case "1440p": + case "2160p": + val = 32; + break; + default: + break; + } + } catch (Exception e) { + return val; + } + return val; + } public String getPrefix() { return prefix; } diff --git a/forge-gui-mobile/src/forge/adventure/world/WorldSaveHeader.java b/forge-gui-mobile/src/forge/adventure/world/WorldSaveHeader.java index be6ef762410..1f214b702c6 100644 --- a/forge-gui-mobile/src/forge/adventure/world/WorldSaveHeader.java +++ b/forge-gui-mobile/src/forge/adventure/world/WorldSaveHeader.java @@ -7,6 +7,7 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.FrameBuffer; import com.badlogic.gdx.math.Matrix4; import com.badlogic.gdx.utils.Disposable; +import forge.adventure.util.Config; import forge.util.BlurUtils; import forge.Forge; import forge.Graphics; @@ -63,7 +64,7 @@ public class WorldSaveHeader implements java.io.Serializable, Disposable { Pixmap pixmap = Pixmap.createFromFrameBuffer(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); if (Forge.lastPreview != null) Forge.lastPreview.dispose(); - Pixmap blurred = BlurUtils.blur(pixmap, 4, 2, false, true); + Pixmap blurred = BlurUtils.blur(pixmap, 4, 2, false, Config.instance().getBlurDivisor()); Forge.lastPreview = new Texture(blurred); Pixmap scaled = new Pixmap(WorldSaveHeader.previewImageWidth, (int) (WorldSaveHeader.previewImageWidth / (Scene.getIntendedWidth() / (float) Scene.getIntendedHeight())), Pixmap.Format.RGBA8888); scaled.drawPixmap(pixmap, diff --git a/forge-gui-mobile/src/forge/util/BlurUtils.java b/forge-gui-mobile/src/forge/util/BlurUtils.java index ea9f303aab4..732995dcfed 100644 --- a/forge-gui-mobile/src/forge/util/BlurUtils.java +++ b/forge-gui-mobile/src/forge/util/BlurUtils.java @@ -270,12 +270,12 @@ public class BlurUtils { pixmap.getWidth(), pixmap.getHeight(), radius, iterations, disposePixmap); } - public static Pixmap blur(Pixmap pixmap, int radius, int iterations, boolean disposePixmap, boolean crop) { + public static Pixmap blur(Pixmap pixmap, int radius, int iterations, boolean disposePixmap, int div) { int x = (int)(pixmap.getWidth()*0.35f); int y = (int)(pixmap.getHeight()*0.35f); int width = pixmap.getWidth()-x; int height = pixmap.getHeight()-y; - return blur(pixmap, x/2, y/2, width, height, 0, 0, width/4, height/4, radius, iterations, disposePixmap); + return blur(pixmap, x/2, y/2, width, height, 0, 0, width/div, height/div, radius, iterations, disposePixmap); } /** From 5890bdffc38927c374e8cb2a66a5549b4dafa270 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Aug 2024 16:45:22 +0300 Subject: [PATCH 31/33] - Improve AI for Searing Blaze (#5987) --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 1 + forge-gui/res/cardsfolder/s/searing_blaze.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 3b6ee61a44c..7353a927c82 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -723,6 +723,7 @@ public class DamageDealAi extends DamageAiBase { if (sa.canTarget(enemy) && sa.canAddMoreTarget()) { if ((phase.is(PhaseType.END_OF_TURN) && phase.getNextTurn().equals(ai)) || (isSorcerySpeed(sa, ai) && phase.is(PhaseType.MAIN2)) + || ("BurnCreatures".equals(logic) && !enemy.getCreaturesInPlay().isEmpty()) || immediately) { boolean pingAfterAttack = "PingAfterAttack".equals(logic) && phase.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) && phase.isPlayerTurn(ai); boolean isPWAbility = sa.isPwAbility() && sa.getPayCosts().hasSpecificCostType(CostPutCounter.class); diff --git a/forge-gui/res/cardsfolder/s/searing_blaze.txt b/forge-gui/res/cardsfolder/s/searing_blaze.txt index d95e885eb71..547481dbb3e 100644 --- a/forge-gui/res/cardsfolder/s/searing_blaze.txt +++ b/forge-gui/res/cardsfolder/s/searing_blaze.txt @@ -1,7 +1,7 @@ Name:Searing Blaze ManaCost:R R Types:Instant -A:SP$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ SearingX | DamageMap$ True | SubAbility$ SearingDamage | SpellDescription$ CARDNAME deals 1 damage to target player or planeswalker and 1 damage to target creature that player or that planeswalker's controller controls. Landfall — If you had a land enter the battlefield under your control this turn, CARDNAME deals 3 damage to that player or planeswalker and 3 damage to that creature instead. +A:SP$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ SearingX | DamageMap$ True | SubAbility$ SearingDamage | AILogic$ BurnCreatures | SpellDescription$ CARDNAME deals 1 damage to target player or planeswalker and 1 damage to target creature that player or that planeswalker's controller controls. Landfall — If you had a land enter the battlefield under your control this turn, CARDNAME deals 3 damage to that player or planeswalker and 3 damage to that creature instead. SVar:SearingDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy ParentTargetedController,Creature.ControlledBy ParentTarget | TgtPrompt$ Select target creature that player or that planeswalker's controller controls | NumDmg$ SearingX | SubAbility$ DBDamageResolve SVar:DBDamageResolve:DB$ DamageResolve SVar:SearingX:Count$Landfall.3.1 From 927c6fab582668d77df8a4e1980b049974fa3a55 Mon Sep 17 00:00:00 2001 From: Simisays <67333662+Simisays@users.noreply.github.com> Date: Mon, 26 Aug 2024 15:47:10 +0200 Subject: [PATCH 32/33] Update sorins_boss_effect.txt (#5985) --- .../res/adventure/common/custom_cards/sorins_boss_effect.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/adventure/common/custom_cards/sorins_boss_effect.txt b/forge-gui/res/adventure/common/custom_cards/sorins_boss_effect.txt index c9e425695f8..c273c933bd3 100644 --- a/forge-gui/res/adventure/common/custom_cards/sorins_boss_effect.txt +++ b/forge-gui/res/adventure/common/custom_cards/sorins_boss_effect.txt @@ -6,7 +6,8 @@ SVar:TrigSeek:DB$ Seek | Num$ 2 | Type$ Card.nonLand S:Mode$ Continuous | Affected$ You | AddKeyword$ You can't lose the game. | CheckSVar$ YourLife | EffectZone$ Command | SVarCompare$ GE40 | Secondary$ True | Description$ You can't lose the game and your opponents can't win the game. S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ You can't win the game. | Secondary$ True | EffectZone$ Command | CheckSVar$ YourLife | Secondary$ True | SVarCompare$ GE40 | Description$ You can't lose the game and your opponents can't win the game. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | CheckSVar$ YourLifeCompare | SVarCompare$ EQ2 | Execute$ TrigConjure | TriggerDescription$ As long as Sorin's life total is between 20 and 40, at Sorin's upkeep, conjure a card from Sorin's Spellbook into exile with 2 time counters on it, it gains suspend. -SVar:TrigConjure:DB$ MakeCard | Conjure$ True | AtRandom$ True | Spellbook$ Sorin; Grim Nemesis,Sorin; Imperious Bloodlord,Sorin; Lord of Innistrad,Sorin Markov,Sorin; Solemn Visitor,Sorin the Mirthless,Sorin; Vampire Lord,Sorin; Vengeful Bloodlord,Timothar; Baron of Bats,Olivia Voldaren,Patriarch's Bidding,Licia; Sanguine Tribune,Astarion; the Decadent,Strefan; Maurer Progenitor,Evelyn; the Covetous,Anje; Maid of Dishonor,Edgar Markov | WithCounters$ TIME | WithCountersAmount$ 2 | Zone$ Exile | RememberMade$ True | SubAbility$ GiveSuspend +SVar:TrigConjure:DB$ MakeCard | Conjure$ True | AtRandom$ True | Spellbook$ Sorin; Grim Nemesis,Sorin; Imperious Bloodlord,Sorin; Lord of Innistrad,Sorin Markov,Sorin; Solemn Visitor,Sorin the Mirthless,Sorin; Vampire Lord,Sorin; Vengeful Bloodlord,Timothar; Baron of Bats,Olivia Voldaren,Patriarch's Bidding,Licia; Sanguine Tribune,Astarion; the Decadent,Strefan; Maurer Progenitor,Evelyn; the Covetous,Anje; Maid of Dishonor,Edgar Markov,Swords to Plowshares,Cruel Celebrant,Olivia's Wrath,Markov Baron,Champion of Dusk,Vein Ripper,Anguished Unmaking,Mortify,Void Rend,Terminate,Despark,Bedevil,Utter End,Ruinous Ultimatum,Sign in Blood,Reanimate,Victimize | Zone$ Exile | RememberMade$ True | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterNum$ 3 | CounterType$ TIME | SubAbility$ GiveSuspend SVar:GiveSuspend:DB$ Pump | Defined$ Remembered | KW$ Suspend | PumpZone$ Exile | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True S:Mode$ Continuous | EffectZone$ Command | Affected$ Vampire.YouCtrl | AddPower$ 2 | AddToughness$ 2 | CheckSVar$ YourLife | SVarCompare$ LT20 | AddKeyword$ Lifelink | Description$ As long as Sorin's life total is lower than 20, Sorin's Vampires get +2/+2 and have lifelink. From c725a49f526588f4fb0074bf23a672a4b21ac13c Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Mon, 26 Aug 2024 20:51:36 +0100 Subject: [PATCH 33/33] Banned and Restricted Announcement for August 26, 2024 --- forge-gui/res/formats/Archived/Explorer/2024-08-27.txt | 8 ++++++++ forge-gui/res/formats/Archived/Legacy/2024-08-26.txt | 8 ++++++++ forge-gui/res/formats/Archived/Modern/2024-08-26.txt | 7 +++++++ forge-gui/res/formats/Archived/Pioneer/2024-08-26.txt | 7 +++++++ forge-gui/res/formats/Archived/Vintage/2024-08-26.txt | 9 +++++++++ forge-gui/res/formats/Sanctioned/Legacy.txt | 2 +- forge-gui/res/formats/Sanctioned/Modern.txt | 2 +- forge-gui/res/formats/Sanctioned/Pioneer.txt | 2 +- forge-gui/res/formats/Sanctioned/Vintage.txt | 2 +- 9 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/formats/Archived/Explorer/2024-08-27.txt create mode 100644 forge-gui/res/formats/Archived/Legacy/2024-08-26.txt create mode 100644 forge-gui/res/formats/Archived/Modern/2024-08-26.txt create mode 100644 forge-gui/res/formats/Archived/Pioneer/2024-08-26.txt create mode 100644 forge-gui/res/formats/Archived/Vintage/2024-08-26.txt diff --git a/forge-gui/res/formats/Archived/Explorer/2024-08-27.txt b/forge-gui/res/formats/Archived/Explorer/2024-08-27.txt new file mode 100644 index 00000000000..04a72b0b1d3 --- /dev/null +++ b/forge-gui/res/formats/Archived/Explorer/2024-08-27.txt @@ -0,0 +1,8 @@ +[format] +Name:Explorer (2024-08-27) +Type:Archived +Subtype:Pioneer +Effective:2024-08-27 +Sets:KTK, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU, BRO, EA2, ONE, MOM, MAT, EA3, WOE, LCI, MKM, OTJ, BIG, BLB +Banned:Amalia Benavides Aguirre; Bloodstained Mire; Expressive Iteration; Field of the Dead; Flooded Strand; Geological Appraiser; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Sorin, Imperious Bloodlord; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills +Additional:Abandoned Sarcophagus; Abundant Maw; Accursed Horde; Accursed Witch; Adaptive Snapjaw; Adorned Pouncer; Advanced Stitchwing; Aerial Guide; Aerial Responder; Aeronaut Admiral; Aether Chaser; Aether Hub; Aether Inspector; Aether Meltdown; Aether Poisoner; Aether Swooper; Aether Theorist; Aether Tradewinds; Aetherborn Marauder; Aetherflux Reservoir; Aethersphere Harvester; Aetherstorm Roc; Aetherstream Leopard; Aethertorch Renegade; Aetherworks Marvel; Ahn-Crop Champion; Ahn-Crop Crasher; Aim High; Airdrop Aeronauts; Ajani Unyielding; Alchemist's Greeting; Alley Evasion; Alley Strangler; Alms of the Vein; Altar's Reap; Altered Ego; Always Watching; Ammit Eternal; Anafenza, Kin-Tree Spirit; Ancestral Statue; Ancient Crab; Angel of Invention; Angel of Sanctions; Angel of the God-Pharaoh; Angelic Edict; Angelic Purge; Anger of the Gods; Anguished Unmaking; Animation Module; Anointed Procession; Anointer Priest; Apothecary Geist; Appeal // Authority; Appetite for the Unnatural; Approach of the Second Sun; Arborback Stomper; Archangel Avacyn; Archfiend of Ifnir; Arlinn Kord; Armorcraft Judge; As Foretold; Assassin's Strike; Assault Formation; Assembled Alphas; Astral Cornucopia; Asylum Visitor; Atarka's Command; Attune with Aether; Audacious Infiltrator; Auger Spree; Aurelia, the Warleader; Authority of the Consuls; Avacyn's Judgment; Aven Initiate; Aven Mindcensor; Aven of Enduring Hope; Aven Wind Guide; Aviary Mechanic; Baleful Ammit; Ballista Charger; Baral's Expertise; Baral, Chief of Compliance; Barrage of Expendables; Barricade Breaker; Bastion Mastodon; Bathe in Dragonfire; Battering Krasis; Battlefield Scavenger; Bedlam Reveler; Belligerent Sliver; Beneath the Sands; Binding Mummy; Biting Rain; Bitterbow Sharpshooters; Black Cat; Blessed Alliance; Blessed Spirits; Blighted Bat; Blind Obedience; Blood Host; Blood Mist; Bloodbond Vampire; Bloodbriar; Bloodhall Priest; Bloodhunter Bat; Bloodlust Inciter; Bloodmad Vampire; Bloodrage Brawler; Blossoming Defense; Blur of Blades; Blur Sliver; Bogbrew Witch; Bomat Bazaar Barge; Bomat Courier; Bonded Construct; Bone Picker; Bone Saw; Bonescythe Sliver; Bontu the Glorified; Bontu's Last Reckoning; Bontu's Monument; Borderland Marauder; Borderland Minotaur; Boros Elite; Borrowed Grace; Borrowed Hostility; Borrowed Malevolence; Bound by Moonsilver; Brain in a Jar; Brain Maggot; Breaching Hippocamp; Bred for the Hunt; Briarbridge Patrol; Brisela, Voice of Nightmares; Bristling Hydra; Bruna, the Fading Light; Brushstrider; Brute Strength; Bubbling Cauldron; Built to Last; Built to Smash; Burn from Within; Burning-Fist Minotaur; Burning-Tree Emissary; Burnished Hart; By Force; Bygone Bishop; Byway Courier; Call the Bloodline; Canyon Slough; Carrier Thrall; Cartouche of Ambition; Cartouche of Knowledge; Cartouche of Solidarity; Cartouche of Strength; Cartouche of Zeal; Cascading Cataracts; Cast Out; Cataclysmic Gearhulk; Cathar's Companion; Cemetery Recruitment; Censor; Ceremonious Rejection; Certain Death; Champion of Rhonas; Champion of Wits; Chandra's Defeat; Chandra's Revolution; Chandra, Pyromaster; Chandra, Torch of Defiance; Chaos Maw; Charging Badger; Chief of the Foundry; Chittering Host; Choked Estuary; Cinder Elemental; Claim // Fame; Cloudblazer; Cogworker's Puzzleknot; Collateral Damage; Collected Company; Collective Brutality; Collective Defiance; Collective Effort; Combat Celebrant; Combustible Gearhulk; Commencement of Festivities; Commit // Memory; Compelling Argument; Compelling Deterrence; Compulsory Rest; Conduit of Storms; Confirm Suspicions; Confiscation Coup; Confront the Unknown; Consign // Oblivion; Consulate Skygate; Consulate Turret; Contraband Kingpin; Conviction; Coralhelm Guide; Corpse Hauler; Countervailing Winds; Countless Gears Renegade; Courageous Outrider; Crawling Sensation; Creeping Mold; Crested Sunmare; Crocanura; Crocodile of the Crossing; Crow of Dark Tidings; Cruel Reality; Crux of Fate; Crypt of the Eternals; Cryptbreaker; Cryptic Serpent; Cryptolith Fragment; Cryptolith Rite; Cultivator's Caravan; Curator of Mysteries; Curious Homunculus; Cut // Ribbons; Dance with Devils; Daredevil Dragster; Daring Demolition; Daring Sleuth; Dark Intimations; Dark Salvation; Dauntless Aven; Dauntless Cathar; Dauntless Onslaught; Dawn Gryff; Dawnfeather Eagle; Death Wind; Death's Approach; Deathcap Cultivator; Decimator of the Provinces; Declaration in Stone; Decoction Module; Deem Worthy; Defiant Greatmaw; Defiant Salvager; Demolition Stomper; Demon of Dark Schemes; Demonic Pact; Deny Existence; Depala, Pilot Exemplar; Deranged Whelp; Descend upon the Sinful; Desert Cerodon; Desert of the Fervent; Desert of the Glorified; Desert of the Indomitable; Desert of the Mindful; Desert of the True; Desert's Hold; Destined // Lead; Devils' Playground; Devilthorn Fox; Devouring Light; Die Young; Diffusion Sliver; Dinrova Horror; Diregraf Colossus; Disallow; Disposal Mummy; Dispossess; Dissenter's Deliverance; Distended Mindbender; Djeru's Renunciation; Djeru's Resolve; Docent of Perfection; Doom Blade; Doomfall; Douse in Gloom; Dovin Baan; Drag Under; Dragon Fodder; Dragon Hatchling; Dragon Mantle; Dragonloft Idol; Dragonlord's Servant; Dragonmaster Outcast; Drainpipe Vermin; Drake Haven; Drana, Liberator of Malakir; Dread Wanderer; Driven // Despair; Drogskol Shieldmate; Dromoka's Command; Drownyard Behemoth; Drownyard Explorers; Drunau Corpse Trawler; Dukhara Peafowl; Dune Beetle; Dusk // Dawn; Dusk Feaster; Duskwatch Recruiter; Dutiful Attendant; Dwynen's Elite; Dynavolt Tower; Eager Construct; Earthshaker Khenra; Eddytrail Hawk; Edifice of Authority; Elder Deep-Fiend; Eldritch Evolution; Electrostatic Pummeler; Elemental Uprising; Elusive Krasis; Elvish Visionary; Ember-Eye Wolf; Embraal Bruiser; Empyreal Voyager; Emrakul, the Promised End; Engineered Might; Enlarge; Enraged Giant; Epiphany at the Drownyard; Era of Innovation; Erdwal Illuminator; Essence Extraction; Essence Flux; Eternal of Harsh Truths; Eternal Scourge; Eternal Thirst; Ever After; Evolutionary Leap; Exemplar of Strength; Exultant Cultist; Eyeblight Assassin; Fabrication Module; Failure // Comply; Fairgrounds Warden; Faith of the Devoted; Faith Unbroken; Faithbearer Paladin; Falkenrath Gorger; Fan Bearer; Fanatic of Mogis; Farm // Market; Fatal Push; Fateful Showdown; Fen Hauler; Feral Prowler; Fervent Paincaster; Festering Mummy; Festering Newt; Fetid Pools; Fevered Visions; Fiend Binder; Fiery Temper; Filigree Familiar; Final Reward; Firebrand Archer; Fireforger's Puzzleknot; Flame Lash; Flameblade Adept; Flameblade Angel; Flames of the Firebrand; Fleeting Memories; Fleshbag Marauder; Floodwaters; Flurry of Horns; Fog; Fogwalker; Foreboding Ruins; Forge Devil; Forgotten Creation; Forsake the Worldly; Fortified Village; Fortify; Fortuitous Find; Foundry Hornet; Foundry Inspector; Foundry Screecher; Foundry Street Denizen; Fourth Bridge Prowler; Fragmentize; Fraying Sanity; Freejam Regent; Fretwork Colony; Frontline Rebel; Fumigate; Furious Reprisal; Furnace Whelp; Furyblade Vampire; Galvanic Bombardment; Game Trail; Gate to the Afterlife; Gatstaf Arsonists; Gavony Unhallowed; Gearseeker Serpent; Gearshift Ace; Geier Reach Bandit; Geier Reach Sanitarium; Geist of the Archives; Geralf's Masterpiece; Ghoulcaller's Accomplice; Gideon of the Trials; Gideon's Intervention; Gifted Aetherborn; Gilded Cerodon; Gisa and Geralf; Gisa's Bidding; Gisela, the Broken Blade; Glimmer of Genius; Glint; Glint-Nest Crane; Glint-Sleeve Artisan; Glint-Sleeve Siphoner; Glorious End; Glory-Bound Initiate; Glorybringer; Gnarlwood Dryad; Goblin Dark-Dwellers; Goblin Rally; Goblin Shortcutter; God-Pharaoh's Gift; Goldnight Castigator; Gonti, Lord of Luxury; Graf Harvest; Graf Mole; Graf Rats; Grapple with the Past; Greenbelt Rampager; Grim Flayer; Grind // Dust; Grisly Salvage; Grotesque Mutation; Groundskeeper; Gryff's Boon; Guardian of Pilgrims; Gust Walker; Hamlet Captain; Hanweir Battlements; Hanweir Garrison; Hanweir Militia Captain; Hanweir, the Writhing Township; Hapatra, Vizier of Poisons; Harmless Offering; Harnessed Lightning; Harsh Mentor; Harvest Hand; Hashep Oasis; Haunted Dead; Hazardous Conditions; Haze of Pollen; Hazoret the Fervent; Hazoret's Monument; Heart of Kiran; Heaven // Earth; Hedron Archive; Heir of Falkenrath; Hekma Sentinels; Herald of Anguish; Herald of the Fair; Heron's Grace Champion; Hidden Stockpile; Hieroglyphic Illumination; Highspire Artisan; Highspire Infusion; Hinterland Drake; Hinterland Logger; Hive Stirrings; Hollow One; Homing Lightning; Honored Crop-Captain; Hooded Brawler; Hope Against Hope; Hope of Ghirapur; Hope Tender; Hornet Queen; Horror of the Broken Lands; Hour of Devastation; Hour of Promise; Hour of Revelation; Howlpack Resurgence; Howlpack Wolf; Humble the Brute; Hungry Flames; Ice Over; Ifnir Deadlands; Illusionist's Stratagem; Imminent Doom; Impact Tremors; Impeccable Timing; Implement of Combustion; Implement of Examination; Implement of Malice; Imprisoned in the Moon; In Oketra's Name; Incendiary Flow; Incorrigible Youths; Indomitable Creativity; Indulgent Aristocrat; Ingenious Skaab; Initiate's Companion; Insatiable Gorgers; Insolent Neonate; Inspiring Call; Inspiring Statuary; Insult // Injury; Intrepid Provisioner; Invasive Surgery; Inventor's Apprentice; Inventor's Goggles; Inventors' Fair; Invigorated Rampage; Ipnu Rivulet; Ironclad Slayer; Irontread Crusher; Irrigated Farmland; Ishkanah, Grafwidow; Jace's Scrutiny; Jace, Unraveler of Secrets; Just the Wind; Kalastria Nightwatch; Kambal, Consul of Allocation; Kari Zev's Expertise; Kari Zev, Skyship Raider; Kefnet the Mindful; Kefnet's Monument; Key to the City; Khenra Charioteer; Khenra Eternal; Khenra Scrapper; Kindly Stranger; Kolaghan's Command; Kujar Seedsculptor; Laboratory Brute; Labyrinth Guardian; Languish; Lathnu Sailback; Launch Party; Lawless Broker; Lay Claim; Leaf Gilder; Leave // Chance; Leave in the Dust; Leeching Sliver; Lethal Sting; Lifecraft Cavalry; Lifecrafter's Bestiary; Lifecrafter's Gift; Lightning Axe; Lightning Diadem; Lightning Shrieker; Lightwalker; Liliana's Defeat; Liliana's Elite; Liliana's Mastery; Liliana's Reaver; Liliana, Death's Majesty; Liliana, the Last Hope; Live Fast; Lone Rider; Long Road Home; Longtusk Cub; Lord of the Accursed; Lost Legacy; Lunarch Mantle; Lupine Prototype; Mad Prophet; Magma Jet; Magma Spray; Magmaroth; Magmatic Chasm; Majestic Myriarch; Make Mischief; Make Obsolete; Malakir Cullblade; Malakir Familiar; Malfunction; Manaweft Sliver; Manglehorn; Manic Scribe; Marauding Boneslasher; Marionette Master; Markov Crusader; Master Trinketeer; Maulfist Revolutionary; Maulfist Squad; Maverick Thopterist; Maze's End; Merchant's Dockhand; Merciless Javelineer; Merciless Resolve; Mercurial Geists; Metallic Mimic; Metallic Rebuke; Metallurgic Summonings; Metalspinner's Puzzleknot; Metalwork Colossus; Miasmic Mummy; Midnight Oil; Midnight Scavengers; Mind's Dilation; Mindwrack Demon; Minister of Inquiries; Minotaur Skullcleaver; Minotaur Sureshot; Mirage Mirror; Mirrorwing Dragon; Mobile Garrison; Mockery of Nature; Monstrous Onslaught; Moonlight Hunt; Morkrut Necropod; Mournwillow; Mouth // Feed; Mugging; Murderer's Axe; Murmuring Phantasm; Naga Oracle; Naga Vitalist; Nahiri's Wrath; Nahiri, the Harbinger; Narnam Cobra; Narnam Renegade; Nature's Way; Nearheath Chaplain; Nebelgast Herald; Nef-Crop Entangler; Neglected Heirloom; Neheb, the Eternal; Neheb, the Worthy; Nest of Scarabs; Never // Return; New Perspectives; Nicol Bolas, God-Pharaoh; Night Market Aeronaut; Night Market Lookout; Nightmare; Nimble Innovator; Nimble Obstructionist; Nimble-Blade Khenra; Nimbus Swimmer; Nissa, Steward of Elements; Nissa, Vital Force; Noose Constrictor; Noosegraf Mob; Notion Thief; Noxious Gearhulk; Nyx-Fleece Ram; Nyx Weaver; Oashra Cultivator; Oasis Ritualist; Oath of Ajani; Obelisk Spider; Obsessive Skinner; Odric, Lunarch Marshal; Ogre Battledriver; Ogre Slumlord; Ojutai's Command; Ojutai's Summons; Oketra the True; Oketra's Attendant; Oketra's Avenger; Oketra's Monument; Olivia's Bloodsworn; Olivia's Dragoon; Olivia, Mobilized for War; Ominous Sphinx; Ongoing Investigation; Onward // Victory; Open Fire; Ornamental Courage; Ornery Kudu; Ornithopter; Outland Boar; Outnumber; Ovalchase Dragster; Overwhelming Splendor; Oviya Pashiri, Sage Lifecrafter; Pacification Array; Pack Guardian; Pack Rat; Padeem, Consul of Innovation; Panharmonicon; Paradox Engine; Paradoxical Outcome; Path of Bravery; Pathmaker Initiate; Patron of the Valiant; Peacewalker Colossus; Peel from Reality; Peema Aether-Seer; Peema Outrider; Perilous Vault; Permeating Mass; Phyrexian Revoker; Pia Nalaar; Pick the Brain; Pieces of the Puzzle; Pilgrim's Eye; Pitiless Vizier; Planar Bridge; Pore Over the Pages; Port Town; Possibility Storm; Pouncing Cheetah; Prakhata Pillar-Bug; Precise Strike; Predatory Sliver; Prepare // Fight; Prescient Chimera; Pride Sovereign; Primeval Bounty; Prized Amalgam; Propeller Pioneer; Protection of the Hekma; Prowling Serpopard; Pull from Tomorrow; Puncturing Blow; Puncturing Light; Pursue Glory; Putrefy; Pyre Hound; Quarry Hauler; Quicksmith Genius; Quicksmith Rebel; Rageblood Shaman; Rags // Riches; Raise Dead; Ramunap Excavator; Ramunap Ruins; Rashmi, Eternities Crafter; Ratchet Bomb; Rattlechains; Ravenous Bloodseeker; Ravenous Intruder; Razaketh, the Foulblooded; Reaper of Flight Moonsilver; Reason // Believe; Reckless Fireweaver; Reckless Racer; Reckless Scholar; Reduce // Rubble; Refurbish; Refuse // Cooperate; Regal Caracal; Relentless Dead; Renegade Map; Renegade Rallier; Renegade Tactics; Renegade Wheelsmith; Renewed Faith; Reservoir Walker; Resilient Khenra; Restoration Gearsmith; Restoration Specialist; Return to the Ranks; Reverse Engineer; Revoke Privileges; Revolutionary Rebuff; Rhonas the Indomitable; Rhonas's Monument; Rhonas's Stalwart; Riddle of Lightning; Ridgescale Tusker; Riparian Tiger; Rise from the Tides; Rise of the Dark Realms; Rishkar's Expertise; Rishkar, Peema Renegade; River Hoopoe; Rogue Refiner; Ruin Rat; Ruinous Gremlin; Rumbling Baloth; Runeclaw Bear; Runed Servitor; Rush of Adrenaline; Rush of Vitality; Ruthless Disposal; Ruthless Sniper; Sacred Cat; Sage of Ancient Lore; Sage of Shaila's Claim; Saheeli Rai; Salivating Gremlins; Samut, the Tested; Samut, Voice of Dissent; Sand Strangler; Sandsteppe Outcast; Sandwurm Convergence; Sanguine Bond; Sarkhan's Rage; Scarab Feast; Scattered Groves; Scavenger Grounds; Scour the Laboratory; Scourge Wolf; Scrap Trawler; Scrapheap Scrounger; Scrapper Champion; Seasons Past; Second Harvest; Seeker of Insight; Seer of the Last Tomorrow; Seismic Elemental; Seismic Rupture; Select for Inspection; Self-Assembler; Selfless Cathar; Selfless Spirit; Sengir Vampire; Sentinel Sliver; Servant of the Conduit; Servant of the Scale; Servo Exhibition; Servo Schematic; Shadow of the Grave; Shadowstorm Vizier; Shambleshark; Shambling Goblin; Shard of Broken Glass; Shed Weakness; Shefet Dunes; Shefet Monitor; Sheltered Thicket; Shielded Aether Thief; Shimmerscale Drake; Shipwreck Moray; Shiv's Embrace; Shreds of Sanity; Shrewd Negotiation; Shrill Howler; Sidewinder Naga; Siege Dragon; Siege Modification; Sifter Wurm; Sigarda's Aid; Sigarda, Heron's Grace; Sigardian Priest; Sigil of the Empty Throne; Sigil of Valor; Sigiled Starfish; Sign in Blood; Silumgar's Command; Sin Prodder; Sixth Sense; Sky Skiff; Skyship Plunderer; Skyship Stalker; Skysovereign, Consul Flagship; Skywhaler's Shot; Slate Street Ruffian; Slayer's Plate; Slither Blade; Sliver Hive; Sly Requisitioner; Smuggler's Copter; Solemnity; Solitary Camel; Somberwald Stag; Sorin, Grim Nemesis; Soul of the Harvest; Soul Separator; Soul-Scar Mage; Soulblade Djinn; Soulstinger; Spectral Shepherd; Speedway Fanatic; Spell Queller; Spellweaver Eternal; Sphinx's Revelation; Spire of Industry; Spire Patrol; Spireside Infiltrator; Spirit of the Hunt; Splendid Agony; Spontaneous Mutation; Sporemound; Spring // Mind; Springleaf Drum; Sram's Expertise; Sram, Senior Edificer; Stab Wound; Start // Finish; Startled Awake; Steadfast Cathar; Steelform Sliver; Stensia Masquerade; Steward of Solidarity; Stinging Shot; Stitcher's Graft; Stitchwing Skaab; Stormfront Pegasus; Strength of Arms; Striking Sliver; Striped Riverwinder; Stromkirk Condemned; Stromkirk Occultist; Struggle // Survive; Subjugator Angel; Summary Dismissal; Sunscorched Desert; Sunscourge Champion; Sunset Pyramid; Supernatural Stamina; Supply Caravan; Supreme Will; Swan Song; Sweatworks Brawler; Sweep Away; Sweltering Suns; Swift Spinner; Synchronized Strike; Tah-Crop Elite; Tajuru Pathwarden; Take Inventory; Tamiyo's Journal; Tamiyo, Field Researcher; Tandem Tactics; Tattered Haunter; Temmet, Vizier of Naktamun; Terrarion; Tezzeret the Schemer; Tezzeret's Ambition; Tezzeret's Touch; Thalia's Lancers; Thalia's Lieutenant; Thalia, Heretic Cathar; The Gitrog Monster; The Locust God; The Scarab God; The Scorpion God; Thing in the Ice; Thopter Arrest; Thorned Moloch; Those Who Serve; Thoughtseize; Thraben Foulbloods; Thraben Inspector; Thraben Standard Bearer; Thresher Lizard; Thriving Rhino; Thriving Turtle; Throne of the God-Pharaoh; Thunderbreak Regent; Tightening Coils; Toolcraft Exemplar; Topplegeist; Torch Fiend; Torment of Hailfire; Torment of Scarabs; Torrential Gearhulk; Town Gossipmonger; Traverse the Ulvenwald; Treasure Keeper; Tree of Perdition; Trespasser's Curse; Trial of Ambition; Trial of Knowledge; Trial of Solidarity; Trial of Strength; Trial of Zeal; Triskaidekaphobia; Trophy Mage; True-Faith Censer; Typhoid Rats; Ulamog, the Ceaseless Hunger; Ulrich of the Krallenhorde; Ulrich's Kindred; Ulvenwald Captive; Ulvenwald Hydra; Ulvenwald Mysteries; Unbridled Growth; Unburden; Unconventional Tactics; Underhanded Designs; Unesh, Criosphinx Sovereign; Universal Solvent; Unlicensed Disintegration; Unquenchable Thirst; Untethered Express; Vampiric Rites; Vengeful Rebel; Verdurous Gearhulk; Vessel of Nascency; Veteran Cathar; Veteran Motorist; Vile Manifestation; Village Messenger; Virulent Plague; Visionary Augmenter; Vizier of Deferment; Vizier of Many Faces; Vizier of Remedies; Vizier of the Anointed; Vizier of the Menagerie; Vizier of Tumbling Sands; Voldaren Pariah; Voltaic Brawler; Voyage's End; Wailing Ghoul; Wall of Forgotten Pharaohs; Wander in Death; Warfire Javelineer; Wasp of the Bitter End; Waste Not; Wasteland Scorpion; Watchers of the Dead; Watchful Naga; Wayward Servant; Weaponcraft Enthusiast; Weaver of Lightning; Weirded Vampire; Weirding Wood; Weldfast Engineer; Weldfast Monitor; Weldfast Wingsmith; Welding Sparks; Westvale Abbey; Wharf Infiltrator; Whelming Wave; Whir of Invention; Whirler Rogue; Whirler Virtuoso; Whirlermaker; Wight of Precinct Six; Wild Wanderer; Wild-Field Scarecrow; Wildest Dreams; Wind-Kin Raiders; Winding Constrictor; Winds of Rebuke; Winged Shepherd; Wispweaver Angel; Witch's Familiar; Woodborn Behemoth; Woodweaver's Puzzleknot; Workshop Assistant; Wretched Gryff; Yahenni's Expertise; Yahenni, Undying Partisan; Young Pyromancer; Zada, Hedron Grinder; Zealot of the God-Pharaoh; Zendikar's Roil; Abrupt Decay; Back for More; Bedevil; Buried in the Garden; Clear Shot; Crackle with Power; Decisive Denial; Detention Sphere; Electrodominance; Endless Detour; Essence Capture; Fierce Retribution; Fling; Heartless Pillage; Humiliate; Hypothesizzle; Ionize; Leyline Binding; Murder; Outlaws' Merriment; Primal Might; Ride Down; Savage Smash; Siphon Insight; Skewer the Critics; Skullcrack; Tyrant's Scorn; Unlicensed Hearse; Vanishing Verse; Villainous Wealth; Void Rend diff --git a/forge-gui/res/formats/Archived/Legacy/2024-08-26.txt b/forge-gui/res/formats/Archived/Legacy/2024-08-26.txt new file mode 100644 index 00000000000..3890a1d501f --- /dev/null +++ b/forge-gui/res/formats/Archived/Legacy/2024-08-26.txt @@ -0,0 +1,8 @@ +[format] +Name:Legacy (2024-08-26) +Type:Archived +Subtype:Legacy +Effective:2024-08-26 +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2 +Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Baaallerina; Backup Plan; Balance; Bazaar of Baghdad; Bioluminary; Black Lotus; Brago's Favor; Bronze Tablet; Carnival Carnivore; Channel; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Deathrite Shaman; Dee Kay, Finder of the Lost; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Expressive Iteration; Falling Star; Fastbond; Fight the _____ Fight; Finishing Move; Flash; Frantic Search; Gitaxian Probe; Glitterflitter; Goblin Recruiter; Grief; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Library of Alexandria; Line Cutter; Lineprancers; Lurrus of the Dream-Den; Make a _____ Splash; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Minotaur de Force; Mishra's Workshop; Monitor Monitor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Myra the Magnificent; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Ragavan, Nimble Pilferer; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Tusk and Whiskers; Underworld Breach; Unexpected Potential; Vampiric Tutor; Weight Advantage; Wheel of Fortune; White Plume Adventurer; Wicker Picker; Windfall; Wizards of the _____; Wolf in _____ Clothing; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker +Additional:Aisha of Sparks and Smoke; Arden Angel; Arvinox, the Mind Flail; Baldin, Century Herdmaster; Bjorna, Nightfall Alchemist; Blanka, Ferocious Friend; Cecily, Haunted Mage; Chief Jim Hopper; Chun-Li, Countless Kicks; Daryl, Hunter of Walkers; Dhalsim, Pliable Pacifist; Doric, Nature's Warden; Dustin, Gadget Genius; E. Honda, Sumo Champion; Edgin, Larcenous Lutenist; Eleven, the Mage; Elmar, Ulvenwald Informant; Enkira, Hostile Scavenger; Forge, Neverwinter Charlatan; Gisa's Favorite Shovel; Glenn, the Voice of Calm; Gregor, Shrewd Magistrate; Greymond, Avacyn's Stalwart; Guile, Sonic Soldier; Hansk, Slayer Zealot; Hargilde, Kindly Runechanter; Havengul Laboratory; Hawkins National Laboratory; Holga, Relentless Rager; Immard, the Stormcleaver; Ken, Burning Brawler; Lara Croft, Tomb Raider; Lucas, the Sharpshooter; Lucille; Maarika, Brutal Gladiator; Malik, Grim Manipulator; Max, the Daredevil; Michonne, Ruthless Survivor; Mike, the Dungeon Master; Mind Flayer, the Shadow; Negan, the Cold-Blooded; Othelm, Sigardian Outcast; Rick, Steadfast Leader; Rose Noble; Ryu, World Warrior; Simon, Wild Magic Sorcerer; Sophina, Spearsage Deserter; Tadeas, Juniper Ascendant; The Celestial Toymaker; The Fifteenth Doctor; The Fourteenth Doctor; The Howling Abomination; Themberchaud; The Meep; Vikya, Scorching Stalwart; Wernog, Rider's Chaplain; Will the Wise; Xenk, Paladin Unbroken; Zangief, the Red Cyclone; Zethi, Arcane Blademaster diff --git a/forge-gui/res/formats/Archived/Modern/2024-08-26.txt b/forge-gui/res/formats/Archived/Modern/2024-08-26.txt new file mode 100644 index 00000000000..4e8ae3a638c --- /dev/null +++ b/forge-gui/res/formats/Archived/Modern/2024-08-26.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern (2024-08-26) +Type:Archived +Subtype:Modern +Effective:2024-08-26 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, DPA, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, MMA, M14, THS, BNG, JOU, MD1, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, MM3, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, GK1, G18, RNA, GK2, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, LTR, WOE, LCI, MKM, OTJ, BIG, MH3, ACR, BLB +Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Field of the Dead; Fury; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Grief; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Lurrus of the Dream-Den; Mental Misstep; Mox Opal; Mycosynth Lattice; Mystic Sanctuary; Nadu, Winged Wisdom; Oko, Thief of Crowns; Once Upon a Time; Ponder; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Splinter Twin; Summer Bloom; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Up the Beanstalk; Uro, Titan of Nature's Wrath; Vault of Whispers; Violent Outburst; Yorion, Sky Nomad diff --git a/forge-gui/res/formats/Archived/Pioneer/2024-08-26.txt b/forge-gui/res/formats/Archived/Pioneer/2024-08-26.txt new file mode 100644 index 00000000000..49789667306 --- /dev/null +++ b/forge-gui/res/formats/Archived/Pioneer/2024-08-26.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer (2024-08-26) +Type:Archived +Subtype:Pioneer +Effective:2024-08-26 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, Q06, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB +Banned:Amalia Benavides Aguirre; Balustrade Spy; Bloodstained Mire; Expressive Iteration; Felidar Guardian; Field of the Dead; Flooded Strand; Geological Appraiser; Inverter of Truth; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Sorin, Imperious Bloodlord; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Walking Ballista; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills diff --git a/forge-gui/res/formats/Archived/Vintage/2024-08-26.txt b/forge-gui/res/formats/Archived/Vintage/2024-08-26.txt new file mode 100644 index 00000000000..71295502936 --- /dev/null +++ b/forge-gui/res/formats/Archived/Vintage/2024-08-26.txt @@ -0,0 +1,9 @@ +[format] +Name:Vintage (2024-08-26) +Type:Archived +Subtype:Vintage +Effective:2024-08-26 +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2 +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Urza's Saga; Vampiric Tutor; Vexing Bauble; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Assemble the Rank and Vile; Baaallerina; Backup Plan; Bioluminary; Brago's Favor; Bronze Tablet; Carnival Carnivore; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Dee Kay, Finder of the Lost; Demonic Attorney; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Echoing Boon; Emissary's Ploy; Falling Star; Fight the _____ Fight; Finishing Move; Glitterflitter; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Line Cutter; Lineprancers; Make a _____ Splash; Minotaur de Force; Monitor Monitor; Muzzio's Preparations; Myra the Magnificent; Natural Unity; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Shahrazad; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Summoner's Bond; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Timmerian Fiends; Tusk and Whiskers; Unexpected Potential; Weight Advantage; Wicker Picker; Wizards of the _____; Wolf in _____ Clothing; Worldknit +Additional:Aisha of Sparks and Smoke; Arden Angel; Arvinox, the Mind Flail; Baldin, Century Herdmaster; Bjorna, Nightfall Alchemist; Blanka, Ferocious Friend; Cecily, Haunted Mage; Chief Jim Hopper; Chun-Li, Countless Kicks; Daryl, Hunter of Walkers; Dhalsim, Pliable Pacifist; Doric, Nature's Warden; Dustin, Gadget Genius; E. Honda, Sumo Champion; Edgin, Larcenous Lutenist; Eleven, the Mage; Elmar, Ulvenwald Informant; Enkira, Hostile Scavenger; Forge, Neverwinter Charlatan; Gisa's Favorite Shovel; Glenn, the Voice of Calm; Gregor, Shrewd Magistrate; Greymond, Avacyn's Stalwart; Guile, Sonic Soldier; Hansk, Slayer Zealot; Hargilde, Kindly Runechanter; Havengul Laboratory; Hawkins National Laboratory; Holga, Relentless Rager; Immard, the Stormcleaver; Ken, Burning Brawler; Lara Croft, Tomb Raider; Lucas, the Sharpshooter; Lucille; Maarika, Brutal Gladiator; Malik, Grim Manipulator; Max, the Daredevil; Michonne, Ruthless Survivor; Mike, the Dungeon Master; Mind Flayer, the Shadow; Negan, the Cold-Blooded; Othelm, Sigardian Outcast; Rick, Steadfast Leader; Rose Noble; Ryu, World Warrior; Simon, Wild Magic Sorcerer; Sophina, Spearsage Deserter; Tadeas, Juniper Ascendant; The Celestial Toymaker; The Fifteenth Doctor; The Fourteenth Doctor; The Howling Abomination; Themberchaud; The Meep; Vikya, Scorching Stalwart; Wernog, Rider's Chaplain; Will the Wise; Xenk, Paladin Unbroken; Zangief, the Red Cyclone; Zethi, Arcane Blademaster diff --git a/forge-gui/res/formats/Sanctioned/Legacy.txt b/forge-gui/res/formats/Sanctioned/Legacy.txt index 92f539a3939..ee3e855f997 100644 --- a/forge-gui/res/formats/Sanctioned/Legacy.txt +++ b/forge-gui/res/formats/Sanctioned/Legacy.txt @@ -4,4 +4,4 @@ Order:105 Subtype:Legacy Type:Sanctioned Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2 -Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Baaallerina; Backup Plan; Balance; Bazaar of Baghdad; Bioluminary; Black Lotus; Brago's Favor; Bronze Tablet; Carnival Carnivore; Channel; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Deathrite Shaman; Dee Kay, Finder of the Lost; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Expressive Iteration; Falling Star; Fastbond; Fight the _____ Fight; Finishing Move; Flash; Frantic Search; Gitaxian Probe; Glitterflitter; Goblin Recruiter; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Library of Alexandria; Line Cutter; Lineprancers; Lurrus of the Dream-Den; Make a _____ Splash; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Minotaur de Force; Mishra's Workshop; Monitor Monitor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Myra the Magnificent; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Ragavan, Nimble Pilferer; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Tusk and Whiskers; Underworld Breach; Unexpected Potential; Vampiric Tutor; Weight Advantage; Wheel of Fortune; White Plume Adventurer; Wicker Picker; Windfall; Wizards of the _____; Wolf in _____ Clothing; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker +Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Baaallerina; Backup Plan; Balance; Bazaar of Baghdad; Bioluminary; Black Lotus; Brago's Favor; Bronze Tablet; Carnival Carnivore; Channel; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Deathrite Shaman; Dee Kay, Finder of the Lost; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Expressive Iteration; Falling Star; Fastbond; Fight the _____ Fight; Finishing Move; Flash; Frantic Search; Gitaxian Probe; Glitterflitter; Goblin Recruiter; Grief; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Library of Alexandria; Line Cutter; Lineprancers; Lurrus of the Dream-Den; Make a _____ Splash; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Minotaur de Force; Mishra's Workshop; Monitor Monitor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Myra the Magnificent; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Ragavan, Nimble Pilferer; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Tusk and Whiskers; Underworld Breach; Unexpected Potential; Vampiric Tutor; Weight Advantage; Wheel of Fortune; White Plume Adventurer; Wicker Picker; Windfall; Wizards of the _____; Wolf in _____ Clothing; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Sanctioned/Modern.txt b/forge-gui/res/formats/Sanctioned/Modern.txt index e0258f183c8..be4aa19aa26 100644 --- a/forge-gui/res/formats/Sanctioned/Modern.txt +++ b/forge-gui/res/formats/Sanctioned/Modern.txt @@ -4,4 +4,4 @@ Order:103 Subtype:Modern Type:Sanctioned Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, DPA, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, MMA, M14, THS, BNG, JOU, MD1, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, MM3, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, GK1, G18, RNA, GK2, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, LTR, WOE, LCI, MKM, OTJ, BIG, MH3, ACR, BLB -Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Field of the Dead; Fury; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Lurrus of the Dream-Den; Mental Misstep; Mox Opal; Mycosynth Lattice; Mystic Sanctuary; Oko, Thief of Crowns; Once Upon a Time; Ponder; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Splinter Twin; Summer Bloom; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Up the Beanstalk; Uro, Titan of Nature's Wrath; Vault of Whispers; Violent Outburst; Yorion, Sky Nomad +Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Field of the Dead; Fury; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Grief; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Lurrus of the Dream-Den; Mental Misstep; Mox Opal; Mycosynth Lattice; Mystic Sanctuary; Nadu, Winged Wisdom; Oko, Thief of Crowns; Once Upon a Time; Ponder; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Splinter Twin; Summer Bloom; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Up the Beanstalk; Uro, Titan of Nature's Wrath; Vault of Whispers; Violent Outburst; Yorion, Sky Nomad diff --git a/forge-gui/res/formats/Sanctioned/Pioneer.txt b/forge-gui/res/formats/Sanctioned/Pioneer.txt index a8e228f6b9d..a9ce627ed0a 100644 --- a/forge-gui/res/formats/Sanctioned/Pioneer.txt +++ b/forge-gui/res/formats/Sanctioned/Pioneer.txt @@ -4,4 +4,4 @@ Order:102 Subtype:Pioneer Type:Sanctioned Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, Q06, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB -Banned:Balustrade Spy; Bloodstained Mire; Expressive Iteration; Felidar Guardian; Field of the Dead; Flooded Strand; Geological Appraiser; Inverter of Truth; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Walking Ballista; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills +Banned:Amalia Benavides Aguirre; Balustrade Spy; Bloodstained Mire; Expressive Iteration; Felidar Guardian; Field of the Dead; Flooded Strand; Geological Appraiser; Inverter of Truth; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Sorin, Imperious Bloodlord; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Walking Ballista; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills diff --git a/forge-gui/res/formats/Sanctioned/Vintage.txt b/forge-gui/res/formats/Sanctioned/Vintage.txt index 9883d9db2b9..a779f785965 100644 --- a/forge-gui/res/formats/Sanctioned/Vintage.txt +++ b/forge-gui/res/formats/Sanctioned/Vintage.txt @@ -4,5 +4,5 @@ Order:104 Subtype:Vintage Type:Sanctioned Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2 -Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Urza's Saga; Vampiric Tutor; Vexing Bauble; Wheel of Fortune; Windfall; Yawgmoth's Will Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Assemble the Rank and Vile; Baaallerina; Backup Plan; Bioluminary; Brago's Favor; Bronze Tablet; Carnival Carnivore; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Dee Kay, Finder of the Lost; Demonic Attorney; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Echoing Boon; Emissary's Ploy; Falling Star; Fight the _____ Fight; Finishing Move; Glitterflitter; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Line Cutter; Lineprancers; Make a _____ Splash; Minotaur de Force; Monitor Monitor; Muzzio's Preparations; Myra the Magnificent; Natural Unity; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Shahrazad; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Summoner's Bond; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Timmerian Fiends; Tusk and Whiskers; Unexpected Potential; Weight Advantage; Wicker Picker; Wizards of the _____; Wolf in _____ Clothing; Worldknit