核心原则:人定规则,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)
---
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
| 阶段 | 时间 | 核心命题 | 开放范围 | 可解锁模式 | 切换条件 |
|:---|:---|:---|:---|:---|:---|
| 一 | 184年(黄巾) | 活着 | 中原3城(许县/长社/郾城),自由探索 | 个体生存 | 黄巾主力溃败(184年秋) |
| 二 | 190-192年 | 站队 | 扩展至6城,原3城状态更新 | 领主/部曲/出仕/独立 | 曹操迎天子(196年) |
| 三 | 196-200年 | 博弈 | 城市内景为主,许都为核心 | 路径叠加分叉 | 官渡之战结束(200年) |
| 四 | 200年后 | 时间与土地的极限 | 战线地图,前线+后方 | 苟活/变量/边军 | 北伐开始(自动触发) |
| 五 | 更后 | 循环 | 边境屯田 | 成为那堵墙 | 玩家死亡或选择终老 |
本游戏是"阶段式开放世界"。
每个阶段内部是开放的:玩家可以在当前阶段的地图上自由探索所有已解锁的城镇,触发随机事件,选择是否推进主线。阶段内部没有强制的时间限制(但世界时间仍在流逝,历史事件按时发生)。
阶段切换由世界时间触发:当历史事件发生(如黄巾主力溃败、曹操迎天子、官渡之战),当前阶段自动结束,进入下一阶段。阶段切换不可逆。
阶段之间的"开放"体现在变量继承:玩家在上一阶段的所有选择(标记位),决定了下一阶段的可选路径。不同玩家在第一阶段做了不同的事,第二阶段面对的世界就不同。这不是"多主线",而是"同一主线因变量不同而分叉"。
一句话:不是"想去哪就去哪"的开放世界。是"在历史洪流里,你的每一步都在投票,决定你还能选什么"的开放世界。
#### 常规结局
| 阶段 | 常规结局 | 达成条件 |
|:---|:---|:---|
| 第一阶段 | 活下来了 | 未死亡,进入第二阶段。无特殊条件。 |
| 第二阶段 | 站住了 | 选择了任一势力/路径,获得稳定身份(领主/部曲/出仕/独立均可)。 |
| 第三阶段 | 成局中人 | 成为某方主官/独立势力首领/某势力的核心幕僚。不再是"流民"或"无名之辈"。 |
| 第四阶段 | 熬过去了 | 北伐结束(无论胜负),主角还活着,且有地可种、有家可回。 |
| 第五阶段 | 成为那堵墙 | 在边境屯田,成为边军,阻止外侵。不是胜利,是持续存在。 |
#### 隐藏结局
| 隐藏结局 | 触发条件 | 内容 |
|:---|:---|:---|
| 安静的结局 | 从未兑付木牍 | 在景陵旁种地,年轻人来问"你见过什么",你放下刻满字的木牍 |
| 武将归宿 | 从未兑付短刀 | 战死在某个无名关口,刀上的缺口记录着每一场战斗 |
| 远古世家介入 | 从未兑付残玉 | 三次必死扭转后消失于历史记载,欠你的人情在千年后还在流传 |
常规结局 vs 隐藏结局的区分:
- 常规结局:主角在每个阶段都"使用"了当前可兑付的道具/身份/人脉,一步步从流民变成边军。这是一条完整的、正常的人生线。
- 隐藏结局:主角在某个阶段选择不兑付某件道具(木牍/短刀/残玉),在第四阶段触发对应的隐藏路径。
| 标记位ID | 含义 | 设置阶段 | 后续触发 |
|:---|:---|:---|:---|
| `FIRST_GIFT` | 初始携带物(木牍/短刀/残玉) | 一 | 贯穿全阶段 |
| `FIRST_ENTRY` | 进城方式(合法/隐匿/交易/城外生存) | 一 | 影响初始身份标签 |
| `MARK_XU_BOOK` | 造假账 | 一 | 二:被认出 / 三:被追查 |
| `MARK_YELLOW_HIDE` | 藏过黄巾溃兵 | 一 | 二:可投靠流民首领 |
| `MARK_CAO_SERVE` | 加入曹操军 | 二 | 三、四:军旅线 |
| `MARK_LORD_PATH` | 领主路径选择 | 二 | 三:成为一方势力 |
| `MARK_UNUSED_GIFT` | 从未兑付的携带物 | 三 | 四:隐藏结局指向 |
---
标记位存储在 `_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
}
}
}
| 标记位组合 | 规则 |
|:---|:---|
| `FIRST_GIFT` = "木牍" 且 `FIRST_ENTRY` = "隐匿" | 允许。木牍携带者也可以绕城。但后续可能被质疑"有身份证明为何不走正门"。 |
| `MARK_CAO_SERVE` = true 且 `MARK_YELLOW_HIDE` = true | 允许但触发特殊事件:曹操军中有人举报你"通黄巾",你需要自证。 |
| `MARK_LORD_PATH` = "中原坞堡" 且 主角同时拥有 `MARK_YUAN_SPY` | 触发危机:袁绍方认为你是曹操的暗子,曹操方认为你是袁绍的暗子。 |
---
| 季节 | 视觉 | 气味 | 体感 | 情绪 | 典型意象 |
|:---|:---|:---|:---|:---|:---|
| 春 | 桃瓣、嫩绿、融雪、新坟纸钱 | 湿土、草腥、硝烟 | 料峭、潮 | 躁动、不安、希望 | 桃花落在募兵告示上 |
| 夏 | 烈日、尘土、浓荫、腐尸 | 汗水、焦麦、血 | 闷热、黏 | 焦灼、等待、爆发 | 麦田无人收,穗子垂地 |
| 秋 | 黄叶、枯草、高云、雁阵 | 桂、秸秆焚、马汗 | 凉、干 | 收敛、清醒、离愁 | 梧桐叶盖住半张残榜 |
| 冬 | 冻土、枯枝、白气、薄冰 | 冰、炭火、腐草 | 刺骨、僵 | 隐忍、绝望、蛰伏 | 井口冒白气,井绳冻硬 |
从设计讨论中提取的核心情绪种子,用于AI生成时的情绪锚定:
| 种子ID | 种子名 | 定义 | 表现形式(给AI的提示) | 禁用写法 |
|:---|:---|:---|:---|:---|
| `TONE_COLD` | 冷意 | 自愿成为那堵墙的自觉 | 环境冷、动作慢、对话少、动词选"站/看/弯腰",不选"愤怒/悲伤" | ❌ 不写"他感到悲凉" |
| `TONE_HOME` | 家来了 | 身体先于大脑想起家 | 气味触发、舌尖味道、手指无意识动作,然后才意识到"我在想家" | ❌ 不写"他想家了" |
| `TONE_NOPLAN` | 选择丧失 | 连计划都无从开启 | 沉默、重复动作(磨刀/数粮)、回答简短、不问"怎么办" | ❌ 不写"他决定放弃" |
| `TONE_CYCLE` | 循环 | 认出"他是我,我是他" | 年轻人和老人做同样动作、相似对话跨阶段重复、风一样但人不同 | ❌ 不直接点破循环 |
| `TONE_PEACE` | 安静的结局 | 不是功成,是停下 | 日常动作(打水/锄地/补衣)、环境安静、无BGM式的描写 | ❌ 不写"终于安宁了" |
| `TONE_GATHER` | 聚散 | 到时间了,该回了 | 收到信/听到消息/看到雁南飞,然后开始收拾东西,不说理由 | ❌ 不写"他决定回家" |
#### 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
---
输入(设计师提供):
AI执行:
输出格式:
[场景名]:[城镇]·[季节]·[时辰] [环境描述]:(AI根据季节+情绪生成) [可交互元素]:(NPC列表、物品、告示等) [选项]: 1. [选项文本] → 标记位:[MARK_ID] = [值] 2. [选项文本] → 标记位:[MARK_ID] = [值] ... [情绪锚点]:(本场景使用的情绪种子,不显示给玩家) [自检状态]:通过 / ⚠️ 未通过: [违规种子ID]
[ ] 环境描写是否匹配季节关键词 [ ] 情绪是否"不点破"——没有直接写"他感到悲伤/想家/绝望" [ ] 选项是否对应正确的标记位 [ ] NPC对话是否有"留白"——没有把核心观念说尽 [ ] 是否与主角当前阶段、身份、携带物匹配 [ ] 是否有至少一个"种子"——可被后续阶段引用的细节 [ ] 标记位读写是否正确(读取了该读的,写入了该写的) [ ] 自检状态是否通过;若未通过,手动审核违规段落
设计师审核 → 标注不满意的点 → 喂回给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次 |
---
---
本文件 = 图纸 + 工具箱 + SOP
版本:v1.2
场景名:许县城门口·秋·黄昏
环境描述:
城门半掩。两个县吏在盘查入城的人,其中一个冷得跺脚,嘴里呼出的白气一出口就被风刮散。城墙上贴着一张募兵告示,墨迹被雨水洇过,边角被风吹得哗哗响。告示下面压着半张旧告示,只剩“太平”两个字还看得见。
城墙根下,一个老妇支着一个小炉子卖烤饼。饼的香味顺风飘过来,又立刻被风卷走。排队的人缩着脖子,没人说话。有人攥着几枚铜钱,有人攥着半块玉佩,有人什么都没攥。
你站在队尾。怀里那枚木牍硌着肋骨。上面的字是父亲请村里唯一读过书的先生刻的——你的名字,籍贯,父祖三代。父亲把它塞进你手里时,手在抖。
风从城门洞里灌进来,灌进你的领口。
城门快关了。
可交互元素:
县吏(盘查入城)
老妇(卖烤饼)
募兵告示(可阅读)
排队的流民(可观察/搭话)
选项:
排队,接受盘查,必要时出示木牍 → MARK_FIRST_ENTRY = "合法"
不排队。绕到城墙塌陷处,从那里翻进去 → MARK_FIRST_ENTRY = "隐匿"
帮老妇卖饼,换一块饼和她的担保入城 → MARK_FIRST_ENTRY = "交易"
先不进城了。城外有条河,河边可能有鱼 → MARK_FIRST_ENTRY = "城外生存"
情绪锚点:TONE_COLD
自检状态:通过
未使用“他感到悲凉”
未使用“他想家了”
情绪通过环境传递(风灌进城门洞、没人说话、告示被风吹得哗哗响)
—— 人与AI协作记录 ——