-
Notifications
You must be signed in to change notification settings - Fork 889
Expand file tree
/
Copy pathShredderShadowMaster.java
More file actions
144 lines (122 loc) · 5.33 KB
/
ShredderShadowMaster.java
File metadata and controls
144 lines (122 loc) · 5.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package mage.cards.s;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.effects.common.LoseHalfLifeTargetEffect;
import mage.abilities.effects.common.SacrificeTargetEffect;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
import mage.target.targetpointer.FixedTargets;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
/**
*
* @author muz
*/
public final class ShredderShadowMaster extends CardImpl {
public ShredderShadowMaster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.NINJA);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
// Whenever Shredder attacks a player, for each other opponent, create a token that's a copy of Shredder tapped and attacking that player, except it isn't legendary. Sacrifice those tokens at end of combat.
this.addAbility(new ShredderShadowMasterTriggeredAbility());
// Whenever Shredder deals combat damage to a player, that player loses half their life, rounded up.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new LoseHalfLifeTargetEffect(), false, true));
}
private ShredderShadowMaster(final ShredderShadowMaster card) {
super(card);
}
@Override
public ShredderShadowMaster copy() {
return new ShredderShadowMaster(this);
}
}
class ShredderShadowMasterTriggeredAbility extends TriggeredAbilityImpl {
ShredderShadowMasterTriggeredAbility() {
super(Zone.BATTLEFIELD, new ShredderShadowMasterEffect());
setTriggerPhrase("Whenever {this} attacks a player, ");
}
private ShredderShadowMasterTriggeredAbility(final ShredderShadowMasterTriggeredAbility ability) {
super(ability);
}
@Override
public ShredderShadowMasterTriggeredAbility copy() {
return new ShredderShadowMasterTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Player player = game.getPlayer(game.getCombat().getDefenderId(this.getSourceId()));
if (player == null) {
return false;
}
this.getEffects().setTargetPointer(new FixedTarget(player.getId()));
return true;
}
}
class ShredderShadowMasterEffect extends OneShotEffect {
public ShredderShadowMasterEffect() {
super(Outcome.Benefit);
this.staticText = "for each opponent, create a token that's a copy of {this} "
+ "tapped and attacking that player, except it isn't legendary. "
+ "Sacrifice those tokens at the end of combat";
}
protected ShredderShadowMasterEffect(final ShredderShadowMasterEffect effect) {
super(effect);
}
@Override
public ShredderShadowMasterEffect copy() {
return new ShredderShadowMasterEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (controller == null || sourceObject == null) {
return false;
}
UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(source.getSourceId(), game);
if (defendingPlayerId == null) {
return false;
}
List<Permanent> tokens = new ArrayList<>();
for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
if (!playerId.equals(defendingPlayerId) && controller.hasOpponent(playerId, game)) {
Player opponent = game.getPlayer(playerId);
if (opponent != null) {
CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(controller.getId(), null, false, 1, true, true, playerId).setIsntLegendary(true);
effect.setTargetPointer(new FixedTarget(sourceObject, game));
effect.apply(game, source);
tokens.addAll(effect.getAddedPermanents());
}
}
}
if (!tokens.isEmpty()) {
SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice those tokens");
sacrificeEffect.setTargetPointer(new FixedTargets(new ArrayList<>(tokens), game));
game.addDelayedTriggeredAbility(new AtTheEndOfCombatDelayedTriggeredAbility(sacrificeEffect), source);
}
return true;
}
}