2013-07-09 23:26:56 -07:00
|
|
|
package magic.model.action;
|
|
|
|
|
2015-01-20 02:41:48 -08:00
|
|
|
import java.util.List;
|
|
|
|
import java.util.LinkedList;
|
|
|
|
|
2014-07-27 18:59:45 -07:00
|
|
|
import magic.model.MagicGame;
|
|
|
|
import magic.model.MagicPlayer;
|
|
|
|
import magic.model.MagicPermanent;
|
|
|
|
import magic.model.MagicPermanentState;
|
|
|
|
import magic.model.MagicAbility;
|
2015-01-20 02:41:48 -08:00
|
|
|
import magic.model.MagicAbilityList;
|
2014-07-27 18:59:45 -07:00
|
|
|
import magic.model.MagicCounterType;
|
2015-01-20 02:41:48 -08:00
|
|
|
import magic.model.MagicManaCost;
|
|
|
|
import magic.model.MagicSource;
|
2014-07-27 18:59:45 -07:00
|
|
|
import magic.model.mstatic.MagicStatic;
|
|
|
|
import magic.model.trigger.MagicAtEndOfCombatTrigger;
|
|
|
|
import magic.model.trigger.MagicAtEndOfTurnTrigger;
|
|
|
|
import magic.model.trigger.MagicWhenLeavesPlayTrigger;
|
2015-01-20 02:41:48 -08:00
|
|
|
import magic.model.event.MagicEvent;
|
|
|
|
import magic.model.event.MagicMorphActivation;
|
|
|
|
import magic.model.event.MagicMatchedCostEvent;
|
|
|
|
import magic.model.event.MagicPayManaCostEvent;
|
2014-07-27 18:59:45 -07:00
|
|
|
|
|
|
|
public enum MagicPlayMod implements MagicPermanentAction {
|
2015-04-10 22:43:42 -07:00
|
|
|
EXILE_AT_END_OF_COMBAT("Exile that token at end of combat") {
|
2014-07-27 18:59:45 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddTriggerAction(perm, MagicAtEndOfCombatTrigger.Exile));
|
|
|
|
}
|
|
|
|
},
|
2015-04-11 02:26:46 -07:00
|
|
|
EXILE_AT_END_OF_TURN("Exile it at the beginning of the next end step") {
|
2014-07-27 18:59:45 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddTriggerAction(perm, MagicAtEndOfTurnTrigger.ExileAtEnd));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
EXILE_AT_END_OF_YOUR_TURN() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
final MagicPlayer controller = perm.getController();
|
|
|
|
game.doAction(new MagicAddTriggerAction(perm, MagicAtEndOfTurnTrigger.ExileAtYourEnd(controller)));
|
|
|
|
}
|
|
|
|
},
|
2015-04-11 02:26:46 -07:00
|
|
|
EXILE_WHEN_LEAVES("If it would leave the battlefield, exile it instead of putting it anywhere else") {
|
2014-07-27 18:59:45 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddTriggerAction(perm, MagicWhenLeavesPlayTrigger.Exile));
|
|
|
|
}
|
|
|
|
},
|
2015-04-11 02:26:46 -07:00
|
|
|
SACRIFICE_AT_END_OF_TURN("Sacrifice it at the beginning of the next end step") {
|
2014-07-27 18:59:45 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddTriggerAction(perm, MagicAtEndOfTurnTrigger.Sacrifice));
|
|
|
|
}
|
|
|
|
},
|
2015-01-18 17:06:16 -08:00
|
|
|
RETURN_AT_END_OF_TURN() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddTriggerAction(perm, MagicAtEndOfTurnTrigger.Return));
|
|
|
|
}
|
|
|
|
},
|
2015-04-10 22:43:42 -07:00
|
|
|
ATTACKING("attacking") {
|
2014-07-27 18:59:45 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
perm.setState(MagicPermanentState.Attacking);
|
|
|
|
}
|
|
|
|
},
|
2015-04-10 22:43:42 -07:00
|
|
|
TAPPED("tapped") {
|
2014-07-27 18:59:45 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
perm.setState(MagicPermanentState.Tapped);
|
|
|
|
}
|
|
|
|
},
|
2015-04-11 02:26:46 -07:00
|
|
|
HASTE_UEOT("it gains haste until end of turn") {
|
2014-07-27 18:59:45 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicGainAbilityAction(perm, MagicAbility.Haste));
|
|
|
|
}
|
|
|
|
},
|
2015-04-11 02:26:46 -07:00
|
|
|
HASTE("it gains haste") {
|
2014-07-27 18:59:45 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicGainAbilityAction(perm, MagicAbility.Haste, MagicStatic.Forever));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
PERSIST() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
perm.changeCounters(MagicCounterType.MinusOne,1);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
UNDYING() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
perm.changeCounters(MagicCounterType.PlusOne,1);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
BLACK() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddStaticAction(perm, MagicStatic.Black));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
ZOMBIE() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddStaticAction(perm, MagicStatic.Zombie));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
NIGHTMARE() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddStaticAction(perm, MagicStatic.Nightmare));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
BESTOWED() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
game.doAction(new MagicAddStaticAction(perm, MagicStatic.Bestowed));
|
|
|
|
}
|
|
|
|
},
|
2015-01-20 02:41:48 -08:00
|
|
|
MANIFEST() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
if (perm.isCreature()) {
|
|
|
|
final MagicManaCost manaCost = perm.getCardDefinition().getCost();
|
|
|
|
final MagicAbilityList morphAct = new MagicAbilityList();
|
|
|
|
final List<MagicMatchedCostEvent> cost = new LinkedList<>();
|
|
|
|
cost.add(new MagicMatchedCostEvent() {
|
|
|
|
public MagicEvent getEvent(final MagicSource source) {
|
|
|
|
return new MagicPayManaCostEvent(source, manaCost);
|
|
|
|
}
|
|
|
|
public boolean isIndependent() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
morphAct.add(new MagicMorphActivation(cost));
|
|
|
|
game.doAction(new MagicGainAbilityAction(perm, morphAct, MagicStatic.Forever));
|
|
|
|
}
|
|
|
|
perm.setState(MagicPermanentState.FaceDown);
|
|
|
|
}
|
|
|
|
},
|
2014-08-03 05:11:17 -07:00
|
|
|
MORPH() {
|
2014-07-28 04:57:19 -07:00
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
2014-07-31 09:32:22 -07:00
|
|
|
perm.setState(MagicPermanentState.FaceDown);
|
2014-07-28 04:57:19 -07:00
|
|
|
}
|
|
|
|
},
|
2014-08-05 15:04:25 -07:00
|
|
|
FLIPPED() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
perm.setState(MagicPermanentState.Flipped);
|
|
|
|
}
|
|
|
|
},
|
2014-08-06 09:16:00 -07:00
|
|
|
TRANSFORMED() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
perm.setState(MagicPermanentState.Transformed);
|
|
|
|
}
|
|
|
|
},
|
2014-07-27 18:59:45 -07:00
|
|
|
NONE() {
|
|
|
|
protected void doAction(final MagicGame game, final MagicPermanent perm) {
|
|
|
|
}
|
|
|
|
},
|
|
|
|
;
|
2015-04-10 22:14:13 -07:00
|
|
|
|
2015-04-10 22:43:42 -07:00
|
|
|
final String text;
|
|
|
|
|
|
|
|
private MagicPlayMod(final String name) {
|
|
|
|
text = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
private MagicPlayMod() {
|
|
|
|
this("");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
|
|
|
return text;
|
|
|
|
}
|
|
|
|
|
2014-07-27 18:59:45 -07:00
|
|
|
public void doAction(final MagicPermanent perm) {
|
|
|
|
doAction(perm.getGame(), perm);
|
|
|
|
}
|
|
|
|
|
|
|
|
abstract protected void doAction(final MagicGame game, final MagicPermanent perm);
|
2015-04-10 22:14:13 -07:00
|
|
|
|
|
|
|
public static MagicPlayMod getPlayMod(final String name) {
|
|
|
|
for (final MagicPlayMod mod : values()) {
|
|
|
|
if (mod.toString().equalsIgnoreCase(name)) {
|
|
|
|
return mod;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
throw new RuntimeException("unknown play mod \"" + name + "\"");
|
|
|
|
}
|
|
|
|
|
|
|
|
public static List<MagicPlayMod> build(final String text) {
|
2015-04-11 03:23:59 -07:00
|
|
|
final String[] tokens = text != null ? text.split("\\. | and ") : new String[0];
|
2015-04-10 22:14:13 -07:00
|
|
|
final List<MagicPlayMod> mods = new LinkedList<>();
|
|
|
|
for (final String name : tokens) {
|
|
|
|
mods.add(MagicPlayMod.getPlayMod(name));
|
|
|
|
}
|
|
|
|
return mods;
|
|
|
|
}
|
2013-07-09 23:26:56 -07:00
|
|
|
}
|