[DSK] Implement Grand Entryway // Elegant Rotunda

This commit is contained in:
theelk801 2025-12-07 11:40:43 -05:00
parent a5483496f8
commit caba72094e
10 changed files with 57 additions and 20 deletions

View file

@ -27,7 +27,7 @@ public final class BottomlessPoolLockerRoom extends RoomCard {
// Whenever one or more creatures you control deal combat damage to a player, draw a card. // Whenever one or more creatures you control deal combat damage to a player, draw a card.
super(ownerId, setInfo, super(ownerId, setInfo,
new CardType[] { CardType.ENCHANTMENT }, new CardType[] { CardType.ENCHANTMENT },
"{U}", "{4}{U}", SpellAbilityType.SPLIT); "{U}", "{4}{U}");
this.subtype.add(SubType.ROOM); this.subtype.add(SubType.ROOM);
// Left half ability - "When you unlock this door, return up to one target creature to its owners hand." // Left half ability - "When you unlock this door, return up to one target creature to its owners hand."
@ -52,4 +52,4 @@ public final class BottomlessPoolLockerRoom extends RoomCard {
public BottomlessPoolLockerRoom copy() { public BottomlessPoolLockerRoom copy() {
return new BottomlessPoolLockerRoom(this); return new BottomlessPoolLockerRoom(this);
} }
} }

View file

@ -8,7 +8,6 @@ import mage.abilities.keyword.ConvokeAbility;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.cards.RoomCard; import mage.cards.RoomCard;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SpellAbilityType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.filter.common.FilterNonlandCard; import mage.filter.common.FilterNonlandCard;
@ -30,7 +29,7 @@ public final class DazzlingTheaterPropRoom extends RoomCard {
} }
public DazzlingTheaterPropRoom(UUID ownerId, CardSetInfo setInfo) { public DazzlingTheaterPropRoom(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}", "{2}{W}", SpellAbilityType.SPLIT); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}", "{2}{W}");
this.subtype.add(SubType.ROOM); this.subtype.add(SubType.ROOM);
// Dazzling Theater: Creature spells you cast have convoke. // Dazzling Theater: Creature spells you cast have convoke.

View file

@ -29,7 +29,7 @@ public final class DollmakersShopPorcelainGallery extends RoomCard {
} }
public DollmakersShopPorcelainGallery(UUID ownerId, CardSetInfo setInfo) { public DollmakersShopPorcelainGallery(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}", "{4}{W}{W}", SpellAbilityType.SPLIT); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}", "{4}{W}{W}");
this.subtype.add(SubType.ROOM); this.subtype.add(SubType.ROOM);
// Dollmaker's Shop: Whenever one or more non-Toy creatures you control attack a player, create a 1/1 white Toy artifact creature token. // Dollmaker's Shop: Whenever one or more non-Toy creatures you control attack a player, create a 1/1 white Toy artifact creature token.

View file

@ -9,7 +9,6 @@ import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffe
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.cards.RoomCard; import mage.cards.RoomCard;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SpellAbilityType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
@ -21,7 +20,7 @@ import java.util.UUID;
public final class FuneralRoomAwakeningHall extends RoomCard { public final class FuneralRoomAwakeningHall extends RoomCard {
public FuneralRoomAwakeningHall(UUID ownerId, CardSetInfo setInfo) { public FuneralRoomAwakeningHall(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}", "{6}{B}{B}", SpellAbilityType.SPLIT); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}", "{6}{B}{B}");
this.subtype.add(SubType.ROOM); this.subtype.add(SubType.ROOM);
// Funeral Room: Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. // Funeral Room: Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.

View file

@ -0,0 +1,42 @@
package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.common.UnlockThisDoorTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.cards.CardSetInfo;
import mage.cards.RoomCard;
import mage.constants.CardType;
import mage.counters.CounterType;
import mage.game.permanent.token.GlimmerToken;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GrandEntrywayElegantRotunda extends RoomCard {
public GrandEntrywayElegantRotunda(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}", "{2}{W}");
// Grand Entryway
// When you unlock this door, create a 1/1 white Glimmer enchantment creature token.
this.getLeftHalfCard().addAbility(new UnlockThisDoorTriggeredAbility(new CreateTokenEffect(new GlimmerToken()), false, true));
// Elegant Rotunda
// When you unlock this door, put a +1/+1 counter on each of up to two target creatures.
Ability ability = new UnlockThisDoorTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false, false);
ability.addTarget(new TargetCreaturePermanent(0, 2));
this.getRightHalfCard().addAbility(ability);
}
private GrandEntrywayElegantRotunda(final GrandEntrywayElegantRotunda card) {
super(card);
}
@Override
public GrandEntrywayElegantRotunda copy() {
return new GrandEntrywayElegantRotunda(this);
}
}

View file

@ -8,7 +8,6 @@ import mage.cards.CardSetInfo;
import mage.cards.RoomCard; import mage.cards.RoomCard;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType; import mage.constants.ComparisonType;
import mage.constants.SpellAbilityType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
@ -42,7 +41,7 @@ public final class SurgicalSuiteHospitalRoom extends RoomCard {
// Whenever you attack, put a +1/+1 counter on target attacking creature. // Whenever you attack, put a +1/+1 counter on target attacking creature.
super(ownerId, setInfo, super(ownerId, setInfo,
new CardType[] { CardType.ENCHANTMENT }, new CardType[] { CardType.ENCHANTMENT },
"{1}{W}", "{3}{W}", SpellAbilityType.SPLIT); "{1}{W}", "{3}{W}");
this.subtype.add(SubType.ROOM); this.subtype.add(SubType.ROOM);
// Left half ability - "When you unlock this door, return target creature card with mana value 3 or less from your graveyard to the battlefield." // Left half ability - "When you unlock this door, return target creature card with mana value 3 or less from your graveyard to the battlefield."

View file

@ -14,7 +14,6 @@ import mage.cards.CardSetInfo;
import mage.cards.RoomCard; import mage.cards.RoomCard;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.SpellAbilityType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import mage.game.Game; import mage.game.Game;
@ -35,7 +34,7 @@ public final class UnholyAnnexRitualChamber extends RoomCard {
} }
public UnholyAnnexRitualChamber(UUID ownerId, CardSetInfo setInfo) { public UnholyAnnexRitualChamber(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}", "{3}{B}{B}", SpellAbilityType.SPLIT); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}", "{3}{B}{B}");
this.subtype.add(SubType.ROOM); this.subtype.add(SubType.ROOM);
// Unholy Annex: At the beginning of your end step, draw a card. If you control a Demon, each opponent loses 2 life and you gain 2 life. Otherwise, you lose 2 life. // Unholy Annex: At the beginning of your end step, draw a card. If you control a Demon, each opponent loses 2 life and you gain 2 life. Otherwise, you lose 2 life.

View file

@ -8,7 +8,6 @@ import mage.cards.CardSetInfo;
import mage.cards.RoomCard; import mage.cards.RoomCard;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SpellAbilityType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
@ -20,7 +19,7 @@ import java.util.UUID;
public final class WalkInClosetForgottenCellar extends RoomCard { public final class WalkInClosetForgottenCellar extends RoomCard {
public WalkInClosetForgottenCellar(UUID ownerId, CardSetInfo setInfo) { public WalkInClosetForgottenCellar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}", "{3}{G}{G}", SpellAbilityType.SPLIT); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}", "{3}{G}{G}");
this.subtype.add(SubType.ROOM); this.subtype.add(SubType.ROOM);
// Walk-In Closet: You may play lands from your graveyard. // Walk-In Closet: You may play lands from your graveyard.

View file

@ -158,6 +158,8 @@ public final class DuskmournHouseOfHorror extends ExpansionSet {
cards.add(new SetCardInfo("Gloomlake Verge", 260, Rarity.RARE, mage.cards.g.GloomlakeVerge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gloomlake Verge", 260, Rarity.RARE, mage.cards.g.GloomlakeVerge.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Gloomlake Verge", 331, Rarity.RARE, mage.cards.g.GloomlakeVerge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gloomlake Verge", 331, Rarity.RARE, mage.cards.g.GloomlakeVerge.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grab the Prize", 138, Rarity.COMMON, mage.cards.g.GrabThePrize.class)); cards.add(new SetCardInfo("Grab the Prize", 138, Rarity.COMMON, mage.cards.g.GrabThePrize.class));
cards.add(new SetCardInfo("Grand Entryway // Elegant Rotunda", 287, Rarity.COMMON, mage.cards.g.GrandEntrywayElegantRotunda.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grand Entryway // Elegant Rotunda", 15, Rarity.COMMON, mage.cards.g.GrandEntrywayElegantRotunda.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grasping Longneck", 180, Rarity.COMMON, mage.cards.g.GraspingLongneck.class)); cards.add(new SetCardInfo("Grasping Longneck", 180, Rarity.COMMON, mage.cards.g.GraspingLongneck.class));
cards.add(new SetCardInfo("Gremlin Tamer", 215, Rarity.UNCOMMON, mage.cards.g.GremlinTamer.class)); cards.add(new SetCardInfo("Gremlin Tamer", 215, Rarity.UNCOMMON, mage.cards.g.GremlinTamer.class));
cards.add(new SetCardInfo("Grievous Wound", 102, Rarity.RARE, mage.cards.g.GrievousWound.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Grievous Wound", 102, Rarity.RARE, mage.cards.g.GrievousWound.class, NON_FULL_USE_VARIOUS));

View file

@ -22,19 +22,18 @@ import java.util.UUID;
public abstract class RoomCard extends SplitCard { public abstract class RoomCard extends SplitCard {
private SpellAbilityType lastCastHalf = null; private SpellAbilityType lastCastHalf = null;
protected RoomCard(UUID ownerId, CardSetInfo setInfo, CardType[] types, String costsLeft, protected RoomCard(UUID ownerId, CardSetInfo setInfo, CardType[] types, String costsLeft, String costsRight) {
String costsRight, SpellAbilityType spellAbilityType) { super(ownerId, setInfo, costsLeft, costsRight, SpellAbilityType.SPLIT, types);
super(ownerId, setInfo, costsLeft, costsRight, spellAbilityType, types);
String[] names = setInfo.getName().split(" // "); String[] names = setInfo.getName().split(" // ");
leftHalfCard = new RoomCardHalfImpl( leftHalfCard = new RoomCardHalfImpl(
this.getOwnerId(), new CardSetInfo(names[0], setInfo.getExpansionSetCode(), setInfo.getCardNumber(), this.getOwnerId(), new CardSetInfo(names[0], setInfo.getExpansionSetCode(), setInfo.getCardNumber(),
setInfo.getRarity(), setInfo.getGraphicInfo()), setInfo.getRarity(), setInfo.getGraphicInfo()),
types, costsLeft, this, SpellAbilityType.SPLIT_LEFT); types, costsLeft, this, SpellAbilityType.SPLIT_LEFT);
rightHalfCard = new RoomCardHalfImpl( rightHalfCard = new RoomCardHalfImpl(
this.getOwnerId(), new CardSetInfo(names[1], setInfo.getExpansionSetCode(), setInfo.getCardNumber(), this.getOwnerId(), new CardSetInfo(names[1], setInfo.getExpansionSetCode(), setInfo.getCardNumber(),
setInfo.getRarity(), setInfo.getGraphicInfo()), setInfo.getRarity(), setInfo.getGraphicInfo()),
types, costsRight, this, SpellAbilityType.SPLIT_RIGHT); types, costsRight, this, SpellAbilityType.SPLIT_RIGHT);
// Add the one-shot effect to unlock a door on cast -> ETB // Add the one-shot effect to unlock a door on cast -> ETB
@ -113,7 +112,7 @@ public abstract class RoomCard extends SplitCard {
Abilities<Ability> rightAbilities = roomCard.getRightHalfCard().getAbilities(); Abilities<Ability> rightAbilities = roomCard.getRightHalfCard().getAbilities();
for (Ability ability : rightAbilities) { for (Ability ability : rightAbilities) {
permanent.addAbility(ability, roomCard.getRightHalfCard().getId(), game,true); permanent.addAbility(ability, roomCard.getRightHalfCard().getId(), game, true);
} }
} }
} }
@ -173,4 +172,3 @@ class RoomEnterUnlockEffect extends OneShotEffect {
return true; return true;
} }
} }