diff --git a/.cursor/commands/yarn-plug-review.md b/.cursor/commands/yarn-plug-review.md new file mode 100644 index 000000000..09492ac5d --- /dev/null +++ b/.cursor/commands/yarn-plug-review.md @@ -0,0 +1,17 @@ +# Yarn 插线维修对话 — 快速审查 + +对 `FP_Huoshan1` 或同类 **BodyModule 插线 + `$gameStage` 多阶段** 的 `.yarn` 做一轮检查。 + +## 用法 + +在对话里说明「按 yarn-plug-review 审查某文件/目录」或直接粘贴节点片段。 + +## 审查项(简版) + +1. **跳转条件**:会 `jump` 结束/换阶段的块是否带 `$gameStage==…`,避免后期变量仍为 true 时回退阶段。 +2. **重复插线**:同一 stage、同一模块第二次插线是否为短总结 + 下一步提示,而非全长对白与重复 `complete_task`。 +3. **TaskToDo**:`TaskToDo--` 是否与「首次完成」绑定(如 `$speakerFinalOK` / `$saleFinalOK`),避免重复递减。 +4. **无序插线**:是否已去掉「分支外无条件 set 完成标记」导致跳剧情。 +5. **EventNode**:`*PlugIn` 名称与 `moduleName`、目标 `title:` 一致。 + +完整说明与模式见:`.cursor/skills/yarn-plug-in-flow/SKILL.md`。 diff --git a/.cursor/skills/yarn-plug-in-flow/SKILL.md b/.cursor/skills/yarn-plug-in-flow/SKILL.md new file mode 100644 index 000000000..547b71fd1 --- /dev/null +++ b/.cursor/skills/yarn-plug-in-flow/SKILL.md @@ -0,0 +1,103 @@ +--- +name: yarn-plug-in-flow +description: >- + Yarn 维修插线对话:gameStage 调度、重复插线短总结、防状态回退与 TaskToDo 重复递减。 + Use when 写 FixSystem/BodyModule 插线 Yarn、从自然语言生成维修对话、审阅 HuoShan 类流程、 + 检查 PlugIn 节点、重复执行、插线检查、或用户提到 yarn 插线/维修界面对话。 +--- + +# Yarn 插线维修对话(FixSystem) + +本 skill 适用于:`BodyModule` 通过 `{moduleName}PlugIn` 跳入 Yarn、同一节点内用 `$gameStage` 分支多阶段叙事(如 `FP_Huoshan1`)。 + +## 1. C# 侧事实(设计 Yarn 前必读) + +- 插线触发:`BodyModule.PlugIn()` → `DialogController.StartDialogNode(data.PlugInNodeName)`,节点名为 **`{moduleName}PlugIn`**(见 `BodyModuleData.PlugInNodeTemplate`)。 +- **C# 一般不按阶段禁用插线**;若某 Stage 实际不可插线,是场景/交互配置决定,但 Yarn 仍应防御性处理「错误阶段误入」。 +- EventNode 里用 `<>` 桥接到共享节点;共享节点名须与 `*.yarn` 中 `title:` 一致。 + +## 2. 状态变量约定(推荐) + +| 用途 | 模式 | +|------|------| +| 流程阶段 | `$gameStage`(数字;仅在 `Center` 等少数节点切换,避免散落 `set`) | +| 某模块「本档首次插线检查完」 | `$xxxChecked`(如 `$speakerChecked` / `$colorChecked` / `$emoChecked`) | +| 多子任务计数 | `$TaskToDo`,完成时 `--`,**跳转前务必保证不会重复减** | +| 同一 Stage 内「最终检查子项已完成」 | 独立布尔,如 `$speakerFinalOK` / `$saleFinalOK`,防止重复插线再次 `complete_task` 与 `--` | + +在 `VarsInit`(或等价入口)用 `<>` 初始化所有布尔/计数器,避免未定义行为。 + +## 3. 从自然语言 / 大纲生成 Yarn 时的必做项 + +1. **列出插线入口**:每个 `*PlugIn` → 目标节点;与模块 `moduleName` 一致。 +2. **列出 `$gameStage` 与文档步骤映射**(如 `02_flow.md`),每个共享检查节点有哪些 `elseif $gameStage==N`。 +3. **任何会 `<>` 换阶段的块**:条件里加 **`$gameStage==N`**,避免后期 `$xxxChecked` 仍为 true 时误触发旧结局(状态回退)。 +4. **同一 `$gameStage` 内、同一模块第二次插线**: + - 首次:完整演出 + `complete_task` + 设 `$xxxChecked` / `$xxxFinalOK`。 + - 再次:`<>`(或对应 FinalOK)→ **短总结 + 自言自语下一步**(去查哪个模块、任务提示),**不**重复长对白、**不**重复任务完成副作用。 +5. **多分支共享「完成标记」**:勿在 `if/elseif` 外无条件 `set $colorChecked=true` 等;否则乱序插线会跳过叙事(见此前 HuoShan Stage2 修复)。 + +## 4. 已完成 Yarn 的审查清单(可逐项打勾) + +### 4.1 阶段与跳转 + +- [ ] 会推进阶段或结束的 `<>`,外层条件是否包含正确的 `$gameStage`? +- [ ] `Center` / Stage 入口是否唯一或清晰,避免死循环、重复 `set gameStage`? + +### 4.2 重复插线(同 Stage、同模块) + +- [ ] Stage2 类:表达 / 销售 / 情绪等主流程,第二次插线是否为「短总结 + 下一步」而非全长? +- [ ] Stage7 类双任务:是否用 **FinalOK**(或等价)避免第二次插线再次 `TaskToDo--` / 重复 `complete_task`? + +### 4.3 变量与任务 + +- [ ] `complete_task` 与 `$TaskToDo` 递减是否一一对应、且只在「首次成功路径」执行? +- [ ] `$PlugCount` 等统计是否与「首次访问」一致(可用 `visited("NodeName")` 或 `== false` 包裹)? + +### 4.4 文档与代码 + +- [ ] `EventNode` 表与 `title:` 节点名一致(如 `SalePlugIn` 非过期的 `ColorPlugIn`)。 + +## 5. 最小代码模式参考(Yarn 片段) + +**防跨阶段误触发结局:** + +```yarn +<> + // 波形对比 → 结束本阶段 +<> +``` + +**同 Stage 重复插线(短总结):** + +```yarn +<> + <> + me: (总结结论)… + me: (下一步该做什么)… + <> + // 首次完整流程 + <> + <> +<> +``` + +**Stage7 双任务防重复:** + +```yarn +<> + <> + me: 已确认…若还有任务去查另一模块。 + <> + <> + <> + <> + <> +<> +``` + +## 6. 项目内参考 + +- 实例:`Assets/Resources/Yarn/FP_Huoshan1/Stage2.yarn`(`检查表达` / `检查销售模块` / `检查情绪`)、`Center.yarn`(`VarsInit`)。 +- 流程定义:`Docs/HuoShan/core/02_flow.md`。 +- C#:`Assets/Scripts/FixSystemNew/BodyModule/Modules/BodyModule.cs`(`PlugIn`)。