both MagicPlayCardAction and MagicPlayTokenAction takes into account replacement of MagicSpellCardEvent by making use of event from MagicCardOnstack

master
melvinzhang 2015-01-24 17:18:22 +08:00
parent fac19e5692
commit 95627f0cfe
12 changed files with 197 additions and 199 deletions

View File

@ -13,30 +13,33 @@
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicPlayTokenAction act = new MagicPlayTokenAction(
final MagicPermanent rn = event.getRefPermanent();
game.doAction(new MagicPlayTokenAction(
event.getPlayer(),
TokenCardDefinitions.get("2/2 white Cat creature token")
);
game.doAction(act);
final MagicPermanent token = act.getPermanent();
final MagicPermanent enchantment = event.getRefPermanent();
if (enchantment.isAura()) {
game.addEvent(new MagicEvent(
enchantment,
new MagicMayChoice("Attach ${enchantment} to ${token}?"),
token,
{
final MagicGame G, final MagicEvent E ->
if (E.isYes()) {
G.doAction(new MagicAttachAction(
E.getPermanent(),
E.getRefPermanent()
));
}
},
"You may\$ attach SN to RN."
));
}
TokenCardDefinitions.get("2/2 white Cat creature token"),
{
final MagicPermanent token ->
final MagicGame G1 = token.getGame();
final MagicPermanent enchantment = rn.map(G1);
if (enchantment.isAura()) {
G1.addEvent(new MagicEvent(
enchantment,
new MagicMayChoice("Attach ${enchantment} to ${token}?"),
token,
{
final MagicGame G2, final MagicEvent E ->
if (E.isYes()) {
G2.doAction(new MagicAttachAction(
E.getPermanent(),
E.getRefPermanent()
));
}
},
"You may\$ attach SN to RN."
));
}
}
));
}
}
]

View File

@ -38,13 +38,16 @@
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicPlayer player=event.getPlayer();
final MagicPlayTokenAction act = new MagicPlayTokenAction(
player,
TokenCardDefinitions.get("1/1 white Cat Soldier creature token with vigilance")
);
game.doAction(act);
game.doAction(new MagicSetBlockerAction(event.getRefPermanent(), act.getPermanent()));
final rn = event.getRefPermanent();
game.doAction(new MagicPlayTokenAction(
event.getPlayer(),
TokenCardDefinitions.get("1/1 white Cat Soldier creature token with vigilance"),
{
final MagicPermanent perm ->
final MagicGame G = perm.getGame();
G.doAction(new MagicSetBlockerAction(rn.map(G), perm));
}
));
}
}
]

View File

@ -19,10 +19,13 @@
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.isYes()) {
event.processTargetCard(game, {
final MagicPermanent sn = event.getPermanent();
game.doAction(new MagicRemoveCardAction(it,MagicLocationType.OwnersHand));
final MagicPlayCardAction action = new MagicPlayCardAction(it,event.getPlayer());
game.doAction(action);
game.doAction(new MagicAttachAction(event.getPermanent(),action.getPermanent()));
game.doAction(new MagicPlayCardAction(it,event.getPlayer(), {
final MagicPermanent perm ->
final MagicGame G = perm.getGame();
G.doAction(new MagicAttachAction(sn.map(G), perm));
}));
});
}
}

View File

@ -16,12 +16,13 @@
public void executeEvent(final MagicGame game, final MagicEvent event) {
event.processTargetCard(game, {
game.doAction(new MagicRemoveCardAction(it,MagicLocationType.Graveyard));
final MagicPlayCardAction action = new MagicPlayCardAction(it,event.getPlayer());
game.doAction(action);
final MagicPermanent permanent = action.getPermanent();
if (permanent.hasSubType(MagicSubType.Angel)) {
game.doAction(new MagicChangeCountersAction(permanent,MagicCounterType.PlusOne,2));
}
game.doAction(new MagicPlayCardAction(it,event.getPlayer(), {
final MagicPermanent perm ->
final MagicGame G = perm.getGame();
if (perm.hasSubType(MagicSubType.Angel)) {
G.doAction(new MagicChangeCountersAction(perm,MagicCounterType.PlusOne,2));
}
}));
});
}
}

View File

@ -30,15 +30,18 @@ def HAS_ALL_KALDRA_EQUIPMENT = new MagicCondition() {
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicPutIntoPlayAction action = new MagicPlayTokenAction(
final int pIdx = event.getPlayer().getIndex();
game.doAction(new MagicPlayTokenAction(
event.getPlayer(),
TokenCardDefinitions.get("legendary 4/4 colorless Avatar creature token named Kaldra")
);
game.doAction(action);
final MagicPermanent kaldra = action.getPermanent();
for (final equip : game.filterPermanents(event.getPlayer(), MagicTargetFilterFactory.KALDRA_EQUIPMENT)) {
game.doAction(new MagicAttachAction(equip, kaldra));
}
TokenCardDefinitions.get("legendary 4/4 colorless Avatar creature token named Kaldra"),
{
final MagicPermanent perm ->
final MagicGame G = perm.getGame();
for (final MagicPermanent equip : G.filterPermanents(G.getPlayer(pIdx), MagicTargetFilterFactory.KALDRA_EQUIPMENT)) {
G.doAction(new MagicAttachAction(equip, perm));
}
}
));
}
}
]

View File

@ -15,10 +15,11 @@
public void executeEvent(final MagicGame game, final MagicEvent event) {
event.processTargetCard(game, {
game.doAction(new MagicRemoveCardAction(it,MagicLocationType.Graveyard));
final MagicPlayCardAction action = new MagicPlayCardAction(it,event.getPlayer());
game.doAction(action);
final MagicPermanent permanent = action.getPermanent();
game.doAction(new MagicChangeCountersAction(permanent,MagicCounterType.PlusOne,1));
game.doAction(new MagicPlayCardAction(it,event.getPlayer(),{
final MagicPermanent perm ->
final MagicGame G = perm.getGame();
G.doAction(new MagicChangeCountersAction(perm,MagicCounterType.PlusOne,1));
}));
});
}
}

View File

@ -11,15 +11,16 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class MagicPlayCardAction extends MagicPutIntoPlayAction {
public class MagicPlayCardAction extends MagicAction {
private final MagicCard card;
private final MagicPlayer controller;
private final List<? extends MagicPermanentAction> modifications;
public MagicPlayCardAction(final MagicCard aCard, final MagicPlayer aController,final List<? extends MagicPermanentAction> aModifications) {
card = aCard;
controller = aController;
setModifications(aModifications);
modifications = aModifications;
}
public MagicPlayCardAction(final MagicCard aCard, final MagicPlayer aController,final MagicPermanentAction... aModifications) {
@ -39,17 +40,11 @@ public class MagicPlayCardAction extends MagicPutIntoPlayAction {
}
@Override
protected MagicPermanent createPermanent(final MagicGame game) {
return game.createPermanent(card,controller);
public void doAction(final MagicGame game) {
final MagicCardOnStack cardOnStack = new MagicCardOnStack(card, controller, MagicPayedCost.NOT_SPELL, modifications);
game.addEvent(cardOnStack.getEvent());
}
@Override
public void doAction(final MagicGame game) {
if (card.getCardDefinition().isAura()) {
final MagicCardOnStack cardOnStack = new MagicCardOnStack(card, controller, MagicPayedCost.NOT_SPELL);
game.addEvent(cardOnStack.getEvent());
} else {
super.doAction(game);
}
}
public void undoAction(final MagicGame game) {}
}

View File

@ -1,25 +1,36 @@
package magic.model.action;
import magic.ai.ArtificialScoringSystem;
import magic.model.MagicPayedCost;
import magic.model.MagicCardDefinition;
import magic.model.MagicGame;
import magic.model.MagicLocationType;
import magic.model.MagicObject;
import magic.model.MagicPermanent;
import magic.model.stack.MagicCardOnStack;
import magic.model.trigger.MagicTrigger;
import magic.model.trigger.MagicTriggerType;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;
public class MagicPlayCardFromStackAction extends MagicPutIntoPlayAction {
public class MagicPlayCardFromStackAction extends MagicAction {
private final MagicCardOnStack cardOnStack;
private final MagicCardDefinition cardDef;
private MagicPermanent permanent = MagicPermanent.NONE;
private MagicPermanent enchantedPermanent = MagicPermanent.NONE;
private MagicPayedCost payedCost = MagicPayedCost.NO_COST;
private boolean validEnchanted = false;
private List<? extends MagicPermanentAction> modifications = Collections.<MagicPermanentAction>emptyList();
public MagicPlayCardFromStackAction(final MagicCardOnStack aCardOnStack, final MagicCardDefinition aCardDef, final List<? extends MagicPermanentAction> aModifications) {
cardOnStack = aCardOnStack;
cardDef = aCardDef;
setPayedCost(aCardOnStack.getPayedCost());
setModifications(aModifications);
cardDef = aCardDef;
payedCost = aCardOnStack.getPayedCost();
modifications = aModifications;
}
public MagicPlayCardFromStackAction(final MagicCardOnStack aCardOnStack, final MagicCardDefinition aCardDef, final MagicPermanentAction... aModifications) {
@ -30,9 +41,9 @@ public class MagicPlayCardFromStackAction extends MagicPutIntoPlayAction {
this(aCardOnStack, aCardOnStack.getCardDefinition(), aModifications);
}
public MagicPlayCardFromStackAction(final MagicCardOnStack cardOnStack, final MagicPermanent enchantedPermanent, final MagicPermanentAction... aModifications) {
public MagicPlayCardFromStackAction(final MagicCardOnStack cardOnStack, final MagicPermanent aEnchantedPermanent, final MagicPermanentAction... aModifications) {
this(cardOnStack, aModifications);
setEnchantedPermanent(enchantedPermanent);
enchantedPermanent = aEnchantedPermanent;
}
static final public MagicPlayCardFromStackAction EnterAsCopy(final MagicCardOnStack cardOnStack, final MagicObject obj) {
@ -43,9 +54,79 @@ public class MagicPlayCardFromStackAction extends MagicPutIntoPlayAction {
return new MagicPlayCardFromStackAction(cardOnStack, obj.getCardDefinition(), aModifications);
}
@Override
protected MagicPermanent createPermanent(final MagicGame game) {
cardOnStack.setMoveLocation(MagicLocationType.Play);
return game.createPermanent(cardOnStack.getCard(),cardDef,cardOnStack.getController());
}
@Override
public void doAction(final MagicGame game) {
permanent=createPermanent(game);
permanent.getFirstController().addPermanent(permanent);
game.update();
final int score=ArtificialScoringSystem.getTurnScore(game)-permanent.getStaticScore();
validEnchanted = enchantedPermanent.isValid();
if (validEnchanted) {
enchantedPermanent.addAura(permanent);
permanent.setEnchantedPermanent(enchantedPermanent);
}
//execute comes into play with
for (final MagicTrigger<MagicPayedCost> trigger : permanent.getComeIntoPlayTriggers()) {
if (trigger.getPriority() == MagicTrigger.REPLACEMENT) {
game.executeTrigger(trigger,permanent,permanent,payedCost);
}
}
//comes into play with
for (final MagicPermanentAction action : modifications) {
action.doAction(permanent);
}
for (final MagicPermanentAction action : cardOnStack.getModifications()) {
action.doAction(permanent);
}
game.addStatics(permanent);
game.update();
//execute come into play triggers
for (final MagicTrigger<MagicPayedCost> trigger : permanent.getComeIntoPlayTriggers()) {
if (trigger.getPriority() > MagicTrigger.REPLACEMENT) {
game.executeTrigger(trigger,permanent,permanent,payedCost);
}
}
//execute other come into player triggers
game.executeTrigger(MagicTriggerType.WhenOtherComesIntoPlay,permanent);
setScore(permanent.getController(),permanent.getScore()+permanent.getStaticScore()+score);
game.checkUniquenessRule(permanent);
game.setStateCheckRequired();
}
@Override
public void undoAction(final MagicGame game) {
// for change of control Auras, enchantedPermanent.isValid is false as
// change of control action is undone. Thus we store the validity in
// variable validEnchanted during doAction.
if (validEnchanted) {
enchantedPermanent.removeAura(permanent);
permanent.setEnchantedPermanent(MagicPermanent.NONE);
}
permanent.getFirstController().removePermanent(permanent);
game.removeTriggers(permanent);
game.removeAllStatics(permanent);
}
@Override
public String toString() {
if (enchantedPermanent.isValid()) {
return getClass().getSimpleName()+" ("+permanent+','+enchantedPermanent+')';
} else {
return getClass().getSimpleName()+" ("+permanent+')';
}
}
}

View File

@ -6,17 +6,26 @@ import magic.model.MagicGame;
import magic.model.MagicObject;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.MagicPayedCost;
import magic.model.stack.MagicCardOnStack;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class MagicPlayTokenAction extends MagicPutIntoPlayAction {
public class MagicPlayTokenAction extends MagicAction {
private final MagicCard card;
private final List<? extends MagicPermanentAction> modifications;
public MagicPlayTokenAction(final MagicPlayer player,final MagicCardDefinition cardDefinition, final List<? extends MagicPermanentAction> aModifications) {
card=MagicCard.createTokenCard(cardDefinition,player);
setModifications(aModifications);
card = MagicCard.createTokenCard(cardDefinition,player);
modifications = aModifications;
}
public MagicPlayTokenAction(final MagicCard aCard) {
card = aCard;
modifications = Collections.<MagicPermanentAction>emptyList();
}
public MagicPlayTokenAction(final MagicPlayer player,final MagicCardDefinition cardDefinition) {
@ -39,12 +48,12 @@ public class MagicPlayTokenAction extends MagicPutIntoPlayAction {
this(player, obj.getCardDefinition(), Arrays.asList(aModifications));
}
public MagicPlayTokenAction(final MagicCard aCard) {
card=aCard;
@Override
public void doAction(final MagicGame game) {
final MagicCardOnStack cardOnStack = new MagicCardOnStack(card, card.getController(), MagicPayedCost.NOT_SPELL, modifications);
game.addEvent(cardOnStack.getEvent());
}
@Override
protected MagicPermanent createPermanent(final MagicGame game) {
return game.createPermanent(card,card.getController());
}
public void undoAction(final MagicGame game) {}
}

View File

@ -1,106 +0,0 @@
package magic.model.action;
import magic.ai.ArtificialScoringSystem;
import magic.model.MagicGame;
import magic.model.MagicPayedCost;
import magic.model.MagicPermanent;
import magic.model.trigger.MagicTrigger;
import magic.model.trigger.MagicTriggerType;
import java.util.Collections;
import java.util.List;
public abstract class MagicPutIntoPlayAction extends MagicAction {
private MagicPermanent permanent = MagicPermanent.NONE;
private MagicPermanent enchantedPermanent = MagicPermanent.NONE;
private MagicPayedCost payedCost = MagicPayedCost.NO_COST;
private boolean validEnchanted = false;
private List<? extends MagicPermanentAction> modifications = Collections.<MagicPermanentAction>emptyList();
@Override
public void doAction(final MagicGame game) {
permanent=createPermanent(game);
permanent.getFirstController().addPermanent(permanent);
game.update();
final int score=ArtificialScoringSystem.getTurnScore(game)-permanent.getStaticScore();
validEnchanted = enchantedPermanent.isValid();
if (validEnchanted) {
enchantedPermanent.addAura(permanent);
permanent.setEnchantedPermanent(enchantedPermanent);
}
//execute comes into play with
for (final MagicTrigger<MagicPayedCost> trigger : permanent.getComeIntoPlayTriggers()) {
if (trigger.getPriority() == MagicTrigger.REPLACEMENT) {
game.executeTrigger(trigger,permanent,permanent,payedCost);
}
}
//comes into play with
for (final MagicPermanentAction action : modifications) {
action.doAction(permanent);
}
game.addStatics(permanent);
game.update();
//execute come into play triggers
for (final MagicTrigger<MagicPayedCost> trigger : permanent.getComeIntoPlayTriggers()) {
if (trigger.getPriority() > MagicTrigger.REPLACEMENT) {
game.executeTrigger(trigger,permanent,permanent,payedCost);
}
}
//execute other come into player triggers
game.executeTrigger(MagicTriggerType.WhenOtherComesIntoPlay,permanent);
setScore(permanent.getController(),permanent.getScore()+permanent.getStaticScore()+score);
game.checkUniquenessRule(permanent);
game.setStateCheckRequired();
}
@Override
public void undoAction(final MagicGame game) {
// for change of control Auras, enchantedPermanent.isValid is false as
// change of control action is undone. Thus we store the validity in
// variable validEnchanted during doAction.
if (validEnchanted) {
enchantedPermanent.removeAura(permanent);
permanent.setEnchantedPermanent(MagicPermanent.NONE);
}
permanent.getFirstController().removePermanent(permanent);
game.removeTriggers(permanent);
game.removeAllStatics(permanent);
}
void setEnchantedPermanent(final MagicPermanent aEnchantedPermanent) {
enchantedPermanent = aEnchantedPermanent;
}
void setPayedCost(final MagicPayedCost aPayedCost) {
payedCost = aPayedCost;
}
void setModifications(final List<? extends MagicPermanentAction> aModifications) {
modifications = aModifications;
}
protected abstract MagicPermanent createPermanent(final MagicGame game);
public MagicPermanent getPermanent() {
return permanent;
}
@Override
public String toString() {
if (enchantedPermanent.isValid()) {
return getClass().getSimpleName()+" ("+permanent+','+enchantedPermanent+')';
} else {
return getClass().getSimpleName()+" ("+permanent+')';
}
}
}

View File

@ -6,6 +6,7 @@ import magic.model.MagicPayedCost;
import magic.model.MagicPermanent;
import magic.model.action.MagicAttachAction;
import magic.model.action.MagicPlayTokenAction;
import magic.model.action.MagicPermanentAction;
import magic.model.event.MagicEvent;
/**
@ -32,19 +33,20 @@ public class MagicLivingWeaponTrigger extends MagicWhenComesIntoPlayTrigger {
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
//create the token
final MagicPlayTokenAction play_token=new MagicPlayTokenAction(
final MagicPermanent sn = event.getPermanent();
game.doAction(new MagicPlayTokenAction(
event.getPlayer(),
TokenCardDefinitions.get("0/0 black Germ creature token")
);
game.doAction(play_token);
//attach the equipment to the token
final MagicAttachAction attach_equip = new MagicAttachAction(
event.getPermanent(),
play_token.getPermanent()
);
game.doAction(attach_equip);
TokenCardDefinitions.get("0/0 black Germ creature token"),
new MagicPermanentAction() {
@Override
public void doAction(final MagicPermanent perm) {
final MagicGame G = perm.getGame();
G.doAction(new MagicAttachAction(
sn.map(G),
perm
));
}
}
));
}
}

View File

@ -8,8 +8,10 @@ import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPermanentState;
import magic.model.MagicPlayer;
import magic.model.MagicPayedCost;
import magic.model.stack.MagicCardOnStack;
import magic.model.action.MagicPlayTokenAction;
import magic.model.action.MagicPutIntoPlayAction;
import magic.model.action.MagicPlayCardFromStackAction;
import java.util.concurrent.atomic.AtomicInteger;
@ -58,10 +60,11 @@ public abstract class TestGameBuilder {
for (int c=count;c>0;c--) {
final MagicCard card=new MagicCard(cardDefinition,player,currentId.getAndIncrement());
final MagicCardOnStack cardOnStack = new MagicCardOnStack(card, player, MagicPayedCost.NOT_SPELL);
final MagicPermanent permanent=new MagicPermanent(currentId.getAndIncrement(),card,player);
lastPermanent=permanent;
game.doAction(new MagicPutIntoPlayAction() {
game.doAction(new MagicPlayCardFromStackAction(cardOnStack) {
@Override
protected MagicPermanent createPermanent(final MagicGame game) {
return permanent;