From eaee14f3ca211c93999ed5fd38ba4ef74c6cc514 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 23 Mar 2023 11:10:04 +0100 Subject: [PATCH 1/2] Clean up --- forge-ai/src/main/java/forge/ai/AiCostDecision.java | 7 +------ forge-ai/src/main/java/forge/ai/ability/CharmAi.java | 2 +- forge-game/src/main/java/forge/game/Game.java | 1 - .../java/forge/game/ability/effects/CharmEffect.java | 8 ++++---- .../java/forge/game/cost/CostDecisionMakerBase.java | 10 +++++++++- forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt | 2 +- forge-gui/res/cardsfolder/r/rasputin_dreamweaver.txt | 6 +++--- .../src/main/java/forge/player/HumanCostDecision.java | 10 +++------- .../main/java/forge/player/HumanPlaySpellAbility.java | 2 +- 9 files changed, 23 insertions(+), 25 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 65a7571eafb..c23d24e7299 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -35,16 +35,11 @@ import forge.util.TextUtil; import forge.util.collect.FCollectionView; public class AiCostDecision extends CostDecisionMakerBase { - private final SpellAbility ability; - private final Card source; - private final CardCollection discarded; private final CardCollection tapped; public AiCostDecision(Player ai0, SpellAbility sa, final boolean effect) { - super(ai0, effect); - ability = sa; - source = ability.getHostCard(); + super(ai0, effect, sa, sa.getHostCard()); discarded = new CardCollection(); tapped = new CardCollection(); diff --git a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java index 79de3c099e3..b1e981d9d6a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java @@ -26,7 +26,7 @@ public class CharmAi extends SpellAbilityAi { @Override protected boolean checkApiLogic(Player ai, SpellAbility sa) { final Card source = sa.getHostCard(); - List choices = CharmEffect.makePossibleOptions(sa, false); + List choices = CharmEffect.makePossibleOptions(sa); final int num; final int min; diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index e9551be1576..4c7fa6d0a43 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -943,7 +943,6 @@ public class Game { public GameStage getAge() { return age; } - public void setAge(GameStage value) { age = value; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java index 5b0233df5b1..6a0a2447686 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java @@ -20,7 +20,7 @@ import forge.util.collect.FCollection; public class CharmEffect extends SpellAbilityEffect { - public static List makePossibleOptions(final SpellAbility sa, boolean forDesc) { + public static List makePossibleOptions(final SpellAbility sa) { final Card source = sa.getHostCard(); List restriction = null; @@ -30,7 +30,7 @@ public class CharmEffect extends SpellAbilityEffect { List choices = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); - if (!forDesc) { + if (source.getZone() != null) { List toRemove = Lists.newArrayList(); for (AbilitySub ch : choices) { // 603.3c If one of the modes would be illegal, that mode can't be chosen. @@ -55,7 +55,7 @@ public class CharmEffect extends SpellAbilityEffect { public static String makeFormatedDescription(SpellAbility sa) { Card source = sa.getHostCard(); - List list = CharmEffect.makePossibleOptions(sa, true); + List list = CharmEffect.makePossibleOptions(sa); final int num; boolean additionalDesc = sa.hasParam("AdditionalDescription"); boolean optional = sa.hasParam("Optional"); @@ -169,7 +169,7 @@ public class CharmEffect extends SpellAbilityEffect { //this resets all previous choices sa.setSubAbility(null); - List choices = makePossibleOptions(sa, false); + List choices = makePossibleOptions(sa); // Entwine does use all Choices if (sa.isEntwine()) { diff --git a/forge-game/src/main/java/forge/game/cost/CostDecisionMakerBase.java b/forge-game/src/main/java/forge/game/cost/CostDecisionMakerBase.java index a5cf64503b1..eeec65b2208 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDecisionMakerBase.java +++ b/forge-game/src/main/java/forge/game/cost/CostDecisionMakerBase.java @@ -1,15 +1,23 @@ package forge.game.cost; +import forge.game.card.Card; import forge.game.player.Player; +import forge.game.spellability.SpellAbility; public abstract class CostDecisionMakerBase implements ICostVisitor { protected final Player player; + protected final SpellAbility ability; + protected final Card source; private boolean effect; - public CostDecisionMakerBase(Player player0, boolean effect0) { + + public CostDecisionMakerBase(Player player0, boolean effect0, SpellAbility ability0, Card source0) { player = player0; effect = effect0; + ability = ability0; + source = source0; } + public Player getPlayer() { return player; } public abstract boolean paysRightAfterDecision(); public boolean isEffect() { diff --git a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt index b8b0beb1359..21d2dcd68ee 100644 --- a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt +++ b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt @@ -3,6 +3,6 @@ ManaCost:U U B B Types:Legendary Creature Shapeshifter PT:3/3 K:Hexproof -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ LazavCopy | OptionalDecider$ You | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ LazavCopy | OptionalDecider$ You | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from anywhere, you may have CARDNAME become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability. SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True | Optional$ True | AddSVars$ LazavCopy | AILogic$ IfDefinedCreatureIsBetter Oracle:Hexproof\nWhenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability. diff --git a/forge-gui/res/cardsfolder/r/rasputin_dreamweaver.txt b/forge-gui/res/cardsfolder/r/rasputin_dreamweaver.txt index 4937323a179..8478b31d247 100644 --- a/forge-gui/res/cardsfolder/r/rasputin_dreamweaver.txt +++ b/forge-gui/res/cardsfolder/r/rasputin_dreamweaver.txt @@ -4,9 +4,9 @@ Types:Legendary Creature Human Wizard PT:4/1 K:etbCounter:DREAM:7 K:CARDNAME can't have more than seven dream counters on it. -A:AB$ Mana | Cost$ SubCounter<1/DREAM> | Produced$ C | SpellDescription$ Add {C}. -A:AB$ PreventDamage | Cost$ SubCounter<1/DREAM> | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to CARDNAME this turn. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | IsPresent$ Card.Self+startedTheTurnUntapped | TriggerDescription$ At the beginning of your upkeep, if CARDNAME started the turn untapped, put a dream counter on it. +A:AB$ Mana | Cost$ SubCounter<1/DREAM/NICKNAME> | Produced$ C | SpellDescription$ Add {C}. +A:AB$ PreventDamage | Cost$ SubCounter<1/DREAM/NICKNAME> | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to NICKNAME this turn. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | IsPresent$ Card.Self+startedTheTurnUntapped | TriggerDescription$ At the beginning of your upkeep, if NICKNAME started the turn untapped, put a dream counter on it. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ DREAM | CounterNum$ 1 DeckHas:Ability$Counters Oracle:Rasputin Dreamweaver enters the battlefield with seven dream counters on it.\nRemove a dream counter from Rasputin: Add {C}.\nRemove a dream counter from Rasputin: Prevent the next 1 damage that would be dealt to Rasputin this turn.\nAt the beginning of your upkeep, if Rasputin started the turn untapped, put a dream counter on it.\nRasputin can't have more than seven dream counters on it. diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index e867b8a4d7b..165c10c5f92 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -47,20 +47,16 @@ import forge.util.collect.FCollectionView; public class HumanCostDecision extends CostDecisionMakerBase { private final PlayerControllerHuman controller; - private final SpellAbility ability; - private final Card source; private String orString = null; private boolean mandatory; - public HumanCostDecision(final PlayerControllerHuman controller, final Player p, final SpellAbility sa, final boolean effect, final Card source) { - this(controller, p, sa, effect, source, null); + public HumanCostDecision(final PlayerControllerHuman controller, final Player p, final SpellAbility sa, final boolean effect) { + this(controller, p, sa, effect, sa.getHostCard(), null); } public HumanCostDecision(final PlayerControllerHuman controller, final Player p, final SpellAbility sa, final boolean effect, final Card source, final String orString) { - super(p, effect); + super(p, effect, sa, source); this.controller = controller; - ability = sa; mandatory = sa.getPayCosts().isMandatory(); - this.source = source; this.orString = orString; } diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index 40a0e80cba8..84b01c9b273 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -165,7 +165,7 @@ public class HumanPlaySpellAbility { && ability.canCastTiming(human) && ability.checkRestrictions(human) && ability.isLegalAfterStack() - && (isFree || payment.payCost(new HumanCostDecision(controller, human, ability, false, ability.getHostCard()))); + && (isFree || payment.payCost(new HumanCostDecision(controller, human, ability, false))); game.clearTopLibsCast(ability); From fad1327a088bb11b97035f07df492f8147e62a4c Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 23 Mar 2023 11:10:46 +0100 Subject: [PATCH 2/2] Update Charm desc when turn restriction is lifted --- forge-game/src/main/java/forge/game/card/Card.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 53bec282baf..d82fbd469d0 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -7119,8 +7119,12 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public void resetChosenModeTurn() { + boolean updateView = !chosenModesTurn.isEmpty() || !chosenModesTurnStatic.isEmpty(); chosenModesTurn.clear(); chosenModesTurnStatic.clear(); + if (updateView) { + updateAbilityTextForView(); + } } public int getPlaneswalkerAbilityActivated() {