diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 8a175188322..fffac03a982 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -133,7 +133,7 @@ public class GameAction { return c; } if (zoneFrom == null && !c.isToken()) { - zoneTo.add(c, position); + zoneTo.add(c, position, CardUtil.getLKICopy(c)); checkStaticAbilities(); game.getTriggerHandler().registerActiveTrigger(c, true); game.fireEvent(new GameEventCardChangeZone(c, zoneFrom, zoneTo)); @@ -471,7 +471,7 @@ public class GameAction { if (card == c) { zoneTo.add(copied, position, lastKnownInfo); // the modified state of the card is also reported here (e.g. for Morbid + Awaken) } else { - zoneTo.add(card, position); + zoneTo.add(card, position, CardUtil.getLKICopy(card)); } card.setZone(zoneTo); } @@ -598,8 +598,6 @@ public class GameAction { copied.setState(CardStateName.Original, true); } unattachCardLeavingBattlefield(copied); - // Remove all changed keywords - copied.removeAllChangedText(game.getNextTimestamp()); } else if (toBattlefield) { // reset timestamp in changezone effects so they have same timestamp if ETB simutaneously copied.setTimestamp(game.getNextTimestamp()); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index c9e670ae77e..bc7f7b74788 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -285,6 +285,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private int regeneratedThisTurn = 0; private int turnInZone; + // the player that under which control it enters + private Player turnInController = null; private Map xManaCostPaidByColor; @@ -1631,6 +1633,14 @@ public class Card extends GameEntity implements Comparable, IHasSVars { turnInZone = turn; } + public final Player getTurnInController() { + return turnInController; + } + + public final void setTurnInController(final Player p) { + turnInController = p; + } + public final void setManaCost(final ManaCost s) { currentState.setManaCost(s); } @@ -4273,13 +4283,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { updateChangedText(); } - public final void removeAllChangedText(final Long timestamp) { - changedTextTypes.removeAll(); - changedTextColors.removeAll(); - updateKeywordsOnRemoveChangedText(removeChangedCardKeywords(timestamp)); - updateChangedText(); - } - private void updateKeywordsChangedText(final Long timestamp) { if (hasSVar("LockInKeywords")) { return; diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 2bbf26b42c2..77a4786a2b9 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1002,6 +1002,18 @@ public class CardProperty { } } return false; + } else if (property.startsWith("EnteredUnder")) { + Player u = card.getTurnInController(); + if (u == null) { + return false; + } + final String valid = property.substring(13); + if (!u.isValid(valid, sourceController, source, spellAbility)) { + final List lp = AbilityUtils.getDefinedPlayers(source, valid, spellAbility); + if (!lp.contains(u)) { + return false; + } + } } else if (property.equals("EnteredSinceYourLastTurn")) { if (card.getTurnInZone() <= sourceController.getLastTurnNr()) { return false; diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 07e2b94efe1..39793959665 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -108,13 +108,15 @@ public class Zone implements java.io.Serializable, Iterable { final Zone oldZone = game.getZoneOf(c); final ZoneType zt = oldZone == null ? ZoneType.Stack : oldZone.getZoneType(); - // only if the zoneType differss from this + // only if the zoneType differs from this + // don't go in there is its a control change if (zt != zoneType) { + c.setTurnInController(getPlayer()); + c.setTurnInZone(game.getPhaseHandler().getTurn()); cardsAddedThisTurn.add(zt, latestState != null ? latestState : c); } } - c.setTurnInZone(game.getPhaseHandler().getTurn()); if (zoneType != ZoneType.Battlefield) { c.setTapped(false); } diff --git a/forge-gui/res/cardsfolder/upcoming/shaile_dean_of_radiance_embrose_dean_of_shadow.txt b/forge-gui/res/cardsfolder/upcoming/shaile_dean_of_radiance_embrose_dean_of_shadow.txt new file mode 100644 index 00000000000..4d72506b10d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shaile_dean_of_radiance_embrose_dean_of_shadow.txt @@ -0,0 +1,23 @@ +Name:Shaile, Dean of Radiance +ManaCost:1 W +Types:Legendary Creature Bird Cleric +PT:1/1 +K:Flying +K:Vigilance +A:AB$ PutCounterAll | Cost$ T | ValidCards$ Creature.ThisTurnEntered+EnteredUnder You | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on each creature that entered the battlefield under your control this turn. +DeckHas:Ability$Counters +AlternateMode:Modal +Oracle:Flying, vigilance\n{T}: Put a +1/+1 counter on each creature that entered the battlefield under your control this turn. + +ALTERNATE + +Name:Embrose, Dean of Shadow +ManaCost:2 B B +Types:Legendary Creature Human Warlock +PT:4/4 +A:AB$ PutCounter | Cost$ T | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDmg | SpellDescription$ Put a +1/+1 counter on another target creature, then CARDNAME deals 2 damage to that creature. +SVar:DBDmg:DB$ DealDamage | Defined$ ParentTarget | NumDmg$ 2 | StackDescription$ None +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+counters_GE1_P1P1 | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a creature you control with a +1/+1 counter on it dies, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:{T}: Put a +1/+1 counter on another target creature, then Embrose, Dean of Shadow deals 2 damage to that creature.\nWhenever a creature you control with a +1/+1 counter on it dies, draw a card. +