Difference between revisions of "Modding:Movie theater data"

From Stardew Valley Wiki
Jump to navigation Jump to search
(→‎Concession data: Update raw data dump with 1.6 (has quotes around IDs now))
 
(10 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 
← [[Modding:Index|Index]]
 
← [[Modding:Index|Index]]
 
'''Work in progress.'''
 
  
 
This page explains how the files associated with the [[Movie Theater]], what each of them do, and how they are formatted. This is an advanced guide for mod developers.
 
This page explains how the files associated with the [[Movie Theater]], what each of them do, and how they are formatted. This is an advanced guide for mod developers.
Line 425: Line 423:
 
===Format===
 
===Format===
 
Each block of data within the file begins with an <samp>NPCName</samp> key, which is the name of the NPC to whom the rest of the data in the block will apply. This is followed by a list with the key <samp>Reactions</samp>. Each block within this list is the data for an NPC's response to a specific type of movie.
 
Each block of data within the file begins with an <samp>NPCName</samp> key, which is the name of the NPC to whom the rest of the data in the block will apply. This is followed by a list with the key <samp>Reactions</samp>. Each block within this list is the data for an NPC's response to a specific type of movie.
 
If multiple response blocks are applicable to the movie, the game uses the first non-null <samp>Response</samp>, <samp>BeforeMovie</samp>, <samp>DuringMovie</samp>, and <samp>AfterMovie</samp> fields it can find. Said fields do not necessarily have to come from the same response block. If the game cannot find applicable <samp>BeforeMovie</samp>, <samp>DuringMovie</samp>, or <samp>AfterMovie</samp> fields, it will use default text from <samp>Strings\Characters.xnb</samp>.
 
  
 
The data within each block is formatted as follows:
 
The data within each block is formatted as follows:
Line 455: Line 451:
 
|-
 
|-
 
|}
 
|}
 +
 +
For unknown reasons, in the vanilla game code, when the <samp>Tag</samp> field is <samp>love</samp> or <samp>dislike</samp>, the <samp>Response</samp>field will always be <samp>like</samp>.
  
 
==== Special responses ====
 
==== Special responses ====
Each <samp>SpecialResponses</samp> block contains 3 blocks, beginning with <samp>BeforeMovie</samp>, <samp>DuringMovie</samp>, and <samp>AfterMovie</samp>, in that order. Any of these blocks may be left null. By default, the dialogue within these blocks triggers before the film begins, at a random point during it, and after it's finished, respectively. The data within each block is as follows:
+
Each <samp>SpecialResponses</samp> block contains 3 blocks, beginning with <samp>BeforeMovie</samp>, <samp>DuringMovie</samp>, and <samp>AfterMovie</samp>, in that order. Any of these blocks may be left null. By default, the dialogue within these blocks triggers when talking to the NPC in the movie theater lobby, at a random point during the movie, and after the movie is finished, respectively. The data within each block is as follows:
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 473: Line 471:
 
| The dialogue spoken by the NPC.
 
| The dialogue spoken by the NPC.
 
|}
 
|}
 +
 +
If multiple response blocks are applicable to the movie, the game uses the first non-null <samp>Response</samp>, <samp>BeforeMovie</samp>, <samp>DuringMovie</samp>, and <samp>AfterMovie</samp> fields it can find. Said data does not necessarily have to come from the same response block. If the game cannot find applicable <samp>DuringMovie</samp> dialogue, it will use default text from <samp>Strings\Characters.xnb</samp>. If the game cannot find applicable <samp>BeforeMovie</samp> or <samp>AfterMovie</samp> dialogue, the NPC will show as being able to be spoken to, but interacting with them will have no effect.
  
 
== Concession data ==
 
== Concession data ==
<samp>Data\Movies.xnb</samp> contains the data for the food purchased at the concessions stand, stored as a list of blocks. For reference, below is the raw data of the file:
+
<samp>Data\Concessions.xnb</samp> contains the data for the food purchased at the concessions stand, stored as a list of blocks. For reference, below is the raw data of the file:
  
 
{{collapse|Data|content=<syntaxhighlight lang="json">
 
{{collapse|Data|content=<syntaxhighlight lang="json">
 
[
 
[
 
   {
 
   {
     "ID": 0,
+
     "Id": "0",
 
     "Name": "Cotton Candy",
 
     "Name": "Cotton Candy",
     "DisplayName": "Cotton Candy",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:CottonCandy_Name]",
     "Description": "A large pink cloud of spun sugar.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:CottonCandy_Description]",
 
     "Price": 50,
 
     "Price": 50,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 0,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sweet",
 
       "Sweet",
Line 491: Line 493:
 
   },
 
   },
 
   {
 
   {
     "ID": 1,
+
     "Id": "1",
 
     "Name": "Jasmine Tea",
 
     "Name": "Jasmine Tea",
     "DisplayName": "Jasmine Tea",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:JasmineTea_Name]",
     "Description": "Green tea flavored with aromatic jasmine flowers.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:JasmineTea_Description]",
 
     "Price": 50,
 
     "Price": 50,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 1,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Drink",
 
       "Drink",
Line 503: Line 507:
 
   },
 
   },
 
   {
 
   {
     "ID": 2,
+
     "Id": "2",
 
     "Name": "Joja Cola",
 
     "Name": "Joja Cola",
     "DisplayName": "Joja Cola",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:JojaCola_Name]",
     "Description": "An extra-large cup of Joja's flagship soda.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:JojaCola_Description]",
 
     "Price": 40,
 
     "Price": 40,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 2,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Drink",
 
       "Drink",
Line 515: Line 521:
 
   },
 
   },
 
   {
 
   {
     "ID": 3,
+
     "Id": "3",
 
     "Name": "Sour Slimes",
 
     "Name": "Sour Slimes",
     "DisplayName": "Sour Slimes",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:SourSlimes_Name]",
     "Description": "Tiny gummy slimes of assorted colors. They're sprinkled with an extremely sour powder.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:SourSlimes_Description]",
 
     "Price": 80,
 
     "Price": 80,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 3,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sour",
 
       "Sour",
Line 526: Line 534:
 
   },
 
   },
 
   {
 
   {
     "ID": 4,
+
     "Id": "4",
 
     "Name": "Personal Pizza",
 
     "Name": "Personal Pizza",
     "DisplayName": "Personal Pizza",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:PersonalPizza_Name]",
     "Description": "A pizza small enough to enjoy as a snack.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:PersonalPizza_Description]",
 
     "Price": 150,
 
     "Price": 150,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 4,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Hot",
 
       "Hot",
Line 537: Line 547:
 
   },
 
   },
 
   {
 
   {
     "ID": 5,
+
     "Id": "5",
 
     "Name": "Nachos",
 
     "Name": "Nachos",
     "DisplayName": "Nachos",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:Nachos_Name]",
     "Description": "Gooey, spicy cheese on top of freshly fried tortilla chips.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:Nachos_Description]",
 
     "Price": 100,
 
     "Price": 100,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 5,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Hot",
 
       "Hot",
Line 549: Line 561:
 
   },
 
   },
 
   {
 
   {
     "ID": 6,
+
     "Id": "6",
 
     "Name": "Salmon Burger",
 
     "Name": "Salmon Burger",
     "DisplayName": "Salmon Burger",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:SalmonBurger_Name]",
     "Description": "A thick slab of salmon on a lightly toasted sesame seed bun.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:SalmonBurger_Description]",
 
     "Price": 150,
 
     "Price": 150,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 6,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sandwich",
 
       "Sandwich",
Line 560: Line 574:
 
   },
 
   },
 
   {
 
   {
     "ID": 7,
+
     "Id": "7",
 
     "Name": "Ice Cream Sandwich",
 
     "Name": "Ice Cream Sandwich",
     "DisplayName": "Ice Cream Sandwich",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:IceCreamSandwich_Name]",
     "Description": "Vanilla ice cream sandwiched between two chocolate cookies.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:IceCreamSandwich_Description]",
 
     "Price": 150,
 
     "Price": 150,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 7,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sandwich",
 
       "Sandwich",
Line 572: Line 588:
 
   },
 
   },
 
   {
 
   {
     "ID": 8,
+
     "Id": "8",
 
     "Name": "Popcorn",
 
     "Name": "Popcorn",
     "DisplayName": "Popcorn",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:Popcorn_Name]",
     "Description": "Popped kernels of corn, dusted lightly with salt and drizzled with butter.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:Popcorn_Description]",
 
     "Price": 120,
 
     "Price": 120,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 8,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Hot",
 
       "Hot",
Line 583: Line 601:
 
   },
 
   },
 
   {
 
   {
     "ID": 9,
+
     "Id": "9",
 
     "Name": "Fries",
 
     "Name": "Fries",
     "DisplayName": "Fries",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:Fries_Name]",
     "Description": "Thin slices of potato, deep fried and then lightly salted.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:Fries_Description]",
 
     "Price": 100,
 
     "Price": 100,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 9,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Hot",
 
       "Hot",
Line 595: Line 615:
 
   },
 
   },
 
   {
 
   {
     "ID": 10,
+
     "Id": "10",
 
     "Name": "Chocolate Popcorn",
 
     "Name": "Chocolate Popcorn",
     "DisplayName": "Chocolate Popcorn",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:ChocolatePopcorn_Name]",
     "Description": "It's normal popcorn... but with a chocolate coating.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:ChocolatePopcorn_Description]",
 
     "Price": 130,
 
     "Price": 130,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 10,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Hot",
 
       "Hot",
Line 606: Line 628:
 
   },
 
   },
 
   {
 
   {
     "ID": 11,
+
     "Id": "11",
 
     "Name": "Black Licorice",
 
     "Name": "Black Licorice",
     "DisplayName": "Black Licorice",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:BlackLicorice_Name]",
     "Description": "A chewy candy with an intense, pungent flavor.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:BlackLicorice_Description]",
 
     "Price": 25,
 
     "Price": 25,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 11,
 
     "ItemTags": null
 
     "ItemTags": null
 
   },
 
   },
 
   {
 
   {
     "ID": 12,
+
     "Id": "12",
 
     "Name": "Star Cookie",
 
     "Name": "Star Cookie",
     "DisplayName": "Star Cookie",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:StarCookie_Name]",
     "Description": "A star-shaped shortbread cookie with rainbow sprinkles.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:StarCookie_Description]",
 
     "Price": 150,
 
     "Price": 150,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 12,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sweet"
 
       "Sweet"
Line 624: Line 650:
 
   },
 
   },
 
   {
 
   {
     "ID": 13,
+
     "Id": "13",
 
     "Name": "Jawbreaker",
 
     "Name": "Jawbreaker",
     "DisplayName": "Jawbreaker",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:Jawbreaker_Name]",
     "Description": "It's a big, hard candy that lasts the whole movie!",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:Jawbreaker_Description]",
 
     "Price": 250,
 
     "Price": 250,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 13,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sweet",
 
       "Sweet",
Line 635: Line 663:
 
   },
 
   },
 
   {
 
   {
     "ID": 14,
+
     "Id": "14",
 
     "Name": "Salted Peanuts",
 
     "Name": "Salted Peanuts",
     "DisplayName": "Salted Peanuts",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:SaltedPeanuts_Name]",
     "Description": "A classic salty treat.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:SaltedPeanuts_Description]",
 
     "Price": 120,
 
     "Price": 120,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 14,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Salty"
 
       "Salty"
Line 645: Line 675:
 
   },
 
   },
 
   {
 
   {
     "ID": 15,
+
     "Id": "15",
 
     "Name": "Hummus Snack Pack",
 
     "Name": "Hummus Snack Pack",
     "DisplayName": "Hummus Snack Pack",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:HummusSnackPack_Name]",
     "Description": "It's crunchy and healthy.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:HummusSnackPack_Description]",
 
     "Price": 90,
 
     "Price": 90,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 15,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Healthy"
 
       "Healthy"
Line 655: Line 687:
 
   },
 
   },
 
   {
 
   {
     "ID": 16,
+
     "Id": "16",
 
     "Name": "Kale Smoothie",
 
     "Name": "Kale Smoothie",
     "DisplayName": "Kale Smoothie",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:KaleSmoothie_Name]",
     "Description": "It's loaded with vitamins and fiber.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:KaleSmoothie_Description]",
 
     "Price": 120,
 
     "Price": 120,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 16,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Drink",
 
       "Drink",
Line 666: Line 700:
 
   },
 
   },
 
   {
 
   {
     "ID": 17,
+
     "Id": "17",
 
     "Name": "Apple Slices",
 
     "Name": "Apple Slices",
     "DisplayName": "Apple Slices",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:AppleSlices_Name]",
     "Description": "Crunchy and sweet little slices.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:AppleSlices_Description]",
 
     "Price": 100,
 
     "Price": 100,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 17,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sweet",
 
       "Sweet",
Line 677: Line 713:
 
   },
 
   },
 
   {
 
   {
     "ID": 18,
+
     "Id": "18",
 
     "Name": "Panzanella Salad",
 
     "Name": "Panzanella Salad",
     "DisplayName": "Panzanella Salad",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:PanzanellaSalad_Name]",
     "Description": "A summer salad of bread and tomatoes.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:PanzanellaSalad_Description]",
 
     "Price": 200,
 
     "Price": 200,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 18,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Gourmet",
 
       "Gourmet",
Line 688: Line 726:
 
   },
 
   },
 
   {
 
   {
     "ID": 19,
+
     "Id": "19",
 
     "Name": "Truffle Popcorn",
 
     "Name": "Truffle Popcorn",
     "DisplayName": "Truffle Popcorn",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:TrufflePopcorn_Name]",
     "Description": "Heirloom popcorn sprinkled with truffle salt.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:TrufflePopcorn_Description]",
 
     "Price": 180,
 
     "Price": 180,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 19,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Gourmet",
 
       "Gourmet",
Line 699: Line 739:
 
   },
 
   },
 
   {
 
   {
     "ID": 20,
+
     "Id": "20",
 
     "Name": "Cappuccino Mousse Cake",
 
     "Name": "Cappuccino Mousse Cake",
     "DisplayName": "Cappuccino Mousse Cake",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:CappuccinoMousseCake_Name]",
     "Description": "A small chocolate cake glazed with a cappuccinio mousse.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:CappuccinoMousseCake_Description]",
 
     "Price": 220,
 
     "Price": 220,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 20,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sweet",
 
       "Sweet",
Line 710: Line 752:
 
   },
 
   },
 
   {
 
   {
     "ID": 21,
+
     "Id": "21",
 
     "Name": "JojaCorn",
 
     "Name": "JojaCorn",
     "DisplayName": "JojaCorn",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:JojaCorn_Name]",
     "Description": "Joja's patented corn food, slathered in plenty of \"b'utter sauce\".",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:JojaCorn_Description]",
 
     "Price": 10,
 
     "Price": 10,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 21,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Joja"
 
       "Joja"
Line 720: Line 764:
 
   },
 
   },
 
   {
 
   {
     "ID": 22,
+
     "Id": "22",
 
     "Name": "Stardrop Sorbet",
 
     "Name": "Stardrop Sorbet",
     "DisplayName": "Stardrop Sorbet",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:StardropSorbet_Name]",
     "Description": "A single drop of stardrop essence tranforms this sorbet into an extraordinary treat.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:StardropSorbet_Description]",
 
     "Price": 1250,
 
     "Price": 1250,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 22,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sweet",
 
       "Sweet",
Line 731: Line 777:
 
   },
 
   },
 
   {
 
   {
     "ID": 23,
+
     "Id": "23",
 
     "Name": "Rock Candy",
 
     "Name": "Rock Candy",
     "DisplayName": "Rock Candy",
+
     "DisplayName": "[LocalizedText Strings\\MovieConcessions:RockCandy_Name]",
     "Description": "Flavored sugar crystals attached to a convenient stick.",
+
     "Description": "[LocalizedText Strings\\MovieConcessions:RockCandy_Description]",
 
     "Price": 90,
 
     "Price": 90,
 +
    "Texture": "LooseSprites\\Concessions",
 +
    "SpriteIndex": 23,
 
     "ItemTags": [
 
     "ItemTags": [
 
       "Sweet",
 
       "Sweet",
Line 753: Line 801:
 
|-
 
|-
 
| <samp>ID</samp>
 
| <samp>ID</samp>
| Counting from 0, what number concession this is in the list.
+
| A [[Modding:Common_data_field_types#Unique_string_ID|unique string ID]] to identify this entry.
 
|-
 
|-
 
| <samp>Name</samp>
 
| <samp>Name</samp>
Line 769: Line 817:
 
| <samp>ItemTags</samp>
 
| <samp>ItemTags</samp>
 
| A list of tags which describe the concession, used to determine an NPC's reaction to it. Can be any arbitrary string; the ones currently used in the game are: <samp>Sweet</samp>, <samp>Candy</samp>, <samp>Drink</samp>, <samp>Hot</samp>, <samp>Healthy</samp>, <samp>Cold</samp>, <samp>Joja</samp>, <samp>Sour</samp>, <samp>Fatty</samp>, <samp>Salty</samp>, <samp>Sandwich</samp>, <samp>Burger</samp>, and <samp>Gourmet</samp>.
 
| A list of tags which describe the concession, used to determine an NPC's reaction to it. Can be any arbitrary string; the ones currently used in the game are: <samp>Sweet</samp>, <samp>Candy</samp>, <samp>Drink</samp>, <samp>Hot</samp>, <samp>Healthy</samp>, <samp>Cold</samp>, <samp>Joja</samp>, <samp>Sour</samp>, <samp>Fatty</samp>, <samp>Salty</samp>, <samp>Sandwich</samp>, <samp>Burger</samp>, and <samp>Gourmet</samp>.
 +
|-
 +
| <samp>Texture</samp>
 +
| The asset name for the texture containing the concession's sprite.
 +
|-
 +
| <samp>SpriteIndex</samp>
 +
| The index within the <samp>Texture</samp> for the concession sprite, where 0 is the top-left sprite.
 +
|}
 +
 +
For example, this content pack adds a new 'Pufferchick Pop' concession with a custom image:
 +
{{#tag:syntaxhighlight|<nowiki>
 +
{
 +
    "Format": "</nowiki>{{Content Patcher version}}<nowiki>",
 +
    "Changes": [
 +
        {
 +
            "Action": "EditData",
 +
            "Target": "Data/Concessions",
 +
            "Entries": {
 +
                "{{ModId}}_PufferchickPop": {
 +
                    "Id": "{{ModId}}_PufferchickPop",  // must specify ID again when creating a new entry
 +
                    "Name": "{{ModId}}_PufferchickPop", // best practice to match the ID, since it's sometimes used as an alternate ID
 +
                    "DisplayName": "Pufferchick Pop",
 +
                    "Description": "A cute cake pop shaped like a pufferchick.",
 +
                    "Price": 25,
 +
                    "Texture": "{{InternalAssetKey: assets/pufferchick-pop.png}}" // an image in your content pack
 +
                    "SpriteIndex": 0
 +
                }
 +
            }
 +
        }
 +
    ]
 +
}</nowiki>|lang=javascript}}
 +
 +
== Concession tastes ==
 +
<samp>Data\ConcessionTastes.xnb</samp> contains the data that determines an NPC's opinion of a concession. For reference, below is the raw data of the file:
 +
 +
{{collapse|Data|content=<syntaxhighlight lang="json">
 +
[
 +
  {
 +
    "Name": "Penny",
 +
    "LovedTags": [
 +
      "Cotton Candy"
 +
    ],
 +
    "LikedTags": [
 +
      "Sweet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Sour"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Pam",
 +
    "LovedTags": [
 +
      "Nachos"
 +
    ],
 +
    "LikedTags": [
 +
      "Salty",
 +
      "Fatty",
 +
      "Joja"
 +
    ],
 +
    "DislikedTags": [
 +
      "Healthy",
 +
      "Gourmet"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "George",
 +
    "LovedTags": [
 +
      "Black Licorice"
 +
    ],
 +
    "LikedTags": [
 +
      "Salty"
 +
    ],
 +
    "DislikedTags": [
 +
      "Sweet",
 +
      "Healthy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Alex",
 +
    "LovedTags": [
 +
      "Salmon Burger"
 +
    ],
 +
    "LikedTags": [
 +
      "Salty",
 +
      "Hot"
 +
    ],
 +
    "DislikedTags": [
 +
      "Candy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Evelyn",
 +
    "LovedTags": [
 +
      "Cappuccino Mousse Cake",
 +
      "Star Cookie"
 +
    ],
 +
    "LikedTags": [
 +
      "Sweet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Salty",
 +
      "Hot"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Pierre",
 +
    "LovedTags": [
 +
      "Personal Pizza"
 +
    ],
 +
    "LikedTags": [
 +
      "Hot"
 +
    ],
 +
    "DislikedTags": [
 +
      "Joja"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Abigail",
 +
    "LovedTags": [
 +
      "Rock Candy"
 +
    ],
 +
    "LikedTags": [
 +
      "Candy",
 +
      "Sweet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Healthy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Caroline",
 +
    "LovedTags": [
 +
      "Truffle Popcorn",
 +
      "Jasmine Tea"
 +
    ],
 +
    "LikedTags": [
 +
      "Healthy"
 +
    ],
 +
    "DislikedTags": [
 +
      "Fatty",
 +
      "Candy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Harvey",
 +
    "LovedTags": [
 +
      "Apple Slices",
 +
      "Jasmine Tea"
 +
    ],
 +
    "LikedTags": [
 +
      "Healthy",
 +
      "Gourmet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Sweet",
 +
      "Fatty",
 +
      "Salty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Gus",
 +
    "LovedTags": [
 +
      "Gourmet"
 +
    ],
 +
    "LikedTags": [
 +
      "Sandwich"
 +
    ],
 +
    "DislikedTags": [
 +
      "Healthy",
 +
      "Candy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Lewis",
 +
    "LovedTags": [
 +
      "Jasmine Tea"
 +
    ],
 +
    "LikedTags": [
 +
      "Sweet",
 +
      "Popcorn"
 +
    ],
 +
    "DislikedTags": [
 +
      "Candy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Jodi",
 +
    "LovedTags": [
 +
      "Chocolate Popcorn"
 +
    ],
 +
    "LikedTags": [
 +
      "Fatty",
 +
      "Hot",
 +
      "Salty"
 +
    ],
 +
    "DislikedTags": [
 +
      "Candy",
 +
      "Truffle Popcorn",
 +
      "Healthy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Sam",
 +
    "LovedTags": [
 +
      "Personal Pizza"
 +
    ],
 +
    "LikedTags": [
 +
      "Joja Cola",
 +
      "Candy"
 +
    ],
 +
    "DislikedTags": [
 +
      "Healthy",
 +
      "Gourmet"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Vincent",
 +
    "LovedTags": [
 +
      "Jawbreaker"
 +
    ],
 +
    "LikedTags": [
 +
      "Sweet",
 +
      "Candy"
 +
    ],
 +
    "DislikedTags": [
 +
      "Healthy",
 +
      "Gourmet"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Kent",
 +
    "LovedTags": [
 +
      "Popcorn"
 +
    ],
 +
    "LikedTags": [
 +
      "Salty"
 +
    ],
 +
    "DislikedTags": [
 +
      "Candy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Clint",
 +
    "LovedTags": [
 +
      "Fries"
 +
    ],
 +
    "LikedTags": [
 +
      "Fatty"
 +
    ],
 +
    "DislikedTags": [
 +
      "Healthy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Emily",
 +
    "LovedTags": [
 +
      "Kale Smoothie"
 +
    ],
 +
    "LikedTags": [
 +
      "Healthy",
 +
      "Gourmet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Fatty",
 +
      "Salty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Haley",
 +
    "LovedTags": [
 +
      "Cappuccino Mousse Cake"
 +
    ],
 +
    "LikedTags": [
 +
      "Sweet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Fatty",
 +
      "Salty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Maru",
 +
    "LovedTags": [
 +
      "Star Cookie"
 +
    ],
 +
    "LikedTags": [
 +
      "Fatty",
 +
      "Sweet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Cold"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Sebastian",
 +
    "LovedTags": [
 +
      "Jasmine Tea"
 +
    ],
 +
    "LikedTags": [
 +
      "Apple Slices",
 +
      "Salty",
 +
      "Hot"
 +
    ],
 +
    "DislikedTags": [
 +
      "Gourmet",
 +
      "Kale Smoothie"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Robin",
 +
    "LovedTags": [
 +
      "Salted Peanuts"
 +
    ],
 +
    "LikedTags": [
 +
      "Salty",
 +
      "Fatty"
 +
    ],
 +
    "DislikedTags": [
 +
      "Candy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Demetrius",
 +
    "LovedTags": [
 +
      "Popcorn"
 +
    ],
 +
    "LikedTags": [
 +
      "Sweet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Healthy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Linus",
 +
    "LovedTags": [
 +
      "Salmon Burger"
 +
    ],
 +
    "LikedTags": [
 +
      "Healthy",
 +
      "Gourmet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Joja"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Dwarf",
 +
    "LovedTags": [
 +
      "Rock Candy"
 +
    ],
 +
    "LikedTags": [
 +
      "Candy"
 +
    ],
 +
    "DislikedTags": [
 +
      "Hot",
 +
      "Healthy",
 +
      "Gourmet",
 +
      "Salty",
 +
      "Fatty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Krobus",
 +
    "LovedTags": [
 +
      "Black Licorice"
 +
    ],
 +
    "LikedTags": [],
 +
    "DislikedTags": [
 +
      "Sweet",
 +
      "Stardrop Sorbet"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Wizard",
 +
    "LovedTags": [
 +
      "Black Licorice",
 +
      "Star Cookie"
 +
    ],
 +
    "LikedTags": [
 +
      "Jasmine Tea",
 +
      "Candy"
 +
    ],
 +
    "DislikedTags": [
 +
      "Hot",
 +
      "Healthy",
 +
      "Gourmet",
 +
      "Salty",
 +
      "Fatty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Marnie",
 +
    "LovedTags": [
 +
      "Ice Cream Sandwich"
 +
    ],
 +
    "LikedTags": [
 +
      "Sweet",
 +
      "Popcorn"
 +
    ],
 +
    "DislikedTags": [
 +
      "Salty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Shane",
 +
    "LovedTags": [
 +
      "Personal Pizza",
 +
      "Nachos",
 +
      "Joja",
 +
      "Hummus Snack Pack"
 +
    ],
 +
    "LikedTags": [
 +
      "Fatty"
 +
    ],
 +
    "DislikedTags": [
 +
      "Gourmet",
 +
      "Apple Slices",
 +
      "Kale Smoothie"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Jas",
 +
    "LovedTags": [
 +
      "Sour Slimes"
 +
    ],
 +
    "LikedTags": [
 +
      "Sweet",
 +
      "Candy"
 +
    ],
 +
    "DislikedTags": [
 +
      "Healthy",
 +
      "Gourmet",
 +
      "Salty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Leah",
 +
    "LovedTags": [
 +
      "Panzanella Salad"
 +
    ],
 +
    "LikedTags": [
 +
      "Healthy",
 +
      "Gourmet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Fatty",
 +
      "Salty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Sandy",
 +
    "LovedTags": [
 +
      "Cotton Candy"
 +
    ],
 +
    "LikedTags": [
 +
      "Gourmet",
 +
      "Sweet"
 +
    ],
 +
    "DislikedTags": [
 +
      "Candy"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Elliott",
 +
    "LovedTags": [
 +
      "Truffle Popcorn",
 +
      "Cappuccino Mousse Cake"
 +
    ],
 +
    "LikedTags": [
 +
      "Gourmet",
 +
      "Healthy"
 +
    ],
 +
    "DislikedTags": [
 +
      "Candy",
 +
      "Fatty",
 +
      "Salty"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "Willy",
 +
    "LovedTags": [
 +
      "Salmon Burger"
 +
    ],
 +
    "LikedTags": [
 +
      "Hot",
 +
      "Fatty",
 +
      "Salty"
 +
    ],
 +
    "DislikedTags": [
 +
      "Candy",
 +
      "Healthy",
 +
      "Gourmet"
 +
    ]
 +
  },
 +
  {
 +
    "Name": "*",
 +
    "LovedTags": [
 +
      "Stardrop Sorbet"
 +
    ],
 +
    "LikedTags": [],
 +
    "DislikedTags": [
 +
      "Black Licorice",
 +
      "Joja"
 +
    ]
 +
  }
 +
]
 +
</syntaxhighlight>}}
 +
 +
=== Format ===
 +
Each block within the list has the following data:
 +
 +
{| class="wikitable"
 +
|-
 +
! key format
 +
! description
 +
|-
 +
| <samp>Name</samp>
 +
| Who this block should apply to. Can be the name of an NPC or <samp>*</samp>, in which case the tastes will apply to every NPC.
 +
|-
 +
| <samp>LovedTags</samp></br><samp>LikedTags</samp></br><samp>DislikedTags</samp>
 +
| A list of concession tags that are loved, liked, or disliked. This can be an <samp>ItemTag</samp>, or the internal name of a specific concession. To determine an NPC's opinion of a concession, the game totals how many tags from each group apply, with <samp>LovedTags</samp> and <samp>LikedTags</samp> contributing a positive score and <samp>DislikedTags</samp> contributing a negative. Purchasing a loved snack earns 50 Friendship points with the NPC, a liked snack earns 25 Friendship points, and a disliked snack neither earns nor costs friendship points with the NPC.
 
|}
 
|}
  
== Concession reactions ==
+
[[Category:Modding]]

Latest revision as of 03:42, 5 June 2024

Index

This page explains how the files associated with the Movie Theater, what each of them do, and how they are formatted. This is an advanced guide for mod developers.

Movie data

Data\Movies.xnb contains the data for all movies, including their names, descriptions, genre tags, scenes, and dialogue and narration spoken within the film. For reference, below is the raw data of "The Brave Little Sapling":

Data 
{
  "spring_movie_0": {
    "ID": null,
    "SheetIndex": 0,
    "Title": "The Brave Little Sapling",
    "Description": "An animated family comedy about a little sprout on a magical adventure to become a tree!",
    "Tags": [
      "family",
      "comedy"
    ],
    "Scenes": [
      {
        "Image": 0,
        "Music": "sweet",
        "Sound": "",
        "MessageDelay": 1000,
        "Script": "",
        "Text": "The Brave Little Sapling",
        "Shake": false,
        "ResponsePoint": null,
        "ID": "spring0_0"
      },
      {
        "Image": 1,
        "Music": "",
        "Sound": "",
        "MessageDelay": 500,
        "Script": "",
        "Text": "The brave little sapling is leaving his home. He hesitates for a moment and turns around, knowing he won't be back for a long time...",
        "Shake": false,
        "ResponsePoint": null,
        "ID": "spring0_1"
      },
      {
        "Image": 6,
        "Music": "",
        "Sound": "",
        "MessageDelay": 500,
        "Script": "/playSound dustMeep/pause 200/playSound dustMeep/pause 300/playSound dustMeep/pause 100/playSound dustMeep/pause 200/playSound dustMeep",
        "Text": "The other saplings of his grove are gathered at the edge of town, excitedly waving their twigs goodbye...!",
        "Shake": false,
        "ResponsePoint": "sprout_leave",
        "ID": "spring0_2"
      },
      {
        "Image": 2,
        "Music": "rain",
        "Sound": "",
        "MessageDelay": 500,
        "Script": "",
        "Text": "Oh no! Out of nowhere, it starts raining...! The little sapling goes into a sprint as thunderclouds loom overhead...",
        "Shake": false,
        "ResponsePoint": "",
        "ID": "spring0_3"
      },
      {
        "Image": 3,
        "Music": "",
        "Sound": "thunder",
        "MessageDelay": 1000,
        "Script": "",
        "Text": "Fearing for his life, and demoralized by the relentless downpour, the brave little sapling begins to lose hope...",
        "Shake": false,
        "ResponsePoint": "",
        "ID": "spring0_4"
      },
      {
        "Image": 4,
        "Music": "echos",
        "Sound": "",
        "MessageDelay": 500,
        "Script": "",
        "Text": "...But what's this...? The sapling feels a tingling on the top of his head... ",
        "Shake": false,
        "ResponsePoint": null,
        "ID": "spring0_5"
      },
      {
        "Image": 5,
        "Music": "",
        "Sound": "",
        "MessageDelay": 500,
        "Script": "/playSound coin/pause 1000/message \"Perhaps a little rain was what it needed to begin its journey into becoming a tree!\"",
        "Text": "",
        "Shake": false,
        "ResponsePoint": "",
        "ID": "spring0_6"
      },
      {
        "Image": 7,
        "Music": "",
        "Sound": "",
        "MessageDelay": 2000,
        "Script": "",
        "Text": "Farewell, little buddy!",
        "Shake": false,
        "ResponsePoint": null,
        "ID": "spring0_7"
      }
    ]
  },
  ...
}

Format

Each movie's specific entry begins with an identifier of the form <season>_movie_<number>, where <season> is the season in which it will be screened, and <number> is either 0 or 1. The movie theater will alternate between screening the #0 movie and #1 movie in the given season each year.

The main block of movie data contains the following:

key format description
ID Always null. Purpose unknown.
SheetIndex Determines where the game looks for the movie's scene sprites within LooseSprites\Movies.xnb.
Title The title of the film.
Description The description of the film, seen when interacting with its poster outside of the theater.
Tags A list of genres that apply to the movie, used to calculate an NPC's reaction to a movie. Can be any arbitrary string; the ones currently used in the game are: family, comedy, horror, art, action, sci-fi, classic, romance, and documentary.
Scenes A list of data blocks for the film's scenes. (See below.)

Scenes

The Scenes is a list of blocks, each corresponding to a specific scene in the movie. The blocks are listed in chronological order, and the data of each one is as follows:

key format description
Image Which image to show within the sequence of the movie's sprites in LooseSprites\Movies.xnb.
Music The music track to play during the scene. Can be left blank.
Sound The sound effect to play during the scene. Can be left blank.
MessageDelay How long to hold the scene before displaying any text.
Script Used for special visual/auditory effects. Written in the same format as Modding:Event_data#Event_scripts.
Text The dialogue/narration of the scene.
Shake A boolean value which, if true, adds screen-shake.
ResponsePoint If specified, an NPC's reaction data can reference the scene by this name in order to have a specific, timed reaction to it.
ID An ID for the scene in the format of <season><number>_<index>. <season> and <number> are identical to those values in the ID of the movie itself. <index> is, counting from 0, what number scene this is in the movie.

Movie reactions

Data\MoviesReactions.xnb contains every NPC's taste in movies and their dialogue in response to them. For reference, below is the raw data for Penny's reactions:

Data 
[
  {
    "NPCName": "Penny",
    "Reactions": [
      {
        "Tag": "*",
        "Response": "love",
        "Whitelist": [
          "Pam"
        ],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Watching a movie with mom sure brings me back!"
          },
          "DuringMovie": {
            "ResponsePoint": null,
            "Script": "/message \"(Pam and Penny are watching intently!)\"",
            "Text": ""
          },
          "AfterMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "It's great to be able to do things as a family again!"
          }
        },
        "ID": "reaction_0"
      },
      {
        "Tag": "spring_movie_0",
        "Response": "love",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "I'm looking forward to this! Jas and Vincent have been talking about it non-stop."
          },
          "DuringMovie": {
            "ResponsePoint": "sprout_leave",
            "Script": "/shake Penny 3000/pause 500/message \"Penny seems to be holding back some tears...\"",
            "Text": "Wow, it must be really hard leaving his family like that...$s"
          },
          "AfterMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Thanks for taking me to this, I can't wait to tell the kids how good it was!"
          }
        },
        "ID": "reaction_1"
      },
      {
        "Tag": "spring_movie_0",
        "Response": "love",
        "Whitelist": [],
        "SpecialResponses": null,
        "ID": "reaction_2"
      },
      {
        "Tag": "family",
        "Response": "like",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Oh, '{0}'! This looks wholesome and fun!"
          },
          "DuringMovie": {
            "ResponsePoint": null,
            "Script": "/message \"(Penny is smiling)\"",
            "Text": ""
          },
          "AfterMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "I should totally bring the kids to see this sometime!"
          }
        },
        "ID": "reaction_3"
      },
      {
        "Tag": "comedy",
        "Response": "like",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "I'm excited, I'm in the mood for a good laugh!"
          },
          "DuringMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Did they just...?! Hahahaha!"
          },
          "AfterMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Whew, I've got a cramp from all that laughing...!"
          }
        },
        "ID": "reaction_4"
      },
      {
        "Tag": "horror",
        "Response": "dislike",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "I'm a little nervous... I don't usually watch scary movies.$s"
          },
          "DuringMovie": {
            "ResponsePoint": null,
            "Script": "/shake Penny 3000/pause 500/emote Penny 28",
            "Text": "I can't look...$s"
          },
          "AfterMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "I hope I don't have nightmares tonight!$s"
          }
        },
        "ID": "reaction_5"
      },
      {
        "Tag": "love",
        "Response": "like",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Oooh, I've been dying to see this!"
          },
          "DuringMovie": null,
          "AfterMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Amazing! I hope they make another one!"
          }
        },
        "ID": "reaction_6"
      },
      {
        "Tag": "like",
        "Response": "like",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Hey, I've heard some good things about this one!"
          },
          "DuringMovie": null,
          "AfterMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "That was great! Thanks for seeing this with me!"
          }
        },
        "ID": "reaction_7"
      },
      {
        "Tag": "dislike",
        "Response": "like",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "I can't say I would've picked this one myself, but I'll try to keep an open mind..."
          },
          "DuringMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "..."
          },
          "AfterMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Sorry if I ruined the movie for you, it just wasn't really my favorite..."
          }
        },
        "ID": "reaction_8"
      },
      {
        "Tag": "seen_love",
        "Response": "like",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Ooh, '{0}'! I saw this one with {2}!"
          },
          "DuringMovie": null,
          "AfterMovie": null
        },
        "ID": "reaction_9"
      },
      {
        "Tag": "seen_like",
        "Response": "like",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "I saw this with {2}, it was pretty good!"
          },
          "DuringMovie": null,
          "AfterMovie": null
        },
        "ID": "reaction_10"
      },
      {
        "Tag": "seen_dislike",
        "Response": "like",
        "Whitelist": [],
        "SpecialResponses": {
          "BeforeMovie": {
            "ResponsePoint": null,
            "Script": "",
            "Text": "Hmm, I think {2} took me to see this..."
          },
          "DuringMovie": null,
          "AfterMovie": null
        },
        "ID": "reaction_11"
      }
    ]
  },
  ...
]

Format

Each block of data within the file begins with an NPCName key, which is the name of the NPC to whom the rest of the data in the block will apply. This is followed by a list with the key Reactions. Each block within this list is the data for an NPC's response to a specific type of movie.

The data within each block is formatted as follows:

key format description
Tag Which category of movie this response is for. In decreasing order of specificity, this can be:
  • *, in which case the response will always be applicable, unless there are other restrictions applied by Whitelist
  • a genre of movie, as listed in the Tags field of a film's data
  • the NPC's reaction to a movie, one of love, like, or dislike. Can be prefixed with seen_, in which case the reaction will only apply if the NPC has seen the film before.
  • a specific movie's identifier, as listed at the header of its block. (i.e. spring_movie_0 for "The Brave Little Sapling")
Response One of love, like, or dislike. Used to calculate Friendship points gained with the NPC. A loved movie earns 200 Friendship points with the NPC, a liked movie earns 100 Friendship points, and a disliked movie neither earns nor costs friendship points with the NPC.
Whitelist A list of NPC names. If not empty, the response will only be applicable if, in addition to the movie matching Tag, one of the listed NPCs is also present within the theater. Currently only used for Penny, who has a special reaction to watching a movie if her mother Pam is present.
SpecialResponses Contains the dialogue spoken by an NPC during the film in a series of blocks. (See below.) Can be left null.
ID A unique identifier in the form of reaction_<index>, where <index> is, counting from 0, what number block this is within the Reactions list.

For unknown reasons, in the vanilla game code, when the Tag field is love or dislike, the Responsefield will always be like.

Special responses

Each SpecialResponses block contains 3 blocks, beginning with BeforeMovie, DuringMovie, and AfterMovie, in that order. Any of these blocks may be left null. By default, the dialogue within these blocks triggers when talking to the NPC in the movie theater lobby, at a random point during the movie, and after the movie is finished, respectively. The data within each block is as follows:

key format description
ResponsePoint If not null, this dialogue will trigger at the given response point instead of its regular timing. See Modding:Movie_theater_data#Scenes for an explanation of response points.
Script A script which runs prior to Text being displayed. Written in the same format as Modding:Event_data#Event_scripts.
Text The dialogue spoken by the NPC.

If multiple response blocks are applicable to the movie, the game uses the first non-null Response, BeforeMovie, DuringMovie, and AfterMovie fields it can find. Said data does not necessarily have to come from the same response block. If the game cannot find applicable DuringMovie dialogue, it will use default text from Strings\Characters.xnb. If the game cannot find applicable BeforeMovie or AfterMovie dialogue, the NPC will show as being able to be spoken to, but interacting with them will have no effect.

Concession data

Data\Concessions.xnb contains the data for the food purchased at the concessions stand, stored as a list of blocks. For reference, below is the raw data of the file:

Data 
[
  {
    "Id": "0",
    "Name": "Cotton Candy",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:CottonCandy_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:CottonCandy_Description]",
    "Price": 50,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 0,
    "ItemTags": [
      "Sweet",
      "Candy"
    ]
  },
  {
    "Id": "1",
    "Name": "Jasmine Tea",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:JasmineTea_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:JasmineTea_Description]",
    "Price": 50,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 1,
    "ItemTags": [
      "Drink",
      "Hot",
      "Healthy"
    ]
  },
  {
    "Id": "2",
    "Name": "Joja Cola",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:JojaCola_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:JojaCola_Description]",
    "Price": 40,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 2,
    "ItemTags": [
      "Drink",
      "Cold",
      "Joja"
    ]
  },
  {
    "Id": "3",
    "Name": "Sour Slimes",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:SourSlimes_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:SourSlimes_Description]",
    "Price": 80,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 3,
    "ItemTags": [
      "Sour",
      "Candy"
    ]
  },
  {
    "Id": "4",
    "Name": "Personal Pizza",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:PersonalPizza_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:PersonalPizza_Description]",
    "Price": 150,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 4,
    "ItemTags": [
      "Hot",
      "Fatty"
    ]
  },
  {
    "Id": "5",
    "Name": "Nachos",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:Nachos_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:Nachos_Description]",
    "Price": 100,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 5,
    "ItemTags": [
      "Hot",
      "Salty",
      "Fatty"
    ]
  },
  {
    "Id": "6",
    "Name": "Salmon Burger",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:SalmonBurger_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:SalmonBurger_Description]",
    "Price": 150,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 6,
    "ItemTags": [
      "Sandwich",
      "Burger"
    ]
  },
  {
    "Id": "7",
    "Name": "Ice Cream Sandwich",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:IceCreamSandwich_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:IceCreamSandwich_Description]",
    "Price": 150,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 7,
    "ItemTags": [
      "Sandwich",
      "Sweet",
      "Cold"
    ]
  },
  {
    "Id": "8",
    "Name": "Popcorn",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:Popcorn_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:Popcorn_Description]",
    "Price": 120,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 8,
    "ItemTags": [
      "Hot",
      "Salty"
    ]
  },
  {
    "Id": "9",
    "Name": "Fries",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:Fries_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:Fries_Description]",
    "Price": 100,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 9,
    "ItemTags": [
      "Hot",
      "Salty",
      "Fatty"
    ]
  },
  {
    "Id": "10",
    "Name": "Chocolate Popcorn",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:ChocolatePopcorn_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:ChocolatePopcorn_Description]",
    "Price": 130,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 10,
    "ItemTags": [
      "Hot",
      "Sweet"
    ]
  },
  {
    "Id": "11",
    "Name": "Black Licorice",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:BlackLicorice_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:BlackLicorice_Description]",
    "Price": 25,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 11,
    "ItemTags": null
  },
  {
    "Id": "12",
    "Name": "Star Cookie",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:StarCookie_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:StarCookie_Description]",
    "Price": 150,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 12,
    "ItemTags": [
      "Sweet"
    ]
  },
  {
    "Id": "13",
    "Name": "Jawbreaker",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:Jawbreaker_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:Jawbreaker_Description]",
    "Price": 250,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 13,
    "ItemTags": [
      "Sweet",
      "Candy"
    ]
  },
  {
    "Id": "14",
    "Name": "Salted Peanuts",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:SaltedPeanuts_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:SaltedPeanuts_Description]",
    "Price": 120,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 14,
    "ItemTags": [
      "Salty"
    ]
  },
  {
    "Id": "15",
    "Name": "Hummus Snack Pack",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:HummusSnackPack_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:HummusSnackPack_Description]",
    "Price": 90,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 15,
    "ItemTags": [
      "Healthy"
    ]
  },
  {
    "Id": "16",
    "Name": "Kale Smoothie",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:KaleSmoothie_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:KaleSmoothie_Description]",
    "Price": 120,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 16,
    "ItemTags": [
      "Drink",
      "Healthy"
    ]
  },
  {
    "Id": "17",
    "Name": "Apple Slices",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:AppleSlices_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:AppleSlices_Description]",
    "Price": 100,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 17,
    "ItemTags": [
      "Sweet",
      "Healthy"
    ]
  },
  {
    "Id": "18",
    "Name": "Panzanella Salad",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:PanzanellaSalad_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:PanzanellaSalad_Description]",
    "Price": 200,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 18,
    "ItemTags": [
      "Gourmet",
      "Healthy"
    ]
  },
  {
    "Id": "19",
    "Name": "Truffle Popcorn",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:TrufflePopcorn_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:TrufflePopcorn_Description]",
    "Price": 180,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 19,
    "ItemTags": [
      "Gourmet",
      "Salty"
    ]
  },
  {
    "Id": "20",
    "Name": "Cappuccino Mousse Cake",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:CappuccinoMousseCake_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:CappuccinoMousseCake_Description]",
    "Price": 220,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 20,
    "ItemTags": [
      "Sweet",
      "Gourmet"
    ]
  },
  {
    "Id": "21",
    "Name": "JojaCorn",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:JojaCorn_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:JojaCorn_Description]",
    "Price": 10,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 21,
    "ItemTags": [
      "Joja"
    ]
  },
  {
    "Id": "22",
    "Name": "Stardrop Sorbet",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:StardropSorbet_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:StardropSorbet_Description]",
    "Price": 1250,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 22,
    "ItemTags": [
      "Sweet",
      "Gourmet"
    ]
  },
  {
    "Id": "23",
    "Name": "Rock Candy",
    "DisplayName": "[LocalizedText Strings\\MovieConcessions:RockCandy_Name]",
    "Description": "[LocalizedText Strings\\MovieConcessions:RockCandy_Description]",
    "Price": 90,
    "Texture": "LooseSprites\\Concessions",
    "SpriteIndex": 23,
    "ItemTags": [
      "Sweet",
      "Candy"
    ]
  }
]

Format

Each block within the list corresponds to a single concession. The data for each block is as follows:

key format description
ID A unique string ID to identify this entry.
Name The internal name of the concession.
DisplayName The name of the concession which is displayed to the player in-game.
Description The description of the concession.
Price The price of the concession in data-sort-value="">Gold.pngg.
ItemTags A list of tags which describe the concession, used to determine an NPC's reaction to it. Can be any arbitrary string; the ones currently used in the game are: Sweet, Candy, Drink, Hot, Healthy, Cold, Joja, Sour, Fatty, Salty, Sandwich, Burger, and Gourmet.
Texture The asset name for the texture containing the concession's sprite.
SpriteIndex The index within the Texture for the concession sprite, where 0 is the top-left sprite.

For example, this content pack adds a new 'Pufferchick Pop' concession with a custom image:

{
    "Format": "2.0.0",
    "Changes": [
        {
            "Action": "EditData",
            "Target": "Data/Concessions",
            "Entries": {
                "{{ModId}}_PufferchickPop": {
                    "Id": "{{ModId}}_PufferchickPop",   // must specify ID again when creating a new entry
                    "Name": "{{ModId}}_PufferchickPop", // best practice to match the ID, since it's sometimes used as an alternate ID
                    "DisplayName": "Pufferchick Pop",
                    "Description": "A cute cake pop shaped like a pufferchick.",
                    "Price": 25,
                    "Texture": "{{InternalAssetKey: assets/pufferchick-pop.png}}" // an image in your content pack
                    "SpriteIndex": 0
                }
            }
        }
    ]
}

Concession tastes

Data\ConcessionTastes.xnb contains the data that determines an NPC's opinion of a concession. For reference, below is the raw data of the file:

Data 
[
  {
    "Name": "Penny",
    "LovedTags": [
      "Cotton Candy"
    ],
    "LikedTags": [
      "Sweet"
    ],
    "DislikedTags": [
      "Sour"
    ]
  },
  {
    "Name": "Pam",
    "LovedTags": [
      "Nachos"
    ],
    "LikedTags": [
      "Salty",
      "Fatty",
      "Joja"
    ],
    "DislikedTags": [
      "Healthy",
      "Gourmet"
    ]
  },
  {
    "Name": "George",
    "LovedTags": [
      "Black Licorice"
    ],
    "LikedTags": [
      "Salty"
    ],
    "DislikedTags": [
      "Sweet",
      "Healthy"
    ]
  },
  {
    "Name": "Alex",
    "LovedTags": [
      "Salmon Burger"
    ],
    "LikedTags": [
      "Salty",
      "Hot"
    ],
    "DislikedTags": [
      "Candy"
    ]
  },
  {
    "Name": "Evelyn",
    "LovedTags": [
      "Cappuccino Mousse Cake",
      "Star Cookie"
    ],
    "LikedTags": [
      "Sweet"
    ],
    "DislikedTags": [
      "Salty",
      "Hot"
    ]
  },
  {
    "Name": "Pierre",
    "LovedTags": [
      "Personal Pizza"
    ],
    "LikedTags": [
      "Hot"
    ],
    "DislikedTags": [
      "Joja"
    ]
  },
  {
    "Name": "Abigail",
    "LovedTags": [
      "Rock Candy"
    ],
    "LikedTags": [
      "Candy",
      "Sweet"
    ],
    "DislikedTags": [
      "Healthy"
    ]
  },
  {
    "Name": "Caroline",
    "LovedTags": [
      "Truffle Popcorn",
      "Jasmine Tea"
    ],
    "LikedTags": [
      "Healthy"
    ],
    "DislikedTags": [
      "Fatty",
      "Candy"
    ]
  },
  {
    "Name": "Harvey",
    "LovedTags": [
      "Apple Slices",
      "Jasmine Tea"
    ],
    "LikedTags": [
      "Healthy",
      "Gourmet"
    ],
    "DislikedTags": [
      "Sweet",
      "Fatty",
      "Salty"
    ]
  },
  {
    "Name": "Gus",
    "LovedTags": [
      "Gourmet"
    ],
    "LikedTags": [
      "Sandwich"
    ],
    "DislikedTags": [
      "Healthy",
      "Candy"
    ]
  },
  {
    "Name": "Lewis",
    "LovedTags": [
      "Jasmine Tea"
    ],
    "LikedTags": [
      "Sweet",
      "Popcorn"
    ],
    "DislikedTags": [
      "Candy"
    ]
  },
  {
    "Name": "Jodi",
    "LovedTags": [
      "Chocolate Popcorn"
    ],
    "LikedTags": [
      "Fatty",
      "Hot",
      "Salty"
    ],
    "DislikedTags": [
      "Candy",
      "Truffle Popcorn",
      "Healthy"
    ]
  },
  {
    "Name": "Sam",
    "LovedTags": [
      "Personal Pizza"
    ],
    "LikedTags": [
      "Joja Cola",
      "Candy"
    ],
    "DislikedTags": [
      "Healthy",
      "Gourmet"
    ]
  },
  {
    "Name": "Vincent",
    "LovedTags": [
      "Jawbreaker"
    ],
    "LikedTags": [
      "Sweet",
      "Candy"
    ],
    "DislikedTags": [
      "Healthy",
      "Gourmet"
    ]
  },
  {
    "Name": "Kent",
    "LovedTags": [
      "Popcorn"
    ],
    "LikedTags": [
      "Salty"
    ],
    "DislikedTags": [
      "Candy"
    ]
  },
  {
    "Name": "Clint",
    "LovedTags": [
      "Fries"
    ],
    "LikedTags": [
      "Fatty"
    ],
    "DislikedTags": [
      "Healthy"
    ]
  },
  {
    "Name": "Emily",
    "LovedTags": [
      "Kale Smoothie"
    ],
    "LikedTags": [
      "Healthy",
      "Gourmet"
    ],
    "DislikedTags": [
      "Fatty",
      "Salty"
    ]
  },
  {
    "Name": "Haley",
    "LovedTags": [
      "Cappuccino Mousse Cake"
    ],
    "LikedTags": [
      "Sweet"
    ],
    "DislikedTags": [
      "Fatty",
      "Salty"
    ]
  },
  {
    "Name": "Maru",
    "LovedTags": [
      "Star Cookie"
    ],
    "LikedTags": [
      "Fatty",
      "Sweet"
    ],
    "DislikedTags": [
      "Cold"
    ]
  },
  {
    "Name": "Sebastian",
    "LovedTags": [
      "Jasmine Tea"
    ],
    "LikedTags": [
      "Apple Slices",
      "Salty",
      "Hot"
    ],
    "DislikedTags": [
      "Gourmet",
      "Kale Smoothie"
    ]
  },
  {
    "Name": "Robin",
    "LovedTags": [
      "Salted Peanuts"
    ],
    "LikedTags": [
      "Salty",
      "Fatty"
    ],
    "DislikedTags": [
      "Candy"
    ]
  },
  {
    "Name": "Demetrius",
    "LovedTags": [
      "Popcorn"
    ],
    "LikedTags": [
      "Sweet"
    ],
    "DislikedTags": [
      "Healthy"
    ]
  },
  {
    "Name": "Linus",
    "LovedTags": [
      "Salmon Burger"
    ],
    "LikedTags": [
      "Healthy",
      "Gourmet"
    ],
    "DislikedTags": [
      "Joja"
    ]
  },
  {
    "Name": "Dwarf",
    "LovedTags": [
      "Rock Candy"
    ],
    "LikedTags": [
      "Candy"
    ],
    "DislikedTags": [
      "Hot",
      "Healthy",
      "Gourmet",
      "Salty",
      "Fatty"
    ]
  },
  {
    "Name": "Krobus",
    "LovedTags": [
      "Black Licorice"
    ],
    "LikedTags": [],
    "DislikedTags": [
      "Sweet",
      "Stardrop Sorbet"
    ]
  },
  {
    "Name": "Wizard",
    "LovedTags": [
      "Black Licorice",
      "Star Cookie"
    ],
    "LikedTags": [
      "Jasmine Tea",
      "Candy"
    ],
    "DislikedTags": [
      "Hot",
      "Healthy",
      "Gourmet",
      "Salty",
      "Fatty"
    ]
  },
  {
    "Name": "Marnie",
    "LovedTags": [
      "Ice Cream Sandwich"
    ],
    "LikedTags": [
      "Sweet",
      "Popcorn"
    ],
    "DislikedTags": [
      "Salty"
    ]
  },
  {
    "Name": "Shane",
    "LovedTags": [
      "Personal Pizza",
      "Nachos",
      "Joja",
      "Hummus Snack Pack"
    ],
    "LikedTags": [
      "Fatty"
    ],
    "DislikedTags": [
      "Gourmet",
      "Apple Slices",
      "Kale Smoothie"
    ]
  },
  {
    "Name": "Jas",
    "LovedTags": [
      "Sour Slimes"
    ],
    "LikedTags": [
      "Sweet",
      "Candy"
    ],
    "DislikedTags": [
      "Healthy",
      "Gourmet",
      "Salty"
    ]
  },
  {
    "Name": "Leah",
    "LovedTags": [
      "Panzanella Salad"
    ],
    "LikedTags": [
      "Healthy",
      "Gourmet"
    ],
    "DislikedTags": [
      "Fatty",
      "Salty"
    ]
  },
  {
    "Name": "Sandy",
    "LovedTags": [
      "Cotton Candy"
    ],
    "LikedTags": [
      "Gourmet",
      "Sweet"
    ],
    "DislikedTags": [
      "Candy"
    ]
  },
  {
    "Name": "Elliott",
    "LovedTags": [
      "Truffle Popcorn",
      "Cappuccino Mousse Cake"
    ],
    "LikedTags": [
      "Gourmet",
      "Healthy"
    ],
    "DislikedTags": [
      "Candy",
      "Fatty",
      "Salty"
    ]
  },
  {
    "Name": "Willy",
    "LovedTags": [
      "Salmon Burger"
    ],
    "LikedTags": [
      "Hot",
      "Fatty",
      "Salty"
    ],
    "DislikedTags": [
      "Candy",
      "Healthy",
      "Gourmet"
    ]
  },
  {
    "Name": "*",
    "LovedTags": [
      "Stardrop Sorbet"
    ],
    "LikedTags": [],
    "DislikedTags": [
      "Black Licorice",
      "Joja"
    ]
  }
]

Format

Each block within the list has the following data:

key format description
Name Who this block should apply to. Can be the name of an NPC or *, in which case the tastes will apply to every NPC.
LovedTags
LikedTags
DislikedTags
A list of concession tags that are loved, liked, or disliked. This can be an ItemTag, or the internal name of a specific concession. To determine an NPC's opinion of a concession, the game totals how many tags from each group apply, with LovedTags and LikedTags contributing a positive score and DislikedTags contributing a negative. Purchasing a loved snack earns 50 Friendship points with the NPC, a liked snack earns 25 Friendship points, and a disliked snack neither earns nor costs friendship points with the NPC.