Difference between revisions of "Modding:Dialogue"

From Stardew Valley Wiki
Jump to navigation Jump to search
m (→‎Dialogue commands: added $d kent argument)
(remove {{upcoming|1.6}} & update accordingly)
 
(120 intermediate revisions by 18 users not shown)
Line 3: Line 3:
 
This page explains how the game stores dialogue text, its format, and how the game parses it. This is an advanced guide for mod developers.
 
This page explains how the game stores dialogue text, its format, and how the game parses it. This is an advanced guide for mod developers.
  
==Data==
+
==Dialogue data==
The dialogue text is stored in four sets of files.
+
Character dialogue is stored in many different files: The <samp>Characters\Dialogue</samp> directory is where the majority of NPC-specific dialogue is stored. <samp>Data\ExtraDialogue.xnb</samp>, <samp>Strings\Characters.xnb</samp>, <samp>Strings\Events.xnb</samp>, <samp>Strings\SpeechBubbles.xnb</samp>, and <samp>Strings\StringsFromCSFiles.xnb</samp> contain various other pieces of dialogue, some generic, and some NPC-specific.
  
===Character-specific dialogue===
+
===Characters\Dialogue directory===
<tt>Characters\Dialogue\*.xnb</tt> contains most of the dialogue for each character (one file per character). The game will choose dialogue from one of the sections below, in the order shown here.
+
====Characters\Dialogue\{{t|NPC}}.xnb====
 +
An NPC's named file in <samp>Character\Dialogue</samp> contains most of their dialogue. The game will choose dialogue from one of the sections below, in the order shown here.
  
====Special dialogue====
+
=====Special dialogue=====
 
There are a few predefined keys for specific cases:
 
There are a few predefined keys for specific cases:
 
{| class="wikitable"
 
{| class="wikitable"
Line 16: Line 17:
 
! description
 
! description
 
|-
 
|-
| <tt>danceRejection</tt>
+
| <samp>danceRejection</samp>
 
| Dialogue used to reject an offer to dance at the [[Flower Dance]]. (A different dialogue is used if they've already agreed to dance with another player.)
 
| Dialogue used to reject an offer to dance at the [[Flower Dance]]. (A different dialogue is used if they've already agreed to dance with another player.)
 
|-
 
|-
| <tt>divorced</tt>
+
| <samp>MovieInvitation</samp>
 +
| An NPC's response to being invited to the [[Movie Theater]]. If not defined, the NPC will use a generic line from <samp>Strings\Characters.xnb</samp>. The specific string used depends on the NPC's [[Modding:NPC data|manners]].
 +
|
 +
|-
 +
| <samp>breakUp</samp>
 +
| An NPC's response to being broken up with by giving them a [[Wilted Bouquet]].
 +
|
 +
|-
 +
| <samp>divorced</samp>
 
| Dialogue shown when you speak to your divorced spouse.
 
| Dialogue shown when you speak to your divorced spouse.
 +
|
 
|-
 
|-
| <tt>{{t|location}}_Entry</tt>
+
| <samp>accept_{{t|item_id}}</samp>
| Possible dialogue lines shown above the NPC's name when they enter the named {{t|location}}, with a 50% chance. This dialogue entry can contain multiple options separated by <code>/</code>; the game will randomly choose one to display.<br /><small>Example: <tt>SeedShop_Entry: "Hi, Pierre!/Now, what do I need.../Ah, that looks good!/Makin' my special sauce tonight!/Pierre! What's fresh?/Pierre! Waddya got for me?"</tt>
+
| If defined, this dialogue will be used when gifting an item with the given ID to the NPC. Does not affect and is not affected by an NPC's taste towards an item. Used when giving quest items to their proper recipients. Appears to have no affect when given the ID of a non-quest item.<br /><small>Example: <samp>accept_864: "...!$4#$b#...Where did you find this?$4#$b#...$5#$b#This man... We fought together in the war, @. He was like a brother to me. #$b#But... only one of us made it back.$5#$b#He never lost his courage, though. Even in the face of death. A true hero... I'll never forget him.#$b#Thanks for bringing me this... It means a lot to me.#$b#Here, take this. It's been sitting in the back of our cupboard for years, and we've never used it."</samp>
 
|-
 
|-
| <tt>ComeBackLater</tt><br /><tt>Snoring</tt>
+
| <samp>reject_{{t|item_id}}</samp>
| [[Gil]]'s dialogue when you haven't completed any new Adventure Quest goals. <tt>ComeBackLater</tt> will be shown once, and all subsequent dialogues will show <tt>Snoring</tt>.
+
| If defined, when attempting to gift the item with the given ID, the NPC will not accept the item and instead say this dialogue. Used for quest items to ensure they're not accidentally gifted, or to give hints towards their proper recipient.<br /><small>Example: <samp>reject_864: "What's this? It looks like one of Kent's buddies from the war. Maybe you should show it to him?"</samp>
 +
|-
 +
| <samp>{{t|location}}_Entry</samp>
 +
| Possible dialogue lines shown above the NPC's name when they enter the named {{t|location}}, with a 50% chance. This dialogue entry can contain multiple options separated by <code>/</code>; the game will randomly choose one to display.<br /><small>Example: <samp>SeedShop_Entry: "Hi, Pierre!/Now, what do I need.../Ah, that looks good!/Makin' my special sauce tonight!/Pierre! What's fresh?/Pierre! Waddya got for me?"</samp></br>Note: This key is not to be confused with [[Modding:Dialogue#Speech_bubbles]].
 +
|-
 +
| <samp>Resort</samp><br /><samp>Resort_Bar</samp><br /><samp>Resort_Chair</samp><br /><samp>Resort_Dance</samp><br /><samp>Resort_Entering</samp><br /><samp>Resort_Leaving</samp><br /><samp>Resort_Shore</samp><br /><samp>Resort_Towel</samp><br /><samp>Resort_Umbrella</samp><br /><samp>Resort_Wander</samp>
 +
| Various dialogue keys used when an NPC is visiting the Ginger Island Resort.
 +
|-
 +
| <samp>ComeBackLater</samp><br /><samp>Snoring</samp>
 +
| [[Gil]]'s dialogue when you haven't completed any new Adventure Quest goals. <samp>ComeBackLater</samp> will be shown once, and all subsequent dialogues will show <samp>Snoring</samp>.
 
|}
 
|}
  
====Location dialogue====
+
=====Location dialogue=====
 
Otherwise the game will choose dialogue in this order.
 
Otherwise the game will choose dialogue in this order.
  
 
Variants:
 
Variants:
* Each key can optionally be prefixed with a [[#Seasons|season name]], like <tt>springMountain_47_23</tt>.
+
* Each key can optionally be prefixed with a [[#Seasons|season name]], like <samp>springMountain_47_23</samp>.
  
The game will check variants in this order: <tt>{{t|season}}{{t|key}}</tt>, and <tt>{{t|key}}</tt>. The variants aren't listed below for simplicity.
+
The game will check variants in this order: <samp>{{t|season}}{{t|key}}</samp>, and <samp>{{t|key}}</samp>. The variants aren't listed below for simplicity.
 +
Unlike daily dialogue, location dialogue is endlessly repeatable as long as the trigger conditions are fulfilled, ''e.g.,'' Being in the location. They will not remove daily dialogue from an npc's dialogue rotation, but will merely overwrite it when the NPC is in the specified location.
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 42: Line 62:
 
! description
 
! description
 
|-
 
|-
| <tt>{{t|location}}_{{t|x}}_{{t|y}}</tt>
+
| <samp>{{t|location}}_{{t|x}}_{{t|y}}</samp>
| Dialogue shown in the named location when the NPC is standing at tile position {{t|x}}, {{t|y}}.<br /><small>Example: <tt>Mountain_47_23: "I come here for the peace and quiet."</tt></small>
+
| Dialogue shown in the named location when the NPC is standing at tile position {{t|x}}, {{t|y}}.<br /><small>Example: <samp>Mountain_47_23: "I come here for the peace and quiet."</samp></small>
 
|-
 
|-
| <tt>{{t|location}}_{{t|dayName}}</tt>
+
| <samp>{{t|location}}_{{t|dayName}}</samp>
| Dialogue shown in the named location on the given [[#Days of week|day of week]].<br /><small>Example: <tt>Saloon_Fri: "Business has been really good tonight. I'm pleased."</tt></small>
+
| Dialogue shown in the named location on the given [[#Days of week|day of week]].<br /><small>Example: <samp>Saloon_Fri: "Business has been really good tonight. I'm pleased."</samp></small>
 
|-
 
|-
| <tt>{{t|location}}{{t|hearts}}</tt>
+
| <samp>{{t|location}}{{t|hearts}}</samp>
| Dialogue shown in the named location if you have at least {{t|hearts}} hearts with them. The {{t|hearts}} will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).<br /><small>Example: <tt>Saloon8: "Hi there @. I'm glad to see you! You're always welcome here."</tt></small>
+
| Dialogue shown in the named location if you have at least {{t|hearts}} hearts with them. The {{t|hearts}} will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).<br /><small>Example: <samp>Saloon8: "Hi there @. I'm glad to see you! You're always welcome here."</samp></small>
 
|-
 
|-
| <tt>{{t|location}}</tt>
+
| <samp>{{t|location}}</samp>
| Dialogue shown in the named location.<br /><small>Example: <tt>Saloon: "Now that I'm here I can finally relax and socialize a bit."</tt></small>
+
| Dialogue shown in the named location.<br /><small>Example: <samp>Saloon: "Now that I'm here I can finally relax and socialize a bit."</samp></small>
 +
*Note: Location dialogue will be accessible even if the NPC is only walking through the specified map unlike schedule strings that will only be accessible once the schedule end location is reached.
 
|}
 
|}
  
====Rain dialogue====
+
=====Generic dialogue=====
<tt>Characters\Dialogue\rainy.xnb</tt> contains one dialogue entry per NPC. There's a roughly 50% chance they'll use this dialogue if one of the above didn't match, it's raining, and you're not married to or divorced from them.
 
 
 
====Generic dialogue====
 
 
Otherwise the game will choose a dialogue using one of these key formats (in precedence order):
 
Otherwise the game will choose a dialogue using one of these key formats (in precedence order):
# <tt>{{t|season}}_{{t|key}}_inlaw_{{t|spouseName}}</tt>
+
# <samp>{{t|season}}_{{t|key}}_inlaw_{{t|spouse}}</samp>
# <tt>{{t|season}}_{{t|key}}</tt>
+
# <samp>{{t|season}}_{{t|key}}</samp>
# <tt>{{t|key}}_inlaw_{{t|spouseName}}</tt>
+
# <samp>{{t|key}}_inlaw_{{t|spouse}}</samp>
# <tt>{{t|key}}</tt>
+
# <samp>{{t|key}}</samp>
  
For each variation above: <tt>{{t|season}}</tt> is a [[#Seasons|season name]] (like <tt>spring_14</tt>); <tt>_inlaw_{{t|spouseName}}</tt> matches if the player is married to the named NPC, regardless of whether the speaking NPC is related to the named one (like <tt>Sat_inlaw_Abigail</tt>); and <tt>{{t|key}}</tt> is one of the formats listed below.
+
For each variation above: <samp>{{t|season}}</samp> is a [[#Seasons|season name]] (like <samp>spring_14</samp>); <samp>_inlaw_{{t|spouse}}</samp> matches if the player is married to the named NPC, regardless of whether the speaking NPC is related to the named one (like <samp>Sat_inlaw_Abigail</samp>); and <samp>{{t|key}}</samp> is one of the formats listed below.
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 72: Line 90:
 
! description
 
! description
 
|-
 
|-
| <tt>{{t|dayOfMonth}}</tt>
+
| <samp>{{t|dayOfMonth}}</samp>
| Dialogue shown on the given day of month in the first year only.<br /><small>Example: <tt>10: "Did you watch the game last night?#$b#Or wait, do you even have a TV set...?"</tt></small>
+
| Dialogue shown on the given day of month in the '''first year only.'''<br />'''WARNING: this first-year-only behavior is different from other keys and often catches unsuspecting modders!'''<br /><small>Example: <samp>10: "Did you watch the game last night?#$b#Or wait, do you even have a TV set...?"</samp></small>
 
|-
 
|-
| <tt>{{t|dayOfMonth}}_{{t|firstOrLaterYear}}</tt>
+
| <samp>{{t|dayOfMonth}}_{{t|firstOrLaterYear}}</samp>
| Dialogue shown on the given day of month in the [[#First/later year|first/later year]].<br /><small>Example: <tt>2_1: "My husband Kent is a soldier, working overseas. That's why he's not here right now.#$b#I know he'll come back safe once his tour is over!!#$e#Need something?"</tt></small>
+
| Dialogue shown on the given day of month in the [[#First/later year|first/later year]].<br /><small>Example: <samp>2_1: "My husband Kent is a soldier, working overseas. That's why he's not here right now.#$b#I know he'll come back safe once his tour is over!!#$e#Need something?"</samp></small>
 
|-
 
|-
| <tt>{{t|dayOfWeek}}{{t|hearts}}_{{t|firstOrLaterYear}}</tt>
+
| <samp>{{t|dayOfWeek}}{{t|hearts}}_{{t|firstOrLaterYear}}</samp>
| Dialogue shown on the given [[#Days of week|day of week]] if you have at least {{t|hearts}} hearts with them, in the [[#First/later year|first/later year]]. The {{t|hearts}} will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).<br />'''Bug:''' only shown if an equivalent <tt>{{t|dayOfWeek}}{{t|hearts}}</tt> key also exists.<br /><small>Example: <tt>Thu2_2: "Well, my Dad is back. Have you met him?#$b#I'm just glad he's okay."</tt></small>
+
| Dialogue shown on the given [[#Days of week|day of week]] if you have at least {{t|hearts}} hearts with them, in the [[#First/later year|first/later year]]. The {{t|hearts}} will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).<br /><small>Example: <samp>Thu2_2: "Well, my Dad is back. Have you met him?#$b#I'm just glad he's okay."</samp></small>
 
|-
 
|-
| <tt>{{t|dayOfWeek}}{{t|hearts}}</tt>
+
| <samp>{{t|dayOfWeek}}{{t|hearts}}</samp>
| Dialogue shown on the given [[#Days of week|day of week]] if you have at least {{t|hearts}} hearts with them. The {{t|hearts}} will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).<br /><small>Example: <tt>Sun4: "Hey, @.#$e#How's your day going?"</tt></small>
+
| Dialogue shown on the given [[#Days of week|day of week]] if you have at least {{t|hearts}} hearts with them. The {{t|hearts}} will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).<br /><small>Example: <samp>Sun4: "Hey, @.#$e#How's your day going?"</samp></small>
 
|-
 
|-
| <tt>{{t|dayOfWeek}}_{{t|firstOrLaterYear}}</tt>
+
| <samp>{{t|dayOfWeek}}_{{t|firstOrLaterYear}}</samp>
| Dialogue shown on the given [[#Days of week|day of week]] in the [[#First/later year|first/later year]].<br />'''Bug:''' only shown if an equivalent <tt>{{t|dayOfWeek}}</tt> key also exists.<br /><small>Example: <tt>Sat_1: "Dad's coming back soon!#$b#I hope he brings me some toys.$u"</tt></small>
+
| Dialogue shown on the given [[#Days of week|day of week]] in the [[#First/later year|first/later year]].<br /><small>Example: <samp>Sat_1: "Dad's coming back soon!#$b#I hope he brings me some toys.$u"</samp></small>
 
|-
 
|-
| <tt>{{t|dayOfWeek}}</tt>
+
| <samp>{{t|dayOfWeek}}</samp>
| Dialogue shown on the given [[#Days of week|day of week]].<br /><small>Example: <tt>Mon: "Oh, hey. Taking a break from work?"</tt></small>
+
| Dialogue shown on the given [[#Days of week|day of week]].<br /><small>Example: <samp>Mon: "Oh, hey. Taking a break from work?"</samp></small>
 
|}
 
|}
  
====Fallback====
+
====Rain dialogue====
If none of the above match, the game will show the value with key <tt>NPC.cs.4061</tt> in <tt>Strings\StringsFromCSFiles.xnb</tt>. (English version: "Hi.")
+
<samp>Characters\Dialogue\rainy.xnb</samp> contains one dialogue entry per NPC. There's a roughly 50% chance they'll use this dialogue if a special or location dialogue doesn’t match, it's raining, and you're not married to or divorced from them.
  
===Marriage dialogue===
+
====Marriage dialogue====
<tt>Characters\Dialogue\MarriageDialogue.xnb</tt> contains dialogue text for all spouses, and each NPC may optionally have their own dialogue file like <tt>Characters\Dialogue\MarriageDialogueAbigail.xnb</tt>. When looking up a dialogue key, it will use the one in the NPC's file if it exists, else the one in the generic file, else a default text (usually blank).
+
<samp>Characters\Dialogue\MarriageDialogue.xnb</samp> contains dialogue text for all spouses, and each NPC may optionally have their own dialogue file like <samp>Characters\Dialogue\MarriageDialogueAbigail.xnb</samp>. When looking up a dialogue key, it will use the one in the NPC's file if it exists, else the one in the generic file, else a default text (usually blank).
  
 
Each dialogue entry has a key with one of these formats:
 
Each dialogue entry has a key with one of these formats:
Line 103: Line 121:
 
! description
 
! description
 
|-
 
|-
| <tt>{{t|season}}_{{t|day}}</tt>
+
| <samp>{{t|season}}_{{t|day}}</samp>
| Dialogue shown when the day starts, if {{t|season}} and {{t|day}} match the current date.<br /><small>Example: <tt>fall_1</tt>: "''The scent is unmistakable... mushroom, rotting leaves, pumpkin. It's fall, alright. Isn't it lovely?''"</small>
+
| Dialogue shown when the day starts, if {{t|season}} and {{t|day}} match the current date.<br /><small>Example: <samp>fall_1</samp>: "''The scent is unmistakable... mushroom, rotting leaves, pumpkin. It's fall, alright. Isn't it lovely?''"</small>
 
|-
 
|-
| <tt>patio_{{t|spouse}}</tt>
+
| <samp>patio_{{t|spouse}}</samp>
 
| Dialogue shown when the NPC is standing on the patio.
 
| Dialogue shown when the NPC is standing on the patio.
 
|-
 
|-
| <tt>{{t|weather}}_{{t|dayOrNight}}_{{t|random}}</tt>
+
| <samp>{{t|weather}}_Day_{{t|random}}</samp>
| Daily dialogue. {{t|weather}} is <tt>Rainy</tt> if it's raining, else <tt>Indoor</tt> (even if they're not indoors). {{t|dayOrNight}} is <tt>Night</tt> after 6pm, else <tt>Day</tt>. {{t|random}} is a number -1 to 4, used to randomly select an entry.<br /><small>Example: <tt>Rainy_Night_3</tt>: "''On nights like this, I like to turn the light down low and just listen...$8''"</small>
+
| Daily dialogue added when the day starts, based on the {{t|weather}} (<samp>Rainy</samp> if it's raining, else <samp>Indoor</samp> even if they're not indoors) and {{t|random}} (a random number between 0 and 4). If the game chooses a {{t|random}} value that doesn't have a dialogue, it'll use the default text instead.
 +
|-
 +
| <samp>Rainy_Night_{{t|random}}</samp>
 +
| Daily dialogue in the farmhouse after 6pm when it's raining. {{t|random}} is a number between 0–5 inclusively ''or'' the NPC name, each of which has an equal chance of being randomly chosen. If the game chooses a {{t|random}} value that doesn't have a dialogue, it'll use the default text instead.<br /><small>Example: <samp>Rainy_Night_3</samp>: "''On nights like this, I like to turn the light down low and just listen...$8''"</small>
 +
|-
 +
| <samp>Indoor_Night_{{t|random}}
 +
| Daily dialogue in the farmhouse after 6pm when it's ''not'' raining. {{t|random}} is a number between 0–4 inclusively ''or'' the NPC name, each of which has an equal chance of being randomly chosen. If the game chooses a {{t|random}} value that doesn't have a dialogue, it'll use the default text instead.
 
|-
 
|-
| <tt>funLeave_{{t|spouse}}</tt>
+
| <samp>funLeave_{{t|spouse}}</samp>
| TODO
+
| Dialogue used when leaving the farmhouse, typically during a Monday, or a Friday if they have no job. (See below.)
 
|-
 
|-
| <tt>jobLeave_{{t|spouse}}</tt>
+
| <samp>jobLeave_{{t|spouse}}</samp>
| TODO
+
| Dialogue used when leaving to go to their job. Only used for Maru, Penny, and Harvey.
 
|-
 
|-
| <tt>funReturn_{{t|spouse}}</tt>
+
| <samp>funReturn_{{t|spouse}}</samp>
| Dialogue shown after 1pm when they enter the farmhouse but before reaching their target position, but only on Monday (any NPC) or Friday (if not Maru/Penny/Harvey).<br /><small>Example: <tt>funReturn_Abigail</tt>: "''Hey! Did you have a good day? Mine went well. It was refreshing to take a walk.$h''"</small>
+
| Dialogue shown after 1pm when they enter the farmhouse but before reaching their target position, but only on Monday (any NPC) or Friday (if not Maru/Penny/Harvey).<br /><small>Example: <samp>funReturn_Abigail</samp>: "''Hey! Did you have a good day? Mine went well. It was refreshing to take a walk.$h''"</small>
 
|-
 
|-
| <tt>jobReturn_{{t|spouse}}</tt>
+
| <samp>jobReturn_{{t|spouse}}</samp>
| Dialogue shown after 1pm when they enter the farmhouse but before reaching their target position, but only if <tt>funReturn</tt> isn't shown instead.<br /><small>Example: <tt>jobReturn_Penny</tt>: "''#$c .5#Good evening. My day was fine, thanks! How was yours?$h#$e#Jas and Vincent weren't behaving very well today. I'm still all wound up...''"</small>
+
| Dialogue shown after 1pm when they enter the farmhouse but before reaching their target position, but only if <samp>funReturn</samp> isn't shown instead.<br /><small>Example: <samp>jobReturn_Penny</samp>: "''#$c .5#Good evening. My day was fine, thanks! How was yours?$h#$e#Jas and Vincent weren't behaving very well today. I'm still all wound up...''"</small>
 
|-
 
|-
| <tt>{{t|season}}_{{t|spouse}}</tt>
+
| <samp>{{t|season}}_{{t|spouse}}</samp>
| Dialogue shown at 9+ heart levels with a 5% chance each day.<br /><small>Example: <tt>fall_Abigail</tt>: "''Do I smell pumpkin on you? Maybe I'm just dreaming...$h''"</small>
+
| Dialogue shown at 9+ heart levels with a 5% chance each day.<br /><small>Example: <samp>fall_Abigail</samp>: "''Do I smell pumpkin on you? Maybe I'm just dreaming...$h''"</small>
 
|-
 
|-
| <tt>Outdoor_{{t|spouse}}</tt>
+
| <samp>Outdoor_{{t|spouse}}</samp>
| Dialogue shown on the farm with a 20% chance.<br /><small>Example: <tt>Outdoor_Abigail</tt>: "''I'm just going to hang out here, okay?#$e#There's a lot of interesting bugs and things out here. *chuckle*$h''"</small>
+
| Dialogue shown on the farm with a 20% chance.<br /><small>Example: <samp>Outdoor_Abigail</samp>: "''I'm just going to hang out here, okay?#$e#There's a lot of interesting bugs and things out here. *chuckle*$h''"</small>
 
|-
 
|-
| <tt>Outdoor_{{t|random}}</tt>
+
| <samp>Outdoor_{{t|random}}</samp>
| Dialogue shown on the farm with an 80% chance. {{t|random}} is a number 0–4, used to randomly select an entry.<br /><small>Example: <tt>Outdoor_3</tt>: "''It's pretty cool that we have a cave on our property. It's something I always dreamed about.$h''"</small>
+
| Dialogue shown on the farm with an 80% chance. {{t|random}} is a number 0–4, used to randomly select an entry.<br /><small>Example: <samp>Outdoor_3</samp>: "''It's pretty cool that we have a cave on our property. It's something I always dreamed about.$h''"</small>
 
|-
 
|-
| <tt>spouseRoom_{{t|spouse}}</tt>
+
| <samp>spouseRoom_{{t|spouse}}</samp>
| Dialogue shown when the NPC is in their room.<br /><small>Example: <tt>spouseRoom_Abigail</tt>: "''$c .5#I got up a little before you and fed David Jr. He's very active this morning.#$e#I hope you don't mind the guinea pig smell."''</small>
+
| Dialogue shown when the NPC is in their room.<br /><small>Example: <samp>spouseRoom_Abigail</samp>: "''$c .5#I got up a little before you and fed David Jr. He's very active this morning.#$e#I hope you don't mind the guinea pig smell."''</small>
 
|-
 
|-
| <tt>OneKid_{{t|random}}</tt>
+
| <samp>OneKid_{{t|random}}</samp>
| Dialogue shown when standing in the kitchen, if they have one child. {{t|random}} is a number 0–4, used to randomly select an entry.<br /><small><tt>OneKid_1</tt>: "''I wonder if %kid1 will grow up to be a farmer like you?''"</small>
+
| Dialogue shown when standing in the kitchen, if they have one child. {{t|random}} is a number 0–4, used to randomly select an entry.<br /><small><samp>OneKid_1</samp>: "''I wonder if %kid1 will grow up to be a farmer like you?''"</small>
 
|-
 
|-
| <tt>TwoKids_{{t|random}}</tt>
+
| <samp>TwoKids_{{t|random}}</samp>
| Dialogue shown when standing in the kitchen, if they have two children. {{t|random}} is a number 0–4, used to randomly select an entry.<br /><small><tt>TwoKids_2</tt>: "''I had a dream that %kid2 will grow up to be a famous monster hunter. I've already been thinking about a little armor set.''"</small>
+
| Dialogue shown when standing in the kitchen, if they have two children. {{t|random}} is a number 0–4, used to randomly select an entry.<br /><small><samp>TwoKids_2</samp>: "''I had a dream that %kid2 will grow up to be a famous monster hunter. I've already been thinking about a little armor set.''"</small>
 
|-
 
|-
| <tt>{{t|affection}}_{{t|random}}</tt>
+
| <samp>{{t|affection}}_{{t|random}}</samp>
| Dialogue shown inside the farmhouse between 11am and 6pm, ''or'' when the day starts if a different dialogue isn't selected. {{t|affection}} is randomly <tt>Bad</tt> or <tt>Neutral</tt> if they have less than 9 hearts; 50% chance of <tt>Good</tt> and 75% chance of <tt>Good</tt> if you have 10+ or 11+ hearts respectively; else <tt>Neutral</tt> {{t|random}} is a number 0–9, used to randomly select an entry.<br /><small>Example: <tt>Good_5</tt>: "''I was just admiring the mermaid's pendant you gave me... I'll proudly wear this to my grave.$l''"</small>
+
| Dialogue shown inside the farmhouse between 11am and 6pm, ''or'' when the day starts if a different dialogue isn't selected. {{t|affection}} is randomly <samp>Bad</samp> or <samp>Neutral</samp> if they have less than 9 hearts; 50% chance of <samp>Good</samp> if you have 10+ hearts, and 87.5% chance of <samp>Good</samp> if you have 11+ hearts; else <samp>Neutral</samp> {{t|random}} is a number 0–9, used to randomly select an entry.<br /><small>Example: <samp>Good_5</samp>: "''I was just admiring the mermaid's pendant you gave me... I'll proudly wear this to my grave.$l''"</small>
 
|}
 
|}
  
===Event files===
+
===Data directory===
<tt>Data\Events\*.xnb</tt> contains event scripts, including any dialogue in the event (see [[Modding:Event data]]).
+
====Engagement dialogue====
 +
Similar to the rain dialogue, <samp>Data\EngagementDialogue.xnb</samp> contains entries in the form of <samp>{{t|NPC}}0</samp> and <samp>{{t|NPC}}1</samp>, which are used when you are engaged but not yet married to an NPC, or, in the case of a roommate, when they have been invited but have not yet moved in.
  
===Animation descriptions===
+
====Event files====
<tt>Data\animationDescriptions.xnb</tt> contains short bits of dialogue to go with certain schedule points.
+
<samp>Data\Events\*.xnb</samp> contains event scripts, including any dialogue in the event (see [[Modding:Event data]]).
  
===Strings from CS files===
+
====Extra dialogue====
<tt>Strings\StringsFromCSFiles.xnb</tt> contains miscellaneous translations. That includes NPC dialogue defined in the code, dialogue that's shared between multiple characters, dialogue for some hardcoded events like marriage, etc.
+
<samp>Data\ExtraDialogue.xnb</samp> contains miscellaneous strings, some of which are NPC specific:
  
The file has entries in the form <tt>"<key>": "dialogue string"</tt>, where the key is an arbitrary unique identifier. These must exactly match the key expected by the game, but the keys are just unique identifiers &mdash; even though most keys look like <tt>{{t|file name}}.{{t|line number}}</tt>, that's just the convention originally used to assign IDs and it has no meaning or effect (nor does it even necessarily match the current file name or line number).
+
{| class="wikitable"
 +
|-
 +
! key format
 +
! description
 +
|-
 +
| <samp>PurchasedItem_*</samp>
 +
| Randomly shown by a non-child town NPC after you sell an edible item to a shop. These keys are hardcoded, and you can't add new keys with a similar pattern.
  
====NPC-specific generic dialogue====
+
For keys with a number infix (like <samp>PurchasedItem_5_Cooking</samp>), the number is selected as such:
With some ingenuity, you can make each NPC respond differently instead of using the normal static dialogue. For example, you can use {{nexus mod|1915|Content Patcher}} to change <tt>NPC.cs.3962</tt> and <tt>NPC.cs.3963</tt> (to give a bouquet), and <tt>NPC.cs.3980</tt> (for the mermaid pendant acceptance):
+
* If the NPC is marked as rude in their data, they use 3.
<source lang="json">
+
* Otherwise they randomly choose 1-5.
 +
|-
 +
| <samp>Town_DumpsterDiveComment_Child</samp><br /><samp>Town_DumpsterDiveComment_Teen</samp><br /><samp>Town_DumpsterDiveComment_Adult</samp><br /><samp>Town_DumpsterDiveComment_Linus</samp>
 +
| Shown when an NPC catches you rummaging through trash cans, depending on the NPC's age. Linus has his own dialogue, but other NPCs don't.
 +
|-
 +
| <samp>SummitEvent_Dialogue3_{{t|spouse}}</samp>
 +
| Shown for your NPC spouse near the start of the [[perfection]] cutscene.
 +
|}
 +
 
 +
====Movie theater dialogue====
 +
An NPC's reaction to a movie is stored in <samp>Data\MoviesReactions.xnb</samp>, which is structured far differently from every other dialogue file. See [[Modding:Movie theater data]] for more details.
 +
 
 +
===Strings directory===
 +
====Animation descriptions====
 +
<samp>Strings\animationDescriptions.xnb</samp> contains short bits of dialogue to go with certain schedule points. '''Not to be confused to <samp>Data\animationDescriptions.xnb</samp>, which contains the data of animations, rather than the strings for their description.'''
 +
 
 +
====Characters====
 +
<samp>Strings\Characters.xnb</samp> contains miscellaneous dialogue, some of which is NPC-specific:
 +
 
 +
{| class="wikitable"
 +
|-
 +
! key format
 +
! description
 +
|-
 +
| <samp>MovieInvite_Spouse_{{t|NPC name}}</samp>
 +
| Shown when the NPC accepts a [[Movie Ticket|movie ticket]] when they're married to you. If missing, defaults to a <samp>MovieInvite_Invited_*</samp> key.
 +
|-
 +
| <samp>MovieInvite_Invited_{{t|NPC name}}</samp><br /><samp>MovieInvite_Invited_{{t|manner}}</samp><br /><samp>MovieInvite_Invited_{{t|socialAnxiety}}</samp><br /><samp>MovieInvite_Invited_{{t|optimism}}</samp><br /><samp>MovieInvite_Invited_{{t|age}}</samp><br /><samp>MovieInvite_Invited</samp>
 +
| Shown when the NPC accepts a [[Movie Ticket|movie ticket]]. The NPC will use the first key that exists in the order listed here.
 +
 
 +
The {{t|manner}}, {{t|socialAnxiety}}, and {{t|optimism}} values are those specified in the [[Modding:NPC data|NPC's equivalent data fields]]. The {{t|age}} value is one of <samp>Child</samp>, <samp>Teen</samp>, or <samp>Adult</samp>.
 +
|-
 +
| <samp>Phone_*</samp>
 +
| Shown when calling a shop owner NPC on the [[telephone]]. These keys are hardcoded, so new keys with the same pattern will be ignored.
 +
|}
 +
 
 +
====Events====
 +
<samp>Strings\Events.xnb</samp> contains miscellaneous dialogue related to events and festivals, some of which is NPC-specific.
 +
 
 +
====Speech bubbles====
 +
<samp>Strings\SpeechBubbles.xnb</samp> contains dialogue spoken by NPCs through speech bubbles when '''the player''' enters a given location. This is distinct from the <samp>{{t|location}}_Entry</samp> field in an NPC's <samp>Characters\Dialogue\*.xnb</samp> file, which is triggered when '''the NPC''' enters a given location.
 +
 
 +
These keys are hardcoded, so new keys with the same pattern will be ignored.
 +
 
 +
====Strings from CS files====
 +
<samp>Strings\StringsFromCSFiles.xnb</samp> contains miscellaneous strings, such as dialogue that's shared between multiple characters, dialogue for some hardcoded events like marriage, etc.
 +
 
 +
The file has entries in the form <samp>"<key>": "dialogue string"</samp>, where the key is an arbitrary unique identifier. These must exactly match the key expected by the game, but the keys are just unique identifiers &mdash; even though most keys look like <samp>{{t|file name}}.{{t|line number}}</samp>, that's just the convention originally used to assign IDs and it has no meaning or effect (nor does it even necessarily match the current file name or line number).
 +
 
 +
In most situations, if the game is unable to find a string for an NPC to say, it will default to <samp>NPC.cs.4061</samp> (English version: "Hi.").
 +
 
 +
Some other useful NPC-specific strings stored here are as follows:
 +
 
 +
{| class="wikitable"
 +
|-
 +
! key format
 +
! description
 +
|-
 +
| <samp>{{t|NPC name}}_AfterWedding</samp>
 +
| Shown after marrying an NPC, when you talk to them on the farm on the same day.
 +
|-
 +
| <samp>{{t|NPC name}}_Engaged</samp></br><samp>{{t|NPC name}}_EngagedRoommate</samp>
 +
| Shown after the NPC accepts an engagement item (e.g. [[Mermaid's Pendant|mermaid's pendant]] or [[Void Ghost Pendant|void ghost pendant]] for vanilla NPCs).
 +
|}
 +
 
 +
===NPC-specific generic dialogue===
 +
With some ingenuity, you can make each NPC respond differently instead of using the normal static dialogue. You can use a special mod like {{nexus mod|6358|Custom Fixed Dialogue}}, but the same effect can be achieved with just {{nexus mod|1915|Content Patcher}} with some effort. To change <samp>NPC.cs.3962</samp> and <samp>NPC.cs.3963</samp> (to give a bouquet), and <samp>NPC.cs.3980</samp> (for the mermaid pendant acceptance):
 +
 
 +
<syntaxhighlight lang="json">
 
{
 
{
 
   "Action": "EditData",
 
   "Action": "EditData",
Line 166: Line 265:
 
       "NPC.cs.3962": "$q 10001 give_flowersA#?!...#$r 10001 0 give_flowersA# [Give Bouquet]",
 
       "NPC.cs.3962": "$q 10001 give_flowersA#?!...#$r 10001 0 give_flowersA# [Give Bouquet]",
 
       "NPC.cs.3963": "$q 10001 give_flowersB#?!...#$r 10001 0 give_flowersB# [Give Bouquet]",
 
       "NPC.cs.3963": "$q 10001 give_flowersB#?!...#$r 10001 0 give_flowersB# [Give Bouquet]",
       "NPC.cs.3980": "$q 10001 give_pendant#?!...#$r 10001 0 give_flowersB# Will you marry me?"
+
       "NPC.cs.3980": "$q 10001 give_pendant#?!...#$r 10001 0 give_pendant# Will you marry me?"
 
   }
 
   }
 
}
 
}
</source>
+
</syntaxhighlight>
 +
 
 +
In this example, each NPC will get their response from the <samp>give_flowersA</samp>, <samp>give_flowersB</samp>, and <samp>give_pendant</samp> dialogue key in their [[Modding:Dialogue#Character-specific dialogue|character dialogue]] files. (See [[#Format|format]] below for more info on the syntax.)
 +
 
 +
Note that these should be added for all datable characters to avoid errors. For example, you could add this for Haley:
  
In this example, each NPC will get their response from the <tt>give_flowersA</tt>, <tt>give_flowersB</tt>, and <tt>give_pendant</tt> dialogue key in their [[Modding:Dialogue#Character-specific dialogue|character dialogue]] files. (See [[#Format|format]] below for more info on the syntax.) Note that these should be added for all datable characters to avoid errors. For example, you could add this for Haley:
+
<syntaxhighlight lang="json">
<source lang="json">
 
 
{
 
{
 
   "Action": "EditData",
 
   "Action": "EditData",
Line 182: Line 284:
 
   }
 
   }
 
}
 
}
</source>
+
</syntaxhighlight>
  
 
This can be used for other generic responses, and you even can avoid the "Give Bouquet" by asking for an answered question's ID.
 
This can be used for other generic responses, and you even can avoid the "Give Bouquet" by asking for an answered question's ID.
 +
  
 
==Algorithm==
 
==Algorithm==
Line 190: Line 293:
  
 
# Event dialogue is read from the appropriate event commands (see [[Modding:Event data]]).
 
# Event dialogue is read from the appropriate event commands (see [[Modding:Event data]]).
# Location-specific dialogue is read from <tt>StringsFromCSFiles {{t|location}}.cs</tt>.
+
# Location-specific dialogue is read from <samp>StringsFromCSFiles {{t|location}}.cs</samp>.
 
# Else character dialogue is read from the character-specific files.
 
# Else character dialogue is read from the character-specific files.
# If no dialogues were found, the game resorts to hardcoded dialogue from the <tt>StringsFromCSFiles</tt> files (specifically keys prefixed with <tt>NPC.cs</tt> NPC.cs).
+
# If no dialogues were found, the game resorts to hardcoded dialogue from the <samp>StringsFromCSFiles</samp> files (specifically keys prefixed with <samp>NPC.cs</samp> NPC.cs).
  
 
==Format==
 
==Format==
Dialogue text can contain tokens and commands which control the dialogue box, change the text (e.g. switch between gender-specific strings), inject values, etc. These are parsed by the <tt>Dialogue</tt> class.
+
Dialogue text can contain tokens and commands which control the dialogue box, change the text (''e.g.,'' switch between gender-specific strings), inject values, etc. These are parsed by the <samp>Dialogue</samp> class.
  
Special tokens:
+
===Special tokens===
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 204: Line 307:
 
! description
 
! description
 
|-
 
|-
| <tt>#</tt>
+
| <samp>#</samp>
 
| Separates two commands in a dialogue string.
 
| Separates two commands in a dialogue string.
 
|-
 
|-
| <tt>{</tt>
+
| <samp>{</samp>
 
| TODO. Stands for "breakSpecialCharacter".
 
| TODO. Stands for "breakSpecialCharacter".
 
|-
 
|-
| <tt>^</tt>
+
| <samp>^</samp>
 
| Gender switch character. The text before it is shown for male farmers, the text after it for female farmers.<br />''Example: <code>Oh, good morning Mr. @!^Oh, good morning Ms. @!</code>''
 
| Gender switch character. The text before it is shown for male farmers, the text after it for female farmers.<br />''Example: <code>Oh, good morning Mr. @!^Oh, good morning Ms. @!</code>''
 
|-
 
|-
| <tt>%</tt>
+
| <samp>%</samp>
 
| Turns the dialogue box into a generic text box.<br />''Example: <code>"%Abigail is lost in her music."</code>''
 
| Turns the dialogue box into a generic text box.<br />''Example: <code>"%Abigail is lost in her music."</code>''
 
|-
 
|-
| <tt>*</tt>
+
| <samp>*</samp>
 
| TODO. Stands for "quickResponseDelineator".
 
| TODO. Stands for "quickResponseDelineator".
 
|}
 
|}
  
 
===Portrait commands===
 
===Portrait commands===
These commands determine which portrait will be shown in the dialogue box. Portrait commands go to the end of a line of dialogue:
+
These set the portrait shown in the dialogue box for the current line of dialogue. If there's no portrait command, the neutral portrait is used.
:<code>"fall_Fri6": "When I was a little girl, my father abandoned us.$s#$b#I'm sorry to make things uncomfortable for you...$u#$e#Anyway... How's the farming life going?",</code>
+
 
 +
Portraits are numbered left-to-right and top-to-bottom, starting at <samp>$0</samp>. The first six portraits are standard, and can be identified by the number (like <samp>$2</samp>) or a unique alias (like <samp>$s</samp>). All potential spouses and many other characters have these six portraits, but it's not fully consistent; for example, Caroline only has four.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! command
+
! numbered
 +
! alias
 
! description
 
! description
 
|-
 
|-
| <tt>$neutral</tt>
+
| <samp>$0</samp>
| Switch the speaking character to their neutral portrait.
+
|  
 +
| Use their neutral portrait.
 
|-
 
|-
| <tt>$h</tt>
+
| <samp>$1</samp>
| Switch the speaking character to their happy portrait.
+
| <samp>$h</samp>
 +
| Use their happy portrait.
 
|-
 
|-
| <tt>$s</tt>
+
| <samp>$2</samp>
| Switch the speaking character to their sad portrait.
+
| <samp>$s</samp>
 +
| Use their sad portrait.
 
|-
 
|-
| <tt>$u</tt>
+
| <samp>$3</samp>
| Switch the speaking character to their unique portrait.
+
| <samp>$u</samp>
 +
| Use their unique portrait. This is different for each NPC: grumpy ([[Abigail]]), holding football ([[Alex]]), angry ([[Caroline]]), sick ([[Governor]]), etc.
 
|-
 
|-
| <tt>$l</tt>
+
| <samp>$4</samp>
| Switch the speaking character to their love portrait.
+
| <samp>$l</samp>
 +
| Use their love portrait.
 
|-
 
|-
| <tt>$a</tt>
+
| <samp>$5</samp>
| Switch the speaking character to their angry portrait.
+
| <samp>$a</samp>
 +
| Use their angry portrait.
 
|-
 
|-
| <tt>${{t|id}}</tt>
+
| <samp>${{t|id}}</samp>
| Switch the speaking character to the portrait at the given index in their portraits file. Portraits are numbered from left to right and top to bottom, starting at <tt>$0</tt>. All characters have six standard portraits: <tt>$0</tt> (neutral), <tt>$1</tt> (happy), <tt>$2</tt> (sad), <tt>$3</tt> (unique), <tt>$4</tt> (love), and <tt>$5</tt> (angry). Characters may have custom portraits beyond those for their dialogue and cutscenes.<br/>NOTE: <tt>$1</tt> can't be used as the first dialogue command (see <tt>$1</tt> below).
+
|  
 +
| A custom portrait beyond the standard six.  
 
|}
 
|}
 +
 +
Portrait commands should be at the end of a dialogue line:
 +
:<code>"fall_Fri6": "When I was a little girl, my father abandoned us.$s#$b#I'm sorry to make things uncomfortable for you...$u#$e#Anyway... How's the farming life going?",</code>
  
 
===Dialogue commands===
 
===Dialogue commands===
Line 255: Line 370:
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| <tt>$q {{t|response IDs}} {{t|fallback}}#{{t|text}}</tt>
+
! command
 +
! description
 +
|-
 +
| <samp>$q {{t|response IDs}} {{t|fallback}}#{{t|text}}</samp>
 
| Show a dialogue box containing the given question text.  If {{t|response IDs}} (a list delimited by <code>/</code>) contains an answer already given, the question is skipped (along with the rest of this dialogue line), and instead the dialogue entry identified by {{t|fallback}} will be appended to whatever precedes this $q command.  The {{t|fallback}} dialogue typically uses a $p command to adjust the text based on the player's answer to this question. NOTE: dialogue questions must use unique IDs, similar to events.  See [[Modding:Event_data|the event data page]] for more information.
 
| Show a dialogue box containing the given question text.  If {{t|response IDs}} (a list delimited by <code>/</code>) contains an answer already given, the question is skipped (along with the rest of this dialogue line), and instead the dialogue entry identified by {{t|fallback}} will be appended to whatever precedes this $q command.  The {{t|fallback}} dialogue typically uses a $p command to adjust the text based on the player's answer to this question. NOTE: dialogue questions must use unique IDs, similar to events.  See [[Modding:Event_data|the event data page]] for more information.
 
|-
 
|-
| <tt>$r {{t|response ID}} {{t|friendship}} {{t|reaction}}#{{t|answer text}}</tt>
+
| <samp>$r {{t|response ID}} {{t|friendship}} {{t|reaction}}#{{t|answer text}}</samp>
| Define a response option to a $q question dialogue. {{t|answer text}} is the text shown. {{t|response ID}} is used to group responses for future reference (multiple answers can share an answer ID). {{t|friendship}} defines the change in friendship value, positive or negative, if this response is selected. {{t|reaction}} names the dialogue entry from the NPC's <tt>Content\Characters\Dialogue\*.xnb</tt> file that will be the NPC's reaction if this response is selected by the player.
+
| Define a response option to a $q question dialogue. {{t|answer text}} is the text shown. {{t|response ID}} is used to group responses for future reference (multiple answers can share an answer ID). {{t|friendship}} defines the change in friendship value, positive or negative, if this response is selected. {{t|reaction}} names the dialogue entry from the NPC's <samp>Content\Characters\Dialogue\*.xnb</samp> file that will be the NPC's reaction if this response is selected by the player.
 
|-
 
|-
| <tt>$p {{t|response ID}}#{{t|match text}}&#124;{{t|no-match text}}</tt>
+
| <samp>$p {{t|response ID}}#{{t|match text}}&#124;{{t|no-match text}}</samp>
| Stands for "dialoguePrerequisite".  Shows different text depending on whether the player gave a particular answer to a previously-asked question.  If {{t|response ID}} matches an answer the player gave, {{t|match text}} is shown; otherwise, {{t|no-match text}} is shown. These texts, separated by <code>&#124;</code>, can each contain multiple commands separated by <code>#</code>. This does not need to be the first command in the dialogue string.
+
| Stands for "dialoguePrerequisite".  Shows different text depending on whether the player gave a particular answer to a previously-asked question.  If {{t|response ID}} matches an answer the player gave, {{t|match text}} is shown; otherwise, {{t|no-match text}} is shown. These texts are separated by <code>&#124;</code> and only {{t|no-match text}} can contain additional commands. This does not need to be the first command in the dialogue string.
 
|-
 
|-
| <tt>$b</tt>
+
| <samp>$b</samp>
 
| Indicates pauses in dialogue, where the player will need to click for the next part to load in a new dialogue box.
 
| Indicates pauses in dialogue, where the player will need to click for the next part to load in a new dialogue box.
 
|-
 
|-
| <tt>$e</tt>
+
| <samp>$e</samp>
| Ends the current dialogue, closing the dialogue box and resuming player control. The dialogue following <tt>$e</tt> will require a new interaction with the NPC.
+
| Ends the current dialogue, closing the dialogue box and resuming player control. The dialogue following <samp>$e</samp> will require a new interaction with the NPC.
 
|-
 
|-
| <tt>$k</tt>
+
| <samp>$k</samp>
| TODO. Stands for "dialogueKill".
+
| Short for ''dialogueKill''. Removes all dialogue messages after the current one.
 
|-
 
|-
| <tt>$c {{t|probability}}#{{t|text1}}#{{t|text2}}</tt>
+
| <samp>$c {{t|probability}}#{{t|text1}}#{{t|text2}}</samp>
 
| Show {{t|text1}} with a {{t|probability}} between 0 and 1; otherwise, show {{t|text2}}.  E.g. <code>$c 0.9</code> for a 90% chance of {{t|text1}} and a 10% chance of {{t|text2}}.  NOTE: Replacer commands (see below) do not work in {{t|text1}}. This does not need to be the first command in a dialogue string. It is unaffected by daily luck.
 
| Show {{t|text1}} with a {{t|probability}} between 0 and 1; otherwise, show {{t|text2}}.  E.g. <code>$c 0.9</code> for a 90% chance of {{t|text1}} and a 10% chance of {{t|text2}}.  NOTE: Replacer commands (see below) do not work in {{t|text1}}. This does not need to be the first command in a dialogue string. It is unaffected by daily luck.
 
|-
 
|-
| <tt>$d {{t|bus|joja|cc|kent}}</tt>
+
| <samp>$d {{t|state id}}#{{t|text1}}&#124;{{t|text2}}</samp>
| dialogueDependingOnWorldState<br/>
+
| Show one of two dialogue strings based on a predefined condition: <samp>bus</samp> (whether the bus is repaired), <samp>joja</samp> (whether the Joja Mart is still in business), <samp>cc</samp> or <samp>communitycenter</samp> (whether the Community Center is accessible), or <samp>kent</samp> (whether [[Kent]] has returned to the valley). The dialogue string must start with <samp>$d</samp>, everything up to the first <code>&#124;</code> symbol is shown if the condition matches, and everything after that is shown if the condition doesn't match.
<code>"Tue4": "$d</code> {{t|dependence}}<code>#|Dialogue when dependence value is true.|Dialogue in other situations.",</code><br/>
+
 
The dependence can take one of four values: "bus": is the bus fixed?; "joja": is Joja Mart in business?; "cc": has the Community Center been completed?; "kent": has Kent returned to the valley? This command must start the dialogue string and does not allow for any other dialogue commands in the string.
+
For example:
 +
<syntaxhighlight lang="js">"Mon2": "$d kent#Yesterday I visited Yoba's Altar to give thanks for my husband's safe return.|Yesterday I visited Yoba's Altar to ask for my husband's safe return.#$e#I'm trying to stay positive, but it's hard sometimes.$s"</syntaxhighlight>
 
|-
 
|-
| <tt>$y</tt>
+
| <samp>$y</samp>
| TODO. Stands for "dialogueQuickResponse"; A simpler form of question. Works like $q, but within one and the same text line. It doesn't have neither "dialoguePrerequisite" ($p) nor friendship point changes. It can be triggered indenitelly.<br /><small>Example: <tt>Penny: "$y 'Breakfast?_Yes please._Here you go._No, I'm good_More for me then!'"</tt></small>
+
| TODO. Stands for "dialogueQuickResponse"; A simpler form of question. Works like $q, but within one and the same text line. It doesn't have neither "dialoguePrerequisite" ($p) nor friendship point changes. It can be triggered indenitelly.<br /><small>Example: <samp>Penny: "$y 'Breakfast?_Yes please._Here you go._No, I'm good_More for me then!'"</samp></small>
 
|-
 
|-
| <tt>$1 {{t|letter ID}}#{{t|1st-time text}} #$e# {{t|nth-time text}}</tt>
+
| <samp>$1 {{t|letter ID}}#{{t|1st-time text}} #$e# {{t|nth-time text}}</samp>
 
| Creates a line of dialogue which the character will only see once (at most).  {{t|1st-time text}} is shown only if {{t|letter ID}} has not been marked as sent yet (and this marks it as sent); otherwise, {{t|nth-time text}} is shown.  {{t|letter ID}} should not correspond to an actual piece of mail (because it will not be sent), but it can be referenced by events or other dialogue lines.
 
| Creates a line of dialogue which the character will only see once (at most).  {{t|1st-time text}} is shown only if {{t|letter ID}} has not been marked as sent yet (and this marks it as sent); otherwise, {{t|nth-time text}} is shown.  {{t|letter ID}} should not correspond to an actual piece of mail (because it will not be sent), but it can be referenced by events or other dialogue lines.
 
|-
 
|-
| <tt>%fork</tt>
+
| <samp>%fork</samp>
| Sets the the <tt>specialEventVariable1</tt> variable, which can be checked by a later <tt>fork</tt> event command. Mainly useful in reaction dialogue for <tt>$q</tt> questions during events.
+
| Sets the the <samp>specialEventVariable1</samp> variable, which can be checked by a later <samp>fork</samp> event command. Mainly useful in reaction dialogue for <samp>$q</samp> questions during events.
 
|-
 
|-
| <tt>[# # #]</tt>
+
| <samp>[# # #]</samp>
| Gives the player a random item, from the pool of item IDs within the brackets.
+
| Gives the player a random item, from the pool of [[Modding:Items/Object sprites|item IDs]] within the brackets. For example, <syntaxhighlight lang="js">"I spent the afternoon daydreaming about the ocean. So I decided to cook some seafood. [198 202 727 728]$h"</syntaxhighlight> ...gives one of 198 (Baked Fish), 202 (Fried Calamari), 727 (Chowder), or 728 (Fish Stew) as a gift.
 +
|-
 +
| <samp>%revealtaste{{t|NPC}}{{t|object ID}}</samp>
 +
| Reveals the named character's gift taste for an [[Modding:Items|object]] in their social menu profile. For example, <samp>%revealtasteLewis258</samp> will update Lewis's profile to show that he likes blueberries. This only works if it's in the first message in a dialogue box (''i.e.,'' before any <code>#$b#</code> break, though <code>#$e#</code> breaks are fine).
 
|}
 
|}
  
Line 297: Line 419:
 
To understand how $q, $r, and $p work, an example may be helpful. Note how you can format the script to be easier to read:
 
To understand how $q, $r, and $p work, an example may be helpful. Note how you can format the script to be easier to read:
  
<source lang="yaml">
+
<syntaxhighlight lang="yaml">
 
summer_Fri:
 
summer_Fri:
 
     "I think I'll go to the beach tomorrow!
 
     "I think I'll go to the beach tomorrow!
Line 305: Line 427:
 
         #$r 306 -10 beachquestion_no#No thank you.
 
         #$r 306 -10 beachquestion_no#No thank you.
 
     ",
 
     ",
     beachquestion_yes: "Good! It's a date.$h",
+
     "beachquestion_yes": "Good! It's a date.$h",
     beachquestion_sorry: "Oh. Darn. Okay.$6",
+
     "beachquestion_sorry": "Oh. Darn. Okay.$6",
     beachquestion_no: "Oh. Um. Sorry.$s",
+
     "beachquestion_no": "Oh. Um. Sorry.$s",
     beachquestion_followup:
+
     "beachquestion_followup":
 
         "$p 305
 
         "$p 305
 
             #Tomorrow should be a lot of fun!$h
 
             #Tomorrow should be a lot of fun!$h
Line 320: Line 442:
 
         |Oh, hi @, how's it going?
 
         |Oh, hi @, how's it going?
 
     ",
 
     ",
</source>
+
</syntaxhighlight>
  
 
The dialogue above triggers on any Friday in the summer. The NPC begins with a response that is always shown: "I think I'll go to the beach tomorrow!"
 
The dialogue above triggers on any Friday in the summer. The NPC begins with a response that is always shown: "I think I'll go to the beach tomorrow!"
  
 
Next they ask you a question.
 
Next they ask you a question.
<source lang="yaml">#$q 305/306 beachquestion_followup#Would you like to go with me?</source>
+
<syntaxhighlight lang="yaml">#$q 305/306 beachquestion_followup#Would you like to go with me?</syntaxhighlight>
  
 
'''$q''' starts the question. '''305/306''' checks to see if this question has been asked before, and if it has it sends you to the dialogue key '''beachquestion_followup'''. (Note that you can name your dialogue keys whatever you like which makes it easier to read.)
 
'''$q''' starts the question. '''305/306''' checks to see if this question has been asked before, and if it has it sends you to the dialogue key '''beachquestion_followup'''. (Note that you can name your dialogue keys whatever you like which makes it easier to read.)
Line 331: Line 453:
 
Next are the responses the player can give. You can add any number of '''$r''' lines; here we have three:
 
Next are the responses the player can give. You can add any number of '''$r''' lines; here we have three:
  
<source lang="yaml">
+
<syntaxhighlight lang="yaml">
 
     #$r 305 15 beachquestion_yes#Sure, I would love to!
 
     #$r 305 15 beachquestion_yes#Sure, I would love to!
 
     #$r 306 0 beachquestion_sorry#Oh, sorry, I've already made plans with someone else...
 
     #$r 306 0 beachquestion_sorry#Oh, sorry, I've already made plans with someone else...
 
     #$r 306 -10 beachquestion_no#No thank you.
 
     #$r 306 -10 beachquestion_no#No thank you.
</source>
+
</syntaxhighlight>
 
If you say yes (first option), the game will store '''ID 305''' as the answer given to this question. Next, your friendship with that person increases by '''15'''. '''beachquestion_yes''' tells the script which dialogue key continuation to use as a response to your answer.
 
If you say yes (first option), the game will store '''ID 305''' as the answer given to this question. Next, your friendship with that person increases by '''15'''. '''beachquestion_yes''' tells the script which dialogue key continuation to use as a response to your answer.
  
Line 342: Line 464:
 
Now we need to make dialogue keys for each response:
 
Now we need to make dialogue keys for each response:
  
<source lang="yaml">
+
<syntaxhighlight lang="yaml">
 
     beachquestion_yes: "Good! It's a date.$h",
 
     beachquestion_yes: "Good! It's a date.$h",
 
     beachquestion_sorry: "Oh. Darn. Okay.$6",
 
     beachquestion_sorry: "Oh. Darn. Okay.$6",
Line 351: Line 473:
 
             |Hmm, I wonder if I can get someone to go with me...$s
 
             |Hmm, I wonder if I can get someone to go with me...$s
 
         ",
 
         ",
</source>
+
</syntaxhighlight>
  
 
Of note here is '''beachquestion_followup'''. If the player talks to the NPC again, '''$q 305/306''' will check that the question has already been answered and instead go directly to this key.
 
Of note here is '''beachquestion_followup'''. If the player talks to the NPC again, '''$q 305/306''' will check that the question has already been answered and instead go directly to this key.
Line 359: Line 481:
 
There is another variable response the next day:
 
There is another variable response the next day:
  
<source lang="yaml">
+
<syntaxhighlight lang="yaml">
 
summer_Sat:
 
summer_Sat:
 
     "The beach is lovely this time of year...
 
     "The beach is lovely this time of year...
Line 366: Line 488:
 
         |Oh, hi @, how's it going?
 
         |Oh, hi @, how's it going?
 
     ",
 
     ",
</source>
+
</syntaxhighlight>
  
 
Once again the first line (The beach is lovely...) always shows up when the player talks to the NPC, but the next line depends on whether or not they've answered yes the previous day.
 
Once again the first line (The beach is lovely...) always shows up when the player talks to the NPC, but the next line depends on whether or not they've answered yes the previous day.
Line 374: Line 496:
 
Here is another example from Haley's existing dialogue file. Note how the script formatting is harder to read, but the game is able to process both.
 
Here is another example from Haley's existing dialogue file. Note how the script formatting is harder to read, but the game is able to process both.
  
<source lang="yaml">
+
<syntaxhighlight lang="yaml">
 
     summer_Sat: "Farming sounds so boring...#$q 42/43 summer_Sat_old#What do you even do all day?#$r 42 10 summer_Sat_12#Care for plants#$r 42 10 summer_Sat_12#Explore the caves#$r 43 -10 summer_Sat_13#Snoop around in your room#$r 42 10 summer_Sat_12#Dig for treasure" #!String
 
     summer_Sat: "Farming sounds so boring...#$q 42/43 summer_Sat_old#What do you even do all day?#$r 42 10 summer_Sat_12#Care for plants#$r 42 10 summer_Sat_12#Explore the caves#$r 43 -10 summer_Sat_13#Snoop around in your room#$r 42 10 summer_Sat_12#Dig for treasure" #!String
 
     summer_Sat_old: "#$p 43#Hey, you better not be snooping around in my room anymore!$a|But I guess it could get you in pretty good shape." #!String
 
     summer_Sat_old: "#$p 43#Hey, you better not be snooping around in my room anymore!$a|But I guess it could get you in pretty good shape." #!String
 
     summer_Sat_12: "Hmm... sounds like a lot of work." #!String
 
     summer_Sat_12: "Hmm... sounds like a lot of work." #!String
 
     summer_Sat_13: "What? You'd better not be doing that!$a" #!String
 
     summer_Sat_13: "What? You'd better not be doing that!$a" #!String
</source>
+
</syntaxhighlight>
  
 
The first time the <code>summer_Sat</code> dialogue is chosen, neither response 42 nor 43 will have been given (because this question is the only one which has them as responses), so Haley will say, "Farming sounds so boring... What do you even do all day?"  The player can select among these responses:
 
The first time the <code>summer_Sat</code> dialogue is chosen, neither response 42 nor 43 will have been given (because this question is the only one which has them as responses), so Haley will say, "Farming sounds so boring... What do you even do all day?"  The player can select among these responses:
Line 390: Line 512:
 
The third response, <code>$r 43 -10 summer_Sat_13#Snoop around in your room</code>, sets response ID 43, reduces Haley's friendship by 10 points, and brings up the dialogue <code>summer_Sat_13</code> (Haley says, "What? You'd better not be doing that!").  All of the other responses set response ID 42, increase Haley's friendship by 10 points, and bring up the dialogue <code>summer_Sat_12</code> ("Hmm... sounds like a lot of work.").
 
The third response, <code>$r 43 -10 summer_Sat_13#Snoop around in your room</code>, sets response ID 43, reduces Haley's friendship by 10 points, and brings up the dialogue <code>summer_Sat_13</code> (Haley says, "What? You'd better not be doing that!").  All of the other responses set response ID 42, increase Haley's friendship by 10 points, and bring up the dialogue <code>summer_Sat_12</code> ("Hmm... sounds like a lot of work.").
  
The next time <code>summer_Sat</code> is chosen, one of the response IDs listed in the <code>$q</code> command will have been given (either 42 or 43).  Therefore, the <code>$q</code> and everything after is scrapped, and dialogue <code>summer_Sat_old</code> is put in its place.  This new dialogue uses the <code>$p</code> command to change Haley's dialogue based on whether or not you gave response ID 43 to any previous question.  If you answered "Snoop around your room," everything before the <code>|</code> will be used, so Haley will now say, "Farming sounds so boring... Hey, you better not be snooping around in my room anymore!"  If response ID 43 has not been given (in this case, you must have given response ID 42, i.e. one of the other three responses to the previous question), everything after the <code>|</code> will be used, so Haley will instead say, "Farming sounds so boring... But I guess it could get you in pretty good shape."
+
The next time <code>summer_Sat</code> is chosen, one of the response IDs listed in the <code>$q</code> command will have been given (either 42 or 43).  Therefore, the <code>$q</code> and everything after is scrapped, and dialogue <code>summer_Sat_old</code> is put in its place.  This new dialogue uses the <code>$p</code> command to change Haley's dialogue based on whether or not you gave response ID 43 to any previous question.  If you answered "Snoop around your room," everything before the <code>|</code> will be used, so Haley will now say, "Farming sounds so boring... Hey, you better not be snooping around in my room anymore!"  If response ID 43 has not been given (in this case, you must have given response ID 42, ''i.e.,'' one of the other three responses to the previous question), everything after the <code>|</code> will be used, so Haley will instead say, "Farming sounds so boring... But I guess it could get you in pretty good shape."
  
 
===Replacer commands===
 
===Replacer commands===
Replacer commands will be replaced with the relevant string. Note that only <tt>@</tt> works in mail entries.
+
Replacer commands will be replaced with the relevant string. Note that in mail entries, only the <samp>@</samp> replacer works.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| <tt>@</tt>
+
! command
 +
! description
 +
|-
 +
| <samp>@</samp>
 
| Farmer's name.<br />''Example: <code>Hi there @!</code>''
 
| Farmer's name.<br />''Example: <code>Hi there @!</code>''
 
|-
 
|-
| <tt>%adj</tt>
+
| <samp>%adj</samp>
 
| Random adjective. (Defined in StringsFromCSFiles.xnb)
 
| Random adjective. (Defined in StringsFromCSFiles.xnb)
 
|-
 
|-
| <tt>%noun</tt>
+
| <samp>%noun</samp>
 
| Random noun. (Defined in StringsFromCSFiles.xnb)
 
| Random noun. (Defined in StringsFromCSFiles.xnb)
 
|-
 
|-
| <tt>%place</tt>
+
| <samp>%place</samp>
 
| Random place name. (Defined in StringsFromCSFiles.xnb)
 
| Random place name. (Defined in StringsFromCSFiles.xnb)
 
|-
 
|-
| <tt>%spouse</tt>
+
| <samp>%spouse</samp>
 
| The name of Farmer's spouse.
 
| The name of Farmer's spouse.
 
|-
 
|-
| <tt>%name</tt>
+
| <samp>%name</samp>
 
| A randomly-generated name.  
 
| A randomly-generated name.  
 
|-
 
|-
| <tt>%firstnameletter</tt>
+
| <samp>%firstnameletter</samp>
 
| The first half of the farmer's name (rounded down), like ''Nat'' if the farmer's name is Natalie.
 
| The first half of the farmer's name (rounded down), like ''Nat'' if the farmer's name is Natalie.
 
|-
 
|-
| <tt>%time</tt>
+
| <samp>%time</samp>
 
| Current time.
 
| Current time.
 
|-
 
|-
| <tt>%band</tt>
+
| <samp>%band</samp>
 
| The name of Sam and Sebastian's band.
 
| The name of Sam and Sebastian's band.
 
|-
 
|-
| <tt>%book</tt>
+
| <samp>%book</samp>
 
| The title of Elliott's book.
 
| The title of Elliott's book.
 
|-
 
|-
| <tt>%rival</tt>
+
| <samp>%pet</samp>
| A random first name of the Farmer's gender from StringsFromCSFiles.xnb (keys Utility.cs.5499 through Utility.cs.5560).  Will not match the Farmer's name.
 
|-
 
| <tt>%pet</tt>
 
 
| The name of Farmer's pet.
 
| The name of Farmer's pet.
 
|-
 
|-
| <tt>%farm</tt>
+
| <samp>%farm</samp>
 
| Farm name.
 
| Farm name.
 
|-
 
|-
| <tt>%favorite</tt>
+
| <samp>%favorite</samp>
 
| The Farmer's favorite thing.
 
| The Farmer's favorite thing.
 
|-
 
|-
| <tt>%kid1</tt>
+
| <samp>%kid1</samp>
 
| The name of Farmer's first child.
 
| The name of Farmer's first child.
 
|-
 
|-
| <tt>%kid2</tt>
+
| <samp>%kid2</samp>
 
| The name of Farmer's second child.
 
| The name of Farmer's second child.
 
|}
 
|}
Line 450: Line 572:
  
 
===Days of week===
 
===Days of week===
* <tt>Mon</tt>
+
* <samp>Mon</samp>
* <tt>Tue</tt>
+
* <samp>Tue</samp>
* <tt>Wed</tt>
+
* <samp>Wed</samp>
* <tt>Thu</tt>
+
* <samp>Thu</samp>
* <tt>Fri</tt>
+
* <samp>Fri</samp>
* <tt>Sat</tt>
+
* <samp>Sat</samp>
* <tt>Sun</tt>
+
* <samp>Sun</samp>
  
 
===Seasons===
 
===Seasons===
* <tt>spring</tt>
+
* <samp>spring</samp>
* <tt>summer</tt>
+
* <samp>summer</samp>
* <tt>fall</tt>
+
* <samp>fall</samp>
* <tt>winter</tt>
+
* <samp>winter</samp>
  
 
===First/later year===
 
===First/later year===
Line 472: Line 594:
 
! meaning
 
! meaning
 
|-
 
|-
| <tt>1</tt>
+
| <samp>1</samp>
 
| Occurs in the first year.
 
| Occurs in the first year.
 
|-
 
|-
| <tt>2</tt>
+
| <samp>2</samp>
 
| Occurs in any year after the first (not only year 2).
 
| Occurs in any year after the first (not only year 2).
 
|}
 
|}
  
 
===Response IDs===
 
===Response IDs===
A response ID identifies an answer chosen by the player in response to a [[#Question example|question dialogue]]. In some cases a question may have several answers with the same ID (e.g. several variations of "yes"), or use the same ID for ''every'' question (in which case the ID just shows whether the player has answered the question).
+
A response ID identifies an answer chosen by the player in response to a [[#Question example|question dialogue]]. In some cases a question may have several answers with the same ID (''e.g.,'' several variations of "yes"), or use the same ID for ''every'' question (in which case the ID just shows whether the player has answered the question).
  
 
Mods can add their own response IDs, but here are the vanilla IDs as of {{version|1.3.36}}¹:
 
Mods can add their own response IDs, but here are the vanilla IDs as of {{version|1.3.36}}¹:
Line 492: Line 614:
 
|-
 
|-
 
| Abigail
 
| Abigail
| <tt>fall_Sun</tt><br />''I was thinking about dyeing my hair again... what do you think?''
+
| <samp>fall_Sun</samp><br />''I was thinking about dyeing my hair again... what do you think?''
| <tt>27</tt>: ''Dye it black.''<br /><tt>27</tt>: ''Why not blonde?''<br /><tt>27</tt>: ''How about bubblegum pink?''<br /><tt>28</tt>: ''I like your hair just the way it is!''
+
| <samp>27</samp>: ''Dye it black.''<br /><samp>27</samp>: ''Why not blonde?''<br /><samp>27</samp>: ''How about bubblegum pink?''<br /><samp>28</samp>: ''I like your hair just the way it is!''
 
|-
 
|-
 
| Abigail
 
| Abigail
| <tt>summer_Sun</tt><br />''Okay... pretend you just won a free vacation. Where would you go?''
+
| <samp>summer_Sun</samp><br />''Okay... pretend you just won a free vacation. Where would you go?''
| <tt>25</tt>: ''The beach''<br /><tt>26</tt>: ''In a dark cave''<br /><tt>26</tt>: ''The old, gnarled forest''<br /><tt>25</tt>: ''Joja Mega-Mall''
+
| <samp>25</samp>: ''The beach''<br /><samp>26</samp>: ''In a dark cave''<br /><samp>26</samp>: ''The old, gnarled forest''<br /><samp>25</samp>: ''Joja Mega-Mall''
 
|-
 
|-
 
| Abigail
 
| Abigail
| <tt>Sun2</tt><br />''@, What do you think happens to us after we die?''
+
| <samp>Sun2</samp><br />''@, What do you think happens to us after we die?''
| <tt>17</tt>: ''I have no idea.''<br /><tt>18</tt>: ''We come back as spooky ghosts.''<br /><tt>17</tt>: ''We go to Heaven.''<br /><tt>18</tt>: ''Our energy bodies enter the astral plane.''<br /><tt>17</tt>: ''Nothing. We just cease to exist.''
+
| <samp>17</samp>: ''I have no idea.''<br /><samp>18</samp>: ''We come back as spooky ghosts.''<br /><samp>17</samp>: ''We go to Heaven.''<br /><samp>18</samp>: ''Our energy bodies enter the astral plane.''<br /><samp>17</samp>: ''Nothing. We just cease to exist.''
 
|-
 
|-
 
| Abigail
 
| Abigail
| <tt>winter_Sun</tt><br />''I made these two drawings. What do you think?''
+
| <samp>winter_Sun</samp><br />''I made these two drawings. What do you think?''
| <tt>29</tt>: ''I like the jungle island and the tiger.''<br /><tt>30</tt>: ''I like the orc with the battleaxe.''<br /><tt>29</tt>: ''I don't like either of them.''
+
| <samp>29</samp>: ''I like the jungle island and the tiger.''<br /><samp>30</samp>: ''I like the orc with the battleaxe.''<br /><samp>29</samp>: ''I don't like either of them.''
 
|-
 
|-
 
| Alex
 
| Alex
| <tt>fall_Wed</tt><br />''Do you think the ladies like my haircut?^What do you think about my haircut?''
+
| <samp>fall_Wed</samp><br />''Do you think the ladies like my haircut?^What do you think about my haircut?''
| <tt>54</tt>: ''It looks very fashionable.''<br /><tt>55</tt>: ''It looks like some kind of fungal growth.''
+
| <samp>54</samp>: ''It looks very fashionable.''<br /><samp>55</samp>: ''It looks like some kind of fungal growth.''
 
|-
 
|-
 
| Alex
 
| Alex
| <tt>summer_Wed</tt><br />''Do you think I'll ever turn pro?''
+
| <samp>summer_Wed</samp><br />''Do you think I'll ever turn pro?''
| <tt>52</tt>: ''You're destined to be a sports legend''<br /><tt>52</tt>: ''Maybe, if you practice a lot''<br /><tt>53</tt>: ''No, you'll most likely fail and become a salesman''
+
| <samp>52</samp>: ''You're destined to be a sports legend''<br /><samp>52</samp>: ''Maybe, if you practice a lot''<br /><samp>53</samp>: ''No, you'll most likely fail and become a salesman''
 
|-
 
|-
 
| Alex
 
| Alex
| <tt>Wed</tt><br />''I'd ask you to throw the ball around, but you don't really seem like the sports type.^If you weren't a girl I'd ask you to play catch.''
+
| <samp>Wed</samp><br />''I'd ask you to throw the ball around, but you don't really seem like the sports type.^If you weren't a girl I'd ask you to play catch.''
| <tt>6</tt>: ''I'm fine just watching you from a distance.''<br /><tt>5</tt>: ''I want to play catch with you!''<br /><tt>5</tt>: ''(angry) What's that supposed to mean?''
+
| <samp>6</samp>: ''I'm fine just watching you from a distance.''<br /><samp>5</samp>: ''I want to play catch with you!''<br /><samp>5</samp>: ''(angry) What's that supposed to mean?''
 
|-
 
|-
 
| Clint
 
| Clint
| <tt>Mon</tt><br />''I bet you can't guess what my great-grandfather was...''
+
| <samp>Mon</samp><br />''I bet you can't guess what my great-grandfather was...''
| <tt>9</tt>: ''A blacksmith.''<br /><tt>9</tt>: ''A silly clown.''<br /><tt>9</tt>: ''A sarcastic jerk.''
+
| <samp>9</samp>: ''A blacksmith.''<br /><samp>9</samp>: ''A silly clown.''<br /><samp>9</samp>: ''A sarcastic jerk.''
 
|-
 
|-
 
| Haley
 
| Haley
| <tt>fall_Sat</tt><br />''*sigh*...what do you think I should do today?''
+
| <samp>fall_Sat</samp><br />''*sigh*...what do you think I should do today?''
| <tt>44</tt>: ''Watercolor painting''<br /><tt>44</tt>: ''Relax and read a magazine''<br /><tt>44</tt>: ''Stop being a selfish crybaby''
+
| <samp>44</samp>: ''Watercolor painting''<br /><samp>44</samp>: ''Relax and read a magazine''<br /><samp>44</samp>: ''Stop being a selfish crybaby''
 
|-
 
|-
 
| Haley
 
| Haley
| <tt>summer_Sat</tt><br />''What do you even do all day?''
+
| <samp>summer_Sat</samp><br />''What do you even do all day?''
| <tt>42</tt>: ''Care for plants''<br /><tt>42</tt>: ''Explore the caves''<br /><tt>43</tt>: ''Snoop around in your room''<br /><tt>42</tt>: ''Dig for treasure''
+
| <samp>42</samp>: ''Care for plants''<br /><samp>42</samp>: ''Explore the caves''<br /><samp>43</samp>: ''Snoop around in your room''<br /><samp>42</samp>: ''Dig for treasure''
 
|-
 
|-
 
| Leah
 
| Leah
| <tt>Mon</tt><br />''So why did you become a farmer?''
+
| <samp>Mon</samp><br />''So why did you become a farmer?''
| <tt>21</tt>: ''I want to make tons of money.''<br /><tt>22</tt>: ''It's more "real" than living in the city.''<br /><tt>211132</tt>: ''To follow in grandpa's footsteps.''<br /><tt>22</tt>: ''I wanted to escape my old life.''
+
| <samp>21</samp>: ''I want to make tons of money.''<br /><samp>22</samp>: ''It's more "real" than living in the city.''<br /><samp>211132</samp>: ''To follow in grandpa's footsteps.''<br /><samp>22</samp>: ''I wanted to escape my old life.''
 
|-
 
|-
 
| Maru
 
| Maru
| <tt>summer_Thu</tt><br />''I've decided I'm going to build a robot someday.''
+
| <samp>summer_Thu</samp><br />''I've decided I'm going to build a robot someday.''
| <tt>35</tt>: ''That should be very easy for you''<br /><tt>36</tt>: ''You should be more realistic''<br /><tt>35</tt>: ''It sounds challenging''
+
| <samp>35</samp>: ''That should be very easy for you''<br /><samp>36</samp>: ''You should be more realistic''<br /><samp>35</samp>: ''It sounds challenging''
 
|-
 
|-
 
| Maru
 
| Maru
| <tt>Sun</tt><br />''Do you have fun working on the farm?''
+
| <samp>Sun</samp><br />''Do you have fun working on the farm?''
| <tt>3</tt>: ''Yes.''<br /><tt>4</tt>: ''No.''
+
| <samp>3</samp>: ''Yes.''<br /><samp>4</samp>: ''No.''
 
|-
 
|-
 
| Penny
 
| Penny
| <tt>Mon4</tt><br />''But it's best not to dwell on bad things, right?''
+
| <samp>Mon4</samp><br />''But it's best not to dwell on bad things, right?''
| <tt>7</tt>: ''Right. It's best to be positive!''<br /><tt>8</tt>: ''I think it's good to be realistic.''
+
| <samp>7</samp>: ''Right. It's best to be positive!''<br /><samp>8</samp>: ''I think it's good to be realistic.''
 
|-
 
|-
 
| Sam
 
| Sam
| <tt>Wed</tt><br />''Hey.. What do you think my new song should be about?''
+
| <samp>Wed</samp><br />''Hey.. What do you think my new song should be about?''
| <tt>20</tt>: ''Farming, mining, and chopping wood.''<br /><tt>8820</tt>: ''A city in the sea.''<br /><tt>8821</tt>: ''Trains.''<br /><tt>19</tt>: ''Choose anything. It'll still be a horrible song.''
+
| <samp>20</samp>: ''Farming, mining, and chopping wood.''<br /><samp>8820</samp>: ''A city in the sea.''<br /><samp>8821</samp>: ''Trains.''<br /><samp>19</samp>: ''Choose anything. It'll still be a horrible song.''
 
|-
 
|-
 
| Sebastian
 
| Sebastian
| <tt>fall_Fri</tt><br />''Do you read, @?''
+
| <samp>fall_Fri</samp><br />''Do you read, @?''
| <tt>62</tt>: ''Yep. The classics.''<br /><tt>63</tt>: ''Only Sci-fi and Fantasy''<br /><tt>62</tt>: ''I like a good Romance''<br /><tt>63</tt>: ''No, I don't read books''
+
| <samp>62</samp>: ''Yep. The classics.''<br /><samp>63</samp>: ''Only Sci-fi and Fantasy''<br /><samp>62</samp>: ''I like a good Romance''<br /><samp>63</samp>: ''No, I don't read books''
 
|-
 
|-
 
| Sebastian
 
| Sebastian
| <tt>Fri2</tt><br />''So what do you do when you aren't working?''
+
| <samp>Fri2</samp><br />''So what do you do when you aren't working?''
| <tt>15</tt>: ''More Farming''<br /><tt>16</tt>: ''Comic books''<br /><tt>15</tt>: ''Shopping''<br /><tt>15</tt>: ''Sports''
+
| <samp>15</samp>: ''More Farming''<br /><samp>16</samp>: ''Comic books''<br /><samp>15</samp>: ''Shopping''<br /><samp>15</samp>: ''Sports''
 
|}
 
|}
  
Line 569: Line 691:
 
| [[Abigail#Four Hearts|Abigail's 4-heart event]]<!--2/f Abigail 1000/w rainy/t 1200 1900/z winter-->
 
| [[Abigail#Four Hearts|Abigail's 4-heart event]]<!--2/f Abigail 1000/w rainy/t 1200 1900/z winter-->
 
| ''@! Why are you out here in the rain?$7''
 
| ''@! Why are you out here in the rain?$7''
| <tt>32</tt>: ''Just doing some work''<br /><tt>32</tt>: ''Enjoying the weather''<br /><tt>32</tt>: ''I could ask you the same question''
+
| <samp>32</samp>: ''Just doing some work''<br /><samp>32</samp>: ''Enjoying the weather''<br /><samp>32</samp>: ''I could ask you the same question''
 
|-
 
|-
 
| [[Abigail#Six Hearts|Abigail's 6-heart event]]<!--4/f Abigail 1500/t 2100 2400/w sunny-->
 
| [[Abigail#Six Hearts|Abigail's 6-heart event]]<!--4/f Abigail 1500/t 2100 2400/w sunny-->
 
| ''You've used a sword before, haven't you?''
 
| ''You've used a sword before, haven't you?''
| <tt>847951</tt>: ''Yes, and it's exciting!''<br /><tt>847951</tt>: ''Yes, but only in self-defense''<br /><tt>847951</tt>: ''Yes, but it's dangerous. You should stay safe.''<br /><tt>847951</tt>: ''No''
+
| <samp>847951</samp>: ''Yes, and it's exciting!''<br /><samp>847951</samp>: ''Yes, but only in self-defense''<br /><samp>847951</samp>: ''Yes, but it's dangerous. You should stay safe.''<br /><samp>847951</samp>: ''No''
 
|-
 
|-
 
| [[Abigail#Ten Hearts|Abigail's 10-heart event]]<!--901756/f Abigail 2500/t 1700 2400/o Abigail-->
 
| [[Abigail#Ten Hearts|Abigail's 10-heart event]]<!--901756/f Abigail 2500/t 1700 2400/o Abigail-->
 
| ''*sniff*$s''
 
| ''*sniff*$s''
| <tt>776589</tt>: ''What happened?''<br /><tt>776589</tt>: ''Are you okay?''
+
| <samp>776589</samp>: ''What happened?''<br /><samp>776589</samp>: ''Are you okay?''
 
|-
 
|-
 
| [[Abigail#Ten Hearts|Abigail's 10-heart event]]<!--901756/f Abigail 2500/t 1700 2400/o Abigail-->
 
| [[Abigail#Ten Hearts|Abigail's 10-heart event]]<!--901756/f Abigail 2500/t 1700 2400/o Abigail-->
 
| ''I guess I'm not as tough as I thought...$8''
 
| ''I guess I'm not as tough as I thought...$8''
| <tt>34</tt>: ''You're safe with me.''<br /><tt>34</tt>: ''I get scared too.''<br /><tt>34</tt>: ''You're crying like a little baby. Stop.''
+
| <samp>34</samp>: ''You're safe with me.''<br /><samp>34</samp>: ''I get scared too.''<br /><samp>34</samp>: ''You're crying like a little baby. Stop.''
 
|-
 
|-
 
| [[Alex#Five Hearts|Alex's 5-heart event]]<!--21/f Alex 1250/p Alex-->
 
| [[Alex#Five Hearts|Alex's 5-heart event]]<!--21/f Alex 1250/p Alex-->
 
| ''I'm worthless...$s''
 
| ''I'm worthless...$s''
| <tt>57</tt>: ''That's crazy. You're a genius!''<br /><tt>57</tt>: ''We all have our strengths and weaknesses''<br /><tt>57</tt>: ''Worthless? Yeah, that about sums it up.''
+
| <samp>57</samp>: ''That's crazy. You're a genius!''<br /><samp>57</samp>: ''We all have our strengths and weaknesses''<br /><samp>57</samp>: ''Worthless? Yeah, that about sums it up.''
 
|-
 
|-
 
| [[Clint#Three Hearts I|Clint's 3-heart event]]<!--97/f Clint 750/t 1900 2300/d Tue Wed Thu Fri Sat Sun-->
 
| [[Clint#Three Hearts I|Clint's 3-heart event]]<!--97/f Clint 750/t 1900 2300/d Tue Wed Thu Fri Sat Sun-->
 
| ''Got any tips?^What advice can you give me?''
 
| ''Got any tips?^What advice can you give me?''
| <tt>211</tt>: ''Impress women with your strength and charm''<br /><tt>211</tt>: ''Act crazy, to keep people guessing''<br /><tt>211</tt>: ''Just act natural... be yourself''<br /><tt>211</tt>: ''Treat women the same as men''
+
| <samp>211</samp>: ''Impress women with your strength and charm''<br /><samp>211</samp>: ''Act crazy, to keep people guessing''<br /><samp>211</samp>: ''Just act natural... be yourself''<br /><samp>211</samp>: ''Treat women the same as men''
 
|-
 
|-
 
| [[Demetrius#Six Hearts|Demetrius's 6-heart event]]<!--25/f Demetrius 1500/p Demetrius/p Robin-->
 
| [[Demetrius#Six Hearts|Demetrius's 6-heart event]]<!--25/f Demetrius 1500/p Demetrius/p Robin-->
 
| ''How would you classify a tomato?''
 
| ''How would you classify a tomato?''
| <tt>59</tt>: ''Vegetable''<br /><tt>59</tt>: ''Fruit''
+
| <samp>59</samp>: ''Vegetable''<br /><samp>59</samp>: ''Fruit''
 
|-
 
|-
 
| [[Elliott#Two Hearts|Elliott's 2-heart event]]<!--39/f Elliott 500/p Elliott-->
 
| [[Elliott#Two Hearts|Elliott's 2-heart event]]<!--39/f Elliott 500/p Elliott-->
 
| ''A question... What kind of books do you like, @?''
 
| ''A question... What kind of books do you like, @?''
| <tt>958699</tt>: ''Mystery''<br /><tt>958700</tt>: ''Romance''<br /><tt>958701</tt>: ''Sci-Fi''
+
| <samp>958699</samp>: ''Mystery''<br /><samp>958700</samp>: ''Romance''<br /><samp>958701</samp>: ''Sci-Fi''
 
|-
 
|-
 
| [[Elliott#Four Hearts|Elliott's 4-heart event]]<!--40/f Elliott 1000/p Gus/t 1500 2200-->
 
| [[Elliott#Four Hearts|Elliott's 4-heart event]]<!--40/f Elliott 1000/p Gus/t 1500 2200-->
 
| ''Wait. I propose a toast! To...''
 
| ''Wait. I propose a toast! To...''
| <tt>28376</tt>: ''To Pelican Town!''<br /><tt>28376</tt>: ''To our friendship!''<br /><tt>28376</tt>: ''To my good health!''<br /><tt>28376</tt>: ''To your doom!''
+
| <samp>28376</samp>: ''To Pelican Town!''<br /><samp>28376</samp>: ''To our friendship!''<br /><samp>28376</samp>: ''To my good health!''<br /><samp>28376</samp>: ''To your doom!''
 
|-
 
|-
 
| [[Emily#Six Hearts|Emily's 6-heart event]]<!--917409/e 463391/f Emily 1500/p Emily-->
 
| [[Emily#Six Hearts|Emily's 6-heart event]]<!--917409/e 463391/f Emily 1500/p Emily-->
 
| ''So... *gasp*... what did you think?$h''
 
| ''So... *gasp*... what did you think?$h''
| <tt>213</tt>: ''That was amazing!''<br /><tt>213</tt>: ''That was embarrassing...''<br /><tt>213</tt>: ''(Say nothing and do a slow clap)''
+
| <samp>213</samp>: ''That was amazing!''<br /><samp>213</samp>: ''That was embarrassing...''<br /><samp>213</samp>: ''(Say nothing and do a slow clap)''
 
|-
 
|-
 
| [[Evelyn#Four Hearts|Evelyn's 4-heart event]]<!--19/f Evelyn 1000/p Evelyn-->
 
| [[Evelyn#Four Hearts|Evelyn's 4-heart event]]<!--19/f Evelyn 1000/p Evelyn-->
 
| ''Well, what do you think?''
 
| ''Well, what do you think?''
| <tt>51</tt>: ''It's delicious!''<br /><tt>51</tt>: ''It was like chewing on a hockey puck''
+
| <samp>51</samp>: ''It's delicious!''<br /><samp>51</samp>: ''It was like chewing on a hockey puck''
 
|-
 
|-
 
| [[Gus#Four Hearts|Gus's 4-heart event]]<!--96/f Gus 1000/f Pam 500/p Gus-->
 
| [[Gus#Four Hearts|Gus's 4-heart event]]<!--96/f Gus 1000/f Pam 500/p Gus-->
 
| ''@, what's going on here?''
 
| ''@, what's going on here?''
| <tt>207</tt>: ''You need to pay your tab right now!''<br /><tt>208</tt>: ''The saloon isn't doing well, financially''
+
| <samp>207</samp>: ''You need to pay your tab right now!''<br /><samp>208</samp>: ''The saloon isn't doing well, financially''
 
|-
 
|-
 
| [[Haley#Two Hearts|Haley's 2-heart event]]<!--11/f Haley 500/p Haley/p Emily-->
 
| [[Haley#Two Hearts|Haley's 2-heart event]]<!--11/f Haley 500/p Haley/p Emily-->
 
| ''It's only because I cleaned them last week!$a''
 
| ''It's only because I cleaned them last week!$a''
| <tt>46</tt>: ''Stop whining and just clean it!''<br /><tt>45</tt>: ''Haley, why not have this be your one weekly job?''<br /><tt>46</tt>: ''Emily, take the high road and do it this time.''
+
| <samp>46</samp>: ''Stop whining and just clean it!''<br /><samp>45</samp>: ''Haley, why not have this be your one weekly job?''<br /><samp>46</samp>: ''Emily, take the high road and do it this time.''
 
|-
 
|-
 
| [[Haley#Four Hearts|Haley's 4-heart event]]<!--12/f Haley 1000/p Haley-->
 
| [[Haley#Four Hearts|Haley's 4-heart event]]<!--12/f Haley 1000/p Haley-->
 
| ''Say... you're pretty strong, aren't you?''
 
| ''Say... you're pretty strong, aren't you?''
| <tt>47</tt>: ''Yes''<br /><tt>47</tt>: ''No''
+
| <samp>47</samp>: ''Yes''<br /><samp>47</samp>: ''No''
 
|-
 
|-
 
| [[Haley#Six Hearts|Haley's 6-heart event]]<!--13/f Haley 1500/z winter/t 1000 1600-->
 
| [[Haley#Six Hearts|Haley's 6-heart event]]<!--13/f Haley 1500/z winter/t 1000 1600-->
 
| ''I'll never find another one like it...$s''
 
| ''I'll never find another one like it...$s''
| <tt>48</tt>: ''Relax, I'll just buy you a new one!''<br /><tt>48</tt>: ''I'm really sorry...''
+
| <samp>48</samp>: ''Relax, I'll just buy you a new one!''<br /><samp>48</samp>: ''I'm really sorry...''
 
|-
 
|-
 
| [[Harvey#Two Hearts|Harvey's 2-heart event]]<!--56/f Harvey 500/p George-->
 
| [[Harvey#Two Hearts|Harvey's 2-heart event]]<!--56/f Harvey 500/p George-->
 
| ''@, what do you think George should do?''
 
| ''@, what do you think George should do?''
| <tt>84</tt>: ''George should follow Dr. Harvey's advice.''<br /><tt>85</tt>: ''George knows what's best for his own body.''
+
| <samp>84</samp>: ''George should follow Dr. Harvey's advice.''<br /><samp>85</samp>: ''George knows what's best for his own body.''
 
|-
 
|-
 
| [[Harvey#Four Hearts|Harvey's 4-heart event]]<!--57/f Harvey 1000/p Harvey-->
 
| [[Harvey#Four Hearts|Harvey's 4-heart event]]<!--57/f Harvey 1000/p Harvey-->
 
| ''Hmm... Your pulse is high.$u''
 
| ''Hmm... Your pulse is high.$u''
| <tt>86</tt>: ''I'm a little nervous...''<br /><tt>86</tt>: ''I'm out of breath from working on the farm.''<br /><tt>86</tt>: ''Are you really a doctor? My pulse is fine!''
+
| <samp>86</samp>: ''I'm a little nervous...''<br /><samp>86</samp>: ''I'm out of breath from working on the farm.''<br /><samp>86</samp>: ''Are you really a doctor? My pulse is fine!''
 
|-
 
|-
 
| [[Kent#Three Hearts I|Kent's 3-heart event]]<!--100/f Kent 750/p Kent/p Jodi-->
 
| [[Kent#Three Hearts I|Kent's 3-heart event]]<!--100/f Kent 750/p Kent/p Jodi-->
 
| ''(Say something to Kent)$s''
 
| ''(Say something to Kent)$s''
| <tt>215</tt>: ''Jodi's to blame... she should've known better!''<br /><tt>215</tt>: ''I know you're hurting... but don't blame your wife.''<br /><tt>215</tt>: ''(Lie) Blame me... I asked for popcorn''
+
| <samp>215</samp>: ''Jodi's to blame... she should've known better!''<br /><samp>215</samp>: ''I know you're hurting... but don't blame your wife.''<br /><samp>215</samp>: ''(Lie) Blame me... I asked for popcorn''
 
|-
 
|-
 
| [[Leah#Four Hearts|Leah's 4-heart event]]<!--51/f Leah 1000/p Leah-->
 
| [[Leah#Four Hearts|Leah's 4-heart event]]<!--51/f Leah 1000/p Leah-->
 
| ''Was that selfish of me, @?$s''
 
| ''Was that selfish of me, @?$s''
| <tt>83</tt>: ''No, it had to be done.''<br /><tt>83</tt>: ''No, and your ex sounds like an idiot.''<br /><tt>83</tt>: ''No, but you would've been better off staying in the city.''<br /><tt>83</tt>: ''Yeah, a little.''<br /><tt>83</tt>: ''Yeah, but it's natural to care about yourself first.''
+
| <samp>83</samp>: ''No, it had to be done.''<br /><samp>83</samp>: ''No, and your ex sounds like an idiot.''<br /><samp>83</samp>: ''No, but you would've been better off staying in the city.''<br /><samp>83</samp>: ''Yeah, a little.''<br /><samp>83</samp>: ''Yeah, but it's natural to care about yourself first.''
 
|-
 
|-
 
| [[Lewis#Six Hearts|Lewis's 6-heart event]]<!--639373/f Lewis 1500/f Marnie 1500/t 1900 2300/w sunny-->
 
| [[Lewis#Six Hearts|Lewis's 6-heart event]]<!--639373/f Lewis 1500/f Marnie 1500/t 1900 2300/w sunny-->
 
| ''@...You overheard everything, didn't you?$s''
 
| ''@...You overheard everything, didn't you?$s''
| <tt>200</tt>: ''Yes... but I'll keep it a secret.''<br /><tt>201</tt>: ''Yes... and I'm going to tell everyone.''
+
| <samp>200</samp>: ''Yes... but I'll keep it a secret.''<br /><samp>201</samp>: ''Yes... and I'm going to tell everyone.''
 
|-
 
|-
 
| [[Maru#Two Hearts|Maru's 2-heart event]]<!--6/f Maru 500/p Maru-->
 
| [[Maru#Two Hearts|Maru's 2-heart event]]<!--6/f Maru 500/p Maru-->
 
| ''Right, @?''
 
| ''Right, @?''
| <tt>15933</tt>: ''(Say nothing)''<br /><tt>15933</tt>: ''Actually, your Dad was being weird.''
+
| <samp>15933</samp>: ''(Say nothing)''<br /><samp>15933</samp>: ''Actually, your Dad was being weird.''
 
|-
 
|-
 
| [[Maru#Four Hearts|Maru's 4-heart event]]<!--7/f Maru 1000/p Maru-->
 
| [[Maru#Four Hearts|Maru's 4-heart event]]<!--7/f Maru 1000/p Maru-->
 
| ''@, what should I do?''
 
| ''@, what should I do?''
| <tt>38</tt>: ''Just scoop it off the floor. He won't know the difference.''<br /><tt>39</tt>: ''Tell Harvey it was my fault.''<br /><tt>38</tt>: ''Tell Harvey it was an accident.''
+
| <samp>38</samp>: ''Just scoop it off the floor. He won't know the difference.''<br /><samp>39</samp>: ''Tell Harvey it was my fault.''<br /><samp>38</samp>: ''Tell Harvey it was an accident.''
 
|-
 
|-
 
| [[Maru#Six Hearts|Maru's 6-heart event]]<!--8/f Maru 1500/w sunny/t 2100 2340-->
 
| [[Maru#Six Hearts|Maru's 6-heart event]]<!--8/f Maru 1500/w sunny/t 2100 2340-->
 
| ''What do you see?''
 
| ''What do you see?''
| <tt>40</tt>: ''A beautiful planet.''<br /><tt>40</tt>: ''A cold, dark abyss.''
+
| <samp>40</samp>: ''A beautiful planet.''<br /><samp>40</samp>: ''A cold, dark abyss.''
 
|-
 
|-
 
| [[Maru#Eight Hearts|Maru's 8-heart event]]<!--9/f Maru 2000/p Maru-->
 
| [[Maru#Eight Hearts|Maru's 8-heart event]]<!--9/f Maru 2000/p Maru-->
 
| ''I'm so sorry.$8''
 
| ''I'm so sorry.$8''
| <tt>41</tt>: ''It's okay, it doesn't even hurt.''<br /><tt>41</tt>: ''You'd better be. This hurts like crazy!''
+
| <samp>41</samp>: ''It's okay, it doesn't even hurt.''<br /><samp>41</samp>: ''You'd better be. This hurts like crazy!''
 
|-
 
|-
 
| [[Maru#Ten Hearts|Maru's 10-heart event]]<!--10/f Maru 2500/t 900 1600-->
 
| [[Maru#Ten Hearts|Maru's 10-heart event]]<!--10/f Maru 2500/t 900 1600-->
 
| ''Well, what do you think, @?''
 
| ''Well, what do you think, @?''
| <tt>18981</tt>: ''I'm so impressed with your inventions.''<br /><tt>18981</tt>: ''I'm disappointed... You should've made that robot your slave.''<br /><tt>18981</tt>: ''So is your Dad okay with 'us' now?''<br /><tt>18981</tt>: ''(Just stare at Maru and say nothing)''
+
| <samp>18981</samp>: ''I'm so impressed with your inventions.''<br /><samp>18981</samp>: ''I'm disappointed... You should've made that robot your slave.''<br /><samp>18981</samp>: ''So is your Dad okay with 'us' now?''<br /><samp>18981</samp>: ''(Just stare at Maru and say nothing)''
 
|-
 
|-
 
| [[Maru#Ten Hearts|Maru's 10-heart event]]<!--BadAnswer-->
 
| [[Maru#Ten Hearts|Maru's 10-heart event]]<!--BadAnswer-->
 
| ''You must have a good reason for saying that...$a''
 
| ''You must have a good reason for saying that...$a''
| <tt>18982</tt>: ''MarILDA's just a piece of machinery designed to act human.''<br /><tt>18982</tt>: ''I was just kidding. MarILDA deserves her freedom.''<br /><tt>18982</tt>: ''I would've put her to work on the farm.''
+
| <samp>18982</samp>: ''MarILDA's just a piece of machinery designed to act human.''<br /><samp>18982</samp>: ''I was just kidding. MarILDA deserves her freedom.''<br /><samp>18982</samp>: ''I would've put her to work on the farm.''
 
|-
 
|-
 
| [[Penny#Two Hearts|Penny's 2-heart event]]<!--34/f Penny 500/t 900 1400/w sunny-->
 
| [[Penny#Two Hearts|Penny's 2-heart event]]<!--34/f Penny 500/t 900 1400/w sunny-->
 
| ''@? You were watching us?''
 
| ''@? You were watching us?''
| <tt>71</tt>: ''I was. You did a kind thing there, Penny.''<br /><tt>71</tt>: ''You should've left him alone. Now he's grumpy.''<br /><tt>71</tt>: ''I'm just taking a walk, minding my own business.''
+
| <samp>71</samp>: ''I was. You did a kind thing there, Penny.''<br /><samp>71</samp>: ''You should've left him alone. Now he's grumpy.''<br /><samp>71</samp>: ''I'm just taking a walk, minding my own business.''
 
|-
 
|-
 
| [[Penny#Six Hearts|Penny's 6-heart event]]<!--36/f Penny 1500/p Penny-->
 
| [[Penny#Six Hearts|Penny's 6-heart event]]<!--36/f Penny 1500/p Penny-->
 
| ''...well?''
 
| ''...well?''
| <tt>72</tt>: ''(Lie) Mmm! That was delicious!''<br /><tt>73</tt>: ''Uh... can I get the rest to go?''<br /><tt>73</tt>: ''Well it's definitely unique... how did you get it so rubbery?''
+
| <samp>72</samp>: ''(Lie) Mmm! That was delicious!''<br /><samp>73</samp>: ''Uh... can I get the rest to go?''<br /><samp>73</samp>: ''Well it's definitely unique... how did you get it so rubbery?''
 
|-
 
|-
 
| [[Pierre#Six Hearts|Pierre's 6-heart event]]<!--16/f Pierre 1500/p Pierre-->
 
| [[Pierre#Six Hearts|Pierre's 6-heart event]]<!--16/f Pierre 1500/p Pierre-->
 
| ''Promise me you won't tell anyone about this.''
 
| ''Promise me you won't tell anyone about this.''
| <tt>50</tt>: ''Your secret is safe with me.''<br /><tt>50</tt>: ''Your wife deserves to know about this.''
+
| <samp>50</samp>: ''Your secret is safe with me.''<br /><samp>50</samp>: ''Your wife deserves to know about this.''
 
|-
 
|-
 
| [[Robin#Six Hearts|Robin's 6-heart event]]<!--33/f Robin 1500/p Robin-->
 
| [[Robin#Six Hearts|Robin's 6-heart event]]<!--33/f Robin 1500/p Robin-->
 
| ''Have you ever made anything out of wood, @?''
 
| ''Have you ever made anything out of wood, @?''
| <tt>66</tt>: ''Yes''<br /><tt>66</tt>: ''No''
+
| <samp>66</samp>: ''Yes''<br /><samp>66</samp>: ''No''
 
|-
 
|-
 
| [[Sam#Two Hearts|Sam's 2-heart event]]<!--44/f Sam 500/p Sam-->
 
| [[Sam#Two Hearts|Sam's 2-heart event]]<!--44/f Sam 500/p Sam-->
 
| ''Say, @... what kind of music do you like?''
 
| ''Say, @... what kind of music do you like?''
| <tt>76</tt>: ''Cheerful pop music.''<br /><tt>77</tt>: ''Experimental noise rock.''<br /><tt>78</tt>: ''Hi-Energy dance music.''<br /><tt>79</tt>: ''Honky-tonky country music.''
+
| <samp>76</samp>: ''Cheerful pop music.''<br /><samp>77</samp>: ''Experimental noise rock.''<br /><samp>78</samp>: ''Hi-Energy dance music.''<br /><samp>79</samp>: ''Honky-tonky country music.''
 
|-
 
|-
 
| [[Sam#Four Hearts|Sam's 4-heart event]]<!--46/f Sam 1000/p Sam-->
 
| [[Sam#Four Hearts|Sam's 4-heart event]]<!--46/f Sam 1000/p Sam-->
 
| ''...Tell her, @.$s''
 
| ''...Tell her, @.$s''
| <tt>80</tt>: ''Sam dropped the snack as he was handing it to me.''<br /><tt>80</tt>: ''Sam handed me the snack and then I dropped it.''<br /><tt>81</tt>: ''Sam dropped it on purpose. He thought it would be funny.''
+
| <samp>80</samp>: ''Sam dropped the snack as he was handing it to me.''<br /><samp>80</samp>: ''Sam handed me the snack and then I dropped it.''<br /><samp>81</samp>: ''Sam dropped it on purpose. He thought it would be funny.''
 
|}
 
|}
  
Line 699: Line 821:
  
 
==Conversation topics==
 
==Conversation topics==
A ''conversation topic'' is a temporary flag which can be checked in [[Modding:Event data|event preconditions]] and can trigger one-time NPC dialogue (if they have a matching dialogue key). They're stored in <tt>Game1.player.activeDialogueEvents</tt> while active.
+
A ''conversation topic'' is a temporary flag which can be checked in [[Modding:Event data|event preconditions]] and can trigger one-time NPC dialogue (if they have a matching dialogue key). They're stored in <samp>Game1.player.activeDialogueEvents</samp> while active.
  
A conversation topic can be started using the <tt>addConversationTopic</tt> [[Modding:Event data|event command]], <tt>%item conversationTopic</tt> [[Modding:Mail data|mail command]], or in code by adding it to <tt>Game1.player.activeDialogueEvents</tt>.
+
A conversation topic can be started with a modder-defined length using the <samp>addConversationTopic</samp> [[Modding:Event data|event command]], <samp>%item conversationTopic</samp> [[Modding:Mail data|mail command]], or in code by adding it to <samp>Game1.player.activeDialogueEvents</samp>. A conversation topic, by default, lasts four days when added via event commands.
  
 
The game defines these events:
 
The game defines these events:
Line 712: Line 834:
 
!colspan="3"| Bundles
 
!colspan="3"| Bundles
 
|-
 
|-
| <tt>cc_Begin</tt>
+
| <samp>cc_Begin</samp>
 
| 4 days
 
| 4 days
 
| Set in the [[Wizard]]'s cutscene after reading the first Junimo note in the community center.
 
| Set in the [[Wizard]]'s cutscene after reading the first Junimo note in the community center.
 
|-
 
|-
| <tt>cc_Complete</tt>
+
| <samp>cc_Complete</samp>
 
| 4 days
 
| 4 days
 
| [[Community Center]] completed. (Does not apply to JojaMart path.)
 
| [[Community Center]] completed. (Does not apply to JojaMart path.)
 
|-
 
|-
| <tt>cc_Boulder</tt>
+
| <samp>cc_Boulder</samp>
 
| 7 days
 
| 7 days
| [[The Mountain|Mountain]] boulder is removed.
+
| [[The Mountain|Mountain]] boulder is removed through community center bundle or Joja improvement form.
 
|-
 
|-
| <tt>cc_Bridge</tt>
+
| <samp>cc_Bridge</samp>
 
| 7 days
 
| 7 days
| [[Quarry]] bridge is repaired.
+
| [[Quarry]] bridge is repaired through community center bundle or Joja improvement form.
 
|-
 
|-
| <tt>cc_Bus</tt>
+
| <samp>cc_Bus</samp>
 
| 7 days
 
| 7 days
| [[Bus]] is repaired.
+
| [[Bus Stop|Bus]] is repaired through community center bundle or Joja improvement form.
 
|-
 
|-
| <tt>cc_Greenhouse</tt>
+
| <samp>cc_Greenhouse</samp>
 
| 3 days
 
| 3 days
| [[Greenhouse]] is constructed.
+
| [[Greenhouse]] is constructed through community center bundle. (Does not apply to JojaMart path.)
 
|-
 
|-
| <tt>cc_Minecart</tt>
+
| <samp>cc_Minecart</samp>
 
| 7 days
 
| 7 days
| [[Minecart]]s are unlocked.
+
| [[Minecart]]s are unlocked through community center bundle or Joja improvement form.
 
|-
 
|-
| <tt>joja_Begin</tt>
+
| <samp>joja_Begin</samp>
 
| 7 days
 
| 7 days
 
| First time that player opens the [[Joja Community Development Form]].
 
| First time that player opens the [[Joja Community Development Form]].
 
|-
 
|-
| <tt>movieTheater</tt>
+
| <samp>movieTheater</samp>
 
| 3 days
 
| 3 days
 
| [[Movie Theater|movie theatre]] is constructed.
 
| [[Movie Theater|movie theatre]] is constructed.
Line 750: Line 872:
 
!colspan="3"| Spouse events
 
!colspan="3"| Spouse events
 
|-
 
|-
| <tt>elliottGone</tt>
+
| <samp>elliottGone</samp>
 
| 6 days
 
| 6 days
 
| Set when [[Elliott]]'s fourteen-heart event starts.
 
| Set when [[Elliott]]'s fourteen-heart event starts.
 
|-
 
|-
| <tt>ElliottGone1</tt><br /><tt>ElliottGone2</tt><br /><tt>ElliottGone3</tt><br /><tt>ElliottGone4</tt><br /><tt>ElliottGone5</tt><br /><tt>ElliottGone6</tt><br /><tt>ElliottGone7</tt>
+
| <samp>ElliottGone1</samp><br /><samp>ElliottGone2</samp><br /><samp>ElliottGone3</samp><br /><samp>ElliottGone4</samp><br /><samp>ElliottGone5</samp><br /><samp>ElliottGone6</samp><br /><samp>ElliottGone7</samp>
 
| same day
 
| same day
 
| Part of [[Elliott]]'s fourteen-heart event. The first flag is set when it starts; the subsequent flags are set by subsequent letters from Elliott.
 
| Part of [[Elliott]]'s fourteen-heart event. The first flag is set when it starts; the subsequent flags are set by subsequent letters from Elliott.
 
|-
 
|-
| <tt>emilyFiber</tt>
+
| <samp>emilyFiber</samp>
 
| 2 days
 
| 2 days
 
| Part of [[Emily]]'s fourteen-heart event. Set after completing the quest.
 
| Part of [[Emily]]'s fourteen-heart event. Set after completing the quest.
 
|-
 
|-
| <tt>haleyCakewalk1</tt><br /><tt>haleyCakewalk2</tt>
+
| <samp>haleyCakewalk1</samp><br /><samp>haleyCakewalk2</samp>
 
| same day
 
| same day
 
| Part of [[Haley]]'s fourteen-heart event.
 
| Part of [[Haley]]'s fourteen-heart event.
 
|-
 
|-
| <tt>leahPaint</tt>
+
| <samp>leahPaint</samp>
 
| same day
 
| same day
 
| Set when [[Leah]]'s fourteen-heart event starts.
 
| Set when [[Leah]]'s fourteen-heart event starts.
 
|-
 
|-
| <tt>pennyRedecorating</tt>
+
| <samp>pennyRedecorating</samp>
 
| 2 days
 
| 2 days
 
| Part of [[Penny]]'s fourteen-heart event.
 
| Part of [[Penny]]'s fourteen-heart event.
 
|-
 
|-
| <tt>samJob1</tt><br /><tt>samJob2</tt>
+
| <samp>samJob1</samp><br /><samp>samJob2</samp>
 
| 2 days
 
| 2 days
 
| Part of [[Sam]]'s fourteen-heart event.
 
| Part of [[Sam]]'s fourteen-heart event.
 
|-
 
|-
| <tt>samJob3</tt>
+
| <samp>samJob3</samp>
 
| 3 days
 
| 3 days
 
| Part of [[Sam]]'s fourteen-heart event.
 
| Part of [[Sam]]'s fourteen-heart event.
 
|-
 
|-
| <tt>sebastianFrog</tt>
+
| <samp>sebastianFrog</samp>
 
| same day
 
| same day
 
| Set when [[Sebastian]]'s fourteen-heart event starts.
 
| Set when [[Sebastian]]'s fourteen-heart event starts.
 
|-
 
|-
| <tt>sebastianFrog2</tt>
+
| <samp>sebastianFrog2</samp>
 
| 6 days
 
| 6 days
 
| Part of [[Sebastian]]'s fourteen-heart event.
 
| Part of [[Sebastian]]'s fourteen-heart event.
 
|-
 
|-
| <tt>shaneSaloon1</tt><br /><tt>shaneSaloon2</tt>
+
| <samp>shaneSaloon1</samp><br /><samp>shaneSaloon2</samp>
 
| same day
 
| same day
 
| Part of [[Shane]]'s fourteen-heart event.
 
| Part of [[Shane]]'s fourteen-heart event.
Line 796: Line 918:
 
!colspan="3"| Other events
 
!colspan="3"| Other events
 
|-
 
|-
| <tt>dumped_Guys</tt><br /><tt>dumped_Girls</tt>
+
| <samp>dumped_Guys</samp><br /><samp>dumped_Girls</samp>
 
| 7 days
 
| 7 days
| Set after the corresponding ten-heart group event (e.g. see [[Abigail#Group Ten-Heart Event]]).
+
| Set after the corresponding ten-heart group event (''e.g.,'' see [[Abigail#Group Ten-Heart Event]]).
 
|-
 
|-
| <tt>secondChance_Girls</tt><br /><tt>secondChance_Guys</tt>
+
| <samp>secondChance_Girls</samp><br /><samp>secondChance_Guys</samp>
 
| 14 days
 
| 14 days
| Set after the corresponding ten-heart group event (e.g. see [[Abigail#Group Ten-Heart Event]]).
+
| Set after the corresponding ten-heart group event (''e.g.,'' see [[Abigail#Group Ten-Heart Event]]).
 
|-
 
|-
| <tt>pamHouseUpgrade</tt>
+
| <samp>pamHouseUpgrade</samp>
 
| 4 days
 
| 4 days
 
| Set after seeing the [[Pam]] house upgrade event, if the player chose to be revealed as the donor.
 
| Set after seeing the [[Pam]] house upgrade event, if the player chose to be revealed as the donor.
 
|-
 
|-
| <tt>pamHouseUpgradeAnonymous</tt>
+
| <samp>pamHouseUpgradeAnonymous</samp>
 
| 4 days
 
| 4 days
 
| Set after seeing the [[Pam]] house upgrade event, if the player chose to be anonymous.
 
| Set after seeing the [[Pam]] house upgrade event, if the player chose to be anonymous.
 
|-
 
|-
| <tt>willyCrabs</tt>
+
| <samp>willyCrabs</samp>
 
| 4 days
 
| 4 days
 
| Set after [[Willy]]'s six-heart event.
 
| Set after [[Willy]]'s six-heart event.
Line 818: Line 940:
 
!colspan="3"| Other
 
!colspan="3"| Other
 
|-
 
|-
| <tt>Introduction</tt>
+
| <samp>Introduction</samp>
 
| 6 days
 
| 6 days
| Farmer is created (e.g. starting a new save, or joining a multiplayer game for the first time).
+
| Farmer is created (''e.g.,'' starting a new save, or joining a multiplayer game for the first time).
 
|-
 
|-
| <tt>FullCrabPond</tt>
+
| <samp>FullCrabPond</samp>
 
| 14 days
 
| 14 days
 
| First time any [[Fish Pond|fish pond]] contains 10 [[crab]]s.
 
| First time any [[Fish Pond|fish pond]] contains 10 [[crab]]s.
Line 831: Line 953:
  
 
[[pt:Modificações:Diálogo]]
 
[[pt:Modificações:Diálogo]]
 +
[[ru:Модификации:Диалоги]]
 +
[[zh:使用模组:对话]]

Latest revision as of 18:03, 6 April 2024

Index

This page explains how the game stores dialogue text, its format, and how the game parses it. This is an advanced guide for mod developers.

Dialogue data

Character dialogue is stored in many different files: The Characters\Dialogue directory is where the majority of NPC-specific dialogue is stored. Data\ExtraDialogue.xnb, Strings\Characters.xnb, Strings\Events.xnb, Strings\SpeechBubbles.xnb, and Strings\StringsFromCSFiles.xnb contain various other pieces of dialogue, some generic, and some NPC-specific.

Characters\Dialogue directory

Characters\Dialogue\<NPC>.xnb

An NPC's named file in Character\Dialogue contains most of their dialogue. The game will choose dialogue from one of the sections below, in the order shown here.

Special dialogue

There are a few predefined keys for specific cases:

key format description
danceRejection Dialogue used to reject an offer to dance at the Flower Dance. (A different dialogue is used if they've already agreed to dance with another player.)
MovieInvitation An NPC's response to being invited to the Movie Theater. If not defined, the NPC will use a generic line from Strings\Characters.xnb. The specific string used depends on the NPC's manners.
breakUp An NPC's response to being broken up with by giving them a Wilted Bouquet.
divorced Dialogue shown when you speak to your divorced spouse.
accept_<item_id> If defined, this dialogue will be used when gifting an item with the given ID to the NPC. Does not affect and is not affected by an NPC's taste towards an item. Used when giving quest items to their proper recipients. Appears to have no affect when given the ID of a non-quest item.
Example: accept_864: "...!$4#$b#...Where did you find this?$4#$b#...$5#$b#This man... We fought together in the war, @. He was like a brother to me. #$b#But... only one of us made it back.$5#$b#He never lost his courage, though. Even in the face of death. A true hero... I'll never forget him.#$b#Thanks for bringing me this... It means a lot to me.#$b#Here, take this. It's been sitting in the back of our cupboard for years, and we've never used it."
reject_<item_id> If defined, when attempting to gift the item with the given ID, the NPC will not accept the item and instead say this dialogue. Used for quest items to ensure they're not accidentally gifted, or to give hints towards their proper recipient.
Example: reject_864: "What's this? It looks like one of Kent's buddies from the war. Maybe you should show it to him?"
<location>_Entry Possible dialogue lines shown above the NPC's name when they enter the named <location>, with a 50% chance. This dialogue entry can contain multiple options separated by /; the game will randomly choose one to display.
Example: SeedShop_Entry: "Hi, Pierre!/Now, what do I need.../Ah, that looks good!/Makin' my special sauce tonight!/Pierre! What's fresh?/Pierre! Waddya got for me?"
Note: This key is not to be confused with Modding:Dialogue#Speech_bubbles.
Resort
Resort_Bar
Resort_Chair
Resort_Dance
Resort_Entering
Resort_Leaving
Resort_Shore
Resort_Towel
Resort_Umbrella
Resort_Wander
Various dialogue keys used when an NPC is visiting the Ginger Island Resort.
ComeBackLater
Snoring
Gil's dialogue when you haven't completed any new Adventure Quest goals. ComeBackLater will be shown once, and all subsequent dialogues will show Snoring.
Location dialogue

Otherwise the game will choose dialogue in this order.

Variants:

  • Each key can optionally be prefixed with a season name, like springMountain_47_23.

The game will check variants in this order: <season><key>, and <key>. The variants aren't listed below for simplicity. Unlike daily dialogue, location dialogue is endlessly repeatable as long as the trigger conditions are fulfilled, e.g., Being in the location. They will not remove daily dialogue from an npc's dialogue rotation, but will merely overwrite it when the NPC is in the specified location.

key format description
<location>_<x>_<y> Dialogue shown in the named location when the NPC is standing at tile position <x>, <y>.
Example: Mountain_47_23: "I come here for the peace and quiet."
<location>_<dayName> Dialogue shown in the named location on the given day of week.
Example: Saloon_Fri: "Business has been really good tonight. I'm pleased."
<location><hearts> Dialogue shown in the named location if you have at least <hearts> hearts with them. The <hearts> will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).
Example: Saloon8: "Hi there @. I'm glad to see you! You're always welcome here."
<location> Dialogue shown in the named location.
Example: Saloon: "Now that I'm here I can finally relax and socialize a bit."
  • Note: Location dialogue will be accessible even if the NPC is only walking through the specified map unlike schedule strings that will only be accessible once the schedule end location is reached.
Generic dialogue

Otherwise the game will choose a dialogue using one of these key formats (in precedence order):

  1. <season>_<key>_inlaw_<spouse>
  2. <season>_<key>
  3. <key>_inlaw_<spouse>
  4. <key>

For each variation above: <season> is a season name (like spring_14); _inlaw_<spouse> matches if the player is married to the named NPC, regardless of whether the speaking NPC is related to the named one (like Sat_inlaw_Abigail); and <key> is one of the formats listed below.

key format description
<dayOfMonth> Dialogue shown on the given day of month in the first year only.
WARNING: this first-year-only behavior is different from other keys and often catches unsuspecting modders!
Example: 10: "Did you watch the game last night?#$b#Or wait, do you even have a TV set...?"
<dayOfMonth>_<firstOrLaterYear> Dialogue shown on the given day of month in the first/later year.
Example: 2_1: "My husband Kent is a soldier, working overseas. That's why he's not here right now.#$b#I know he'll come back safe once his tour is over!!#$e#Need something?"
<dayOfWeek><hearts>_<firstOrLaterYear> Dialogue shown on the given day of week if you have at least <hearts> hearts with them, in the first/later year. The <hearts> will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).
Example: Thu2_2: "Well, my Dad is back. Have you met him?#$b#I'm just glad he's okay."
<dayOfWeek><hearts> Dialogue shown on the given day of week if you have at least <hearts> hearts with them. The <hearts> will be checked in the order 10, 8, 6, 4, 2 (no other value will be recognised).
Example: Sun4: "Hey, @.#$e#How's your day going?"
<dayOfWeek>_<firstOrLaterYear> Dialogue shown on the given day of week in the first/later year.
Example: Sat_1: "Dad's coming back soon!#$b#I hope he brings me some toys.$u"
<dayOfWeek> Dialogue shown on the given day of week.
Example: Mon: "Oh, hey. Taking a break from work?"

Rain dialogue

Characters\Dialogue\rainy.xnb contains one dialogue entry per NPC. There's a roughly 50% chance they'll use this dialogue if a special or location dialogue doesn’t match, it's raining, and you're not married to or divorced from them.

Marriage dialogue

Characters\Dialogue\MarriageDialogue.xnb contains dialogue text for all spouses, and each NPC may optionally have their own dialogue file like Characters\Dialogue\MarriageDialogueAbigail.xnb. When looking up a dialogue key, it will use the one in the NPC's file if it exists, else the one in the generic file, else a default text (usually blank).

Each dialogue entry has a key with one of these formats:

key format description
<season>_<day> Dialogue shown when the day starts, if <season> and <day> match the current date.
Example: fall_1: "The scent is unmistakable... mushroom, rotting leaves, pumpkin. It's fall, alright. Isn't it lovely?"
patio_<spouse> Dialogue shown when the NPC is standing on the patio.
<weather>_Day_<random> Daily dialogue added when the day starts, based on the <weather> (Rainy if it's raining, else Indoor even if they're not indoors) and <random> (a random number between 0 and 4). If the game chooses a <random> value that doesn't have a dialogue, it'll use the default text instead.
Rainy_Night_<random> Daily dialogue in the farmhouse after 6pm when it's raining. <random> is a number between 0–5 inclusively or the NPC name, each of which has an equal chance of being randomly chosen. If the game chooses a <random> value that doesn't have a dialogue, it'll use the default text instead.
Example: Rainy_Night_3: "On nights like this, I like to turn the light down low and just listen...$8"
Indoor_Night_<random> Daily dialogue in the farmhouse after 6pm when it's not raining. <random> is a number between 0–4 inclusively or the NPC name, each of which has an equal chance of being randomly chosen. If the game chooses a <random> value that doesn't have a dialogue, it'll use the default text instead.
funLeave_<spouse> Dialogue used when leaving the farmhouse, typically during a Monday, or a Friday if they have no job. (See below.)
jobLeave_<spouse> Dialogue used when leaving to go to their job. Only used for Maru, Penny, and Harvey.
funReturn_<spouse> Dialogue shown after 1pm when they enter the farmhouse but before reaching their target position, but only on Monday (any NPC) or Friday (if not Maru/Penny/Harvey).
Example: funReturn_Abigail: "Hey! Did you have a good day? Mine went well. It was refreshing to take a walk.$h"
jobReturn_<spouse> Dialogue shown after 1pm when they enter the farmhouse but before reaching their target position, but only if funReturn isn't shown instead.
Example: jobReturn_Penny: "#$c .5#Good evening. My day was fine, thanks! How was yours?$h#$e#Jas and Vincent weren't behaving very well today. I'm still all wound up..."
<season>_<spouse> Dialogue shown at 9+ heart levels with a 5% chance each day.
Example: fall_Abigail: "Do I smell pumpkin on you? Maybe I'm just dreaming...$h"
Outdoor_<spouse> Dialogue shown on the farm with a 20% chance.
Example: Outdoor_Abigail: "I'm just going to hang out here, okay?#$e#There's a lot of interesting bugs and things out here. *chuckle*$h"
Outdoor_<random> Dialogue shown on the farm with an 80% chance. <random> is a number 0–4, used to randomly select an entry.
Example: Outdoor_3: "It's pretty cool that we have a cave on our property. It's something I always dreamed about.$h"
spouseRoom_<spouse> Dialogue shown when the NPC is in their room.
Example: spouseRoom_Abigail: "$c .5#I got up a little before you and fed David Jr. He's very active this morning.#$e#I hope you don't mind the guinea pig smell."
OneKid_<random> Dialogue shown when standing in the kitchen, if they have one child. <random> is a number 0–4, used to randomly select an entry.
OneKid_1: "I wonder if %kid1 will grow up to be a farmer like you?"
TwoKids_<random> Dialogue shown when standing in the kitchen, if they have two children. <random> is a number 0–4, used to randomly select an entry.
TwoKids_2: "I had a dream that %kid2 will grow up to be a famous monster hunter. I've already been thinking about a little armor set."
<affection>_<random> Dialogue shown inside the farmhouse between 11am and 6pm, or when the day starts if a different dialogue isn't selected. <affection> is randomly Bad or Neutral if they have less than 9 hearts; 50% chance of Good if you have 10+ hearts, and 87.5% chance of Good if you have 11+ hearts; else Neutral <random> is a number 0–9, used to randomly select an entry.
Example: Good_5: "I was just admiring the mermaid's pendant you gave me... I'll proudly wear this to my grave.$l"

Data directory

Engagement dialogue

Similar to the rain dialogue, Data\EngagementDialogue.xnb contains entries in the form of <NPC>0 and <NPC>1, which are used when you are engaged but not yet married to an NPC, or, in the case of a roommate, when they have been invited but have not yet moved in.

Event files

Data\Events\*.xnb contains event scripts, including any dialogue in the event (see Modding:Event data).

Extra dialogue

Data\ExtraDialogue.xnb contains miscellaneous strings, some of which are NPC specific:

key format description
PurchasedItem_* Randomly shown by a non-child town NPC after you sell an edible item to a shop. These keys are hardcoded, and you can't add new keys with a similar pattern.

For keys with a number infix (like PurchasedItem_5_Cooking), the number is selected as such:

  • If the NPC is marked as rude in their data, they use 3.
  • Otherwise they randomly choose 1-5.
Town_DumpsterDiveComment_Child
Town_DumpsterDiveComment_Teen
Town_DumpsterDiveComment_Adult
Town_DumpsterDiveComment_Linus
Shown when an NPC catches you rummaging through trash cans, depending on the NPC's age. Linus has his own dialogue, but other NPCs don't.
SummitEvent_Dialogue3_<spouse> Shown for your NPC spouse near the start of the perfection cutscene.

Movie theater dialogue

An NPC's reaction to a movie is stored in Data\MoviesReactions.xnb, which is structured far differently from every other dialogue file. See Modding:Movie theater data for more details.

Strings directory

Animation descriptions

Strings\animationDescriptions.xnb contains short bits of dialogue to go with certain schedule points. Not to be confused to Data\animationDescriptions.xnb, which contains the data of animations, rather than the strings for their description.

Characters

Strings\Characters.xnb contains miscellaneous dialogue, some of which is NPC-specific:

key format description
MovieInvite_Spouse_<NPC name> Shown when the NPC accepts a movie ticket when they're married to you. If missing, defaults to a MovieInvite_Invited_* key.
MovieInvite_Invited_<NPC name>
MovieInvite_Invited_<manner>
MovieInvite_Invited_<socialAnxiety>
MovieInvite_Invited_<optimism>
MovieInvite_Invited_<age>
MovieInvite_Invited
Shown when the NPC accepts a movie ticket. The NPC will use the first key that exists in the order listed here.

The <manner>, <socialAnxiety>, and <optimism> values are those specified in the NPC's equivalent data fields. The <age> value is one of Child, Teen, or Adult.

Phone_* Shown when calling a shop owner NPC on the telephone. These keys are hardcoded, so new keys with the same pattern will be ignored.

Events

Strings\Events.xnb contains miscellaneous dialogue related to events and festivals, some of which is NPC-specific.

Speech bubbles

Strings\SpeechBubbles.xnb contains dialogue spoken by NPCs through speech bubbles when the player enters a given location. This is distinct from the <location>_Entry field in an NPC's Characters\Dialogue\*.xnb file, which is triggered when the NPC enters a given location.

These keys are hardcoded, so new keys with the same pattern will be ignored.

Strings from CS files

Strings\StringsFromCSFiles.xnb contains miscellaneous strings, such as dialogue that's shared between multiple characters, dialogue for some hardcoded events like marriage, etc.

The file has entries in the form "<key>": "dialogue string", where the key is an arbitrary unique identifier. These must exactly match the key expected by the game, but the keys are just unique identifiers — even though most keys look like <file name>.<line number>, that's just the convention originally used to assign IDs and it has no meaning or effect (nor does it even necessarily match the current file name or line number).

In most situations, if the game is unable to find a string for an NPC to say, it will default to NPC.cs.4061 (English version: "Hi.").

Some other useful NPC-specific strings stored here are as follows:

key format description
<NPC name>_AfterWedding Shown after marrying an NPC, when you talk to them on the farm on the same day.
<NPC name>_Engaged
<NPC name>_EngagedRoommate
Shown after the NPC accepts an engagement item (e.g. mermaid's pendant or void ghost pendant for vanilla NPCs).

NPC-specific generic dialogue

With some ingenuity, you can make each NPC respond differently instead of using the normal static dialogue. You can use a special mod like Custom Fixed Dialogue, but the same effect can be achieved with just Content Patcher with some effort. To change NPC.cs.3962 and NPC.cs.3963 (to give a bouquet), and NPC.cs.3980 (for the mermaid pendant acceptance):

{
   "Action": "EditData",
   "Target": "Strings/StringsFromCSFiles",
   "Entries": {
      "NPC.cs.3962": "$q 10001 give_flowersA#?!...#$r 10001 0 give_flowersA# [Give Bouquet]",
      "NPC.cs.3963": "$q 10001 give_flowersB#?!...#$r 10001 0 give_flowersB# [Give Bouquet]",
      "NPC.cs.3980": "$q 10001 give_pendant#?!...#$r 10001 0 give_pendant# Will you marry me?"
   }
}

In this example, each NPC will get their response from the give_flowersA, give_flowersB, and give_pendant dialogue key in their character dialogue files. (See format below for more info on the syntax.)

Note that these should be added for all datable characters to avoid errors. For example, you could add this for Haley:

{
   "Action": "EditData",
   "Target": "Characters/Dialogue/Haley",
   "Entries": {
      "give_flowersA": "Oh.. these are beautiful.$1#$b#...What? You want to be my Boyfriend?$8^...What?  You want to be my Girlfriend?$8#$b#....I thought we already were together.$1",
      "give_flowersB": "Ohhh, @!  I would love to be your true love.$1",
      "give_pendant": ".....$8#$b#@, I don't know what to say..$8#$b#...$7#$b#Yes... I accept...$4#$b#I can't wait to tell the Mayor... Everything should take 3 days to set up.$1"
   }
}

This can be used for other generic responses, and you even can avoid the "Give Bouquet" by asking for an answered question's ID.


Algorithm

The game finds dialogue as follows:

  1. Event dialogue is read from the appropriate event commands (see Modding:Event data).
  2. Location-specific dialogue is read from StringsFromCSFiles <location>.cs.
  3. Else character dialogue is read from the character-specific files.
  4. If no dialogues were found, the game resorts to hardcoded dialogue from the StringsFromCSFiles files (specifically keys prefixed with NPC.cs NPC.cs).

Format

Dialogue text can contain tokens and commands which control the dialogue box, change the text (e.g., switch between gender-specific strings), inject values, etc. These are parsed by the Dialogue class.

Special tokens

character description
# Separates two commands in a dialogue string.
{ TODO. Stands for "breakSpecialCharacter".
^ Gender switch character. The text before it is shown for male farmers, the text after it for female farmers.
Example: Oh, good morning Mr. @!^Oh, good morning Ms. @!
% Turns the dialogue box into a generic text box.
Example: "%Abigail is lost in her music."
* TODO. Stands for "quickResponseDelineator".

Portrait commands

These set the portrait shown in the dialogue box for the current line of dialogue. If there's no portrait command, the neutral portrait is used.

Portraits are numbered left-to-right and top-to-bottom, starting at $0. The first six portraits are standard, and can be identified by the number (like $2) or a unique alias (like $s). All potential spouses and many other characters have these six portraits, but it's not fully consistent; for example, Caroline only has four.

numbered alias description
$0 Use their neutral portrait.
$1 $h Use their happy portrait.
$2 $s Use their sad portrait.
$3 $u Use their unique portrait. This is different for each NPC: grumpy (Abigail), holding football (Alex), angry (Caroline), sick (Governor), etc.
$4 $l Use their love portrait.
$5 $a Use their angry portrait.
$<id> A custom portrait beyond the standard six.

Portrait commands should be at the end of a dialogue line:

"fall_Fri6": "When I was a little girl, my father abandoned us.$s#$b#I'm sorry to make things uncomfortable for you...$u#$e#Anyway... How's the farming life going?",

Dialogue commands

command description
$q <response IDs> <fallback>#<text> Show a dialogue box containing the given question text. If <response IDs> (a list delimited by /) contains an answer already given, the question is skipped (along with the rest of this dialogue line), and instead the dialogue entry identified by <fallback> will be appended to whatever precedes this $q command. The <fallback> dialogue typically uses a $p command to adjust the text based on the player's answer to this question. NOTE: dialogue questions must use unique IDs, similar to events. See the event data page for more information.
$r <response ID> <friendship> <reaction>#<answer text> Define a response option to a $q question dialogue. <answer text> is the text shown. <response ID> is used to group responses for future reference (multiple answers can share an answer ID). <friendship> defines the change in friendship value, positive or negative, if this response is selected. <reaction> names the dialogue entry from the NPC's Content\Characters\Dialogue\*.xnb file that will be the NPC's reaction if this response is selected by the player.
$p <response ID>#<match text>|<no-match text> Stands for "dialoguePrerequisite". Shows different text depending on whether the player gave a particular answer to a previously-asked question. If <response ID> matches an answer the player gave, <match text> is shown; otherwise, <no-match text> is shown. These texts are separated by | and only <no-match text> can contain additional commands. This does not need to be the first command in the dialogue string.
$b Indicates pauses in dialogue, where the player will need to click for the next part to load in a new dialogue box.
$e Ends the current dialogue, closing the dialogue box and resuming player control. The dialogue following $e will require a new interaction with the NPC.
$k Short for dialogueKill. Removes all dialogue messages after the current one.
$c <probability>#<text1>#<text2> Show <text1> with a <probability> between 0 and 1; otherwise, show <text2>. E.g. $c 0.9 for a 90% chance of <text1> and a 10% chance of <text2>. NOTE: Replacer commands (see below) do not work in <text1>. This does not need to be the first command in a dialogue string. It is unaffected by daily luck.
$d <state id>#<text1>|<text2> Show one of two dialogue strings based on a predefined condition: bus (whether the bus is repaired), joja (whether the Joja Mart is still in business), cc or communitycenter (whether the Community Center is accessible), or kent (whether Kent has returned to the valley). The dialogue string must start with $d, everything up to the first | symbol is shown if the condition matches, and everything after that is shown if the condition doesn't match.

For example:

"Mon2": "$d kent#Yesterday I visited Yoba's Altar to give thanks for my husband's safe return.|Yesterday I visited Yoba's Altar to ask for my husband's safe return.#$e#I'm trying to stay positive, but it's hard sometimes.$s"
$y TODO. Stands for "dialogueQuickResponse"; A simpler form of question. Works like $q, but within one and the same text line. It doesn't have neither "dialoguePrerequisite" ($p) nor friendship point changes. It can be triggered indenitelly.
Example: Penny: "$y 'Breakfast?_Yes please._Here you go._No, I'm good_More for me then!'"
$1 <letter ID>#<1st-time text> #$e# <nth-time text> Creates a line of dialogue which the character will only see once (at most). <1st-time text> is shown only if <letter ID> has not been marked as sent yet (and this marks it as sent); otherwise, <nth-time text> is shown. <letter ID> should not correspond to an actual piece of mail (because it will not be sent), but it can be referenced by events or other dialogue lines.
%fork Sets the the specialEventVariable1 variable, which can be checked by a later fork event command. Mainly useful in reaction dialogue for $q questions during events.
[# # #] Gives the player a random item, from the pool of item IDs within the brackets. For example,
"I spent the afternoon daydreaming about the ocean. So I decided to cook some seafood. [198 202 727 728]$h"
...gives one of 198 (Baked Fish), 202 (Fried Calamari), 727 (Chowder), or 728 (Fish Stew) as a gift.
%revealtaste<NPC><object ID> Reveals the named character's gift taste for an object in their social menu profile. For example, %revealtasteLewis258 will update Lewis's profile to show that he likes blueberries. This only works if it's in the first message in a dialogue box (i.e., before any #$b# break, though #$e# breaks are fine).

Question example

To understand how $q, $r, and $p work, an example may be helpful. Note how you can format the script to be easier to read:

summer_Fri:
    "I think I'll go to the beach tomorrow!
    #$q 305/306 beachquestion_followup#Would you like to go with me?
        #$r 305 15 beachquestion_yes#Sure, I would love to!
        #$r 306 0 beachquestion_sorry#Oh, sorry, I've already made plans with someone else...
        #$r 306 -10 beachquestion_no#No thank you.
    ",
    "beachquestion_yes": "Good! It's a date.$h",
    "beachquestion_sorry": "Oh. Darn. Okay.$6",
    "beachquestion_no": "Oh. Um. Sorry.$s",
    "beachquestion_followup":
        "$p 305
            #Tomorrow should be a lot of fun!$h
            |Hmm, I wonder if I can get someone to go with me...$s
        ",

summer_Sat:
    "The beach is lovely this time of year...
    #$p 305
        #Thanks for coming with me today.$h
        |Oh, hi @, how's it going?
    ",

The dialogue above triggers on any Friday in the summer. The NPC begins with a response that is always shown: "I think I'll go to the beach tomorrow!"

Next they ask you a question.

#$q 305/306 beachquestion_followup#Would you like to go with me?

$q starts the question. 305/306 checks to see if this question has been asked before, and if it has it sends you to the dialogue key beachquestion_followup. (Note that you can name your dialogue keys whatever you like which makes it easier to read.)

Next are the responses the player can give. You can add any number of $r lines; here we have three:

    #$r 305 15 beachquestion_yes#Sure, I would love to!
    #$r 306 0 beachquestion_sorry#Oh, sorry, I've already made plans with someone else...
    #$r 306 -10 beachquestion_no#No thank you.

If you say yes (first option), the game will store ID 305 as the answer given to this question. Next, your friendship with that person increases by 15. beachquestion_yes tells the script which dialogue key continuation to use as a response to your answer.

If you say no (second and third option) the game will store ID 306 as the answer given, then depending on which answer you gave will either not change your friendship with the person, 0, or reduce it, -10. Then it will use either beachquestion_sorry or beachquestion_no to continue the dialogue.

Now we need to make dialogue keys for each response:

    beachquestion_yes: "Good! It's a date.$h",
    beachquestion_sorry: "Oh. Darn. Okay.$6",
    beachquestion_no: "Oh. Um. Sorry.$s",
    beachquestion_followup:
        "$p 305
            #Tomorrow should be a lot of fun!$h
            |Hmm, I wonder if I can get someone to go with me...$s
        ",

Of note here is beachquestion_followup. If the player talks to the NPC again, $q 305/306 will check that the question has already been answered and instead go directly to this key.

$p 305 begins a variable response which means "if the player chose yes, say this line, else say this line instead". If the player answered yes, the NPC responds happily. Otherwise, they will comment that they need to find someone to go with them.

There is another variable response the next day:

summer_Sat:
    "The beach is lovely this time of year...
    #$p 305
        #Thanks for coming with me today.$h
        |Oh, hi @, how's it going?
    ",

Once again the first line (The beach is lovely...) always shows up when the player talks to the NPC, but the next line depends on whether or not they've answered yes the previous day.


Here is another example from Haley's existing dialogue file. Note how the script formatting is harder to read, but the game is able to process both.

    summer_Sat: "Farming sounds so boring...#$q 42/43 summer_Sat_old#What do you even do all day?#$r 42 10 summer_Sat_12#Care for plants#$r 42 10 summer_Sat_12#Explore the caves#$r 43 -10 summer_Sat_13#Snoop around in your room#$r 42 10 summer_Sat_12#Dig for treasure" #!String
    summer_Sat_old: "#$p 43#Hey, you better not be snooping around in my room anymore!$a|But I guess it could get you in pretty good shape." #!String
    summer_Sat_12: "Hmm... sounds like a lot of work." #!String
    summer_Sat_13: "What? You'd better not be doing that!$a" #!String

The first time the summer_Sat dialogue is chosen, neither response 42 nor 43 will have been given (because this question is the only one which has them as responses), so Haley will say, "Farming sounds so boring... What do you even do all day?" The player can select among these responses:

  • Care for plants
  • Explore the caves
  • Snoop around in your room
  • Dig for treasure

The third response, $r 43 -10 summer_Sat_13#Snoop around in your room, sets response ID 43, reduces Haley's friendship by 10 points, and brings up the dialogue summer_Sat_13 (Haley says, "What? You'd better not be doing that!"). All of the other responses set response ID 42, increase Haley's friendship by 10 points, and bring up the dialogue summer_Sat_12 ("Hmm... sounds like a lot of work.").

The next time summer_Sat is chosen, one of the response IDs listed in the $q command will have been given (either 42 or 43). Therefore, the $q and everything after is scrapped, and dialogue summer_Sat_old is put in its place. This new dialogue uses the $p command to change Haley's dialogue based on whether or not you gave response ID 43 to any previous question. If you answered "Snoop around your room," everything before the | will be used, so Haley will now say, "Farming sounds so boring... Hey, you better not be snooping around in my room anymore!" If response ID 43 has not been given (in this case, you must have given response ID 42, i.e., one of the other three responses to the previous question), everything after the | will be used, so Haley will instead say, "Farming sounds so boring... But I guess it could get you in pretty good shape."

Replacer commands

Replacer commands will be replaced with the relevant string. Note that in mail entries, only the @ replacer works.

command description
@ Farmer's name.
Example: Hi there @!
%adj Random adjective. (Defined in StringsFromCSFiles.xnb)
%noun Random noun. (Defined in StringsFromCSFiles.xnb)
%place Random place name. (Defined in StringsFromCSFiles.xnb)
%spouse The name of Farmer's spouse.
%name A randomly-generated name.
%firstnameletter The first half of the farmer's name (rounded down), like Nat if the farmer's name is Natalie.
%time Current time.
%band The name of Sam and Sebastian's band.
%book The title of Elliott's book.
%pet The name of Farmer's pet.
%farm Farm name.
%favorite The Farmer's favorite thing.
%kid1 The name of Farmer's first child.
%kid2 The name of Farmer's second child.

Values

The game uses these predefined values in some dialogue keys. This section is linked from above where needed.

Days of week

  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • Sun

Seasons

  • spring
  • summer
  • fall
  • winter

First/later year

In some cases the game uses a "first/later year" value for dialogue conditions. This only has two possible values:

value meaning
1 Occurs in the first year.
2 Occurs in any year after the first (not only year 2).

Response IDs

A response ID identifies an answer chosen by the player in response to a question dialogue. In some cases a question may have several answers with the same ID (e.g., several variations of "yes"), or use the same ID for every question (in which case the ID just shows whether the player has answered the question).

Mods can add their own response IDs, but here are the vanilla IDs as of 1.3.36¹:

Dialogue
NPC question answers
Abigail fall_Sun
I was thinking about dyeing my hair again... what do you think?
27: Dye it black.
27: Why not blonde?
27: How about bubblegum pink?
28: I like your hair just the way it is!
Abigail summer_Sun
Okay... pretend you just won a free vacation. Where would you go?
25: The beach
26: In a dark cave
26: The old, gnarled forest
25: Joja Mega-Mall
Abigail Sun2
@, What do you think happens to us after we die?
17: I have no idea.
18: We come back as spooky ghosts.
17: We go to Heaven.
18: Our energy bodies enter the astral plane.
17: Nothing. We just cease to exist.
Abigail winter_Sun
I made these two drawings. What do you think?
29: I like the jungle island and the tiger.
30: I like the orc with the battleaxe.
29: I don't like either of them.
Alex fall_Wed
Do you think the ladies like my haircut?^What do you think about my haircut?
54: It looks very fashionable.
55: It looks like some kind of fungal growth.
Alex summer_Wed
Do you think I'll ever turn pro?
52: You're destined to be a sports legend
52: Maybe, if you practice a lot
53: No, you'll most likely fail and become a salesman
Alex Wed
I'd ask you to throw the ball around, but you don't really seem like the sports type.^If you weren't a girl I'd ask you to play catch.
6: I'm fine just watching you from a distance.
5: I want to play catch with you!
5: (angry) What's that supposed to mean?
Clint Mon
I bet you can't guess what my great-grandfather was...
9: A blacksmith.
9: A silly clown.
9: A sarcastic jerk.
Haley fall_Sat
*sigh*...what do you think I should do today?
44: Watercolor painting
44: Relax and read a magazine
44: Stop being a selfish crybaby
Haley summer_Sat
What do you even do all day?
42: Care for plants
42: Explore the caves
43: Snoop around in your room
42: Dig for treasure
Leah Mon
So why did you become a farmer?
21: I want to make tons of money.
22: It's more "real" than living in the city.
211132: To follow in grandpa's footsteps.
22: I wanted to escape my old life.
Maru summer_Thu
I've decided I'm going to build a robot someday.
35: That should be very easy for you
36: You should be more realistic
35: It sounds challenging
Maru Sun
Do you have fun working on the farm?
3: Yes.
4: No.
Penny Mon4
But it's best not to dwell on bad things, right?
7: Right. It's best to be positive!
8: I think it's good to be realistic.
Sam Wed
Hey.. What do you think my new song should be about?
20: Farming, mining, and chopping wood.
8820: A city in the sea.
8821: Trains.
19: Choose anything. It'll still be a horrible song.
Sebastian fall_Fri
Do you read, @?
62: Yep. The classics.
63: Only Sci-fi and Fantasy
62: I like a good Romance
63: No, I don't read books
Sebastian Fri2
So what do you do when you aren't working?
15: More Farming
16: Comic books
15: Shopping
15: Sports
Events
event question answers
Abigail's 4-heart event @! Why are you out here in the rain?$7 32: Just doing some work
32: Enjoying the weather
32: I could ask you the same question
Abigail's 6-heart event You've used a sword before, haven't you? 847951: Yes, and it's exciting!
847951: Yes, but only in self-defense
847951: Yes, but it's dangerous. You should stay safe.
847951: No
Abigail's 10-heart event *sniff*$s 776589: What happened?
776589: Are you okay?
Abigail's 10-heart event I guess I'm not as tough as I thought...$8 34: You're safe with me.
34: I get scared too.
34: You're crying like a little baby. Stop.
Alex's 5-heart event I'm worthless...$s 57: That's crazy. You're a genius!
57: We all have our strengths and weaknesses
57: Worthless? Yeah, that about sums it up.
Clint's 3-heart event Got any tips?^What advice can you give me? 211: Impress women with your strength and charm
211: Act crazy, to keep people guessing
211: Just act natural... be yourself
211: Treat women the same as men
Demetrius's 6-heart event How would you classify a tomato? 59: Vegetable
59: Fruit
Elliott's 2-heart event A question... What kind of books do you like, @? 958699: Mystery
958700: Romance
958701: Sci-Fi
Elliott's 4-heart event Wait. I propose a toast! To... 28376: To Pelican Town!
28376: To our friendship!
28376: To my good health!
28376: To your doom!
Emily's 6-heart event So... *gasp*... what did you think?$h 213: That was amazing!
213: That was embarrassing...
213: (Say nothing and do a slow clap)
Evelyn's 4-heart event Well, what do you think? 51: It's delicious!
51: It was like chewing on a hockey puck
Gus's 4-heart event @, what's going on here? 207: You need to pay your tab right now!
208: The saloon isn't doing well, financially
Haley's 2-heart event It's only because I cleaned them last week!$a 46: Stop whining and just clean it!
45: Haley, why not have this be your one weekly job?
46: Emily, take the high road and do it this time.
Haley's 4-heart event Say... you're pretty strong, aren't you? 47: Yes
47: No
Haley's 6-heart event I'll never find another one like it...$s 48: Relax, I'll just buy you a new one!
48: I'm really sorry...
Harvey's 2-heart event @, what do you think George should do? 84: George should follow Dr. Harvey's advice.
85: George knows what's best for his own body.
Harvey's 4-heart event Hmm... Your pulse is high.$u 86: I'm a little nervous...
86: I'm out of breath from working on the farm.
86: Are you really a doctor? My pulse is fine!
Kent's 3-heart event (Say something to Kent)$s 215: Jodi's to blame... she should've known better!
215: I know you're hurting... but don't blame your wife.
215: (Lie) Blame me... I asked for popcorn
Leah's 4-heart event Was that selfish of me, @?$s 83: No, it had to be done.
83: No, and your ex sounds like an idiot.
83: No, but you would've been better off staying in the city.
83: Yeah, a little.
83: Yeah, but it's natural to care about yourself first.
Lewis's 6-heart event @...You overheard everything, didn't you?$s 200: Yes... but I'll keep it a secret.
201: Yes... and I'm going to tell everyone.
Maru's 2-heart event Right, @? 15933: (Say nothing)
15933: Actually, your Dad was being weird.
Maru's 4-heart event @, what should I do? 38: Just scoop it off the floor. He won't know the difference.
39: Tell Harvey it was my fault.
38: Tell Harvey it was an accident.
Maru's 6-heart event What do you see? 40: A beautiful planet.
40: A cold, dark abyss.
Maru's 8-heart event I'm so sorry.$8 41: It's okay, it doesn't even hurt.
41: You'd better be. This hurts like crazy!
Maru's 10-heart event Well, what do you think, @? 18981: I'm so impressed with your inventions.
18981: I'm disappointed... You should've made that robot your slave.
18981: So is your Dad okay with 'us' now?
18981: (Just stare at Maru and say nothing)
Maru's 10-heart event You must have a good reason for saying that...$a 18982: MarILDA's just a piece of machinery designed to act human.
18982: I was just kidding. MarILDA deserves her freedom.
18982: I would've put her to work on the farm.
Penny's 2-heart event @? You were watching us? 71: I was. You did a kind thing there, Penny.
71: You should've left him alone. Now he's grumpy.
71: I'm just taking a walk, minding my own business.
Penny's 6-heart event ...well? 72: (Lie) Mmm! That was delicious!
73: Uh... can I get the rest to go?
73: Well it's definitely unique... how did you get it so rubbery?
Pierre's 6-heart event Promise me you won't tell anyone about this. 50: Your secret is safe with me.
50: Your wife deserves to know about this.
Robin's 6-heart event Have you ever made anything out of wood, @? 66: Yes
66: No
Sam's 2-heart event Say, @... what kind of music do you like? 76: Cheerful pop music.
77: Experimental noise rock.
78: Hi-Energy dance music.
79: Honky-tonky country music.
Sam's 4-heart event ...Tell her, @.$s 80: Sam dropped the snack as he was handing it to me.
80: Sam handed me the snack and then I dropped it.
81: Sam dropped it on purpose. He thought it would be funny.

¹ Extracted using this LINQPad script.

Conversation topics

A conversation topic is a temporary flag which can be checked in event preconditions and can trigger one-time NPC dialogue (if they have a matching dialogue key). They're stored in Game1.player.activeDialogueEvents while active.

A conversation topic can be started with a modder-defined length using the addConversationTopic event command, %item conversationTopic mail command, or in code by adding it to Game1.player.activeDialogueEvents. A conversation topic, by default, lasts four days when added via event commands.

The game defines these events:

id duration trigger
Bundles
cc_Begin 4 days Set in the Wizard's cutscene after reading the first Junimo note in the community center.
cc_Complete 4 days Community Center completed. (Does not apply to JojaMart path.)
cc_Boulder 7 days Mountain boulder is removed through community center bundle or Joja improvement form.
cc_Bridge 7 days Quarry bridge is repaired through community center bundle or Joja improvement form.
cc_Bus 7 days Bus is repaired through community center bundle or Joja improvement form.
cc_Greenhouse 3 days Greenhouse is constructed through community center bundle. (Does not apply to JojaMart path.)
cc_Minecart 7 days Minecarts are unlocked through community center bundle or Joja improvement form.
joja_Begin 7 days First time that player opens the Joja Community Development Form.
movieTheater 3 days movie theatre is constructed.
Spouse events
elliottGone 6 days Set when Elliott's fourteen-heart event starts.
ElliottGone1
ElliottGone2
ElliottGone3
ElliottGone4
ElliottGone5
ElliottGone6
ElliottGone7
same day Part of Elliott's fourteen-heart event. The first flag is set when it starts; the subsequent flags are set by subsequent letters from Elliott.
emilyFiber 2 days Part of Emily's fourteen-heart event. Set after completing the quest.
haleyCakewalk1
haleyCakewalk2
same day Part of Haley's fourteen-heart event.
leahPaint same day Set when Leah's fourteen-heart event starts.
pennyRedecorating 2 days Part of Penny's fourteen-heart event.
samJob1
samJob2
2 days Part of Sam's fourteen-heart event.
samJob3 3 days Part of Sam's fourteen-heart event.
sebastianFrog same day Set when Sebastian's fourteen-heart event starts.
sebastianFrog2 6 days Part of Sebastian's fourteen-heart event.
shaneSaloon1
shaneSaloon2
same day Part of Shane's fourteen-heart event.
Other events
dumped_Guys
dumped_Girls
7 days Set after the corresponding ten-heart group event (e.g., see Abigail#Group Ten-Heart Event).
secondChance_Girls
secondChance_Guys
14 days Set after the corresponding ten-heart group event (e.g., see Abigail#Group Ten-Heart Event).
pamHouseUpgrade 4 days Set after seeing the Pam house upgrade event, if the player chose to be revealed as the donor.
pamHouseUpgradeAnonymous 4 days Set after seeing the Pam house upgrade event, if the player chose to be anonymous.
willyCrabs 4 days Set after Willy's six-heart event.
Other
Introduction 6 days Farmer is created (e.g., starting a new save, or joining a multiplayer game for the first time).
FullCrabPond 14 days First time any fish pond contains 10 crabs.