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

Материал из Stardew Valley Wiki
Перейти к навигации Перейти к поиску
Строка 135: Строка 135:
 
: <tt>{{t|time}} {{o|location}} {{t|tileX}} {{t|tileY}} {{o|facingDirection}} {{o|animation}} {{o|dialogue}}</tt>
 
: <tt>{{t|time}} {{o|location}} {{t|tileX}} {{t|tileY}} {{o|facingDirection}} {{o|animation}} {{o|dialogue}}</tt>
  
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>.
+
Если поле <tt>location</tt> опущено, остальные поля анализируются как обычно. Другие необязательные поля должны быть в последовательном порядке (например, вы можете пропустить <tt>animation</tt> и <tt>dialogue</tt>, но не можете пропустить <tt>facingDirection</tt> а затем укажите <tt>animation</tt> и <tt>dialogue</tt>). Исключением является <tt>dialogue</tt>. <tt>dialogue</tt> может быть указан без <tt>animation</tt>.
  
 
{| class="wikitable"
 
{| class="wikitable"
Строка 143: Строка 143:
 
|-
 
|-
 
| <tt>time</tt>
 
| <tt>time</tt>
| 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-часовой формат, без двоеточия). Времени может предшествовать один символ '<tt>a</tt>', чтобы указать, что событие должно завершиться (то есть NPC должен прибыть в пункт назначения) в заданное время. В этом случае игра рассчитает, когда должно начаться событие. Однако событие никогда не начнется раньше времени, указанного для предыдущего события.
  
In the unmodified game, this is only used to synchronise Emily's and Sandy's schedules on Fall 15.
+
В неизмененной игре это используется только для синхронизации расписаний Эмили и Сэнди на 15 число осени.
 
|-
 
|-
 
| <tt>location</tt>
 
| <tt>location</tt>
| <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/Железная дорога, и она еще недоступна, игра получает место назначения для замены с первой записи в <tt>{{t|location}}_Replacement</tt> расписание, если доступно; в противном случае он переключается на расписание <tt>default</tt>, если доступно, в противном случае <tt>spring</tt>. Если это общественный центр, и он еще недоступен, игра переключается на расписание <tt>default</tt>, если доступно, в противном случае <tt>spring</tt>.</p>
 
|-
 
|-
 
| <tt>tileX</tt><br /><tt>tileY</tt>
 
| <tt>tileX</tt><br /><tt>tileY</tt>
| The X and Y [[Modding:Modder Guide/Game Fundamentals#Tiles|tile coordinates]] the NPC should walk towards.
+
| X и Y [[Модификации:Моддер_гайд/Основы_игры#Тайлы|координаты тайлов]] NPC должен идти навстречу.
 
|-
 
|-
 
| <tt>facingDirection</tt>
 
| <tt>facingDirection</tt>
| ''(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>
 
| <tt>animation</tt>
| ''(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 достигнет места назначения. Это должен быть ключ, который появляется в файле <tt>Content/Data/animationDescriptions.xnb</tt>. Каждая ключевая запись состоит из трех частей: предварительная анимация/циклическая анимация/пост-анимация. Цифры на них относятся к [[Модификации:О_NPC#Спрайты|спрайтам]]. Предварительная анимация будет воспроизводиться после прибытия в пункт расписания. Затем анимация цикла будет повторяться до конца запланированного времени. Наконец, пост-анимация будет воспроизведена перед переходом к следующему пункту расписания. Обратите внимание, что каждый кадр составляет около 120 мс, поэтому дубликаты кадра используются для получения желаемой анимации.
 
|-
 
|-
 
| <tt>dialogue</tt>
 
| <tt>dialogue</tt>
| <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|наименование]] и ключ ввода в этом формате (включая цитаты): <tt>"assetName:key"</tt>. Любые косые черты в имени ресурса должны быть двойными обратными косыми чертами (<tt>\\</tt>). Формат ключа ввода не имеет значения, он просто должен соответствовать одному из файла.</p><p>Например, <tt>"Strings\\schedules\\Abigail:Sun.000"</tt> открыть "open the file at <tt>Strings\schedules\Abigail.xnb</tt> и получить текст <tt>Sun.000</tt> key".
 
|}
 
|}
  

Версия 07:59, 8 сентября 2021

Индекс

Robin building.png
“Предстоит ещё много работы...”
— Робин

Неполный перевод

Эта статья или её часть до сих пор не переведены на русский язык. Вы можете оказать помощь в переводе путем ее редактирования.
Последний раз редактировалось Shtompel в 2021-09-08 07:59:49.

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