佟掌柜
同福客栈 · UI / 玩法 / 设计规范

新手流程 · 剧情触发前置 · 功能渐进式解锁 Progress Unlock & Onboarding Design v1

直面两个核心病灶:①剧情错触发(白展堂未招募就开擂台赛), ②主界面信息爆炸(11 个 Tab 一字排开,新手一脸懵)。 本方案从规则层(数据 + 选择器)结构层(Tab 解锁节奏)表达层(引导 CoachMark)三层联动, 让玩家在 12 个月里,沿着"认识客栈 → 招贤纳士 → 触发主线 → 解锁支线"这条主线,一路有方向、有惊喜地玩下去。

📌 病灶 2 处 🧩 新增 1 个机制 🎯 12 月节奏表 🛠️ 实施 4 步走
01

病灶定位:剧情错触发 + Tab 信息爆炸 PATHOLOGY · 病灶 = 机制缺失,不是 bug

病灶 A事件触发权重 100% 缺失 staff 判定

src/data/eventTables/selection.ts · L196-247

权重函数 selectWeightedGameEvent 的判定维度只有:时间窗、时段、营业阶段、年份阶段、羁绊阶段、擂台赛阶段。完全没读 person.unlocked

// 现在 selection.ts 的判定维度(节选)
isDayWindowAllowed(event, state.day)        // 天数窗口
event.timeAffinity.includes(state.timeOfDay) // 白天/黄昏/夜晚
getBusinessPhaseWeight(...)                  // 开业/守业...
getYearPhaseWeight(...)                      // 开元年/次年
getBondSeriesWeight(...)                     // 羁绊阶段
getTournamentSeriesWeight(...)               // 擂台赛阶段
// ❌ 没有 getStaffUnlockedWeight(...)

病灶 BtriggerConditions 字段形同虚设

src/data/randomEvents.ts · L42-453 · 共 32 个事件

所有事件都填了 triggerConditions: ['reputation >= 60', 'cleanliness >= 50'] 这种字符串,但 selection.ts 从来不解析它——它只是给「事件目录」面板当说明文案展示的。

// randomEvents.ts 看着很像那么回事
triggerConditions: ['water < 20', 'cleanliness < 85'],
triggerConditions: ['safety < 80', 'guo_lu_romance not settled'],
// ↑↑↑ 这些全是字符串,selection.ts 根本不读
// 只在 EventTableDirectoryPanel.tsx L244 显示在目录里

病灶 C擂台赛系列事件全员错触发

src/data/eventTables/mainline-tournament.ts · 4 个事件

这 4 个事件都写死了具体角色,但事件对象里没有 requiredStaff 字段。郭芙蓉/李大嘴/白展堂/吕秀才没招募也会被选中。

martial_match_guo_guard      → 郭芙蓉守擂
martial_match_dazui_red_silk → 李大嘴误挂红绸
martial_match_bai_old_debt   → 白展堂旧账擂台
martial_match_xiucai_words   → 吕秀才文斗招亲
// ↑ 都没声明 requiredStaff: ['guo'] / ['li'] / ['bai'] / ['lu']
// ↑ 玩家没招募也照常触发,文案里"郭芙蓉把抹布一啪"直接穿帮

病灶 D主操作台 11 个 Tab 一字排开

src/components/ConsoleTabsBar.tsx · L18-32

玩家开服第一天,界面已经平铺了 账本/门客/菜谱/后院/后厨/闯荡/行囊/设施/竞拍/预警/联机共 11 个 Tab。新手一脸懵:「我现在该点哪个?」

const TAB_ITEMS = [
  { tab: 'ledger',    label: '账本' },
  { tab: 'staff',     label: '门客' },
  { tab: 'recipes',   label: '菜谱' },
  { tab: 'backyard',  label: '后院' },
  { tab: 'kitchen',   label: '后厨' },
  { tab: 'adventure', label: '闯荡' },
  { tab: 'baggage',   label: '行囊' },
  { tab: 'facilities',label: '设施' },
  { tab: 'auction',   label: '竞拍' },
  { tab: 'warning',   label: '预警' },
  { tab: 'networking',label: '联机' },
];
结论:

这不是 bug,是机制缺失。需要在 GameEvent 类型里加 requiredStaff 字段,在 selectWeightedGameEvent 里新增 getStaffUnlockedWeight,再给 triggerConditions 字符串写个轻量 DSL 解析器(或者把常用条件结构化成字段)。

02

三层规则 · 解锁体系设计 PROGRESS UNLOCK SYSTEM · 数据 / 选择器 / 表达 三层联动

🗄️ L1 数据层 数据结构

GameEventrequiredStaff?: StaffId[],给 WeightedGameEventStateunlockedStaff: Set<StaffId>

// types / RandomEventPopup.tsx
interface GameEvent {
  ...
  requiredStaff?: StaffId[];      // 需要这些人都招募
  requiredStaffMode?: 'all' | 'any'; // 默认 'all'
  requiredDayMin?: number;        // 替代散乱的 dayWindow
  requiredPhase?: BusinessPhase;
  requiredYearPhase?: StoryYearPhase;
  ...
}

⚖️ L2 选择器层 判定逻辑

selectWeightedGameEvent 增加 3 个判定函数,硬性约束 → 软性加权。

// selection.ts
isStaffRequirementSatisfied(event, state)
  → 任何一个 requiredStaff 没招募 → 权重 0
getStaffBonusWeight(event, state)
  → 核心角色已招募 → ×1.3 (剧情更对味)
getPhaseBonusWeight(event, state)
  → 命中 requiredYearPhase → ×1.5

🎨 L3 表达层 UI 反馈

当事件被锁住时:

🔒 主线 Tab 上挂"🔒"角标
💡 点击锁住的 Tab → 弹出解锁条件
📜 事件目录里: requiredStaff 文案化显示
🎉 解锁瞬间: 朱砂红"已解锁"小弹窗 + 礼花
代码改动量:

核心逻辑约 +80 行(selection.ts 新增 3 个判定函数 + 1 个硬性短路);数据迁移约 30+ 个事件requiredStaff(脚本生成 1 小时可完成);UI 改动 ConsoleTabsBar / 新增 ProgressOnboardingOverlay 两个组件。

03

12 月节奏总览 UNLOCK TIMELINE · 一年看三遍,一月一惊喜

主线节奏 主线任务 / 角色招募 / Tab 解锁 / 引导节点

角色招募节点 功能解锁节点 系统机制上线 引导 CoachMark
月 1
开张适应
📜
开业大吉
DAY 1 · 引导
📒
账本 + 菜谱
基础 2 Tab
👩‍🍳
后厨上线
默认 解锁
🌙
夜间巡场
DAYNIGHT
🎓
三日小结
引导
月 2
街坊熟络
🎓
吕秀才入伙
DAY 35± · 街坊
🍳
李大嘴入伙
DAY 45± · 厨子
🏚️
后院 Tab
采水/劈柴
🧒
莫小贝登场
NPC 互动
月 3
初遇挑战
🥊
郭芙蓉入伙
DAY 70± · 排山
🔨
设施 Tab
扩建入口
⚠️
食安小风波
事件驱动
🛡️
治安机制
夜巡风险
月 4
扩建起步
🎒
行囊 Tab
掉落 / 整理
📦
装备词条
LOOT SYS
🍲
菜谱研发
RECIPE
月 5
江湖初闻
🥋
白展堂入伙
DAY 140± · 盗圣
⚔️
闯荡 Tab
关中 / 黑风
🗺️
江湖地图
闯荡前置
月 6
盛夏经营
🏆
比武招亲
主线开启
🎪
擂台赛季
TOURNAMENT
🤝
羁绊线
BOND
月 7
羁绊萌芽
💰
联机 Tab
盟友系统
🌸
祝无双入伙
剧情解锁
🔗
羁绊加成
SYNERGY
月 8
擂台预热
📣
擂主竞猜
社区玩法
🎲
江湖氛围
支线
月 9
大日子逼近
🏛️
官府竞拍
DAY 270±
📜
旧账风波
SIDE QUEST
月 10
高潮迭起
⚔️
擂台决赛
主线高潮
🪙
双币经济
COIN/POINT
月 11
余波反思
📉
失败预警
ENDGAME
🎒
传承商店
跨周目
月 12
岁末收束
🎊
年终大戏
主线收尾
📚
周目总结
存档
成就墙
传承解锁
04

触发条件矩阵 EVENT TRIGGER MATRIX · 必填 · 选填 · 文案

以下是从 mainline-tournament.tsrole-*.tsside-*.ts 里盘点出的核心事件。每个事件都标上 必填前置(硬约束)选填加权重(软加权)

事件 ID 名称 系列 必填前置(required) 软加权(bonus)
martial_match_guo_guard 郭芙蓉临时守擂 擂台赛 requiredStaff: ['guo'] guo_lu_romance 阶段 friction +30%
martial_match_dazui_red_silk 李大嘴误挂红绸 擂台赛 requiredStaff: ['li'] 夜市客流高峰 +20%
martial_match_bai_old_debt 白展堂旧账擂台 擂台赛 requiredStaff: ['bai'] 治安 < 60 +30%
martial_match_xiucai_words 吕秀才文斗招亲 擂台赛 requiredStaff: ['lu'] 声望 ≥ 50 +25%
day_guo_front_door 郭芙蓉正门风波 角色线 A requiredStaff: ['guo']
day ≥ 18
羁绊 seed → 2.4 / friction → 3.4
bai_secret_old_friend 白展堂旧友重逢 角色线 B requiredStaff: ['bai']
day ≥ 20
羁绊 friction +30%
qian_refuge 钱掌柜托付 角色线 E requiredStaff: ['lu'] 羁绊 seed +20%
side-official 官差税务/查案 支线 A day ≥ 60 · 声望 ≥ 30 治安 ≤ 50 +20%
side-night-risk 夜间风险 支线 B requiredStaff: ['bai'] (白展堂在场才镇得住) 夜间时间窗 +50%
side-old-ledger 旧账风波 支线 D day ≥ 240 官府在场 +20%
迁移脚本建议:

用一个小脚本 tools/scripts/annotate-required-staff.cjs,扫所有 .ts 事件表,匹配标题/描述里的角色名("郭芙蓉"/"白展堂"/"李大嘴"/"吕秀才"/"佟湘玉"),自动写 requiredStaff,没匹配到的打 TODO。这样 1 小时能跑完 30+ 个事件。

05

Tab 重构:11 → 4 渐进式解锁 TAB REFACTOR · 主操作台 · 节奏感

把 11 个 Tab 拆成 「核心 4 个 + 收纳 7 个」。核心 4 个跟着玩家进度逐步解锁,其他 7 个收纳在 「更多 ▾」 抽屉里 + 进度条提示「X 天后开放」。

核心 4 Tab · 跟着玩家进度走

Tab解锁时机视觉处理
📒 账本DAY 1(默认)深朱砂 · 高亮
👩‍🍳 后厨DAY 1(默认,李大嘴已招募)深朱砂 · 高亮
👥 门客DAY 1(默认)深朱砂 · 高亮
📦 行囊DAY 4(首次掉落)DAY 4 后朱砂高亮

收纳 7 Tab · 「更多 ▾」抽屉

Tab解锁时机锁时文案
🥘 菜谱累计研发 2 道菜「完成 2 道菜研发后开放」
🏚️ 后院DAY 35 招募吕秀才后「李大嘴可劈柴 / 等他入伙」
🔨 设施DAY 70 招募郭芙蓉后「扩建需郭芙蓉」
🎒 行囊DAY 4 首次掉落「首次掉落开启」
⚔️ 闯荡DAY 140 招募白展堂后「江湖路险,等白少侠」
💰 竞拍DAY 270 官府竞拍开局「衙门大印盖下后开放」
🤝 联机DAY 210 开放盟友系统「客栈名号传开后可联机」
「预警 Tab」特殊处理:

预警不是「解锁就消失」,而是常驻红点。当玩家有任何未处理的失败预警,预警 Tab 在所有阶段都显示 🔴。但点进去的子页面是分阶段开放的:月 1-3 只显示「食安 + 卫生」一类;月 4+ 才有「治安 + 夜巡」;月 6+ 才有「江湖风险 + 擂台赛」。

06

引导体系:CoachMark + 揭幕仪式 ONBOARDING · 三层引导 · 不打断 · 有惊喜

① 揭幕仪式 Cinematic Unveil

大功能/角色/赛季首次上线,触发全屏华丽大卡(沿用「官府竞标」拍板的那套)。

  • 📜 卷轴式徐徐展开 0.4s
  • 🏮 角色立绘淡入 + 印章落下
  • 🎙 角色一句台词(白展堂:"葵花点穴手")
  • ✨ 朱砂 + 礼花粒子 1.2s
  • 👆 「开始 →」按钮进入

② CoachMark 气泡引导

不打断节奏的轻量引导,只在首次进入某 Tab 时显示一次。

  • 📍 指向当前最重要的按钮
  • 💬 角色口吻 + 拟人化("先把这道菜学了,再去管账")
  • ⏭ 可"跳过",但跳过会写入存档标记(不再骚扰)
  • 🎬 全程 ≤ 4 步,避免长引导疲劳

③ 进度条 + 提示 Progress Hint

锁住的 Tab 上挂"距解锁还有 X 天 / X 个条件",让玩家有期待感。

  • 🔒 灰度 60% + 锁 icon
  • 📊 进度条"再过 23 天" / "再招 1 人"
  • 💡 鼠标 hover → 解锁条件详情
  • 🎁 条件达到的瞬间自动展开为揭幕仪式
07

UI 草图:主操作台 / 移动端 / 解锁弹窗 UI MOCKUP · 拟物 · 朱砂金 · 降噪

DESKTOP · 主操作台(DAY 50 视角)

同福客栈 · 掌柜府第 · 已开张 50 日 DAY 50 · 月 2 · 街坊熟络期
📒 账本
👥 门客
👩‍🍳 后厨
🎒 行囊2
🥘 菜谱
🏚️ 后院
🔨 设施
⚔️ 闯荡
💰 竞拍
🤝 联机
⚠️ 预警1
更多 ▾
吕秀才 第 3 步 / 4
子曾经曰过——先把后厨开起来,等李大嘴入伙,后院 Tab 才会解锁。现在 街坊熟络期,目标:再招 1 人,稳在 60 日小结。
月 2 进度
62% ▸ 跳过
🎓 吕秀才 已入伙 ⏳ 等 🍳 李大嘴 🔒 后院 / 设施 锁定中

MOBILE · 同福掌中(DAY 8 视角)

同福客栈 · 第 8 日 月 1 · 适应期
📒
账本
👩‍🍳
后厨
👥
门客
🎒
行囊
🔒
🥘
菜谱
🔒
🏚️
后院
🔒
🔨
设施
🔒
⚔️
闯荡
🔒
佟掌柜 第 1 步 / 4
额滴神呀,先把账本理顺,看看今天收了多少铜钱。账本里的开销项,每一项都要看仔细。
新手
1/4

UNVEIL · 「招募揭幕」全屏大卡(沿用官府竞标拍板风格)

SAME FATE · 白少侠入伙
盗 圣 · 白 展 堂
"葵花点穴手!谁敢在同福客栈闹事?—— 往后巡夜保安、拦贼抓贼,我白展堂一个人就能搞定。"
🥋
🛡️ 治安 +30
⏱ 用餐 -15%
⚔️ 闯荡 解锁

HOVER · 锁住 Tab 的「为何锁 + 还差多少」

🏚️
后院
劈柴、挑水、杂物整理
🔒 LOCKED
解锁条件:招募 李大嘴(厨师)
当前进度:还差 1 人,预计 DAY 45 ± 5 解锁。
推荐操作:完成月 1 满月小结 → 触发街坊剧情 → 招募李大嘴。
距解锁
~30 日
08

实施清单:4 步走 · 4 天落地 IMPLEMENTATION PLAN · 优先级 · 工作量

P0
必做
① 事件前置条件硬约束 · 修穿帮剧情

GameEventrequiredStaff 字段;给 4 个擂台赛事件 + 角色线 + 关键支线补字段;selectWeightedGameEventisStaffRequirementSatisfied 硬性短路。

src/types.ts · src/components/RandomEventPopup.tsx · src/data/eventTables/selection.ts · 30+ 事件文件 · tools/scripts/annotate-required-staff.cjs
P1
重点
② Tab 渐进式解锁 · 11 → 4 + 抽屉

ConsoleTabsBar 拆核心 4 + 收纳 7;锁住 Tab 视觉降噪 + hover 提示;新增 tabUnlockConfig.ts 集中配置解锁条件。

src/components/ConsoleTabsBar.tsx · src/components/TabProgressHint.tsx (新) · src/data/tabUnlockConfig.ts (新)
P2
惊喜
③ 揭幕仪式 · 全屏大卡(沿用官府竞标拍板风格)

封装 CinematicUnveilModal,支持「招募 / 功能 / 赛季」三类揭幕;卷轴展开 + 印章 + 礼花 + 角色台词;触发节点:角色首次招募 / Tab 解锁 / 大事件开场。

src/components/CinematicUnveilModal.tsx (新) · src/components/ConfettiBurst.tsx (新) · src/data/unveilTriggers.ts (新)
P3
抛光
④ CoachMark 引导 + 引导进度条

OnboardingCoach.tsx 4 步引导(首登 / 招募首人 / 解锁首 Tab / 触发首剧情);跳过即存档标记;月进度条在主界面顶部 ribbon 下方常驻。

src/components/OnboardingCoach.tsx (新) · src/data/onboardingSteps.ts (新) · src/data/year1Plan.ts 增强
推荐落地节奏:

P0 + P1 一次性做完(约 1.5 天工作量),立刻解决"擂台赛穿帮"和"主界面信息爆炸"两个最痛的问题。
P2 + P3 作为新功能上线时的"首次彩蛋",可以跟着剧情任务逐个加,不用一次全做完。