Difference between revisions of "Modding Tutorials/GrammarResolver"

From RimWorld Wiki
Jump to navigation Jump to search
(Started page - added in everything I could find about the GrammarResolver and the basics of AdjustedFor())
(Removed <source> element; was causing an error.)
Line 4: Line 4:
  
 
For instance, the letter when a wanderer joins starts:
 
For instance, the letter when a wanderer joins starts:
<source>
+
  A {PAWN_kind} named {PAWN_nameDef} has arrived and is joining the colony. {PAWN_pronoun} is a {PAWN_title}.
A {PAWN_kind} named {PAWN_nameDef} has arrived and is joining the colony. {PAWN_pronoun} is a {PAWN_title}.
 
</source>
 
  
 
When resolved, details of a specific pawn are filled in:
 
When resolved, details of a specific pawn are filled in:
<source>
+
  A wanderer named Bob has arrived and is joining the colony. He is a chef.
A wanderer named Bob has arrived and is joining the colony. He is a chef.
 
</source>
 
  
 
== Symbols ==
 
== Symbols ==
 
 
To allow text you write to be personalized, you need to add ''symbols'' to it. Symbols are set off by curly braces {} and consist of two parts with an underscore between. The first part of the symbol is the ''key''. This identifies which object the symbol belongs to. PAWN is the most common key for traits, backstories, and many incidents. If there are multiple objects being referenced, each one receives a separate key.
 
To allow text you write to be personalized, you need to add ''symbols'' to it. Symbols are set off by curly braces {} and consist of two parts with an underscore between. The first part of the symbol is the ''key''. This identifies which object the symbol belongs to. PAWN is the most common key for traits, backstories, and many incidents. If there are multiple objects being referenced, each one receives a separate key.
  
Line 20: Line 15:
  
 
=== Thing Subsymbols ===
 
=== Thing Subsymbols ===
 
 
These subsymbols are defined for Things (including Pawns), World Objects, and Defs.
 
These subsymbols are defined for Things (including Pawns), World Objects, and Defs.
  
Line 125: Line 119:
  
 
=== Faction Subsymbols ===
 
=== Faction Subsymbols ===
 
 
These subsymbols are defined for Factions.
 
These subsymbols are defined for Factions.
  
Line 150: Line 143:
  
 
=== Misc ===
 
=== Misc ===
 
 
A string with no subsymbol will be printed as-is. The resolver will give its best guess for any of the following subsymbols, treating the string as a singular noun.
 
A string with no subsymbol will be printed as-is. The resolver will give its best guess for any of the following subsymbols, treating the string as a singular noun.
  
Line 167: Line 159:
  
 
== Invoking the Resolver ==
 
== Invoking the Resolver ==
 
 
If you're writing your own events or other code, you may want to print a string customized with objects you provide it. To do so, use the .Formatted() method:  
 
If you're writing your own events or other code, you may want to print a string customized with objects you provide it. To do so, use the .Formatted() method:  
  
Line 176: Line 167:
  
 
== AdjustedFor ==
 
== AdjustedFor ==
 
 
Certain methods (especially the battle log) use a separate resolver instead of or in addition to the above. This is invoked like so:
 
Certain methods (especially the battle log) use a separate resolver instead of or in addition to the above. This is invoked like so:
 
<source>
 
<source>

Revision as of 17:33, 24 June 2020

Modding Tutorials

The grammar resolver is a RimWorld utility that customizes text strings based on in-game objects, such as pawns. This is used for backstory descriptions, trait tooltips, and many types of incidents and player messages.

For instance, the letter when a wanderer joins starts:

 A {PAWN_kind} named {PAWN_nameDef} has arrived and is joining the colony. {PAWN_pronoun} is a {PAWN_title}.

When resolved, details of a specific pawn are filled in:

 A wanderer named Bob has arrived and is joining the colony. He is a chef.

Symbols

To allow text you write to be personalized, you need to add symbols to it. Symbols are set off by curly braces {} and consist of two parts with an underscore between. The first part of the symbol is the key. This identifies which object the symbol belongs to. PAWN is the most common key for traits, backstories, and many incidents. If there are multiple objects being referenced, each one receives a separate key.

The second, optional, part of a symbol is the subsymbol, which determines what information the resolver fetches and how it's formatted. The available subsymbols depend on the type of object. Subsymbols that add an article (a, an, the) to the output will try to obey normal rules of grammar, such as not printing articles in front of proper names in English. Because the resolver is designed to support multiple languages, not all of its features (such as PluralIndef symbols or genders of inanimate objects) will apply to English-language mods.

Thing Subsymbols

These subsymbols are defined for Things (including Pawns), World Objects, and Defs.

Subsymbol Meaning Examples
(none) identical to indefinite Alice an alpaca a chair
label the label field of the thing's def human alpaca chair
labelShort Alice alpaca chair
definite label plus "the" Alice the alpaca the chair
indefinite label plus "a" Alice an alpaca a chair
labelPlural humans alpacas chairs
labelPluralDef the humans the alpacas the chairs
labelPluralIndef humans alpacas chairs
pronoun he she it
possessive his her its
objective him her it
factionName the faction the thing belongs to; invalid for Defs Alicetopia
gender prints the symbol for the object's gender

Pawn Subsymbols

These subsymbols are defined specifically for Pawns. Note that these definitions for labelShort, definite, and indefinite override the general Thing definitions.

Subsymbol Meaning Examples
labelShort a pawn's short name or label Alice alpaca
nameFull defaults to kindIndef Alison 'Alice' Abbey an alpaca
nameFullDef defaults to kindDef Alison 'Alice' Abbey the alpaca
nameDef identical to definite Alice the alpaca
nameIndef identical to indefinite Alice an alpaca
kind based on the pawn's pawnkind, gender, and lifestage colonist calf bull
kindDef the colonist the calf the bull
kindIndef a colonist a calf a bull
kindPlural colonists calves bulls
kindPluralDef the colonists the calves the bulls
kindPluralIndef colonists calves bulls
kindBase the pawn's PawnKindDef's label colonist cow cow
kindBaseDef the colonist the cow the cow
kindBaseIndef a colonist a cow a cow
kindBasePlural colonists cows cows
kindBasePluralDef the colonists the cows the cows
kindBasePluralIndef colonists cows cows
factionPawnSingular The title of a member of the pawn's faction colonist
factionPawnSingularDef the colonist
factionPawnSingularIndef a colonist
factionPawnsPlural colonists
factionPawnsPluralDef the colonists
factionPawnsPluralIndef colonists
lifestage The noun form of the pawn's lifestage adult teenager
lifestageDef the adult the teenager
lifestageIndef an adult a teenager
lifestageAdjective The adjective form of the pawn's lifestage adult teenage
title The pawn's backstory title chef medic
titleDef the chef the medic
titleIndef a chef a medic
humanlike prints a symbol denoting whether the pawn is human or animal

Faction Subsymbols

These subsymbols are defined for Factions.

Subsymbol Meaning Examples
(none) identical to name Alicetopia
name The faction's name Alicetopia
pawnSingular label for one pawn of this faction colonist
pawnSingularDef the colonist
pawnSingularIndef a colonist
pawnsPlural label for several pawns of this faction colonists
pawnsPluralDef the colonists
pawnsPluralIndef colonists

Misc

A string with no subsymbol will be printed as-is. The resolver will give its best guess for any of the following subsymbols, treating the string as a singular noun.

plural pluralDef pluralIndef
definite indefinite pronoun
possessive objective gender

An integer with the subsymbol "ordinal" will be turned into an ordinal ("1st", "2nd", "3rd", etc.). One with no subsymbol is printed as-is.

Any other object without a subsymbol will attempt to invoke that object's ToString() method and print the result.

Invoking the Resolver

If you're writing your own events or other code, you may want to print a string customized with objects you provide it. To do so, use the .Formatted() method:

string.Formatted(object.Named("KEY"))

where string is the string to be formatted, object is the object to customize for, and KEY is the key associated with that object. If you have multiple objects, you will need multiple keys and a separate call to Formatted for each one. Keys may be any arbitrary string, so long as the method and text use the same key.

AdjustedFor

Certain methods (especially the battle log) use a separate resolver instead of or in addition to the above. This is invoked like so:

string.AdjustedFor(pawn, "KEY")

This method supports a small number of keywords, all of which work the same way as described above.

nameFull nameShort nameShortDef definite
nameShortIndef indefinite pronoun possessive
objective factionName kind title