From eac265f4f7ca8682d994d84dfc1a001ee055ec03 Mon Sep 17 00:00:00 2001 From: padfoothelix Date: Sat, 5 Apr 2025 20:10:45 +0200 Subject: [PATCH] [WHO] Implement Fugitive of the Judoon (#13467) --- .../sources/ScryfallImageSupportTokens.java | 4 +- .../src/mage/cards/f/FugitiveOfTheJudoon.java | 82 +++++++++++++++++++ Mage.Sets/src/mage/sets/DoctorWho.java | 4 +- .../game/permanent/token/AlienRhinoToken.java | 34 ++++++++ .../token/Human11WithWard2Token.java | 33 ++++++++ Mage/src/main/resources/tokens-database.txt | 4 +- 6 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/f/FugitiveOfTheJudoon.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/AlienRhinoToken.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/Human11WithWard2Token.java diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java index 9441b6aa677..a6479a6c40a 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java @@ -2183,6 +2183,7 @@ public class ScryfallImageSupportTokens { // WHO put("WHO/Alien", "https://api.scryfall.com/cards/twho/2?format=image"); put("WHO/Alien Insect", "https://api.scryfall.com/cards/twho/19/en?format=image"); + put("WHO/Alien Rhino", "https://api.scryfall.com/cards/twho/3/en?format=image"); put("WHO/Alien Salamander", "https://api.scryfall.com/cards/twho/16?format=image"); put("WHO/Alien Warrior", "https://api.scryfall.com/cards/twho/14?format=image"); put("WHO/Beast", "https://api.scryfall.com/cards/twho/17?format=image"); @@ -2196,7 +2197,8 @@ public class ScryfallImageSupportTokens { put("WHO/Food/2", "https://api.scryfall.com/cards/twho/26?format=image"); put("WHO/Food/3", "https://api.scryfall.com/cards/twho/27?format=image"); put("WHO/Horse", "https://api.scryfall.com/cards/twho/4/en?format=image"); - put("WHO/Human", "https://api.scryfall.com/cards/twho/5?format=image"); + put("WHO/Human/1", "https://api.scryfall.com/cards/twho/6/en?format=image"); + put("WHO/Human/2", "https://api.scryfall.com/cards/twho/5/en?format=image"); put("WHO/Human Noble", "https://api.scryfall.com/cards/twho/7/en?format=image"); put("WHO/Mark of the Rani", "https://api.scryfall.com/cards/twho/15?format=image"); put("WHO/Soldier", "https://api.scryfall.com/cards/twho/8?format=image"); diff --git a/Mage.Sets/src/mage/cards/f/FugitiveOfTheJudoon.java b/Mage.Sets/src/mage/cards/f/FugitiveOfTheJudoon.java new file mode 100644 index 00000000000..05e2b69c45a --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FugitiveOfTheJudoon.java @@ -0,0 +1,82 @@ +package mage.cards.f; + +import java.util.UUID; +import mage.abilities.common.SagaAbility; +import mage.abilities.costs.CompositeCost; +import mage.abilities.costs.common.ExileTargetCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SagaChapter; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.game.permanent.token.AlienRhinoToken; +import mage.game.permanent.token.Human11WithWard2Token; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetControlledPermanent; + + +/** + * + * @author padfoothelix + */ +public final class FugitiveOfTheJudoon extends CardImpl { + + private static final FilterCard filter = new FilterCard("a Doctor card"); + private static final FilterControlledPermanent filterHuman = new FilterControlledPermanent(SubType.HUMAN,"a Human you control"); + private static final FilterControlledArtifactPermanent filterArtifact = new FilterControlledArtifactPermanent("an artifact you control"); + + static { + filter.add(SubType.DOCTOR.getPredicate()); + } + + public FugitiveOfTheJudoon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}"); + + this.subtype.add(SubType.SAGA); + + // (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.) + SagaAbility sagaAbility = new SagaAbility(this); + + // I -- Create a 1/1 white Human creature token with ward {2} and a 4/4 white Alien Rhino creature token. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_I, + new CreateTokenEffect(new Human11WithWard2Token()).withAdditionalTokens(new AlienRhinoToken()) + ); + + // II -- Investigate. + sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new InvestigateEffect()); + + // III -- You may exile a Human you control and an artifact you control. If you do, search your library for a Doctor card, put it onto the battlefield, then shuffle. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_III, + new DoIfCostPaid( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)), + new CompositeCost( + new ExileTargetCost(new TargetControlledPermanent(1, 1, filterHuman, true)), + new ExileTargetCost(new TargetControlledPermanent(1, 1, filterArtifact, true)), + "exile a Human you control and an artifact you control" + ), + "Exile a Human and an artifact ?" + ) + ); + + this.addAbility(sagaAbility); + + } + + private FugitiveOfTheJudoon(final FugitiveOfTheJudoon card) { + super(card); + } + + @Override + public FugitiveOfTheJudoon copy() { + return new FugitiveOfTheJudoon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/DoctorWho.java b/Mage.Sets/src/mage/sets/DoctorWho.java index e03ac42718d..61e361fa3a2 100644 --- a/Mage.Sets/src/mage/sets/DoctorWho.java +++ b/Mage.Sets/src/mage/sets/DoctorWho.java @@ -376,8 +376,8 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Frostboil Snarl", 282, Rarity.RARE, mage.cards.f.FrostboilSnarl.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Frostboil Snarl", 498, Rarity.RARE, mage.cards.f.FrostboilSnarl.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Frostboil Snarl", 873, Rarity.RARE, mage.cards.f.FrostboilSnarl.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Fugitive of the Judoon", 103, Rarity.RARE, mage.cards.f.FugitiveOfTheJudoon.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Fugitive of the Judoon", 708, Rarity.RARE, mage.cards.f.FugitiveOfTheJudoon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fugitive of the Judoon", 103, Rarity.RARE, mage.cards.f.FugitiveOfTheJudoon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fugitive of the Judoon", 708, Rarity.RARE, mage.cards.f.FugitiveOfTheJudoon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Furycalm Snarl", 1090, Rarity.RARE, mage.cards.f.FurycalmSnarl.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Furycalm Snarl", 283, Rarity.RARE, mage.cards.f.FurycalmSnarl.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Furycalm Snarl", 499, Rarity.RARE, mage.cards.f.FurycalmSnarl.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/game/permanent/token/AlienRhinoToken.java b/Mage/src/main/java/mage/game/permanent/token/AlienRhinoToken.java new file mode 100644 index 00000000000..43b6fbd5da4 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/AlienRhinoToken.java @@ -0,0 +1,34 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.PreventDamageToSourceEffect; +import mage.abilities.keyword.VanishingAbility; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; + +/** + * @author padfoothelix + */ +public final class AlienRhinoToken extends TokenImpl { + + public AlienRhinoToken() { + super("Alien Rhino Token", "4/4 white Alien Rhino creature token"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add(SubType.ALIEN); + subtype.add(SubType.RHINO); + power = new MageInt(4); + toughness = new MageInt(4); + } + + private AlienRhinoToken(final AlienRhinoToken token) { + super(token); + } + + @Override + public AlienRhinoToken copy() { + return new AlienRhinoToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/Human11WithWard2Token.java b/Mage/src/main/java/mage/game/permanent/token/Human11WithWard2Token.java new file mode 100644 index 00000000000..a39848fcb5c --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/Human11WithWard2Token.java @@ -0,0 +1,33 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.keyword.WardAbility; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; + +/** + * @author padfoothelix + */ +public final class Human11WithWard2Token extends TokenImpl { + + public Human11WithWard2Token() { + super("Human Token", "1/1 white Human creature token with ward {2}"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add(SubType.HUMAN); + power = new MageInt(1); + toughness = new MageInt(1); + this.addAbility(new WardAbility(new GenericManaCost(2))); + } + + private Human11WithWard2Token(final Human11WithWard2Token token) { + super(token); + } + + @Override + public Human11WithWard2Token copy() { + return new Human11WithWard2Token(this); + } +} diff --git a/Mage/src/main/resources/tokens-database.txt b/Mage/src/main/resources/tokens-database.txt index 0b77e47469c..8dc1ecf4e63 100644 --- a/Mage/src/main/resources/tokens-database.txt +++ b/Mage/src/main/resources/tokens-database.txt @@ -2235,6 +2235,7 @@ # WHO |Generate|TOK:WHO|Alien|||AlienToken| |Generate|TOK:WHO|Alien Insect|||AlienInsectToken| +|Generate|TOK:WHO|Alien Rhino|||AlienRhinoToken| |Generate|TOK:WHO|Alien Salamander|||AlienSalamanderToken| |Generate|TOK:WHO|Alien Warrior|||AlienWarriorToken| |Generate|TOK:WHO|Beast|||BeastToken| @@ -2248,7 +2249,8 @@ |Generate|TOK:WHO|Food|2||FoodToken| |Generate|TOK:WHO|Food|3||FoodToken| |Generate|TOK:WHO|Horse|||TheGirlInTheFireplaceHorseToken| -|Generate|TOK:WHO|Human|||TheEleventhHourToken| +|Generate|TOK:WHO|Human|1||Human11WithWard2Token| +|Generate|TOK:WHO|Human|2||TheEleventhHourToken| |Generate|TOK:WHO|Human Noble|||TheGirlInTheFireplaceHumanNobleToken| |Generate|TOK:WHO|Mark of the Rani|||MarkOfTheRaniToken| |Generate|TOK:WHO|Soldier|||SoldierToken|