[CLB] Implement Noble Heritage (plus refactor Guardian Archon from C21) (#9893)

This commit is contained in:
Grath 2023-02-08 17:56:03 -05:00 committed by GitHub
parent f070f9aa04
commit d71f43358c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 167 additions and 52 deletions

View file

@ -1,7 +1,6 @@
package mage.cards.g; package mage.cards.g;
import mage.MageInt; import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
@ -12,18 +11,15 @@ import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.ProtectionAbility; import mage.abilities.keyword.ProtectionAbility;
import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.FilterCard; import mage.filter.FilterPlayer;
import mage.filter.predicate.other.PlayerIdPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
import mage.game.stack.StackObject;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetControlledPermanent;
@ -86,56 +82,14 @@ class GuardianArchonEffect extends OneShotEffect {
if (player == null) { if (player == null) {
return false; return false;
} }
FilterPlayer filter = new FilterPlayer(player.getName());
filter.add(new PlayerIdPredicate(player.getId()));
game.addEffect(new GainAbilityTargetEffect( game.addEffect(new GainAbilityTargetEffect(
new GuardianArchonProtectionAbility(player.getId()), Duration.EndOfTurn new ProtectionAbility(filter), Duration.EndOfTurn
), source); ), source);
game.addEffect(new GainAbilityControllerEffect( game.addEffect(new GainAbilityControllerEffect(
new GuardianArchonProtectionAbility(player.getId()), Duration.EndOfTurn new ProtectionAbility(filter), Duration.EndOfTurn
), source); ), source);
return true; return true;
} }
} }
class GuardianArchonProtectionAbility extends ProtectionAbility {
private final UUID playerId;
public GuardianArchonProtectionAbility(UUID playerId) {
super(new FilterCard());
this.playerId = playerId;
}
public GuardianArchonProtectionAbility(final GuardianArchonProtectionAbility ability) {
super(ability);
this.playerId = ability.playerId;
}
@Override
public GuardianArchonProtectionAbility copy() {
return new GuardianArchonProtectionAbility(this);
}
@Override
public String getRule() {
return "{this} has protection from the chosen player.";
}
@Override
public boolean canTarget(MageObject source, Game game) {
if (playerId != null && source != null) {
if (source instanceof Permanent) {
return !((Permanent) source).isControlledBy(playerId);
}
if (source instanceof Spell) {
return !((Spell) source).isControlledBy(playerId);
}
if (source instanceof StackObject) {
return !((StackObject) source).isControlledBy(playerId);
}
if (source instanceof Card) { // e.g. for Vengeful Pharaoh
return !((Card) source).isOwnedBy(playerId);
}
}
return true;
}
}

View file

@ -0,0 +1,160 @@
package mage.cards.n;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.keyword.ProtectionAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.FilterPlayer;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.other.PlayerIdPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
/**
* @author Grath
*/
public final class NobleHeritage extends CardImpl {
public NobleHeritage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.BACKGROUND);
// Commander creatures you own have When this creature enters the battlefield and at the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. For each opponent who does, you gain protection from that player until your next turn. (You cant be targeted, dealt damage, or enchanted by anything controlled by that player.)
this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(new NobleHeritageTriggeredAbility(), Duration.WhileOnBattlefield,
StaticFilters.FILTER_CREATURES_OWNED_COMMANDER
)));
}
private NobleHeritage(final NobleHeritage card) {
super(card);
}
@Override
public NobleHeritage copy() {
return new NobleHeritage(this);
}
}
class NobleHeritageTriggeredAbility extends TriggeredAbilityImpl {
public NobleHeritageTriggeredAbility() {
super(Zone.BATTLEFIELD, null, false);
}
public NobleHeritageTriggeredAbility(final NobleHeritageTriggeredAbility ability) {
super(ability);
}
@Override
public NobleHeritageTriggeredAbility copy() {
return new NobleHeritageTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD || event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
this.getEffects().clear();
boolean result;
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) {
result = event.getTargetId().equals(this.getSourceId());
} else {
result = event.getPlayerId().equals(this.getControllerId());
}
if (result) {
Permanent enchantment = game.getPermanentOrLKIBattlefield(getSourceId());
if (enchantment != null) {
Effect effect = new NobleHeritageEffect();
this.getEffects().add(effect);
} else {
result = false;
}
}
return result;
}
@Override
public String getRule() {
return "When this creature enters the battlefield and at the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. For each opponent who does, you gain protection from that player until your next turn.";
}
}
class NobleHeritageEffect extends OneShotEffect {
public NobleHeritageEffect() {
super(Outcome.Benefit);
this.staticText = "each player may put two +1/+1 counters on a creature they control. "
+ "If a player does, creatures that player controls can't attack you or planeswalkers you control until your next turn";
}
public NobleHeritageEffect(final NobleHeritageEffect effect) {
super(effect);
}
@Override
public NobleHeritageEffect copy() {
return new NobleHeritageEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
List<UUID> players = new ArrayList<>();
List<UUID> creatures = new ArrayList<>();
for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
if (player.chooseUse(outcome, "Put two +1/+1 counters on a creature you control?", source, game)) {
Target target = new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature you control (to add two +1/+1 counters on it)"));
if (player.choose(outcome, target, source, game)) {
creatures.add(target.getFirstTarget());
players.add(player.getId());
}
}
}
}
for (UUID creatureId : creatures) {
Permanent creature = game.getPermanent(creatureId);
if (creature != null) {
creature.addCounters(CounterType.P1P1.createInstance(2), creature.getControllerId(), source, game);
}
}
for (UUID playerId : players) {
if (!Objects.equals(playerId, source.getControllerId())) {
FilterPlayer filter = new FilterPlayer();
filter.add(new PlayerIdPredicate(playerId));
game.addEffect(new GainAbilityControllerEffect(
new ProtectionAbility(filter), Duration.UntilYourNextTurn
), source);
}
}
return true;
}
return false;
}
}

View file

@ -425,6 +425,7 @@ public final class CommanderLegendsBattleForBaldursGate extends ExpansionSet {
cards.add(new SetCardInfo("Nimblewright Schematic", 330, Rarity.COMMON, mage.cards.n.NimblewrightSchematic.class)); cards.add(new SetCardInfo("Nimblewright Schematic", 330, Rarity.COMMON, mage.cards.n.NimblewrightSchematic.class));
cards.add(new SetCardInfo("Nine-Fingers Keene", 289, Rarity.RARE, mage.cards.n.NineFingersKeene.class)); cards.add(new SetCardInfo("Nine-Fingers Keene", 289, Rarity.RARE, mage.cards.n.NineFingersKeene.class));
cards.add(new SetCardInfo("Niv-Mizzet, Parun", 851, Rarity.RARE, mage.cards.n.NivMizzetParun.class)); cards.add(new SetCardInfo("Niv-Mizzet, Parun", 851, Rarity.RARE, mage.cards.n.NivMizzetParun.class));
cards.add(new SetCardInfo("Noble Heritage", 35, Rarity.RARE, mage.cards.n.NobleHeritage.class));
cards.add(new SetCardInfo("Noble's Purse", 331, Rarity.UNCOMMON, mage.cards.n.NoblesPurse.class)); cards.add(new SetCardInfo("Noble's Purse", 331, Rarity.UNCOMMON, mage.cards.n.NoblesPurse.class));
cards.add(new SetCardInfo("Nothic", 138, Rarity.UNCOMMON, mage.cards.n.Nothic.class)); cards.add(new SetCardInfo("Nothic", 138, Rarity.UNCOMMON, mage.cards.n.Nothic.class));
cards.add(new SetCardInfo("Oceanus Dragon", 87, Rarity.COMMON, mage.cards.o.OceanusDragon.class)); cards.add(new SetCardInfo("Oceanus Dragon", 87, Rarity.COMMON, mage.cards.o.OceanusDragon.class));