From 4be2d9eaac79a90aeea4d4900cf192f79ccac83d Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Sat, 11 Dec 2021 15:24:54 +0100 Subject: [PATCH] Fix RememberCostMana --- .../java/forge/game/ability/AbilityUtils.java | 20 ++++++++++++++++++- .../game/ability/effects/ManaEffect.java | 6 +----- .../java/forge/game/card/CardProperty.java | 8 ++++++-- .../forge/game/spellability/SpellAbility.java | 3 +++ .../SpellAbilityStackInstance.java | 13 +++++++++--- 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index cc3326c1bfb..d0af5946cda 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1627,7 +1627,25 @@ public class AbilityUtils { if (sa.hasParam("RememberCostMana")) { host.clearRemembered(); - host.addRemembered(sa.getPayingMana()); + ManaCostBeingPaid activationMana = new ManaCostBeingPaid(sa.getPayCosts().getTotalMana()); + if (sa.getXManaCostPaid() != null) { + activationMana.setXManaCostPaid(sa.getXManaCostPaid(), null); + } + int activationShards = activationMana.getConvertedManaCost(); + List payingMana = sa.getPayingMana(); + // even if the cost was raised, we only care about mana from activation part + // let's just assume the first shards spent are that for easy handling + List activationPaid = payingMana.subList(payingMana.size() - activationShards, payingMana.size()); + StringBuilder sb = new StringBuilder(); + int nMana = 0; + for (Mana m : activationPaid) { + if (nMana > 0) { + sb.append(" "); + } + sb.append(m.toString()); + nMana++; + } + host.addRemembered(sb.toString()); } if (sa.hasParam("RememberCostCards") && !sa.getPaidHash().isEmpty()) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 64b22df15b2..d4cf7ceb48f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -18,7 +18,6 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; -import forge.game.mana.Mana; import forge.game.player.Player; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; @@ -170,10 +169,7 @@ public class ManaEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); int nMana = 0; for (Object o : card.getRemembered()) { - if (o instanceof Mana) { - if (nMana > 0) { - sb.append(" "); - } + if (o instanceof String) { sb.append(o.toString()); nMana++; } 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 e49fdd5b69f..5dc629bab2c 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -22,6 +22,7 @@ import forge.game.player.Player; import forge.game.spellability.OptionalCost; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityPredicates; +import forge.game.spellability.SpellAbilityStackInstance; import forge.game.trigger.Trigger; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -714,11 +715,14 @@ public class CardProperty { } break; case "ActivationColor": - SpellAbility castSA = source.getCastSA(); + SpellAbilityStackInstance castSA = game.getStack().getInstanceFromSpellAbility((SpellAbility) spellAbility); if (castSA == null) { return false; } - if (!card.getColor().hasAnyColor(castSA.getPayingColors().getColor())) { + List payingMana = castSA.getPayingMana(); + // even if the cost was raised, we only care about mana from activation part + // since this can only be 1 currently with Protective Sphere, let's just assume it's the first shard spent for easy handling + if (!card.getColor().hasAnyColor(payingMana.get(payingMana.size() - 1).getColor())) { return false; } break; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index ece876bceff..c1263fc5a83 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -594,6 +594,9 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public List getPayingMana() { return payingMana; } + public void setPayingMana(List paying) { + payingMana = Lists.newArrayList(paying); + } public final void clearManaPaid() { payingMana.clear(); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index 3dcaa5c1ed4..a19447a0b74 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -24,6 +24,7 @@ import java.util.Set; import org.apache.commons.lang3.StringUtils; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -35,6 +36,7 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardView; import forge.game.card.IHasCardView; +import forge.game.mana.Mana; import forge.game.player.Player; import forge.game.trigger.TriggerType; import forge.game.trigger.WrappedAbility; @@ -78,9 +80,8 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { // private String adjustedManaCost = ""; // Paid Mana Cost - // private ArrayList payingMana = new ArrayList(); - // private ArrayList paidAbilities = new - // ArrayList(); + private List payingMana; + // private ArrayList paidAbilities = new ArrayList(); private Integer xManaPaid = null; // Other Paid things @@ -112,6 +113,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { splicedCards = sa.getSplicedCards(); xManaPaid = sa.getXManaCostPaid(); + payingMana = Lists.newArrayList(sa.getPayingMana()); // Triggering info triggeringObjects = sa.getTriggeringObjects(); @@ -181,6 +183,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { ability.setPaidHash(paidHash); ability.setSplicedCards(splicedCards); ability.setXManaCostPaid(xManaPaid); + ability.setPayingMana(payingMana); // Triggered ability.setTriggeringObjects(triggeringObjects); @@ -345,6 +348,10 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { view.updateActivatingPlayer(this); } + public List getPayingMana() { + return payingMana; + } + @Override public String toString() { return TextUtil.concatNoSpace(getSourceCard().toString(), "->", getStackDescription());