Modding:Tokenizable strings

From Stardew Valley Wiki
Revision as of 19:30, 21 November 2023 by Pathoschild (talk | contribs) (copy from Modding:Migrate to Stardew Valley 1.6 (only author is Pathoschild))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The following describes the upcoming Stardew Valley 1.6, and may change before release.

Index

From Modding:Migrate to Stardew Valley 1.6

Tokenizable string format

Stardew Valley 1.6 adds support for literal strings that contain tokens. These are only usable in specific fields (their docs will say 'tokenizable string' with a link to this section).

Literal text

Previously you often needed to load text from a string key in data assets. With this new format, you can use the literal text directly in the asset instead (including Content Patcher tokens):

// before
"Dialogue": "Strings\\StringsFromCSFiles:ShopMenu.cs.11488",

// after: literal text supported
"Dialogue": "Welcome to Pierre's!",

// after: literal text with Content Patcher tokens
"Dialogue": "Welcome to Pierre's, {{PlayerName}}! {{i18n: translatable-text}}",

Tokens

You can inject tokens using square brackets. For example, "[LocalizedText Strings\StringsFromCSFiles:ShopMenu.cs.11488] This is raw text" will show something like "Welcome to Pierre's! This is raw text". Token names are not case-sensitive.

Here are the supported tokens:

token format output
[ArticleFor <word>] The grammatical article (a or an) for the given word when playing in English, else blank. For example, [ArticleFor apple] apple will output an apple.
[CharacterName <name>] The translated display name for an NPC, given their internal name.
[DayOfMonth] The numeric day of month, like 5 on spring 5.
[EscapedText]
[EscapedText <text>]
Marks a snippet of text as a single argument, so it can be safely passed into another token's space-delimited arguments even if it's empty or contains spaces.

For example, the SpouseFarmerText expects two arguments separated by spaces. This passes an empty string for the first one, and text containing spaces for the second:

[SpouseFarmerText [EscapedText] [EscapedText spouse 28 63 2]]
[FarmerUniqueID] The target player's unique internal multiplayer ID
[FarmName] The farm name for the current save (without the injected "Farm" text).
[FarmerStat <key>] The value of a tracked stat for the current player. See the PLAYER_STAT game state query for a list of useful stats.

For example:

"You've walked [FarmerStat stepsTaken] so far."
[GenderedText <male text> <female text> Depending on the target player's gender, show either the male text or female text. If the text contains spaces, you'll need to escape them using EscapedText.
[LocalizedText <string key>]
[LocalizedText <string key> <token values>+]
Translation text loaded from the given string key. If the translation has placeholder tokens like {0}, you can add the values after the string key.
[LocationName <location ID>] The translated display name for a location given its ID in Data/Locations.
[PositiveAdjective] A random adjective from the Strings\Lexicon data asset's RandomPositiveAdjective_PlaceOrEvent entry.
[Season] The current season name, like spring.
[SpouseFarmerText <spouse is farmer text> <spouse is NPC text> Show a different text depending on whether the target player's spouse is a player or NPC. If the text contains spaces, you'll need to escape them using EscapedText.
[SpouseGenderedText <male text> <female text>] Equivalent to GenderedText, but based on the gender of the player's NPC or player spouse instead.
[SuggestedItem [interval] [sync key]] (For shops only.) The name of a random item currently available in the shop stock.

The result will be identical for all queries with the same [sync key] during the given [interval] (one of tick, day, season, year), including between players in multiplayer mode. If omitted, they default to day and the shop ID respectively.

When passing an input argument for tokens like ArticleFor, the input can contain its own nested tokens. For example, "[ArticleFor [SuggestedItem]] [SuggestedItem]" would output something like an Apple.

If you're using Content Patcher, you can use its tokens anywhere in the string (including within square brackets); they'll be expanded before the game parses the string. For example, "{{Spouse}} would love [ArticleFor [SuggestedItem]] [SuggestedItem]!" would output something like "Alexa would love an Apple!".

Extensibility

C# mods can define custom tokens by calling TokenParser.RegisterParser("tokenName", ...). To avoid conflicts, prefixing custom condition names with your mod ID (like Example.ModId_TokenName) is strongly recommended.