Модификации:Фестивали: различия между версиями

Материал из Stardew Valley Wiki
Перейти к навигации Перейти к поиску
м (Замена текста — «tt>» на «samp>»)
 
(не показана 1 промежуточная версия этого же участника)
Строка 4: Строка 4:
  
 
==Файл данных==
 
==Файл данных==
У каждого фестиваля есть файл данных, расположенный в <tt>Content/Data/Festivals/&lt;season&gt;&lt;day of month&gt;</tt>. Игра использует этот файл, чтобы определить, будет ли сегодня фестиваль (если файл существует), где и когда он произойдёт, а также размещение/диалог/поведение NPC.
+
У каждого фестиваля есть файл данных, расположенный в <samp>Content/Data/Festivals/&lt;season&gt;&lt;day of month&gt;</samp>. Игра использует этот файл, чтобы определить, будет ли сегодня фестиваль (если файл существует), где и когда он произойдёт, а также размещение/диалог/поведение NPC.
  
 
===Данные===
 
===Данные===
Файл данных фестиваля может быть [[Модификации:Редактирование_XNB_файлов#Распаковывание и упаковывание ресурсов|распакован для редактирования]]. Например, вот данные из <tt>Content/Data/Festivals/fall27</tt> начиная с {{version|1.5.4}} для справки:
+
Файл данных фестиваля может быть [[Модификации:Редактирование_XNB_файлов#Распаковывание и упаковывание ресурсов|распакован для редактирования]]. Например, вот данные из <samp>Content/Data/Festivals/fall27</samp> начиная с {{version|1.5.4}} для справки:
 
{{collapse|Данные|content=<syntaxhighlight lang="json">
 
{{collapse|Данные|content=<syntaxhighlight lang="json">
 
{
 
{
Строка 60: Строка 60:
  
 
===Формат===
 
===Формат===
{| class="wikitable"
+
{|class="wikitable"
 
|-
 
|-
 
! Ключ поля
 
! Ключ поля
 
! Описание
 
! Описание
 
|-
 
|-
| <tt>name</tt>
+
| <samp>name</samp>
 
| Название фестиваля. Используется в отображаемом тексте, таком как всплывающая подсказка календаря или сообщение о готовности к фестивалю.
 
| Название фестиваля. Используется в отображаемом тексте, таком как всплывающая подсказка календаря или сообщение о готовности к фестивалю.
 
|-
 
|-
| <tt>conditions</tt>
+
| <samp>conditions</samp>
| Когда и где проходит фестиваль. В формате <tt>{{t|location}}/{{t|start time}} {{t|end time}}</tt>, где {{t|location}} это расположение внутри указанной локации и время в 26-часовом формате (т.е. 600 для 6 утра и 2600 для 2 ночи).
+
| Когда и где проходит фестиваль. В формате <samp>{{t|location}}/{{t|start time}} {{t|end time}}</samp>, где {{t|location}} это расположение внутри указанной локации и время в 26-часовом формате (т.е. 600 для 6 утра и 2600 для 2 ночи).
 
|-
 
|-
| <tt>shop</tt>
+
| <samp>shop</samp>
 
| Товары, которые продает фестивальный магазин. Смотри ''[[#Формат магазина|формат магазина]]'' ниже.
 
| Товары, которые продает фестивальный магазин. Смотри ''[[#Формат магазина|формат магазина]]'' ниже.
 
|-
 
|-
| <tt>set-up</tt>
+
| <samp>set-up</samp>
 
| [[Модификации:События|Скрипт события]] запускается, когда игрок впервые попадает на фестиваль. Включает в себя перемещение игрока на карту фестиваля. Это поле поддерживает [[#Варианты года|варианты года]].
 
| [[Модификации:События|Скрипт события]] запускается, когда игрок впервые попадает на фестиваль. Включает в себя перемещение игрока на карту фестиваля. Это поле поддерживает [[#Варианты года|варианты года]].
 
|-
 
|-
| <tt>Set-Up_additionalCharacters</tt>
+
| <samp>Set-Up_additionalCharacters</samp>
| NPC, которые будут появляться при загрузке фестиваля. Указывается в виде четырех полей, разделенных пробелами, в форме<tt>{{t|NPC name}} {{t|tile X}} {{t|tile Y}} {{t|facing direction}}</tt>, повторяется для каждого NPC, для разделения NPC используется разделитель <code>/</code>. {{t|facing direction}}</tt> может быть одним из следующих значений: <tt>up</tt> или <tt>0</tt>, <tt>down</tt> ил <tt>2</tt>, <tt>left</tt> или <tt>3</tt>, и <tt>right</tt> или <tt>1</tt>. Они являются дополнительными к NPC, порожденным через [[#Карта|файл карты]]. Например, для добавления Абигейл и Леи рядом друг с другом лицом вниз нужно написать следующее: <syntaxhighlight lang="javascript">"Set-Up_additionalCharacters": "Abigail 15 6 down/Leah 16 6 down"</syntaxhighlight>
+
| 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>
 
|-
 
|-
| <tt>{{t|NPC name}}_spouse</tt>
+
| <samp>{{t|NPC name}}_spouse</samp>
 
| [[Модификации:Диалоги#Формат|Диалоговая строка]], указанный NPC сообщит, когда игрок поговорит с ними, женаты ли они на игроке. Поддерживает [[#Варианты года|варианты года]].
 
| [[Модификации:Диалоги#Формат|Диалоговая строка]], указанный NPC сообщит, когда игрок поговорит с ними, женаты ли они на игроке. Поддерживает [[#Варианты года|варианты года]].
 
|-
 
|-
| <tt>{{t|NPC name}}</tt>
+
| <samp>{{t|NPC name}}</samp>
| [[Модификации:Диалоги#Формат|Диалоговая строка]], указанный NPC сообщит, когда игрок поговорит с ними, если <tt>{{t|NPC name}}_spouse</code></tt> не существует или не используется. Поддерживает [[#Варианты года|варианты года]].
+
| [[Модификации:Диалоги#Формат|Диалоговая строка]], указанный NPC сообщит, когда игрок поговорит с ними, если <samp>{{t|NPC name}}_spouse</code></samp> не существует или не используется. Поддерживает [[#Варианты года|варианты года]].
 
|}
 
|}
  
Строка 90: Строка 90:
  
 
===Варианты года===
 
===Варианты года===
Несколько полей допускают варианты года (смотри в таблице выше). Они работают с помощью префикса <tt>_y{{t|year variant}}</tt>, Где {{t|year variant}} увеличивающееся число, начинающимся с 1, без верхнего предела. Например, две записи <tt>set-up_y1</tt> and <tt>set-up_y2</tt> будут чередоваться (<tt>set-up_y1</tt> в 1 годы, <tt>set-up_y2</tt> во 2 году, <tt>set-up_y1</tt> в 3 году, и т.д.). Если для ключа определены варианты года, исходный ключ игнорируется (например, <tt>set-up</tt> никогда не будет использоваться, если <tt>set-up_y*</tt> записи определены).
+
Несколько полей допускают варианты года (смотри в таблице выше). Они работают с помощью префикса <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> записи определены).
  
 
===Формат магазина===
 
===Формат магазина===
Данные магазина для фестиваля хранятся в виде четырех значений, разделенных пробелами, в формате <tt>{{t|item type}} {{t|item ID}} {{t|cost}} {{t|count available}}</tt>, который повторяется для каждого элемента. Форматы полей:
+
Данные магазина для фестиваля хранятся в виде четырех значений, разделенных пробелами, в формате <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}}
| Тип предмета. Допустимыми значениями являются <tt>B</tt> или <tt>Boots</tt> (ботинки), <tt>BL</tt> или<tt>Blueprint</tt> (чертежи), <tt>BBL</tt>, <tt>BBl</tt> или <tt>BigBlueprint</tt> (большие чертежи), <tt>BO</tt> или <tt>BigObject</tt> (большой объект, пригодный для изготовления), <tt>F</tt> (мебель), <tt>H</tt> или <tt>Hat</tt> (шляпа), <tt>O</tt> или <tt>Object</tt> (объект), <tt>R</tt> или<tt>Ring</tt> (кольцо), или <tt>W</tt> или <tt>Weapon</tt> (оружие).
+
| Тип предмета. Допустимыми значениями являются <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> (оружие).
 
|-
 
|-
| <tt>{{t|item id}}</tt>
+
| <samp>{{t|item id}}</samp>
 
| ID элемента в спрайт-листе.
 
| ID элемента в спрайт-листе.
 
|-
 
|-
| <tt>{{t|cost}}</tt>
+
| <samp>{{t|cost}}</samp>
 
| Цена покупки в золоте. Для семян это модифицировано на основе [[Совместная_игра#Маржа|маржи]].
 
| Цена покупки в золоте. Для семян это модифицировано на основе [[Совместная_игра#Маржа|маржи]].
 
|-
 
|-
| <tt>{{t|count available}}</tt>
+
| <samp>{{t|count available}}</samp>
| Сколько этих товаров можно приобрести в магазине, или <tt>-1</tt> для неограниченного количества.
+
| Сколько этих товаров можно приобрести в магазине, или <samp>-1</samp> для неограниченного количества.
 
|}
 
|}
  
 
==Карта==
 
==Карта==
Многие фестивали используют отдельные [[Модификации:Карты|файлы карты]] расположенные в папке <tt>Content/Maps</tt>. Карта для использования указана в [[#Файл данных|файле данных]] <tt>set-up</tt> поле, использующее команду <tt>changeToTemporaryMap</tt>.
+
Многие фестивали используют отдельные [[Модификации:Карты|файлы карты]] расположенные в папке <samp>Content/Maps</samp>. Карта для использования указана в [[#Файл данных|файле данных]] <samp>set-up</samp> поле, использующее команду <samp>changeToTemporaryMap</samp>.
  
 
===Создание NPC===
 
===Создание NPC===
{{note box|'''Это хрупко и не рекомендуется для пользовательских NPC или фестивалей.'''<br />Рассмотрите возможность использования [[#Файл данных|файлов данных]] поля <tt>Set-Up_additionalCharacters</tt> вместо этого.}}
+
{{note box|'''Это хрупко и не рекомендуется для пользовательских NPC или фестивалей.'''<br />Рассмотрите возможность использования [[#Файл данных|файлов данных]] поля <samp>Set-Up_additionalCharacters</samp> вместо этого.}}
  
NPC можно добавлять на фестивали, используя индексы тайлов карты на определенном слое. Это включено в [[#Файл данных|файле данных]] <tt>set-up</tt> поле, использующее команду <tt>loadActors {{t|layer name}}</tt>. Для каждого тайла, существующего на слое, индекс тайла сопоставляется с индексом NPC в <tt>Data\NPCDispositions</tt>, умноженный на четыре, со смещением, которое определяет направление поворота (0 = вверх, 1 = вправо, 2 = вниз, или 3 = влево).
+
NPC можно добавлять на фестивали, используя индексы тайлов карты на определенном слое. Это включено в [[#Файл данных|файле данных]] <samp>set-up</samp> поле, использующее команду <samp>loadActors {{t|layer name}}</samp>. Для каждого тайла, существующего на слое, индекс тайла сопоставляется с индексом NPC в <samp>Data\NPCDispositions</samp>, умноженный на четыре, со смещением, которое определяет направление поворота (0 = вверх, 1 = вправо, 2 = вниз, или 3 = влево).
  
Например, предположим, что слой содержит тайл с индексом равным 61. NPC в индексе <tt>61 / 4 = 15</tt> в <tt>Data\NPCDispositions</tt>, т.е. 16-й NPC, т.е. Лея. Смещение равно <tt>61 % 4 = 1</tt>, так что она смотрит направо. Когда фестиваль будет загружен, Лея будет добавлена в положение тайла, смотрящей вправо.
+
Например, предположим, что слой содержит тайл с индексом равным 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

Это хрупко и не рекомендуется для пользовательских 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 динамически входят и покидают фестиваль с помощью данных расписания.