维护提醒

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

全站通知:

模组:信件数据

来自星露谷物语维基
跳到导航 跳到搜索

目录

此页面解释游戏如何存储和解析信件数据。这是面向模组开发者的高级指南。

原始数据

信件原始数据存储在Content\Data\Mail.xnb,可以解包以编辑。如下是1.5.1的原始数据以供参考:

格式

每封信件的数据项都有一个用于区分不同信件的唯一键名,其可用于跟踪玩家是否收到信等用途。例如,下述数据项开头的Robin就是所谓的信件键:

"Robin": "Hey there!^I had some extra wood lying around... I thought maybe you could use it. Take care!  ^   -Robin %item object 388 50 %%[#]A Gift From Robin"

键名采用如下格式之一:

语法 描述
<season>_<day of month>_<year> 在指定日期送信。
示例:spring_15_3 表示在第3年春15日送信。
<season>_<day of month> 在任一年的指定日期送信。若送了一封具有上一格式的信,则自动忽略此格式的信。
示例:spring_15 在春15日送信。
任意键名 任何名称,只要不与其他信的键名冲突即可,以便使用代码或事件脚本发送。

每封信件的值具有如下格式:<letter text>[#]<letter name>

<letter name>字段为信件唯一的人类可读名称,会显示在信件收集品页面。

<letter text>为玩家打开信件时显示的文本。可以包含特定标记:

标记 描述
@ 替换为玩家名字。
示例:Hello @!
¦ 依据性别切换信件内容。男性玩家会看到¦之前内容,否则会看见分隔条之后内容。只有第一个分隔条会被识别。若文本不包含分隔条,则所有玩家所见相同。
%item object [<id> <count>]+ %% 随信附上参数列表中一样随机物品。例如%item object 388 50 %%附上50个木材;%item object 388 50 390 10 %%随机附上50个木材或10个石头二者之一。参见模组:物品数据以获取物品ID列表。
%item bigobject [<id>]+ %% 随信附上从参数列表中一件随机的大型打造品。例如,%item bigobject 144 163 %%随机附上一个石头火炬木桶二者之一。参见模组:物品数据以获取大型打造品ID列表。
%item furniture [<id>]+ %% 随信附上参数列表中一件随机家具。例如,%item furniture 1142 709 %%随机附上一个拼图桌胡桃木梳妆台二者之一。参见模组:物品数据以获得家具ID列表。
%item money <amount> %%
%item money <min> <max> %%
随信附上指定数量的钱,或随机数量钱,介于 <min>(含)和 <max>(不含)之间。无论是否使用随机金额,都会就近舍入到10的倍数(例如,156→150)。
%item tools [<type>]+ %% 随信附上一或多件基础品质的工具。可用的类型为AxeHoeCan(水壶)、 PickaxeScythe。无效类型会被忽略。例如,%item tools Axe Scythe %%随信附上一把斧头和一把镰刀
%item conversationTopic <key> <days> %% 在指定天数开启一个对话主题
%item cookingRecipe %% 教会玩家“解锁条件”字段为f <npc name>的烹饪菜谱,其中<npc name>为移除了“Cooking”字样的信件键。例如,若信件键为RobinCooking,则此命令会查找玩家尚未学会的、“解锁条件”字段为f Robin的菜谱。也可以使用%item cookingRecipe <recipe>%%指定菜谱。
%item craftingRecipe <key> %% 教会玩家指定ID的打造配方。键名为物品名称。若物品名称含空格,例如“Mayonnaise Machine”,则需使用下划线替换空格:“Mayonnaise_Machine”。
%item itemRecovery <key> %% 随信附上玩家委托马龙找回的物品(若有)。
%item quest <quest ID> %% 随信任务的ID,以便玩家选择是否接受此任务。
%item quest <quest ID> true %% 添加指定任务ID到信件,并自动添加此任务至玩家的日志。(若玩家设置了NOQUEST_<quest id>信件标识,则不自动添加。)
%secretsanta 若日期为冬18-25日(含端点),则替换为一个随机的鹈鹕镇村民名。否则替换为???

信件标识

概览

游戏会追踪每位玩家的信件标识。之所以这样做,是出于两种意图:

  • 追踪已收到的信。Data\Mail 中每封信的键名就是一个信件标识;若玩家添加了某封信对应的标识,则游戏认为此信已收到。
  • 跟踪世界上与信件无关的更改。例如,artifactFound 标识代表玩家至少找到一件古物,jojaMember 标识代表玩家有Joja会员。以此类推。这些标识都没有对应的信。

可以采用如下方式检查信件标识:

模组类型 信息
Content Patcher 可以使用HasFlag条件以判断是否存在相应标识。例如:
{
    "Action": "EditImage",
    "Target": "Portraits/Abigail",
    "FromFile": "assets/abigail-bow.png",
    "When": {
        "HasFlag": "Beat_PK" // 玩家通关了草原之王游戏
    }
}
C# 模组 主要使用3个字段跟踪标识:
字段 描述
Game1.player.mailForTomorrow 次日即将投递至邮箱的信件。
Game1.player.mailbox 当前正在玩家邮箱中的信件。
Game1.player.mailReceived 为该玩家设定的所有信件标识。包括关于信件和无关于信件的标识。

既可以分别检查这些字段,也可以用Game1.player.hasOrWillReceiveMail(string id)方法一次性检查三个字段。

列表

信件标识的数量非常之多,以至于我们仅列出部分常用标识:

社区中心Joja超市:
标识 含义
abandonedJojaMartAccessible 废弃Joja超市是否可用。
canReadJunimoText 是否可读懂祝尼魔文(即,社区中心内的金色卷轴)。
ccIsComplete 玩家是否完成了社区中心。注意此标识并不可靠;若您正在使用Content Patcher,请转而使用IsCommunityCenterCompleteIsJojaMartComplete标记。

如下标识在完成收集包时或完成社区发展计划时会被设置:

  • ccBoilerRoom(修复矿车);
  • ccBulletin(增加与多数村民的友谊);
  • ccCraftsRoom(修复采石场桥梁);
  • ccFishTank(解锁淘盘);
  • ccPantry(解锁温室);
  • ccVault(解锁公交车并允许进入沙漠)。

您也可以使用如下字段单独检查Joja发展计划:jojaBoilerRoomjojaCraftsRoomjojaFishTankjojaPantryjojaVault.

ccMovieTheater
ccMovieTheaterJoja
是否已建造电影院。若通过社区中心途径建造,则仅设置ccMovieTheater;若通过Joja社区发展途径,则两个标识均设置。
jojaMember 玩家是否购入Joja超市会员。
找到的物品:
标识 含义
artifactFound 玩家至少找到一件古物
galaxySword 玩家获得银河剑
geodeFound 玩家至少找到一个晶球
解锁区域 & 升级 :
区域 标识 含义
秘密森林 beenToWoods 玩家是否至少进入一次秘密森林
小镇 doorUnlock* 玩家是否解锁了指定村民的卧室。针对不同NPC的标识分别为:doorUnlockAbigaildoorUnlockAlexdoorUnlockCarolinedoorUnlockEmilydoorUnlockHaleydoorUnlockHarveydoorUnlockJasdoorUnlockJodidoorUnlockMarniedoorUnlockMarudoorUnlockPennydoorUnlockPierredoorUnlockRobindoorUnlockSamdoorUnlockSebastiandoorUnlockVincent
深山 landslideDone 通往矿井的障碍是否已移除。
缝纫机 openedSewer 玩家是否已解锁缝纫机
鱼店 willyBoatFixed 玩家是否已修复威利的船,从而能去姜岛
姜岛农场 Island_UpgradeParrotPlatform 玩家是否已解锁鹦鹉特快
姜岛农场 Island_UpgradeHouse 玩家是否已解锁姜岛农舍。
姜岛农场 Island_UpgradeHouse_Mailbox 玩家是否已解锁姜岛农场的邮箱。
姜岛农场 Island_W_Obelisk 玩家是否已解锁了姜岛农场上的图腾柱。
姜岛北部 Island_FirstParrot 玩家是否已解锁姜岛北部。
姜岛北部 Island_UpgradeBridge 玩家是否已修复通往姜岛挖掘场的桥梁。
姜岛北部 Island_UpgradeTrader 玩家是否已解锁姜岛商人
姜岛南部 Island_Resort 玩家是否已建造姜岛度假村。
姜岛南部 Island_Turtle 玩家是否已解锁姜岛农场。
火山地牢 Island_VolcanoBridge 玩家是否已解锁火山地牢入口的桥梁。
火山地牢 Island_VolcanoShortcutOut 玩家是否已解锁火山商店的捷径。
完成杀怪目标:
标识 目标 奖励
Gil_Arcane Hat 击杀100只木乃伊 Arcane Hat.png 神秘帽
Gil_Burglar's Ring 击杀500只灰尘精灵 Burglar's Ring.png 窃贼戒指
Gil_Crabshell Ring 击杀60只岩石蟹 Crabshell Ring.png 蟹壳戒指
Gil_Hard Hat 击杀30只掘地虫 Hard Hat.png 安全帽
Gil_Insect Head 击杀125只洞穴昆虫 Insect Head.png 昆虫头部
Gil_Knight's Helmet 击杀50只霸王喷火龙 Knight's Helmet.png 骑士头盔
Gil_Napalm Ring 击杀250只飞蛇 Napalm Ring.png 燃烧弹戒指
Gil_Savage Ring 击杀150只虚空怪 Savage Ring.png 野蛮人戒指
Gil_Skeleton Mask 击杀50只骷髅 Skeleton Mask.png 骷髅面具
Gil_Slime Charmer Ring 击杀1000只史莱姆 Slime Charmer Ring.png 史莱姆克星戒指
Gil_Telephone 击杀150只熔岩精灵 探险家公会的电话号码
Gil_Vampire Ring 击杀200只蝙蝠 Vampire Ring.png 吸血戒指
其他:
标识 含义
Beat_PK 玩家已经通关草原之王街机系统
Farm_Eternal 玩家达成了100%完美度。
guildMember 玩家是探险家公会成员。
JunimoKart 玩家通关了祝尼魔赛车
museumComplete 玩家完成了博物馆收集。
qiChallengeComplete 玩家在完成了齐先生“骷髅洞穴到达25层”的挑战

自定义信件格式

可以通过在信件文本中添加三个自定义命令以自定义信件和秘密纸条(需添加[]字符):

命令 效果
[letterbg <index>] 将默认信纸替换为LooseSprites/letterBG中的原版信纸。其中索引值可以为 0(默认)、1(桑迪的横线纸)、2(巫师信纸)或 3(科罗布斯信纸)。同时自动设置相应的文本颜色,除非另行指定textcolor
[letterbg <asset name> <index>] 将默认信纸替换为给定的贴图。其中素材名称应当为某个两行的贴图集:第一行为320x180像素的信纸背景,第二行为24x24像素的、用于盛放随信物品的方块。索引指示使用第几个贴图,从0开始计数。

同一行只有前4个背景贴图能正确显示。 只能存在一行盛放随信物品的方块的贴图。 如图所示。

[textcolor <color>] 改变文字颜色。可用的颜色名为:blackbluecyangraygreenorangepurpleredwhite
示例:信件的背景图可以在淡粉色、粉色和紫色区域中选取,但方块只能从橙色区域中选取。