🌻 设计文档小农场 · 野花笔记
← 全部文档/夜市/玩法

核心玩法

现行 #策划#核心玩法#规则#增量 docs/夜市/核心玩法.md
这份是什么

夜市的唯一规则源头。 改任何东西之前先读这一份。 一句话:小人从街那头走过来排队,你把吃的递过去,金币进袋。 赚到的钱拿去扩充食品种类和数量,让队伍一直排到街角。

数值全部来自 tools/sim/night.mjs 的实测,命令写在第五节和第八节,没有一个数是估的。

夜市摊位与排队的小人 · 概念稿
夜市摊位与排队的小人 · 概念稿

一、玩家眼前是什么#

竖屏。一条夜市街,右侧是你的摊位,摊上一个灶台、几口锅、一排灯笼。街上有人走来走去。

屏幕上一共只有三样东西:人、吃的、金币。

是什么 玩家对它做什么
队伍 摊位前排成一列的无脸圆脑袋小人,头顶冒气泡显示他想吃什么 点他 —— 递给他,他冒爱心、头顶弹金币、开心走掉
灶台 摊台上的一排灶口,每口灶绑一道菜,带进度环和待取的份数 点开可以升级、换菜、加灶
金币 右上角钱袋 花掉它,让上面两件事变大

小人的样子见美术风格:圆脑袋、没有五官、胶囊身体、两条短腿,可爱、好画、好动。

为什么必须是「无脸」

没有五官,情绪就只能靠动作表达——这恰好是最省素材、也最好看的一条路。 等待 = 轻轻左右晃;拿到吃的 = 蹦一下冒爱心;好奇 = 歪头; 被晾太久 = 原地坐下(不是生气,更不会走,见第三节铁律二)。 一张头、一张身体、两条腿、两条胳膊,六个零件就能演完所有情绪。

二、三条铁律#

跟小农场、野花笔记一样的口径,三条,新东西先过这三条:

  1. 零失败。 不存在"客人等太久跑了""食材坏了""今天亏本"。 队伍满了,后面来的人就只是街上的路人——他从头到尾就不属于你,走过不算损失。 贵客会一直站在摊位旁边等你,你不来他也不走。
  2. 不需要盯着屏幕。 这个游戏可以一直玩,但永远不必。 你离开了,摊子还在出餐、还在收钱(离线结算见第十节)。 想做任何东西之前先问一句:"它需要玩家盯着屏幕吗?" 需要 → 砍掉。
  3. 每次点击都必然成功。 点一位客人一定有反馈:有现成的食物就直接成交, 没有就当场把那口灶的火催旺(进度条往前跳一截)。没有"点错了"这回事。
第三条是刻意设计的,不是偷懒

老版本的诊断里写过一句"技巧空间 = 0:所有操作都是条件满足即成功"。 这里把它反过来用:既然做不出"做得好/做得差", 那就让每一次点击都爽——点下去一定推进、一定有数字、一定有声光。 手感靠"必然的反馈",不靠"可能失败的风险"。

三、核心循环#

        街上有人走过(人流量 λ)
                 │
                 ▼
        队伍里排着等你出餐的客人
                 │
       ┌─────────┴─────────┐
       │                   │
    灶自己出餐            你亲手递
   (产能 μ)           (这一单多收小费)
       │                   │
       └─────────┬─────────┘
                 ▼
              金币
                 │
     ┌───────────┼───────────┬──────────┐
     ▼           ▼           ▼          ▼
  加一口灶    雇一位店员   解锁新菜   升小费罐
   (产量)    (乘区)    (单价)   (手点收益)

一句话:产能够不够、单价高不高,是你唯一要操心的两件事。客流自己会追上来。

四、三条轨道(每条只管一件不同的事,不许重叠)#

轨道 玩家买什么 管什么 公式
灶(规模) 加一口灶、换一道菜 产能 μ μ = Σ(1/t_i) × 0.5 × (1 + 0.2×店员) × (在场 ? 1.3 : 1)
菜(单价) 解锁新菜、升级老菜 单价 p p_i = 基础价 × 1.16^等级 × 招牌倍率
人(跑腿) 雇店员、升小费罐 乘区 / 手点 见上、见第五节

收入/秒 = 成交率 × Σ(每道菜的产能占比 × 它的单价)

成交率 = min(λ, μ)          ← 客流和产能,谁小谁说了算

4.1 min(λ, μ) 就是本作的核心#

这条公式让瓶颈永远看得见,而且不用写在面板上:

你在屏幕上看到 说明 该做什么
队伍排到街角、还不断有人走过 λ > μ,产能不够 加灶、雇店员
摊位前空着、街上人也不多 λ < μ,客流不够 等几秒(口碑会涨上来),或者干脆去升级菜
队伍刚好在动、源源不断 两条都跟得上 继续攒钱
这是本作最值钱的一条设计

别的增量游戏要靠一句话提示玩家"你该升级了"。这里不用: 队伍的长度和大街上走过的人流,本身就是那块面板。 加产能够不够、还差多少,一眼就看出来。

4.2 为什么客流是自适应的#

口碑跟着生意走。 你服务得越多,名声越大,来的人越多:

λ 向 1.35 × 实际成交率 一阶收敛(时间常数 30 秒)

稳态只有唯一自洽解:λ = 1.35 × 成交率,而 成交率 = min(λ, μ), 所以只能是 成交率 = μ、λ = 1.35 μ。 也就是产能永远是瓶颈,队伍永远是满的。

这不是偷懒,是故意的。它带来三个好处:

  1. 玩家只需要管产能和单价——主界面概念从 4 个砍到 3 个,符合约定里"新东西要进主界面,先砍掉一个旧的"。
  2. 那条"永远排着队、永远有人从队尾走过来"的画面,就是夜市该有的样子。
  3. 加产能之后会有 约 30 秒的窗口:队伍被瞬间清空 → 街上的人继续涌进来 → 队伍又满了。 这个"清空再填满"的循环,是全局最强的正反馈。
第一版这里写错了,跑模拟器才发现

一开始把「名气」做成花钱买 +18%。结果 λ 指数爆炸到 228 人/秒,把模拟器跑死。 根因是刀刃失衡:λ 成为瓶颈时买名气给的是线性回报, 而它的涨价被其他轨道的收入增长抵消 → 回本时间恒定 → 无限正反馈。 这正是工程约定里记过的那种"调参救不了"的结构问题。 改成"口碑跟着生意走"之后,λ 再也不需要玩家管,也不可能失控。

五、手点:全程唯一的一个操作#

5.1 点谁、发生什么#

情况 点下去发生什么 玩家看到什么
这位客人要的菜有现成的 立刻成交,这一单多收小费 盘子飞过去、爱心跳出、金币飞进钱袋
这位客人要的菜还在做 当场把那口灶的进度催满 进度环"唰"地转满、冒一股热气、紧接着成交
队伍空了,街上有人 吆喝一声,拉一位路人进队 那位路人头上冒一个"?",然后拐进队伍

三种情况合起来仍然是一个操作(点),符合"一个小游戏只允许一种操作类型"的规矩。

5.2 为什么手点只给小费,不给额外产能#

手点不能凭空多出餐来——一口灶一个制作周期内只能被催满一次。 所以手点的上限 = 产能上限,它抢不走挂机轨的活。

于是:

收入
完全不点(离线) 成交率 × 单价
一直点(在线) 上面这一项 × (1 + 小费率),外加贵客

「一直点 ÷ 完全不点」必须收敛。 这是约定里那条刀刃平衡教训的直接移植: 点击给一个永久约 1.3~1.5 倍的注意力优势,不是无限优势。发散就说明点击变成必需品,设计就错了。

实测(--compare):同一摊子状态下,在场 ÷ 离场 = 1.30×; 算上小费和贵客,终局收入率之比 2.55×(含前面复利导致的摊子规模差异)。 早期数值、换算成时间口径,见数值实测。

六、贵客:让后期的手点依然值得#

后期产能大到每秒几百份,一次点击的小费占比会趋近于零。光靠小费,点击在中期就死了。

所以加贵客:

  • 每隔 90~150 秒来一位,站在摊位侧面(不占队伍位,所以不会堵住别人)
  • 头顶一个大大的金色标志,只有亲手递才卖给他——店员不搭理他
  • 一次给 ≈ 8 秒的产量,锚定当前收入,所以永远不会被稀释
  • 他不会走。 你三小时不来,他就在那儿站三小时

实测:贵客约占总收入 10%。也就是"想起来就点一下"≈ 多 10%, "完全不点"一点也不亏。

为什么贵客不给"限时"

限时就等于"你不来就亏",那是强迫,不是选择(见共用判断标准 4.3)。 站着不走反而是奖励:你随时回来,惊喜一直都在。

七、食品与配表#

20 道菜,7 个类别。每一档 p ×1.45、t +0.2 秒、解锁价 ×3。

菜 类别 单价 p 出餐 t 解锁价
烤肠 烧烤 6 1.6 开局自带
茶蛋 小吃 8 1.8 120
糖葫芦 甜 12 2.0 600
煎饼 主食 18 2.2 2.6 千
珍珠奶茶 饮 26 2.4 1.1 万
烤冷面 主食 38 2.6 4.8 万
炸鸡 荤 55 2.8 21 万
麻辣烫 主食 80 3.0 92 万
章鱼小丸子 小吃 115 3.2 400 万
关东煮 小吃 165 3.4 1800 万
烤鱿鱼 海鲜 240 3.6 7800 万
生蚝 海鲜 350 3.8 3.4 亿
小龙虾 海鲜 500 4.0 15 亿
蛋烘糕 甜 720 4.2 65 亿
羊肉串 烧烤 1040 4.4 280 亿
蟹粉生煎 主食 1500 4.6 1200 亿
柠檬茶 饮 2200 4.8 5400 亿
杨枝甘露 甜 3200 5.0 2.3 兆
佛跳墙 主食 4600 5.2 10 兆
龙虾粥 海鲜 6600 5.4 44 兆

7.1 越贵越慢,这是「扩充食品类型」真正的取舍#

p 涨,t 也涨。 单位时间产值 p/t 是递增的(3.75 → 1222), 所以上新菜永远有正收益;但新菜更慢,会吃掉产能。

于是"我该上哪道菜"变成了一个真决策:

打法 适合
全上快的便宜菜 产能足、客流猛的时候,靠数量堆
全上慢的贵菜 产能吃紧时反而亏,因为 min(λ, μ) 被 μ 卡住
混搭 + 凑招牌 大多数时候的最优解

7.2 「扩充数量」= 同一道菜占多口灶#

摊上可以同时摆 3 口烤肠灶,这一道菜的单位时间产值就翻三倍, 而且直接触发「五连灶」招牌(见 7.3)。

7.3 招牌组合:扩充菜单的第二个动机#

摊上同时满足条件时,给一个乘区。每一道菜都能进多条招牌。

招牌 条件 效果
冰火两重天 烧烤 + 饮 两者 p ×1.25
甜咸配 甜 + 小吃 甜 p ×1.3
主食搭档 两类主食 主食 p ×1.2
海陆双拼 海鲜 + 荤 两者 p ×1.3
夜市全席 七类各至少一种 全体 p ×1.6
五连灶 同一道菜占 ≥3 口灶 该菜 p ×1.5

八、花钱的地方#

买什么 效果 起始价 每次涨价
加一口灶 产量 +1 口(摆现有菜里 p/t 最高的那道) 120 ×1.45
解锁新菜 上新菜,自带够用的灶(见下) 见第七节表 固定价
升级菜 该菜 p ×1.16、t ×0.97(最快 0.5 秒) 90 ×1.50
雇店员 全体灶产能 ×(1 + 0.2×店员数) 300 ×1.55
升小费罐 小费率 +0.05(上限 +1.00) 900 ×1.55
新菜一定要「自带够用的灶」

模拟器里踩过:均匀点单时,新解锁的菜只配一口灶,却要分走一份客流, 那口灶供不上 → 点它的客人永远卡在队首 → 队伍被整条堵死。 实测 λ 从 26.7 塌到 4.15,产能还有 39 却卖不动。

两条一起修才对:① 客人按产能加权点单(需求 ∝ 供给); ② 解锁新菜时按 0.5 份/秒 的产能给它配灶。 单独修哪一条都还剩一半的问题。

没有"补货""库存""食材会坏"这回事。 那是被砍掉的一类东西: 需要回来管的,一律不做。

九、抽卡与商业化(只是福利,不进核心数值)#

定位

抽卡不是主要内容。它在核心循环之外,只提供两类东西: 好看和方便。抽不到任何东西,你一样能把摊子开下去。

9.1 卡池#

池子 内容 有没有数值
摊车外观 推车、灶台、招牌布、灯笼样式 无
小人的衣服 路人身上那套配色和头饰,抽到就进随机池 无
贵客造型 贵客头上的标志和打扮 无
今日天象 当晚 λ 或 p +30% 有,但当晚失效
  • 来源:每日免费 1 抽(打开就送)+ 看广告 1 抽 + 里程碑送抽
  • 重复的转成「夜明珠」,攒够可以指定兑换一个外观——不做纯随机
  • 不卖数值强度。 一张都抽不到,摊子该怎么开就怎么开

9.2 收费点#

收费点 形式 硬性约束
外观直购 内购 只卖"好看",不卖加成
去广告 内购 —
离线时长提升 内购 不买也有 8 小时,买了是 24 小时
看广告 ×2 离线收益 激励视频 不看也有 1×,不亏
商业化唯一的一条红线

"不看这个广告,我会不会觉得亏?" 会 → 这是强迫,不是选择 → 砍掉。 所以所有广告位都必须"默认那份本来就在"。把 ×2 做成 ×0 或者 1,就是把福利做成税。

十、离线与挂机#

  • 离线时店员照常出餐,但队伍不积累(人不会在你摊前站一晚上)
  • 离线按稳态收入率结算:离场产能 × 单价
  • 上限 8 小时(可在商店提到 24 小时),超出部分直接丢弃
  • 回来时给一个"收摊钱袋"弹窗,金币一次性飞进来

离线不欠账: 不设"补货""清洁""人气衰减"这类回来必须清的账。 关掉就关掉,回来接着排。

十一、开局 5 分钟(这块是设计出来的,不是自然长出来的)#

时间 屏幕上发生什么 玩家做什么
0:00 空街、暗灯笼、你的小摊。3 秒后街那头走来第一个小人 看
0:06 他站到摊前,头顶冒一个烤串气泡 点他 → 递出烤串 → 爱心 + 金币
0:20 又来了两位。摊位前第一次有两个人排队 连点两下
0:30 攒够钱,第 2 口灶 的按钮开始发光 加灶
1:00 茶蛋解锁,队伍里开始出现想吃茶蛋的小人 点新菜
3:20 攒够 300,第一位店员上岗,灶台开始自己转 松手试试
5:00 三道菜、八口灶、三位店员,队伍稳定在五六个人 可以关掉了

实测(--policy active):5 分钟时收入约 38/秒、8 口灶、3 位店员; 30 分钟 8 道菜、34 口灶,收入 2.1 万/秒。

第一分钟最重要的不是收入,是「他笑了」

开局那一下必须有表情——爱心、小跳、金币飞进钱袋的声音。 玩家前 60 秒记住的不是 +6 金币,是"我递给他,他开心了"。

十二、界面分区#

沿用旧项目的字母代号习惯,竖屏自上而下五块:

代号 名称 内容
H 资源栏 金币、当前收入/秒、摊子阶段
SC 街景 夜空 + 灯笼 + 街 + 摊位 + 排队的小人 + 街上的路人 + 贵客
K 灶台 一排灶口:菜图标 / 进度环 / 待取份数
B 菜单条 已解锁的菜,点开升级;未解锁的显示"还差 X"
T 页签栏 菜单 / 扩充 / 图鉴 / 商店

主界面只有三样东西(人、吃的、金币)。店员、排队位、招牌这些统统收进页签里。

十三、已经被砍掉、不许加回来的#

砍掉 为什么
补货 / 库存 / 食材会坏 要回来管
客人等太久会生气跑掉 制造焦虑,违反铁律一
限时贵客 "不来就亏" = 强迫
体力 / 门票 / 冷却 违反铁律二
排行榜 / 好友比数值 会把"看"变成"冲"
花钱买名气 / 花钱买客流 刀刃失衡,试过了,λ 会指数爆炸
排队位作为升级项 稳态下队伍永远是满的,加位子没有任何数值意义
12 档业态晋升 / 考核 老版本那套太沉;现在用"摊子换名字"做轻量替代

十四、复现本文所有数字#

node tools/sim/night.mjs --hours 1  --policy active --trace   # 开局到一小时的时间线
node tools/sim/night.mjs --hours 24 --policy active --trace   # 二十四小时的曲线
node tools/sim/night.mjs --compare --hours 4 --runs 3         # 松手判据(三口径对照)

实测数据、踩过的坑、以及每一条结论对应的证据,都记在数值实测。 改任何配表之后先跑一遍这个脚本,别凭感觉调。