mirror of
https://github.com/correl/mage.git
synced 2024-11-28 19:19:55 +00:00
parent
a0be37922e
commit
a76d6e8c24
2 changed files with 96 additions and 19 deletions
|
@ -1,7 +1,5 @@
|
||||||
|
|
||||||
package mage.cards.s;
|
package mage.cards.s;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.MageObject;
|
import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
@ -15,17 +13,19 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.game.stack.Spell;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetOpponent;
|
import mage.target.common.TargetOpponent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class SenTriplets extends CardImpl {
|
public final class SenTriplets extends CardImpl {
|
||||||
|
|
||||||
public SenTriplets(UUID ownerId, CardSetInfo setInfo) {
|
public SenTriplets(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}{W}{U}{B}");
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}{W}{U}{B}");
|
||||||
addSuperType(SuperType.LEGENDARY);
|
addSuperType(SuperType.LEGENDARY);
|
||||||
this.subtype.add(SubType.HUMAN);
|
this.subtype.add(SubType.HUMAN);
|
||||||
this.subtype.add(SubType.WIZARD);
|
this.subtype.add(SubType.WIZARD);
|
||||||
|
@ -35,7 +35,10 @@ public final class SenTriplets extends CardImpl {
|
||||||
// At the beginning of your upkeep, choose target opponent.
|
// At the beginning of your upkeep, choose target opponent.
|
||||||
// This turn, that player can't cast spells or activate abilities and plays with their hand revealed.
|
// This turn, that player can't cast spells or activate abilities and plays with their hand revealed.
|
||||||
// You may play cards from that player's hand this turn.
|
// You may play cards from that player's hand this turn.
|
||||||
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new SenTripletsRuleModifyingEffect(), TargetController.YOU, false, false);
|
Ability ability = new BeginningOfUpkeepTriggeredAbility(
|
||||||
|
Zone.BATTLEFIELD, new SenTripletsRuleModifyingEffect(),
|
||||||
|
TargetController.YOU, false, false
|
||||||
|
);
|
||||||
ability.addEffect(new SenTripletsOpponentRevealsHandEffect());
|
ability.addEffect(new SenTripletsOpponentRevealsHandEffect());
|
||||||
ability.addEffect(new SenTripletsPlayFromOpponentsHandEffect());
|
ability.addEffect(new SenTripletsPlayFromOpponentsHandEffect());
|
||||||
ability.addTarget(new TargetOpponent());
|
ability.addTarget(new TargetOpponent());
|
||||||
|
@ -56,11 +59,11 @@ class SenTripletsRuleModifyingEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
|
|
||||||
public SenTripletsRuleModifyingEffect() {
|
public SenTripletsRuleModifyingEffect() {
|
||||||
super(Duration.EndOfTurn, Outcome.Benefit);
|
super(Duration.EndOfTurn, Outcome.Benefit);
|
||||||
staticText = "choose target opponent. This turn, that player can't cast spells or activate abilities";
|
staticText = "choose target opponent. This turn, that player can't cast spells or activate abilities";
|
||||||
}
|
}
|
||||||
|
|
||||||
public SenTripletsRuleModifyingEffect(final SenTripletsRuleModifyingEffect effect) {
|
private SenTripletsRuleModifyingEffect(final SenTripletsRuleModifyingEffect effect) {
|
||||||
super(effect);
|
super(effect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -86,7 +89,8 @@ class SenTripletsRuleModifyingEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checksEventType(GameEvent event, Game game) {
|
public boolean checksEventType(GameEvent event, Game game) {
|
||||||
return event.getType() == GameEvent.EventType.CAST_SPELL || event.getType() == GameEvent.EventType.ACTIVATE_ABILITY;
|
return event.getType() == GameEvent.EventType.CAST_SPELL
|
||||||
|
|| event.getType() == GameEvent.EventType.ACTIVATE_ABILITY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -102,7 +106,7 @@ class SenTripletsOpponentRevealsHandEffect extends ContinuousEffectImpl {
|
||||||
staticText = "and plays with their hand revealed";
|
staticText = "and plays with their hand revealed";
|
||||||
}
|
}
|
||||||
|
|
||||||
public SenTripletsOpponentRevealsHandEffect(final SenTripletsOpponentRevealsHandEffect effect) {
|
private SenTripletsOpponentRevealsHandEffect(final SenTripletsOpponentRevealsHandEffect effect) {
|
||||||
super(effect);
|
super(effect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,10 +127,9 @@ class SenTripletsOpponentRevealsHandEffect extends ContinuousEffectImpl {
|
||||||
|
|
||||||
class SenTripletsPlayFromOpponentsHandEffect extends AsThoughEffectImpl {
|
class SenTripletsPlayFromOpponentsHandEffect extends AsThoughEffectImpl {
|
||||||
|
|
||||||
|
|
||||||
public SenTripletsPlayFromOpponentsHandEffect() {
|
public SenTripletsPlayFromOpponentsHandEffect() {
|
||||||
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
|
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
|
||||||
staticText = "You may play cards from that player's hand this turn";
|
staticText = "You may play cards from that player's hand this turn";
|
||||||
}
|
}
|
||||||
|
|
||||||
public SenTripletsPlayFromOpponentsHandEffect(final SenTripletsPlayFromOpponentsHandEffect effect) {
|
public SenTripletsPlayFromOpponentsHandEffect(final SenTripletsPlayFromOpponentsHandEffect effect) {
|
||||||
|
@ -146,12 +149,16 @@ class SenTripletsPlayFromOpponentsHandEffect extends AsThoughEffectImpl {
|
||||||
@Override
|
@Override
|
||||||
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
|
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
|
||||||
Card card = game.getCard(objectId);
|
Card card = game.getCard(objectId);
|
||||||
return card != null &&
|
Zone zone;
|
||||||
card.isOwnedBy(getTargetPointer().getFirst(game, source)) &&
|
if (card instanceof Spell) {
|
||||||
game.getState().getZone(objectId) == Zone.HAND &&
|
zone = ((Spell) card).getFromZone();
|
||||||
affectedControllerId.equals(source.getControllerId());
|
} else if (card != null) {
|
||||||
|
zone = game.getState().getZone(card.getMainCard().getId());
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return card.isOwnedBy(getTargetPointer().getFirst(game, source))
|
||||||
|
&& zone == Zone.HAND
|
||||||
|
&& source.isControlledBy(affectedControllerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
package org.mage.test.cards.single.arb;
|
||||||
|
|
||||||
|
import mage.constants.PhaseStep;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public class SenTripletsTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
|
private static final String triplets = "Sen Triplets";
|
||||||
|
private static final String bolt = "Lightning Bolt";
|
||||||
|
private static final String relic = "Darksteel Relic";
|
||||||
|
|
||||||
|
private void initTriplets() {
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, triplets);
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Mountain");
|
||||||
|
addCard(Zone.BATTLEFIELD, playerB, "Taiga");
|
||||||
|
addCard(Zone.HAND, playerB, bolt);
|
||||||
|
addCard(Zone.HAND, playerB, relic);
|
||||||
|
addCard(Zone.HAND, playerB, "Island");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCastSpell() {
|
||||||
|
initTriplets();
|
||||||
|
|
||||||
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bolt, playerB);
|
||||||
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, relic);
|
||||||
|
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Island");
|
||||||
|
|
||||||
|
setStopAt(1, PhaseStep.END_TURN);
|
||||||
|
execute();
|
||||||
|
assertAllCommandsUsed();
|
||||||
|
assertPermanentCount(playerA, triplets, 1);
|
||||||
|
assertPermanentCount(playerA, relic, 1);
|
||||||
|
assertPermanentCount(playerA, "Island", 1);
|
||||||
|
assertHandCount(playerB, bolt, 0);
|
||||||
|
assertHandCount(playerB, relic, 0);
|
||||||
|
assertGraveyardCount(playerB, 1);
|
||||||
|
assertLife(playerB, 20 - 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCantActivate() {
|
||||||
|
initTriplets();
|
||||||
|
|
||||||
|
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "{T}");
|
||||||
|
|
||||||
|
setStopAt(1, PhaseStep.END_TURN);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertTapped("Taiga", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCantCast() {
|
||||||
|
initTriplets();
|
||||||
|
|
||||||
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, bolt, playerA);
|
||||||
|
|
||||||
|
setStopAt(1, PhaseStep.END_TURN);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertHandCount(playerB, bolt, 1);
|
||||||
|
assertLife(playerA, 20);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue