№ · 玩法设计 CH.07.31
主页 · 🎲 玩法设计 · 客栈经济循环体系 v1.0

客栈经济循环体系 v1.0

📅 2026-07-31 · 📦 19.5 KB · 🎲 玩法设计 · 📝 MD 文档 🆕 14d 🏷️ 终局🏷️ 拍卖🏷️ 时间🏷️ 员工🏷️ 经济🏷️ 玩法设计

整理时间:2026-07-31 14:15 +08:00 整理人:Mavis(PM 视角) truth source 对齐:

  • docs/design/active/产品需求总览-v1.md(2026-07-01)
  • src/data/economy/catalog.ts(2026-06-24 baseline-only)
  • src/data/nightmarket/ + src/utils/nightmarket/ + src/components/nightmarket/(已建三层,夜市参考模板)
  • AGENTS.md 三层架构守则(2026-06-29)
  • docs/design/active/主厅总览页精简方案-v1.md(白天经营总览)
  • docs/design/active/后院玩法补全方案-v1.md(食材/后院供给侧)

本文档作用:把"白天 / 晚上"两条经济线 + 横切消耗,收成一张可施工的产品视角骨架;替代单模块设计文档,提供 consolidated 视角 + 实施切片入口。


0. PM TL;DR(90 秒读完)

  • 核心循环:单日 = 白天经营 + 晚上夜宵 + 夜间简报 → 睡眠;单周目 = 经营爬坡 + 终局收束;多周目 = 阅历折算 + 传承商店
  • 三币种已设计(铜钱 / 关中银票 / 江湖阅历),data/economy/catalog.tsbaseline-only——运行时循环未串,这是当前最大缺口。
  • 白天经济 = 大堂(堂食/住房) + 后厨(出餐/宴席/酒水) + 经营玩法(竞标/拍卖/押注/任务)。
  • 晚上经济 = 夜市(已建,参考模板) + 闯荡(已有,白天也开) + 住店(嵌在 InnManagementTab,待抽)。
  • 横切消耗 = 食材流 / 员工体力 / 客诉口碑 / 时间节律(凌晨维护、巡防、打烊)。
  • 当前阻塞点:economy/ 没有"循环/loop"层,只有"基线/baseline"层 → 需要抽 data/economy/loops/ + utils/economy/loopEngine.ts 串运行时。
  • 本档不重复的内容:货币体系与数值体系表格初步建表.md主厅总览页精简方案-v1.md后院玩法补全方案-v1.md——本档只做"循环骨架"层。

1. 设计原则(继承,不再讨论)

1.1 三层分离(AGENTS.md §1)

| 层 | 经济域目录 | 内容 | | :-: | :--- | :--- | | 数据 | src/data/economy/loops/ | 循环定义、节点表、收支关系(只 type + const) | | 逻辑 | src/utils/economy/loopEngine.ts | 结算、调拨、压力线、阻尼 | | UI | src/components/economy/ | 流向图、回放、调参面板 |

禁止:data/economy/loops/ 里写函数;utils/economy/loopEngine.ts 里写 ECONOMY_CURRENCIES 这种常量。

1.2 baseline-only 现状认知

data/economy/catalog.ts 自标 runtimeImpact: 'baseline-only',只供口径引用,不通运行时。本档要做的"循环"层是运行时层,与 baseline 是上下游关系:

baseline(catalog.ts)  →  loops  ←  runtime 调度(App.tsx / useInnSimulationController)
         口径定义          流转规则        调用方

baseline 不会被替换,只会被 loops 引用。

1.3 单日节律(产品需求总览 §1.2)

[ 单日循环 ]
客栈开盘 → 伙计排班 → 接待客人 → 随机事件 → 客栈打烊 → 江湖简报
        ↑                                ↓
        └──── 夜间消耗(清洁/治安/休息)───┘

经济循环嵌在这条节律上,每一拍都有"流入 / 流出"事件。


2. 经济循环全景(三圈)

2.1 单日循环

flowchart LR
    subgraph DAY["☀️ 白天 · 09:00-19:00"]
        D1[大堂<br/>堂食 + 住房] -->|铜钱 +| Wallet
        D2[后厨<br/>出餐 + 宴席] -->|铜钱 +| Wallet
        D3[经营玩法<br/>竞标/拍卖/押注] -->|铜钱 ± 银票 ±| Wallet
    end

    subgraph NIGHT["🌙 晚上 · 19:00-01:00"]
        N1[夜市摆摊] -->|铜钱 +| Wallet
        N2[闯荡/野外] -->|素材 + 银票 ±| Wallet
        N3[住店] -->|铜钱 +| Wallet
    end

    subgraph RESET["🌃 凌晨 · 01:00-09:00"]
        R1[清洁维护] -->|员工体力 -| Mood
        R2[巡防] -->|员工体力 -| Safety
        R3[食材采购] -->|铜钱 -| Stock
        R4[工资结算] -->|铜钱 -| Wallet
    end

    Wallet[铜钱包] --> Stock[食材库存]
    Stock --> D2
    Stock --> N1
    Wallet --> D3
    Wallet --> R3
    Wallet --> R4

关键观察:

  • 铜钱是主循环货币,贯穿全日;关中银票只在大额玩法(竞标/稀有)出现;阅历不进入单日,只在终局结算。
  • 食材是从铜钱派生出的"二次资源",在白天消耗、夜宵消化库存
  • 凌晨不是空的,是消耗最集中的时段(工资、采购、维护)。

2.2 单周目循环(90-360 天)

Day 1-30   启航期:客流少,大堂为主,夜市尝鲜
Day 31-90  爬坡期:经营玩法解锁(竞标/拍卖),开始有出有进
Day 91-180 磨合期:宴席/江湖事密集,客诉事件增多,口碑双刃剑
Day 181-300 鼎盛期:擂台/比武,银票大进大出,口碑决定上限
Day 301-360 收束期:年终大事件 → 终局判定 → 阅历折算

每个阶段都有典型经济特征,数值上要分层(详见 §6 资源表)。

2.3 多周目循环

终局结算 → 阅历折算(边际递减) → 传承商店 → 下局开局加成
                                       ↓
                                  永久 Buff

阅历不能反向买回铜钱当周目用(否则刷钱);只允许前置传承 + 后置返利两个方向(参考 ECONOMY_LEGACY_REDEMPTION_BANDS 三段递减)。


3. 白天经济(主收入)

3.1 大堂(堂食 + 住房登记)

| 项 | 类型 | 来源 | 消耗 | 备注 | | :-: | :-: | :--- | :--- | :--- | | 堂食点菜 | 收入(微-中) | 客单价 × 客流 | 食材 + 后厨排班 | 口碑正反馈,熟客加成 | | 客房登记 | 收入(中-大) | 房价 × 入住率 | 清洁 + 房契维护 | 入住即收 vs 退房才结(待决 §8.4) | | 寄存服务 | 收入(微) | 寄存费 | 库容 | 微薄,主要做钩子 |

关键代码锚点:InnManagementTab.tsx + MainHallPanel.tsx + PatronsPanel.tsx(客流/口碑)。

3.2 后厨(出餐 + 宴席 + 酒水)

| 项 | 类型 | 来源 | 消耗 | 备注 | | :-: | :-: | :--- | :--- | :--- | | 常规出餐 | 收入(小-正餐档) | 菜谱价 × 出餐量 | 食材 + 厨师体力 | 跟大堂强耦合 | | 宴席 | 收入(宴席档) | 桌价 × 桌数 | 食材 × 3 + 全员体力 + 酒水 | 高客单、高消耗、高口碑 | | 酒水零售 | 收入(便饭-正餐) | 酒价 × 杯/壶 | 酿造原料 + 库容 | 跟 BrewingBoard 联 | | 外卖/外送 | 收入(正餐) | 订单价 | 食材 + 派送员工 | 当前没实现,预留口 |

关键代码锚点:KitchenTab.tsx + RecipeTab.tsx + BrewingBoard.tsx + BanquetPanel.tsx

3.3 经营玩法(竞标/拍卖/押注/任务)

| 玩法 | 投入 | 收入 | 风险 | 备注 | | :-: | :--- | :--- | :-: | :--- | | 官府竞标 | 银票 | 道具/银两 | 中 | auction/,已建三层 | | 拍卖会 | 铜钱 | 稀有道具 | 中 | 已有,关联联机 | | 七侠骰坊 | 铜钱 | 铜钱(倍率) | 高 | arcade/,小游戏集群 | | 武林擂台 | 银票 + 体力 | 名声 + 银票 | 高 | TournamentDuelScene | | 商路 | 食材 + 铜钱 | 食材(异域) | 中 | TradeRoutePanel | | 江湖事任务 | 时间 | 银票 + 羁绊 | 低-中 | JianghuAffairsTab |

关键代码锚点:components/auction/components/arcade/components/traderoute/components/jianghu/JianghuAffairsTab.tsx

经营玩法共通问题(见 §8.2):用铜钱还是银票?用体力还是时间? 这是经济循环的关键参数。


4. 晚上经济

4.1 夜市摆摊(已建,参考模板)

完整流程(参照 NightMarketPanel.tsx):

选摊位(dock/temple/street) → 选定价(fair/peak/gouge)
                         ↓
选菜单(≤3 道) → 派伙计(单选) → 出摊结算
                         ↓
                   铜钱 + 熟客好感 +

消耗:熟食库存(cookedFood) + 员工晚班体力 + 摊位维护费(轻) 收入:铜钱 + 顾客群好感(merchant/escort/scholar/constable/jianghu) 关键文件:

  • data/nightmarket/(摊位/定价配置)
  • utils/nightmarket/nightMarketLogic.ts(结算)
  • components/nightmarket/NightMarketPanel.tsx(UI)

经济地位:夜市是消库存 + 赚铜钱 + 攒口碑的三合一场景,不能拆。

4.2 闯荡 / 野外 / 采集

| 子玩法 | 投入 | 收入 | 备注 | | :-: | :--- | :--- | :--- | | 闯荡主程 | 体力 + 干粮 + 装备 | 素材 + 偶发银票 | AdventureTab.tsx | | 野外采集 | 体力 | 药材/食材 | WildernessBoard.tsx | | 采集 | 体力 | 食材 + 素材 | GatheringBoard.tsx | | 悬赏/委托 | 时间 | 银票 + 羁绊 | JianghuAffairsTab 子分支 |

关键问题:闯荡是否消耗员工(派伙计外出)还是仅玩家?目前是玩家,待与 staffDepth 派工模型对齐。

4.3 住店

当前状态:嵌在 InnManagementTab.tsx,不是独立 Tab

| 待决问题 | 候选方案 | 倾向 | | :-: | :--- | :---: | | 入住即收 vs 退房才结 | 退房才结(更经营感) | ✅ | | 房费定价 | 客房等级 × 入住天数 | ✅ | | 住客与堂食客分流 | 同客流模型(Patrons) | ✅ | | 晚间住店是"经营"还是"过夜事件" | 经营(纳入经济循环) | ✅ |

详见 §8.4。


5. 横切消耗(经济循环的"血液")

横切消耗不单独产生收入,但所有收入场景都吃。漏掉任何一个,经济都会爆。

5.1 食材流(从采购到消耗)

采购(SupplyMarket) → 库存(Stock) → 后厨出餐
                ↓                       ↓
              腐烂衰减            宴席(×3)
                ↓                       ↓
              报损              夜市摆摊(消库存)

核心约束:食材不过夜会腐(已经在 cleanliness 维度的 crisis 里有耦合,需要单独抽 foodSpoilage 引擎)。

5.2 员工体力流

日班(大堂 + 后厨) ──→ 疲劳 ──→ 晚班可选(夜市 + 闯荡派工) ──→ 夜间休息
       ↓                    ↓                    ↓
    mood 衰减           mood 加速衰减        mood 恢复
       ↓
    mood < 40 触发罢工 / 离岗

关键文件:utils/staffDepth.ts + data/staff/depthDefaults.ts + data/staff/depthRules.ts

5.3 客诉与口碑流

服务质量(出餐 + 清洁 + 治安) → 口碑(reputation) ±
       ↓
  口碑 < 100 → 客流减少(经济反噬)
  口碑 < 10  → 黑名单 / 官差上门(终局风险)
       ↓
  口碑 100+ → 贵客增加(经济正反馈)

关键文件:data/economy/catalog.tsreputation 维度 + PatronsPanel.tsx

5.4 时间节律

| 时段 | 主调 | 关键事件 | | :-: | :-: | :--- | | 05:00-09:00 | 维护 | 采购、工资结算、食材补货 | | 09:00-13:00 | 早场 | 堂食 + 后厨出餐 | | 13:00-17:00 | 下午场 | 经营玩法(竞标/拍卖/任务) + 宴席筹备 | | 17:00-19:00 | 晚场 | 晚堂食 + 客诉高峰 | | 19:00-23:00 | 夜市 | 摆摊 + 闯荡 | | 23:00-01:00 | 打烊 | 收摊 + 简报 + 巡防 | | 01:00-05:00 | 凌晨 | 清洁 + 维护 + 离线收益 |

关键文件:utils/gameTime.ts + data/year1Plan.ts


6. 资源 / 币种 / 价格档对照

6.1 三币种分工(已设计,本档强化)

| 币种 | 作用域 | 典型场景 | 收支节奏 | | :-: | :-: | :--- | :--- | | 铜钱 | run | 堂食/宴席/经营玩法/夜市/采购/工资/罚款 | 高频(每时辰) | | 关中银票 | run | 官府竞标/稀有羁绊/大额赔付/武林重注 | 低频(每周目几次) | | 江湖阅历 | account | 终局折算/成就解锁/传承商店 | 终局一次 |

PM 建议(见 §8.2):

  • 铜钱 ↔ 银票不能自由兑换(否则失去"大额"语义)
  • 阅历不能反向刷(仅允许传承 + 永久 Buff,参考 ECONOMY_LEGACY_REDEMPTION_BANDS 递减)

6.2 四经营维度(已有 baseline)

| 维度 | 当前值 | 阈值 | 触发事件 | | :-: | :-: | :-: | :--- | | 名声 | 50 | < 100 关注 / < 10 危机 | 客流 / 贵客 / 黑名单 | | 清洁 | 80 | < 40 关注 / < 30 危机 | 卫生危机 / 客诉 | | 治安 | 70 | < 40 关注 / < 30 危机 | 偷窃 / 斗殴 / 官差 | | 心情 | 80 | < 40 关注 / < 30 危机 | 罢工 / 离岗 / 羁绊断裂 |

:reputation 当前 naturalDelta: { amount: 0 },没有自动衰减——这是设计空白,待补(口碑应该缓慢衰减,否则数值会"通胀")。

6.3 六价格档 × 五现金流档

价格档(ECONOMY_PRICE_TIERS)决定单笔订单的金额,现金流档(ECONOMY_CASHFLOW_BANDS)决定当日累计的吞吐量

两者的关系:

  • 一次宴席是"正餐档 × 1 笔" + "宴席档 × 多次"
  • 当日净收入 = Σ(各档单笔 × 笔数) - 经营消耗
  • 压力线(通胀)对标的是当日净收入而非单笔

6.4 食材 / 体力 / 时间的"非货币资源"

| 资源 | 单位 | 上限 | 衰减 | 关键场景 | | :-: | :-: | :-: | :-: | :--- | | 食材 | 单位/库存 | 库容 | 腐烂/消耗 | 后厨 / 宴席 / 夜市 | | 体力 | 0-100/员工 | 单员工 100 | 班次消耗 / 休息恢复 | 大堂 / 后厨 / 闯荡 | | 时间 | 时辰 | 每日 12 时辰 | 自然流逝 | 经营玩法 / 维护 |

这些"非货币资源"在循环里地位等同货币,必须有独立的循环引擎(不要塞进铜钱循环里)。


7. 模块清单

7.1 已有(代码已落,继续)

| 模块 | 数据层 | 逻辑层 | UI 层 | 状态 | | :-: | :--- | :--- | :--- | :-: | | 货币/数值基线 | ✅ data/economy/ | ❌(baseline-only) | — | 🟡 待接 runtime | | 员工工资 | ✅ staffExpenseTables | ❌ | — | 🟡 待接 | | 大堂 | 散 | 散 | MainHallPanel | ✅ | | 后厨 | 散 | 散 | KitchenTab | ✅ | | 经营玩法(竞标) | ✅ data/auction/ | ✅ auctionRules.ts | ✅ auction/ | ✅ | | 经营玩法(拍卖) | ✅ data/auction/ | ✅ | ✅ | ✅ | | 经营玩法(小游戏) | 散 | 散 | arcade/ | 🟡 | | 闯荡 | ✅ data/adventure/ | 部分 | AdventureTab | 🟡 hotfix 中 | | 夜市 | ✅ data/nightmarket/ | ✅ nightMarketLogic | ✅ NightMarketPanel | ✅ 模板 | | 住店 | — | — | 嵌在 InnManagementTab | 📋 待抽 | | 后院(食材供给) | 散 | 散 | BackyardTab | ✅ |

7.2 待建(本档目标)

| 模块 | 数据层 | 逻辑层 | UI 层 | 优先级 | | :-: | :--- | :--- | :--- | :-: | | 经济循环引擎 | 📋 data/economy/loops/ | 📋 utils/economy/loopEngine.ts | 📋 components/economy/FlowDiagram.tsx | P0 | | 夜宵/晚班派工 | — | 📋 utils/staffNightShift.ts | — | P0 | | 食材腐烂引擎 | — | 📋 utils/foodSpoilage.ts | — | P1 | | 口碑衰减 | 📋 data/economy/loops/reputation.ts | 同上 | — | P1 | | 住店独立 Tab | 📋 data/inn/stay/ | 📋 utils/inn/stayLogic.ts | 📋 components/inn/StayTab.tsx | P2 | | 经营玩法币种统一 | — | 📋 utils/economy/playCost.ts | — | P1 |

7.3 baseline → runtime 迁移路径

Step 1  抽 data/economy/loops/(只放 type + const 节点表)
Step 2  抽 utils/economy/loopEngine.ts(只放结算 + 调拨 + 压力线)
Step 3  App.tsx / useInnSimulationController 接入 loopEngine
Step 4  各模块(夜市/拍卖/闯荡)用 loopEngine 替代各自的收支计算
Step 5  验证:经济基线表不动,只引用

约束:ECONOMY_CURRENCIES / OPERATING_DIMENSIONS / PRESSURE_LINES 三个数组不挪动位置,只新增 loops/ 子目录。


8. PM 待决 4 题(给建议,等 P1 拍板)

8.1 夜宵 / 住店定位

P1 原题:夜宵/住店是"独立收入线"还是"大堂经济的延伸"?

PM 建议:都是独立收入线,但与白天经济共享基础设施

  • 独立:有独立的 UI Tab / 派工模型 / 收支节奏
  • 共享:客流模型(Patrons)、员工池(staffDepth)、食材库存(Stock)
  • 数据层建议:夜宵走 data/nightmarket/(已建),住店新建 data/inn/stay/
  • UI 层建议:住店从 InnManagementTab 拆出,与 NightMarketPanel 平级

8.2 经营玩法币种

P1 原题:经营玩法的"投入"用什么计价?

PM 建议:按风险分层,不统一

  • 低风险(七侠骰坊、商路):铜钱,小进小出
  • 中风险(江湖事任务、悬赏):银票,中等额度
  • 高风险(官府竞标、武林擂台、拍卖):银票 + 体力(双押)
  • 统一抽象:用 utils/economy/playCost.ts 暴露 computePlayCost(play, scale) 接口,内部按玩法表决定
  • 不引入"精力/气运"虚拟币(避免第四币种导致体系膨胀)

8.3 员工晚班调度

P1 原题:员工晚班是"派工"还是"自愿"?

PM 建议:派工制 + 心情制,双约束

  • 派工制:玩家主动分配,但受 mood 维度影响
  • 心情制:心情 < 60 不接晚班,心情 < 40 直接罢工
  • 体力制:派工需扣 体力,体力 < 30 拒绝出摊/闯荡
  • 派工逻辑入口:统一在 utils/staffNightShift.ts,夜市 + 闯荡 + 住店都从这一个口子走
  • UI:派工按钮在 InnStatusCardStaffStatusCard(已存在,加挂载点)

8.4 住店独立 Tab

P1 原题:"住店"现在算完整经济场景还是只算"过夜事件"?

PM 建议:独立经济场景,Tab 化

  • 场景地位:与 NightMarketPanel 平级,纳入晚上经济
  • 数据层:新建 data/inn/stay/,三层分离
  • 关键字段:房型 / 房价 / 入住率 / 续住率 / 住客评价
  • 经济循环:退房才结(更经营感);按"房价 × 入住天数 × 续住加成"结算
  • 抽离路径:从 InnManagementTab 抽出"客房"分支,新建 components/inn/StayTab.tsx

9. 实施切片(下一步动作)

按依赖顺序,4 个切片串完整个经济循环:

切片 1:经济循环引擎(经济域 P0)

  • 目标:data/economy/loops/ + utils/economy/loopEngine.ts 上线
  • 入口:App.tsx / useInnSimulationController.tsloopEngine.tick()
  • 范围:
    • 节点表:DayLoop / NightLoop / DawnLoop
    • 调拨:大堂/后厨/夜市的收入统一过 loopEngine
    • 压力线:接 baseline 的 4 条
  • 不做:不重构 baseline,不重写各模块收支
  • 预估:中等切片,1 个 lane 跑通

切片 2:晚班派工模型(员工域 P0)

  • 目标:utils/staffNightShift.ts + 接入夜市 / 住店 / 闯荡
  • 入口:夜市的"派伙计"按钮改用 assignNightShift()
  • 范围:派工校验 + 心情/体力约束
  • 不做:不改 staffDepth 现有派工逻辑,只在晚班场景叠加

切片 3:横切消耗引擎(资源域 P1)

  • 目标:utils/foodSpoilage.ts + 口碑衰减
  • 入口:凌晨维护 tick
  • 范围:
    • 食材腐烂:每晚衰减
    • 口碑衰减:naturalDelta 补 0 → -1/天
    • 客诉流:接 PatronsPanel 反馈
  • 不做:不重做库存系统,只在现有库存上叠腐烂标记

切片 4:住店独立化(场景域 P2)

  • 目标:data/inn/stay/ + components/inn/StayTab.tsx + 从 InnManagementTab 抽出
  • 入口:ConsoleTabsBar.tsx 加新 Tab
  • 范围:三档房型 + 入住/退房 + 住客评价
  • 不做:不接羁绊,只走经济循环

10. 关联文档

| 主题 | 文档 | | :--- | :--- | | 产品总览 | 产品需求总览-v1.md | | 货币基线 | 货币体系与数值体系表格初步建表.md | | 白天总览 | 主厅总览页精简方案-v1.md | | 后院供给 | 后院玩法补全方案-v1.md | | 夜市(模板) | 夜市外摆设计稿 + data/nightmarket/ | | 闯荡 | 闯荡玩法介绍.html + 闯荡玩法未完成功能清单-v1.md | | 官府竞标 | government-warehouse-auction-v1.md + data/auction/ | | 联机 | 联机P2P房间骨架-v1.md | | 三层守则 | AGENTS.md §1 |


11. 文档状态

  • v1.0 初稿(2026-07-31):Mavis 起草
  • 未决项:§8 四个 PM 建议等 P1 拍板
  • 后续版本:
    • v1.1:切片 1-2 跑通后,补运行时截图 + 数值压力测试
    • v1.2:切片 3 完成后,补横切消耗曲线
    • v1.3:切片 4 完成后,补住店经济沙盘