feat: 存档系统增加退出节点保存时机

This commit is contained in:
2026-07-26 19:59:56 +08:00
parent 4caf70b554
commit 82c15e8f48
18 changed files with 1195 additions and 159 deletions
+46 -10
View File
@@ -20,6 +20,7 @@
| `init` | `init` | 变量声明与初始状态 | 无出口 | 仅 `<<declare>>` / `<<set>>` / 全局参数初始化;本身不跳转 |
| `center` | `center` | 阶段调度中枢 | 可多出口 `<<jump>>` | 仅按 `$gameStage` 分发,无文本、无选项 |
| `content` | `content` | 阶段内容节点 | 通常单出口 | 可含叙事文本、局部选项、小游戏指令 |
| `interaction` | `interaction` | 交互内容节点 | 可按分支结束或跳转 | 可含叙事、选项与玩法准备指令;正常结束 Dialogue 后进入游戏内交互 |
| `performance` | `performance` | 原子化线性演出节点 | 单出口 | timeline、cutscene 等,禁止选项 |
| `event` | `event` | C# 调用的事件响应入口 | 单/多出口 `<<jump>>` | 仅轻量路由,禁止大段叙事 |
| `function` | `function` | 纯指令封装 | **禁止 `<<jump>>`** | 仅 Command,无文本;命名加 `_Func` 后缀 |
@@ -31,8 +32,12 @@
- `deprecated`:已废弃节点,运行时不可达。
- `wip`:待编辑/占位节点,运行时不可达。
- `no_save`:该节点**不可作为保存边界**。即使节点类型通常允许保存(如 `content`),附加此标签也表示此处不应触发保存。
- `save_on_exit`:覆盖一级类型的默认保存语义;进入节点时不保存,节点完成后直接结束本轮 Dialogue 时保存 state-only 档。
- **瞬跳节点**:见 [§8 瞬跳节点与存档边界](#8-瞬跳节点与存档边界)。所有瞬跳节点均不可作为保存边界。
`interaction` 已天然包含 `save_on_exit`,不得重复标记。`no_save``interaction` / `save_on_exit`
互相冲突;运行时遇到冲突时按不保存处理,并输出配置错误。
---
## 2. 命名规则
@@ -44,6 +49,7 @@
| `init` | `VarsInit``数据初始化` | 建议统一为 `VarsInit`;如项目已有 `数据初始化`,可保留但同一 project 内保持一致 |
| `center` | `Center` | 固定命名,每个维修 Yarn project 一个 |
| `content` | `Stage1``开头对话``检查情绪``旋钮调节` | 阶段入口建议用 `StageN`;阶段内子节点用中文动宾/名词短语 |
| `interaction` | `Stage3``等待插线``End_memoryPaly` | 沿用内容节点命名;名称应能表达即将进入的游戏内交互 |
| `performance` | `地铁到站演出``手术动画``滤波器启动动画` | 中文描述性名称,明确表达演出内容 |
| `event` | `EmoPlugIn``IntoEyeView``OnSalesTurnComplete` | 用 `OnXxx` 或模块名 + 事件名,表达触发来源 |
| `function` | `Wave_Show_Func``Wave_Hide_Func``Module_HighlightOff_Func` | `领域_动作_Func``模块_动作_Func`PascalCase;必须带 `_Func` 后缀 |
@@ -190,6 +196,32 @@ hs: 医——生——! #line:0bade9e
---
### 3.4.1 interaction 节点
`interaction` 是一种有内容的玩法交互入口。它可以承载与 `content` 相同的台词、选项、演出和
状态准备,但进入节点时不保存;只有节点完成后直接结束本轮 Dialogue 的执行路径,才会生成
state-only 自动档,并把控制权交给游戏系统。
```yarn
title: Stage3
tags: interaction
---
<<switch_fix_system_to "BodyModule" "Head">>
dn: 请使用检查设备继续操作。
===
```
**约束清单:**
- `interaction` 是一级类型,不与 `content` 等其他一级类型并列书写。
- 正常交互入口路径应直接结束 Dialogue;读档时只恢复状态,不重新运行该节点。
- 允许某些条件分支 `<<jump>>` / `<<detour>>` 到其他 Yarn 节点;这些路径会取消退出档并记录告警。
- 节点结束前必须完成所有需要写入快照的状态命令。未等待的 fire-and-forget 命令不可作为可靠边界。
- 后续玩法必须能够完全通过 Snapshot Provider 恢复,包括输入、交互监听和玩法模式,而不只是视觉状态。
- 普通节点需要同样语义时可附加 `save_on_exit``interaction` 无需重复附加。
---
### 3.5 performance 节点
原子化线性演出节点,用于 timeline、cutscene 等必须完整播放的演出。
@@ -326,6 +358,8 @@ Center ◀─────────────────────┘
│ │
│ ├── content 子节点 ── ...
│ │
│ ├── interaction 子节点 ──> 结束 Dialogue ──> 游戏内交互
│ │
│ ├── performance 子节点 ──<<jump>>──> content 或 end
│ │
│ └── <<set $gameStage>> ──> <<jump Center>>
@@ -350,14 +384,14 @@ Center ◀─────────────────────┘
## 6. 快速检查表
| 检查项 | start | init | center | content | performance | event | function | end |
| ------------------ | ----- | ---- | ------ | ------- | ------------------------ | ------------------- | -------- | ----------------- |
| 是否包含叙事文本? | 禁止 | 禁止 | 禁止 | 允许 | 禁止 | 禁止 | 禁止 | 允许(少量) |
| 是否包含选项? | 禁止 | 禁止 | 禁止 | 允许 | 禁止 | 禁止 | 禁止 | 禁止 |
| 是否有 `<<jump>>`? | 仅一个出口 | 禁止 | 可多出口 | 通常一个出口 | 单出口 | 可有 | 禁止 | 最终 `<<NextYarn>>` |
| 是否修改 `$gameStage`? | 禁止 | 可初始化 | 禁止 | 允许 | 禁止 | 尽量避免 | 禁止 | 禁止 |
| 是否被 C# 调用? | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 |
| 是否可作为保存边界? | 否 | 否 | 否(瞬跳) | 是(**瞬跳 content 除外**,须 `no_save` | 仅开头/结尾(节点本身建议 `no_save` | 否(可附加 `no_save` 强调) | 否 | 否(建议 `no_save` |
| 检查项 | start | init | center | content | interaction | performance | event | function | end |
| ------------------ | ----- | ---- | ------ | ------- | ----------- | ------------------------ | ------------------- | -------- | ----------------- |
| 是否包含叙事文本? | 禁止 | 禁止 | 禁止 | 允许 | 允许 | 禁止 | 禁止 | 禁止 | 允许(少量) |
| 是否包含选项? | 禁止 | 禁止 | 禁止 | 允许 | 允许 | 禁止 | 禁止 | 禁止 | 禁止 |
| 是否有 `<<jump>>`? | 仅一个出口 | 禁止 | 可多出口 | 通常一个出口 | 可按分支跳转 | 单出口 | 可有 | 禁止 | 最终 `<<NextYarn>>` |
| 是否修改 `$gameStage`? | 禁止 | 可初始化 | 禁止 | 允许 | 允许 | 禁止 | 尽量避免 | 禁止 | 禁止 |
| 是否被 C# 调用? | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 |
| 是否可作为保存边界? | 否 | 否 | 否(瞬跳) | 是(**瞬跳 content 除外**,须 `no_save` | 正常结束时保存 state-only | 仅开头/结尾(节点本身建议 `no_save` | 否(可附加 `no_save` 强调) | 否 | 否(建议 `no_save` |
---
@@ -367,6 +401,7 @@ Center ◀─────────────────────┘
- `deprecated`:已废弃节点,运行时不可达。
- `wip`:待编辑/占位节点,运行时不可达。
- `no_save`:该节点不可作为保存边界,运行时经过此处不应触发保存。
- `save_on_exit`:节点进入时不保存;节点完成并直接结束本轮 Dialogue 后保存 state-only 档。
### 7.1 `no_save` 使用场景
@@ -380,9 +415,10 @@ Center ◀─────────────────────┘
任何活跃节点不得 `<<jump>>``deprecated` / `wip` 节点,也不得在标记为 `no_save` 的节点处触发 **OnNodeStart 自动保存**
### 7.2 Yarn 显式存档 `<<save>>`
### 7.2 Yarn 显式存档 `<<save>>`(兼容旧内容)
用于节点末尾、状态已就位、即将进入无对话 / 纯 C# 交互阶段时的**显式存盘点**(`OnNodeStart` 无法覆盖的场景)。
`<<save>>` 已标记为 deprecated,仅用于兼容尚未迁移的旧内容。新内容进入无对话 / 纯 C# 交互阶段时,
应优先使用一级类型 `interaction`;其他一级类型需要相同行为时使用 `save_on_exit`
```yarn
<<play_timeline 地铁>>