文件最后提交记录最后更新时间
30 天前
27 天前
28 天前
26 天前
1 个月前
27 天前
1 个月前
27 天前
27 天前
28 天前
1 个月前
28 天前
28 天前
27 天前
26 天前
README

文档索引(docs/README.md)

本目录是「插件化剧情引擎」的完整开发文档。按下面的阅读路线选择入口即可。

按目的选择

我想…… 看这份文档
我知道剧情 / 插件的所有能力 STORY_FORMAT.md + PLUGIN_JS.md + PLUGIN_WASM.md
了解引擎由哪些模块组成、数据怎么流动 ARCHITECTURE.md
让剧情被动听世界说话(世界模拟器 / observe / persistent) STORY_FORMAT.md → ARCHITECTURE.md → EVENTS.md
用 TypeScript / JavaScript 写一个插件 PLUGIN_JS.md
用 Rust 写一个 WASM 插件 PLUGIN_WASM.md
写一个剧情 JSON 文件 STORY_FORMAT.md
给编剧用编辑器写剧本(含文本语法的完整参考) SCRIPT_TEXT.md
了解 WASM 二进制接口的精确约定 ABI.md
知道插件能申请哪些权限、怎么被校验 PERMISSIONS.md
了解引擎/插件发布的事件与负载 EVENTS.md
把引擎当库嵌入自己的前端页面 FRONTEND.md
部署上线 / 被 iframe 嵌入 / 遇到"资源被拦、弹窗失效、跨域隔离" CROSS_ORIGIN.md
写单测(Vitest)与端到端(Playwright)测试 TESTING.md
把项目跑起来 / 构建 / 构建 WASM BUILD.md
排查「插件加载失败」「剧情不更新」等问题 FAQ.md
看版本变化与后续计划 CHANGELOG.md

推荐阅读顺序

  1. 第一次接触项目:根目录 README.md → ARCHITECTURE.md → 跑 npm run dev 观察页面。
  2. 要写剧情:STORY_FORMAT.md → 参考 public/stories/demo.json; 给编剧:直接看 SCRIPT_TEXT.md(文本模式的完整语法,编辑器界面里是同一份)。
  3. 要写 JS 插件:PLUGIN_JS.md → PERMISSIONS.md → 参考 public/plugins/hello-js/。
  4. 要写 WASM 插件:PLUGIN_WASM.md → ABI.md → 参考 wasm-src/hello-wasm/。
  5. 要做世界模拟器:ARCHITECTURE.md(WorldLoop)→ STORY_FORMAT.md(observe / persistent) → PERMISSIONS.md(world:* 权限)→ EVENTS.md(world:tick 契约)→ 参考 public/stories/world.json。
  6. 要部署上线 / 嵌进 iframe:先读 CROSS_ORIGIN.md——COOP/COEP 的代价是静默的。

文档约定

  • 文中 代码路径 均以仓库根目录为基准。
  • 「宿主」指引擎本体(src/ 下的 TypeScript 代码),「插件」指被动态加载的 JS / WASM 代码。
  • 所有 ABI 约定以 ABI.md 为唯一权威来源;src/plugins/WasmPluginLoader.ts 与 wasm-src/*/src/lib.rs 必须与之一致。

术语表

术语 含义
Runtime 运行时门面,负责装配子系统、加载剧情、存档读档
StoryEngine 剧情引擎,负责解析校验剧情、执行节点、落地效果
PluginManager 插件管理器,负责加载、生命周期、权限、超时与错误隔离
PluginContext(ctx) 插件在 init 阶段拿到的宿主能力集合,所有 API 均做权限校验
PluginDriver 统一驱动接口,把 JS 插件与 WASM 插件抽象成同一种东西
Registry / 注册表 存放命令、条件、效果、节点、UI 组件的容器,按 owner 归属
StateStore 状态仓库,含 var / flag / item / actor 四个命名空间
WorldLoop 世界模拟器的循环驱动,独立于 StoryEngine,每 tick 广播 world:tick 事件
observe 节点 剧情节点类型,被动监听世界事件、满足条件时触发跳转
persistent 剧情顶层字段,为 true 时世界循环持续运行、剧情永不结束
效果(effect) 一批状态变更描述,如 { "type": "set", "key": "flag.x", "value": true }
ABI 状态码 WASM 导出函数返回的整数状态码,0 成功,负数为错误