维护提醒

BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。

全站通知:

模组:日程数据

来自星露谷物语维基
(重定向自模组:行程数据
跳到导航 跳到搜索

目录

此页面解释游戏如何存储和解析NPC的日程数据,后者给出NPC前往的地点以及到达相应地点后的行为。这是面向模组开发者的高级指南。

原始数据

日程数据存储在Content/Characters/schedules/*.xnb文件中(每个角色拥有对应名称的日程文件),可以解包以编辑。如下是1.5.1版本的阿比盖尔的日程原始数据,以供参考:

日程键

每条日程都有一个决定其触发条件的键。此键必须精确符合下文提及的若干格式之一(非动态)。若同时有多个键达成其触发条件,则会按照下文提及的优先顺序,选取其中最优先的键。

注意:

  • 日程键大小写不敏感。
  • 游戏处理日程键的逻辑位于NPC::TryLoadSchedule()

特殊日程

此类键最先检查,无论此角色是否已婚。

语法 概述
GreenRain 在第一年的绿雨天触发。

结婚日程

若此NPC已与玩家结婚(无需是主玩家),则会触发结婚日程。已婚NPC不会使用其他日程键。 若NPC已婚,但没有满足条件的结婚日程,则在当天不会有任何日程。

语法 概述
marriage_<festival ID>_<festival day>
marriage_<festival ID>
夜市等被动节日活动期间触发。其中<festival ID>Data/PassiveFestivals中的节日键,而<festival day>是指此节日的第几天,例如节日开始的第一天为 1 。
marriage_<season>_<day of month> 在指定日期触发。
示例:marriage_spring_26
marriageJob 哈维会在星期二/星期四使用此日程,玛鲁会在星期二/星期四使用此日程,潘妮会在星期二/星期三/星期五使用此日程。其他NPC均不可使用marriageJob键,除非借助C#修改了游戏代码。
marriage_<day of week> 在每个星期的同一天(且当天不下雨)触发此日程。
示例: marriage_Mon

正常日程

此类日程适用于任何未与玩家结婚的NPC。若没有满足条件的日程,则在当天不会有任何日程。

语法 概述
<festival ID>_<festival day>
<festival ID>
夜市等被动节日活动期间触发。其中<festival ID>Data/PassiveFestivals中的节日键,而<festival day>是指此节日的第几天,例如节日开始的第一天为 1 。
<season>_<day of month> 在指定日期触发。
示例: spring_15
<day of month>_<hearts> 玩家之一与该NPC有至少<hearts>颗心的友谊,则在每月的指定日期触发。若同时有多个此类日程满足触发条件,则应用<hearts>最高的日程。
示例: 11_6
<day of month> 在每月的指定日期触发。
示例: 16
bus 仅用于潘姆,在公交车修好后触发。
rain2 雨天有50%几率触发。
rain 雨天触发。
<season>_<day of week>_<hearts> 玩家之一与该NPC有至少<hearts>颗心的友谊,则在指定季节的每个星期的指定一天触发此日程。若同时有多个此类日程满足触发条件,则应用<hearts>最高的日程。
示例:spring_Mon_6
<season>_<day of week> 在指定季节的每个星期的同一天触发此日程。
示例:spring_Mon
<day of week>_<hearts> 玩家之一与该NPC有至少<hearts>颗心的友谊,在每个星期的同一天触发此日程。若同时有多个此类日程满足触发条件,则应用<hearts>最高的日程。
示例: Mon_6
<day of week> 在每个星期的同一天触发此日程。
示例:Mon
<season> 在指定季节触发此日程。
示例:spring
spring_<day of week> 在每个季节的每个星期的同一天触发此日程。
示例:spring_Mon
spring 每天都触发此日程。此日程在某些情况下用作默认日程。
请勿删除此日程,否则会导致游戏崩溃。
default 此日程偶尔也会被用作默认日程。此日程可以不存在,这种情况下会将spring日程用作默认日程。

日程脚本

格式

每条日程都是一个值对,其中的值为用斜杠分隔的任意多条命令,如下所示:

日程脚本可以写在一行:

"Wed": "1000 ArchaeologyHouse 11 9 0/1800 Town 47 87 0/2200 SeedShop 1 9 3 abigail_sleep"

也可酌情添加空白字符以提高易读性:

"Wed": "
    1000 ArchaeologyHouse 11 9 0/
    1800 Town 47 87 0/
    2200 SeedShop 1 9 3 abigail_sleep
"

起始命令

一个脚本可能以如下的起始命令之一开头。如下所述的GOTO命令也可能出现在MAIL后的两条命令之内,或紧随NOT之后出现。

命令 描述
GOTO <key> (注意:这段文字是关于位于脚本最开头的GOTO命令的;若不是位于脚本开头,请参见下文的GOTO命令。)
结束当前脚本并加载指定日程键的脚本。其中<key>可以为任何字符串。若其为 "season" 则会自动替换为当前季节名。若其指定的日程键不存在或无法被解析,则默认使用spring日程。
示例:GOTO spring
NOT friendship <npc name> <hearts> 玩家之一<npc name>列出的NPC之一有至少<hearts>颗心的友谊,则结束当前日程(可列出多个NPC)。若当前日程结束,则使用spring日程。
示例:NOT friendship Sebastian 6 Abigail 3(若某一玩家与塞巴斯蒂安有6+颗心的友谊或与阿比盖尔有3+颗心的友谊则结束此日程)。
NOT 若下一个单词不是friendship则结束此日程。
MAIL <letter ID> 若玩家没有收到指定的信件ID或世界状态ID(参见Content Patcher 文档HasFlag),则运行下一条命令;否则,运行下下条命令。
示例:MAIL ccVault/GOTO spring/GOTO summer(若巴士站已修复,则运行GOTO summer;若未修复,则运行GOTO springMAIL后面跟随的命令不必一定为GOTO命令)。
GOTO <key> (注意:此条目描述出现在NOTMAIL后面的GOTO命令。若GOTO命令位于脚本最开头,请参见上文的GOTO命令。)
结束当前日程,并加载<key>对应的日程。若<key>为 "season",则自动使用当前季节的日程。若<key>为 "NO_SCHEDULE" ,则此NPC在当天无日程。若指定的日程不存在或无法解析,游戏就会崩溃(若正在使用SMAPI,则会报错)。
示例:GOTO NO_SCHEDULE

日程点

日程脚本的其余部分为使用斜杠分隔的条目,每个条目都包含使用空格分隔的一系列字段,以规定起始时间、目的地、NPC到达目的地后的行为:

<time> [location] <tileX> <tileY> [facingDirection] [animation] [dialogue]

若省略location字段,则会正常解析余下的字段。除此之外,其他可选字段必须按顺序排列(例如,可以省略animationdialogue,但不能省略facingDirection然后再指定animationdialogue)。其中dialogue是个例外。我们可以在省略animation的情况下直接指定dialogue

字段 描述
time 此条日程的开始时间,使用24小时制,没有冒号。可以在事件前面添加字符 'a' 指定此日程的结束时间(也就是NPC到达目的地的时间)。在这种情况下,游戏会自动计算此日程的开始时间。然而,此日程不会早于前一事件的time开始。

在原版游戏中,这仅用于同步艾米丽和桑迪在秋15日的日程。

location

(可选)此NPC应当前往的地点名称。若省略,默认为前一条命令提及的地图;若当前命令就是第一条命令,则默认为巴士站(若已婚)或默认地点。

注意:游戏对于可解锁地点有特殊的逻辑。若此地点为Joja超市/铁路且不可用,则游戏会从<location>_Replacement日程中抽取第一个可用的地点(若存在);否则,会切换到default日程(若存在);若都不可用,则切换到spring日程。若此地点为社区中心且不可用,则游戏会切换到default日程(若存在),否则会切换spring日程。

注意:若地点为bed,则游戏会忽略此日程点的其余参数,并尝试加载“回家”目的地(地图和坐标):对于已婚NPC,此目的地为BusStop中通往Farm的传送口,对于其他NPC,此目的地为defaultspring日程的最后一个地点(若这些都不能正常加载或解析,则为此NPC的默认地点)。在此NPC回家后,若有睡眠动画,则播放此动画(<lowercase name>_sleep,位于Data/animationDescriptions)。

tileX
tileY
此NPC应当前往的 X-Y 地块坐标
facingDirection (可选)到达目的地后面向的方向。可用的取值为 0(上)、1(右)、2(下)、3(左)。默认为 2 。
animation (可选)此NPC到达目的地后播放的动画。此字段必须为Content/Data/animationDescriptions.xnb文件中出现的某个键名。Content/Data/animationDescriptions由一系列键值对组成,其中“值”必须包括3个部分:进入帧/重复帧/离开帧,其中的数字代表全身贴图的索引。到达日程点时会播放进入帧,然后循环播放重复帧,离开日程点前播放离开帧。注意每一帧大约持续120毫秒,因此可以通过连续放置多张相同的帧来调节播放速度。

完整的格式为进入帧/重复帧/离开帧/消息键/offset X Y/laying_down. 若指定了消息键,则玩家在动画期间与此NPC对话,此NPC会重复消息键的消息。(TODO: 这似乎是“忙时聊天”,给予的友谊点数更少,待验证。)offset X Y允许对NPC贴图施加偏移,单位为像素。laying_down会隐藏角色阴影。若希望使用offset X Ylaying_down,但不希望指定消息键,则将消息键留空即可。例如:"haley_beach_towel": "20 20 21 21 21 21 21/22/21 21 20//laying_down/offset 0 16"

另外,存在一些特殊动画。如果动画名称中出现了sleep,则会使得此NPC入睡(睡觉动画期间,玩家无法与NPC交谈、无法赠与礼物)。当NPC从姜岛回来时,或已婚NPC上床睡觉时,会自动使用专用动画NPCName_sleep(NPCName应当全小写)。square_X_Y_facing使得NPC在最大 X × Y 的矩形里运动(实际运动范围可能少于此),矩形中心为此日程点。他们偶尔会暂停并面向facing的方向。 change_beachchange_normal会使NPC穿上或脱下他们的海滩服装,用于姜岛度假村日程。
dialogue

(可选)NPC到达目的地后的对话。必须为 "素材名称:键名" 的格式(包括双引号)。其中“素材名称”中的斜杠应当替换为双反斜杠(\\),而“键名”则无所谓,只要能匹配上素材文件中的某一条目即可

例如,"Strings\\schedules\\Abigail:Sun.000"的意思是“打开文件Strings\schedules\Abigail.xnb,并获取Sun.000键对应的文本”。

提示:若希望在结婚日程中使用日程对话,可以在“键名”中插入字符串marriage,这会使得此对话仅对该NPC的配偶显示。

例如,考虑如下的阿比盖尔日程:

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

在13:00,阿比盖尔会前往小镇的(47, 87)地块。当她到达时,会面向方向0(上方),并说 "Hey, @. I like to relax here... it's so peaceful."。

潜在问题

  • 在日程中使用时刻“600”(即,一天开始时)可能无法正常工作。若您希望事件在清晨发生,请使用610,因为使用600不能使NPC移动。