Modding:Movie theater data: Difference between revisions
imported>OmegaFallon |
imported>Margotbean RU link |
||
| (40 intermediate revisions by 7 users not shown) | |||
| Line 1: | Line 1: | ||
← [[Modding:Index|Index]] | ← [[Modding:Index|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. | 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 == | ==Movie data== | ||
<samp>Data\Movies.xnb</samp> 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": | <samp>Data\Movies.xnb</samp> 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" as of {{version|1.6.15}}: | ||
{{collapse| | {{collapse|data|content=<syntaxhighlight lang="json"> | ||
{ | { | ||
"spring_movie_0": | "Id": "spring_movie_0", | ||
" | "Seasons": [ | ||
"Spring" | |||
], | |||
"YearModulus": 2, | |||
" | "YearRemainder": 0, | ||
" | "Texture": null, | ||
" | "SheetIndex": 0, | ||
], | "Title": "[LocalizedText Strings\\Movies:BraveLittleSapling_Title]", | ||
"Description": "[LocalizedText Strings\\Movies:BraveLittleSapling_Description]", | |||
"Tags": [ | |||
"family", | |||
"comedy" | |||
], | |||
"CranePrizes": [ | |||
{ | |||
"Rarity": 1, | |||
"Condition": null, | |||
"Id": "MoviePoster", | |||
"ItemId": "(F)1952", | |||
"RandomItemId": null, | |||
"MaxItems": null, | |||
"MinStack": -1, | |||
"MaxStack": -1, | |||
"Quality": -1, | |||
"ObjectInternalName": null, | |||
"ObjectDisplayName": null, | |||
"ObjectColor": null, | |||
"ToolUpgradeLevel": -1, | |||
"IsRecipe": false, | |||
"StackModifiers": null, | |||
"StackModifierMode": "Stack", | |||
"QualityModifiers": null, | |||
"QualityModifierMode": "Stack", | |||
"ModData": null, | |||
"PerItemCondition": null | |||
} | |||
], | |||
"ClearDefaultCranePrizeGroups": [], | |||
"Scenes": [ | |||
{ | |||
"Image": 0, | |||
"Music": "sweet", | |||
"Sound": null, | |||
"MessageDelay": 1000, | |||
"Script": null, | |||
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene1]", | |||
"Shake": false, | |||
"ResponsePoint": null, | |||
"Id": "spring0_0" | |||
}, | |||
{ | |||
"Image": 1, | |||
"Music": null, | |||
"Sound": null, | |||
"MessageDelay": 500, | |||
"Script": null, | |||
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene2]", | |||
"Shake": false, | |||
"ResponsePoint": null, | |||
"Id": "spring0_1" | |||
}, | |||
{ | |||
"Image": 6, | |||
"Music": null, | |||
"Sound": null, | |||
"MessageDelay": 500, | |||
"Script": "/playSound dustMeep/pause 200/playSound dustMeep/pause 300/playSound dustMeep/pause 100/playSound dustMeep/pause 200/playSound dustMeep", | |||
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene3]", | |||
"Shake": false, | |||
"ResponsePoint": "sprout_leave", | |||
"Id": "spring0_2" | |||
}, | |||
{ | |||
"Image": 2, | |||
"Music": "rain", | |||
"Sound": null, | |||
"MessageDelay": 500, | |||
"Script": null, | |||
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene4]", | |||
"Shake": false, | |||
"ResponsePoint": "", | |||
"Id": "spring0_3" | |||
}, | |||
{ | |||
"Image": 3, | |||
"Music": null, | |||
"Sound": "thunder", | |||
"MessageDelay": 1000, | |||
"Script": null, | |||
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene5]", | |||
"Shake": false, | |||
"ResponsePoint": "", | |||
"Id": "spring0_4" | |||
}, | |||
{ | |||
"Image": 4, | |||
"Music": "echos", | |||
"Sound": null, | |||
"MessageDelay": 500, | |||
"Script": null, | |||
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene6]", | |||
"Shake": false, | |||
"ResponsePoint": null, | |||
"Id": "spring0_5" | |||
}, | |||
{ | |||
"Image": 5, | |||
"Music": null, | |||
"Sound": null, | |||
"MessageDelay": 500, | |||
"Script": "/playSound coin/pause 1000/message \"[LocalizedText Strings\\Movies:BraveLittleSapling_Scene7]\"", | |||
"Text": null, | |||
"Shake": false, | |||
"ResponsePoint": "", | |||
"Id": "spring0_6" | |||
}, | |||
{ | |||
"Image": 7, | |||
"Music": null, | |||
"Sound": null, | |||
"MessageDelay": 2000, | |||
"Script": null, | |||
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene8]", | |||
"Shake": false, | |||
"ResponsePoint": null, | |||
"Id": "spring0_7" | |||
} | |||
], | |||
"CustomFields": null | |||
} | } | ||
</syntaxhighlight>}} | </syntaxhighlight>}} | ||
===Format=== | ===Format=== | ||
The <samp>Data/Movies</samp> asset is a list of models, which have the following fields: | |||
{| class="wikitable" | {| class="wikitable" | ||
| Line 124: | Line 149: | ||
! description | ! description | ||
|- | |- | ||
| <samp>ID</samp> | | <samp>Id</samp> | ||
| | | A [[Modding:Common data field types#Unique string ID|unique string ID]] which identifies this movie. This should only contain alphanumeric/underscore/dot characters. | ||
|- | |||
| <samp>Seasons</samp> | |||
| ''(Optional)'' The seasons when the movie should play, or omit for any season. For example: | |||
<syntaxhighlight lang="json">"Seasons": [ "Spring", "Summer" ]</syntaxhighlight> | |||
|- | |||
| <samp>YearModulus</samp><br /><samp>YearRemainder</samp> | |||
| ''(Optional)'' If set, plays the movie on alternating years based on the formula <samp>theater_age % modulus == remainder</samp>, where <samp>theater_age</samp> is the number of years since the movie theater was built. If omitted, the movie plays in any year. | |||
For example: | |||
<syntaxhighlight lang="json"> | |||
// play in the first year, and every second year thereafter | |||
"YearModulus": 2, | |||
"YearRemainder": 0 | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="json"> | |||
// play in the second year, and every second year thereafter | |||
"YearModulus": 2, | |||
"YearRemainder": 1 | |||
</syntaxhighlight> | |||
|- | |||
| <samp>Texture</samp> | |||
| ''(Optional)'' The asset name for the movie poster and screen images, or omit to use <samp>LooseSprites\Movies</samp>. | |||
This must be a spritesheet with one 490×128 pixel row per movie. A 13×19 area in the top-left corner of the row should contain the movie poster. With a 16-pixel offset from the left edge, there should be two rows of five 90×61 pixel movie screen images, with a six-pixel gap between each image. (The movie doesn't need to use all of the image slots.) | |||
|- | |- | ||
| <samp>SheetIndex</samp> | | <samp>SheetIndex</samp> | ||
| Determines where the game looks for the movie's scene sprites within <samp>LooseSprites\Movies.xnb</samp>. | | Determines where the game looks for the movie's scene sprites within <samp>LooseSprites\Movies.xnb</samp>. This includes the movie poster and screen images for the movie. | ||
|- | |- | ||
| <samp>Title</samp> | | <samp>Title</samp> | ||
| | | A [[Modding:Tokenizable strings|tokenizable string]] for the title of the film. | ||
|- | |- | ||
| <samp>Description</samp> | | <samp>Description</samp> | ||
| | | A [[Modding:Tokenizable strings|tokenizable string]] for the description of the film, seen when interacting with its poster outside of the theater. | ||
|- | |- | ||
| <samp>Tags</samp> | | <samp>Tags</samp> | ||
| 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: <samp>family</samp>, <samp>comedy</samp>, <samp>horror</samp>, <samp>art</samp>, <samp>action</samp>, <samp>sci-fi</samp>, <samp>classic</samp>, <samp>romance</samp>, and <samp>documentary</samp>. | | 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: <samp>family</samp>, <samp>comedy</samp>, <samp>horror</samp>, <samp>art</samp>, <samp>action</samp>, <samp>sci-fi</samp>, <samp>classic</samp>, <samp>romance</samp>, and <samp>documentary</samp>. | ||
|- | |||
| <samp>CranePrizes</samp> | |||
| ''(Optional)'' The items to add to the [[Movie Theater#Crane Game|crane game]] prize pool on days when this movie is playing, if any. | |||
This consists of a list of models with these fields: | |||
{| class="wikitable" | |||
|- | |||
! field | |||
! effect | |||
|- | |||
| ''common fields'' | |||
| See [[Modding:Item queries#Item spawn fields|item spawn fields]] for the generic item fields supported for crane game items. | |||
If set to an [[Modding:Item queries|item query]] which returns multiple items, one of them will be selected at random. | |||
|- | |||
| <samp>Rarity</samp> | |||
| ''(Optional)'' The prize pool to add the item to. The possible values are <samp>1</samp> (common), <samp>2</samp> (rare), and <samp>3</samp> (deluxe). Default <samp>1</samp>. | |||
|} | |||
|- | |||
| <samp>ClearDefaultCranePrizeGroups</samp> | |||
| ''(Optional)'' The prize pools whose default items to discard, so only those specified by <samp>CranePrizes</samp> are available. Default none. | |||
For example: | |||
<syntaxhighlight lang="json">"ClearDefaultCranePrizeGroups": [ 2, 3 ]</syntaxhighlight> | |||
|- | |- | ||
| <samp>Scenes</samp> | | <samp>Scenes</samp> | ||
| Line 164: | Line 238: | ||
|- | |- | ||
| <samp>Script</samp> | | <samp>Script</samp> | ||
| Used for special visual/auditory effects. Written in the same format as [[Modding: | | Used for special visual/auditory effects. Written in the same format as [[Modding:Event data#Event scripts|event scripts]]. Supports [[Modding:Tokenizable strings|tokenizable strings]]. | ||
|- | |- | ||
| <samp>Text</samp> | | <samp>Text</samp> | ||
| The dialogue/narration of the scene. | | The dialogue/narration of the scene. Supports [[Modding:Tokenizable strings|tokenizable strings]]. | ||
|- | |- | ||
| <samp>Shake</samp> | | <samp>Shake</samp> | ||
| Line 179: | Line 253: | ||
|} | |} | ||
For example, this content pack adds a new 'Pufferchick II' movie which plays in winter every third year: | |||
< | {{Content Patcher example|<nowiki> | ||
"Changes": [ | |||
{ | |||
"Action": "EditData", | |||
"Target": "Data/Movies", | |||
"Entries": { | |||
"{{ModId}}_PufferchickII": { | |||
"Id": "{{ModId}}_PufferchickII", // must specify ID again when creating a new entry | |||
{{collapse| | "Seasons": [ "winter" ], | ||
"YearModulus": 3, | |||
"YearRemainder": 0, | |||
"Title": "Pufferchick II", // display text should usually use {{i18n}} for translations in actual usage | |||
"Description": "A sequel to the breakthrough adventure anime Pufferchick. The world is saved; what happens next?", | |||
"Tags": [ "family", "adventure" ], | |||
"Texture": "{{InternalAssetKey: assets/movie.png}}", // an image in your content pack | |||
"SheetIndex": 0, | |||
"Scenes": [ ... ] | |||
} | |||
} | |||
} | |||
] | |||
</nowiki>}} | |||
==Movie reactions== | |||
<samp>Data\MoviesReactions.xnb</samp> 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 as of {{version|1.6.15}}: | |||
{{collapse|data|content=<syntaxhighlight lang="json"> | |||
[ | [ | ||
{ | { | ||
| Line 196: | Line 298: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_*_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": { | "DuringMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": "/message \" | "Script": "/message \"[LocalizedText Strings\\MovieReactions:Penny_*_DuringMovie]\"", | ||
"Text": | "Text": null | ||
}, | }, | ||
"AfterMovie": { | "AfterMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_*_AfterMovie]" | ||
} | } | ||
}, | }, | ||
" | "Id": "reaction_0" | ||
}, | }, | ||
{ | { | ||
| Line 219: | Line 321: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_spring_movie_0_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": { | "DuringMovie": { | ||
"ResponsePoint": "sprout_leave", | "ResponsePoint": "sprout_leave", | ||
"Script": "/shake Penny 3000/pause 500/message \" | "Script": "/shake Penny 3000/pause 500/message \"[LocalizedText Strings\\MovieReactions:Penny_spring_movie_0_DuringMovie_2]\"", | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_spring_movie_0_DuringMovie]" | ||
}, | }, | ||
"AfterMovie": { | "AfterMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_spring_movie_0_AfterMovie]" | ||
} | } | ||
}, | }, | ||
" | "Id": "reaction_1" | ||
}, | }, | ||
{ | { | ||
| Line 240: | Line 342: | ||
"Whitelist": [], | "Whitelist": [], | ||
"SpecialResponses": null, | "SpecialResponses": null, | ||
" | "Id": "reaction_2" | ||
}, | }, | ||
{ | { | ||
| Line 249: | Line 351: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_family_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": { | "DuringMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": "/message \" | "Script": "/message \"[LocalizedText Strings\\MovieReactions:Penny_family_DuringMovie]\"", | ||
"Text": | "Text": null | ||
}, | }, | ||
"AfterMovie": { | "AfterMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_family_AfterMovie]" | ||
} | } | ||
}, | }, | ||
" | "Id": "reaction_3" | ||
}, | }, | ||
{ | { | ||
| Line 272: | Line 374: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_comedy_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": { | "DuringMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_comedy_DuringMovie]" | ||
}, | }, | ||
"AfterMovie": { | "AfterMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_comedy_AfterMovie]" | ||
} | } | ||
}, | }, | ||
" | "Id": "reaction_4" | ||
}, | }, | ||
{ | { | ||
| Line 295: | Line 397: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_horror_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": { | "DuringMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": "/shake Penny 3000/pause 500/emote Penny 28", | "Script": "/shake Penny 3000/pause 500/emote Penny 28", | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_horror_DuringMovie]" | ||
}, | }, | ||
"AfterMovie": { | "AfterMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_horror_AfterMovie]" | ||
} | } | ||
}, | }, | ||
" | "Id": "reaction_5" | ||
}, | }, | ||
{ | { | ||
| Line 318: | Line 420: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_love_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": null, | "DuringMovie": null, | ||
"AfterMovie": { | "AfterMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_love_AfterMovie]" | ||
} | } | ||
}, | }, | ||
" | "Id": "reaction_6" | ||
}, | }, | ||
{ | { | ||
| Line 337: | Line 439: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_like_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": null, | "DuringMovie": null, | ||
"AfterMovie": { | "AfterMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_like_AfterMovie]" | ||
} | } | ||
}, | }, | ||
" | "Id": "reaction_7" | ||
}, | }, | ||
{ | { | ||
| Line 356: | Line 458: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_dislike_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": { | "DuringMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_dislike_DuringMovie]" | ||
}, | }, | ||
"AfterMovie": { | "AfterMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_dislike_AfterMovie]" | ||
} | } | ||
}, | }, | ||
" | "Id": "reaction_8" | ||
}, | }, | ||
{ | { | ||
| Line 379: | Line 481: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_seen_love_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": null, | "DuringMovie": null, | ||
"AfterMovie": null | "AfterMovie": null | ||
}, | }, | ||
" | "Id": "reaction_9" | ||
}, | }, | ||
{ | { | ||
| Line 394: | Line 496: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_seen_like_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": null, | "DuringMovie": null, | ||
"AfterMovie": null | "AfterMovie": null | ||
}, | }, | ||
" | "Id": "reaction_10" | ||
}, | }, | ||
{ | { | ||
| Line 409: | Line 511: | ||
"BeforeMovie": { | "BeforeMovie": { | ||
"ResponsePoint": null, | "ResponsePoint": null, | ||
"Script": | "Script": null, | ||
"Text": " | "Text": "[LocalizedText Strings\\MovieReactions:Penny_seen_dislike_BeforeMovie]" | ||
}, | }, | ||
"DuringMovie": null, | "DuringMovie": null, | ||
"AfterMovie": null | "AfterMovie": null | ||
}, | }, | ||
" | "Id": "reaction_11" | ||
} | } | ||
] | ] | ||
| Line 424: | Line 526: | ||
===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. | ||
The data within each block is formatted as follows: | |||
{| class="wikitable" | {| class="wikitable" | ||
| Line 432: | Line 536: | ||
|- | |- | ||
| <samp>Tag</samp> | | <samp>Tag</samp> | ||
| Which category of movie this response is for. In decreasing order of specificity, this can be: <samp>*</samp>, in which case the response will always be applicable, unless | | Which category of movie this response is for. In decreasing order of specificity, this can be: | ||
* <samp>*</samp>, in which case the response will always be applicable, unless there are other restrictions applied by <samp>Whitelist</samp> | |||
* a genre of movie, as listed in the <samp>Tags</samp> field of a film's data | |||
* the NPC's reaction to a movie, one of <samp>love</samp>, <samp>like</samp>, or <samp>dislike</samp>. | |||
* a specific movie's identifier, as listed at the header of its block. (i.e. <samp>spring_movie_0</samp> for "The Brave Little Sapling") | |||
|- | |- | ||
| <samp>Response</samp> | | <samp>Response</samp> | ||
| One of <samp>love</samp>, <samp>like</samp>, or <samp> | | One of <samp>love</samp>, <samp>like</samp>, <samp>dislike</samp>, or <samp>reject</samp>. 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. Rejected movies will turn down the ticket and say their line for [[Modding:Dialogue#Item_dialogue|RejectMovieTicket_DontWantToSeeThatMovie]]. | ||
|- | |- | ||
| <samp>Whitelist</samp> | | <samp>Whitelist</samp> | ||
| A list of NPC names. If not empty, the response will only | | A list of NPC names. If not empty, the response will only be applicable if, in addition to the movie matching <samp>Tag</samp>, 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. | ||
|- | |- | ||
| <samp>SpecialResponses</samp> | | <samp>SpecialResponses</samp> | ||
| Contains the dialogue spoken by an NPC during the film in a series of blocks. (See below.) | | Contains the dialogue spoken by an NPC during the film in a series of blocks. (See below.) Can be left null. | ||
|- | |- | ||
| <samp>ID</samp> | | <samp>ID</samp> | ||
| Line 448: | Line 556: | ||
|} | |} | ||
==== Special responses ==== | 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>. | ||
Each <samp>SpecialResponses</samp> block contains 3 blocks, beginning with <samp>BeforeMovie</samp>, <samp>DuringMovie</samp>, and <samp>AfterMovie</samp>, in that order. By default, the dialogue within these blocks triggers | |||
====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 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 457: | Line 567: | ||
|- | |- | ||
| <samp>ResponsePoint</samp> | | <samp>ResponsePoint</samp> | ||
| 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. | | If not null, this dialogue will trigger at the given response point instead of its regular timing. See the [[Modding:Movie_theater_data#Scenes|scenes field documentation]] for an explanation of response points. | ||
|- | |- | ||
| <samp>Script</samp> | | <samp>Script</samp> | ||
| A script which runs prior to <samp>Text</samp> being displayed. Written in the same format as [[Modding:Event_data#Event_scripts]]. | | A script which runs prior to <samp>Text</samp> being displayed. Written in the same format as [[Modding:Event_data#Event_scripts|event scripts]]. | ||
|- | |- | ||
| <samp>Text</samp> | | <samp>Text</samp> | ||
| The dialogue spoken by the NPC. | | The dialogue spoken by the NPC. Supports [[Modding:Tokenizable strings|tokenizable strings]]. | ||
|} | |||
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. | |||
===Movie Identifiers=== | |||
{|class="wikitable" | |||
!key | |||
!movie title | |||
|- | |||
|spring_movie_0 || [[Movie Theater#Movies|The Brave Little Sapling]] | |||
|- | |||
|summer_movie_0 || [[Movie Theater#Movies|Journey Of The Prairie King: The Motion Picture]] | |||
|- | |||
|fall_movie_0 || [[Movie Theater#Movies|Mysterium]] | |||
|- | |||
|winter_movie_0 || [[Movie Theater#Movies|The Miracle At Coldstar Ranch]] | |||
|- | |||
|spring_movie_1 || [[Movie Theater#Movies|Natural Wonders: Exploring Our Vibrant World]] | |||
|- | |||
|summer_movie_1 || [[Movie Theater#Movies|Wumbus]] | |||
|- | |||
|fall_movie_1 || [[Movie Theater#Movies|It Howls In The Rain]] | |||
|- | |||
|winter_movie_1 || [[Movie Theater#Movies|The Zuzu City Express]] | |||
|} | |||
==Concession data== | |||
<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 as of {{version|1.6.15}}: | |||
{{collapse|data|content=<syntaxhighlight lang="json"> | |||
[ | |||
{ | |||
"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" | |||
] | |||
} | |||
] | |||
</syntaxhighlight>}} | |||
===Format=== | |||
Each block within the list corresponds to a single concession. The data for each block is as follows: | |||
{| class="wikitable" | |||
|- | |||
! key format | |||
! description | |||
|- | |||
| <samp>ID</samp> | |||
| A [[Modding:Common_data_field_types#Unique_string_ID|unique string ID]] to identify this entry. | |||
|- | |||
| <samp>Name</samp> | |||
| The internal name of the concession. | |||
|- | |||
| <samp>DisplayName</samp> | |||
| A [[Modding:Tokenizable strings|tokenizable string]] for the name of the concession, which is displayed to the player in-game. | |||
|- | |||
| <samp>Description</samp> | |||
| A [[Modding:Tokenizable strings|tokenizable string]] for the description of the concession. | |||
|- | |||
| <samp>Price</samp> | |||
| The price of the concession in {{price|}}. | |||
|- | |||
| <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>. | |||
|- | |||
| <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. | |||
|} | |} | ||
== Concession data == | For example, this content pack adds a new 'Pufferchick Pop' concession with a custom image: | ||
{{Content Patcher example|<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>}} | |||
==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 tags=== | |||
Black Licorice is the only item that doesn't have specific concession tags attached to it. Stardrop Sorbet is a universally loved item, whereas Black Licorice, Joja Cola, and JojaCorn are universally disliked items. | |||
{| class="wikitable" | |||
|- | |||
! tag | |||
! applicable concessions | |||
|- | |||
| <samp>Burger</samp> | |||
| Salmon Burger | |||
|- | |||
| <samp>Candy</samp> | |||
| Cotton Candy<br />Jawbreaker<br />Rock Candy<br />Sour Slimes | |||
|- | |||
| <samp>Cold</samp> | |||
| Ice Cream Sandwich<br />Joja Cola | |||
|- | |||
| <samp>Drink</samp> | |||
| Jasmine Tea<br />Joja Cola<br />Kale Smoothie | |||
|- | |||
| <samp>Fatty</samp> | |||
| Fries<br />Nachos<br />Personal Pizza | |||
|- | |||
| <samp>Gourmet</samp> | |||
| Cappuccino Mousse Cake<br />Panzanella Salad<br />Stardrop Sorbet<br />Truffle Popcorn | |||
|- | |||
| <samp>Healthy</samp> | |||
| Apple Slices<br />Hummus Snack pack<br />Jasmine Tea<br />Kale Smoothie<br />Panzanella Salad | |||
|- | |||
| <samp>Hot</samp> | |||
| Chocolate Popcorn<br />Fries<br />Jasmine Tea<br />Nachos<br />Personal Pizza<br />Popcorn | |||
|- | |||
| <samp>Joja</samp> | |||
| Joja Cola<br />JojaCorn | |||
|- | |||
| <samp>Salty</samp> | |||
| Fries<br />Nachos<br />Popcorn<br />Salted Peanuts<br />Truffle Popcorn | |||
|- | |||
| <samp>Sandwich</samp> | |||
| Ice Cream Sandwich<br />Salmon Burger | |||
|- | |||
| <samp>Sour</samp> | |||
| Sour Slimes | |||
|- | |||
| <samp>Sweet</samp> | |||
| Apple Slices<br />Cappuccino Mousse Cake<br />Chocolate Popcorn<br />Cotton Candy<br />Ice Cream Sandwich<br />Jawbreaker<br />Rock Candy<br />Star Cookie<br />Stardrop Sorbet | |||
|} | |||
==Movie selection== | |||
Since the <samp>Data/Movies</samp> asset is a list, its order determines the order movies are shown within a season. If multiple movies can play in the same season, each movie will be shown for an equal block of days within the month (e.g. four movies will each play for seven consecutive days). If there are more movies than days, 28 movies will be chosen at random to play that month. | |||
[[Category:Modding]] | |||
[[ru:Модификации:Кинотеатр]] | |||
[[zh:模组:电影院数据]] | |||
Latest revision as of 16:31, 4 March 2026
← 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" as of 1.6.15:
| data |
{
"Id": "spring_movie_0",
"Seasons": [
"Spring"
],
"YearModulus": 2,
"YearRemainder": 0,
"Texture": null,
"SheetIndex": 0,
"Title": "[LocalizedText Strings\\Movies:BraveLittleSapling_Title]",
"Description": "[LocalizedText Strings\\Movies:BraveLittleSapling_Description]",
"Tags": [
"family",
"comedy"
],
"CranePrizes": [
{
"Rarity": 1,
"Condition": null,
"Id": "MoviePoster",
"ItemId": "(F)1952",
"RandomItemId": null,
"MaxItems": null,
"MinStack": -1,
"MaxStack": -1,
"Quality": -1,
"ObjectInternalName": null,
"ObjectDisplayName": null,
"ObjectColor": null,
"ToolUpgradeLevel": -1,
"IsRecipe": false,
"StackModifiers": null,
"StackModifierMode": "Stack",
"QualityModifiers": null,
"QualityModifierMode": "Stack",
"ModData": null,
"PerItemCondition": null
}
],
"ClearDefaultCranePrizeGroups": [],
"Scenes": [
{
"Image": 0,
"Music": "sweet",
"Sound": null,
"MessageDelay": 1000,
"Script": null,
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene1]",
"Shake": false,
"ResponsePoint": null,
"Id": "spring0_0"
},
{
"Image": 1,
"Music": null,
"Sound": null,
"MessageDelay": 500,
"Script": null,
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene2]",
"Shake": false,
"ResponsePoint": null,
"Id": "spring0_1"
},
{
"Image": 6,
"Music": null,
"Sound": null,
"MessageDelay": 500,
"Script": "/playSound dustMeep/pause 200/playSound dustMeep/pause 300/playSound dustMeep/pause 100/playSound dustMeep/pause 200/playSound dustMeep",
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene3]",
"Shake": false,
"ResponsePoint": "sprout_leave",
"Id": "spring0_2"
},
{
"Image": 2,
"Music": "rain",
"Sound": null,
"MessageDelay": 500,
"Script": null,
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene4]",
"Shake": false,
"ResponsePoint": "",
"Id": "spring0_3"
},
{
"Image": 3,
"Music": null,
"Sound": "thunder",
"MessageDelay": 1000,
"Script": null,
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene5]",
"Shake": false,
"ResponsePoint": "",
"Id": "spring0_4"
},
{
"Image": 4,
"Music": "echos",
"Sound": null,
"MessageDelay": 500,
"Script": null,
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene6]",
"Shake": false,
"ResponsePoint": null,
"Id": "spring0_5"
},
{
"Image": 5,
"Music": null,
"Sound": null,
"MessageDelay": 500,
"Script": "/playSound coin/pause 1000/message \"[LocalizedText Strings\\Movies:BraveLittleSapling_Scene7]\"",
"Text": null,
"Shake": false,
"ResponsePoint": "",
"Id": "spring0_6"
},
{
"Image": 7,
"Music": null,
"Sound": null,
"MessageDelay": 2000,
"Script": null,
"Text": "[LocalizedText Strings\\Movies:BraveLittleSapling_Scene8]",
"Shake": false,
"ResponsePoint": null,
"Id": "spring0_7"
}
],
"CustomFields": null
}
|
Format
The Data/Movies asset is a list of models, which have the following fields:
| key format | description | ||||||
|---|---|---|---|---|---|---|---|
| Id | A unique string ID which identifies this movie. This should only contain alphanumeric/underscore/dot characters. | ||||||
| Seasons | (Optional) The seasons when the movie should play, or omit for any season. For example:
"Seasons": [ "Spring", "Summer" ]
| ||||||
| YearModulus YearRemainder |
(Optional) If set, plays the movie on alternating years based on the formula theater_age % modulus == remainder, where theater_age is the number of years since the movie theater was built. If omitted, the movie plays in any year.
For example: // play in the first year, and every second year thereafter
"YearModulus": 2,
"YearRemainder": 0
// play in the second year, and every second year thereafter
"YearModulus": 2,
"YearRemainder": 1
| ||||||
| Texture | (Optional) The asset name for the movie poster and screen images, or omit to use LooseSprites\Movies.
This must be a spritesheet with one 490×128 pixel row per movie. A 13×19 area in the top-left corner of the row should contain the movie poster. With a 16-pixel offset from the left edge, there should be two rows of five 90×61 pixel movie screen images, with a six-pixel gap between each image. (The movie doesn't need to use all of the image slots.) | ||||||
| SheetIndex | Determines where the game looks for the movie's scene sprites within LooseSprites\Movies.xnb. This includes the movie poster and screen images for the movie. | ||||||
| Title | A tokenizable string for the title of the film. | ||||||
| Description | A tokenizable string for 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. | ||||||
| CranePrizes | (Optional) The items to add to the crane game prize pool on days when this movie is playing, if any.
This consists of a list of models with these fields:
| ||||||
| ClearDefaultCranePrizeGroups | (Optional) The prize pools whose default items to discard, so only those specified by CranePrizes are available. Default none.
For example: "ClearDefaultCranePrizeGroups": [ 2, 3 ]
| ||||||
| 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 event scripts. Supports tokenizable strings. |
| Text | The dialogue/narration of the scene. Supports tokenizable strings. |
| 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.
|
For example, this content pack adds a new 'Pufferchick II' movie which plays in winter every third year:
{
"Format": "2.8.0",
"Changes": [
{
"Action": "EditData",
"Target": "Data/Movies",
"Entries": {
"{{ModId}}_PufferchickII": {
"Id": "{{ModId}}_PufferchickII", // must specify ID again when creating a new entry
"Seasons": [ "winter" ],
"YearModulus": 3,
"YearRemainder": 0,
"Title": "Pufferchick II", // display text should usually use {{i18n}} for translations in actual usage
"Description": "A sequel to the breakthrough adventure anime Pufferchick. The world is saved; what happens next?",
"Tags": [ "family", "adventure" ],
"Texture": "{{InternalAssetKey: assets/movie.png}}", // an image in your content pack
"SheetIndex": 0,
"Scenes": [ ... ]
}
}
}
]
}
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 as of 1.6.15:
| data |
[
{
"NPCName": "Penny",
"Reactions": [
{
"Tag": "*",
"Response": "love",
"Whitelist": [
"Pam"
],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_*_BeforeMovie]"
},
"DuringMovie": {
"ResponsePoint": null,
"Script": "/message \"[LocalizedText Strings\\MovieReactions:Penny_*_DuringMovie]\"",
"Text": null
},
"AfterMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_*_AfterMovie]"
}
},
"Id": "reaction_0"
},
{
"Tag": "spring_movie_0",
"Response": "love",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_spring_movie_0_BeforeMovie]"
},
"DuringMovie": {
"ResponsePoint": "sprout_leave",
"Script": "/shake Penny 3000/pause 500/message \"[LocalizedText Strings\\MovieReactions:Penny_spring_movie_0_DuringMovie_2]\"",
"Text": "[LocalizedText Strings\\MovieReactions:Penny_spring_movie_0_DuringMovie]"
},
"AfterMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_spring_movie_0_AfterMovie]"
}
},
"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": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_family_BeforeMovie]"
},
"DuringMovie": {
"ResponsePoint": null,
"Script": "/message \"[LocalizedText Strings\\MovieReactions:Penny_family_DuringMovie]\"",
"Text": null
},
"AfterMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_family_AfterMovie]"
}
},
"Id": "reaction_3"
},
{
"Tag": "comedy",
"Response": "like",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_comedy_BeforeMovie]"
},
"DuringMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_comedy_DuringMovie]"
},
"AfterMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_comedy_AfterMovie]"
}
},
"Id": "reaction_4"
},
{
"Tag": "horror",
"Response": "dislike",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_horror_BeforeMovie]"
},
"DuringMovie": {
"ResponsePoint": null,
"Script": "/shake Penny 3000/pause 500/emote Penny 28",
"Text": "[LocalizedText Strings\\MovieReactions:Penny_horror_DuringMovie]"
},
"AfterMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_horror_AfterMovie]"
}
},
"Id": "reaction_5"
},
{
"Tag": "love",
"Response": "like",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_love_BeforeMovie]"
},
"DuringMovie": null,
"AfterMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_love_AfterMovie]"
}
},
"Id": "reaction_6"
},
{
"Tag": "like",
"Response": "like",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_like_BeforeMovie]"
},
"DuringMovie": null,
"AfterMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_like_AfterMovie]"
}
},
"Id": "reaction_7"
},
{
"Tag": "dislike",
"Response": "like",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_dislike_BeforeMovie]"
},
"DuringMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_dislike_DuringMovie]"
},
"AfterMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_dislike_AfterMovie]"
}
},
"Id": "reaction_8"
},
{
"Tag": "seen_love",
"Response": "like",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_seen_love_BeforeMovie]"
},
"DuringMovie": null,
"AfterMovie": null
},
"Id": "reaction_9"
},
{
"Tag": "seen_like",
"Response": "like",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_seen_like_BeforeMovie]"
},
"DuringMovie": null,
"AfterMovie": null
},
"Id": "reaction_10"
},
{
"Tag": "seen_dislike",
"Response": "like",
"Whitelist": [],
"SpecialResponses": {
"BeforeMovie": {
"ResponsePoint": null,
"Script": null,
"Text": "[LocalizedText Strings\\MovieReactions:Penny_seen_dislike_BeforeMovie]"
},
"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:
|
| Response | One of love, like, dislike, or reject. 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. Rejected movies will turn down the ticket and say their line for RejectMovieTicket_DontWantToSeeThatMovie. |
| 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 the scenes field documentation for an explanation of response points. |
| Script | A script which runs prior to Text being displayed. Written in the same format as event scripts. |
| Text | The dialogue spoken by the NPC. Supports tokenizable strings. |
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.
Movie Identifiers
| key | movie title |
|---|---|
| spring_movie_0 | The Brave Little Sapling |
| summer_movie_0 | Journey Of The Prairie King: The Motion Picture |
| fall_movie_0 | Mysterium |
| winter_movie_0 | The Miracle At Coldstar Ranch |
| spring_movie_1 | Natural Wonders: Exploring Our Vibrant World |
| summer_movie_1 | Wumbus |
| fall_movie_1 | It Howls In The Rain |
| winter_movie_1 | The Zuzu City Express |
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 as of 1.6.15:
| 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 | A tokenizable string for the name of the concession, which is displayed to the player in-game. |
| Description | A tokenizable string for the description of the concession. |
| Price | The price of the concession in |
| 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.8.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. |
Concession tags
Black Licorice is the only item that doesn't have specific concession tags attached to it. Stardrop Sorbet is a universally loved item, whereas Black Licorice, Joja Cola, and JojaCorn are universally disliked items.
| tag | applicable concessions |
|---|---|
| Burger | Salmon Burger |
| Candy | Cotton Candy Jawbreaker Rock Candy Sour Slimes |
| Cold | Ice Cream Sandwich Joja Cola |
| Drink | Jasmine Tea Joja Cola Kale Smoothie |
| Fatty | Fries Nachos Personal Pizza |
| Gourmet | Cappuccino Mousse Cake Panzanella Salad Stardrop Sorbet Truffle Popcorn |
| Healthy | Apple Slices Hummus Snack pack Jasmine Tea Kale Smoothie Panzanella Salad |
| Hot | Chocolate Popcorn Fries Jasmine Tea Nachos Personal Pizza Popcorn |
| Joja | Joja Cola JojaCorn |
| Salty | Fries Nachos Popcorn Salted Peanuts Truffle Popcorn |
| Sandwich | Ice Cream Sandwich Salmon Burger |
| Sour | Sour Slimes |
| Sweet | Apple Slices Cappuccino Mousse Cake Chocolate Popcorn Cotton Candy Ice Cream Sandwich Jawbreaker Rock Candy Star Cookie Stardrop Sorbet |
Movie selection
Since the Data/Movies asset is a list, its order determines the order movies are shown within a season. If multiple movies can play in the same season, each movie will be shown for an equal block of days within the month (e.g. four movies will each play for seven consecutive days). If there are more movies than days, 28 movies will be chosen at random to play that month.