Модификации:Расписание
← Индекс
На этой странице объясняется, как игра хранит и анализирует данные расписания 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.