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

Материал из Stardew Valley Wiki
Перейти к навигации Перейти к поиску
(category, en link)
м (Замена текста — «tt>» на «samp>»)
 
(не показано 9 промежуточных версий 2 участников)
Строка 1: Строка 1:
 
← [[Модификации:Индекс|Индекс]]
 
← [[Модификации:Индекс|Индекс]]
{{Переведите}}
 
This page explains how the game stores and parses NPC schedule data, which determines where NPCs go and what they do when they get there. This is an advanced guide for mod developers.
 
  
==Raw data==
+
На этой странице объясняется, как игра хранит и анализирует данные расписания NPC, которые определяют, куда отправляются NPC и что они делают, когда попадают туда. Это расширенное руководство для разработчиков модов.
Schedule data is stored in <tt>Content/Characters/schedules/*.xnb</tt> files (one per character), which can be [[Modding:Editing XNB files#unpacking|unpacked for editing]]. Here's the raw data for Abigail as of {{version|1.5.1}} for reference:
 
  
{{collapse|Data|content=<syntaxhighlight lang="json">
+
==Источник==
 +
Данные расписания хранятся в <samp>Content/Characters/schedules/*.xnb</samp> (один файл на персонажа), которые могут быть [[Модификации:Редактирование_XNB_файлов#Распаковывание и упаковывание ресурсов|распакованы для редактирования]]. Вот исходные данные по Абигейл по состоянию на {{version|1.5.1}} для примера:
 +
 
 +
{{collapse|Данные|content=<syntaxhighlight lang="json">
 
{
 
{
 
   "rain": "900 SeedShop 9 5 0/1100 SeedShop 13 20 0/1300 SeedShop 39 5 0/1500 SeedShop 7 9 2/1900 SeedShop 6 4 0/2200 SeedShop 1 9 3 abigail_sleep",
 
   "rain": "900 SeedShop 9 5 0/1100 SeedShop 13 20 0/1300 SeedShop 39 5 0/1500 SeedShop 7 9 2/1900 SeedShop 6 4 0/2200 SeedShop 1 9 3 abigail_sleep",
Строка 31: Строка 31:
 
</syntaxhighlight>}}
 
</syntaxhighlight>}}
  
==Schedule key==
+
==Ключ расписания==
Each schedule has a key which is used to decide when it applies. The key must be one of the exact formats below (it's not dynamic). If multiple schedules apply, the first match in the order listed here is used.
+
У каждого расписания есть ключ, который используется для определения того, когда оно применяется. Ключ должен быть в одном из приведенных ниже форматов (он не динамический). Если применяется несколько расписаний, используется первое совпадение в указанном здесь порядке.
  
Notes:
+
Примечание:
* Most text is case-sensitive (e.g. <tt>Mon</tt> is not the same as <tt>mon</tt>).
+
* Большинство текстов чувствительны к регистру (т.е. <samp>Mon</samp> '''не''' тоже самое, что <samp>mon</samp>).
* The game's logic for schedule keys is in <tt>NPC::getSchedule</tt>.
+
* Логика игры для ключей расписания находится в <samp>NPC::getSchedule</samp>.
  
===Marriage schedules===
+
===Расписание в браке===
These apply if the NPC is married to a player (not necessarily the main player). '''Married NPCs don't use any other schedule keys.''' If the marriage keys don't match, they won't have a schedule for that day.
+
Они применяются, если NPC женат на игроке (не обязательно главном). '''Женатые NPC не используют никаких других расписаний.'''
  
{| class="wikitable"
+
{|class="wikitable"
 
|-
 
|-
! syntax
+
! Синтаксис
! summary
+
! Описание
 
|-
 
|-
| <tt>marriage_{{t|season}}_{{t|day of month}}</tt>
+
| <samp>marriage_{{t|season}}_{{t|day of month}}</samp>
| Applies on the given date.<br /><small>Example: <tt>marriage_spring_26</tt></small>
+
| Применяется в указанную дату.<br /><small>Пример: <samp>marriage_spring_26</samp></small>
 
|-
 
|-
| <tt>marriageJob</tt>
+
| <samp>marriageJob</samp>
| Used by Harvey on Tuesday/Thursday, Maru on Tuesday/Thursday, Penny on Tuesday/Wednesday/Friday.
+
| Используется Харви во вторник/четверг, Мару во вторник/четверг, Пенни во вторник/среду/пятницу.
 
|-
 
|-
| <tt>marriage_{{t|day of week}}</tt>
+
| <samp>marriage_{{t|day of week}}</samp>
| Applies on the given day of week when not raining.<br /><small>Example: <tt>marriage_Mon</tt></small>
+
| Применяется в указанный день недели, когда нет дождя.<br /><small>Пример: <samp>marriage_Mon</samp></small>
 
|}
 
|}
  
===Normal schedules===
+
===Нормальное расписание===
These schedules apply to any non-marriage NPC. If none of these keys match, they won't have a schedule for that day.
+
Такие расписания применяются к любому NPC, не состоящему в браке. Если ни один из этих ключей не совпадает, у персонажа не будет расписания на этот день.
  
{| class="wikitable"
+
{|class="wikitable"
 
|-
 
|-
! syntax
+
! Синтаксис
! summary
+
! Описание
 
|-
 
|-
| <tt>{{t|season}}_{{t|day of month}}</tt>
+
| <samp>{{t|season}}_{{t|day of month}}</samp>
| Applies on the given date.<br /><small>Example: <tt>spring_15</tt></small>
+
| Применяется в указанную дату.<br /><small>Пример: <samp>spring_15</samp></small>
 
|-
 
|-
| <tt>{{t|day of month}}_{{t|hearts}}</tt>
+
| <samp>{{t|day of month}}_{{t|hearts}}</samp>
| Applies on the given day of month if ''any'' player has at least that many [[friendship|hearts]] with the NPC. If multiple schedules apply, the one with the highest heart number is used.<br /><small>Example: <tt>11_6</tt></small>
+
| Применяется в указанный день месяца, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: <samp>11_6</samp></small>
 
|-
 
|-
| <tt>{{t|day of month}}</tt>
+
| <samp>{{t|day of month}}</samp>
| Applies on the given day of month.<br /><small>Example: <tt>16</tt></small>
+
| Применяется в указанный день месяца.<br /><small>Пример: <samp>16</samp></small>
 
|-
 
|-
| <tt>bus</tt>
+
| <samp>bus</samp>
| For [[Pam]] only, applies if the bus is repaired.
+
| Для [[Пэм]], применяется только если автобус отремонтирован.
 
|-
 
|-
| <tt>rain2</tt>
+
| <samp>rain2</samp>
| 50% chance of applying on rainy days.
+
| 50% шанс в дождливый день.
 
|-
 
|-
| <tt>rain</tt>
+
| <samp>rain</samp>
| Applies on rainy days.
+
| Применяется в дождливые дни.
 
|-
 
|-
| <tt>{{t|season}}_{{t|day of week}}_{{t|hearts}}</tt>
+
| <samp>{{t|season}}_{{t|day of week}}_{{t|hearts}}</samp>
| Applies in the given season and day of week, if ''any'' player has at least that many [[friendship|hearts]] with the NPC. If multiple schedules apply, the one with the highest heart number is used.<br /><small>Example: <tt>spring_Mon_6</tt></small>
+
| Применяется в указанный сезон и день недели, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: <samp>spring_Mon_6</samp></small>
 
|-
 
|-
| <tt>{{t|season}}_{{t|day of week}}</tt>
+
| <samp>{{t|season}}_{{t|day of week}}</samp>
| Applies in the given season and day of week.<br /><small>Example: <tt>spring_Mon</tt></small>
+
| Применяется в указанный сезон и день недели.<br /><small>Пример: <samp>spring_Mon</samp></small>
 
|-
 
|-
| <tt>{{t|day of week}}</tt>
+
| <samp>{{t|day of week}}</samp>
| Applies in the given day of week.<br /><small>Example: <tt>Mon</tt></small>
+
| Применяется в указанный день недели.<br /><small>Пример: <samp>Mon</samp></small>
 
|-
 
|-
| <tt>{{t|season}}</tt>
+
| <samp>{{t|season}}</samp>
| Applies in the given season.<br /><small>Example: <tt>spring</tt></small>
+
| Применяется в указанный сезон.<br /><small>Пример: <samp>spring</samp></small>
 
|-
 
|-
| <tt>spring_{{t|day of week}}</tt>
+
| <samp>spring_{{t|day of week}}</samp>
| Applies (in any season) on the given day of week.<br /><small>Example: <tt>spring_Mon</tt></small>
+
| Применяется (в любое время года) в указанный день недели.<br /><small>Пример: <samp>spring_Mon</samp></small>
 
|-
 
|-
| <tt>{{t|season}}_{{t|day of week}}_{{t|hearts}}</tt>
+
| <samp>{{t|season}}_{{t|day of week}}_{{t|hearts}}</samp>
| Applies in the given season, if ''any'' player has at least that many [[friendship|hearts]] with the NPC. If multiple schedules apply, the one with the highest heart number is used.<br /><small>Example: <tt>spring_Mon_6</tt></small>
+
| Применяется в указанный сезон, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: <samp>spring_Mon_6</samp></small>
 
|-
 
|-
| <tt>spring</tt>
+
| <samp>spring</samp>
| Always applies.
+
| Применяется всегда
 
|}
 
|}
  
==Schedule script==
+
==Сценарий расписания==
Each schedule entry value has an arbitrary number of slash-delimited schedule commands matching one of the formats below.
+
Каждое значение записи расписания содержит произвольное количество разделенных косой чертой команд расписания, соответствующих одному из приведенных ниже форматов.
  
===Initial commands===
+
===Начальные команды===
A script may have one initial command as the first field in the script, before the first <tt>/</tt> character. The <tt>GOTO</tt> command can also appear in the next two fields after <tt>MAIL</tt>, or the next field after <tt>NOT</tt>.
+
Сценарий может содержать одну начальную команду в качестве первого поля в сценарии перед первым <samp>/</samp>. Команда <samp>GOTO</samp> также может появиться в следующих двух полях после <samp>MAIL</samp> или в следующем поле после <samp>NOT</samp>.
  
{| class="wikitable"
+
{|class="wikitable"
 
|-
 
|-
! command
+
! Команда
! description
+
! Описание
 
|-
 
|-
| <tt>GOTO {{t|key}}</tt>
+
| <samp>GOTO {{t|key}}</samp>
| (Note: this line only applies if <tt>GOTO</tt> is the first command. If it's not, see <tt>GOTO</tt> below.)<br />End the current script and load the schedule with the given key instead. If the key is "season", the current season name is used instead. If the schedule doesn't exist or can't be parsed, the <tt>spring</tt> schedule will be used instead.<br /><small>Example: <tt>GOTO spring</tt></small>
+
| (Примечание: эта строка применяется только в том случае, если <samp>GOTO</samp> является первой командой. Если это не так, смотри <samp>GOTO</samp> ниже.)<br />Завершите текущий сценарий и вместо этого загрузите расписание с заданным ключом. Если ключ "сезон", вместо него используется текущее название сезона. Если расписание не существует или не может быть проанализировано, вместо него будет использоваться расписание <samp>spring</samp>.<br /><small>Пример: <samp>GOTO spring</samp></small>
 
|-
 
|-
| <tt>NOT friendship {{t|npc name}} {{t|hearts}}</tt>
+
| <samp>NOT friendship {{t|npc name}} {{t|hearts}}</samp>
| End the current script if ''any'' player ''does'' have at least that many [[friendship|hearts]] with any of the named NPCs (can list multiple). If the script is ended, the <tt>spring</tt> schedule is used instead.<br /><small>Example: <tt>NOT friendship Sebastian 6 Abigail 3</tt> (script ends if any player has 6+ hearts with Sebastian and/or 3+ hearts with Abigail).</small>
+
| Завершите текущий сценарий, если ''любого'' игрока ''есть'' как минимум {{t|hearts}} [[Дружба|сердечек]] с любым из указанных NPC (можно перечислить несколько). Если сценарий завершен, то вместо этого используется расписание <samp>spring</samp>. <br /><small>Например: <samp>NOT friendship Sebastian 6 Abigail 3</samp> (сценарий заканчивается, если у любого игрока 6+ сердец с Себастианом и/или 3+ сердца с Абигейл).</small>
 
|-
 
|-
| <tt>NOT</tt>
+
| <samp>NOT</samp>
| Command ignored if the next word is not <tt>friendship</tt>.
+
| Команда игнорируется, если следующее слово не <samp>friendship</samp>.
 
|-
 
|-
| <tt>MAIL {{t|letter ID}}</tt>
+
| <samp>MAIL {{t|letter ID}}</samp>
| Runs the next command if the player did ''not'' receive the given letter ID or world state ID (see <tt>HasFlag</tt> in the [https://github.com/Pathoschild/StardewMods/tree/develop/ContentPatcher Content Patcher documentation]); else continues from the command after that.<br /><small>Example: <tt>MAIL ccVault/GOTO spring/GOTO summer</tt> (runs <tt>GOTO spring</tt> if the bus is repaired, or <tt>GOTO summer</tt> if it isn't; not limited to <tt>GOTO</tt> commands).</small>
+
| Запускает следующую команду, если игрок ''не'' получил письмо с ID или ID состояния мира (смотри <samp>HasFlag</samp> в [https://github.com/Pathoschild/StardewMods/tree/develop/ContentPatcher документации Content Patcher]); остальное продолжается из команды после этого.<br /><small>Например: <samp>MAIL ccVault/GOTO spring/GOTO summer</samp> (запускает <samp>GOTO spring</samp> если автобус отремонтирован, или <samp>GOTO summer</samp> если это не так; не ограничиваясь командой <samp>GOTO</samp>).</small>
 
|-
 
|-
| <tt>GOTO {{t|key}}</tt>
+
| <samp>GOTO {{t|key}}</samp>
| (Note: this line only applies if <tt>GOTO</tt> is after <tt>NOT</tt> or <tt>MAIL</tt>. If it's not, see <tt>GOTO</tt> above.)<br />End the current script and load the schedule with the given key instead. If the key is "season", the current season name is used instead. If the key is "NO_SCHEDULE", the NPC has no schedule for the day. If the schedule doesn't exist or can't be parsed, the game crashes (or shows an error if playing with SMAPI).<br /><small>Example: <tt>GOTO NO_SCHEDULE</tt></small>
+
| (Примечание: эта строка применяется только в том случае, если <samp>GOTO</samp> стоит после <samp>NOT</samp> или <samp>MAIL</samp>. Если это не так, смотрите <samp>GOTO</samp> выше.)<br />Завершите текущий сценарий и вместо этого загрузите расписание с заданным ключом. Если ключ "сезон", вместо него используется название текущего сезона. Если ключ = "NO_SCHEDULE", то у NPC нет расписания на день. Если расписание не существует или не может быть проанализировано, игра вылетает (или покажет ошибку при игре с SMAPI).<br /><small>Например: <samp>GOTO NO_SCHEDULE</samp></small>
 
|}
 
|}
  
===Schedule points===
+
===Пункты расписания===
The rest of the schedule script consists of slash-delimited entries, each containing space-separated fields which specify a start time, destination, and what to do when the NPC reaches it:
+
Остальная часть сценария расписания состоит из записей, разделенных косой чертой, каждая из которых содержит поля, разделенные пробелами, в которых указывается время начала, пункт назначения и действие, которое выполнит NPC, когда достигнет место назначения:
: <tt>{{t|time}} {{o|location}} {{t|tileX}} {{t|tileY}} {{o|facingDirection}} {{o|animation}} {{o|dialogue}}</tt>
+
: <samp>{{t|time}} {{o|location}} {{t|tileX}} {{t|tileY}} {{o|facingDirection}} {{o|animation}} {{o|dialogue}}</samp>
  
If the <tt>location</tt> field is omitted, the rest of the fields are parsed as normal. The other optional fields must be in sequential order (e.g. you can skip <tt>animation</tt> and <tt>dialogue</tt>, but you can't skip <tt>facingDirection</tt> and then specify <tt>animation</tt> and <tt>dialogue</tt>). The exception is <tt>dialogue</tt>. The <tt>dialogue</tt> can be specified without the <tt>animation</tt>.
+
Если поле <samp>location</samp> опущено, остальные поля анализируются как обычно. Другие необязательные поля должны быть в последовательном порядке (например, вы можете пропустить <samp>animation</samp> и <samp>dialogue</samp>, но не можете пропустить <samp>facingDirection</samp> а затем укажите <samp>animation</samp> и <samp>dialogue</samp>). Исключением является <samp>dialogue</samp>. <samp>dialogue</samp> может быть указан без <samp>animation</samp>.
  
{| class="wikitable"
+
{|class="wikitable"
 
|-
 
|-
! field
+
! Поле
! description
+
! Описание
 
|-
 
|-
| <tt>time</tt>
+
| <samp>time</samp>
| The time at which the schedule event begins, in military time (24 hour format, no colon). The time may be preceded with the single character '<tt>a</tt>' to indicate that the event should end (that is, the NPC should arrive at the destination) at the given time. In this case, the game will calculate when the event needs to begin. However, the event will never begin before the time specified for the previous event.
+
| Время, в которое начинается событие расписания, по времени (24-часовой формат, без двоеточия). Времени может предшествовать один символ '<samp>a</samp>', чтобы указать, что событие должно завершиться (то есть NPC должен прибыть в пункт назначения) в заданное время. В этом случае игра рассчитает, когда должно начаться событие. Однако событие никогда не начнется раньше времени, указанного для предыдущего события.
  
In the unmodified game, this is only used to synchronise Emily's and Sandy's schedules on Fall 15.
+
В неизмененной игре это используется только для синхронизации расписаний Эмили и Сэнди на 15 число осени.
 
|-
 
|-
| <tt>location</tt>
+
| <samp>location</samp>
| <p>''(optional)'' The location name the NPC should walk towards. If omitted, defaults to the [[Bus Stop|bus stop]] (if married to a player) or their default location.</p><p>'''Note:''' the game has special logic for unlockable locations. If this is JojaMart/Railroad and it's not available yet, the game gets the replacement destination from the first entry in the <tt>{{t|location}}_Replacement</tt> schedule if available; otherwise it switches to the <tt>default</tt> schedule if available, else <tt>spring</tt>. If this is CommunityCenter and it's not available yet, the game switches to the <tt>default</tt> schedule if available, else <tt>spring</tt>.</p>
+
| <p>''(необязательное)'' Название местоположения, к которому должен идти NPC. Если этот параметр опущен, по умолчанию используется [[Автобусная остановка]] (если замужем за игроком) или их местоположение по умолчанию.</p><p>'''Примечание:''' в игре есть специальная логика для открываемых локаций. Если это JojaMart/Железная дорога, и она еще недоступна, игра получает место назначения для замены с первой записи в <samp>{{t|location}}_Replacement</samp> расписание, если доступно; в противном случае он переключается на расписание <samp>default</samp>, если доступно, в противном случае <samp>spring</samp>. Если это общественный центр, и он еще недоступен, игра переключается на расписание <samp>default</samp>, если доступно, в противном случае <samp>spring</samp>.</p>
 
|-
 
|-
| <tt>tileX</tt><br /><tt>tileY</tt>
+
| <samp>tileX</samp><br /><samp>tileY</samp>
| The X and Y [[Modding:Modder Guide/Game Fundamentals#Tiles|tile coordinates]] the NPC should walk towards.
+
| X и Y [[Модификации:Моддер_гайд/Основы_игры#Тайлы|координаты тайлов]] NPC должен идти навстречу.
 
|-
 
|-
| <tt>facingDirection</tt>
+
| <samp>facingDirection</samp>
| ''(optional)'' The direction to face after reaching the destination. The possible values are 0 (up), 1 (right), 2 (down), and 3 (left). Defaults to down.
+
| ''(необязательное)'' Направление, в котором нужно двигаться после достижения пункта назначения. Возможными значениями являются 0 (вверх), 1 (вправо), 2 (вниз), и 3 (влево). По умолчанию вниз.
 
|-
 
|-
| <tt>animation</tt>
+
| <samp>animation</samp>
| ''(optional)'' The animation to play when the NPC reaches the destination. This must be a key that appears in the <tt>Content/Data/animationDescriptions.xnb</tt> file. Each key entry has three parts: pre animation/looping animation/post animation. The numbers on them refer to the [[Modding:NPC data#Overworld sprites|overworld sprite frame]]. The pre animation will play after arriving at the schedule point. Then the looping animation will loop until the end of schedule time. Finally, the post animation will play before moving on to the next schedule point. Note that each frame is around 120ms so duplicates of frame is used to get desired looking animation.
+
| ''(необязательное)'' Анимация, которая будет воспроизводиться, когда NPC достигнет места назначения. Это должен быть ключ, который появляется в файле <samp>Content/Data/animationDescriptions.xnb</samp>. Каждая ключевая запись состоит из трех частей: предварительная анимация/циклическая анимация/пост-анимация. Цифры на них относятся к [[Модификации:О_NPC#Спрайты|спрайтам]]. Предварительная анимация будет воспроизводиться после прибытия в пункт расписания. Затем анимация цикла будет повторяться до конца запланированного времени. Наконец, пост-анимация будет воспроизведена перед переходом к следующему пункту расписания. Обратите внимание, что каждый кадр составляет около 120 мс, поэтому дубликаты кадра используются для получения желаемой анимации.
 
|-
 
|-
| <tt>dialogue</tt>
+
| <samp>dialogue</samp>
| <p>''(optional)'' The dialogue the NPC should use when they reach their destination. This must be an [[Modding:Modder Guide/APIs/Content|asset name]] and entry key in this exact format (including quotes): <tt>"assetName:key"</tt>. Any slashes in the asset name should be double backslashes (<tt>\\</tt>). The format of the entry key doesn't matter, it just needs to match one in the file.</p><p>For example, <tt>"Strings\\schedules\\Abigail:Sun.000"</tt> means "open the file at <tt>Strings\schedules\Abigail.xnb</tt> and get the text of the <tt>Sun.000</tt> key".
+
| <p>''(необязательное)'' Диалог, который должен использовать NPC, когда они доберутся до места назначения. Это должно быть [Модификации:Моддер гайд/APIs/Контентt|наименование]] и ключ ввода в этом формате (включая цитаты): <samp>"assetName:key"</samp>. Любые косые черты в имени ресурса должны быть двойными обратными косыми чертами (<samp>\\</samp>). Формат ключа ввода не имеет значения, он просто должен соответствовать одному из файла.</p><p>Например, <samp>"Strings\\schedules\\Abigail:Sun.000"</samp> открыть "open the file at <samp>Strings\schedules\Abigail.xnb</samp> и получить текст <samp>Sun.000</samp> key".
 
|}
 
|}
  
For example, consider this schedule entry in Abigail's schedule:
+
Например, рассмотрим эту запись расписания в расписании Абигейл:
 
<pre>1300 Town 47 87 0 "Strings\\schedules\\Abigail:marriage_Mon.001"</pre>
 
<pre>1300 Town 47 87 0 "Strings\\schedules\\Abigail:marriage_Mon.001"</pre>
  
At 13:00 (1pm), Abigail will begin walking to tile (47, 87) in the Town location. When she reaches it, she'll face direction 0 (up) and say "''Hey, @. I like to relax here... it's so peaceful.''"
+
В 13:00 (1 час дня), Абигейл начнёт прогулку до координат (47, 87) в городе. Когда она достигнет его, она повернется лицом в направлении 0 (вверх) и скажет "''Эй, @. Мне нравится здесь отдыхать... здесь так спокойно.''"
  
==Potential issues==
+
==Потенциальные проблемы==
* Using a time of 600 (when the day starts) for an event may not work. Try using 610 if you want an event early in the morning and the NPC doesn't move if you use 600.
+
* Использование времени 600 (когда начинается день) для события может не сработать. Попробуйте использовать 610, если вы хотите провести мероприятие рано утром, NPC не двигается, если используется 600.
  
 
[[Category:Модификации]]
 
[[Category:Модификации]]
  
 
[[en:Modding:Schedule data]]
 
[[en:Modding:Schedule data]]

Текущая версия на 18:43, 4 ноября 2021

Индекс

На этой странице объясняется, как игра хранит и анализирует данные расписания NPC, которые определяют, куда отправляются NPC и что они делают, когда попадают туда. Это расширенное руководство для разработчиков модов.

Источник

Данные расписания хранятся в Content/Characters/schedules/*.xnb (один файл на персонажа), которые могут быть распакованы для редактирования. Вот исходные данные по Абигейл по состоянию на 1.5.1 для примера:

Данные 
{
  "rain": "900 SeedShop 9 5 0/1100 SeedShop 13 20 0/1300 SeedShop 39 5 0/1500 SeedShop 7 9 2/1900 SeedShop 6 4 0/2200 SeedShop 1 9 3 abigail_sleep",
  "rain2": "900 SeedShop 34 5 0/1100 SeedShop 9 17 3/1400 Saloon 42 17 2 abigail_sit_down/2000 SeedShop 1 9 3 abigail_sleep",
  "winter_15": "900 SeedShop 39 5 0/1030 ScienceHouse 5 19 1/1430 Beach 30 34 2 \"Strings\\schedules\\Abigail:winter_15.000\"/2400 SeedShop 1 9 3 abigail_sleep",
  "marriage_Mon": "830 SeedShop 6 19 0 \"Strings\\schedules\\Abigail:marriage_Mon.000\"/1300 Town 47 87 0 \"Strings\\schedules\\Abigail:marriage_Mon.001\"/1700 Saloon 33 18 0 \"Strings\\schedules\\Abigail:marriage_Mon.002\"/2030 BusStop -1 23 3",
  "marriage_Fri": "800 SeedShop 36 9 0 \"Strings\\schedules\\Abigail:marriage_Fri.000\"/1100 Mountain 49 31 2 abigail_flute/1500 Saloon 42 17 2 abigail_sit_down \"Strings\\schedules\\Abigail:marriage_Fri.001\"/2030 BusStop -1 23 3",
  "fall_Mon": "900 SeedShop 10 5 0/1100 Beach 13 39 2/1800 SeedShop 1 9 3 abigail_sleep",
  "6": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2 abigail_flute/2000 SeedShop 1 9 3 abigail_sleep",
  "16": "GOTO 6",
  "spring_4": "900 SeedShop 11 5 0 \"Strings\\schedules\\Abigail:spring_4.000\"/1230 Hospital 13 14 0 \"Strings\\schedules\\Abigail:spring_4.001\"/1330 Hospital 4 6 1 \"Strings\\schedules\\Abigail:spring_4.002\"/1600 SeedShop 10 5 0/2000 SeedShop 1 9 3 abigail_sleep",
  "Sun": "900 SeedShop 4 5 0/1030 SeedShop 20 5 1 \"Strings\\schedules\\Abigail:Sun.000\"/1300 Forest 14 40 2/2000 SeedShop 1 9 3 abigail_sleep",
  "11_6": "GOTO spring",
  "25_6": "GOTO spring",
  "11": "NOT friendship Sebastian 6/1000 SebastianRoom 5 4 2 abigail_sit_down/1700 SeedShop 1 9 3 abigail_sleep",
  "25": "NOT friendship Sebastian 6/GOTO 11",
  "Wed": "1000 ArchaeologyHouse 11 9 0/1800 Town 47 87 0/2200 SeedShop 1 9 3 abigail_sleep",
  "Fri": "900 SeedShop 34 5 0/1100 SeedShop 9 17 3/1500 Saloon 42 17 2 abigail_sit_down/2100 SeedShop 1 9 3 abigail_sleep",
  "fall": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1300 BusStop 22 5 2/1700 SeedShop 3 6 0 abigail_videogames/1930 SeedShop 1 9 3 abigail_sleep",
  "winter": "900 SeedShop 39 5 0/1030 ScienceHouse 5 19 1/1430 SeedShop 3 6 0 abigail_videogames/1930 SeedShop 1 9 3 abigail_sleep",
  "summer": "900 SeedShop 39 5 0/1030 Railroad 30 45 0/1400 Mountain 49 31 1/1740 SeedShop 3 6 0 abigail_videogames/1930 SeedShop 1 9 3 abigail_sleep",
  "spring": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1300 Town 73 54 2/1630 SeedShop 3 6 0 abigail_videogames/1930 SeedShop 1 9 3 abigail_sleep"
}

Ключ расписания

У каждого расписания есть ключ, который используется для определения того, когда оно применяется. Ключ должен быть в одном из приведенных ниже форматов (он не динамический). Если применяется несколько расписаний, используется первое совпадение в указанном здесь порядке.

Примечание:

  • Большинство текстов чувствительны к регистру (т.е. Mon не тоже самое, что mon).
  • Логика игры для ключей расписания находится в NPC::getSchedule.

Расписание в браке

Они применяются, если NPC женат на игроке (не обязательно главном). Женатые NPC не используют никаких других расписаний.

Синтаксис Описание
marriage_<season>_<day of month> Применяется в указанную дату.
Пример: marriage_spring_26
marriageJob Используется Харви во вторник/четверг, Мару во вторник/четверг, Пенни во вторник/среду/пятницу.
marriage_<day of week> Применяется в указанный день недели, когда нет дождя.
Пример: marriage_Mon

Нормальное расписание

Такие расписания применяются к любому NPC, не состоящему в браке. Если ни один из этих ключей не совпадает, у персонажа не будет расписания на этот день.

Синтаксис Описание
<season>_<day of month> Применяется в указанную дату.
Пример: spring_15
<day of month>_<hearts> Применяется в указанный день месяца, если у любого игрока есть по крайней мере столько сердец с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.
Пример: 11_6
<day of month> Применяется в указанный день месяца.
Пример: 16
bus Для Пэм, применяется только если автобус отремонтирован.
rain2 50% шанс в дождливый день.
rain Применяется в дождливые дни.
<season>_<day of week>_<hearts> Применяется в указанный сезон и день недели, если у любого игрока есть по крайней мере столько сердец с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.
Пример: spring_Mon_6
<season>_<day of week> Применяется в указанный сезон и день недели.
Пример: spring_Mon
<day of week> Применяется в указанный день недели.
Пример: Mon
<season> Применяется в указанный сезон.
Пример: spring
spring_<day of week> Применяется (в любое время года) в указанный день недели.
Пример: spring_Mon
<season>_<day of week>_<hearts> Применяется в указанный сезон, если у любого игрока есть по крайней мере столько сердец с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.
Пример: spring_Mon_6
spring Применяется всегда

Сценарий расписания

Каждое значение записи расписания содержит произвольное количество разделенных косой чертой команд расписания, соответствующих одному из приведенных ниже форматов.

Начальные команды

Сценарий может содержать одну начальную команду в качестве первого поля в сценарии перед первым /. Команда GOTO также может появиться в следующих двух полях после MAIL или в следующем поле после NOT.

Команда Описание
GOTO <key> (Примечание: эта строка применяется только в том случае, если GOTO является первой командой. Если это не так, смотри GOTO ниже.)
Завершите текущий сценарий и вместо этого загрузите расписание с заданным ключом. Если ключ "сезон", вместо него используется текущее название сезона. Если расписание не существует или не может быть проанализировано, вместо него будет использоваться расписание spring.
Пример: GOTO spring
NOT friendship <npc name> <hearts> Завершите текущий сценарий, если любого игрока есть как минимум <hearts> сердечек с любым из указанных NPC (можно перечислить несколько). Если сценарий завершен, то вместо этого используется расписание spring.
Например: NOT friendship Sebastian 6 Abigail 3 (сценарий заканчивается, если у любого игрока 6+ сердец с Себастианом и/или 3+ сердца с Абигейл).
NOT Команда игнорируется, если следующее слово не friendship.
MAIL <letter ID> Запускает следующую команду, если игрок не получил письмо с ID или ID состояния мира (смотри HasFlag в документации Content Patcher); остальное продолжается из команды после этого.
Например: MAIL ccVault/GOTO spring/GOTO summer (запускает GOTO spring если автобус отремонтирован, или GOTO summer если это не так; не ограничиваясь командой GOTO).
GOTO <key> (Примечание: эта строка применяется только в том случае, если GOTO стоит после NOT или MAIL. Если это не так, смотрите GOTO выше.)
Завершите текущий сценарий и вместо этого загрузите расписание с заданным ключом. Если ключ "сезон", вместо него используется название текущего сезона. Если ключ = "NO_SCHEDULE", то у NPC нет расписания на день. Если расписание не существует или не может быть проанализировано, игра вылетает (или покажет ошибку при игре с SMAPI).
Например: GOTO NO_SCHEDULE

Пункты расписания

Остальная часть сценария расписания состоит из записей, разделенных косой чертой, каждая из которых содержит поля, разделенные пробелами, в которых указывается время начала, пункт назначения и действие, которое выполнит NPC, когда достигнет место назначения:

<time> [location] <tileX> <tileY> [facingDirection] [animation] [dialogue]

Если поле location опущено, остальные поля анализируются как обычно. Другие необязательные поля должны быть в последовательном порядке (например, вы можете пропустить animation и dialogue, но не можете пропустить facingDirection а затем укажите animation и dialogue). Исключением является dialogue. dialogue может быть указан без animation.

Поле Описание
time Время, в которое начинается событие расписания, по времени (24-часовой формат, без двоеточия). Времени может предшествовать один символ 'a', чтобы указать, что событие должно завершиться (то есть NPC должен прибыть в пункт назначения) в заданное время. В этом случае игра рассчитает, когда должно начаться событие. Однако событие никогда не начнется раньше времени, указанного для предыдущего события.

В неизмененной игре это используется только для синхронизации расписаний Эмили и Сэнди на 15 число осени.

location

(необязательное) Название местоположения, к которому должен идти NPC. Если этот параметр опущен, по умолчанию используется Автобусная остановка (если замужем за игроком) или их местоположение по умолчанию.

Примечание: в игре есть специальная логика для открываемых локаций. Если это JojaMart/Железная дорога, и она еще недоступна, игра получает место назначения для замены с первой записи в <location>_Replacement расписание, если доступно; в противном случае он переключается на расписание default, если доступно, в противном случае spring. Если это общественный центр, и он еще недоступен, игра переключается на расписание default, если доступно, в противном случае spring.

tileX
tileY
X и Y координаты тайлов NPC должен идти навстречу.
facingDirection (необязательное) Направление, в котором нужно двигаться после достижения пункта назначения. Возможными значениями являются 0 (вверх), 1 (вправо), 2 (вниз), и 3 (влево). По умолчанию вниз.
animation (необязательное) Анимация, которая будет воспроизводиться, когда NPC достигнет места назначения. Это должен быть ключ, который появляется в файле Content/Data/animationDescriptions.xnb. Каждая ключевая запись состоит из трех частей: предварительная анимация/циклическая анимация/пост-анимация. Цифры на них относятся к спрайтам. Предварительная анимация будет воспроизводиться после прибытия в пункт расписания. Затем анимация цикла будет повторяться до конца запланированного времени. Наконец, пост-анимация будет воспроизведена перед переходом к следующему пункту расписания. Обратите внимание, что каждый кадр составляет около 120 мс, поэтому дубликаты кадра используются для получения желаемой анимации.
dialogue наименование]] и ключ ввода в этом формате (включая цитаты): "assetName:key". Любые косые черты в имени ресурса должны быть двойными обратными косыми чертами (\\). Формат ключа ввода не имеет значения, он просто должен соответствовать одному из файла.

Например, "Strings\\schedules\\Abigail:Sun.000" открыть "open the file at Strings\schedules\Abigail.xnb и получить текст Sun.000 key".

Например, рассмотрим эту запись расписания в расписании Абигейл:

1300 Town 47 87 0 "Strings\\schedules\\Abigail:marriage_Mon.001"

В 13:00 (1 час дня), Абигейл начнёт прогулку до координат (47, 87) в городе. Когда она достигнет его, она повернется лицом в направлении 0 (вверх) и скажет "Эй, @. Мне нравится здесь отдыхать... здесь так спокойно."

Потенциальные проблемы

  • Использование времени 600 (когда начинается день) для события может не сработать. Попробуйте использовать 610, если вы хотите провести мероприятие рано утром, NPC не двигается, если используется 600.