BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。
模组:日程数据
← 目录
此页面解释游戏如何存储和解析NPC的日程数据,后者给出NPC前往的地点以及到达相应地点后的行为。这是面向模组开发者的高级指南。
原始数据
日程数据存储在Content/Characters/schedules/*.xnb文件中(每个角色拥有对应名称的日程文件),可以解包以编辑。如下是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"
}
日程键
每条日程都有一个决定其触发条件的键。此键必须精确符合下文提及的若干格式之一(非动态)。若同时有多个键达成其触发条件,则会按照下文提及的优先顺序,选取其中最优先的键。
注意:
- 日程键大小写不敏感。
- 游戏处理日程键的逻辑位于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 spring。MAIL后面跟随的命令不必一定为GOTO命令)。 |
GOTO <key>
|
(注意:此条目描述出现在NOT或MAIL后面的GOTO命令。若GOTO命令位于脚本最开头,请参见上文的GOTO命令。) 结束当前日程,并加载 <key> 对应的日程。若<key> 为 "season",则自动使用当前季节的日程。若<key> 为 "NO_SCHEDULE" ,则此NPC在当天无日程。若指定的日程不存在或无法解析,游戏就会崩溃(若正在使用SMAPI,则会报错)。示例:GOTO NO_SCHEDULE |
日程点
日程脚本的其余部分为使用斜杠分隔的条目,每个条目都包含使用空格分隔的一系列字段,以规定起始时间、目的地、NPC到达目的地后的行为:
<time>
[location]
<tileX>
<tileY>
[facingDirection]
[animation]
[dialogue]
若省略location字段,则会正常解析余下的字段。除此之外,其他可选字段必须按顺序排列(例如,可以省略animation和dialogue,但不能省略facingDirection然后再指定animation和dialogue)。其中dialogue是个例外。我们可以在省略animation的情况下直接指定dialogue。
字段 | 描述 |
---|---|
time | 此条日程的开始时间,使用24小时制,没有冒号。可以在事件前面添加字符 'a' 指定此日程的结束时间(也就是NPC到达目的地的时间)。在这种情况下,游戏会自动计算此日程的开始时间。然而,此日程不会早于前一事件的time开始。
在原版游戏中,这仅用于同步艾米丽和桑迪在秋15日的日程。 |
location | (可选)此NPC应当前往的地点名称。若省略,默认为前一条命令提及的地图;若当前命令就是第一条命令,则默认为巴士站(若已婚)或默认地点。 注意:游戏对于可解锁地点有特殊的逻辑。若此地点为Joja超市/铁路且不可用,则游戏会从 注意:若地点为 |
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 Y或laying_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_beach和change_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移动。