Modding:Datos de horarios

De Stardew Valley Wiki
Ir a la navegación Ir a la búsqueda

Índice

Esta página explica cómo funcionan los horarios de PNJs, lo que determina a dónde va un PNJ (y qué hacen al llegar). Esta es una guía avanzada para desarrolladores de mods.

Datos base

La información de horarios es guardada en Content/Characters/schedules/*.xnb (uno para cada personaje), los que pueden ser descomprimidos para editar. Como ejemplo, esta es la información de Abigail (de la versión 1.5.1):

Data 
{
  "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"
}

Clave/nombre de horario

Cada horario tiene un nombre, para decidir cuándo se aplica. Debe seguir el siguiente formato (no es dinámico). Si múltiples horarios coinciden, el juego usará el primero de estos.

Notas:

  • La mayoría de texto diferencia las mayúsculas (e.j., Mon no es lo mismo que mon).
  • El juego decide cómo elegir horarios usando NPC::getSchedule.

Horarios de matrimonio

Éstos se aplican si un PNJ se casa con un/a jugador/a. Los PNJs casados no usan otras claves. Si las claves no coinciden, el personaje no tendrá un horario ese día.

síntax resumen
marriage_<temporada>_<día del mes> Se aplica en el día dado.
Ejemplo: marriage_spring_26
marriageJob Usado por Harvey (y Maru) los Martes/Jueves, y por Penny los Martes/Miércoles/Viernes.
marriage_<día de la semana> Se aplica ese día si no está lloviendo.
Ejemplo: marriage_Mon

Horarios normales

Estos horarios aplican para cualquier PNJ (que no se case contigo). Si ninguna clave coincide, no tendrán un horario ese día. (Las claves deben estar en inglés: ej. para un horario de otoño, usa "fall").

syntax resumen
<temporada>_<día del mes> Se aplica el día dado.
Ejemplo: spring_15
<día del mes>_<corazones> Se aplica en ese día del mes si cualquier jugador tiene esa cantidad de amistad con el PNJ. Si múltiples coinciden, se usa la que tenga la mayor cantidad de corazones.
Ejemplo: 11_6
<día del mes> Se aplica en ese día del mes.
Ejemplo: 16
bus Sólo para Pam, se aplica si se repara el bus.
rain2 50% de aplicarse los días de lluvia.
rain Se aplica en días de lluvia.
<temporada>_<día de la semana>_<hearts> Se aplica en esa temporada y día de la semana, si cualquier jugador tiene esa cantidad de amistad con el PNJ. Si múltiples coinciden, se usa la que tenga la mayor cantidad de corazones.
Ejemplo: spring_Mon_6
<temporada>_<día de la semana> Se aplica en esa temporada y día de la semana.
Ejemplo: spring_Mon
<día de la semana> Se aplica ese día de la semana.
Ejemplo: Mon
<temporada> Se aplica en esa temporada.
Ejemplo: spring
spring_<día de la semana> Se aplica (en cualquier temporada) en ese día de la semana.
Ejemplo: spring_Mon
<temporada>_<día de la semana>_<corazones> Se aplica en esa temporada, si cualquier jugador tiene esa cantidad de amistad con el PNJ. Si múltiples coinciden, se usa la que tenga la mayor cantidad de corazones.
Ejemplo: spring_Mon_6
spring Siempre se usa. También es el horario por defecto en algunos casos. NO ELIMINAR- CAUSARÁ PROBLEMAS EN EL JUEGO.
default También usada por defecto. No hay problema si ésta no existe, se usará spring en vez.

Script de horarios

Cada valor de entrada de programación tiene un número arbitrario de comandos de programación delimitados por barra que coinciden con uno de los formatos a continuación.

Comandos iniciales

Un script puede tener un comando inicial como el primer campo en el script, antes del primer campo / carácter. El Comando GOTO también puede aparecer en los siguientes dos campos después de MAIL, o el siguiente campo después de NOT.

comando descripción
GOTO <clave> (Nota: esta línea solo se aplica si GOTO es el primer comando. Si no es así, mira el GOTO de abajo.)
Termine el script actual y cargue el horario con la clave dada. La clave no necesita ser una de las claves estándar y puede ser cualquier cadena arbitraria. Si la clave es una "season", se usa el nombre de la temporada actual. Si el horario no existe o no se puede analizar, spring es el horario se usa en su lugar.
Ejemplo: GOTO spring
NOT friendship <nombre del npc> <corazones> Finaliza el script actual si cualquier jugador tiene al menos esa cantidad de corazones con cualquiera de los NPC nombrados (puede enumerar múltiples). Si el script ha finalizado, el horario spring se usa en su lugar.
Ejemplo: NOT friendship Sebastian 6 Abigail 3 (el script termina si algún jugador tiene 6+ corazones con Sebastian y/o 3+ corazones con Abigail).
NOT Comando ignorado si la siguiente palabra no es friendship.
MAIL <Letra del ID> Ejecuta el siguiente comando si el jugador no recibió la letra ID proporcionada o el ID del estado del mundo (ver HasFlag en la Documentación de Content Patcher); además continúa desde el comando después de eso.
Ejemplo: MAIL ccVault/GOTO spring/GOTO summer (Ejecuta GOTO summer si el autobús esta reparado, o GOTO spring si no lo esta; No esta limitado los comandos GOTO).
GOTO <clave> (Nota: esta línea solo se aplica si el GOTO esta después del NOT o del MAIL. Si no es así, mira el GOTO de arriba.)
Finaliza el script actual y cargue el horario con la clave dada. Si la clave es una "season", se usa el nombre de la temporada actual. Si la clave es "NO_SCHEDULE", el NPC no tiene horario para el día. Si el horario no existe o no se puede analizar, el juego se bloquea (o muestra un error si se juega con SMAPI).
Ejemplo: GOTO NO_SCHEDULE

Horarios de puntos

El resto del script de programación consta de entradas delimitadas por barras diagonales, cada una de las cuales contiene campos separados por espacios que especifican una hora de inicio, un destino y qué hacer cuando el NPC llegue allí:

<tiempo> [ubicación] <baldosaX> <baldosaY> [direcciondeOrientacion] [animación] [dialogo]

Si el campo ubicación es omitido, el resto de campos se interpretan normalmente. Los otros campos opcionales deben estar en orden secuencial (e.j., puedes saltar animación y diálogo, pero no puedes saltar direcciónDeOrientación y luego especificar animación seguido de diálogo). La única excepción es diálogo. El diálogo puede ser especificado sin una animación.

campo descripción
tiempo La hora a la que comienza este punto, en horario militar (24 horas, sin coma). La hora puede llevar una 'a' antes para indicar que el evento debería terminar (o sea, que el PNJ ya debería estar allí) a esa hora. En este caso, el juego calculará cuándo tiene que empezar. Sin embargo, el evento no puede comenzar a la misma hora que el anterior (ni antes).

En el juego vainilla, sólo se usa para sincronizar el horario de Emily y Sandy en Otoño 15.

ubicación

(optional) The location name the NPC should walk towards. If omitted, defaults to the bus stop (if married to a player) or their default location.

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 <location>_Replacement schedule if available; otherwise it switches to the default schedule if available, else spring. If this is CommunityCenter and it's not available yet, the game switches to the default schedule if available, else spring.

baldosaX
baldosaY
Las coordenadas X e Y hacia las que el PNJ debe caminar.
direcciónDeOrientación (opcional) La dirección que mirar luego de llegar a la destinación. Puede ser 0 (arriba), 1 (derecha), 2 (abajo), o 3 (izquierda). Por defecto, es abajo.
animación (opcional) The animation to play when the NPC reaches the destination. This must be a key that appears in the Content/Data/animationDescriptions.xnb file. Each key entry has three parts: pre animation/looping animation/post animation. The numbers on them refer to the 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.

There are a few special animations. sleep anywhere in an animation name causes the NPC to go to sleep (which, among other things, prevents players from gifting or talking to the NPC while the animation is active.) The specific animation NPCName_sleep (with the NPCName fully lowercased) automatically used by spouses when they turn in for the night, and by NPCs coming home from Ginger Island. square_X_Y_facing causes NPCs to make random movements in a rectangle of at most X by Y (it can be less), centered at the schedule point. They will occasionally pause and face the facing direction. change_beach and change_normal cause NPCs to change into and out of their beach outfits, and is used by Ginger Island resort schedules.
diálogo

(opcional) The dialogue the NPC should use when they reach their destination. This must be an asset name and entry key in this exact format (including quotes): "assetName:key". Any slashes in the asset name should be double backslashes (\\). The format of the entry key doesn't matter, it just needs to match one in the file.

For example, "Strings\\schedules\\Abigail:Sun.000" means "open the file at Strings\schedules\Abigail.xnb and get the text of the Sun.000 key".

Por ejemplo, considere esta entrada de horario, en el horario de Abigail:

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

A las 13:00 (1pm), Abigail empezará a caminar a la baldosa (47, 87) en la ubicación Town (el pueblo). Cuando llegue, mirará a la dirección 0 (arriba) y dirá "Ey, @. Me gusta relajarme aquí... Cuánta tranquilidad."

Posibles problemas

  • Usar la hora 600 (inicio del día) puede no funcionar. Intenta usar 610 si quieres que algo pase en la mañana, y si el PNJ no se mueve después de las 600.