magarena/src/magic/model/action/MagicPlayMod.java

186 lines
7.0 KiB
Java
Raw Normal View History

package magic.model.action;
2015-01-20 02:41:48 -08:00
import java.util.List;
import java.util.LinkedList;
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;
import magic.model.MagicCounterType;
2015-01-20 02:41:48 -08:00
import magic.model.MagicManaCost;
import magic.model.MagicSource;
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;
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") {
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") {
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") {
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") {
protected void doAction(final MagicGame game, final MagicPermanent perm) {
game.doAction(new MagicAddTriggerAction(perm, MagicAtEndOfTurnTrigger.Sacrifice));
}
},
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") {
protected void doAction(final MagicGame game, final MagicPermanent perm) {
perm.setState(MagicPermanentState.Attacking);
}
},
2015-04-10 22:43:42 -07:00
TAPPED("tapped") {
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") {
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") {
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);
}
},
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
}
},
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);
}
},
NONE() {
protected void doAction(final MagicGame game, final MagicPermanent perm) {
}
},
;
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;
}
public void doAction(final MagicPermanent perm) {
doAction(perm.getGame(), perm);
}
abstract protected void doAction(final MagicGame game, final MagicPermanent perm);
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];
final List<MagicPlayMod> mods = new LinkedList<>();
for (final String name : tokens) {
mods.add(MagicPlayMod.getPlayMod(name));
}
return mods;
}
}