diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index db719ca9d1e..a119bb87f54 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -227,7 +227,7 @@ public class GameAction { copied.getOwner().addInboundToken(copied); } - HashMap repParams = new HashMap(); + Map repParams = Maps.newHashMap(); repParams.put("Event", "Moved"); repParams.put("Affected", copied); repParams.put("CardLKI", lastKnownInfo); @@ -252,6 +252,10 @@ public class GameAction { lastKnownInfo = CardUtil.getLKICopy(c); c.setUnearthed(false); } + + if (toBattlefield) { + copied.putEtbCounters(); + } } copied.getOwner().removeInboundToken(copied); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 773224a9e81..66fa7e13cb2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -192,7 +192,11 @@ public class CountersPutEffect extends SpellAbilityEffect { } final Zone zone = tgtCard.getGame().getZoneOf(tgtCard); if (zone == null || zone.is(ZoneType.Battlefield) || zone.is(ZoneType.Stack)) { - tgtCard.addCounter(counterType, counterAmount, true); + if (etbcounter) { + tgtCard.addEtbCounter(counterType, counterAmount); + } else { + tgtCard.addCounter(counterType, counterAmount, true); + } if (remember) { final int value = tgtCard.getTotalCountersToAdd(); tgtCard.addCountersAddedBy(card, counterType, value); @@ -219,7 +223,11 @@ public class CountersPutEffect extends SpellAbilityEffect { } else { // adding counters to something like re-suspend cards // etbcounter should apply multiplier - tgtCard.addCounter(counterType, counterAmount, etbcounter); + if (etbcounter) { + tgtCard.addEtbCounter(counterType, counterAmount); + } else { + tgtCard.addCounter(counterType, counterAmount, false); + } } } } else if (obj instanceof Player) { 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 387dd231a34..7474b0852b0 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -242,6 +242,8 @@ public class Card extends GameEntity implements Comparable { private CardRules cardRules; private final CardView view; + private Map etbCounters = Maps.newEnumMap(CounterType.class); + // Enumeration for CMC request types public enum SplitCMCMode { CurrentSideCMC, @@ -7126,4 +7128,28 @@ public class Card extends GameEntity implements Comparable { public final void setLastKnownZone(Zone zone) { this.savedLastKnownZone = zone; } + + /** + * ETBCounters are only used between replacementEffects + * and when the Card really enters the Battlefield with the counters + * @return map of counters + */ + public final Map getEtbCounters() { + return etbCounters; + } + + public final void addEtbCounter(CounterType type, Integer val) { + int old = etbCounters.containsKey(type) ? etbCounters.get(type) : 0; + etbCounters.put(type, old + val); + } + + public final void clearEtbCounters() { + etbCounters.clear(); + } + + public final void putEtbCounters() { + for (Map.Entry e : etbCounters.entrySet()) { + this.addCounter(e.getKey(), e.getValue(), true); + } + } }