From cdf6fbb5d894c18fc63707363a04df0067f3bdb7 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 5 Sep 2021 01:20:46 +0400 Subject: [PATCH] * GUI: fixed that announced X card icon info shows X=0 on next turns (example: Engineered Explosives, #8046); --- .../src/main/java/mage/view/CardView.java | 6 ++--- .../main/java/mage/view/StackAbilityView.java | 2 +- .../src/mage/cards/g/GlimpseTheCosmos.java | 2 +- .../src/mage/cards/r/RadiantEpicure.java | 2 +- .../condition/common/AdamantCondition.java | 2 +- .../common/ManaWasSpentCondition.java | 2 +- .../common/ManacostVariableValue.java | 12 +++++++--- .../common/ManaSpentToCastWatcher.java | 22 +++++++++++++++---- 8 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Mage.Common/src/main/java/mage/view/CardView.java b/Mage.Common/src/main/java/mage/view/CardView.java index 7462791f79..8a68422ea6 100644 --- a/Mage.Common/src/main/java/mage/view/CardView.java +++ b/Mage.Common/src/main/java/mage/view/CardView.java @@ -459,10 +459,10 @@ public class CardView extends SimpleCardView { && (cardZone.match(Zone.BATTLEFIELD) || cardZone.match(Zone.STACK))) { int costX; if (card instanceof Permanent) { - // permanent on battlefield - costX = ManacostVariableValue.ETB.calculate(game, card.getSpellAbility(), null); + // permanent on battlefield (can show x icon multiple turns, so use end_game source) + costX = ManacostVariableValue.END_GAME.calculate(game, card.getSpellAbility(), null); } else { - // other like Stack + // other like Stack (can show x icon on stack only, so use normal source) costX = ManacostVariableValue.REGULAR.calculate(game, card.getSpellAbility(), null); } this.cardIcons.add(new VariableCostCardIcon(costX)); diff --git a/Mage.Common/src/main/java/mage/view/StackAbilityView.java b/Mage.Common/src/main/java/mage/view/StackAbilityView.java index 74142d11d9..cbf0840312 100644 --- a/Mage.Common/src/main/java/mage/view/StackAbilityView.java +++ b/Mage.Common/src/main/java/mage/view/StackAbilityView.java @@ -79,7 +79,7 @@ public class StackAbilityView extends CardView { // card icons (warning, it must be synced in gui dialogs with replaced card, see comments at the start of the file) // cost x if (ability.getManaCostsToPay().containsX()) { - int costX = ManacostVariableValue.REGULAR.calculate(game, ability, null); + int costX = ManacostVariableValue.END_GAME.calculate(game, ability, null); this.cardIcons.add(new VariableCostCardIcon(costX)); } } diff --git a/Mage.Sets/src/mage/cards/g/GlimpseTheCosmos.java b/Mage.Sets/src/mage/cards/g/GlimpseTheCosmos.java index 0ed6d72846..79f2b118f0 100644 --- a/Mage.Sets/src/mage/cards/g/GlimpseTheCosmos.java +++ b/Mage.Sets/src/mage/cards/g/GlimpseTheCosmos.java @@ -146,7 +146,7 @@ class GlimpseTheCosmosReplacementEffect extends ReplacementEffectImpl { if (watcher == null) { return false; } - Mana payment = watcher.getAndResetLastPayment(source.getSourceId()); + Mana payment = watcher.getLastManaPayment(source.getSourceId()); if (payment != null && payment.getBlue() == 1 // must be blue mana && payment.count() == 1) { // must be just one diff --git a/Mage.Sets/src/mage/cards/r/RadiantEpicure.java b/Mage.Sets/src/mage/cards/r/RadiantEpicure.java index 995d45cf9d..5747679458 100644 --- a/Mage.Sets/src/mage/cards/r/RadiantEpicure.java +++ b/Mage.Sets/src/mage/cards/r/RadiantEpicure.java @@ -72,7 +72,7 @@ class RadiantEpicureEffect extends OneShotEffect { if (player == null || watcher == null) { return false; } - Mana payment = watcher.getAndResetLastPayment(source.getSourceId()); + Mana payment = watcher.getLastManaPayment(source.getSourceId()); if (payment == null) { return false; } diff --git a/Mage/src/main/java/mage/abilities/condition/common/AdamantCondition.java b/Mage/src/main/java/mage/abilities/condition/common/AdamantCondition.java index 8dd3842fef..c7ec8b47b8 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/AdamantCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/AdamantCondition.java @@ -42,7 +42,7 @@ public enum AdamantCondition implements Condition { if (watcher == null) { return false; } - Mana payment = watcher.getAndResetLastPayment(source.getSourceId()); + Mana payment = watcher.getLastManaPayment(source.getSourceId()); if (payment == null) { return false; } diff --git a/Mage/src/main/java/mage/abilities/condition/common/ManaWasSpentCondition.java b/Mage/src/main/java/mage/abilities/condition/common/ManaWasSpentCondition.java index 73455edf31..c96cdf07e4 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/ManaWasSpentCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/ManaWasSpentCondition.java @@ -32,7 +32,7 @@ public class ManaWasSpentCondition implements Condition { } ManaSpentToCastWatcher watcher = game.getState().getWatcher(ManaSpentToCastWatcher.class); if (watcher != null) { - Mana payment = watcher.getAndResetLastPayment(source.getSourceId()); + Mana payment = watcher.getLastManaPayment(source.getSourceId()); if (payment != null) { return payment.getColor(coloredManaSymbol) > 0; } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java index 293b9ddcec..fb22062cae 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java @@ -8,8 +8,10 @@ import mage.watchers.common.ManaSpentToCastWatcher; public enum ManacostVariableValue implements DynamicValue { - REGULAR, // if you need X on cast/activate (in stack) - ETB; // if you need X after ETB (in battlefield) + REGULAR, // if you need X on cast/activate (in stack) - reset each turn + ETB, // if you need X after ETB (in battlefield) - reset each turn + END_GAME; // if you need X until end game - keep data forever + @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { @@ -18,7 +20,11 @@ public enum ManacostVariableValue implements DynamicValue { } ManaSpentToCastWatcher watcher = game.getState().getWatcher(ManaSpentToCastWatcher.class); if (watcher != null) { - return watcher.getAndResetLastXValue(sourceAbility); + if (this == END_GAME) { + return watcher.getLastXValue(sourceAbility, true); + } else { + return watcher.getLastXValue(sourceAbility, false); + } } return 0; } diff --git a/Mage/src/main/java/mage/watchers/common/ManaSpentToCastWatcher.java b/Mage/src/main/java/mage/watchers/common/ManaSpentToCastWatcher.java index 7295a7e462..ef9461ad89 100644 --- a/Mage/src/main/java/mage/watchers/common/ManaSpentToCastWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/ManaSpentToCastWatcher.java @@ -17,6 +17,8 @@ import java.util.UUID; /** * Watcher saves the mana that was spent to cast a spell * automatically added in each game + *

+ * Resets each turn * * @author LevelX2 */ @@ -24,6 +26,7 @@ public class ManaSpentToCastWatcher extends Watcher { private final Map manaMap = new HashMap<>(); private final Map xValueMap = new HashMap<>(); + private final Map xValueMapLong = new HashMap<>(); // do not reset, keep until game end public ManaSpentToCastWatcher() { super(WatcherScope.GAME); @@ -38,24 +41,34 @@ public class ManaSpentToCastWatcher extends Watcher { if (spell != null) { manaMap.put(spell.getSourceId(), spell.getSpellAbility().getManaCostsToPay().getUsedManaToPay()); xValueMap.put(spell.getSourceId(), spell.getSpellAbility().getManaCostsToPay().getX()); + xValueMapLong.put(spell.getSourceId(), spell.getSpellAbility().getManaCostsToPay().getX()); } return; case ZONE_CHANGE: if (((ZoneChangeEvent) event).getFromZone() == Zone.BATTLEFIELD) { manaMap.remove(event.getSourceId()); xValueMap.remove(event.getSourceId()); + xValueMapLong.remove(event.getSourceId()); } } } - public Mana getAndResetLastPayment(UUID sourceId) { + public Mana getLastManaPayment(UUID sourceId) { return manaMap.getOrDefault(sourceId, null); } - public int getAndResetLastXValue(Ability source) { - if (xValueMap.containsKey(source.getSourceId())) { + /** + * Return X value for casted spell or permanents + * + * @param source + * @param useLongSource - use X value that keeps until end of game (for info only) + * @return + */ + public int getLastXValue(Ability source, boolean useLongSource) { + Map xSource = useLongSource ? this.xValueMapLong : this.xValueMap; + if (xSource.containsKey(source.getSourceId())) { // cast normal way - return xValueMap.get(source.getSourceId()); + return xSource.get(source.getSourceId()); } else { // put to battlefield without cast (example: copied spell must keep announced X) return source.getManaCostsToPay().getX(); @@ -67,5 +80,6 @@ public class ManaSpentToCastWatcher extends Watcher { super.reset(); manaMap.clear(); xValueMap.clear(); + // xValueMapLong.clear(); // must keep until game end, so don't clear between turns } }