Modding Tutorials/GrammarResolver

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
Category:Modding
Category:Modding tutorials