Модификации:Расписание

Материал из Stardew Valley Wiki
Перейти к навигации Перейти к поиску

Индекс

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