From b363db2bbd18f2899add1b16afdf83798f26b6f9 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Sat, 15 Mar 2025 14:03:51 +0100 Subject: [PATCH] Fix North Star (#7163) --- .../main/java/forge/ai/ComputerUtilMana.java | 26 ++++++++++--------- .../ability/effects/ControlPlayerEffect.java | 6 ++--- .../main/java/forge/game/player/Player.java | 16 ------------ .../StaticAbilityManaConvert.java | 9 +++++++ forge-gui/res/cardsfolder/n/north_star.txt | 3 ++- .../forge/player/HumanPlaySpellAbility.java | 15 ++--------- 6 files changed, 29 insertions(+), 46 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 7bebb6c549e..a0e12aa4b5a 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -642,20 +642,22 @@ public class ComputerUtilMana { List paymentList = Lists.newArrayList(); final ManaPool manapool = ai.getManaPool(); - // Apply the color/type conversion matrix if necessary - manapool.restoreColorReplacements(); - CardPlayOption mayPlay = sa.getMayPlayOption(); - if (!effect) { - if (sa.isSpell() && mayPlay != null) { - mayPlay.applyManaConvert(manapool); - } else if (sa.isActivatedAbility() && sa.getGrantorStatic() != null && sa.getGrantorStatic().hasParam("ManaConversion")) { - AbilityUtils.applyManaColorConversion(manapool, sa.getGrantorStatic().getParam("ManaConversion")); + // Apply color/type conversion matrix if necessary (already done via autopay) + if (ai.getControllingPlayer() == null) { + manapool.restoreColorReplacements(); + CardPlayOption mayPlay = sa.getMayPlayOption(); + if (!effect) { + if (sa.isSpell() && mayPlay != null) { + mayPlay.applyManaConvert(manapool); + } else if (sa.isActivatedAbility() && sa.getGrantorStatic() != null && sa.getGrantorStatic().hasParam("ManaConversion")) { + AbilityUtils.applyManaColorConversion(manapool, sa.getGrantorStatic().getParam("ManaConversion")); + } } + if (sa.hasParam("ManaConversion")) { + AbilityUtils.applyManaColorConversion(manapool, sa.getParam("ManaConversion")); + } + StaticAbilityManaConvert.manaConvert(manapool, ai, sa.getHostCard(), effect && !sa.isCastFromPlayEffect() ? null : sa); } - if (sa.hasParam("ManaConversion")) { - AbilityUtils.applyManaColorConversion(manapool, sa.getParam("ManaConversion")); - } - StaticAbilityManaConvert.manaConvert(manapool, ai, sa.getHostCard(), effect && !sa.isCastFromPlayEffect() ? null : sa); if (manapool.payManaCostFromPool(cost, sa, test, manaSpentToPay)) { CostPayment.handleOfferings(sa, test, cost.isPaid()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlPlayerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlPlayerEffect.java index de41ede731b..790568d7f94 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlPlayerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlPlayerEffect.java @@ -26,10 +26,8 @@ public class ControlPlayerEffect extends SpellAbilityEffect { @SuppressWarnings("serial") @Override public void resolve(SpellAbility sa) { - final Player activator = sa.getActivatingPlayer(); - final Game game = activator.getGame(); - final Player controller = sa.hasParam("Controller") ? AbilityUtils.getDefinedPlayers( - sa.getHostCard(), sa.getParam("Controller"), sa).get(0) : activator; + final Player controller = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Controller"), sa).get(0); + final Game game = controller.getGame(); for (final Player pTarget: getTargetPlayers(sa)) { // before next untap gain control diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 18dc336d243..d9ef97db510 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -181,7 +181,6 @@ public class Player extends GameEntity implements Comparable { private CardCollection gainedOwnership = new CardCollection(); private ManaPool manaPool = new ManaPool(this); - private int numManaConversion = 0; // The SA currently being paid for private Deque paidForStack = new ArrayDeque<>(); @@ -2228,20 +2227,6 @@ public class Player extends GameEntity implements Comparable { numLibrarySearchedOwn++; } - public final void setNumManaConversion(final int l) { - numManaConversion = l; - } - public final boolean hasManaConversion() { - return numManaConversion < getAmountOfKeyword("You may spend mana as though" - + " it were mana of any type to cast a spell this turn."); - } - public final void incNumManaConversion() { - numManaConversion++; - } - public final void decNumManaConversion() { - numManaConversion--; - } - @Override public final boolean isValid(final String restriction, final Player sourceController, final Card source, CardTraitBase spellAbility) { final String[] incR = restriction.split("\\.", 2); @@ -2587,7 +2572,6 @@ public class Player extends GameEntity implements Comparable { lifeGainedByTeamThisTurn = 0; setLifeStartedThisTurnWith(getLife()); setLibrarySearched(0); - setNumManaConversion(0); setCommitedCrimeThisTurn(0); diceRollsThisTurn = Lists.newArrayList(); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityManaConvert.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityManaConvert.java index 51601d02802..f37f5682dda 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityManaConvert.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityManaConvert.java @@ -39,6 +39,15 @@ public class StaticAbilityManaConvert { if (!stAb.matchesValidParam("ValidSA", sa)) { return false; } + + if (stAb.hasParam("Optional")) { + stAb.getHostCard().clearRemembered(); + if (!p.getController().confirmStaticApplication(card, null, "Do you want to spend mana as though it were mana of any type to pay the cost?", null)) { + return false; + } + stAb.getHostCard().addRemembered(sa.getHostCard()); + } + return true; } } diff --git a/forge-gui/res/cardsfolder/n/north_star.txt b/forge-gui/res/cardsfolder/n/north_star.txt index 421e460ee33..4b57262e963 100644 --- a/forge-gui/res/cardsfolder/n/north_star.txt +++ b/forge-gui/res/cardsfolder/n/north_star.txt @@ -1,6 +1,7 @@ Name:North Star ManaCost:4 Types:Artifact -A:AB$ Pump | Cost$ 4 T | Defined$ You | KW$ You may spend mana as though it were mana of any type to cast a spell this turn. | SpellDescription$ For one spell this turn, you may spend mana as though it were mana of any type to pay that spell's mana cost. (Additional costs are still paid normally.) +A:AB$ Effect | Cost$ 4 T | ForgetOnCast$ Card.IsRemembered | StaticAbilities$ Convert | SpellDescription$ For one spell this turn, you may spend mana as though it were mana of any type to pay that spell's mana cost. (Additional costs are still paid normally.) +SVar:Convert:Mode$ ManaConvert | ValidPlayer$ You | ValidSA$ Spell | Optional$ True | ManaConversion$ AnyType->AnyType | Description$ For one spell this turn, you may spend mana as though it were mana of any type to pay that spell's mana cost. AI:RemoveDeck:All Oracle:{4}, {T}: For one spell this turn, you may spend mana as though it were mana of any type to pay that spell's mana cost. (Additional costs are still paid normally.) diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index 0288146ae10..bff798c981f 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -19,7 +19,6 @@ package forge.player; import com.google.common.collect.Iterables; import forge.card.CardType; -import forge.card.MagicColor; import forge.game.Game; import forge.game.GameActionUtil; import forge.game.GameObject; @@ -116,8 +115,6 @@ public class HumanPlaySpellAbility { Cost abCost = ability.getPayCosts(); CostPayment payment = new CostPayment(abCost, ability); - final boolean playerManaConversion = human.hasManaConversion() - && human.getController().confirmStaticApplication(c, null, "Do you want to spend mana as though it were mana of any type to pay the cost?", null); boolean manaColorConversion = false; if (!ability.isCopied()) { @@ -141,16 +138,11 @@ public class HumanPlaySpellAbility { } if (ability.hasParam("ManaConversion")) { - AbilityUtils.applyManaColorConversion(manapool, ability.getParam("ManaConversion")); + AbilityUtils.applyManaColorConversion(payment, ability.getParam("ManaConversion")); manaColorConversion = true; } } - if (playerManaConversion) { - AbilityUtils.applyManaColorConversion(payment, MagicColor.Constant.ANY_TYPE_CONVERSION); - human.incNumManaConversion(); - } - // reset is also done early here, because if an ability is canceled from targeting it might otherwise lead to refunding mana from earlier cast ability.clearManaPaid(); ability.getPayingManaAbilities().clear(); @@ -195,10 +187,7 @@ public class HumanPlaySpellAbility { if (manaColorConversion) { manapool.restoreColorReplacements(); } - if (playerManaConversion) { - manapool.restoreColorReplacements(); - human.decNumManaConversion(); - } + return false; }