Skip to content

Commit f114aa6

Browse files
committed
implement [SOS] Slumbering Trudge
1 parent 3b7de4c commit f114aa6

4 files changed

Lines changed: 214 additions & 0 deletions

File tree

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package mage.cards.s;
2+
3+
import mage.MageInt;
4+
import mage.abilities.Ability;
5+
import mage.abilities.common.EntersBattlefieldAbility;
6+
import mage.abilities.condition.Condition;
7+
import mage.abilities.condition.IntCompareCondition;
8+
import mage.abilities.decorator.ConditionalOneShotEffect;
9+
import mage.abilities.dynamicvalue.DynamicValue;
10+
import mage.abilities.dynamicvalue.IntMinusDynamicValue;
11+
import mage.abilities.dynamicvalue.common.GetXValue;
12+
import mage.abilities.effects.common.TapSourceEffect;
13+
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
14+
import mage.cards.CardImpl;
15+
import mage.cards.CardSetInfo;
16+
import mage.constants.CardType;
17+
import mage.constants.ComparisonType;
18+
import mage.constants.SubType;
19+
import mage.counters.CounterType;
20+
import mage.game.Game;
21+
22+
import java.util.UUID;
23+
24+
/**
25+
* @author Susucr
26+
*/
27+
public final class SlumberingTrudge extends CardImpl {
28+
29+
private static final DynamicValue xValue = new IntMinusDynamicValue(3, GetXValue.instance);
30+
private static final Condition condition = new SlumberingTrudgeCondition();
31+
32+
public SlumberingTrudge(UUID ownerId, CardSetInfo setInfo) {
33+
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}");
34+
35+
this.subtype.add(SubType.PLANT);
36+
this.subtype.add(SubType.BEAST);
37+
this.power = new MageInt(6);
38+
this.toughness = new MageInt(6);
39+
40+
// This creature enters with a number of stun counters on it equal to three minus X. If X is 2 or less, it enters tapped.
41+
Ability ability = new EntersBattlefieldAbility(
42+
new AddCountersSourceEffect(CounterType.STUN.createInstance(), xValue, false),
43+
"with a number of stun counters on it equal to three minus X.");
44+
ability.addEffect(new ConditionalOneShotEffect(new TapSourceEffect(true), condition, null));
45+
this.addAbility(ability);
46+
}
47+
48+
private SlumberingTrudge(final SlumberingTrudge card) {
49+
super(card);
50+
}
51+
52+
@Override
53+
public SlumberingTrudge copy() {
54+
return new SlumberingTrudge(this);
55+
}
56+
}
57+
58+
class SlumberingTrudgeCondition extends IntCompareCondition {
59+
60+
SlumberingTrudgeCondition() {
61+
super(ComparisonType.OR_LESS, 2);
62+
}
63+
64+
@Override
65+
protected int getInputValue(Game game, Ability source) {
66+
return GetXValue.instance.calculate(game, source, null);
67+
}
68+
69+
@Override
70+
public String toString() {
71+
return "If X is 2 or less";
72+
}
73+
}

Mage.Sets/src/mage/sets/SecretsOfStrixhaven.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,8 @@ private SecretsOfStrixhaven() {
275275
cards.add(new SetCardInfo("Skycoach Conductor", 322, Rarity.RARE, mage.cards.s.SkycoachConductor.class, NON_FULL_USE_VARIOUS));
276276
cards.add(new SetCardInfo("Skycoach Conductor", 67, Rarity.RARE, mage.cards.s.SkycoachConductor.class, NON_FULL_USE_VARIOUS));
277277
cards.add(new SetCardInfo("Skycoach Waypoint", 261, Rarity.UNCOMMON, mage.cards.s.SkycoachWaypoint.class));
278+
cards.add(new SetCardInfo("Slumbering Trudge", 160, Rarity.RARE, mage.cards.s.SlumberingTrudge.class, NON_FULL_USE_VARIOUS));
279+
cards.add(new SetCardInfo("Slumbering Trudge", 341, Rarity.RARE, mage.cards.s.SlumberingTrudge.class, NON_FULL_USE_VARIOUS));
278280
cards.add(new SetCardInfo("Snarl Song", 161, Rarity.UNCOMMON, mage.cards.s.SnarlSong.class));
279281
cards.add(new SetCardInfo("Sneering Shadewriter", 101, Rarity.COMMON, mage.cards.s.SneeringShadewriter.class));
280282
cards.add(new SetCardInfo("Snooping Page", 227, Rarity.UNCOMMON, mage.cards.s.SnoopingPage.class));
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package org.mage.test.cards.single.sos;
2+
3+
import mage.constants.PhaseStep;
4+
import mage.constants.Zone;
5+
import mage.counters.CounterType;
6+
import org.junit.Test;
7+
import org.mage.test.serverside.base.CardTestPlayerBase;
8+
9+
/**
10+
* @author Susucr
11+
*/
12+
public class SlumberingTrudgeTest extends CardTestPlayerBase {
13+
14+
/**
15+
* {@link mage.cards.s.SlumberingTrudge Slumbering Trudge} Slumbering Trudge {X}{G}
16+
* Creature — Plant Beast
17+
* This creature enters with a number of stun counters on it equal to three minus X. If X is 2 or less, it enters tapped. (If a permanent with a stun counter would become untapped, remove one from it instead.)
18+
* 6/6
19+
*/
20+
private static final String trudge = "Slumbering Trudge";
21+
22+
@Test
23+
public void test_X_0() {
24+
addCard(Zone.HAND, playerA, trudge, 1);
25+
addCard(Zone.BATTLEFIELD, playerA, "Forest", 4);
26+
27+
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, trudge);
28+
setChoice(playerA, "X=0");
29+
30+
setStopAt(1, PhaseStep.BEGIN_COMBAT);
31+
setStrictChooseMode(true);
32+
execute();
33+
34+
assertPermanentCount(playerA, trudge, 1);
35+
assertTapped(trudge, true);
36+
assertCounterCount(playerA, trudge, CounterType.STUN, 3);
37+
}
38+
39+
@Test
40+
public void test_X_1() {
41+
addCard(Zone.HAND, playerA, trudge, 1);
42+
addCard(Zone.BATTLEFIELD, playerA, "Forest", 4);
43+
44+
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, trudge);
45+
setChoice(playerA, "X=1");
46+
47+
setStopAt(1, PhaseStep.BEGIN_COMBAT);
48+
setStrictChooseMode(true);
49+
execute();
50+
51+
assertPermanentCount(playerA, trudge, 1);
52+
assertTapped(trudge, true);
53+
assertCounterCount(playerA, trudge, CounterType.STUN, 2);
54+
}
55+
56+
@Test
57+
public void test_X_2() {
58+
addCard(Zone.HAND, playerA, trudge, 1);
59+
addCard(Zone.BATTLEFIELD, playerA, "Forest", 4);
60+
61+
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, trudge);
62+
setChoice(playerA, "X=2");
63+
64+
setStopAt(1, PhaseStep.BEGIN_COMBAT);
65+
setStrictChooseMode(true);
66+
execute();
67+
68+
assertPermanentCount(playerA, trudge, 1);
69+
assertTapped(trudge, true);
70+
assertCounterCount(playerA, trudge, CounterType.STUN, 1);
71+
}
72+
73+
@Test
74+
public void test_X_3() {
75+
addCard(Zone.HAND, playerA, trudge, 1);
76+
addCard(Zone.BATTLEFIELD, playerA, "Forest", 4);
77+
78+
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, trudge);
79+
setChoice(playerA, "X=3");
80+
81+
setStopAt(1, PhaseStep.BEGIN_COMBAT);
82+
setStrictChooseMode(true);
83+
execute();
84+
85+
assertPermanentCount(playerA, trudge, 1);
86+
assertTapped(trudge, false);
87+
assertCounterCount(playerA, trudge, CounterType.STUN, 0);
88+
}
89+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
2+
package mage.abilities.dynamicvalue;
3+
4+
import mage.abilities.Ability;
5+
import mage.abilities.effects.Effect;
6+
import mage.game.Game;
7+
8+
/**
9+
* @author Susucr
10+
*/
11+
public class IntMinusDynamicValue implements DynamicValue {
12+
13+
private final DynamicValue value;
14+
private final int baseValue;
15+
16+
public IntMinusDynamicValue(int baseValue, DynamicValue value) {
17+
this.value = value;
18+
this.baseValue = baseValue;
19+
}
20+
21+
IntMinusDynamicValue(final IntMinusDynamicValue dynamicValue) {
22+
this.value = dynamicValue.value;
23+
this.baseValue = dynamicValue.baseValue;
24+
}
25+
26+
@Override
27+
public int calculate(Game game, Ability sourceAbility, Effect effect) {
28+
return baseValue - value.calculate(game, sourceAbility, effect);
29+
}
30+
31+
@Override
32+
public IntMinusDynamicValue copy() {
33+
return new IntMinusDynamicValue(this);
34+
}
35+
36+
@Override
37+
public String toString() {
38+
return baseValue + " minus " + value.toString();
39+
}
40+
41+
@Override
42+
public String getMessage() {
43+
return baseValue + " minus " + value.getMessage();
44+
}
45+
46+
@Override
47+
public int getSign() {
48+
return value.getSign();
49+
}
50+
}

0 commit comments

Comments
 (0)