diff --git a/release/Magarena/scripts/Ajani_s_Chosen.groovy b/release/Magarena/scripts/Ajani_s_Chosen.groovy index c44fd08484..744db694cb 100644 --- a/release/Magarena/scripts/Ajani_s_Chosen.groovy +++ b/release/Magarena/scripts/Ajani_s_Chosen.groovy @@ -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." + )); + } + } + )); } } ] diff --git a/release/Magarena/scripts/Brimaz__King_of_Oreskos.groovy b/release/Magarena/scripts/Brimaz__King_of_Oreskos.groovy index b5d2ae28ad..0582d6a417 100644 --- a/release/Magarena/scripts/Brimaz__King_of_Oreskos.groovy +++ b/release/Magarena/scripts/Brimaz__King_of_Oreskos.groovy @@ -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)); + } + )); } } ] diff --git a/release/Magarena/scripts/Deathrender.groovy b/release/Magarena/scripts/Deathrender.groovy index d52d569243..12d57df238 100644 --- a/release/Magarena/scripts/Deathrender.groovy +++ b/release/Magarena/scripts/Deathrender.groovy @@ -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)); + })); }); } } diff --git a/release/Magarena/scripts/Defy_Death.groovy b/release/Magarena/scripts/Defy_Death.groovy index a075e2c157..604741cb2e 100644 --- a/release/Magarena/scripts/Defy_Death.groovy +++ b/release/Magarena/scripts/Defy_Death.groovy @@ -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)); + } + })); }); } } diff --git a/release/Magarena/scripts/Helm_of_Kaldra.groovy b/release/Magarena/scripts/Helm_of_Kaldra.groovy index f034a2900a..a070fdb5d7 100644 --- a/release/Magarena/scripts/Helm_of_Kaldra.groovy +++ b/release/Magarena/scripts/Helm_of_Kaldra.groovy @@ -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)); + } + } + )); } } ] diff --git a/release/Magarena/scripts/Miraculous_Recovery.groovy b/release/Magarena/scripts/Miraculous_Recovery.groovy index 5e3aaf83da..39d36df801 100644 --- a/release/Magarena/scripts/Miraculous_Recovery.groovy +++ b/release/Magarena/scripts/Miraculous_Recovery.groovy @@ -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)); + })); }); } } diff --git a/src/magic/model/action/MagicPlayCardAction.java b/src/magic/model/action/MagicPlayCardAction.java index 88eeeac3bc..7a18f6db7d 100644 --- a/src/magic/model/action/MagicPlayCardAction.java +++ b/src/magic/model/action/MagicPlayCardAction.java @@ -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 modifications; public MagicPlayCardAction(final MagicCard aCard, final MagicPlayer aController,final List 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) {} } diff --git a/src/magic/model/action/MagicPlayCardFromStackAction.java b/src/magic/model/action/MagicPlayCardFromStackAction.java index 41e3376de2..52a365f9e2 100644 --- a/src/magic/model/action/MagicPlayCardFromStackAction.java +++ b/src/magic/model/action/MagicPlayCardFromStackAction.java @@ -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 modifications = Collections.emptyList(); + public MagicPlayCardFromStackAction(final MagicCardOnStack aCardOnStack, final MagicCardDefinition aCardDef, final List 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 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 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+')'; + } + } } diff --git a/src/magic/model/action/MagicPlayTokenAction.java b/src/magic/model/action/MagicPlayTokenAction.java index 39f37c9f9b..11052f26a8 100644 --- a/src/magic/model/action/MagicPlayTokenAction.java +++ b/src/magic/model/action/MagicPlayTokenAction.java @@ -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 modifications; public MagicPlayTokenAction(final MagicPlayer player,final MagicCardDefinition cardDefinition, final List aModifications) { - card=MagicCard.createTokenCard(cardDefinition,player); - setModifications(aModifications); + card = MagicCard.createTokenCard(cardDefinition,player); + modifications = aModifications; + } + + public MagicPlayTokenAction(final MagicCard aCard) { + card = aCard; + modifications = Collections.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) {} } diff --git a/src/magic/model/action/MagicPutIntoPlayAction.java b/src/magic/model/action/MagicPutIntoPlayAction.java deleted file mode 100644 index b6652869e9..0000000000 --- a/src/magic/model/action/MagicPutIntoPlayAction.java +++ /dev/null @@ -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 modifications = Collections.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 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 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 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+')'; - } - } -} diff --git a/src/magic/model/trigger/MagicLivingWeaponTrigger.java b/src/magic/model/trigger/MagicLivingWeaponTrigger.java index 93b9b214dd..5bf9afb3cc 100644 --- a/src/magic/model/trigger/MagicLivingWeaponTrigger.java +++ b/src/magic/model/trigger/MagicLivingWeaponTrigger.java @@ -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 + )); + } + } + )); } } diff --git a/src/magic/test/TestGameBuilder.java b/src/magic/test/TestGameBuilder.java index 1be20a9278..b3b4605e1a 100644 --- a/src/magic/test/TestGameBuilder.java +++ b/src/magic/test/TestGameBuilder.java @@ -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;