mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 10:40:06 -08:00
rework Homicidal Brute to common classes
This commit is contained in:
parent
8a805c62b3
commit
a8f0a545b9
2 changed files with 45 additions and 64 deletions
|
|
@ -1,28 +1,32 @@
|
||||||
|
|
||||||
package mage.cards.h;
|
package mage.cards.h;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.condition.InvertCondition;
|
||||||
|
import mage.abilities.condition.common.AttackedThisTurnSourceCondition;
|
||||||
import mage.abilities.effects.common.TapSourceEffect;
|
import mage.abilities.effects.common.TapSourceEffect;
|
||||||
import mage.abilities.effects.common.TransformSourceEffect;
|
import mage.abilities.effects.common.TransformSourceEffect;
|
||||||
|
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||||
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.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.WatcherScope;
|
|
||||||
import mage.constants.Zone;
|
import java.util.UUID;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.watchers.Watcher;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author nantuko
|
* @author nantuko
|
||||||
*/
|
*/
|
||||||
public final class HomicidalBrute extends CardImpl {
|
public final class HomicidalBrute extends CardImpl {
|
||||||
|
|
||||||
|
private static final Condition condition = new InvertCondition(
|
||||||
|
AttackedThisTurnSourceCondition.instance, "{this} didn't attack this turn"
|
||||||
|
);
|
||||||
|
|
||||||
public HomicidalBrute(UUID ownerId, CardSetInfo setInfo) {
|
public HomicidalBrute(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||||
this.subtype.add(SubType.HUMAN);
|
this.subtype.add(SubType.HUMAN);
|
||||||
this.subtype.add(SubType.MUTANT);
|
this.subtype.add(SubType.MUTANT);
|
||||||
|
|
||||||
|
|
@ -34,7 +38,9 @@ public final class HomicidalBrute extends CardImpl {
|
||||||
this.toughness = new MageInt(1);
|
this.toughness = new MageInt(1);
|
||||||
|
|
||||||
// At the beginning of your end step, if Homicidal Brute didn't attack this turn, tap Homicidal Brute, then transform it.
|
// At the beginning of your end step, if Homicidal Brute didn't attack this turn, tap Homicidal Brute, then transform it.
|
||||||
this.addAbility(new HomicidalBruteTriggeredAbility(), new HomicidalBruteWatcher());
|
TriggeredAbility ability = new BeginningOfEndStepTriggeredAbility(new TapSourceEffect());
|
||||||
|
ability.addEffect(new TransformSourceEffect().setText(", then transform it"));
|
||||||
|
this.addAbility(ability.withInterveningIf(condition));
|
||||||
}
|
}
|
||||||
|
|
||||||
private HomicidalBrute(final HomicidalBrute card) {
|
private HomicidalBrute(final HomicidalBrute card) {
|
||||||
|
|
@ -47,58 +53,3 @@ public final class HomicidalBrute extends CardImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class HomicidalBruteTriggeredAbility extends TriggeredAbilityImpl {
|
|
||||||
|
|
||||||
public HomicidalBruteTriggeredAbility() {
|
|
||||||
super(Zone.BATTLEFIELD, new TapSourceEffect(), false);
|
|
||||||
addEffect(new TransformSourceEffect());
|
|
||||||
}
|
|
||||||
|
|
||||||
private HomicidalBruteTriggeredAbility(final HomicidalBruteTriggeredAbility ability) {
|
|
||||||
super(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public HomicidalBruteTriggeredAbility copy() {
|
|
||||||
return new HomicidalBruteTriggeredAbility(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean checkEventType(GameEvent event, Game game) {
|
|
||||||
return event.getType() == GameEvent.EventType.END_TURN_STEP_PRE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
|
||||||
if (event.getPlayerId().equals(this.controllerId)) {
|
|
||||||
Watcher watcher = game.getState().getWatcher(HomicidalBruteWatcher.class, sourceId);
|
|
||||||
if (watcher == null || !watcher.conditionMet()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getRule() {
|
|
||||||
return "At the beginning of your end step, if {this} didn't attack this turn, tap {this}, then transform it.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HomicidalBruteWatcher extends Watcher {
|
|
||||||
|
|
||||||
public HomicidalBruteWatcher() {
|
|
||||||
super(WatcherScope.CARD);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void watch(GameEvent event, Game game) {
|
|
||||||
if (condition) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED && event.getSourceId().equals(sourceId)) {
|
|
||||||
condition = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -84,4 +84,34 @@ public class HomicidalBruteTest extends CardTestPlayerBase {
|
||||||
assertTapped("Homicidal Brute", true);
|
assertTapped("Homicidal Brute", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCardBlinkNotTransform() {
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Civilized Scholar");
|
||||||
|
addCard(Zone.HAND, playerA, "Sejiri Merfolk");
|
||||||
|
addCard(Zone.HAND, playerA, "Moonmist"); // transform all
|
||||||
|
addCard(Zone.HAND, playerA, "Cloudshift"); // blink
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Savannah", 3);
|
||||||
|
|
||||||
|
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Draw a card, then discard a card.");
|
||||||
|
setChoice(playerA, "Sejiri Merfolk"); // discard creature
|
||||||
|
|
||||||
|
attack(3, playerA, "Homicidal Brute", playerB);
|
||||||
|
castSpell(3, PhaseStep.COMBAT_DAMAGE, playerA, "Cloudshift", "Homicidal Brute");
|
||||||
|
castSpell(3, PhaseStep.END_COMBAT, playerA, "Moonmist");
|
||||||
|
|
||||||
|
checkPermanentTapped("after transform", 3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Homicidal Brute", false, 1);
|
||||||
|
|
||||||
|
setStrictChooseMode(true);
|
||||||
|
setStopAt(4, PhaseStep.UPKEEP);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertGraveyardCount(playerA, "Cloudshift", 1);
|
||||||
|
assertGraveyardCount(playerA, "Moonmist", 1);
|
||||||
|
assertLife(playerA, 20);
|
||||||
|
assertLife(playerB, 15);
|
||||||
|
assertPermanentCount(playerA, "Civilized Scholar", 1);
|
||||||
|
assertPermanentCount(playerA, "Homicidal Brute", 0);
|
||||||
|
assertTapped("Civilized Scholar", true);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue