Skip to content

Relationships & Demeanor

Townstead records how each villager feels about each person they know: trust, affection, resentment and more. A story can read these feelings, change them, and change the villager’s manner to match. For how relationships work in play, see Relationships.

QualityMeaning
affectionHow much they like the other.
attractionHow attracted they are to the other.
comfortHow comfortable they feel around the other.
familiarityHow well they know the other.
fearHow much they fear the other.
resentmentHow much they resent the other.
respectHow much they respect the other.
trustHow much they trust the other.

Each quality goes from -100 to 100. A quality without a namespace means townstead:, so trust is townstead:trust.

In InkEffect
rel("trust")The teller’s trust in the player, from -100 to 100.
trust(5)Raises the teller’s trust in the player by 5. A negative amount lowers it.
contribute("affection", 3, "shared_meal")Changes any quality. The last value is a short reason, kept with the change.
memory("id")The teller keeps a memory about the player, such as memory("saved_the_harvest").
= done
~ trust(5)
~ contribute("respect", 3, "mended_nets")
You did it. I won't forget that.

Gifts can change qualities too. See Gifts.

demeanor() gives one word for how the teller treats the player now. Use it to change the tone of lines:

{demeanor():
- "stern": What do you want?
- "jovial": There you are! Come here!
- else: Hello again.
}

Townstead tries the bands in order and uses the first band that matches.

BandMatches when
sternResentment is 40 or more, or fear is 30 or more.
guardedResentment is 20 or more, or trust is below 0.
jovialAffection is 30 or more, and resentment is below 10.
warmTrust is 20 or more.
neutralAlways.

A story or a Persona can replace the bands with demeanor in its JSON file:

"demeanor": [
{ "name": "cold", "any": { "resentment": { "min": 30 } } },
{ "name": "fond", "all": { "affection": { "min": 40 }, "trust": { "min": 20 } } },
{ "name": "polite" }
]
FieldDescription
nameRequired. The word that demeanor() gives.
anyRules, of which at least one must hold.
allRules that must all hold.

Each rule bounds one quality with min, max, or both. A band with no rules always matches, so put one last. When no band matches, demeanor() gives neutral.