№ · 玩法设计 CH.07.27
主页 · 🎲 玩法设计 · 第一年关键选择因果矩阵 v1

第一年关键选择因果矩阵 v1

📅 2026-07-27 · 📦 16.1 KB · 🎲 玩法设计 · 📝 MD 文档 🆕 14d 🏷️ Buff🏷️ 终局🏷️ 剧情🏷️ 第一年🏷️ 玩法设计🏷️ 界面

状态:audit_complete / product_contract / no_runtime_change 基线:2026-07-27 范围:docs/plans/active/2026-07-27-Year1产品体验打磨执行计划-v1.md 的 12 个核心时刻与 C1-C4。 证据边界:只认当前 canonical 事件表、Year 1 展示/选择逻辑、终局结算逻辑。本文不把剧情原文、展示配置或测试通过误写为终局已个性化。

1. 读法与稳定性

  • 稳定真值:每个完成事件把 eventId -> { choiceId, day } 写入 storyProgress.completedstoryEffects.flags 写入 storyProgress.flags。因此本表的 option ID 是回响与年终派生的首选真值,flag 只作兼容/快捷判断,不能反推玩家文案。
  • 当前通用回响:精选节点的 priorEventIds 通过 getLedgerEcho() 读取上述 choiceId 并显示已选文本;它证明“选择被记住”,但通常不改变后续事件的数值、选项、人物状态或年终四块。
  • 缺口分类logic_not_consumed = 已有状态/ID 未被目标消费者读取;ui_not_expressed = 已有派生未进入玩家界面;content_missing = 无对应叙事/恢复内容;verification_pending = 有实现路径但未见本轮正常 GameApp 验证;blocked_on_owner = 需要拍板的年终措辞/优先级,不猜填。
  • 恢复出口的判定主线不断 只表示 missed、grace/fallback 或终局锚点允许继续,不等于已有“受挫 -> 新经营取舍 -> 后续承认”的 fail-forward 内容。

2. 12 个核心时刻矩阵

| 日程 / 冲突 | 稳定 option ID | 所得与代价 | 即时经营反馈 | 即时人物反馈 | 后续回响 / 年终引用 | 恢复出口 | 当前运行时证据与缺口 | | --- | --- | --- | --- | --- | --- | --- | --- | | Day 1 开业:掌柜亲带还是放手学开店 | storyline_y1_m01_n01:a | 招牌稳、得开业红绸;少赚铜钱 | 铜钱 +5、名声 +10、清洁 +8、治安 +2 | 对白表现为掌柜带白展堂走流程 | Day 3 的原始剧情提及首桌;精选回响没有把 Day 1 列为年终前账 | 无低状态阻断;事件完成后继续 | 结算字段与掉落已消费;人物差异只在对白,年终未消费。logic_not_consumed(年终) | | 同上 | storyline_y1_m01_n01:b | 多赚铜钱;首桌失误并留下清洁代价 | 铜钱 +12、名声 +3、清洁 -5 | 对白为伙计自行摸索、白展堂收拾汤渍 | 同上 | 同上 | 有真实经营取舍,不是零后果;无专属中后期人物回响。logic_not_consumed | | Day 10 赊账:人情、现金还是情报 | storyline_y1_m01_n04:a | 欠账换衙门照应,得欠条 | 铜钱 -8、名声 +3、治安 +12 | 人情账叙事 | Day 180、Day 355 的精选前账均列此事件,可显示已选文本 | 无法选中时可经既有 defer/missed 继续;无针对现金压力的补救 | 三项数值与前账回显已存在;年终只是通用选项文本。logic_not_consumed | | 同上 | storyline_y1_m01_n04:b | 守现金,伤人情与治安 | 铜钱 +4、名声 -3、治安 -5 | 店规立场仅在对白 | 同上 | 同上 | 有明确短期所得/代价;无后续人物分歧。logic_not_consumed | | 同上 | storyline_y1_m01_n04:c | 少收钱换巡街情报,得情报笔记 | 铜钱 -4、名声 +2、治安 +6 | 交易式人情立场 | 同上 | 同上 | 有真实数值后果;情报笔记未见被 C1-C4 消费。logic_not_consumed | | Day 58 试菜/入店:招牌菜立刻上还是先试三天 | storyline_y1_m02_n07:a | 立刻上菜单,得秘制配方;有卫生代价 | 铜钱 +5、名声 +8、清洁 -3 | 解锁李大嘴,写入 li_signature_dish_listed | Day 180 前账列此事件;Day 355 未列 | 这是受保护的入店选择,不会因过期自动 miss;选择后主线继续 | 入店与数值已消费;招牌菜 flag 无 C1-C4 消费。logic_not_consumed | | 同上 | storyline_y1_m02_n07:b | 放弃即时收入,换低风险试菜 | 铜钱 0、名声 +5 | 解锁李大嘴,写入 li_signature_dish_trial | 同上 | 同上 | 0 铜钱是明确的“先验证”叙事取舍,不是缺失结算;试菜状态未再消费。logic_not_consumed | | Day 63 食安:赔到底还是讲道理 | storyline_y1_m03_n01:a | 赔钱换信誉与感谢信 | 铜钱 -30、名声 +8、清洁 +10 | 老实认错的对白 | Day 180、Day 355 前账列此事件 | 主线不断;没有“现金受挫后补救并被承认”的专属路径 | 经营代价已结算、前账可见;感谢信/诚信立场未驱动后续。logic_not_consumed | | 同上 | storyline_y1_m03_n01:b | 少赔钱,保住部分清洁;伤人情写在对白 | 铜钱 -12、名声 0、清洁 +5 | 讲道理但伤人情 | 同上 | 同上 | 0 名声有明确叙事含义,但没有人物状态或后续修复。content_missing + logic_not_consumed | | Day 95 扩桌:一步到位还是将就 | storyline_y1_m04_n01:a | 两桌四椅与扩张叙事;高投入 | 铜钱 -200、名声 +5、清洁 -5 | 白展堂/秀才参与扩张的对白 | Day 100、Day 120 和 Day 180 均可从完成记录回显此选择;Day 355 未列 Day 95 | 不因资金不足锁主线;没有明确的扩张压力恢复事件 | 选择和通用回响存在;Day 155 不读取它,Day 180 不派生经营差异,年终未引。logic_not_consumed | | 同上 | storyline_y1_m04_n01:b | 节省投入,改用旧桌 | 铜钱 -180、名声 +3、清洁 +10 | 克制经营仅在对白 | 同上 | 同上 | 有明确数值分歧;“旧桌”结果无后续策略差异。logic_not_consumed | | Day 155 半年盘账:半年是否按真实选择回看 | storyline_y1_m06_n01:a | 报告归档 | 名声 +10 | 秀才报数、白展堂安慰的对白 | 自身仅回显 Day 150;Day 180 才列 Day 95 等六笔前账 | 无选择失败;继续到 Day 180 | 单 option,未读取 Day 95 选择,不满足 C1 的“半年按真实扩张选择回看”。logic_not_consumed + ui_not_expressed | | Day 200 两百日:公开分享还是安静沉淀 | storyline_y1_m07_n04:a | 热闹公开、得六封信;付出成本 | 铜钱 -15、名声 +10、清洁 +5 | 全员共同阅读的叙事 | Day 210 可回显;Day 215/240/355 未列此 ID | 选择后继续;无低关系补救 | 信件掉落和即时数值已消费;团队合作方式未影响红绸/八月收束。logic_not_consumed | | 同上 | storyline_y1_m07_n04:b | 无即时数值,换安静的关系沉淀 | 全部 0 | 各自阅读、次日分享的叙事 | 同上 | 同上 | 明确的零数值叙事选择;当前只保存在 completed 并可被 Day 210 通用回显。logic_not_consumed | | Day 215 红绸:立即搭擂还是先放消息 | storyline_y1_m08_n01:a | 快速报名与高声量;付出现金、卫生和治安 | 铜钱 -30、名声 +20、清洁 -5、治安 -3 | 团队筹备只在对白 | Day 240 前账可回显;Day 355 列此事件 | 无低治安/现金专属补救;主线继续 | 选择可见且有后账;未按团队状态改变筹备或年终。logic_not_consumed | | 同上 | storyline_y1_m08_n01:b | 慢热、低投入 | 铜钱 -10、名声 +8 | 克制筹备叙事 | 同上 | 同上 | 有真实经营取舍;无 Day 200 关系联动。logic_not_consumed | | Day 250 报名:公开、私查还是请官面 | storyline_y1_m09_n02:a | 快速公开、得名录;暴露风险 | 铜钱 +80、名声 +15、治安 -5 | 风险承担仅在对白 | Day 270 可回显;Day 275 不读取;Day 355 未列 | 主线不断;无失败后的安全补救链 | 有短期风险,不满足 C3 要求的 Day 275 同时读取准备和人物状态。logic_not_consumed | | 同上 | storyline_y1_m09_n02:b | 无数值,先查可疑报名 | 全部 0 | 秀才的调查叙事 | 同上 | 同上 | 明确“慢但安全”的零数值策略;目前无决擂结果消费。logic_not_consumed | | 同上 | storyline_y1_m09_n02:c | 无数值,官面介入 | 全部 0 | 邢捕头介入叙事 | 同上 | 同上 | 明确“最快但官面知道”的零数值策略;目前无决擂结果消费。logic_not_consumed | | Day 275 决擂:风光、公证或庆典 | storyline_y1_m10_n01:a | 最大名声/收入,留下铜锣;卫生治安受压 | 铜钱 +100、名声 +30、清洁 -20、治安 -5 | 高光为对白 | Day 278、Day 300、Day 355 前账可显示真实 option 文本 | 不因准备不足死锁;但无按准备/人物状态变体 | 经营后果和通用回响存在;前置 Day 250、团队状态均未消费。logic_not_consumed | | 同上 | storyline_y1_m10_n01:b | 官面认证、得公证文书,少些收入 | 铜钱 +60、名声 +20、清洁 -5、治安 +15 | 邢燕羁绊 +5 | 同上 | 同上 | 是经营与人物同时落地的现有最佳项;年终仅显示已选文本。logic_not_consumed | | 同上 | storyline_y1_m10_n01:c | 转庆功宴,少些收入、全员高兴 | 铜钱 +50、名声 +25、清洁 -10、治安 +5 | 五名员工心情各 +25 | 同上 | 同上 | 已有明确人物后果;未把该团队状态写进 Day 300/终局人物句。logic_not_consumed | | Day 355 来年方针:见第 4 节 | storyline_y1_m12_n05:a/b/c | 三项稳定方向及现状消费合同见下 | A 名声 +20;B/C 全部 0 | 方针对白不同;不直接改变 Year 1 员工状态 | Day 360 前账可回显;终局四块尚未读取 | 主线继续到 Day 360;非 Year 2 分支 | 即时结果卡有玩家标签,年终摘要未消费。logic_not_consumed + ui_not_expressed | | Day 360 跨年落款:先剧情后终局 | storyline_y1_m12_n06:a | 关灯完成收束;白佟羁绊 settled | 名声 +25、清洁 +5、治安 +10 | bai_tong_life +5settled | 完成事件即置 year1Closed,终局才可判胜败 | Day 360 唯一锚点;未完成会停在 pending,完成后按四维胜/败 | 收束顺序已由 year1Closed 门控;终局仍是数值四块,未消费跨幕选择。logic_not_consumed + verification_pending |

3. C1-C4 因果链结论

| 链 | 已有稳定链 | 断点 | 最小缺口分类 | | --- | --- | --- | --- | | C1 扩张:Day 95 -> 155 -> 180 | Day 95 的 A/B 数值不同;Day 180 的前账包含 Day 95,能准确显示所选文本 | Day 155 只回显 Day 150,未读 Day 95;Day 180 没有按 A/B 派生经营/人物结论;Day 355 未引用 Day 95 | logic_not_consumedui_not_expressed;扩张压力的补救事件为 content_missing | | C2 团队:Day 200 -> 215 -> 240 | Day 200 A/B 均稳定存档;Day 240 回显 Day 215 A/B | Day 215 未读 Day 200;Day 240 未读 Day 200,且没有团队状态、筹备方式或代价差异;Day 355 未引用两项 | logic_not_consumed;低关系状态的恢复路径为 content_missing | | C3 高光:Day 250 -> 275 -> 300 | Day 250 A/B/C 稳定存档;Day 300 回显 Day 275 A/B/C;Day 355 前账也列 Day 275 | Day 275 未读 Day 250、经营准备或人物状态;Day 300 的高光总结仅是通用回显;不足状态没有补救承认 | logic_not_consumed;fail-forward 为 content_missing | | C4 年终:Day 355 -> 360 -> 终局摘要 | Day 355 A/B/C 写入 choiceId 和互斥语义 flag;结果卡显示玩家标签;Day 360 前账列 Day 355;Day 360 完成后才触发终局判定 | 胜利/失败的四块只读铜钱、名声、四条核心羁绊、时间和 year1Closed;未读 Day 355 option/flag,也没有三跨幕选择和两角色状态的个性化句 | logic_not_consumedui_not_expressed;正常 GameApp 岁末全链仍 verification_pending |

4. C4:Day 355 稳定 ID 与年终摘要消费合同

4.1 已冻结的三项方针

| option ID | 玩家语义(现有展示) | 写入事实 | 即时确认 | 当前年终消费 | | --- | --- | --- | --- | --- | | storyline_y1_m12_n05:a | 把同福开得更大 / 扩张经营 | completed['storyline_y1_m12_n05'].choiceId;flag next_year_focus_bigger;名声 +20;总录掉落 | StoryChoiceOutcome 显示“来年方针:扩张经营”,并显示已有数值/掉落 | Day 360 前账会显示该选项文本;终局四块不读它 | | storyline_y1_m12_n05:b | 把同福开得更稳 / 稳健经营 | completed[...];flag next_year_focus_steadier;数值均 0 | StoryChoiceOutcome 显示“来年方针:稳健经营” | Day 360 前账会显示该选项文本;终局四块不读它 | | storyline_y1_m12_n05:c | 把同福开得更有人味 / 人情优先 | completed[...];flag next_year_focus_warmer;数值均 0 | StoryChoiceOutcome 显示“来年方针:人情优先” | Day 360 前账会显示该选项文本;终局四块不读它 |

b/c 的零数值是已定义的表达性选择:前者承诺守住规模与人手,后者承诺关系/口碑优先。它们不是“未配置效果”;真正的缺口是这些已记录的差异没有进入终局摘要。

4.2 当前运行时合同(已实现)

Day 355 option ID
  -> completeYear1StoryEvent(): completed.choiceId + flag
  -> getYear1ShowcaseChoiceOutcome(): 玩家标签
  -> Day 360 getLedgerEcho(): 真实已选文本
  -> Day 360 completeYear1StoryEvent(): year1Closed = true
  -> evaluateYearEndOutcome(): 只检查时间、铜钱、名声、核心羁绊和 year1Closed
  -> buildVictorySettlementPlan(): 固定四块数值摘要

结论:next_year_focus_biggernext_year_focus_steadiernext_year_focus_warmer 目前只有写入与 Day 355 即时展示的间接映射;在 src/** 中没有年终摘要读取方。终局完成的事实门槛是 Day 360 的 canonical event 完成所导出的 year1Closed,不是三项方针 flag。

4.3 待实现的摘要消费合同(不等于已实现)

| 合同项 | 必须输入 | 必须输出 | 当前状态 | | --- | --- | --- | --- | | 方针真值 | 优先读 completed['storyline_y1_m12_n05'].choiceId;仅在兼容旧档时读三项 flag | 恰好一个玩家可见方向:扩张经营 / 稳健经营 / 人情优先 | logic_not_consumed | | 终局位置 | 同一年度事实快照供胜利与失败共用;保留既有四块,不新增第五块 | “江湖阅历折算预览”详情包含 来年方针:<现有玩家标签>;胜/败仅改变语气 | ui_not_expressed | | 跨幕引用 | 从已完成记录中选取至少 3 个真实 option ID,且不得把 missed 当成已选 | 年度总账/名声定格各可引用一条具体取舍及代价 | blocked_on_owner:三条选取优先级与玩家文案未拍板 | | 人物引用 | 现有 staff/bond 年末状态,至少 2 项 | 关系快照给出 2 名不同角色的状态句,不显示内部 ID | blocked_on_owner:角色阈值、同分规则和句库未拍板 | | Year 1 边界 | Day 355 choiceId/flag 只用于总结和表达 | 不创建 Year 2 分支、存档字段、store/context 或第二套结果卡 | 已由计划限定;实现前仍需回归与正常 GameApp 验收 |

5. 运行时证据索引

  • Canonical 事件与 option ID/数值:src/data/eventTables/storyline-year1.ts
  • 选择完成、flag 写入和 Day 360 的 year1Closedsrc/utils/storyEvents/year1DialogueLogic.tscompleteYear1StoryEvent()
  • 精选节点的真实 choice 回显、Day 355 即时方针标签:src/data/storyEvents/year1Showcase/month04.tsmonth12.tssrc/utils/storyEvents/year1ShowcaseLogic.ts
  • Day 360 只在 closeout 后允许终局:src/utils/endgame/failureOutcome.tssrc/components/endgame/useEndgameFlowController.ts
  • 当前胜利四块的唯一输入为余额、名声、核心羁绊和时间:src/utils/endgame/victorySettlement.ts;未接收 storyProgress

6. 审计结论

  1. 12 个核心时刻的 option ID 均已稳定,且现有选择记录可以支持后续派生;不需要为 WP2/WP6 新增 Year 1 存档 schema。
  2. C1-C3 已有“选择 -> 通用前账回显”,但没有足以称为产品因果链的专属消费,尤其没有低状态的恢复内容。
  3. C4 的收束顺序已成立:Day 360 剧情完成前终局保持 pending;但“个性化年度总结”尚未成立,Day 355 三方针与跨幕选择都未被终局四块消费。
  4. 后续实现必须保持本表 option ID 不变;未拍板的跨幕选取规则、人物状态阈值与年终句库保持 blocked_on_owner,不得用 flag 名或开发字段直接拼入 JSX。