diff --git a/changelog.txt b/changelog.txt index 7e3e19a99..2232ec6a4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -41,6 +41,8 @@ OTHER UPDATES • Added support for Custom Watermarks up to a maximum size of 1024x1024. Watermarks that aren't 500x500 will still need to include their height and width. • Split the "blend with colors" watermark option into one that applies to custom watermarks and one that applies to default watermarks. • Reorganized the Set tab into something hopefully easier to navigate. +• Added the keyword utility handle_action_rt(to:"name", "Action"). This can be used to add "To {name}," before the reminder text when it isn't right next to the keyword, such as handle_action_rt(to:"forage", "Exile"). capitalization matters here. +• Added the keyword utility handle_merged_rt("Normal", moved:"Alternate"). This can be used to add clarifying text when reminder text is merged, like in [card]Cache Grab[/card]. Unlike the previous, this only changes during reminder text merges, not any distance from the keyword. • Added the up and down triangles as mainframe transform options. • Added support for dungeons with 8 levels. • Added option to remove backface rarity symbol to Mainframe DFC. diff --git a/data/magic.mse-game/keywords b/data/magic.mse-game/keywords index be083e58e..9f02d25c8 100644 --- a/data/magic.mse-game/keywords +++ b/data/magic.mse-game/keywords @@ -380,8 +380,8 @@ keyword: match: Scry number mode: core reminder: - To scry {param1}, look at the top { - if param1.value=="1" then "card of your library. You may put that card on the bottom." + { handle_action_rt(to:"scry {param1}", "Look")} at the top { + if param1.value=="1" then "card of your library. You may put that card on the bottom of your library." else "{english_number(param1)} cards of your library, then put any number of them on the bottom and the rest on top in any order." } keyword: @@ -580,8 +580,8 @@ keyword: match: Fateseal number mode: action reminder: - To fateseal {param1}, look at the top { - if param1.value=="1" then "card of an opponent’s library, then you may put that card on the bottom of that player’s library." + {handle_action_rt(to:"fateseal "+param1, "Look")} at the top { + if param1.value=="1" then "card of an opponent’s library, then you may put it on the bottom of that player’s library." else "{english_number(param1)} cards of an opponent’s library, then put any number of them on the bottom of that player’s library and the rest on top in any order." } keyword: @@ -780,7 +780,7 @@ keyword: keyword: Proliferate match: Proliferate mode: action - reminder: Choose any number of permanents and/or players, then give each another counter of each kind already there. + reminder: {handle_action_rt(to:"proliferate", "Choose")} any number of permanents and/or players, then give each another counter of each kind already there. keyword: keyword: Metalcraft match: Metalcraft @@ -872,7 +872,7 @@ keyword: keyword: Populate match: populate mode: action - reminder: Create a token that's a copy of a creature token you control. + reminder: {handle_action_rt(to:"populate", "Create")} a token that's a copy of a creature token you control. # Gatecrash keyword: keyword: Extort @@ -1018,7 +1018,7 @@ keyword: keyword: Bolster match: bolster number mode: action - reminder: Choose a creature with the least toughness among creatures you control and put {english_number_a(param1)} +1/+1 counter(s) on it. + reminder: {handle_action_rt(to:"bolster {param1}", "Choose")} a creature with the least toughness among creatures you control and put {english_number_a(param1)} +1/+1 counter(s) on it. keyword: keyword: Dash match: Dash cost @@ -1028,7 +1028,7 @@ keyword: keyword: Manifest match: manifest mode: action - reminder: To manifest a card, put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card. + reminder: {handle_action_rt(to:"manifest a card", "Put")} it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card. # Dragons of Tarkir keyword: keyword: Exploit @@ -1103,13 +1103,13 @@ keyword: keyword: Support match: Support number mode: action - reminder: Put a +1/+1 counter on {if param1.value!=1 then "each of "}up to {english_number(param1)}{if has_pt() then " other"} target creature(s). + reminder: {handle_action_rt(to:"support {param1}", "Put")} a +1/+1 counter on {if param1.value!=1 then "each of "}up to {english_number(param1)}{if has_pt() then " other"} target creature(s). # Shadows over Innistrad keyword: keyword: Investigate match: Investigate mode: action - reminder: Create a Clue token. It's an artifact with "2, Sacrifice this artifact: Draw a card." + reminder: {handle_action_rt(to:"investigate", "Create")} a Clue token. It's an artifact with "2, Sacrifice this artifact: Draw a card." keyword: keyword: Skulk match: Skulk @@ -1238,7 +1238,7 @@ keyword: keyword: Explore match: explores mode: action - reminder: Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on {this_or_that("creature")}, then put the card back or put it into your graveyard. + reminder: {handle_action_rt(to:"explore", "Reveal")} the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on {this_or_that("creature")}, then put the card back or put it into your graveyard. #Unstable keyword: keyword: Assemble a Contraption @@ -1326,7 +1326,7 @@ keyword: keyword: Treasure token match: Treasure toke*s mode: core - reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "T, Sacrifice this artifact: Add one mana of any color." + reminder: {handle_merged_rt(if param1.value == "ns" then "They’re artifacts" else "It’s an artifact", moved:"A Treasure token is an artifact")} with "T, Sacrifice this artifact: Add one mana of any color." #Guilds of Ravnica keyword: keyword: Jump-start @@ -1343,7 +1343,7 @@ keyword: match: Surveil number mode: action reminder: - Look at the top { + {handle_action_rt(to:"surveil {param1}", "Look")} at the top { if param1.value=="1" then "card of your library. You may put it into your graveyard." else "{english_number(param1)} cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order." } @@ -1383,7 +1383,7 @@ keyword: keyword: Amass match: Amass name number mode: action - reminder: Put {english_number_a(param2)} +1/+1 counter(s) on an Army you control. It's also a {if param1.value == "Zombies" then "Zombie" else english_singular(param1)}. If you don't control an Army, create a 0/0 black {if param1.value == "Zombies" then "Zombie" else english_singular(param1)} Army creature token first. + reminder: {handle_action_rt(to:"amass {param1} {param2}", "Create")} {english_number_a(param2)} +1/+1 counter(s) on an Army you control. It's also a {if param1.value == "Zombies" then "Zombie" else english_singular(param1)}. If you don't control an Army, create a 0/0 black {if param1.value == "Zombies" then "Zombie" else english_singular(param1)} Army creature token first. #Throne of Eldraine keyword: keyword: Adamant @@ -1394,7 +1394,7 @@ keyword: keyword: Food token match: Food toke*s mode: core - reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "2, T, Sacrifice this artifact: You gain 3 life." + reminder: {handle_merged_rt(if param1.value == "ns" then "They’re artifacts" else "It’s an artifact", moved:"A Food token is an artifact")} with "2, T, Sacrifice this artifact: You gain 3 life." #Theros Beyond Death keyword: keyword: Escape @@ -1405,7 +1405,7 @@ keyword: keyword: Gold token match: Gold toke*s mode: core - reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "Sacrifice this artifact: Add one mana of any color." + reminder: {handle_merged_rt(if param1.value == "ns" then "They’re artifacts" else "It’s an artifact", moved:"A Gold token is an artifact")} with "Sacrifice this artifact: Add one mana of any color." #Ikoria: Lair of Behemoths keyword: keyword: Mutate @@ -1420,9 +1420,9 @@ keyword: #Magic 2021 keyword: keyword: Mill - match: mill one_word + match: mill one_word car*s mode: core - reminder: {if param1.value == "mills" then "They put" else "Put"} the top {if param2.value == "a" then "" else param2 + " "}{if param2.value == "a" then "card" else "cards"} of {if param1.value == "mills" then "their library into their" else "your library into your"} graveyard. + reminder: { if param1.value == "mills" then handle_action_rt(to:if param2 == "a" then "mill a card" else "mill {param2} cards", "They") + " put the top " + (if param2.value == "a" then "card " else param2 + " cards ") + "of their library into their graveyard." else handle_action_rt(to:if param2 == "a" then "mill a card" else "mill {param2} cards", "Put") + " the top " + (if param2.value == "a" then "card " else param2 + " cards ") + "of your library into your graveyard." } keyword: keyword: phases out match: phases out @@ -1445,7 +1445,7 @@ keyword: keyword: Shard token match: Shard toke*s mode: core - reminder: {if param1.value == "ns" then "They’re enchantments" else "It’s an enchantment"} with "2, Sacrifice this enchantment: Scry ]1[, then draw a card." + reminder: {handle_merged_rt(if param1.value == "ns" then "They’re enchantments" else "It’s an enchantment", moved:"A Shard token is an enchantment")} with "2, Sacrifice this enchantment: Scry ]1[, then draw a card." keyword: keyword: Boast match: Boast @@ -1461,7 +1461,7 @@ keyword: keyword: Learn match: learn mode: action - reminder: You may reveal a Lesson card you own from outside the game and put it into your hand, or discard a card to draw a card. + reminder: {handle_action_rt(to:"learn", "you")} may reveal a Lesson card you own from outside the game and put it into your hand, or discard a card to draw a card. keyword: keyword: Ward match: Ward cost @@ -1541,7 +1541,7 @@ keyword: keyword: Blood token match: Blood toke*s mode: expert - reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "1, T, Discard a card, Sacrifice this artifact: Draw a card." + reminder: {handle_merged_rt(if param1.value == "ns" then "They’re artifacts" else "It’s an artifact", moved:"A Blood token is an artifact")} with "1, T, Discard a card, Sacrifice this artifact: Draw a card." # Kamigawa Neon Dynasty keyword: keyword: Reconfigure @@ -1568,17 +1568,17 @@ keyword: keyword: Connive match: connive mode: action - reminder: To have a creature connive, draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature. + reminder: {handle_action_rt(to:"have a creature connive", "Draw")} a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature. keyword: keyword: Connives match: connives mode: action - reminder: Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on {this_or_that("creature")}. + reminder: {handle_action_rt(to:"have a creature connive", "Draw")} a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on {this_or_that("creature")}. keyword: keyword: Connives N match: connives number mode: action - reminder: Draw {english_number_a(param1)} card(s), then discard {english_number_a(param1)} card(s). Put a +1/+1 counter on {this_or_that("creature")} for each nonland card discarded this way. + reminder: {handle_action_rt(to:"have a creature connive", "Draw")} {english_number_a(param1)} card(s), then discard {english_number_a(param1)} card(s). Put a +1/+1 counter on {this_or_that("creature")} for each nonland card discarded this way. keyword: keyword: Blitz match: Blitz cost @@ -1647,7 +1647,7 @@ keyword: keyword: Powerstone token match: Powerstone toke*s mode: expert - reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "[T]: Add [C]. This mana can't be spent to cast a nonartifact spell." + reminder: {handle_merged_rt(if param1.value == "ns" then "They’re artifacts" else "It’s an artifact", moved:"A Powerstone token is an artifact")} with "[T]: Add [C]. This mana can't be spent to cast a nonartifact spell." # Brother's War keyword: keyword: Prototype @@ -1690,7 +1690,7 @@ keyword: keyword: Incubate match: Incubate number mode: action - reminder: Create an Incubator token with {english_number_a(param1)} +1/+1 counter(s) on it and "[2]: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature. + reminder: {handle_action_rt(to:"incubate {param1}", "Create")} an Incubator token with {english_number_a(param1)} +1/+1 counter(s) on it and "[2]: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature. # Wilds of Eldraine keyword: keyword: Bargain @@ -1769,7 +1769,7 @@ keyword: keyword: Map token match: Map toke*s mode: expert - reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "1, T, Sacrifice this artifact: Target creature you control explores. Activate only as a sorcery." + reminder: {handle_merged_rt(if param1.value == "ns" then "They’re artifacts" else "It’s an artifact", moved:"A Map token is an artifact")} with "1, T, Sacrifice this artifact: Target creature you control explores. Activate only as a sorcery." keyword: keyword: Craft match: Craft with name cost @@ -1794,7 +1794,7 @@ keyword: keyword: Discover match: Discover number mode: action - reminder: Exile cards from the top of your library until you exile a nonland card with mana value {param1} or less. Cast it without paying its mana cost or put it into your hand. Put the rest on the bottom in a random order. + reminder: {handle_action_rt(to:"discover {param1}", "Exile")} cards from the top of your library until you exile a nonland card with mana value {param1} or less. Cast it without paying its mana cost or put it into your hand. Put the rest on the bottom in a random order. keyword: keyword: Finality counters match: finality counter @@ -1805,12 +1805,12 @@ keyword: keyword: Cloak match: cloak mode: action - reminder: To cloak a card, put it onto the battlefield face down as a 2/2 creature with ward [2]. Turn it face up any time for its mana cost if it's a creature card. + reminder: {handle_action_rt(to:"cloak a card", "Put")} it onto the battlefield face down as a 2/2 creature with ward [2]. Turn it face up any time for its mana cost if it's a creature card. keyword: keyword: Collect evidence match: collect evidence number mode: action - reminder: Exile cards with total mana value {param1} or greater from your graveyard. + reminder: {handle_action_rt(to:"collect evidence {param1}", "Exile")} cards with total mana value {param1} or greater from your graveyard. keyword: keyword: Disguise match: Disguise cost @@ -1831,7 +1831,7 @@ keyword: keyword: Junk token match: Junk toke*s mode: expert - reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "T, Sacrifice this artifact: Exile the top card of your library. You may play that card this turn. Activate only as a sorcery." + reminder: {handle_merged_rt(if param1.value == "ns" then "They’re artifacts" else "It’s an artifact", moved:"A Junk token is an artifact")} with "T, Sacrifice this artifact: Exile the top card of your library. You may play that card this turn. Activate only as a sorcery." # Assassin's Creed keyword: keyword: Freerunning @@ -1890,12 +1890,12 @@ keyword: keyword: forage match: forage mode: action - reminder: Exile three cards from your graveyard or sacrifice a Food. + reminder: {handle_action_rt(to:"forage", "Exile")} three cards from your graveyard or sacrifice a Food. keyword: keyword: forage match: foraging mode: action - reminder: Exile three cards from your graveyard or sacrifice a Food. + reminder: {handle_action_rt(to:"forage", "Exile")} three cards from your graveyard or sacrifice a Food. keyword: keyword: Gift a card match: Gift a card diff --git a/data/magic.mse-game/script b/data/magic.mse-game/script index bae93560d..79336bf9e 100644 --- a/data/magic.mse-game/script +++ b/data/magic.mse-game/script @@ -32,7 +32,7 @@ include file: language include file: statistics_script include file: /magic-blends.mse-include/new-blends ############################################################## Versioning -version_date := {"2024-05-27 Mainframe 1.3.f Showcase Catchup: Module Rollout"} +version_date := {"2024-05-27 Mainframe 1.3.g Showcase Catchup: Action Check"} version := version_date ############################################################## Common filters ############################################################## Utility @@ -1178,6 +1178,16 @@ this_or_that := { this_that + " " + type }@(upper:false) +#### see if a keyword should have different text because it's merged with another reminder text +#### handle_merged_rt("Its a", moved:"A Food token is") +handle_merged_rt := { + "" + moved + "" + input + "" +} +#### see if an action keyword should have different text because its distant from the keyword +#### handle_action_rt(to:"forage", "Exile") +handle_action_rt := { + "To " + to + ", " + to_lower(input) + "" + input + "" +} ############################################################## Complex reminder texts self_pro_check := match@(match:"You ha(ve|s) protection") @@ -1472,6 +1482,9 @@ text_filter := remove_tag@(tag: "") + remove_tag@(tag: "") + + remove_tag@(tag: "") + + remove_tag@(tag: "") + #### step 1b : remove zero-width space used for level spacers replace@(match:"​", replace:"") + #### step 2a : temp fix for formatting buttons @@ -1496,7 +1509,7 @@ text_filter := chosen(choice:if correct_case or mode == "action" then mode else "lower case", set.automatic_reminder_text) and chosen(choice:mode, set.automatic_reminder_text) }, combine: { - keyword := "{keyword}" + keyword := "{keyword}" reminder := process_english_hints(reminder) if mode == "pseudo" then "{keyword}" else keyword + if expand then " ({reminder})" else "" @@ -1509,13 +1522,41 @@ text_filter := ) + #### step 2c : move action keywords' reminder text to the end of the line replace@( - match: "(]+> (?:(?!]+>]*>)([^\n]*)", #### removed "| ?]+> (?:(?!]+>]*>)([^\n]+)", #### removed "| ?]+> (?:(?!]+>]*>)([^\n]*?)(]+> (?:(?!]+>]*>)([^\n]*)", - replace: "\\2\\4\\3\\1" + replace: "\\2\\4\\3\\1" + ) + + #### step 2da : apply multikeyword reminder edits + #### A Food token is... vs It's a... + #### this one moved + replace@( + match: "(]*> [(])(.*?)(.*?)", + replace: "\\1\\2" + ) + + #### this one didn't + replace@( + match: "(.*?)(.*?)", + replace: "\\2" + ) + + #### To forage, exile... vs Exile... + #### this was put in a combined rt + replace@( + match: "(.*?)(.*?)(.*?)", + replace: "\\1\\2" + ) + + #### this one wasn't bumped + replace@( + match: "([.]?]*> [(])(.*?)(.*?)", + replace: "\\1\\3" + ) + + #### this one was bumped + replace@( + match: "(.*?)(.*?)", + replace: "\\1" ) + #### step 2e : allow a sentence after lowercase reminder text for equips etc. #replace@( @@ -1529,7 +1570,7 @@ text_filter := ) + #### step 2g : combine reminder texts replace@( - match: "[)](]+>]>]+> )[(]" + match: "[)](]+>]>(?:)?]+> )[(]" replace: "\\1" ) + #### step 2h : temp fix for formatting buttons