Модификации:Расписание: различия между версиями
Shtompel (обсуждение | вклад) |
м (Замена текста — «tt>» на «samp>») |
||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
← [[Модификации:Индекс|Индекс]] | ← [[Модификации:Индекс|Индекс]] | ||
− | + | ||
− | + | На этой странице объясняется, как игра хранит и анализирует данные расписания NPC, которые определяют, куда отправляются NPC и что они делают, когда попадают туда. Это расширенное руководство для разработчиков модов. | |
==Источник== | ==Источник== | ||
− | Данные расписания хранятся в < | + | Данные расписания хранятся в <samp>Content/Characters/schedules/*.xnb</samp> (один файл на персонажа), которые могут быть [[Модификации:Редактирование_XNB_файлов#Распаковывание и упаковывание ресурсов|распакованы для редактирования]]. Вот исходные данные по Абигейл по состоянию на {{version|1.5.1}} для примера: |
{{collapse|Данные|content=<syntaxhighlight lang="json"> | {{collapse|Данные|content=<syntaxhighlight lang="json"> | ||
Строка 35: | Строка 35: | ||
Примечание: | Примечание: | ||
− | * Большинство текстов чувствительны к регистру (т.е. < | + | * Большинство текстов чувствительны к регистру (т.е. <samp>Mon</samp> '''не''' тоже самое, что <samp>mon</samp>). |
− | * Логика игры для ключей расписания находится в < | + | * Логика игры для ключей расписания находится в <samp>NPC::getSchedule</samp>. |
===Расписание в браке=== | ===Расписание в браке=== | ||
Они применяются, если NPC женат на игроке (не обязательно главном). '''Женатые NPC не используют никаких других расписаний.''' | Они применяются, если NPC женат на игроке (не обязательно главном). '''Женатые NPC не используют никаких других расписаний.''' | ||
− | {| class="wikitable" | + | {|class="wikitable" |
|- | |- | ||
! Синтаксис | ! Синтаксис | ||
! Описание | ! Описание | ||
|- | |- | ||
− | | < | + | | <samp>marriage_{{t|season}}_{{t|day of month}}</samp> |
− | | Применяется в указанную дату.<br /><small>Пример: < | + | | Применяется в указанную дату.<br /><small>Пример: <samp>marriage_spring_26</samp></small> |
|- | |- | ||
− | | < | + | | <samp>marriageJob</samp> |
| Используется Харви во вторник/четверг, Мару во вторник/четверг, Пенни во вторник/среду/пятницу. | | Используется Харви во вторник/четверг, Мару во вторник/четверг, Пенни во вторник/среду/пятницу. | ||
|- | |- | ||
− | | < | + | | <samp>marriage_{{t|day of week}}</samp> |
− | | Применяется в указанный день недели, когда нет дождя.<br /><small>Пример: < | + | | Применяется в указанный день недели, когда нет дождя.<br /><small>Пример: <samp>marriage_Mon</samp></small> |
|} | |} | ||
Строка 59: | Строка 59: | ||
Такие расписания применяются к любому NPC, не состоящему в браке. Если ни один из этих ключей не совпадает, у персонажа не будет расписания на этот день. | Такие расписания применяются к любому NPC, не состоящему в браке. Если ни один из этих ключей не совпадает, у персонажа не будет расписания на этот день. | ||
− | {| class="wikitable" | + | {|class="wikitable" |
|- | |- | ||
! Синтаксис | ! Синтаксис | ||
! Описание | ! Описание | ||
|- | |- | ||
− | | < | + | | <samp>{{t|season}}_{{t|day of month}}</samp> |
− | | Применяется в указанную дату.<br /><small>Пример: < | + | | Применяется в указанную дату.<br /><small>Пример: <samp>spring_15</samp></small> |
|- | |- | ||
− | | < | + | | <samp>{{t|day of month}}_{{t|hearts}}</samp> |
− | | Применяется в указанный день месяца, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: < | + | | Применяется в указанный день месяца, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: <samp>11_6</samp></small> |
|- | |- | ||
− | | < | + | | <samp>{{t|day of month}}</samp> |
− | | Применяется в указанный день месяца.<br /><small>Пример: < | + | | Применяется в указанный день месяца.<br /><small>Пример: <samp>16</samp></small> |
|- | |- | ||
− | | < | + | | <samp>bus</samp> |
| Для [[Пэм]], применяется только если автобус отремонтирован. | | Для [[Пэм]], применяется только если автобус отремонтирован. | ||
|- | |- | ||
− | | < | + | | <samp>rain2</samp> |
| 50% шанс в дождливый день. | | 50% шанс в дождливый день. | ||
|- | |- | ||
− | | < | + | | <samp>rain</samp> |
| Применяется в дождливые дни. | | Применяется в дождливые дни. | ||
|- | |- | ||
− | | < | + | | <samp>{{t|season}}_{{t|day of week}}_{{t|hearts}}</samp> |
− | | Применяется в указанный сезон и день недели, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: < | + | | Применяется в указанный сезон и день недели, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: <samp>spring_Mon_6</samp></small> |
|- | |- | ||
− | | < | + | | <samp>{{t|season}}_{{t|day of week}}</samp> |
− | | Применяется в указанный сезон и день недели.<br /><small>Пример: < | + | | Применяется в указанный сезон и день недели.<br /><small>Пример: <samp>spring_Mon</samp></small> |
|- | |- | ||
− | | < | + | | <samp>{{t|day of week}}</samp> |
− | | Применяется в указанный день недели.<br /><small>Пример: < | + | | Применяется в указанный день недели.<br /><small>Пример: <samp>Mon</samp></small> |
|- | |- | ||
− | | < | + | | <samp>{{t|season}}</samp> |
− | | Применяется в указанный сезон.<br /><small>Пример: < | + | | Применяется в указанный сезон.<br /><small>Пример: <samp>spring</samp></small> |
|- | |- | ||
− | | < | + | | <samp>spring_{{t|day of week}}</samp> |
− | | Применяется (в любое время года) в указанный день недели.<br /><small>Пример: < | + | | Применяется (в любое время года) в указанный день недели.<br /><small>Пример: <samp>spring_Mon</samp></small> |
|- | |- | ||
− | | < | + | | <samp>{{t|season}}_{{t|day of week}}_{{t|hearts}}</samp> |
− | | Применяется в указанный сезон, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: < | + | | Применяется в указанный сезон, если у ''любого'' игрока есть по крайней мере столько [[Дружба|сердец]] с NPC. Если применяется несколько расписаний, используется то, у которого наибольшее число сердец.<br /><small>Пример: <samp>spring_Mon_6</samp></small> |
|- | |- | ||
− | | < | + | | <samp>spring</samp> |
| Применяется всегда | | Применяется всегда | ||
|} | |} | ||
Строка 108: | Строка 108: | ||
===Начальные команды=== | ===Начальные команды=== | ||
− | Сценарий может содержать одну начальную команду в качестве первого поля в сценарии перед первым < | + | Сценарий может содержать одну начальную команду в качестве первого поля в сценарии перед первым <samp>/</samp>. Команда <samp>GOTO</samp> также может появиться в следующих двух полях после <samp>MAIL</samp> или в следующем поле после <samp>NOT</samp>. |
− | {| class="wikitable" | + | {|class="wikitable" |
|- | |- | ||
! Команда | ! Команда | ||
! Описание | ! Описание | ||
|- | |- | ||
− | | < | + | | <samp>GOTO {{t|key}}</samp> |
− | | (Примечание: эта строка применяется только в том случае, если < | + | | (Примечание: эта строка применяется только в том случае, если <samp>GOTO</samp> является первой командой. Если это не так, смотри <samp>GOTO</samp> ниже.)<br />Завершите текущий сценарий и вместо этого загрузите расписание с заданным ключом. Если ключ "сезон", вместо него используется текущее название сезона. Если расписание не существует или не может быть проанализировано, вместо него будет использоваться расписание <samp>spring</samp>.<br /><small>Пример: <samp>GOTO spring</samp></small> |
|- | |- | ||
− | | < | + | | <samp>NOT friendship {{t|npc name}} {{t|hearts}}</samp> |
− | | | + | | Завершите текущий сценарий, если ''любого'' игрока ''есть'' как минимум {{t|hearts}} [[Дружба|сердечек]] с любым из указанных NPC (можно перечислить несколько). Если сценарий завершен, то вместо этого используется расписание <samp>spring</samp>. <br /><small>Например: <samp>NOT friendship Sebastian 6 Abigail 3</samp> (сценарий заканчивается, если у любого игрока 6+ сердец с Себастианом и/или 3+ сердца с Абигейл).</small> |
|- | |- | ||
− | | < | + | | <samp>NOT</samp> |
− | | | + | | Команда игнорируется, если следующее слово не <samp>friendship</samp>. |
|- | |- | ||
− | | < | + | | <samp>MAIL {{t|letter ID}}</samp> |
− | | | + | | Запускает следующую команду, если игрок ''не'' получил письмо с 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> |
|- | |- | ||
− | | < | + | | <samp>GOTO {{t|key}}</samp> |
− | | ( | + | | (Примечание: эта строка применяется только в том случае, если <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> |
|} | |} | ||
===Пункты расписания=== | ===Пункты расписания=== | ||
Остальная часть сценария расписания состоит из записей, разделенных косой чертой, каждая из которых содержит поля, разделенные пробелами, в которых указывается время начала, пункт назначения и действие, которое выполнит NPC, когда достигнет место назначения: | Остальная часть сценария расписания состоит из записей, разделенных косой чертой, каждая из которых содержит поля, разделенные пробелами, в которых указывается время начала, пункт назначения и действие, которое выполнит NPC, когда достигнет место назначения: | ||
− | : < | + | : <samp>{{t|time}} {{o|location}} {{t|tileX}} {{t|tileY}} {{o|facingDirection}} {{o|animation}} {{o|dialogue}}</samp> |
− | + | Если поле <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" |
|- | |- | ||
! Поле | ! Поле | ||
! Описание | ! Описание | ||
|- | |- | ||
− | | < | + | | <samp>time</samp> |
− | | | + | | Время, в которое начинается событие расписания, по времени (24-часовой формат, без двоеточия). Времени может предшествовать один символ '<samp>a</samp>', чтобы указать, что событие должно завершиться (то есть NPC должен прибыть в пункт назначения) в заданное время. В этом случае игра рассчитает, когда должно начаться событие. Однако событие никогда не начнется раньше времени, указанного для предыдущего события. |
− | + | В неизмененной игре это используется только для синхронизации расписаний Эмили и Сэнди на 15 число осени. | |
|- | |- | ||
− | | < | + | | <samp>location</samp> |
− | | <p>''( | + | | <p>''(необязательное)'' Название местоположения, к которому должен идти NPC. Если этот параметр опущен, по умолчанию используется [[Автобусная остановка]] (если замужем за игроком) или их местоположение по умолчанию.</p><p>'''Примечание:''' в игре есть специальная логика для открываемых локаций. Если это JojaMart/Железная дорога, и она еще недоступна, игра получает место назначения для замены с первой записи в <samp>{{t|location}}_Replacement</samp> расписание, если доступно; в противном случае он переключается на расписание <samp>default</samp>, если доступно, в противном случае <samp>spring</samp>. Если это общественный центр, и он еще недоступен, игра переключается на расписание <samp>default</samp>, если доступно, в противном случае <samp>spring</samp>.</p> |
|- | |- | ||
− | | < | + | | <samp>tileX</samp><br /><samp>tileY</samp> |
− | | | + | | X и Y [[Модификации:Моддер_гайд/Основы_игры#Тайлы|координаты тайлов]] NPC должен идти навстречу. |
|- | |- | ||
− | | < | + | | <samp>facingDirection</samp> |
− | | ''( | + | | ''(необязательное)'' Направление, в котором нужно двигаться после достижения пункта назначения. Возможными значениями являются 0 (вверх), 1 (вправо), 2 (вниз), и 3 (влево). По умолчанию вниз. |
|- | |- | ||
− | | < | + | | <samp>animation</samp> |
− | | ''( | + | | ''(необязательное)'' Анимация, которая будет воспроизводиться, когда NPC достигнет места назначения. Это должен быть ключ, который появляется в файле <samp>Content/Data/animationDescriptions.xnb</samp>. Каждая ключевая запись состоит из трех частей: предварительная анимация/циклическая анимация/пост-анимация. Цифры на них относятся к [[Модификации:О_NPC#Спрайты|спрайтам]]. Предварительная анимация будет воспроизводиться после прибытия в пункт расписания. Затем анимация цикла будет повторяться до конца запланированного времени. Наконец, пост-анимация будет воспроизведена перед переходом к следующему пункту расписания. Обратите внимание, что каждый кадр составляет около 120 мс, поэтому дубликаты кадра используются для получения желаемой анимации. |
|- | |- | ||
− | | < | + | | <samp>dialogue</samp> |
− | | <p>''( | + | | <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". |
|} | |} | ||
Строка 168: | Строка 168: | ||
В 13:00 (1 час дня), Абигейл начнёт прогулку до координат (47, 87) в городе. Когда она достигнет его, она повернется лицом в направлении 0 (вверх) и скажет "''Эй, @. Мне нравится здесь отдыхать... здесь так спокойно.''" | В 13:00 (1 час дня), Абигейл начнёт прогулку до координат (47, 87) в городе. Когда она достигнет его, она повернется лицом в направлении 0 (вверх) и скажет "''Эй, @. Мне нравится здесь отдыхать... здесь так спокойно.''" | ||
− | == | + | ==Потенциальные проблемы== |
− | * | + | * Использование времени 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/Железная дорога, и она еще недоступна, игра получает место назначения для замены с первой записи в |
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.