Модификации:Фестивали: различия между версиями
м (Замена текста — «{| class» на «{|class») |
м (Замена текста — «tt>» на «samp>») |
||
Строка 4: | Строка 4: | ||
==Файл данных== | ==Файл данных== | ||
− | У каждого фестиваля есть файл данных, расположенный в < | + | У каждого фестиваля есть файл данных, расположенный в <samp>Content/Data/Festivals/<season><day of month></samp>. Игра использует этот файл, чтобы определить, будет ли сегодня фестиваль (если файл существует), где и когда он произойдёт, а также размещение/диалог/поведение NPC. |
===Данные=== | ===Данные=== | ||
− | Файл данных фестиваля может быть [[Модификации:Редактирование_XNB_файлов#Распаковывание и упаковывание ресурсов|распакован для редактирования]]. Например, вот данные из < | + | Файл данных фестиваля может быть [[Модификации:Редактирование_XNB_файлов#Распаковывание и упаковывание ресурсов|распакован для редактирования]]. Например, вот данные из <samp>Content/Data/Festivals/fall27</samp> начиная с {{version|1.5.4}} для справки: |
{{collapse|Данные|content=<syntaxhighlight lang="json"> | {{collapse|Данные|content=<syntaxhighlight lang="json"> | ||
{ | { | ||
Строка 65: | Строка 65: | ||
! Описание | ! Описание | ||
|- | |- | ||
− | | < | + | | <samp>name</samp> |
| Название фестиваля. Используется в отображаемом тексте, таком как всплывающая подсказка календаря или сообщение о готовности к фестивалю. | | Название фестиваля. Используется в отображаемом тексте, таком как всплывающая подсказка календаря или сообщение о готовности к фестивалю. | ||
|- | |- | ||
− | | < | + | | <samp>conditions</samp> |
− | | Когда и где проходит фестиваль. В формате < | + | | Когда и где проходит фестиваль. В формате <samp>{{t|location}}/{{t|start time}} {{t|end time}}</samp>, где {{t|location}} это расположение внутри указанной локации и время в 26-часовом формате (т.е. 600 для 6 утра и 2600 для 2 ночи). |
|- | |- | ||
− | | < | + | | <samp>shop</samp> |
| Товары, которые продает фестивальный магазин. Смотри ''[[#Формат магазина|формат магазина]]'' ниже. | | Товары, которые продает фестивальный магазин. Смотри ''[[#Формат магазина|формат магазина]]'' ниже. | ||
|- | |- | ||
− | | < | + | | <samp>set-up</samp> |
| [[Модификации:События|Скрипт события]] запускается, когда игрок впервые попадает на фестиваль. Включает в себя перемещение игрока на карту фестиваля. Это поле поддерживает [[#Варианты года|варианты года]]. | | [[Модификации:События|Скрипт события]] запускается, когда игрок впервые попадает на фестиваль. Включает в себя перемещение игрока на карту фестиваля. Это поле поддерживает [[#Варианты года|варианты года]]. | ||
|- | |- | ||
− | | < | + | | <samp>Set-Up_additionalCharacters</samp> |
− | | NPC, которые будут появляться при загрузке фестиваля. Указывается в виде четырех полей, разделенных пробелами, в форме< | + | | NPC, которые будут появляться при загрузке фестиваля. Указывается в виде четырех полей, разделенных пробелами, в форме<samp>{{t|NPC name}} {{t|tile X}} {{t|tile Y}} {{t|facing direction}}</samp>, повторяется для каждого NPC, для разделения NPC используется разделитель <code>/</code>. {{t|facing direction}}</samp> может быть одним из следующих значений: <samp>up</samp> или <samp>0</samp>, <samp>down</samp> ил <samp>2</samp>, <samp>left</samp> или <samp>3</samp>, и <samp>right</samp> или <samp>1</samp>. Они являются дополнительными к NPC, порожденным через [[#Карта|файл карты]]. Например, для добавления Абигейл и Леи рядом друг с другом лицом вниз нужно написать следующее: <syntaxhighlight lang="javascript">"Set-Up_additionalCharacters": "Abigail 15 6 down/Leah 16 6 down"</syntaxhighlight> |
|- | |- | ||
− | | < | + | | <samp>{{t|NPC name}}_spouse</samp> |
| [[Модификации:Диалоги#Формат|Диалоговая строка]], указанный NPC сообщит, когда игрок поговорит с ними, женаты ли они на игроке. Поддерживает [[#Варианты года|варианты года]]. | | [[Модификации:Диалоги#Формат|Диалоговая строка]], указанный NPC сообщит, когда игрок поговорит с ними, женаты ли они на игроке. Поддерживает [[#Варианты года|варианты года]]. | ||
|- | |- | ||
− | | < | + | | <samp>{{t|NPC name}}</samp> |
− | | [[Модификации:Диалоги#Формат|Диалоговая строка]], указанный NPC сообщит, когда игрок поговорит с ними, если < | + | | [[Модификации:Диалоги#Формат|Диалоговая строка]], указанный NPC сообщит, когда игрок поговорит с ними, если <samp>{{t|NPC name}}_spouse</code></samp> не существует или не используется. Поддерживает [[#Варианты года|варианты года]]. |
|} | |} | ||
Строка 90: | Строка 90: | ||
===Варианты года=== | ===Варианты года=== | ||
− | Несколько полей допускают варианты года (смотри в таблице выше). Они работают с помощью префикса < | + | Несколько полей допускают варианты года (смотри в таблице выше). Они работают с помощью префикса <samp>_y{{t|year variant}}</samp>, Где {{t|year variant}} увеличивающееся число, начинающимся с 1, без верхнего предела. Например, две записи <samp>set-up_y1</samp> and <samp>set-up_y2</samp> будут чередоваться (<samp>set-up_y1</samp> в 1 годы, <samp>set-up_y2</samp> во 2 году, <samp>set-up_y1</samp> в 3 году, и т.д.). Если для ключа определены варианты года, исходный ключ игнорируется (например, <samp>set-up</samp> никогда не будет использоваться, если <samp>set-up_y*</samp> записи определены). |
===Формат магазина=== | ===Формат магазина=== | ||
− | Данные магазина для фестиваля хранятся в виде четырех значений, разделенных пробелами, в формате < | + | Данные магазина для фестиваля хранятся в виде четырех значений, разделенных пробелами, в формате <samp>{{t|item type}} {{t|item ID}} {{t|cost}} {{t|count available}}</samp>, который повторяется для каждого элемента. Форматы полей: |
{|class="wikitable" | {|class="wikitable" | ||
Строка 101: | Строка 101: | ||
|- | |- | ||
| {{t|item type}} | | {{t|item type}} | ||
− | | Тип предмета. Допустимыми значениями являются < | + | | Тип предмета. Допустимыми значениями являются <samp>B</samp> или <samp>Boots</samp> (ботинки), <samp>BL</samp> или<samp>Blueprint</samp> (чертежи), <samp>BBL</samp>, <samp>BBl</samp> или <samp>BigBlueprint</samp> (большие чертежи), <samp>BO</samp> или <samp>BigObject</samp> (большой объект, пригодный для изготовления), <samp>F</samp> (мебель), <samp>H</samp> или <samp>Hat</samp> (шляпа), <samp>O</samp> или <samp>Object</samp> (объект), <samp>R</samp> или<samp>Ring</samp> (кольцо), или <samp>W</samp> или <samp>Weapon</samp> (оружие). |
|- | |- | ||
− | | < | + | | <samp>{{t|item id}}</samp> |
| ID элемента в спрайт-листе. | | ID элемента в спрайт-листе. | ||
|- | |- | ||
− | | < | + | | <samp>{{t|cost}}</samp> |
| Цена покупки в золоте. Для семян это модифицировано на основе [[Совместная_игра#Маржа|маржи]]. | | Цена покупки в золоте. Для семян это модифицировано на основе [[Совместная_игра#Маржа|маржи]]. | ||
|- | |- | ||
− | | < | + | | <samp>{{t|count available}}</samp> |
− | | Сколько этих товаров можно приобрести в магазине, или < | + | | Сколько этих товаров можно приобрести в магазине, или <samp>-1</samp> для неограниченного количества. |
|} | |} | ||
==Карта== | ==Карта== | ||
− | Многие фестивали используют отдельные [[Модификации:Карты|файлы карты]] расположенные в папке < | + | Многие фестивали используют отдельные [[Модификации:Карты|файлы карты]] расположенные в папке <samp>Content/Maps</samp>. Карта для использования указана в [[#Файл данных|файле данных]] <samp>set-up</samp> поле, использующее команду <samp>changeToTemporaryMap</samp>. |
===Создание NPC=== | ===Создание NPC=== | ||
− | {{note box|'''Это хрупко и не рекомендуется для пользовательских NPC или фестивалей.'''<br />Рассмотрите возможность использования [[#Файл данных|файлов данных]] поля < | + | {{note box|'''Это хрупко и не рекомендуется для пользовательских NPC или фестивалей.'''<br />Рассмотрите возможность использования [[#Файл данных|файлов данных]] поля <samp>Set-Up_additionalCharacters</samp> вместо этого.}} |
− | NPC можно добавлять на фестивали, используя индексы тайлов карты на определенном слое. Это включено в [[#Файл данных|файле данных]] < | + | NPC можно добавлять на фестивали, используя индексы тайлов карты на определенном слое. Это включено в [[#Файл данных|файле данных]] <samp>set-up</samp> поле, использующее команду <samp>loadActors {{t|layer name}}</samp>. Для каждого тайла, существующего на слое, индекс тайла сопоставляется с индексом NPC в <samp>Data\NPCDispositions</samp>, умноженный на четыре, со смещением, которое определяет направление поворота (0 = вверх, 1 = вправо, 2 = вниз, или 3 = влево). |
− | Например, предположим, что слой содержит тайл с индексом равным 61. NPC в индексе < | + | Например, предположим, что слой содержит тайл с индексом равным 61. NPC в индексе <samp>61 / 4 = 15</samp> в <samp>Data\NPCDispositions</samp>, т.е. 16-й NPC, т.е. Лея. Смещение равно <samp>61 % 4 = 1</samp>, так что она смотрит направо. Когда фестиваль будет загружен, Лея будет добавлена в положение тайла, смотрящей вправо. |
==Жестко закодированная логика== | ==Жестко закодированная логика== |
Текущая версия на 18:40, 4 ноября 2021
← Индекс
На этой странице объясняется, как игра хранит и использует данные фестивалей. Это расширенное руководство для разработчиков модов.
Файл данных
У каждого фестиваля есть файл данных, расположенный в Content/Data/Festivals/<season><day of month>. Игра использует этот файл, чтобы определить, будет ли сегодня фестиваль (если файл существует), где и когда он произойдёт, а также размещение/диалог/поведение NPC.
Данные
Файл данных фестиваля может быть распакован для редактирования. Например, вот данные из Content/Data/Festivals/fall27 начиная с 1.5.4 для справки:
Данные |
---|
{
"name": "Spirit's Eve",
"conditions": "Town/2200 2350",
"shop": "BO 113 5000 1 O 746 750 5 BL 746 2000 1 BO 47 350 -1 F 2870 4000 -1",
"set-up": "spirits_eve/-1000 -1000/farmer 12 54 1/changeToTemporaryMap Town-Halloween/loadActors Set-Up/advancedMove Maru true 0 2 2 0 0 3 -11 0 0 -7 5 0 0 2 4 0/advancedMove Alex true -4 0 4 4000 4 0 4 5000/advancedMove Jas true 1 1500 4 1000/advancedMove Pam true 0 1 1 5000 0 -1 1 5000/advancedMove Shane true -7 0 0 2 2 9000 0 -2 7 0 4 9000/advancedMove Demetrius true 3 18000 4 3000/addTemporaryActor Skeleton 16 32 30 59 2 false Monster/advancedMove Skeleton true 0 1 3 4000 2 0 0 -1 4 2000 -1 0 3 1000 2 2000 0 -1 4 4000 -1 0 0 1 2 5000/addTemporaryActor Skeleton 16 32 35 58 2 false Monster/playerControl halloween",
"Abigail_spouse": "You'll have to tell me what's beyond, I can't go on... spiders...$s",
"Leah_spouse": "I may have had a little too much pumpkin ale...",
"Maru_spouse": "I'm confused... you go on ahead and let me figure this out.",
"Penny_spouse": "Oh... These vapors... Hmmm... You look nice tonight.$l",
"Haley_spouse": "I get scared easily... I think I'm just going to stay right here.$s",
"Sebastian_spouse": "It would be interesting to have one of these on the farm.",
"Sam_spouse": "Hey, I was wondering when you'd show up!$h",
"Harvey_spouse": "Hi... I was hoping you'd find me here...$l",
"Elliott_spouse": "Mmph... I believe I've eaten a few too many slices of pumpkin pie.",
"Abigail": "I can't go on... spiders...$s",
"Robin": "Well, winter's almost here. It's a great time to stockpile wood and stone.",
"Demetrius": "I haven't seen Maru in hours... I hope she's alright.",
"Maru": "I think I've already been this way... no, wait...$s#$e#I'm lost...$s",
"Sebastian": "I have no idea how these skeletons are walking... creepy.#$e#It's pretty cool though.",
"Pierre": "??",
"Caroline": "I get scared very easily. I'll leave the haunted maze to the younger people.",
"Linus": "Good show, old friend.",
"Alex": "There's something weird over there. But how do I get to it?#$e#There's gotta be a secret passage somewhere around here.",
"George": "Hmm... smoked turkey haunch? I guess this festival isn't all bad.$h",
"Evelyn": "I wish Gus would include a vegetarian option. Some zucchini skewers, maybe?",
"Lewis": "Good evening, @. Have you ventured into the haunted maze yet? It's quite spooky.#$e#That strange man who lives in the tower set it all up himself. He wouldn't let anyone near while he was working on it.",
"Clint": "One of my iridium-infused maces would make quick work of these things.",
"Emily": "Do you like the jack-o-lanterns? I carved them myself.",
"Penny": "The vapor from this cauldron... it's making my head spin, but I can't seem to leave...$u",
"Pam": "I'll come to any event with free grub! You won't see me in the haunted maze, though.",
"Haley": "Eek! I'm too scared.$s",
"Jodi": "Vincent's upset that I won't let him go into the haunted maze... but he's just a little boy!",
"Kent": "Hey, @. Nice evening, isn't it?",
"Sam": "That's odd... It's just a dead end up ahead.#$e#I could've sworn there was someone ahead of me when I went through the maze, though. Where'd they go?",
"Leah": "Mm, hi. Sorry... mouth full of blackberries.",
"Marnie": "Hi, @. Have you had a productive fall?#$e#It's starting to get quite cold... crops won't hold out for much longer.",
"Elliott": "Why, hello @. It's chilly, isn't it?",
"Gus": "It's a lot of fun to cook with pumpkin. Such an interesting fruit.",
"Dwarf": "You say it's raining up above? *gasp*#$e#Rain... It's almost mythical to us. Some of us live our entire lives without ever experiencing it.",
"Wizard": "The affairs of mundane folk matter little to me, but the elementals like a chance to see you up close.#$e#It was for them that I created this silly maze.",
"Harvey": "Oh! You found me...$8#$b#The truth is, I got too scared so I came here to hide. Don't tell anyone.$s",
"Shane": "Why is there no more pumpkin ale?",
"Sandy": "I heard it's raining back home. Is that why you came here?$h#$e#I kind of miss the rain, actually...$s",
"Jas": "But Aunt Marnie! I wanna go in the maze! I'm not scared!$s",
"Vincent": "Mother won't let me go in the maze. *sob*$s",
"Marlon": "Don't get too close to the cage.",
"Leo": "%Leo's unblinking eyes are glued to the screen. You're unable to get his attention."
}
|
Формат
Ключ поля | Описание |
---|---|
name | Название фестиваля. Используется в отображаемом тексте, таком как всплывающая подсказка календаря или сообщение о готовности к фестивалю. |
conditions | Когда и где проходит фестиваль. В формате <location> /<start time> <end time> , где <location> это расположение внутри указанной локации и время в 26-часовом формате (т.е. 600 для 6 утра и 2600 для 2 ночи).
|
shop | Товары, которые продает фестивальный магазин. Смотри формат магазина ниже. |
set-up | Скрипт события запускается, когда игрок впервые попадает на фестиваль. Включает в себя перемещение игрока на карту фестиваля. Это поле поддерживает варианты года. |
Set-Up_additionalCharacters | NPC, которые будут появляться при загрузке фестиваля. Указывается в виде четырех полей, разделенных пробелами, в форме<NPC name> <tile X> <tile Y> <facing direction> , повторяется для каждого NPC, для разделения NPC используется разделитель / . <facing direction> может быть одним из следующих значений: up или 0, down ил 2, left или 3, и right или 1. Они являются дополнительными к NPC, порожденным через файл карты. Например, для добавления Абигейл и Леи рядом друг с другом лицом вниз нужно написать следующее: "Set-Up_additionalCharacters": "Abigail 15 6 down/Leah 16 6 down"
|
<NPC name> _spouse
|
Диалоговая строка, указанный NPC сообщит, когда игрок поговорит с ними, женаты ли они на игроке. Поддерживает варианты года. |
<NPC name>
|
Диалоговая строка, указанный NPC сообщит, когда игрок поговорит с ними, если <NPC name> _spouse не существует или не используется. Поддерживает варианты года.
|
Любая другая запись используется event data для роликов во время фестиваля. В некоторых случаях, таких как Луау, они связаны друг с другом.
Варианты года
Несколько полей допускают варианты года (смотри в таблице выше). Они работают с помощью префикса _y<year variant>
, Где <year variant>
увеличивающееся число, начинающимся с 1, без верхнего предела. Например, две записи set-up_y1 and set-up_y2 будут чередоваться (set-up_y1 в 1 годы, set-up_y2 во 2 году, set-up_y1 в 3 году, и т.д.). Если для ключа определены варианты года, исходный ключ игнорируется (например, set-up никогда не будет использоваться, если set-up_y* записи определены).
Формат магазина
Данные магазина для фестиваля хранятся в виде четырех значений, разделенных пробелами, в формате <item type>
<item ID>
<cost>
<count available>
, который повторяется для каждого элемента. Форматы полей:
Поле | Описание |
---|---|
<item type>
|
Тип предмета. Допустимыми значениями являются B или Boots (ботинки), BL илиBlueprint (чертежи), BBL, BBl или BigBlueprint (большие чертежи), BO или BigObject (большой объект, пригодный для изготовления), F (мебель), H или Hat (шляпа), O или Object (объект), R илиRing (кольцо), или W или Weapon (оружие). |
<item id>
|
ID элемента в спрайт-листе. |
<cost>
|
Цена покупки в золоте. Для семян это модифицировано на основе маржи. |
<count available>
|
Сколько этих товаров можно приобрести в магазине, или -1 для неограниченного количества. |
Карта
Многие фестивали используют отдельные файлы карты расположенные в папке Content/Maps. Карта для использования указана в файле данных set-up поле, использующее команду changeToTemporaryMap.
Создание NPC
Рассмотрите возможность использования файлов данных поля Set-Up_additionalCharacters вместо этого.
NPC можно добавлять на фестивали, используя индексы тайлов карты на определенном слое. Это включено в файле данных set-up поле, использующее команду loadActors <layer name>
. Для каждого тайла, существующего на слое, индекс тайла сопоставляется с индексом NPC в Data\NPCDispositions, умноженный на четыре, со смещением, которое определяет направление поворота (0 = вверх, 1 = вправо, 2 = вниз, или 3 = влево).
Например, предположим, что слой содержит тайл с индексом равным 61. NPC в индексе 61 / 4 = 15 в Data\NPCDispositions, т.е. 16-й NPC, т.е. Лея. Смещение равно 61 % 4 = 1, так что она смотрит направо. Когда фестиваль будет загружен, Лея будет добавлена в положение тайла, смотрящей вправо.
Жестко закодированная логика
Несколько событий ванилы имеют жестко запрограммированную логику сценария в игровом коде. Например, Льюис, оценивающий выставку на Ярмарке долины Стардьюобрабатывается в коде игры, а не в ресурсах контента, описанных выше.
Ночной рынок также обрабатывается иначе, чем на других фестивалях. Хотя существуют отдельные карты ночного рынка, данных NPC на них не существует. Вместо этого NPC динамически входят и покидают фестиваль с помощью данных расписания.