📄 文书档案 · 乱世生存 设计规格书 v1.3

乱世生存:从设计图纸到AI生产系统 v1.3

核心原则:人定规则,AI填肉。
设计师定义骨架、情绪、节奏;AI负责批量生成、替换、迭代。
设计师的工作是"审核",不是"从零写"。

>

修订记录:
- v1.0:初始版本(2026-06-24)
- v1.1:补全场景模板、常规结局、标记位读写机制、开放世界定义澄清(2026-06-24)
- v1.2:选项→标记位关联格式统一、AI自检禁用写法步骤、第一阶段验收标准、文件命名与目录结构规范化(2026-06-24)
- v1.3:修正民间互助层状态表位置(从军帐模板移至城门口模板)、补充AI读取互助层状态的SOP步骤(2026-06-24)

---

一、骨架:设计图纸(可执行规格书)

1.1 项目文件结构

project_root/
├── _build/                   ← 施工区(日常工作)
│   ├── data/
│   │   └── story.json        ← 主数据文件(含 player_state)
│   ├── index.html
│   └── images/
│
├── _deploy/                  ← 发布区(只读)
│   ├── data/
│   │   └── story.json        ← 发布版(同步自 _build/)
│   ├── index.html
│   └── images/
│
├── _docs/                    ← 文档与设计图纸
│   ├── specs/                ← 设计规格书
│   │   ├── luanshi_ai_pipeline_v1.2.md  ← 本文件
│   │   ├── world_framework.md
│   │   ├── season_keywords.md
│   │   ├── tone_seeds.md
│   │   └── scene_templates/
│   │       ├── template_citygate.md
│   │       ├── template_market.md
│   │       ├── template_wild.md
│   │       └── template_tent.md
│   └── seeds/                ← 剧本种子(从设计讨论中提取)
│       └── core_ideas.md
│
└── deploy_manifest.json

1.2 阶段框架速查表

| 阶段 | 时间 | 核心命题 | 开放范围 | 可解锁模式 | 切换条件 |

|:---|:---|:---|:---|:---|:---|

| 一 | 184年(黄巾) | 活着 | 中原3城(许县/长社/郾城),自由探索 | 个体生存 | 黄巾主力溃败(184年秋) |

| 二 | 190-192年 | 站队 | 扩展至6城,原3城状态更新 | 领主/部曲/出仕/独立 | 曹操迎天子(196年) |

| 三 | 196-200年 | 博弈 | 城市内景为主,许都为核心 | 路径叠加分叉 | 官渡之战结束(200年) |

| 四 | 200年后 | 时间与土地的极限 | 战线地图,前线+后方 | 苟活/变量/边军 | 北伐开始(自动触发) |

| 五 | 更后 | 循环 | 边境屯田 | 成为那堵墙 | 玩家死亡或选择终老 |

1.3 开放世界定义

本游戏是"阶段式开放世界"。

每个阶段内部是开放的:玩家可以在当前阶段的地图上自由探索所有已解锁的城镇,触发随机事件,选择是否推进主线。阶段内部没有强制的时间限制(但世界时间仍在流逝,历史事件按时发生)。

阶段切换由世界时间触发:当历史事件发生(如黄巾主力溃败、曹操迎天子、官渡之战),当前阶段自动结束,进入下一阶段。阶段切换不可逆。

阶段之间的"开放"体现在变量继承:玩家在上一阶段的所有选择(标记位),决定了下一阶段的可选路径。不同玩家在第一阶段做了不同的事,第二阶段面对的世界就不同。这不是"多主线",而是"同一主线因变量不同而分叉"。

一句话:不是"想去哪就去哪"的开放世界。是"在历史洪流里,你的每一步都在投票,决定你还能选什么"的开放世界。

1.4 结局表

#### 常规结局

| 阶段 | 常规结局 | 达成条件 |

|:---|:---|:---|

| 第一阶段 | 活下来了 | 未死亡,进入第二阶段。无特殊条件。 |

| 第二阶段 | 站住了 | 选择了任一势力/路径,获得稳定身份(领主/部曲/出仕/独立均可)。 |

| 第三阶段 | 成局中人 | 成为某方主官/独立势力首领/某势力的核心幕僚。不再是"流民"或"无名之辈"。 |

| 第四阶段 | 熬过去了 | 北伐结束(无论胜负),主角还活着,且有地可种、有家可回。 |

| 第五阶段 | 成为那堵墙 | 在边境屯田,成为边军,阻止外侵。不是胜利,是持续存在。 |

#### 隐藏结局

| 隐藏结局 | 触发条件 | 内容 |

|:---|:---|:---|

| 安静的结局 | 从未兑付木牍 | 在景陵旁种地,年轻人来问"你见过什么",你放下刻满字的木牍 |

| 武将归宿 | 从未兑付短刀 | 战死在某个无名关口,刀上的缺口记录着每一场战斗 |

| 远古世家介入 | 从未兑付残玉 | 三次必死扭转后消失于历史记载,欠你的人情在千年后还在流传 |

常规结局 vs 隐藏结局的区分

- 常规结局:主角在每个阶段都"使用"了当前可兑付的道具/身份/人脉,一步步从流民变成边军。这是一条完整的、正常的人生线。

- 隐藏结局:主角在某个阶段选择不兑付某件道具(木牍/短刀/残玉),在第四阶段触发对应的隐藏路径。

1.5 变量追踪表(标记位)

| 标记位ID | 含义 | 设置阶段 | 后续触发 |

|:---|:---|:---|:---|

| `FIRST_GIFT` | 初始携带物(木牍/短刀/残玉) | 一 | 贯穿全阶段 |

| `FIRST_ENTRY` | 进城方式(合法/隐匿/交易/城外生存) | 一 | 影响初始身份标签 |

| `MARK_XU_BOOK` | 造假账 | 一 | 二:被认出 / 三:被追查 |

| `MARK_YELLOW_HIDE` | 藏过黄巾溃兵 | 一 | 二:可投靠流民首领 |

| `MARK_CAO_SERVE` | 加入曹操军 | 二 | 三、四:军旅线 |

| `MARK_LORD_PATH` | 领主路径选择 | 二 | 三:成为一方势力 |

| `MARK_UNUSED_GIFT` | 从未兑付的携带物 | 三 | 四:隐藏结局指向 |

---

二、标记位读写机制

2.1 存储位置

标记位存储在 `_build/data/story.json` 内的 `player_state` 对象中。

{
  "player_state": {
    "current_phase": 1,
    "current_location": "许县城门外",
    "current_season": "秋",
    "inventory": ["木牍"],
    "marks": {
      "FIRST_GIFT": "木牍",
      "FIRST_ENTRY": null,
      "MARK_XU_BOOK": false,
      "MARK_YELLOW_HIDE": false
    },
    "local_reputation": {
      "许县": 0,
      "郾城": 0,
      "长社": 0
    }
  }
}

2.2 AI 读取标记位的 SOP

2.3 AI 写入标记位的 SOP

2.4 标记位互斥规则(防止矛盾状态)

| 标记位组合 | 规则 |

|:---|:---|

| `FIRST_GIFT` = "木牍" 且 `FIRST_ENTRY` = "隐匿" | 允许。木牍携带者也可以绕城。但后续可能被质疑"有身份证明为何不走正门"。 |

| `MARK_CAO_SERVE` = true 且 `MARK_YELLOW_HIDE` = true | 允许但触发特殊事件:曹操军中有人举报你"通黄巾",你需要自证。 |

| `MARK_LORD_PATH` = "中原坞堡" 且 主角同时拥有 `MARK_YUAN_SPY` | 触发危机:袁绍方认为你是曹操的暗子,曹操方认为你是袁绍的暗子。 |

---

三、工具箱:参数化生成系统

3.1 季节关键词矩阵

| 季节 | 视觉 | 气味 | 体感 | 情绪 | 典型意象 |

|:---|:---|:---|:---|:---|:---|

| 春 | 桃瓣、嫩绿、融雪、新坟纸钱 | 湿土、草腥、硝烟 | 料峭、潮 | 躁动、不安、希望 | 桃花落在募兵告示上 |

| 夏 | 烈日、尘土、浓荫、腐尸 | 汗水、焦麦、血 | 闷热、黏 | 焦灼、等待、爆发 | 麦田无人收,穗子垂地 |

| 秋 | 黄叶、枯草、高云、雁阵 | 桂、秸秆焚、马汗 | 凉、干 | 收敛、清醒、离愁 | 梧桐叶盖住半张残榜 |

| 冬 | 冻土、枯枝、白气、薄冰 | 冰、炭火、腐草 | 刺骨、僵 | 隐忍、绝望、蛰伏 | 井口冒白气,井绳冻硬 |

3.2 情绪种子库

从设计讨论中提取的核心情绪种子,用于AI生成时的情绪锚定:

| 种子ID | 种子名 | 定义 | 表现形式(给AI的提示) | 禁用写法 |

|:---|:---|:---|:---|:---|

| `TONE_COLD` | 冷意 | 自愿成为那堵墙的自觉 | 环境冷、动作慢、对话少、动词选"站/看/弯腰",不选"愤怒/悲伤" | ❌ 不写"他感到悲凉" |

| `TONE_HOME` | 家来了 | 身体先于大脑想起家 | 气味触发、舌尖味道、手指无意识动作,然后才意识到"我在想家" | ❌ 不写"他想家了" |

| `TONE_NOPLAN` | 选择丧失 | 连计划都无从开启 | 沉默、重复动作(磨刀/数粮)、回答简短、不问"怎么办" | ❌ 不写"他决定放弃" |

| `TONE_CYCLE` | 循环 | 认出"他是我,我是他" | 年轻人和老人做同样动作、相似对话跨阶段重复、风一样但人不同 | ❌ 不直接点破循环 |

| `TONE_PEACE` | 安静的结局 | 不是功成,是停下 | 日常动作(打水/锄地/补衣)、环境安静、无BGM式的描写 | ❌ 不写"终于安宁了" |

| `TONE_GATHER` | 聚散 | 到时间了,该回了 | 收到信/听到消息/看到雁南飞,然后开始收拾东西,不说理由 | ❌ 不写"他决定回家" |

3.3 场景框架模板

#### 3.3.1 城门口

## 场景模板:城门口

### 基础框架
- 位置:[城镇名]城门
- 时间:[阶段] [季节] [时辰]
- 天气:[从季节关键词取]
- 城门状态:开/半掩/紧闭
- 守卫状态:严格盘查/松散/无人

### 固定元素
- 城门本身(木门/铁门/残破)
- 城墙(完整/有缺口/贴告示)
- 排队的人(流民/商队/无人)
- 至少一个可交互NPC(老妇/县吏/铁匠/流民)

#### 民间互助层状态表(城门口专属参数)

本参数控制城门口"老妇卖饼"这一固定元素的动态变化,反映当前城镇秩序与民间余裕的厚度。

| 状态值 | 老妇行为 | 县吏行为 | 小孩行为 | 含义 |
|:---|:---|:---|:---|:---|
| `SOLIDARITY_ACTIVE` | 多做一个饼,放在炉边不卖 | 买饼时多付一枚铜钱,不解释 | 蹲在城墙根等,知道饼会来 | 民间互助层健康,冬季不冷 |
| `SOLIDARITY_STRAINED` | 只做刚好够卖的量,炉边无余 | 买饼时犹豫,最终没多买 | 蹲着等,但今天没等到 | 互助层承压,余裕在消失 |
| `SOLIDARITY_BROKEN` | 摊位空了,炉子灭了 | 路过,不看 | 不蹲了 | 互助层崩溃,人人自顾 |
| `SOLIDARITY_INSTITUTIONALIZED` | 发饼,面前立木牌"凭券购买",不抬头看人 | 不买了,因为券由官府统一发 | 还是蹲着,手里攥着昨天的券,不知道券已经过期 | 互助被制度取代,制度的森寒 |

**AI生成规则**:
- 默认状态为 `SOLIDARITY_ACTIVE`
- 若当前城镇 `local_reputation` < -20,状态自动降为 `STRAINED`
- 若当前城镇 `local_reputation` < -50,状态自动降为 `BROKEN`
- 若主角在第三/四阶段选择了"举报县吏私分公粮"类选项(对应标记位为 true),状态自动降为 `INSTITUTIONALIZED`
- 状态一旦降低,不可逆(可随阶段切换进一步降低,不可回升)

### 季节叠加
- 春:桃花瓣飘进排队人的衣领
- 夏:城门洞的阴凉处挤满了人
- 秋:梧桐叶盖住半张告示
- 冬:排队的人跺脚,白气从口鼻涌出

### 情绪叠加
- 若种子=TONE_COLD:风灌进城门洞,没人说话
- 若种子=TONE_HOME:某个气味让主角停了一瞬
- 若种子=TONE_CYCLE:守卫换岗,新来的守卫和昨天走的那位,动作一模一样

### 可用选项模板
- 排队入城(守序) → MARK_FIRST_ENTRY = "合法"
- 绕过城门(隐匿) → MARK_FIRST_ENTRY = "隐匿"
- 帮NPC做事换入城(交易/技能) → MARK_FIRST_ENTRY = "交易"
- 先不进城,在城外活动(生存/探索) → MARK_FIRST_ENTRY = "城外生存"

#### 3.3.2 市集

## 场景模板:市集

### 基础框架
- 位置:[城镇名]市集
- 时间:[阶段] [季节] [时辰]
- 繁荣度:热闹/萧条/空无一人
- 主要商品类型:[粮食/铁器/布匹/药材/奢侈品/无]

### 固定元素
- 摊位(至少3个不同类型)
- 讨价还价的声音(或寂静)
- 至少一个可交互NPC(商贩/乞丐/巡逻兵/掮客)
- 地面状态(干洁/泥泞/有血迹)

### 季节叠加
- 春:野菜、新布上市,人多但货少
- 夏:苍蝇多,肉类发臭,摊贩打盹
- 秋:粮食上市,最热闹的季节,但粮价可能暴跌
- 冬:市集半空,只有卖炭和卖干菜的还在

### 情绪叠加
- 若种子=TONE_COLD:摊贩不吆喝,买主不还价,交易安静得像葬礼
- 若种子=TONE_HOME:某个摊位卖的酱菜,和老家腌的一个味
- 若种子=TONE_CYCLE:同一个摊位,二十年前卖的是同样的东西

### 可用选项模板
- 购买物资 → 消耗铜钱/银两/以物易物
- 卖东西 → 可能被压价
- 接任务(掮客介绍活计) → MARK_MARKET_JOB = "搬运"/"保镖"/"送信"
- 打听消息 → 可能获得情报或假消息

#### 3.3.3 荒野/道路

## 场景模板:荒野/道路

### 基础框架
- 位置:[起点]至[终点]的路上,距[起点]约[X]天路程
- 时间:[阶段] [季节] [时辰]
- 道路状态:官道(相对安全)/小路(风险中)/野径(高风险)
- 天气:[从季节关键词取]

### 固定元素
- 路的状态(平整/坑洼/被水冲毁/有车辙/有马蹄印)
- 路边事物(荒村废墟/孤树/界碑/坟冢/无)
- 远处可见物(城墙轮廓/炊烟/烽火/无)
- 可能遭遇(流民/商队/溃兵/野兽/无)

### 季节叠加
- 春:路边野菜可采,但可能有毒
- 夏:树荫处有休息的流民,可能分享消息或传染病
- 秋:路边果树有落果,但可能有人守株待兔
- 冬:路冻硬了,好走,但夜里可能冻死

### 情绪叠加
- 若种子=TONE_COLD:风吹过来,没有遮拦,远处有狼嚎或人嚎,分不清
- 若种子=TONE_NOPLAN:岔路口,两条路都通往不知道的地方,选了就选了
- 若种子=TONE_CYCLE:这条路上走过军队,走过流民,走过商队,现在走着你

### 可用选项模板
- 继续走 → 消耗天数,触发风险结算
- 绕路 → 增加天数,降低风险
- 在路边休息 → 恢复体力,但可能被袭击
- 探查路边事物 → 可能发现物资/陷阱/隐藏路径 → MARK_WILD_DISCOVERY = true

#### 3.3.4 军帐/室内

## 场景模板:军帐/室内

### 基础框架
- 位置:[势力名]军营·[帐幕类型] 或 [城镇名]·[建筑类型]
- 时间:[阶段] [季节] [时辰]
- 帐内人物:[主位人物] + [次要人物列表]
- 帐内光源:烛火/油灯/火盆/日光从缝隙射入/无光

### 固定元素
- 坐具(席/案/无)
- 墙上/案上物品(地图/文书/武器/酒具/无)
- 帐外声音(操练声/风声/远处战鼓/寂静)
- 至少一个关键物品(可被主角注意到,成为后续引用的种子)

### 季节叠加
- 春:帐帘掀开时,飘进桃花瓣或雨丝
- 夏:帐内闷热,烛火不晃,所有人都在出汗
- 秋:帐外风大,帐布鼓动如帆,烛火摇晃不定
- 冬:火盆在中间,所有人的脸一半亮一半暗

### 情绪叠加
- 若种子=TONE_COLD:主位人物说话很慢,每个字都像秤砣
- 若种子=TONE_NOPLAN:地图摊开很久了,没人指任何一个点
- 若种子=TONE_GATHER:有人站起来,说"时候到了",其他人没问去哪

- 接受任务/命令 → MARK_TENT_ACCEPT = true
- 拒绝/拖延 → MARK_TENT_REFUSE = true
- 提出条件 → MARK_TENT_BARGAIN = true
- 观察帐内细节 → 可能发现隐藏信息/种子 → MARK_TENT_OBSERVE = true

---

四、SOP:AI生成标准操作流程

4.1 场景生成流程

输入(设计师提供):

AI执行

输出格式

[场景名]:[城镇]·[季节]·[时辰]
[环境描述]:(AI根据季节+情绪生成)
[可交互元素]:(NPC列表、物品、告示等)
[选项]:
  1. [选项文本] → 标记位:[MARK_ID] = [值]
  2. [选项文本] → 标记位:[MARK_ID] = [值]
  ...
[情绪锚点]:(本场景使用的情绪种子,不显示给玩家)
[自检状态]:通过 / ⚠️ 未通过: [违规种子ID]

4.2 审核清单(设计师用)

[ ] 环境描写是否匹配季节关键词
[ ] 情绪是否"不点破"——没有直接写"他感到悲伤/想家/绝望"
[ ] 选项是否对应正确的标记位
[ ] NPC对话是否有"留白"——没有把核心观念说尽
[ ] 是否与主角当前阶段、身份、携带物匹配
[ ] 是否有至少一个"种子"——可被后续阶段引用的细节
[ ] 标记位读写是否正确(读取了该读的,写入了该写的)
[ ] 自检状态是否通过;若未通过,手动审核违规段落

4.3 迭代流程

设计师审核 → 标注不满意的点 → 喂回给AI
示例反馈:
  "第三段环境描写太暖,这个场景情绪种子是TONE_COLD,风应该更硬。"
  "第二个选项的文本太直了,不要写'他想回家',改成'他闻到了什么,停下了手'。"
AI根据反馈重新生成 → 设计师再审核 → 通过后写入_build/data/ → 更新player_state

---

五、可持续生产的关键规则

| # | 规则 |

|:---|:---|

| 1 | 设计师只写框架和种子,不写具体文本 |

| 2 | AI生成10版,设计师挑1版,改3处,定稿 |

| 3 | 所有种子(情绪、意象、地名)只定义"是什么",不定义"为什么" |

| 4 | 每个场景必须留下一个"可被后续引用的细节" |

| 5 | 审核时,先看"有没有点破",再看"有没有振动" |

| 6 | 如果一段文本让设计师犹豫"是不是太直了",那就太直了。改。 |

| 7 | 标记位存储在 story.json → player_state → marks,每次选择后立即更新 |

| 8 | 每个阶段内部自由探索,阶段切换由世界时间触发,不可逆 |

| 9 | AI生成后必须自检禁用写法,违规段落最多重试3次 |

---

六、第一阶段验收标准

6.1 场景覆盖

6.2 初始携带物触发

6.3 关键标记位

6.4 结局可达

---

本文件 = 图纸 + 工具箱 + SOP
版本:v1.2

七、附录

7.1 参考示例:

场景名:许县城门口·秋·黄昏

环境描述:

城门半掩。两个县吏在盘查入城的人,其中一个冷得跺脚,嘴里呼出的白气一出口就被风刮散。城墙上贴着一张募兵告示,墨迹被雨水洇过,边角被风吹得哗哗响。告示下面压着半张旧告示,只剩“太平”两个字还看得见。

城墙根下,一个老妇支着一个小炉子卖烤饼。饼的香味顺风飘过来,又立刻被风卷走。排队的人缩着脖子,没人说话。有人攥着几枚铜钱,有人攥着半块玉佩,有人什么都没攥。

你站在队尾。怀里那枚木牍硌着肋骨。上面的字是父亲请村里唯一读过书的先生刻的——你的名字,籍贯,父祖三代。父亲把它塞进你手里时,手在抖。

风从城门洞里灌进来,灌进你的领口。

城门快关了。

可交互元素:

县吏(盘查入城)

老妇(卖烤饼)

募兵告示(可阅读)

排队的流民(可观察/搭话)

选项:

排队,接受盘查,必要时出示木牍 → MARK_FIRST_ENTRY = "合法"

不排队。绕到城墙塌陷处,从那里翻进去 → MARK_FIRST_ENTRY = "隐匿"

帮老妇卖饼,换一块饼和她的担保入城 → MARK_FIRST_ENTRY = "交易"

先不进城了。城外有条河,河边可能有鱼 → MARK_FIRST_ENTRY = "城外生存"

情绪锚点:TONE_COLD

自检状态:通过

未使用“他感到悲凉”

未使用“他想家了”

情绪通过环境传递(风灌进城门洞、没人说话、告示被风吹得哗哗响)

—— 人与AI协作记录 ——