From b1df2d10081d4939d538a48d3e8c05b8adba9937 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Thu, 5 Jan 2023 16:10:50 +0100 Subject: [PATCH] Fix DiscardedThisTurn --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 9 +++++---- forge-ai/src/main/java/forge/ai/ComputerUtilMana.java | 9 +++++---- .../src/main/java/forge/ai/ability/ManaEffectAi.java | 1 + forge-ai/src/main/java/forge/ai/ability/ManifestAi.java | 2 +- .../forge/game/ability/effects/ChangeZoneAllEffect.java | 3 +-- .../forge/game/ability/effects/ChangeZoneEffect.java | 2 +- forge-game/src/main/java/forge/game/card/Card.java | 6 +++--- .../src/main/java/forge/game/card/CardProperty.java | 3 +-- forge-game/src/main/java/forge/game/player/Player.java | 3 +++ .../java/forge/game/spellability/AbilityManaPart.java | 4 ++-- .../main/java/forge/player/HumanPlaySpellAbility.java | 2 +- 11 files changed, 24 insertions(+), 20 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index bd12ad6c7e0..8ab5228fc26 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1063,6 +1063,10 @@ public class ComputerUtil { return true; } + if (cardState.hasKeyword(Keyword.EXALTED) || cardState.hasKeyword(Keyword.EXTORT)) { + return true; + } + if (cardState.hasKeyword(Keyword.RIOT) && ChooseGenericEffectAi.preferHasteForRiot(sa, ai)) { // Planning to choose Haste for Riot, so do this in Main 1 return true; @@ -1070,6 +1074,7 @@ public class ComputerUtil { // if we have non-persistent mana in our pool, would be good to try to use it and not waste it if (ai.getManaPool().willManaBeLostAtEndOfPhase()) { + // TODO should check if some will be kept and skip those boolean canUseToPayCost = false; for (byte color : ManaAtom.MANATYPES) { // tries to reuse any amount of colorless if cost only has generic @@ -1089,10 +1094,6 @@ public class ComputerUtil { return true; } - if (cardState.hasKeyword(Keyword.EXALTED) || cardState.hasKeyword(Keyword.EXTORT)) { - return true; - } - //cast equipments in Main1 when there are creatures to equip and no other unequipped equipment if (card.isEquipment()) { boolean playNow = false; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index f08f5a69332..87cc9c397b7 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -93,6 +93,7 @@ public class ComputerUtilMana { ability.setActivatingPlayer(card.getController(), true); if (ability.isManaAbility()) { score += ability.calculateScoreForManaAbility(); + // TODO check TriggersWhenSpent } else if (!ability.isTrigger() && ability.isPossible()) { score += 13; //add 13 for any non-mana activated abilities @@ -393,9 +394,9 @@ public class ComputerUtilMana { String manaProduced = toPay.isSnow() && hostCard.isSnow() ? "S" : GameActionUtil.generatedTotalMana(saPayment); //String originalProduced = manaProduced; - final Map repParams = AbilityKey.mapFromPlayer(ai); + final Map repParams = AbilityKey.mapFromAffected(hostCard); repParams.put(AbilityKey.Mana, manaProduced); - repParams.put(AbilityKey.Affected, hostCard); + repParams.put(AbilityKey.Activator, ai); repParams.put(AbilityKey.AbilityMana, saPayment); // RootAbility // TODO Damping Sphere might replace later? @@ -1614,9 +1615,9 @@ public class ComputerUtilMana { // setup produce mana replacement effects String origin = mp.getOrigProduced(); - final Map repParams = AbilityKey.mapFromPlayer(ai); + final Map repParams = AbilityKey.mapFromAffected(sourceCard); repParams.put(AbilityKey.Mana, origin); - repParams.put(AbilityKey.Affected, sourceCard); + repParams.put(AbilityKey.Activator, ai); repParams.put(AbilityKey.AbilityMana, m); // RootAbility List reList = game.getReplacementHandler().getReplacementList(ReplacementType.ProduceMana, repParams, ReplacementLayer.Other); diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index 22c5a093338..eb8104e47db 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -266,6 +266,7 @@ public class ManaEffectAi extends SpellAbilityAi { ManaPool mp = ai.getManaPool(); Mana test = null; if (mp.isEmpty()) { + // TODO use color from ability test = new Mana((byte) ManaAtom.COLORLESS, source, null); mp.addMana(test, false); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java index b807069b859..891fabb44ba 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java @@ -101,7 +101,7 @@ public class ManifestAi extends SpellAbilityAi { repParams.put(AbilityKey.Origin, card.getZone().getZoneType()); repParams.put(AbilityKey.Destination, ZoneType.Battlefield); repParams.put(AbilityKey.Source, sa.getHostCard()); - List list = game.getReplacementHandler().getReplacementList(ReplacementType.Moved, repParams, ReplacementLayer.Other); + List list = game.getReplacementHandler().getReplacementList(ReplacementType.Moved, repParams, ReplacementLayer.CantHappen); if (!list.isEmpty()) { return false; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java index 4436dfafd7f..9468d9a3cd4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java @@ -94,8 +94,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { if (!libCards.isEmpty()) { sa.getActivatingPlayer().getController().reveal(libCards, ZoneType.Library, libCards.get(0).getOwner()); } - final Map runParams = AbilityKey.newMap(); - runParams.put(AbilityKey.Player, sa.getActivatingPlayer()); + final Map runParams = AbilityKey.mapFromPlayer(sa.getActivatingPlayer()); runParams.put(AbilityKey.Target, tgtPlayers); game.getTriggerHandler().runTrigger(TriggerType.SearchedLibrary, runParams, false); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 89e84303122..68d6f40bac1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -782,7 +782,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (sa.hasParam("TrackDiscarded")) { - movedCard.setMadnessWithoutCast(true); + movedCard.setDiscarded(true); } } } 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 696cea94a1a..ad4f65c5634 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -226,7 +226,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private boolean tributed = false; private boolean embalmed = false; private boolean eternalized = false; - private boolean madnessWithoutCast = false; + private boolean discarded = false; private boolean flipped = false; private boolean facedown = false; @@ -5801,8 +5801,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } return getCastSA().isMadness(); } - public boolean getMadnessWithoutCast() { return madnessWithoutCast; } - public void setMadnessWithoutCast(boolean state) { madnessWithoutCast = state; } + public boolean wasDiscarded() { return discarded; } + public void setDiscarded(boolean state) { discarded = state; } public final boolean isMonstrous() { return monstrous; 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 1cd1130174a..2d13ad41bb2 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -984,8 +984,7 @@ public class CardProperty { return false; } - List cards = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Hand, "Card", source, spellAbility); - if (!cards.contains(card) && !card.getMadnessWithoutCast()) { + if (!card.wasDiscarded()) { return false; } } else if (property.startsWith("ControlledByPlayerInTheDirection")) { 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 50191ded7fd..747fb5dfc9b 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1444,6 +1444,9 @@ public class Player extends GameEntity implements Comparable { newCard = game.getAction().moveToGraveyard(c, sa, params); // Play the Discard sound } + + newCard.setDiscarded(true); + if (table != null) { table.put(origin, newCard.getZone().getZoneType(), newCard); } diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index b95f6119b3a..c5966bf587c 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -664,9 +664,9 @@ public class AbilityManaPart implements java.io.Serializable { // check for produce mana replacement effects - they mess this up, so just use the mana ability final Card source = am.getHostCard(); final Player activator = am.getActivatingPlayer(); - final Map repParams = AbilityKey.mapFromPlayer(activator); + final Map repParams = AbilityKey.mapFromAffected(source); repParams.put(AbilityKey.Mana, getOrigProduced()); - repParams.put(AbilityKey.Affected, source); + repParams.put(AbilityKey.Activator, activator); repParams.put(AbilityKey.AbilityMana, am.getRootAbility()); if (!source.getGame().getReplacementHandler().getReplacementList(ReplacementType.ProduceMana, repParams, ReplacementLayer.Other).isEmpty()) { diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index 43994257c45..f5010b2f039 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -173,7 +173,7 @@ public class HumanPlaySpellAbility { if (ability.getHostCard().isMadness()) { // if a player failed to play madness cost, move the card to graveyard Card newCard = game.getAction().moveToGraveyard(c, null); - newCard.setMadnessWithoutCast(true); + newCard.setDiscarded(true); } } else { payment.refundPayment();