From 32b56018a6aef53e5d6a8444cfc4e296186b6809 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 5 Mar 2020 07:31:16 +0100 Subject: [PATCH 1/5] GameAction: refactor setting CastSA --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 15 --------------- .../src/main/java/forge/game/GameAction.java | 12 ++++++++++++ .../java/forge/player/HumanPlaySpellAbility.java | 5 +---- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index ff73d875785..c9eb6634f57 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -91,9 +91,6 @@ public class ComputerUtil { } } - source.setCastSA(sa); - sa.setLastStateBattlefield(game.getLastStateBattlefield()); - sa.setLastStateGraveyard(game.getLastStateGraveyard()); sa.setHostCard(game.getAction().moveToStack(source, sa)); } @@ -219,9 +216,6 @@ public class ComputerUtil { final Card source = sa.getHostCard(); if (sa.isSpell() && !source.isCopiedSpell()) { - source.setCastSA(sa); - sa.setLastStateBattlefield(game.getLastStateBattlefield()); - sa.setLastStateGraveyard(game.getLastStateGraveyard()); sa.setHostCard(game.getAction().moveToStack(source, sa)); } @@ -246,9 +240,6 @@ public class ComputerUtil { final Card source = sa.getHostCard(); if (sa.isSpell() && !source.isCopiedSpell()) { - source.setCastSA(sa); - sa.setLastStateBattlefield(game.getLastStateBattlefield()); - sa.setLastStateGraveyard(game.getLastStateGraveyard()); sa.setHostCard(game.getAction().moveToStack(source, sa)); } @@ -267,9 +258,6 @@ public class ComputerUtil { final Card source = newSA.getHostCard(); if (newSA.isSpell() && !source.isCopiedSpell()) { - source.setCastSA(newSA); - sa.setLastStateBattlefield(game.getLastStateBattlefield()); - sa.setLastStateGraveyard(game.getLastStateGraveyard()); newSA.setHostCard(game.getAction().moveToStack(source, sa)); if (newSA.getApi() == ApiType.Charm && !newSA.isWrapper()) { @@ -290,9 +278,6 @@ public class ComputerUtil { if (ComputerUtilCost.canPayCost(sa, ai)) { final Card source = sa.getHostCard(); if (sa.isSpell() && !source.isCopiedSpell()) { - source.setCastSA(sa); - sa.setLastStateBattlefield(game.getLastStateBattlefield()); - sa.setLastStateGraveyard(game.getLastStateGraveyard()); sa.setHostCard(game.getAction().moveToStack(source, sa)); } diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 16b67a2d4e7..1d35903e7a1 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -547,9 +547,21 @@ public class GameAction { c.setCastSA(null); } else if (zoneTo.is(ZoneType.Stack)) { c.setCastFrom(zoneFrom.getZoneType()); + if (cause != null && cause.isSpell() && c.equals(cause.getHostCard()) && !c.isCopiedSpell()) { + cause.setLastStateBattlefield(game.getLastStateBattlefield()); + cause.setLastStateGraveyard(game.getLastStateGraveyard()); + c.setCastSA(cause); + } else { + c.setCastSA(null); + } } else if (!(zoneTo.is(ZoneType.Battlefield) && zoneFrom.is(ZoneType.Stack))) { c.setCastFrom(null); c.setCastSA(null); + + // TODO check why these are not reset + c.setXManaCostPaid(0); + c.setSunburstValue(0); + c.setXManaCostPaidByColor(null); } if (c.isAura() && zoneTo.is(ZoneType.Battlefield) && ((zoneFrom == null) || !zoneFrom.is(ZoneType.Stack)) diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index a337db37099..36f124105a3 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -105,10 +105,7 @@ public class HumanPlaySpellAbility { if (ability.isSpell() && !ability.isCastFaceDown() && fromState == CardStateName.FaceDown) { c.turnFaceUp(); } - c.setCastSA(ability); - ability.setLastStateBattlefield(game.getLastStateBattlefield()); - ability.setLastStateGraveyard(game.getLastStateGraveyard()); - ability.setHostCard(game.getAction().moveToStack(c, null)); + ability.setHostCard(game.getAction().moveToStack(c, ability)); } if (!ability.isCopied()) { From d5b578b306b1fdd21f6421c68dd7c9e24f3ac385 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 6 Mar 2020 07:29:37 +0100 Subject: [PATCH 2/5] Card: move reseting xmana paid to clearTemporaryVars --- forge-game/src/main/java/forge/game/GameAction.java | 5 ----- forge-game/src/main/java/forge/game/card/Card.java | 2 ++ 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 1d35903e7a1..16ec6662f0d 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -557,11 +557,6 @@ public class GameAction { } else if (!(zoneTo.is(ZoneType.Battlefield) && zoneFrom.is(ZoneType.Stack))) { c.setCastFrom(null); c.setCastSA(null); - - // TODO check why these are not reset - c.setXManaCostPaid(0); - c.setSunburstValue(0); - c.setXManaCostPaidByColor(null); } if (c.isAura() && zoneTo.is(ZoneType.Battlefield) && ((zoneFrom == null) || !zoneFrom.is(ZoneType.Stack)) 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 0be3279d3e4..ee8179ba4a5 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6353,6 +6353,8 @@ public class Card extends GameEntity implements Comparable { removeSVar("PayX"); // Temporary AI X announcement variable removeSVar("IsCastFromPlayEffect"); // Temporary SVar indicating that the spell is cast indirectly via AF Play setSunburstValue(0); // Sunburst + setXManaCostPaid(0); + setXManaCostPaidByColor(null); } public final int getFinalChapterNr() { From e1659a4539cbe9ba35391fc6c4347d3bff42e2cc Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 8 Mar 2020 11:00:14 +0100 Subject: [PATCH 3/5] Combat: use lkiCase only if blocker itself is an lki --- forge-game/src/main/java/forge/game/combat/Combat.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 4fc83734d74..4c85ccd5cac 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -882,6 +882,10 @@ public class Combat { return true; // is blocking something at the moment } + if (!blocker.isLKI()) { + return false; + } + CombatLki lki = lkiCache.get(blocker); return null != lki && !lki.isAttacker; // was blocking something anyway } @@ -892,7 +896,11 @@ public class Combat { if (blockers != null && blockers.contains(blocker)) { return true; // is blocking the attacker's band at the moment } - + + if (!blocker.isLKI()) { + return false; + } + CombatLki lki = lkiCache.get(blocker); return null != lki && !lki.isAttacker && lki.relatedBands.contains(ab); // was blocking that very band } From fa67ee73a57b875cab6e71be04f404c6236df78b Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 8 Mar 2020 11:09:29 +0100 Subject: [PATCH 4/5] Card: cleanup multikicker values --- forge-game/src/main/java/forge/game/card/Card.java | 2 ++ 1 file changed, 2 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 ee8179ba4a5..1d278409976 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6355,6 +6355,8 @@ public class Card extends GameEntity implements Comparable { setSunburstValue(0); // Sunburst setXManaCostPaid(0); setXManaCostPaidByColor(null); + setKickerMagnitude(0); + setPseudoMultiKickerMagnitude(0); } public final int getFinalChapterNr() { From 5c9251e295a51943f493cefc5d844b5122d7d003 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 8 Mar 2020 15:06:52 +0100 Subject: [PATCH 5/5] SpellAbility: adding an Announce needs to be to originalMapParams too --- .../src/main/java/forge/game/spellability/SpellAbility.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 75479eaadfc..2bfe8b388a4 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1299,6 +1299,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit String announce = getParam("Announce"); if (StringUtils.isBlank(announce)) { mapParams.put("Announce", variable); + originalMapParams.put("Announce", variable); return; } String[] announcedOnes = TextUtil.split(announce, ','); @@ -1308,6 +1309,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } } mapParams.put("Announce", announce + ";" + variable); + originalMapParams.put("Announce", announce + ";" + variable); } public boolean isXCost() {