From d94ceaf492db0dee02d2af2cba2b234f3f543a7d Mon Sep 17 00:00:00 2001 From: John Date: Sun, 28 Mar 2021 21:57:32 +0000 Subject: [PATCH 1/4] Update adrix_and_nev_twincasters.txt --- .../res/cardsfolder/upcoming/adrix_and_nev_twincasters.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/adrix_and_nev_twincasters.txt b/forge-gui/res/cardsfolder/upcoming/adrix_and_nev_twincasters.txt index 45ba80fa674..0e507c3a925 100644 --- a/forge-gui/res/cardsfolder/upcoming/adrix_and_nev_twincasters.txt +++ b/forge-gui/res/cardsfolder/upcoming/adrix_and_nev_twincasters.txt @@ -1,6 +1,6 @@ Name:Adrix and Nev, Twincasters ManaCost:2 G U -Types:Creature Merfolk Wizard +Types:Legendary Creature Merfolk Wizard PT:2/2 K:Ward:2 R:Event$ CreateToken | ActiveZones$ Battlefield | ValidPlayer$ Player | ReplaceWith$ DoubleToken | Description$ If one or more tokens would be created, twice that many of those tokens are created instead. From c08775f3e3b01f5305dc75e28926dcc2c621e886 Mon Sep 17 00:00:00 2001 From: Adam Pantel <> Date: Sun, 28 Mar 2021 22:02:54 -0400 Subject: [PATCH 2/4] Inzerva doesn't target --- forge-gui/res/cardsfolder/i/inzerva_master_of_insights.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/i/inzerva_master_of_insights.txt b/forge-gui/res/cardsfolder/i/inzerva_master_of_insights.txt index 2b0d25dce8e..be424190e75 100644 --- a/forge-gui/res/cardsfolder/i/inzerva_master_of_insights.txt +++ b/forge-gui/res/cardsfolder/i/inzerva_master_of_insights.txt @@ -2,8 +2,8 @@ Name:Inzerva, Master of Insights ManaCost:1 2/U 2/R Types:Legendary Planeswalker Inzerva Loyalty:4 -A:AB$ Draw | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Draw two cards, then discard a card. | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ Targeted | NumCards$ 1 | Mode$ TgtChoose +A:AB$ Draw | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | NumCards$ 2 | SpellDescription$ Draw two cards, then discard a card. | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose A:AB$ RepeatEach | Cost$ SubCounter<2/LOYALTY> | RepeatPlayers$ Opponent | RepeatSubAbility$ DBDig | SubAbility$ DBScry | Planeswalker$ True | SpellDescription$ Look at the top two cards of each other player's library, then put any number of them on the bottom of that library and the rest on top in any order. SVar:DBDig:DB$ Dig | Defined$ Remembered | DigNum$ 2 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 SVar:DBScry:DB$ Scry | ScryNum$ 2 From 82f0c85bd09d73d9fe517390f8f01c7bc2f89802 Mon Sep 17 00:00:00 2001 From: Bug Hunter Date: Mon, 29 Mar 2021 07:59:43 +0000 Subject: [PATCH 3/4] Fix alternate state descriptions when viewed from original --- .../java/forge/game/replacement/ReplacementEffect.java | 8 +++++++- .../main/java/forge/game/spellability/SpellAbility.java | 9 ++++++++- .../java/forge/game/staticability/StaticAbility.java | 8 +++++++- forge-game/src/main/java/forge/game/trigger/Trigger.java | 8 +++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java index 3a62c623aab..ef6d5e1b0fc 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java @@ -216,7 +216,13 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { public String getDescription() { if (hasParam("Description") && !this.isSuppressed()) { String desc = AbilityUtils.applyDescriptionTextChangeEffects(getParam("Description"), this); - String currentName = getHostCard().getName(); + String currentName; + if (this.isIntrinsic() && !this.getHostCard().isMutated() && cardState != null) { + currentName = cardState.getName(); + } + else { + currentName = getHostCard().getName(); + } desc = CardTranslation.translateSingleDescriptionText(desc, currentName); desc = TextUtil.fastReplace(desc, "CARDNAME", CardTranslation.getTranslatedName(currentName)); desc = TextUtil.fastReplace(desc, "NICKNAME", Lang.getInstance().getNickName(CardTranslation.getTranslatedName(currentName))); 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 cd0e1746df2..1f31fdd7d4c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -842,7 +842,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } String desc = node.getDescription(); if (node.getHostCard() != null) { - String currentName = node.getHostCard().getName(); + String currentName; + // if alternate state is viewed while card uses original + if (node.isIntrinsic() && !node.getHostCard().isMutated() && node.cardState != null) { + currentName = node.cardState.getName(); + } + else { + currentName = node.getHostCard().getName(); + } desc = CardTranslation.translateMultipleDescriptionText(desc, currentName); desc = TextUtil.fastReplace(desc, "CARDNAME", CardTranslation.getTranslatedName(currentName)); desc = TextUtil.fastReplace(desc, "NICKNAME", Lang.getInstance().getNickName(CardTranslation.getTranslatedName(currentName))); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 7b20550252a..7790f8ec25f 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -208,7 +208,13 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone @Override public final String toString() { if (hasParam("Description") && !this.isSuppressed()) { - String currentName = this.hostCard.getName(); + String currentName; + if (this.isIntrinsic() && !this.getHostCard().isMutated() && cardState != null) { + currentName = cardState.getName(); + } + else { + currentName = getHostCard().getName(); + } String desc = CardTranslation.translateSingleDescriptionText(getParam("Description"), currentName); desc = TextUtil.fastReplace(desc, "CARDNAME", CardTranslation.getTranslatedName(currentName)); desc = TextUtil.fastReplace(desc, "NICKNAME", Lang.getInstance().getNickName(CardTranslation.getTranslatedName(currentName))); diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 5357dd681ab..537390ee31d 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -131,7 +131,13 @@ public abstract class Trigger extends TriggerReplacementBase { if (hasParam("TriggerDescription") && !this.isSuppressed()) { StringBuilder sb = new StringBuilder(); - String currentName = getHostCard().getName(); + String currentName; + if (this.isIntrinsic() && !this.getHostCard().isMutated() && cardState != null) { + currentName = cardState.getName(); + } + else { + currentName = getHostCard().getName(); + } String desc = getParam("TriggerDescription"); if (!desc.contains("ABILITY")) { desc = CardTranslation.translateSingleDescriptionText(getParam("TriggerDescription"), currentName); From 28dbb309cfd541ab263bae8ad6c516a6dae4c569 Mon Sep 17 00:00:00 2001 From: Bug Hunter Date: Mon, 29 Mar 2021 08:00:21 +0000 Subject: [PATCH 4/4] TargetSelection: Fix stack peeking detection --- .../main/java/forge/player/TargetSelection.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index 4d2558cf992..b8565bf6876 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -266,11 +266,11 @@ public class TargetSelection { } if (((CardView) chosen).getZone().equals(ZoneType.Stack)) { for (final SpellAbilityStackInstance si : game.getStack()) { - // avoid peeking own SI so target is not changed - if (si.compareToSpellAbility(ability)) { - continue; - } SpellAbility abilityOnStack = si.getSpellAbility(true); + if (si.compareToSpellAbility(ability)) { + // By peeking at stack item, target is set to its SI state. So set it back before adding targets + ability.resetTargets(); + } if (abilityOnStack.getHostCard().getView().equals(chosen)) { ability.getTargets().add(abilityOnStack); break; @@ -293,11 +293,11 @@ public class TargetSelection { final Game game = ability.getActivatingPlayer().getGame(); for (final SpellAbilityStackInstance si : game.getStack()) { - // avoid peeking own SI so target is not changed - if (si.compareToSpellAbility(ability)) { - continue; - } SpellAbility abilityOnStack = si.getSpellAbility(true); + if (si.compareToSpellAbility(ability)) { + // By peeking at stack item, target is set to its SI state. So set it back before adding targets + ability.resetTargets(); + } if (ability.canTargetSpellAbility(abilityOnStack)) { stackItemViewCache.put(si.getView(), si); selectOptions.add(si.getView());