mirror of
https://github.com/correl/mage.git
synced 2024-11-25 03:00:11 +00:00
[AFR] Implemented The Tarrasque
This commit is contained in:
parent
a325822334
commit
b316a32ab7
3 changed files with 241 additions and 0 deletions
122
Mage.Sets/src/mage/cards/t/TheTarrasque.java
Normal file
122
Mage.Sets/src/mage/cards/t/TheTarrasque.java
Normal file
|
@ -0,0 +1,122 @@
|
|||
package mage.cards.t;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObjectReference;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||
import mage.abilities.effects.common.FightTargetSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.abilities.keyword.WardAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.stack.Spell;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.watchers.Watcher;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class TheTarrasque extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter
|
||||
= new FilterCreaturePermanent("creature defending player controls");
|
||||
|
||||
static {
|
||||
filter.add(DefendingPlayerControlsPredicate.instance);
|
||||
}
|
||||
|
||||
public TheTarrasque(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{G}{G}{G}");
|
||||
|
||||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.DINOSAUR);
|
||||
this.power = new MageInt(10);
|
||||
this.toughness = new MageInt(10);
|
||||
|
||||
// The Tarrasque has haste and ward {10} as long as it was cast.
|
||||
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||
new GainAbilitySourceEffect(
|
||||
HasteAbility.getInstance(), Duration.WhileOnBattlefield
|
||||
), TheTarrasqueCondition.instance, "{this} has haste"
|
||||
));
|
||||
ability.addEffect(new ConditionalContinuousEffect(
|
||||
new GainAbilitySourceEffect(
|
||||
new WardAbility(new GenericManaCost(10)), Duration.WhileOnBattlefield
|
||||
), TheTarrasqueCondition.instance, "and ward {10} as long as it was cast"
|
||||
));
|
||||
this.addAbility(ability, new TheTarrasqueWatcher());
|
||||
|
||||
// Whenever The Tarrasque attacks, it fights target creature defending player controls.
|
||||
ability = new AttacksTriggeredAbility(new FightTargetSourceEffect()
|
||||
.setText("it fights target creature defending player controls"));
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private TheTarrasque(final TheTarrasque card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TheTarrasque copy() {
|
||||
return new TheTarrasque(this);
|
||||
}
|
||||
}
|
||||
|
||||
enum TheTarrasqueCondition implements Condition {
|
||||
instance;
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
return TheTarrasqueWatcher.checkSource(game, source);
|
||||
}
|
||||
}
|
||||
|
||||
class TheTarrasqueWatcher extends Watcher {
|
||||
|
||||
private final Set<MageObjectReference> cast = new HashSet<>();
|
||||
|
||||
TheTarrasqueWatcher() {
|
||||
super(WatcherScope.GAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void watch(GameEvent event, Game game) {
|
||||
switch (event.getType()) {
|
||||
case SPELL_CAST:
|
||||
Spell spell = game.getSpell(event.getTargetId());
|
||||
if (spell != null) {
|
||||
cast.add(new MageObjectReference(spell.getCard(), game, 1));
|
||||
}
|
||||
return;
|
||||
case BEGINNING_PHASE_PRE:
|
||||
if (game.getTurnNum() == 1) {
|
||||
cast.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static boolean checkSource(Game game, Ability source) {
|
||||
TheTarrasqueWatcher watcher = game.getState().getWatcher(TheTarrasqueWatcher.class);
|
||||
return watcher != null
|
||||
&& watcher
|
||||
.cast
|
||||
.stream()
|
||||
.anyMatch(mor -> mor.refersTo(source.getSourcePermanentIfItStillExists(game), game));
|
||||
}
|
||||
}
|
|
@ -225,6 +225,7 @@ public final class AdventuresInTheForgottenRealms extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("The Book of Exalted Deeds", 4, Rarity.MYTHIC, mage.cards.t.TheBookOfExaltedDeeds.class));
|
||||
cards.add(new SetCardInfo("The Book of Vile Darkness", 91, Rarity.MYTHIC, mage.cards.t.TheBookOfVileDarkness.class));
|
||||
cards.add(new SetCardInfo("The Deck of Many Things", 241, Rarity.MYTHIC, mage.cards.t.TheDeckOfManyThings.class));
|
||||
cards.add(new SetCardInfo("The Tarrasque", 207, Rarity.MYTHIC, mage.cards.t.TheTarrasque.class));
|
||||
cards.add(new SetCardInfo("Thieves' Tools", 122, Rarity.COMMON, mage.cards.t.ThievesTools.class));
|
||||
cards.add(new SetCardInfo("Tiamat", 235, Rarity.MYTHIC, mage.cards.t.Tiamat.class));
|
||||
cards.add(new SetCardInfo("Tiger-Tribe Hunter", 163, Rarity.UNCOMMON, mage.cards.t.TigerTribeHunter.class));
|
||||
|
|
|
@ -0,0 +1,118 @@
|
|||
package org.mage.test.cards.single.afr;
|
||||
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.constants.PhaseStep;
|
||||
import mage.constants.Zone;
|
||||
import org.junit.Test;
|
||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class TheTarrasqueTest extends CardTestPlayerBase {
|
||||
|
||||
private static final String tarrasque = "The Tarrasque";
|
||||
private static final String sakashima = "Sakashima the Impostor";
|
||||
|
||||
@Test
|
||||
public void testCast() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest", 9);
|
||||
addCard(Zone.HAND, playerA, tarrasque);
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, tarrasque);
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), true);
|
||||
|
||||
setStopAt(2, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), true);
|
||||
|
||||
setStopAt(3, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), true);
|
||||
|
||||
setStopAt(4, PhaseStep.END_TURN);
|
||||
execute();
|
||||
assertAllCommandsUsed();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotCast() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Elvish Piper");
|
||||
addCard(Zone.HAND, playerA, tarrasque);
|
||||
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{G},");
|
||||
setChoice(playerA, "Yes");
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), false);
|
||||
|
||||
setStopAt(2, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), false);
|
||||
|
||||
setStopAt(3, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), false);
|
||||
|
||||
setStopAt(4, PhaseStep.END_TURN);
|
||||
execute();
|
||||
assertAllCommandsUsed();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSakashima() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Island", 4);
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Elvish Piper");
|
||||
addCard(Zone.HAND, playerA, tarrasque);
|
||||
addCard(Zone.HAND, playerA, sakashima);
|
||||
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{G},");
|
||||
setChoice(playerA, "Yes");
|
||||
setChoice(playerA, tarrasque);
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, sakashima);
|
||||
setChoice(playerA, "Yes");
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertPowerToughness(playerA, sakashima, 10, 10);
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), false);
|
||||
assertAbility(playerA, sakashima, HasteAbility.getInstance(), true);
|
||||
|
||||
setStopAt(2, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), false);
|
||||
assertAbility(playerA, sakashima, HasteAbility.getInstance(), true);
|
||||
|
||||
setStopAt(3, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), false);
|
||||
assertAbility(playerA, sakashima, HasteAbility.getInstance(), true);
|
||||
|
||||
setStopAt(4, PhaseStep.END_TURN);
|
||||
execute();
|
||||
assertAllCommandsUsed();
|
||||
|
||||
assertAbility(playerA, tarrasque, HasteAbility.getInstance(), false);
|
||||
assertAbility(playerA, sakashima, HasteAbility.getInstance(), true);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue