From beae50cefd0cc1763f00dddc6e1df03ebe56c872 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 31 Mar 2023 20:18:57 +0200 Subject: [PATCH] Investigate fixes --- .../forge/game/ability/effects/InvestigateEffect.java | 6 +++--- .../forge/game/ability/effects/RepeatEachEffect.java | 8 ++++++-- .../src/main/java/forge/game/card/CardFactoryUtil.java | 10 ++++------ .../res/cardsfolder/h/haakon_stromgald_scourge.txt | 4 ++-- forge-gui/res/cardsfolder/m/malicious_affliction.txt | 2 +- forge-gui/res/cardsfolder/t/tempting_contract.txt | 6 +++--- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/InvestigateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/InvestigateEffect.java index 48dee299959..d0c3f694eb3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/InvestigateEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/InvestigateEffect.java @@ -37,11 +37,11 @@ public class InvestigateEffect extends TokenEffectBase { final int amount = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("Num", "1"), sa); // Investigate in Sequence - for (final Player p : getTargetPlayers(sa)) { - for (int i = 0; i < amount; i++) { + for (int i = 0; i < amount; i++) { + for (final Player p : getTargetPlayers(sa)) { if (sa.hasParam("Optional") && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYouLikeInvestigate"), null)) { - return; + continue; } CardZoneTable triggerList = new CardZoneTable(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java index d8d19721c2a..43e40b1521d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java @@ -169,8 +169,12 @@ public class RepeatEachEffect extends SpellAbilityEffect { } } for (final Player p : repeatPlayers) { - if (optional && !p.getController().confirmAction(repeat, null, sa.getParam("RepeatOptionalMessage"), null)) { - continue; + if (optional) { + if (!p.getController().confirmAction(repeat, null, sa.getParam("RepeatOptionalMessage"), null)) { + continue; + } else if (sa.hasParam("RememberDeciders")) { + source.addRemembered(p); + } } if (nextTurn) { game.getCleanup().addUntil(p, new GameCommand() { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 8434c8dab54..2bf49fd9dd7 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2684,14 +2684,13 @@ public class CardFactoryUtil { final String[] kw = keyword.split(":"); String costStr = kw[1]; for (SpellAbility sa: host.getBasicSpells()) { - final SpellAbility newSA = sa.copy(); - newSA.setBasicSpell(false); if (costStr.equals("ConvertedManaCost")) { costStr = Integer.toString(host.getCMC()); } final Cost cost = new Cost(costStr, false).add(sa.getPayCosts().copyWithNoMana()); + final SpellAbility newSA = sa.copyWithDefinedCost(cost); + newSA.setBasicSpell(false); newSA.putParam("Secondary", "True"); - newSA.setPayCosts(cost); newSA.setDescription(sa.getDescription() + " (by paying " + cost.toSimpleString() + " instead of its mana cost)"); newSA.setIntrinsic(intrinsic); @@ -3879,9 +3878,8 @@ public class CardFactoryUtil { private static SpellAbility makeAltCostAbility(final Card card, final String altCost, final SpellAbility sa) { final Map params = AbilityFactory.getMapParams(altCost); - final SpellAbility altCostSA = sa.copy(); - final Cost abCost = new Cost(params.get("Cost"), altCostSA.isAbility()); - altCostSA.setPayCosts(abCost); + final Cost abCost = new Cost(params.get("Cost"), sa.isAbility()); + final SpellAbility altCostSA = sa.copyWithDefinedCost(abCost); altCostSA.setBasicSpell(false); altCostSA.addOptionalCost(OptionalCost.AltCost); diff --git a/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt b/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt index b87ab7890e5..1aa668c5a88 100644 --- a/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt +++ b/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt @@ -4,8 +4,8 @@ Types:Legendary Creature Zombie Knight PT:3/3 S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard S:Mode$ CantBeCast | ValidCard$ Card.Self | Origin$ Exile,Hand,Library,Command | EffectZone$ Graveyard,Hand,Library,Command,Stack | Description$ You may cast CARDNAME from your graveyard, but not from anywhere else. -S:Mode$ Continuous | Affected$ Knight.YouCtrl | MayPlay$ True | EffectZone$ Battlefield | AffectedZone$ Graveyard | Description$ As long as CARDNAME is on the battlefield, you may play Knight cards from your graveyard. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLose | TriggerDescription$ When CARDNAME dies, you lose 2 life. +S:Mode$ Continuous | Affected$ Knight.YouCtrl | ValidAfterStack$ Spell.Knight | MayPlay$ True | EffectZone$ Battlefield | AffectedZone$ Graveyard | Description$ As long as NICKNAME is on the battlefield, you may cast Knight spells from your graveyard. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLose | TriggerDescription$ When NICKNAME dies, you lose 2 life. SVar:TrigLose:DB$ LoseLife | Defined$ You | LifeAmount$ 2 AI:RemoveDeck:Random SVar:DiscardMe:5 diff --git a/forge-gui/res/cardsfolder/m/malicious_affliction.txt b/forge-gui/res/cardsfolder/m/malicious_affliction.txt index d3f970b2341..f2083a1f2eb 100644 --- a/forge-gui/res/cardsfolder/m/malicious_affliction.txt +++ b/forge-gui/res/cardsfolder/m/malicious_affliction.txt @@ -2,7 +2,7 @@ Name:Malicious Affliction ManaCost:B B Types:Instant A:SP$ Destroy | Cost$ B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | CheckSVar$ Morbid | SVarCompare$ GE1 | TriggerDescription$ Morbid — When you cast this spell, if a creature died this turn, you may copy CARDNAME and may choose a new target for the copy. +T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | CheckSVar$ Morbid | SVarCompare$ GE1 | OptionalDecider$ You | TriggerDescription$ Morbid — When you cast this spell, if a creature died this turn, you may copy CARDNAME and may choose a new target for the copy. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature Oracle:Morbid — When you cast this spell, if a creature died this turn, you may copy Malicious Affliction and may choose a new target for the copy.\nDestroy target nonblack creature. diff --git a/forge-gui/res/cardsfolder/t/tempting_contract.txt b/forge-gui/res/cardsfolder/t/tempting_contract.txt index ca4bb83e3ee..1e8182f4225 100644 --- a/forge-gui/res/cardsfolder/t/tempting_contract.txt +++ b/forge-gui/res/cardsfolder/t/tempting_contract.txt @@ -2,10 +2,10 @@ Name:Tempting Contract ManaCost:4 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBRepeat | SubAbility$ DBToken | TriggerDescription$ At the beginning of your upkeep, each opponent may create a Treasure token. For each opponent who does, you create a Treasure token. -SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBOppToken | RepeatPlayers$ Player.Opponent | SubAbility$ DBToken | RepeatOptionalForEachPlayer$ True | RepeatOptionalMessage$ Do you want to create a Treasure token? -SVar:DBOppToken:DB$ Token | TokenScript$ c_a_treasure_sac | TokenOwner$ Player.IsRemembered | RememberTokens$ True +SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBOppToken | RepeatPlayers$ Opponent | RepeatOptionalForEachPlayer$ True | RememberDeciders$ True | RepeatOptionalMessage$ Do you want to create a Treasure token? | ChangeZoneTable$ True | SubAbility$ DBToken +SVar:DBOppToken:DB$ Token | TokenScript$ c_a_treasure_sac | TokenOwner$ Player.IsRemembered SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_treasure_sac | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Remembered$Amount +SVar:X:Count$RememberedSize DeckHas:Ability$Token|Sacrifice Oracle:At the beginning of your upkeep, each opponent may create a Treasure token. For each opponent who does, you create a Treasure token.