From 22a9b173a56b4437df1427e2e44efc4bf305265e Mon Sep 17 00:00:00 2001 From: Jetz Date: Wed, 12 Nov 2025 09:28:51 -0500 Subject: [PATCH 1/3] Replace flavor names into oracle text. --- forge-core/src/main/java/forge/card/CardFace.java | 13 ++++++++++++- forge-core/src/main/java/forge/card/CardRules.java | 5 ----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardFace.java b/forge-core/src/main/java/forge/card/CardFace.java index d7997375c71..bd1d29e1ae8 100644 --- a/forge-core/src/main/java/forge/card/CardFace.java +++ b/forge-core/src/main/java/forge/card/CardFace.java @@ -1,6 +1,7 @@ package forge.card; import forge.card.mana.ManaCost; +import forge.util.Lang; import org.apache.commons.lang3.StringUtils; import java.util.*; @@ -185,7 +186,17 @@ final class CardFace implements ICardFace, Cloneable { } void assignMissingFieldsToVariant(CardFace variant) { - if(variant.oracleText == null) variant.oracleText = this.oracleText; + if(variant.oracleText == null) { + if(variant.flavorName != null && this.oracleText != null) { + Lang lang = Lang.getInstance(); + //Rudimentary name replacement. Can't do pronouns, ability words, or flavored keywords. Need to define variant text manually for that. + String flavoredText = this.oracleText.replaceAll("(?<=\\b|\\\\n)" + this.name + "\\b", variant.flavorName); + flavoredText = flavoredText.replaceAll("(?<=\\b|\\\\n)" + lang.getNickName(this.name) + "\\b", lang.getNickName(variant.flavorName)); + variant.oracleText = flavoredText; + } + else + variant.oracleText = this.oracleText; + } if(variant.manaCost == null) variant.manaCost = this.manaCost; if(variant.color == null) variant.color = ColorSet.fromManaCost(variant.manaCost); diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index 6c336d0a6ca..f79125af673 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -504,16 +504,11 @@ public final class CardRules implements ICardCharacteristics { CardFace variantMain = ((CardFace) mainPart).getOrCreateFunctionalVariant(variantName); variantMain.setFlavorName(nameParts[0]); - //Rudimentary name replacement. Can't do nicknames, pronouns, ability words, or flavored keywords. Need to define variants manually for that. - if(mainPart.getOracleText().contains(mainPart.getName())) - variantMain.setOracleText(mainPart.getOracleText().replace(mainPart.getName(), nameParts[0])); ((CardFace) mainPart).assignMissingFieldsToVariant(variantMain); if(otherPart != null) { CardFace variantOther = ((CardFace) otherPart).getOrCreateFunctionalVariant(variantName); variantOther.setFlavorName(nameParts[1]); - if(otherPart.getOracleText().contains(otherPart.getName())) - variantMain.setOracleText(otherPart.getOracleText().replace(otherPart.getName(), nameParts[1])); ((CardFace) otherPart).assignMissingFieldsToVariant(variantOther); } From f2feb5edf8895abe720657fdf62fa5e2bc008ddf Mon Sep 17 00:00:00 2001 From: Jetz Date: Wed, 12 Nov 2025 09:41:29 -0500 Subject: [PATCH 2/3] Failsafe in case Android decides to explode due to complicated regex syntax again. --- .../src/main/java/forge/card/CardFace.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardFace.java b/forge-core/src/main/java/forge/card/CardFace.java index bd1d29e1ae8..e199f8b5ddc 100644 --- a/forge-core/src/main/java/forge/card/CardFace.java +++ b/forge-core/src/main/java/forge/card/CardFace.java @@ -6,6 +6,7 @@ import org.apache.commons.lang3.StringUtils; import java.util.*; import java.util.Map.Entry; +import java.util.regex.PatternSyntaxException; import java.util.stream.Collectors; // @@ -188,11 +189,18 @@ final class CardFace implements ICardFace, Cloneable { void assignMissingFieldsToVariant(CardFace variant) { if(variant.oracleText == null) { if(variant.flavorName != null && this.oracleText != null) { - Lang lang = Lang.getInstance(); - //Rudimentary name replacement. Can't do pronouns, ability words, or flavored keywords. Need to define variant text manually for that. - String flavoredText = this.oracleText.replaceAll("(?<=\\b|\\\\n)" + this.name + "\\b", variant.flavorName); - flavoredText = flavoredText.replaceAll("(?<=\\b|\\\\n)" + lang.getNickName(this.name) + "\\b", lang.getNickName(variant.flavorName)); - variant.oracleText = flavoredText; + try { + Lang lang = Lang.getInstance(); + //Rudimentary name replacement. Can't do pronouns, ability words, or flavored keywords. Need to define variant text manually for that. + //Regex here checks for the name following either a word boundary or a literal "\n" string, since those haven't yet been converted to line breaks. + String flavoredText = this.oracleText.replaceAll("(?<=\\b|\\\\n)" + this.name + "\\b", variant.flavorName); + flavoredText = flavoredText.replaceAll("(?<=\\b|\\\\n)" + lang.getNickName(this.name) + "\\b", lang.getNickName(variant.flavorName)); + variant.oracleText = flavoredText; + } + catch (PatternSyntaxException ignored) { + // Old versions of Android are weird about patterns sometimes. I don't *think* this is such a case but + // the documentation is unreliable. May be worth removing this once we're sure it's not a problem. + } } else variant.oracleText = this.oracleText; From cdfe5ee18ba4c8e6a758d2974008c36ada6050e9 Mon Sep 17 00:00:00 2001 From: Jetz Date: Wed, 12 Nov 2025 09:50:54 -0500 Subject: [PATCH 3/3] Make that failsafe not break oracle text --- forge-core/src/main/java/forge/card/CardFace.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-core/src/main/java/forge/card/CardFace.java b/forge-core/src/main/java/forge/card/CardFace.java index e199f8b5ddc..da1a49a2012 100644 --- a/forge-core/src/main/java/forge/card/CardFace.java +++ b/forge-core/src/main/java/forge/card/CardFace.java @@ -200,6 +200,7 @@ final class CardFace implements ICardFace, Cloneable { catch (PatternSyntaxException ignored) { // Old versions of Android are weird about patterns sometimes. I don't *think* this is such a case but // the documentation is unreliable. May be worth removing this once we're sure it's not a problem. + variant.oracleText = this.oracleText; } } else