mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 10:48:00 +00:00
Merge branch 'shaileEnterUnder' into 'master'
Card: add turnInController to keep track under which control it entered See merge request core-developers/forge!4282
This commit is contained in:
@@ -133,7 +133,7 @@ public class GameAction {
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
if (zoneFrom == null && !c.isToken()) {
|
if (zoneFrom == null && !c.isToken()) {
|
||||||
zoneTo.add(c, position);
|
zoneTo.add(c, position, CardUtil.getLKICopy(c));
|
||||||
checkStaticAbilities();
|
checkStaticAbilities();
|
||||||
game.getTriggerHandler().registerActiveTrigger(c, true);
|
game.getTriggerHandler().registerActiveTrigger(c, true);
|
||||||
game.fireEvent(new GameEventCardChangeZone(c, zoneFrom, zoneTo));
|
game.fireEvent(new GameEventCardChangeZone(c, zoneFrom, zoneTo));
|
||||||
@@ -471,7 +471,7 @@ public class GameAction {
|
|||||||
if (card == c) {
|
if (card == c) {
|
||||||
zoneTo.add(copied, position, lastKnownInfo); // the modified state of the card is also reported here (e.g. for Morbid + Awaken)
|
zoneTo.add(copied, position, lastKnownInfo); // the modified state of the card is also reported here (e.g. for Morbid + Awaken)
|
||||||
} else {
|
} else {
|
||||||
zoneTo.add(card, position);
|
zoneTo.add(card, position, CardUtil.getLKICopy(card));
|
||||||
}
|
}
|
||||||
card.setZone(zoneTo);
|
card.setZone(zoneTo);
|
||||||
}
|
}
|
||||||
@@ -598,8 +598,6 @@ public class GameAction {
|
|||||||
copied.setState(CardStateName.Original, true);
|
copied.setState(CardStateName.Original, true);
|
||||||
}
|
}
|
||||||
unattachCardLeavingBattlefield(copied);
|
unattachCardLeavingBattlefield(copied);
|
||||||
// Remove all changed keywords
|
|
||||||
copied.removeAllChangedText(game.getNextTimestamp());
|
|
||||||
} else if (toBattlefield) {
|
} else if (toBattlefield) {
|
||||||
// reset timestamp in changezone effects so they have same timestamp if ETB simutaneously
|
// reset timestamp in changezone effects so they have same timestamp if ETB simutaneously
|
||||||
copied.setTimestamp(game.getNextTimestamp());
|
copied.setTimestamp(game.getNextTimestamp());
|
||||||
|
|||||||
@@ -285,6 +285,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
private int regeneratedThisTurn = 0;
|
private int regeneratedThisTurn = 0;
|
||||||
|
|
||||||
private int turnInZone;
|
private int turnInZone;
|
||||||
|
// the player that under which control it enters
|
||||||
|
private Player turnInController = null;
|
||||||
|
|
||||||
private Map<String, Integer> xManaCostPaidByColor;
|
private Map<String, Integer> xManaCostPaidByColor;
|
||||||
|
|
||||||
@@ -1631,6 +1633,14 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
turnInZone = turn;
|
turnInZone = turn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final Player getTurnInController() {
|
||||||
|
return turnInController;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setTurnInController(final Player p) {
|
||||||
|
turnInController = p;
|
||||||
|
}
|
||||||
|
|
||||||
public final void setManaCost(final ManaCost s) {
|
public final void setManaCost(final ManaCost s) {
|
||||||
currentState.setManaCost(s);
|
currentState.setManaCost(s);
|
||||||
}
|
}
|
||||||
@@ -4273,13 +4283,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
updateChangedText();
|
updateChangedText();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void removeAllChangedText(final Long timestamp) {
|
|
||||||
changedTextTypes.removeAll();
|
|
||||||
changedTextColors.removeAll();
|
|
||||||
updateKeywordsOnRemoveChangedText(removeChangedCardKeywords(timestamp));
|
|
||||||
updateChangedText();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateKeywordsChangedText(final Long timestamp) {
|
private void updateKeywordsChangedText(final Long timestamp) {
|
||||||
if (hasSVar("LockInKeywords")) {
|
if (hasSVar("LockInKeywords")) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1002,6 +1002,18 @@ public class CardProperty {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
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<Player> lp = AbilityUtils.getDefinedPlayers(source, valid, spellAbility);
|
||||||
|
if (!lp.contains(u)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (property.equals("EnteredSinceYourLastTurn")) {
|
} else if (property.equals("EnteredSinceYourLastTurn")) {
|
||||||
if (card.getTurnInZone() <= sourceController.getLastTurnNr()) {
|
if (card.getTurnInZone() <= sourceController.getLastTurnNr()) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -108,13 +108,15 @@ public class Zone implements java.io.Serializable, Iterable<Card> {
|
|||||||
final Zone oldZone = game.getZoneOf(c);
|
final Zone oldZone = game.getZoneOf(c);
|
||||||
final ZoneType zt = oldZone == null ? ZoneType.Stack : oldZone.getZoneType();
|
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) {
|
if (zt != zoneType) {
|
||||||
|
c.setTurnInController(getPlayer());
|
||||||
|
c.setTurnInZone(game.getPhaseHandler().getTurn());
|
||||||
cardsAddedThisTurn.add(zt, latestState != null ? latestState : c);
|
cardsAddedThisTurn.add(zt, latestState != null ? latestState : c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.setTurnInZone(game.getPhaseHandler().getTurn());
|
|
||||||
if (zoneType != ZoneType.Battlefield) {
|
if (zoneType != ZoneType.Battlefield) {
|
||||||
c.setTapped(false);
|
c.setTapped(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
Reference in New Issue
Block a user