真·符文 - 强大日程补丁器

真·符文 - 强大日程补丁器

条件性 NPC 日程安排

模组工具

真实符文:日程安排官 — 条件性NPC日程

他们去哪。他们何时去。他们为何去。一切尽在JSON中。

球场

掉落每个NPC一个JSON文件,并赋予他们根据世界状态变化的日常行程:季节、天气、你与谁亲近、是否在约会或结婚、你经历过的故事事件。自动选择正确路线,在选项间轮换以增加多样性,一旦你的条件不匹配就回退到原版设置——所有这一切都不需要在原始日程字符串中数正斜杠。

真言符文:时间调度器通过一个责任链解析器挑选最匹配的例行程序:每一个条件都会缩小候选范围,然后通过优先级 → 特异性 → 轮换顺序选出胜出者。游戏依然会进行全部的寻路过程——你只需描述这一天。

与 Content Patcher 配合使用

两者都可编辑Characters/schedules/*,但处于不同层级。Content Patcher 让你通过自身条件对日程字符串进行原始控制。Schedule Director 则提供一种结构化的运行时解析器,能实现原版无法表达的跨NPC逻辑——并以Late优先级写入结果,因此当你的规则匹配时它能生效,不匹配时则完全不影响你的 Content Patcher 或原版日程。

您将获得

  • 每个NPC一个文件,多个日程。 每个候选内容是一整天的路线及其适用条件。
  • 原版无法实现的条件。 根据以下条件自由组合来限制路线:其他NPC的好感度、约会/结婚状态、舞伴、已触发事件、邮件标记(且/或/禁止)、天气、季节、星期、日期/年份范围。
  • 优先级 + 轮换。 最高优先级的匹配获胜。打平了?相同具体程度的路由按日轮换,采用随机循环方式,这样你的NPC就不会永远做完全相同的事了。
  • 命名地点标记。 使用 "point": "beach_pier_1" 代替记忆瓦片坐标。包含已验证可行走位置的初始注册表;你可以在 points.json 中添加自己的标记。
  • 优先于原版并自动回退。 无匹配则不修改 = 原版正常运行。节日天数默认保持不变。
  • 无和谐。 纯SMAPI资产管道。游戏像处理其他任何日程一样,解析并路径查找您的路线。
  • 工具包的一部分。 一个内容包可以在单个TrueRune/文件夹下携带日程和事件和对话——每个真符文框架都会扫描其所属的子文件夹。

混凝土对比——相同思路,普通版 vs. TRS

原版日程字符串 — 每个键对应一条用斜杠分隔的超长字符串,并且无法指定“仅在玩家同时靠近艾米丽和潘妮时”这样的条件。

"summer": "900 HaleyHouse 6 5 0/1000 Beach 27 34 2 haley_beach_towel/1700 Town 47 87 2/2200 HaleyHouse 1 5 3 haley_sleep"

TRS中的同一天 — 命名区域、命名点以及一个条件块:

{
  "npc": "海莉",
  "日程安排": [
    {
      "id": "summer_sunny_beach",
      "priority": 20,
      "conditions": { "seasons": ["夏季"], "weather": ["晴朗"] },
      "点数": [
        { "time": 900, "point": "haley_home_door" },
        { "time": 1000, "point": "beach_towel", "animation": "haley_beach_towel" },
        { "time": 1700, "point": "town_plaza" },
        { "time": 2200, "point": "haley_home_bed", "animation": "haley_sleep" }
      ]
    }
  ]
}

教程 — 根据你的存档做出反应的分层例程

将更多候选内容添加到同一个文件中。优先级更高的获胜;解析器会自动降级到下一个匹配项。

"schedule": {
  "_married": [
    {
      "id": "married_morning_walk",
      "priority": 40,
      "conditions": { "is_spouse": true, "weather": ["sunny"] },
      "points": [
        { "time": 1000, "point": "beach_entrance" },
        { "time": 1800, "point": "haley_home_couch" }
      ]
    }
  ],
  "_close_to_the_girls": [
    {
      "id": "double_date_prep",
      "priority": 30,
      "conditions": {
        "seasons": ["夏季"], "weather": ["晴朗"],
        "npc_heart_conditions": [
          { "npc": "艾米莉", "min_heart": 6 },
          { "npc": "佩妮", "min_heart": 6 }
        ]
      },
      "points": [
        { "time": 900,  "point": "town_plaza" },
        { "time": 1100, "point": "beach_pier_1" },
        { "time": 1700, "point": "saloon_bar" },
        { "time": 2330, "point": "海莉家_床", "animation": "海莉_睡觉" }
      ]
    }
  ],
  "_default_rotation": [
    { "id": "default_museum", "priority": 0, "points": [ { "time": 1000, "point": "town_museum_steps" }, { "time": 2200, "point": "haley_home_bed", "animation": "haley_sleep" } ] },
    { "id": "default_pierre", "priority": 0, "points": [ { "time": 1000, "point": "pierre_shop_floor" }, { "time": 2200, "point": "haley_home_bed", "animation": "haley_sleep" } ] }
  ]
}

作用:

  • 已婚 + 晴天 → 晨间散步(优先级40)。
  • 否则,夏季 + 晴天 + 6♥ 同时拥有艾米丽和佩妮 → 外出之日(优先级30)——这是基础游戏根本无法表达的跨NPC条件。
  • 否则,这两项优先级为0的默认设置会平局,所以Haley会在博物馆和皮埃尔的店铺之间交替工作。
  • 完全没有任何匹配项?TRS不会写入任何内容,而海莉将遵循她的原版日程安排。

分组键(_married、_seasonal、…)仅用于在编辑器中折叠段落——它们在运行时会被忽略。你也可以使用扁平数组。

命名地点

根据键值引用可复用地点;在TrueRune/schedules/points.json中放入你自己的地点。

"points": {
  "beach_pier_1": { "location": "海滩", "x": 38, "y": 36, "facing": "向下" }
}

你的地点会叠加到内置的注册表上。在游戏中运行 rune_sched_points 来列出所有已加载的键。

安装后即可立即使用

该框架为Haley提供了一份烟雾测试日程,通过一个标记进行控制,因此除非你主动要求,否则它永远不会影响真实的存档。加载游戏并运行 rune_sched_smoke Haley —— 她就会前往海滩,确认一切连接正常。运行 rune_sched_try Haley 可打印出她将要遵循的具体日程字符串。

作者快速入门指南

MySchedulePack/
├── manifest.json    (ContentPackFor: "Riou.TrueRune.Schedules")
└── TrueRune/
    └── 日程表/
        ├── Haley.json
        └── points.json

manifest.json:

{
  "Name": "我的日程包",
  "作者": "你",
  "版本": "1.0.0",
  "描述": "海莉的新日程。",
  "UniqueID": "You.MySchedulePack",
  "ContentPackFor": { "UniqueID": "Riou.TrueRune.Schedules", "MinimumVersion": "1.0.0" }
}

将文件夹拖入 Stardew Valley/Mods/ → 启动 → 睡一觉。整个流程就是这样。

条件参考

  • required_AND_flags / required_OR_flags / forbidden_flags — 邮件标识
  • required_seen_events — 事件IDs 在 eventsSeen 中
  • min_heart / max_heart — 与该NPC的好感度
  • npc_heart_conditions — 与其他NPC的好感度
  • 季节 / 星期 / 最小天数–最大天数 / 最小年份–最大年份
  • 天气 — 晴天 / 雨天 / 暴风雨 / 雪天 / 大风
  • 是配偶 / 在约会中 / 是舞伴

地点参考

  • time — 军事时间,无冒号(900 = 上午9点)。arrive_by 添加“到达时间”前缀。
  • 点 — 注册表键 — 或内部 位置 + x + y
  • 朝向 — 上/右/下/左(或 0–3)
  • 动画 — 动画描述键 (haley_beach_towel, square_5_3, 任意 *sleep*)
  • 对话 — 位置对话令牌
  • 位置:"床" — 回家睡觉

完整模式+一个完整的工作包(samples/Sample-HaleyBeachDayPack/)包含在下载内容中。作者指南:docs/SCHEDULE_AUTHORING.md。

安装

  1. 安装 SMAPI 4.0 或更高版本
  2. 推荐: 通用模组配置菜单 用于游戏内设置页面
  3. 将解压后的文件夹拖入 Stardew Valley/Mods/
  4. 安装任何需要此框架的内容包

控制台命令(前缀为 rune_sched_)

  • rune_sched_list [NPC] — 有日程的NPC,或某个NPC的所有候选者
  • rune_sched_try <NPC> — 当前哪位候选人获胜 + 已编译的日程字符串
  • rune_sched_apply [NPC] — 强制重新解析并立即应用
  • rune_sched_points [filter] — 列出已知坐标点
  • rune_sched_reload — 重新从磁盘扫描每个JSON并重建
  • rune_sched_smoke [NPC] — 启用内置烟雾测试并重新应用
  • (原始版) debug seenMail <flag> [false] — 切换一个标记以测试门控

在 SMAPI 控制台中输入 help rune_sched_<name> 查看使用方法。

C# API

var api = Helper.ModRegistry.GetApi<IScheduleDirectorApi>("Riou.TrueRune.Schedules");
// 从你的模组中在运行时贡献路由
api.RegisterSchedules("Haley", myEntries, ModManifest.UniqueID);
// 预览当前将应用的效果
api.TryResolve("Haley", out string compiled);

兼容性与权限

SMAPI 4.0+ / Stardew Valley 1.6+ 版本。可与 Content Patcher 的日程编辑和自定义 NPC 框架共同使用。MIT 许可证授权——无需申请即可作为依赖项使用,欢迎自由创建分支和提交翻译。

真实符文工具包的一部分

  • 真符文:事件 — 以JSON格式呈现的分支心动事件
  • 真符文:对话导演 — 运行时NPC对话规则,包含优先级、轮换和配额
  • 真·符文:日程导演 — 条件性NPC日程(本模组)