角色羁绊与好感度系统设计 v1
状态:Backlog / 实施准备就绪 真相时间:2026-07-27 P1 拍板:2026-07-27 P1 确认进入实施准备(口信 ack,未回 §15 显式拍板) §15 P1 待拍板项默认采用 v1 推荐方案(如推翻可重开):
- 三角互斥不扩展到非 romance bond(影响 R-2 联合驱动逻辑)
- favor ≥ 75 给独占选项(影响 R-5 节点文案工作量)
- 跨周目不区分"清白投胎" vs "情分延续"(影响 R-7 结算页文案)
- 关系网图默认不显示 Layer 3(江湖旧识),可手动展开(影响 R-4 默认折叠策略)
- favor/bond 数值不进账号成就池(影响数据层 schema) locked-by:Q0 全仓代码质量恢复(P0 强依赖;R-1 数据契约起步前 Q0 必须 closed) ready_for_dispatch:Q0 verified + P1 R-1 派工拍板后才可派工 承接者:产品 / 玩家价值侧;实施由 R-1 ~ R-7 七个 lane 推进 本文不写实现;只定用户价值、系统边界、数据契约、玩家可感知形态、三层文件边界、工量与验收、非目标、风险/回退
0. 一句话定位
把"挂机经营里跟这群人混熟不熟"做成一组长期可感知、可积累、可作用玩法的关系层:
- 好感度(Favor):玩家与单个角色的亲密度,基础数值层,0-100,4 段。
- 羁绊(Bond):两个或多个角色间的关系线,由若干对 favor 联合驱动并加上关系专属修正。
- 关系网(Relational Web):全员 favor + 全部 bond 形成的网络视图,用于玩家一眼看懂"现在我跟谁最铁,谁跟谁还别扭"。
1. 现状盘点(为什么要做新一版)
| 模块 | 现状 | 问题 |
| :--- | :--- | :--- |
| src/data/bonds.ts + utils/bonds.ts | 4 条 bond(guo/lu、wushuang/lu、bai/tong、qian couple)、0-100、4 阶段(seed/friction/choice/settled)、三角互斥、6 个核心员工(StaffId) | ① 只覆盖"关系线",没有单人好感度层 ② 只覆盖核心员工,莫小贝/无双只有部分线、群组线缺失 ③ 阶段演示元数据(印章/徽章/文案)只服务于 BondSummaryCard |
| BondSummaryCard.tsx | 1 张汇总卡 + SideCardsRow 内的摘要 | 没有关系网视图、没有单人详情页;玩家只能看到 bond,看不到"我跟小贝现在到底几分熟" |
| story/characters/** | 7 个核心角色 1-3 个 branch + group 3 个 branch,共 100+ 节点 | 节点里散落着"湘玉羁绊 / 盗圣风声 / 官府警觉"等剧情内变量,缺与 favor/bond 状态的统一桥 |
| staffDepth.ts + 路线图 D1 | 员工五维(health/stamina/mood/stress/loyalty) | 五维是岗位/状态层,favor 是人际关系层,二者必须正交,不能混淆 |
结论:现有 bond 是"线",缺"点"(favor)和"面"(关系网)。新一版要补的就是这两个层级,让 bond 从 4 条孤线变成一张可读、可作用、可积累的网。
2. 用户价值
| 价值 | 玩家视角 | 设计侧落点 |
| :--- | :--- | :--- |
| 看见关系在变化 | "我上次对小贝好,她现在看我眼神不一样了" | 关系网视图 + 角色头像状态 + 阶段短印("初识/升温/抉择/相守") |
| 长期反馈,不止单次事件 | "我选郭芙蓉,无双那边不是立刻崩,但慢慢冷下来" | favor 渐变 + bond 三角互斥 + 衰减机制 |
| 影响经营 | "白展堂偷摸帮我挡了一次官府" | favor 阈值触发经营 buff/客流/治安修正 |
| 影响剧情 | "我好感度高,某些分支选项才出现" | favor 阈值解锁独占选项 + bond 阶段解锁专属节点 |
| 跨周目可感知 | "下辈子我投胎,上辈子的情分还在" | favor/bond 部分继承,与 R14 跨周目锚点(0.3 继承率)+ 0.95 跨年衰减统一契约 |
3. 系统边界(三圈层)
┌───────────────────────────────────────────────┐
│ Layer 3 · 江湖旧识 / 外地旧交 │ ← 钱掌柜夫妇、展红绫、姬无命、凌腾云、地方门派
│ (江湖人脉,触发条件:被找上门 / 联机助阵 / 旧账) │
├───────────────────────────────────────────────┤
│ Layer 2 · 客栈外熟客 / 街坊邻里 │ ← 七侠镇街坊、地方捕头、地方商户、神秘客人
│ (触发条件:客流、节令、治安事件) │
├───────────────────────────────────────────────┤
│ Layer 1 · 客栈内员工 / 常驻角色 │ ← 佟湘玉、白展堂、郭芙蓉、李大嘴、吕秀才、莫小贝、祝无双
│ (高密度触发:日常、经营、岗位、剧情主分支) │
└───────────────────────────────────────────────┘
三圈层的差异:
| 维度 | 客栈内 | 客栈外 | 江湖旧识 | | :--- | :--- | :--- | :--- | | favor 起点 | 50(默认相识) | 25(默认面熟) | 0(默认陌生) | | 触发频率 | 高(每日 / 每次岗位事件) | 中(每周 1-2 次) | 低(每月 / 特定事件) | | 阶段上限 | settled(可结拜/知己) | settled(可互信) | friction(默认到不了 settled) | | 跨周目继承 | 0.3(高) | 0.2(中) | 0.1(低) | | 经营加成 | 直接影响客流/治安/士气 | 影响事件权重 | 影响联机助阵 / 旧账清算 |
4. 核心数据模型(三层)
┌────────────────────────────────────────────────────────┐
│ RelationView (派生索引,只读) │
│ - 全员 favor 排行 + 全部 bond 阶段 → 关系网图 │
│ - 用于 UI 渲染 + 玩法钩子查询 │
├────────────────────────────────────────────────────────┤
│ Bond (关系线) ← 已有 4 条,扩展到 8-12 条 │
│ - 2+ 角色对 + 关系专属修正 + tags + perk │
│ - 三角互斥 + 衰减 + 阶段阈值 │
├────────────────────────────────────────────────────────┤
│ Favor (好感度) ← 本版新增 │
│ - 1 角色 1 favor + 0-100 数值 + 4 段 │
│ - 增长/衰减规则 + 跨周目继承 │
└────────────────────────────────────────────────────────┘
4.1 Favor(本版核心新增)
FavorState {
npcId: CharacterId; // 单个角色
layer: 'inn' | 'town' | 'jianghu';
value: number; // 0-100
stage: 'stranger' | 'familiar' | 'trusted' | 'intimate';
unlockedPerks: FavorPerkId[]; // 已解锁的轻量加成
lastEventDay?: number; // 用于节令/回访提示
// 不存 lastTouch,只用 lastEventDay 推衰减
}
数值阶段(与 bond 的 4 段统一):
| 阶段 | 范围 | 段标 | 玩家感知 | | :--- | :---: | :---: | :--- | | stranger | 0-24 | 初见 | 角色头像灰边,对话冷 | | familiar | 25-49 | 相识 | 头像亮边,偶有支线提示 | | trusted | 50-74 | 互信 | 头像发光,可触发经营 buff | | intimate | 75-100 | 相熟 | 头像专属边框 + 专属事件池 + 跨周目高继承 |
4.2 Bond(扩展现有)
现有 4 条,本版只扩展不重做:
| 现有 bond | 角色 | 关系类型 | 本版变更 | | :--- | :--- | :--- | :--- | | guo_lu_romance | 郭芙蓉 × 吕秀才 | romance | +favor 联合驱动(双方均 ≥50 才进 friction) | | wushuang_lu_unspoken | 祝无双 × 吕秀才 | romance | 同上 | | bai_tong_life | 白展堂 × 佟湘玉 | romance/family | +favor 联合 + 阶段稳定后允许"家"标签 | | qian_couple_family | 钱掌柜 × 钱夫人 | family | 不变(外部 NPC) |
新增 4-8 条(v1 推荐先加这 4 条,与现有剧情文档对齐):
| 新增 bond | 角色 | 关系类型 | 设计意图 | | :--- | :--- | :--- | :--- | | xiaobei_inn_family | 莫小贝 × 佟湘玉 | family | 嫂子线,孩子视角 | | li_guo_kitchen | 李大嘴 × 郭芙蓉 | rivalry | 厨房与江湖,冤家 | | bai_dazui_bro | 白展堂 × 李大嘴 | mentor/bro | 退隐与兄弟 | | lv_xiaobei_teach | 吕秀才 × 莫小贝 | mentor | 私塾线,科举延伸 |
v1.1 再考虑:
tong_xiangyu/12_yihong、tong_xiangyu/16_beggar、tong_xiangyu/17_yamen里的非主角 NPC 是否升级为 Layer 2 角色 + 对应 bond(本版不做,留 backlog)。
4.3 RelationalView(派生)
逻辑层纯函数输入所有 FavorState[] + BondState[],输出:
RelationView {
// 全员 favor 快照
favorMap: Record<CharacterId, FavorState>;
// 当前最关注的 3 条 bond
topBonds: BondSummary[];
// 关系网边(角色-角色,带权)
edges: Array<{ from: CharacterId; to: CharacterId; bondId: BondId; weight: number }>;
// 网络图布局节点
nodes: Array<{ id: CharacterId; x: number; y: number; tone: SealTone }>;
// 玩家提示:"最近 7 天有变动的角色"
recentChanged: CharacterId[];
}
只读派生,UI 不得直接改 favor/bond 数值。
5. 数值增长与衰减机制
5.1 增长来源(可叠加)
| 来源 | 范围 | 频次 | 备注 | | :--- | :---: | :--- | :--- | | 经营互动(排班、点菜、加班) | +1 ~ +3 | 高 | 客栈内角色 | | 剧情节点完成 | +5 ~ +15 | 中 | 由事件产出声明 | | 节日/节令馈赠 | +3 ~ +8 | 低 | 一年 24 节气节点 | | 联机助阵/共事 | +2 ~ +5 | 低 | 联机 lane 后续接 | | 主动送礼(若 v1.1 引入) | +5 ~ +10 | 玩家操作 | 本版不做,留 backlog |
5.2 衰减机制(防"自动 + 满")
| 触发 | 范围 | 备注 | | :--- | :---: | :--- | | 同一事件被忽略 ≥ 30 天 | -2 | 静默衰减 | | 经营状态恶化(失败链) | -3 ~ -10 | 与 F1 失败链对接 | | 跨年(360 天) | ×0.95 | 复用 R14 跨年衰减契约 | | 跨周目 | ×继承率(0.1/0.2/0.3) | 复用 R14 锚点 | | bond 三角互斥 | 一侧 settled → 另一侧 -50% 增长 | 已有逻辑 |
5.3 阈值与解锁
| 阈值 | 解锁 | 玩家文案 | | :---: | :--- | :--- | | favor ≥ 25 | 角色头像亮边 + 偶有支线提示 | "Ta 似乎对你有了点印象" | | favor ≥ 50 | 经营 buff 激活 + 1 个轻量 perk | "Ta 把你当自己人了" | | favor ≥ 75 | 专属事件池 + 跨周目高继承 | "你们之间有些说不清的东西" | | bond 进 friction | 关系网图边亮起 | "(关系升温中)" | | bond 进 choice | 关键节点解锁 | "到了必须选的时候" | | bond 进 settled | 阶段稳定 + 解锁 1 个永久 perk | "(已选定/已成家/已结拜)" |
6. 玩家可感知形态(UI 层落点)
| 入口 | 形态 | 关键交互 |
| :--- | :--- | :--- |
| 主界面右栏 | 现有 SideCardsRow 内嵌"关系简报" | 只显示 top3 favor + top1 bond 阶段短印 |
| 关系网全屏 | 新组件 RelationalWebView | SVG 节点-边图,点击节点/边进入详情 |
| 角色详情抽屉 | 新组件 CharacterFavorPanel | 头像 + 阶段短印 + favor 数值 + 已解锁 perk 列表 + 阶段提示 |
| 对话/剧情卡 | 在已有 StoryTrackingCard 内追加 favor/bond 增量提示 | "你对小贝的好感 +3,她现在更愿意跟你说话了" |
| 节令/年度报告 | 年度关系大事记 | "本年你与小贝相识、与无双结为师徒" |
| 跨周目传承 | 跨周目结算页加 favor/bond 继承 | 与 X1 lane 共用结算页 |
视觉规范(沿用现有):
- 4 段色板 = BondStagePresentationMeta 的
sealTone,不新增色板。 - 短印文案 = 现有
BOND_STAGE_PRESENTATION.ribbon风格,统一为 2 字("初识/相识/互信/相熟")。 - 不得在玩家视图暴露
bondId/favorPerkId等内部 snake_case 字段。
7. 玩法钩子(让关系"有用")
| 钩子 | 触发 | 数值契约 |
| :--- | :--- | :--- |
| 经营加成 | favor ≥ 50 | 每角色 +1~3% 客流 / 士气 / 治安(数据层常量) |
| 事件权重 | favor 越高,该角色相关事件触发概率越高 | 数据层 EVENT_WEIGHT_TABLE,由 favor 段位查表 |
| 独占选项 | favor ≥ 75 或 bond ≥ friction | 事件文案中追加选项 |
| 联机助阵 | bond ≥ choice(江湖旧识) | 联机 lane 后续接入,本版只预留接口 |
| 失败链缓冲 | favor ≥ trusted(对某员工) | 该员工的失败阈值下调 5(数据层常量) |
| 跨周目继承 | 见 §5.2 衰减 | 复用 R14 锚点 |
8. 与现有系统对接
| 现有系统 | 对接方式 | 边界 |
| :--- | :--- | :--- |
| bond(src/data/bonds.ts + utils/bonds.ts) | bond 由 favor 联合驱动 + 阶段阈值表统一 | bond 数据保留,favor 是新增层 |
| staffDepth(health/stamina/mood/stress/loyalty) | favor 与五维正交,互不读写 | 不得将 favor 折算成 loyalty |
| buffEngine | favor/bond 触发 buff 时走 buff 体系,不在 favor 内自实现 buff | 数据层常量化,逻辑层只 emit |
| storyEvents / eventTables | 节点完成时 emit favor/bond 增量,事件系统不直接读写 | 双向接口在 storyEvents 内 |
| 失败链 F1(路线图) | 经营恶化触发 favor 衰减 | 衰减常量集中在数据层 |
| 跨周目 X1(路线图) | favor/bond 跨年 ×0.95 + 跨周目 ×继承率 | 复用 R14 锚点,不在此处新定义 |
| 联机 N1(路线图) | bond ≥ choice 触发助阵 | 本版只预留 relationHookId,实现延后 |
9. 三层架构文件边界(必须严守 AGENTS.md)
数据层 src/data/relations/(本版新建领域)
src/data/relations/
index.ts // 仅 re-export
types.ts // FavorState / FavorStage / FavorPerk / RelationView
favorDefaults.ts // DEFAULT_FAVOR_STATES(三圈层各自的初始)
favorStages.ts // FAVOR_STAGE_THRESHOLDS + FAVOR_STAGE_PRESENTATION(沿用 bond 的 4 段)
favorPerks.ts // FAVOR_PERKS(常量池)
bondExtensions.ts // 现有 4 条 bond + 新增 4 条;只放常量配置
relationTables.ts // 关系网布局节点 / 边权常量
禁止放函数(符合 AGENTS.md 数据层硬约束)。
逻辑层 src/utils/relations/(本版新建领域)
src/utils/relations/
index.ts // re-export
favorLogic.ts // applyFavorDelta / getFavorStage / clampFavorValue
bondRelationLogic.ts // 现有 bond utils 的扩展层,处理 favor 联合驱动
relationViewLogic.ts // 派生 RelationView(纯函数,无副作用)
relationHookLogic.ts // 经营加成 / 事件权重查表(纯函数)
relationRegression.ts // 与 bond/staff 既有回归的兼容测试
UI 层 src/components/relations/(本版新建领域)
src/components/relations/
RelationalWebView.tsx // 关系网全屏图(SVG 节点-边)
CharacterFavorPanel.tsx // 角色详情抽屉
FavorDeltaToast.tsx // 剧情节点后的小提示(短印 + 数值)
RelationAnnualDigest.tsx // 年度关系大事记
// 复用现有:
// src/components/bonds/BondSummaryCard.tsx
// src/components/staff/SideCardsRow.tsx(嵌入关系简报)
UI 层不得做数值计算,所有查表走 relationHookLogic。
复用与边界声明
src/data/bonds.ts与src/utils/bonds.ts保留原状;本版不删旧 bond 字段;新增 favor 层独立目录。- 与
staffDepth的关系:只读 favorite 派生顶部 favor,不写 staff 五维。 - 与 buff 体系:hook 触发走
buffEngine,不在 relations 内自实现。
10. 实施切片(分阶段,每阶段一个 lane)
| 阶段 | 范围 | 依赖 | 工量 | 验证 |
| :---: | :--- | :--- | :---: | :--- |
| R-1 数据契约 | src/data/relations/** + types.ts 扩展 + 既有 bond 兼容 | 无 | S | tsc --noEmit 无新增错误;常量表无函数 |
| R-2 逻辑层 | src/utils/relations/** + bond 联合驱动 + 回归 | R-1 | S | 纯函数单测覆盖阈值/互斥/衰减/跨年 |
| R-3 UI 最小落地 | BondSummaryCard 升级显示 favor + CharacterFavorPanel 弹层 | R-1, R-2 | M | 桌面/移动布局不溢出;build/lint 通过;浏览器实路径点击通过 |
| R-4 关系网全屏 | RelationalWebView SVG 节点-边 + 点击交互 | R-3 | M | 8-10 节点 + 8-12 边布局;性能 < 16ms/帧 |
| R-5 剧情 hook | 事件节点完成 emit favor/bond 增量 + FavorDeltaToast | R-3 + 现有 eventTables | M | 既有 100+ 节点回归通过;新增 hook 不破坏旧节点 |
| R-6 玩法钩子 | 经营加成 / 事件权重查表 + 与失败链 F1 衰减对接 | R-2 + F1 | M | 模拟器跑 360 天数值稳定;buff 走 buffEngine |
| R-7 跨周目 | 与 X1 共用结算页 + favor/bond 跨年 + 跨周目 | R-2 + X1 | S | 跨周目存档兼容测试;R14 锚点契约不变 |
前置依赖(本版不在 scope 但卡后续):
- D1 角色深度 UI(staff 五维)— 必须先稳定员工运行时契约
- Q0 全仓代码质量恢复— R-1 起步的强依赖(必须先解 68 个 lint 错误,避免叠加债)
- F1 失败链 v1.2— R-6 衰减对接前提
- X1 跨周目 UI— R-7 共用结算页前提
11. 验收(每阶段通用 + 整体)
每阶段硬验收
- [ ]
tsc --noEmit不新增错误 - [ ]
cmd /c npm run build通过 - [ ] 既有回归(buff / bond / eventTables / staffDepth)不退化
- [ ] 桌面 + 移动两套布局不溢出
- [ ] 玩家文案不含
bondId/favorPerkId/ snake_case 内部字段(对齐 AGENTS.md 玩家文案边界) - [ ] 三层无反向依赖(数据层不 import utils/、UI 层不写数值)
整体验收(全部 R-1 ~ R-7 完成)
- [ ] 客栈内 7 角色 + 至少 5 个客栈外角色 + 至少 3 个江湖旧识 共 ≥ 15 角色有 favor 状态
- [ ] 至少 8 条 bond(4 旧 + 4 新)可触发
- [ ] 关系网全屏在桌面/移动均可读
- [ ] 360 天模拟数值稳定(无人 favor 永远不衰减 / 永远增长)
- [ ] 跨周目结算页正确显示 favor/bond 继承
- [ ] 联机 lane 后续接入时,只需实现
relationHookId的解析,无侵入
12. 非目标(本版明确不做)
- ❌ 不改 staff 五维(loyalty 与 favor 正交)
- ❌ 不改失败链阈值与契约(复用 R9 已签字数值,衰减常量走 R-6 对接)
- ❌ 不做送礼 / 约会玩法(留 v1.1 backlog)
- ❌ 不做 AI 对话生成(只读预制节点 + 阶段提示)
- ❌ 不重做现有 bond(4 条 bond 字段保留,只扩展 4 条)
- ❌ 不实现联机 hook 调用(只预留
relationHookId接口) - ❌ 不引入新色板(沿用 bond 的 4 段
sealTone) - ❌ 不暴露内部 ID 给玩家文案
13. 风险 / 回退
| 风险 | 影响 | 缓解 | 回退 |
| :--- | :--- | :--- | :--- |
| 数值膨胀 | 360 天后全员 favor ≥ 80,失去分层 | 衰减机制 + 三角互斥 + 跨年 ×0.95 | 调常量集中数据层,不动逻辑 |
| 关系网图过密 | Layer 3 加入后节点 > 20,SVG 难读 | 按圈层折叠 + 默认隐藏 Layer 3 | 折叠状态持久化,关掉折叠恢复原视图 |
| 与 staff 五维混淆 | P1 验收可能混淆 loyalty 与 favor | 设计文档正交声明 + 颜色与图标区分 + 文档互引 | 删任一不影响另一 |
| 现有 bond 扩展破坏旧节点 | R-5 hook 接入时 eventTables 回归失败 | 先 R-1/R-2 兼容测试通过再接 hook | 回退 hook 调用,保留只读派生 |
| 跨周目衰减双重计算 | X1 与 R-7 各自 ×0.95 累乘 | 集中在 relationViewLogic.computeLegacyPoints 一处 | 单一函数 + 单测固定语义 |
| 玩家文案暴露内部字段 | 违反 AGENTS.md 边界 | UI 层常量映射 + 回归 case 显式检查 | 卡 lint(后续可加自定义规则) |
14. 与路线图 v1 / 5 日计划的位置
| 路线图 | 本版对应 |
| :--- | :--- |
| P0 · C0 W29 收口 | 不依赖,但完成后才进 R-1 |
| P0 · Q0 质量恢复 | 强依赖 — R-1 前 Q0 必须过,否则 lint 债叠加 |
| P1 · D1 角色深度 UI | 正交互补 — D1 做 staff 五维,本版做 favor/bond;UI 共用 SideCardsRow / StaffTabs 入口但不抢组件 |
| P1 · F1 失败链 v1.2 | R-6 衰减对接 |
| P1 · X1 跨周目 UI | R-7 共用结算页 |
| P2 · K1 内容池扩展 | R-5 节点回归后,K1 可直接复用 favor 增量 |
| P2 · N1 WebRTC | 本版预留 relationHookId,N1 实现调用 |
建议插入位置:Q0 完成后,D1 启动同期并行(各自不同文件锁,UI 入口用同一组件库的 SideCardsRow / StaffTabs),F1 完成后启动 R-6,X1 完成后启动 R-7。
15. P1 待拍板项 → 2026-07-27 已默认采用 v1 推荐方案
| # | 拍板项 | v1 推荐 | 2026-07-27 默认 | 影响 lane | | :---: | :--- | :--- | :--- | :--- | | 1 | 三角互斥是否扩展到非 romance bond | 不扩展 | ✅ 默认采用 | R-2 联合驱动逻辑 | | 2 | favor ≥ 75 是否给"独占选项" | 给 | ✅ 默认采用 | R-5 节点文案 | | 3 | 跨周目是否区分"清白投胎" vs "情分延续" | 不区分 | ✅ 默认采用 | R-7 结算页文案 | | 4 | 关系网图是否默认显示 Layer 3 | 默认折叠 | ✅ 默认采用 | R-4 默认折叠策略 | | 5 | favor/bond 数值是否进账号成就池 | 不进 | ✅ 默认采用 | 数据层 schema |
P1 推翻任一项时,在本表回写"2026-XX-XX P1 推翻"并重开对应 lane 设计;否则按本表作为 R-1 ~ R-7 派工依据。
16. 文档元数据
- 真相时间:2026-07-27
- 上一版:
docs/design/completed/gameplay/bond-storylines-design.md(4 条 bond 基础,完成态,不删) - 关联路线图:
docs/plans/active/2026-07-13-后续需求路线图-v1.md(D1 / F1 / X1 / K1) - 关联 AGENTS.md:§1 三层架构、§3 相对路径、§4 玩家文案边界
- PM 备注:本设计不涉及 src/* 实现细节;实施切片 R-1 ~ R-7 需经 P1 拍板 §15 后才可派工
- 操作日志:见
docs/handoff/sessions/2026-07-27-relations-design-handoff-01.md