From 41a3b24aefc46b76a35dff5b8e033aa23a0c7aa0 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 4 Nov 2024 11:27:51 +0100 Subject: [PATCH] Fix Windfall (#6530) --- .../java/forge/game/ability/effects/DrawEffect.java | 12 ++++-------- .../forge/game/ability/effects/LifeGainEffect.java | 13 ++----------- forge-gui/res/cardsfolder/c/cut_a_deal.txt | 2 +- forge-gui/res/cardsfolder/m/malignant_growth.txt | 5 +++-- forge-gui/res/cardsfolder/t/temporary_truce.txt | 9 +++++---- forge-gui/res/cardsfolder/t/truce.txt | 9 +++++---- forge-gui/res/cardsfolder/w/whispering_madness.txt | 13 +++++-------- 7 files changed, 25 insertions(+), 38 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java index 42abaa54306..6f51da53447 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java @@ -56,7 +56,7 @@ public class DrawEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card source = sa.getHostCard(); - + final int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa) : 1; final boolean upto = sa.hasParam("Upto"); final boolean optional = sa.hasParam("OptionalDecider") || upto; Map moveParams = AbilityKey.newMap(); @@ -70,20 +70,17 @@ public class DrawEffect extends SpellAbilityEffect { continue; } - int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa) : 1; - numCards *= Collections.frequency(tgts, p); + int actualNum = numCards * Collections.frequency(tgts, p); // it is optional, not upto and player can't choose to draw that many cards - if (optional && !upto && !p.canDrawAmount(numCards)) { + if (optional && !upto && !p.canDrawAmount(actualNum)) { continue; } - if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDrawCards", Lang.nounWithAmount(numCards, " card")), null)) { + if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDrawCards", Lang.nounWithAmount(actualNum, " card")), null)) { continue; } - int actualNum = numCards; - if (upto) { // if it is upto, player can only choose how many cards they can draw actualNum = StaticAbilityCantDraw.canDrawAmount(p, actualNum); } @@ -101,7 +98,6 @@ public class DrawEffect extends SpellAbilityEffect { if (sa.hasParam("RememberDrawn")) { source.addRemembered(drawn); } - sa.setSVar("AFNotDrawnNum_" + p.getId(), "Number$" + drawn.size()); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java index c7e53035554..2e960e40f6f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java @@ -48,23 +48,14 @@ public class LifeGainEffect extends SpellAbilityEffect { */ @Override public void resolve(SpellAbility sa) { - String amount = sa.getParam("LifeAmount"); - boolean variableAmount = amount.equals("AFNotDrawnNum"); - if (variableAmount) { - amount = "X"; - } + final int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa); final List tgts = getTargetPlayersWithDuplicates(true, "Defined", sa); for (final Player p : Sets.newHashSet(tgts)) { if (!p.isInGame()) { continue; } - if (variableAmount) { - sa.setSVar("AFNotDrawnNum", sa.getSVar("AFNotDrawnNum_" + p.getId())); - } - int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), amount, sa); - lifeAmount *= Collections.frequency(tgts, p); - p.gainLife(lifeAmount, sa.getHostCard(), sa); + p.gainLife(lifeAmount * Collections.frequency(tgts, p), sa.getHostCard(), sa); } } diff --git a/forge-gui/res/cardsfolder/c/cut_a_deal.txt b/forge-gui/res/cardsfolder/c/cut_a_deal.txt index 19e9508f556..30e81855dca 100644 --- a/forge-gui/res/cardsfolder/c/cut_a_deal.txt +++ b/forge-gui/res/cardsfolder/c/cut_a_deal.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Draw | Defined$ Opponent | RememberDrawn$ AllReplaced | SubAbility$ DBDraw | SpellDescription$ Each opponent draws a card, then you draw a card for each opponent who drew a card this way. SVar:DBDraw:DB$ Draw | NumCards$ X | SubAbility$ DBCleanup | StackDescription$ {p:You} draws a card for each opponent who drew a card this way. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:PlayerCountRememberedOwner$Amount +SVar:X:PlayerCountOpponents$HasPropertyIsRememberedOrController AI:RemoveDeck:Random Oracle:Each opponent draws a card, then you draw a card for each opponent who drew a card this way. diff --git a/forge-gui/res/cardsfolder/m/malignant_growth.txt b/forge-gui/res/cardsfolder/m/malignant_growth.txt index 186b61c8d69..394af35bbb9 100644 --- a/forge-gui/res/cardsfolder/m/malignant_growth.txt +++ b/forge-gui/res/cardsfolder/m/malignant_growth.txt @@ -5,8 +5,9 @@ K:Cumulative upkeep:1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, put a growth counter on CARDNAME. T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Opponent | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's draw step, that player draws an additional card for each growth counter on CARDNAME, then CARDNAME deals damage to the player equal to the number of cards they drew this way. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ GROWTH | CounterNum$ 1 -SVar:TrigDraw:DB$ Draw | Defined$ TriggeredPlayer | NumCards$ X | SubAbility$ DBDamage -SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X +SVar:TrigDraw:DB$ Draw | Defined$ TriggeredPlayer | NumCards$ X | RememberDrawn$ AllReplaced | SubAbility$ DBDamage +SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ Remembered$Amount | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$CardCounters.GROWTH AI:RemoveDeck:Random Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of your upkeep, put a growth counter on Malignant Growth.\nAt the beginning of each opponent's draw step, that player draws an additional card for each growth counter on Malignant Growth, then Malignant Growth deals damage to the player equal to the number of cards they drew this way. diff --git a/forge-gui/res/cardsfolder/t/temporary_truce.txt b/forge-gui/res/cardsfolder/t/temporary_truce.txt index 01d35056c0c..f1e3df4a152 100644 --- a/forge-gui/res/cardsfolder/t/temporary_truce.txt +++ b/forge-gui/res/cardsfolder/t/temporary_truce.txt @@ -1,10 +1,11 @@ Name:Temporary Truce ManaCost:1 W Types:Sorcery -A:SP$ Draw | Defined$ Player | Upto$ True | NumCards$ 2 | SubAbility$ DBRepeat | AILogic$ GainLife | SpellDescription$ Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. -SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBGainLife | StackDescription$ For each card less than two a player draws this way, that player gains 2 life. -SVar:DBGainLife:DB$ GainLife | LifeAmount$ AFNotDrawnNum | Defined$ Player.IsRemembered -SVar:Y:SVar$AFNotDrawnNum/NMinus.2 +A:SP$ Draw | Defined$ Player | Upto$ True | NumCards$ 2 | RememberDrawn$ AllReplaced | SubAbility$ DBRepeat | AILogic$ GainLife | SpellDescription$ Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. +SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBGainLife | SubAbility$ DBCleanup | StackDescription$ For each card less than two a player draws this way, that player gains 2 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | Defined$ Player.IsRemembered +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Y:Remembered$Valid Card.RememberedPlayerOwn/NMinus.2 SVar:X:SVar$Y/Twice AI:RemoveDeck:All Oracle:Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. diff --git a/forge-gui/res/cardsfolder/t/truce.txt b/forge-gui/res/cardsfolder/t/truce.txt index 2a91a8a5ecb..2d1270f37b3 100644 --- a/forge-gui/res/cardsfolder/t/truce.txt +++ b/forge-gui/res/cardsfolder/t/truce.txt @@ -1,10 +1,11 @@ Name:Truce ManaCost:2 W Types:Instant -A:SP$ Draw | Defined$ Player | Upto$ True | NumCards$ 2 | SubAbility$ DBRepeat | AILogic$ GainLife | SpellDescription$ Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. -SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBGainLife | StackDescription$ For each card less than two a player draws this way, that player gains 2 life. -SVar:DBGainLife:DB$ GainLife | LifeAmount$ AFNotDrawnNum | Defined$ Player.IsRemembered -SVar:Y:SVar$AFNotDrawnNum/NMinus.2 +A:SP$ Draw | Defined$ Player | Upto$ True | NumCards$ 2 | RememberDrawn$ AllReplaced | SubAbility$ DBRepeat | AILogic$ GainLife | SpellDescription$ Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. +SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBGainLife | SubAbility$ DBCleanup | StackDescription$ For each card less than two a player draws this way, that player gains 2 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | Defined$ Player.IsRemembered +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Y:Remembered$Valid Card.RememberedPlayerOwn/NMinus.2 SVar:X:SVar$Y/Twice AI:RemoveDeck:All Oracle:Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. diff --git a/forge-gui/res/cardsfolder/w/whispering_madness.txt b/forge-gui/res/cardsfolder/w/whispering_madness.txt index a1cbb55af44..bd34b8aa758 100644 --- a/forge-gui/res/cardsfolder/w/whispering_madness.txt +++ b/forge-gui/res/cardsfolder/w/whispering_madness.txt @@ -2,14 +2,11 @@ Name:Whispering Madness ManaCost:2 U B Types:Sorcery K:Cipher -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ MadnessDiscard | SubAbility$ MadnessDraw | SpellDescription$ Each player discards their hand, then draws cards equal to the greatest number of cards a player discarded this way. -SVar:MadnessDiscard:DB$ Discard | Defined$ Player.IsRemembered | Mode$ Hand | RememberDiscarded$ True | SubAbility$ MadnessSaveAmount -SVar:MadnessSaveAmount:DB$ StoreSVar | SVar$ MaxDiscard | Type$ CountSVar | Expression$ NumDiscard | ConditionCheckSVar$ NumDiscard | ConditionSVarCompare$ GTMaxDiscard | SubAbility$ MadnessCleanUp -SVar:MadnessCleanUp:DB$ Cleanup | ClearRemembered$ True -SVar:MadnessDraw:DB$ Draw | Defined$ Player | NumCards$ MaxDiscard | SubAbility$ MadnessReset -SVar:MadnessReset:DB$ StoreSVar | SVar$ MaxDiscard | Type$ Number | Expression$ 0 -SVar:NumDiscard:Count$RememberedSize/Minus.1 -SVar:MaxDiscard:Number$0 +A:SP$ Discard | Defined$ Player | Mode$ Hand | RememberDiscarded$ True | SubAbility$ WindfallDraw | SpellDescription$ Each player discards their hand, then draws cards equal to the greatest number of cards a player discarded this way. +SVar:WindfallDraw:DB$ Draw | Defined$ Player | NumCards$ X | SubAbility$ WindfallCleanup +SVar:WindfallCleanup:DB$ Cleanup | ClearRemembered$ True +# Some cards may allow you to discard to other zones +SVar:X:PlayerCountPlayers$HighestValidGraveyard,Library,Exile Card.IsRemembered+YouOwn AI:RemoveDeck:All AI:RemoveDeck:Random DeckNeeds:Type$Creature