[CMB1] Implement Lazier Goblin (#11169)

This commit is contained in:
Susucre 2023-09-24 02:23:05 +02:00 committed by GitHub
parent 5d39d1bb38
commit f2cdfa4669
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 183 additions and 0 deletions

View file

@ -0,0 +1,182 @@
package mage.cards.l;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.SpecialAction;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.hint.common.ConditionPermanentHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetAnyTarget;
import java.util.UUID;
/**
* @author Susucr
*/
public final class LazierGoblin extends CardImpl {
/**
* Key to store that a MOR permanent has been motivated by a player.
*/
static final String keyMotivation(UUID playerId, MageObjectReference mor) {
return "LazierGoblinMotivated|" + playerId.toString() + "|" + mor.getSourceId().toString() + "|" + mor.getZoneChangeCounter();
}
public LazierGoblin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.GOBLIN);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// Motivate {3}{R} (This creature can't attack or block unless you have paid its motivate cost once. Motivate only as a sorcery.)
this.addAbility(new LazierGoblinSpecialAction());
this.addAbility(new SimpleStaticAbility(new LazierGoblinRestrictionEffect())
.addHint(new ConditionPermanentHint(LazierGoblinMotivatedCondition.instance)));
// When Lazier Goblin enters the battlefield, it deals 2 damage to any target.
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2, "it"));
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}
private LazierGoblin(final LazierGoblin card) {
super(card);
}
@Override
public LazierGoblin copy() {
return new LazierGoblin(this);
}
}
class LazierGoblinSpecialAction extends SpecialAction {
// Ruling (2019-11-12):
// Paying a creature's motivate cost is a special action that its controller
// may take any time they have priority during their main phase with no spells
// or abilities on the stack.
LazierGoblinSpecialAction() {
super(Zone.BATTLEFIELD);
this.setTiming(TimingRule.SORCERY);
this.addCost(new ManaCostsImpl<>("{3}{R}"));
this.addEffect(new LazierGoblinMotivateEffect().setText("Motivate {3}{R}")); // text is for game log to make sense.
}
private LazierGoblinSpecialAction(final LazierGoblinSpecialAction ability) {
super(ability);
}
@Override
public LazierGoblinSpecialAction copy() {
return new LazierGoblinSpecialAction(this);
}
@Override
public String getRule() {
return "Motivate {3}{R} <i>(This creature can't attack or block unless you have paid its motivate cost once. Motivate only as a sorcery.)</i>";
}
}
class LazierGoblinMotivateEffect extends OneShotEffect {
LazierGoblinMotivateEffect() {
super(Outcome.Benefit);
}
private LazierGoblinMotivateEffect(final LazierGoblinMotivateEffect effect) {
super(effect);
}
@Override
public LazierGoblinMotivateEffect copy() {
return new LazierGoblinMotivateEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = source.getSourcePermanentOrLKI(game);
if (permanent == null) {
return false;
}
game.getState().setValue(
LazierGoblin.keyMotivation(
permanent.getControllerId(),
new MageObjectReference(permanent, game)
),
true
);
return true;
}
}
class LazierGoblinRestrictionEffect extends RestrictionEffect {
public LazierGoblinRestrictionEffect() {
super(Duration.WhileOnBattlefield);
staticText = ""; // no text.
}
private LazierGoblinRestrictionEffect(final LazierGoblinRestrictionEffect effect) {
super(effect);
}
@Override
public LazierGoblinRestrictionEffect copy() {
return new LazierGoblinRestrictionEffect(this);
}
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return permanent != null
&& permanent.getId().equals(source.getSourceId())
&& null == game.getState().getValue(
LazierGoblin.keyMotivation(
permanent.getControllerId(),
new MageObjectReference(permanent, game)
)
);
}
@Override
public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game, boolean canUseChooseDialogs) {
return false;
}
@Override
public boolean canAttack(Game game, boolean canUseChooseDialogs) {
return false;
}
}
enum LazierGoblinMotivatedCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
return permanent != null
&& null != game.getState().getValue(
LazierGoblin.keyMotivation(
permanent.getControllerId(),
new MageObjectReference(permanent, game)
)
);
}
@Override
public String toString() {
return "motivated";
}
}

View file

@ -28,6 +28,7 @@ public class MysteryBoosterPlaytest extends ExpansionSet {
cards.add(new SetCardInfo("Frogkin Kidnapper", 42, Rarity.RARE, mage.cards.f.FrogkinKidnapper.class));
cards.add(new SetCardInfo("How to Keep an Izzet Mage Busy", 93, Rarity.RARE, mage.cards.h.HowToKeepAnIzzetMageBusy.class));
cards.add(new SetCardInfo("Innocuous Insect", 23, Rarity.RARE, mage.cards.i.InnocuousInsect.class));
cards.add(new SetCardInfo("Lazier Goblin", 56, Rarity.RARE, mage.cards.l.LazierGoblin.class));
cards.add(new SetCardInfo("Mirrored Lotus", 107, Rarity.RARE, mage.cards.m.MirroredLotus.class));
cards.add(new SetCardInfo("Recycla-bird", 28, Rarity.RARE, mage.cards.r.RecyclaBird.class));
cards.add(new SetCardInfo("Slivdrazi Monstrosity", 102, Rarity.RARE, mage.cards.s.SlivdraziMonstrosity.class));