Rename Universes Within cards

Update test referencing Forge, Neverwinter Charlatan

[STX] Implement Bohn, Beguiling Balladeer

[STX] Implement Casal, Lurkwood Pathfinder

[STX] Implement Themberchaud

[STX] Implement Jurin, Leading the Charge

[STX] Implement Evin, Waterdeep Opportunist

[STX] Implement Mathise, Surge Channeler

[STX] Implement Rashel, Fist of Torm
This commit is contained in:
jmlundeen 2025-04-14 16:25:53 -05:00
parent 74d2265c12
commit b32fd1b9d7
10 changed files with 66 additions and 61 deletions

View file

@ -1,4 +1,4 @@
package mage.cards.e;
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
@ -22,9 +22,9 @@ import java.util.UUID;
/**
* @author TheElk801, jeffwadsworth
*/
public final class EdginLarcenousLutenist extends CardImpl {
public final class BohnBeguilingBalladeer extends CardImpl {
public EdginLarcenousLutenist(UUID ownerId, CardSetInfo setInfo) {
public BohnBeguilingBalladeer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}");
this.supertype.add(SuperType.LEGENDARY);
@ -42,13 +42,13 @@ public final class EdginLarcenousLutenist extends CardImpl {
this.addAbility(ability);
}
private EdginLarcenousLutenist(final EdginLarcenousLutenist card) {
private BohnBeguilingBalladeer(final BohnBeguilingBalladeer card) {
super(card);
}
@Override
public EdginLarcenousLutenist copy() {
return new EdginLarcenousLutenist(this);
public BohnBeguilingBalladeer copy() {
return new BohnBeguilingBalladeer(this);
}
}

View file

@ -1,4 +1,4 @@
package mage.cards.d;
package mage.cards.c;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
@ -22,7 +22,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class DoricNaturesWarden extends CardImpl {
public final class CasalLurkwoodPathfinder extends CardImpl {
private static final FilterLandCard filter = new FilterLandCard("Forest card");
@ -30,7 +30,7 @@ public final class DoricNaturesWarden extends CardImpl {
filter.add(SubType.FOREST.getPredicate());
}
public DoricNaturesWarden(UUID ownerId, CardSetInfo setInfo) {
public CasalLurkwoodPathfinder(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.supertype.add(SuperType.LEGENDARY);
@ -38,7 +38,7 @@ public final class DoricNaturesWarden extends CardImpl {
this.subtype.add(SubType.DRUID);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.d.DoricOwlbearAvenger.class;
this.secondSideCardClazz = CasalPathbreakerOwlbear.class;
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
@ -55,12 +55,12 @@ public final class DoricNaturesWarden extends CardImpl {
)));
}
private DoricNaturesWarden(final DoricNaturesWarden card) {
private CasalLurkwoodPathfinder(final CasalLurkwoodPathfinder card) {
super(card);
}
@Override
public DoricNaturesWarden copy() {
return new DoricNaturesWarden(this);
public CasalLurkwoodPathfinder copy() {
return new CasalLurkwoodPathfinder(this);
}
}

View file

@ -1,4 +1,4 @@
package mage.cards.d;
package mage.cards.c;
import mage.MageInt;
import mage.abilities.Ability;
@ -19,7 +19,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class DoricOwlbearAvenger extends CardImpl {
public final class CasalPathbreakerOwlbear extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
@ -27,7 +27,7 @@ public final class DoricOwlbearAvenger extends CardImpl {
filter.add(SuperType.LEGENDARY.getPredicate());
}
public DoricOwlbearAvenger(UUID ownerId, CardSetInfo setInfo) {
public CasalPathbreakerOwlbear(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
@ -57,12 +57,12 @@ public final class DoricOwlbearAvenger extends CardImpl {
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect()));
}
private DoricOwlbearAvenger(final DoricOwlbearAvenger card) {
private CasalPathbreakerOwlbear(final CasalPathbreakerOwlbear card) {
super(card);
}
@Override
public DoricOwlbearAvenger copy() {
return new DoricOwlbearAvenger(this);
public CasalPathbreakerOwlbear copy() {
return new CasalPathbreakerOwlbear(this);
}
}

View file

@ -1,4 +1,4 @@
package mage.cards.f;
package mage.cards.e;
import mage.MageInt;
import mage.abilities.common.SacrificeOneOrMorePermanentsTriggeredAbility;
@ -26,13 +26,13 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class ForgeNeverwinterCharlatan extends CardImpl {
public final class EvinWaterdeepOpportunist extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.TREASURE));
private static final DynamicValue twiceXValue = new MultipliedValue(xValue, 2);
private static final Hint hint = new ValueHint("Treasures you control", xValue);
public ForgeNeverwinterCharlatan(UUID ownerId, CardSetInfo setInfo) {
public EvinWaterdeepOpportunist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
this.supertype.add(SuperType.LEGENDARY);
@ -60,12 +60,12 @@ public final class ForgeNeverwinterCharlatan extends CardImpl {
).setTriggersLimitEachTurn(1));
}
private ForgeNeverwinterCharlatan(final ForgeNeverwinterCharlatan card) {
private EvinWaterdeepOpportunist(final EvinWaterdeepOpportunist card) {
super(card);
}
@Override
public ForgeNeverwinterCharlatan copy() {
return new ForgeNeverwinterCharlatan(this);
public EvinWaterdeepOpportunist copy() {
return new EvinWaterdeepOpportunist(this);
}
}

View file

@ -1,4 +1,4 @@
package mage.cards.h;
package mage.cards.j;
import mage.MageInt;
import mage.abilities.Ability;
@ -24,9 +24,9 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class HolgaRelentlessRager extends CardImpl {
public final class JurinLeadingTheCharge extends CardImpl {
public HolgaRelentlessRager(UUID ownerId, CardSetInfo setInfo) {
public JurinLeadingTheCharge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{R}");
this.supertype.add(SuperType.LEGENDARY);
@ -45,13 +45,13 @@ public final class HolgaRelentlessRager extends CardImpl {
this.addAbility(new AttacksTriggeredAbility(new HolgaRelentlessRagerEffect()));
}
private HolgaRelentlessRager(final HolgaRelentlessRager card) {
private JurinLeadingTheCharge(final JurinLeadingTheCharge card) {
super(card);
}
@Override
public HolgaRelentlessRager copy() {
return new HolgaRelentlessRager(this);
public JurinLeadingTheCharge copy() {
return new JurinLeadingTheCharge(this);
}
}

View file

@ -1,4 +1,4 @@
package mage.cards.s;
package mage.cards.m;
import mage.MageInt;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
@ -8,10 +8,7 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.RollDieWithResultTableEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.*;
import mage.filter.FilterSpell;
import mage.filter.common.FilterInstantOrSorcerySpell;
import mage.filter.predicate.mageobject.ManaValuePredicate;
@ -21,7 +18,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SimonWildMagicSorcerer extends CardImpl {
public final class MathiseSurgeChanneler extends CardImpl {
private static final FilterSpell filter = new FilterInstantOrSorcerySpell("an instant or sorcery spell with mana value 3 or greater");
@ -29,7 +26,7 @@ public final class SimonWildMagicSorcerer extends CardImpl {
filter.add(new ManaValuePredicate(ComparisonType.MORE_THAN, 2));
}
public SimonWildMagicSorcerer(UUID ownerId, CardSetInfo setInfo) {
public MathiseSurgeChanneler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.supertype.add(SuperType.LEGENDARY);
@ -41,7 +38,7 @@ public final class SimonWildMagicSorcerer extends CardImpl {
// Whenever you cast an instant or sorcery spell with mana value 3 or greater, roll a d20.
RollDieWithResultTableEffect effect = new RollDieWithResultTableEffect(20);
this.addAbility(new SpellCastControllerTriggeredAbility(effect, filter, false));
this.addAbility(new SpellCastControllerTriggeredAbility(effect, filter, false, SetTargetPointer.SPELL));
// 1-9 | Each player draws a card.
effect.addTableEntry(1, 9, new DrawCardAllEffect(1));
@ -50,15 +47,15 @@ public final class SimonWildMagicSorcerer extends CardImpl {
effect.addTableEntry(10, 19, new DrawCardSourceControllerEffect(1, true));
// 20 | Copy that spell. You may choose new targets for the copy.
effect.addTableEntry(20, 20, new CopyTargetStackObjectEffect());
effect.addTableEntry(20, 20, new CopyTargetStackObjectEffect(true));
}
private SimonWildMagicSorcerer(final SimonWildMagicSorcerer card) {
private MathiseSurgeChanneler(final MathiseSurgeChanneler card) {
super(card);
}
@Override
public SimonWildMagicSorcerer copy() {
return new SimonWildMagicSorcerer(this);
public MathiseSurgeChanneler copy() {
return new MathiseSurgeChanneler(this);
}
}

View file

@ -1,4 +1,4 @@
package mage.cards.x;
package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
@ -18,11 +18,11 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class XenkPaladinUnbroken extends CardImpl {
public final class RashelFistOfTorm extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent(SubType.AURA, "Auras");
public XenkPaladinUnbroken(UUID ownerId, CardSetInfo setInfo) {
public RashelFistOfTorm(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}");
this.supertype.add(SuperType.LEGENDARY);
@ -40,12 +40,12 @@ public final class XenkPaladinUnbroken extends CardImpl {
)));
}
private XenkPaladinUnbroken(final XenkPaladinUnbroken card) {
private RashelFistOfTorm(final RashelFistOfTorm card) {
super(card);
}
@Override
public XenkPaladinUnbroken copy() {
return new XenkPaladinUnbroken(this);
public RashelFistOfTorm copy() {
return new RashelFistOfTorm(this);
}
}

View file

@ -1085,13 +1085,13 @@ public class SecretLairDrop extends ExpansionSet {
cards.add(new SetCardInfo("Azusa, Lost but Seeking", 1234, Rarity.RARE, mage.cards.a.AzusaLostButSeeking.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Teysa Karlov", 1235, Rarity.RARE, mage.cards.t.TeysaKarlov.class));
cards.add(new SetCardInfo("Paradise Mantle", 1236, Rarity.RARE, mage.cards.p.ParadiseMantle.class));
cards.add(new SetCardInfo("Xenk, Paladin Unbroken", 1237, Rarity.RARE, mage.cards.x.XenkPaladinUnbroken.class));
cards.add(new SetCardInfo("Simon, Wild Magic Sorcerer", 1238, Rarity.RARE, mage.cards.s.SimonWildMagicSorcerer.class));
cards.add(new SetCardInfo("Forge, Neverwinter Charlatan", 1239, Rarity.RARE, mage.cards.f.ForgeNeverwinterCharlatan.class));
cards.add(new SetCardInfo("Holga, Relentless Rager", 1240, Rarity.RARE, mage.cards.h.HolgaRelentlessRager.class));
cards.add(new SetCardInfo("Doric, Nature's Warden", 1241, Rarity.RARE, mage.cards.d.DoricNaturesWarden.class));
cards.add(new SetCardInfo("Doric, Owlbear Avenger", 1241, Rarity.RARE, mage.cards.d.DoricOwlbearAvenger.class));
cards.add(new SetCardInfo("Edgin, Larcenous Lutenist", 1242, Rarity.RARE, mage.cards.e.EdginLarcenousLutenist.class));
cards.add(new SetCardInfo("Rashel, Fist of Torm", 1237, Rarity.RARE, mage.cards.r.RashelFistOfTorm.class));
cards.add(new SetCardInfo("Mathise, Surge Channeler", 1238, Rarity.RARE, mage.cards.m.MathiseSurgeChanneler.class));
cards.add(new SetCardInfo("Evin, Waterdeep Opportunist", 1239, Rarity.RARE, mage.cards.e.EvinWaterdeepOpportunist.class));
cards.add(new SetCardInfo("Jurin, Leading the Charge", 1240, Rarity.RARE, mage.cards.j.JurinLeadingTheCharge.class));
cards.add(new SetCardInfo("Casal, Lurkwood Pathfinder", 1241, Rarity.RARE, mage.cards.c.CasalLurkwoodPathfinder.class));
cards.add(new SetCardInfo("Casal, Pathbreaker Owlbear", 1241, Rarity.RARE, mage.cards.c.CasalPathbreakerOwlbear.class));
cards.add(new SetCardInfo("Bohn, Beguiling Balladeer", 1242, Rarity.RARE, mage.cards.b.BohnBeguilingBalladeer.class));
cards.add(new SetCardInfo("Ugin, the Ineffable", 1243, Rarity.RARE, mage.cards.u.UginTheIneffable.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sorin, Imperious Bloodlord", 1244, Rarity.MYTHIC, mage.cards.s.SorinImperiousBloodlord.class));
cards.add(new SetCardInfo("Sarkhan, Dragonsoul", 1245, Rarity.MYTHIC, mage.cards.s.SarkhanDragonsoul.class));

View file

@ -23,10 +23,14 @@ public final class UniversesWithin extends ExpansionSet {
cards.add(new SetCardInfo("Aisha of Sparks and Smoke", 12, Rarity.RARE, mage.cards.a.AishaOfSparksAndSmoke.class));
cards.add(new SetCardInfo("Arvinox, the Mind Flail", 1, Rarity.MYTHIC, mage.cards.a.ArvinoxTheMindFlail.class));
cards.add(new SetCardInfo("Baldin, Century Herdmaster", 10, Rarity.RARE, mage.cards.b.BaldinCenturyHerdmaster.class));
cards.add(new SetCardInfo("Bohn, Beguiling Balladeer", 30, Rarity.RARE, mage.cards.b.BohnBeguilingBalladeer.class));
cards.add(new SetCardInfo("Bjorna, Nightfall Alchemist", 2, Rarity.RARE, mage.cards.b.BjornaNightfallAlchemist.class));
cards.add(new SetCardInfo("Casal, Lurkwood Pathfinder", 29, Rarity.RARE, mage.cards.c.CasalLurkwoodPathfinder.class));
cards.add(new SetCardInfo("Casal, Pathbreaker Owlbear", 29, Rarity.RARE, mage.cards.c.CasalPathbreakerOwlbear.class));
cards.add(new SetCardInfo("Cecily, Haunted Mage", 3, Rarity.RARE, mage.cards.c.CecilyHauntedMage.class));
cards.add(new SetCardInfo("Elmar, Ulvenwald Informant", 4, Rarity.RARE, mage.cards.e.ElmarUlvenwaldInformant.class));
cards.add(new SetCardInfo("Enkira, Hostile Scavenger", 20, Rarity.MYTHIC, mage.cards.e.EnkiraHostileScavenger.class));
cards.add(new SetCardInfo("Evin, Waterdeep Opportunist", 26, Rarity.RARE, mage.cards.e.EvinWaterdeepOpportunist.class));
cards.add(new SetCardInfo("Gisa's Favorite Shovel", 19, Rarity.MYTHIC, mage.cards.g.GisasFavoriteShovel.class));
cards.add(new SetCardInfo("Gregor, Shrewd Magistrate", 21, Rarity.MYTHIC, mage.cards.g.GregorShrewdMagistrate.class));
cards.add(new SetCardInfo("Greymond, Avacyn's Stalwart", 18, Rarity.MYTHIC, mage.cards.g.GreymondAvacynsStalwart.class));
@ -35,11 +39,15 @@ public final class UniversesWithin extends ExpansionSet {
cards.add(new SetCardInfo("Havengul Laboratory", 9, Rarity.RARE, mage.cards.h.HavengulLaboratory.class));
cards.add(new SetCardInfo("Havengul Mystery", 9, Rarity.RARE, mage.cards.h.HavengulMystery.class));
cards.add(new SetCardInfo("Immard, the Stormcleaver", 14, Rarity.RARE, mage.cards.i.ImmardTheStormcleaver.class));
cards.add(new SetCardInfo("Jurin, Leading the Charge", 27, Rarity.RARE, mage.cards.j.JurinLeadingTheCharge.class));
cards.add(new SetCardInfo("Maarika, Brutal Gladiator", 15, Rarity.RARE, mage.cards.m.MaarikaBrutalGladiator.class));
cards.add(new SetCardInfo("Malik, Grim Manipulator", 23, Rarity.MYTHIC, mage.cards.m.MalikGrimManipulator.class));
cards.add(new SetCardInfo("Mathise, Surge Channeler", 25, Rarity.RARE, mage.cards.m.MathiseSurgeChanneler.class));
cards.add(new SetCardInfo("Othelm, Sigardian Outcast", 6, Rarity.RARE, mage.cards.o.OthelmSigardianOutcast.class));
cards.add(new SetCardInfo("Rashel, Fist of Torm", 24, Rarity.RARE, mage.cards.r.RashelFistOfTorm.class));
cards.add(new SetCardInfo("Sophina, Spearsage Deserter", 7, Rarity.RARE, mage.cards.s.SophinaSpearsageDeserter.class));
cards.add(new SetCardInfo("Tadeas, Juniper Ascendant", 16, Rarity.RARE, mage.cards.t.TadeasJuniperAscendant.class));
cards.add(new SetCardInfo("Themberchaud", 28, Rarity.RARE, mage.cards.t.Themberchaud.class));
cards.add(new SetCardInfo("The Howling Abomination", 13, Rarity.RARE, mage.cards.t.TheHowlingAbomination.class));
cards.add(new SetCardInfo("Vikya, Scorching Stalwart", 11, Rarity.RARE, mage.cards.v.VikyaScorchingStalwart.class));
cards.add(new SetCardInfo("Wernog, Rider's Chaplain", 8, Rarity.RARE, mage.cards.w.WernogRidersChaplain.class));

View file

@ -491,10 +491,10 @@ public class SacrificeDiesTriggerTest extends CardTestPlayerBase {
}
@Test
public void test_BatchEvent_ForgeNeverwinterCharlatan_SacrificeAnother() {
public void test_BatchEvent_EvinWaterdeepOpportunist_SacrificeAnother() {
// Whenever one or more players sacrifice one or more creatures, you create a tapped Treasure token.
// This ability triggers only once each turn.
addCard(Zone.BATTLEFIELD, playerA, "Forge, Neverwinter Charlatan");
addCard(Zone.BATTLEFIELD, playerA, "Evin, Waterdeep Opportunist");
//
// {2}, {T}, Sacrifice a creature: Draw a card.
addCard(Zone.BATTLEFIELD, playerA, "Phyrexian Vault", 1);
@ -514,10 +514,10 @@ public class SacrificeDiesTriggerTest extends CardTestPlayerBase {
}
@Test
public void test_BatchEvent_ForgeNeverwinterCharlatan_SacrificeItself() {
public void test_BatchEvent_EvinWaterdeepOpportunist_SacrificeItself() {
// Whenever one or more players sacrifice one or more creatures, you create a tapped Treasure token.
// This ability triggers only once each turn.
addCard(Zone.BATTLEFIELD, playerA, "Forge, Neverwinter Charlatan");
addCard(Zone.BATTLEFIELD, playerA, "Evin, Waterdeep Opportunist");
//
// {2}, {T}, Sacrifice a creature: Draw a card.
addCard(Zone.BATTLEFIELD, playerA, "Phyrexian Vault", 1);
@ -525,7 +525,7 @@ public class SacrificeDiesTriggerTest extends CardTestPlayerBase {
// sacrifice itself
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}, {T}, Sacrifice");
setChoice(playerA, "Forge, Neverwinter Charlatan"); // to sacrifice
setChoice(playerA, "Evin, Waterdeep Opportunist"); // to sacrifice
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);