research(hunt-sim): 10 人并发在线模拟×多 agent 设计迭代——研究设施与全套档案
研究命题(00-plan):验证并打磨《围猎》联机纯音频体验——不是逻辑能跑通, 而是真人玩起来是什么体验、愿不愿意再来一局。 设施 web/harness/hunt-sim/(可复用,零依赖): - arena.mjs 编排器:起真实服务器(随机端口+临时数据目录隔离),10 个拟人客户端 经真实 WS 同时在线,错峰组队、真实时长对局、局间状态跨轮维护 - sim-client.mjs:game.js 行为移植(协议+手势路由+R1-R8 音频调度逐字节对齐), 产出「玩家耳朵听到什么」的感知时间线(语音全文/loop 方位音量档/喊话/震动) - brain.mjs:人设大脑——察觉延迟/前后判读(以真值为条件的正确率模型)/掩蔽放大/ 冷却乱滑/技能囤积/呼喊倾向/分心断网,全部随机判定用按实体 id 哈希的独立抽签 (mulberry32 流会被刷怪座位轮转结构带偏,实测造成系统性镜像反转,已证伪) - recorder.mjs:每人每局 events.jsonl 全量 + percept.md 感知转写 + 对局速览 研究档案 research/hunt-sim/: - players/:10 人配置(LLM 亲笔)+策略自述+逐局去留决策+人设终评+退游者重访 - rounds/:v1 三轮(R0 教学+R1/R2 真人快速)+ v2 复测两轮,共 48 局全记录 - analysis/01-04:数值曲线/音频信息设计/协作社交/上手留存四视角报告 - synthesis.md(S1-S9 裁定)、metrics.md/metrics-v2.md(两版对比总账)、report.md(总报告) v1 核心发现:10 人 3 轮 28 局 100% 胜率 26S/营地零损耗;击杀垄断(专家单人 30/39); 呼喊 3 次/28 局应答 0;N/S 前后判读仅 63/69% 可命中;四种退游死因 (失衡/社交真空/交互摩擦/观光无聊)→ 详见 report.md
This commit is contained in:
@@ -0,0 +1,340 @@
|
||||
# 01 · 数值与公平性分析(Q1 难度曲线 / Q7 天花板)
|
||||
|
||||
> 分析视角:数值曲线 + 击杀经济 + 评级 + 匹配公平。数据源:28 局对局档案
|
||||
> (`rounds/*/matches/room-*.match.json`)、`metrics.md`、`players/P01|P05|P07.review.md`、
|
||||
> 对照基准 `web/server/test/hunt-balance-scan.mjs`(本次实跑 24 seeds,输出见 §0)。
|
||||
> 代码口径:`web/server/hunt-room.js`(WAVE_TABLE / BOT_TUNING_DEFAULT / gradeFor /
|
||||
> ATTACK_CD_MS / MELEE_ETA / LAYOUTS)、`web/hunt/game.js`(killBandId / 进度 best)。
|
||||
|
||||
## 0. 对照基准实跑(2026-09-18,默认参数)
|
||||
|
||||
```
|
||||
[idle 真人挂机,2 bot 独守] 胜 18/24,mean dur 3.3(负/≤3 命中 17/24;A1 B6 C11)
|
||||
[bot 3 bot 水准局] 胜 24/24,mean dur 7.5(6-9 命中 17/24;S8 A10 B5 C1)
|
||||
[optimal 人类上限参考] 胜 24/24,dur=10 ×23 / 9 ×1 → S×24
|
||||
```
|
||||
|
||||
**关键读数**:扫描的三档全部是 **1 真人 + 2 bot(3 座单人房)**;不存在 4 人档、
|
||||
不存在混合水平档。而实测翻车的恰是 3-4 真人房。**扫描口径本身是本次失衡的盲区**
|
||||
(详见发现 1.4)。
|
||||
|
||||
另一处账目勘误:`metrics.md` 称"6 局真人快速局",房间档案实为 **5 房 / 18 人次**
|
||||
(R1: JBP5/NTGV/P5CA = 4+4+2 人;R2: 3TJY/94FQ = 4+4 人)。「快速局零损耗」结论本身成立。
|
||||
|
||||
---
|
||||
|
||||
## 1. 发现一:难度曲线失效——根因是「波次输出被团队吞吐淹没」,不是 bot 强度
|
||||
|
||||
### 1.1 现象(数据)
|
||||
|
||||
- 28 局 28 胜(胜率 100%),评级 **S×26 / A×1 / B×1 / C×0**(`metrics.md` 总账)。
|
||||
- **5 个快速房 breaches 全部为空数组**,营地耐久终值恒 10(room-JBP5/NTGV/P5CA/3TJY/94FQ)。
|
||||
- 逐波 breach 只存在于教学局(单人+2bot),真实波次合计仅 9 点伤害,散布在 w2:2 / w3:1 / w4:2 / w5:4——**没有任何一波形成压力墙**,曲线是平的。
|
||||
- 波次出清速度≈刷怪速度本身:快速局各波时长 18.6-27.2s(events.jsonl 对账),
|
||||
接近 WAVE_TABLE 的刷怪跨度(如 wave4:9 只 ×1.8s=16.2s 跨度 → 21-24s 出清)。
|
||||
怪**进入内圈后中位 0.8-1.8s 即死**(死亡 eta 中位数 2.2-3.2s,内圈窗口起点 4.0s,
|
||||
5 房明细:NTGV med 3.20 / P5CA 3.20 / JBP5 2.20 / 3TJY 2.90 / 94FQ 3.10)。
|
||||
|
||||
### 1.2 吞吐算账(根因链第一环:波次表输出 < 团队击杀容量)
|
||||
|
||||
以最难的第 5 波计:
|
||||
|
||||
| 量 | 值 | 来源 |
|
||||
|---|---|---|
|
||||
| 峰值到达率 | 12 只 / 1.5s gap ≈ **0.67 只/s** | WAVE_TABLE[5] |
|
||||
| 3 座攻击吞吐 | 3 × 1/2.5s = **1.2 杀/s**(1.8 倍冗余) | ATTACK_CD_MS=2500 |
|
||||
| 4 座攻击吞吐 | 4 × 1/2.5s = **1.6 杀/s**(2.4 倍冗余) | 同上 |
|
||||
| 旋风斩追加 | 每座每 8s 清空内圈全部(快速局实测 108 次、清走 63/195=32% 击杀) | SKILL_CD_MS=8000 |
|
||||
|
||||
且 `buildWaveScript` 按 `seat = i % seatCount` 把怪**轮转发牌到各防区**:4 座房每席
|
||||
第 5 波只分到 3 只(≈10s/只),而单席击杀容量 0.4 只/s + 旋风斩。**WAVE_TABLE 不随
|
||||
seatCount 缩放**(LAYOUTS 分 3/4 座两套,波次表只有一套)——4 人房等于把 3 人份的
|
||||
压力摊给 4 个人分担。
|
||||
|
||||
### 1.3 根因链(按因果顺序)
|
||||
|
||||
1. **波次表按「3 个 bot 水准」标定,而非按真人**:§3.4 平衡目标"solo 余 6-9(A/B)"
|
||||
的参照点是 `botDecide` 循环(hesitateP 0.8、reactBase 2.0 —— §15 裁决 10 故意调钝)。
|
||||
实测教学房(1 真人 + 2 bot)mean dur ≈ 9.1(6×10、3×9、1×8、1×6),显著高于
|
||||
扫描 bot 档的 7.5:**哪怕最弱的真人(P03,个人仅 10 杀)也净贡献 +4~6 点耐久**,
|
||||
因为真人出手 eta(3-4s)天然早于 bot 反应带(≤2-3s)。真人 ≥ bot 是设计意图
|
||||
(§7.2"给真人留出比 bot 强的空间"),但波次表没有为"真人水准"重新加压。
|
||||
2. **难度不随座位数/水平缩放**:4 座房沿用同一 39 只总盘 → 团队吞吐冗余从 1.8× 升到 2.4×。
|
||||
3. **真人房≥1 个高手即封顶**:optimal 档 23/24 = dur 10——单个最优玩家就能把耐久打满,
|
||||
房间结果 = f(最强玩家),与队伍其余人几乎无关。5 个快速房每房至少 1 个
|
||||
(P01/P05/P07/P02/P10),于是 5/5 零损耗。
|
||||
4. **评级阈值落在饱和区**:`gradeFor` 的 S 门槛 dur≥9(≤1 点损耗),在吞吐 2 倍冗余下
|
||||
恒可达 → S 是众数(26/28)。
|
||||
5. **扫描工具无法发现上述一切**:`hunt-balance-scan.mjs` 三档全是单人房,无 4 座档、
|
||||
无混合水平档——失衡的构型(3-4 真人)从未被标定过。
|
||||
|
||||
(bot 强度本身**不是**根因:idle 档 2 bot 独守尚有 6/24 失守、mean 3.3,bot 下限合格;
|
||||
问题是波次输出对"真人+多人"这一档没有任何加压机制。)
|
||||
|
||||
### 1.4 修复提案
|
||||
|
||||
**F1(P0)波次输出按座位数缩放** — `hunt-room.js`:
|
||||
- `buildWaveScript(seed, wave, seatCount)` 内对 `WAVE_TABLE[wave]` 做有效规格换算:
|
||||
`wolf' = round(wolf × seatCount / 3)`(4 座 wave5:10→13 狼),`gap' = gap × 3 / seatCount`
|
||||
(1.5s→1.125s),熊维持绝对数(重威胁稀缺性保留)。WAVE_TABLE 常量不动,新增
|
||||
`scaleSpecForSeats(spec, seatCount)` 纯函数(可单测)。
|
||||
- 改动面:hunt-room.js(+设计文档 §3.4 加"4 座换算行")。
|
||||
|
||||
**F2(P0)房间热度导演(水平自适应加压)** — `hunt-room.js`:
|
||||
- Room 增加 `heat`(初始 0)。每次 `waveclear`:本波零 breach 且 `dur === DUR_MAX` 且
|
||||
`wave >= 2` → `heat += 1`(上限 3);本波有 breach → `heat = max(0, heat - 1)`。
|
||||
`startWave` 应用:额外狼 `+heat` 只、`wolfEta - 0.3 × heat`、`gap × (1 - 0.08 × heat)`
|
||||
(常量建议 `HEAT_MAX=3 / HEAT_ETA_STEP=0.3 / HEAT_GAP_FACTOR=0.08`)。
|
||||
- heat 由确定性事件(breach 有无)导出,**不消耗 rng**,seed 复现性不破坏(§3.5 纪律)。
|
||||
- 作用:高手房自动爬压(P05"P5CA 式碾压"不再恒 10),弱手房天然漏怪 → heat 归零不受罚。
|
||||
- 改动面:hunt-room.js + 设计文档 §3.4/§7 新小节。
|
||||
|
||||
**F3(P0,验收工具)扫描扩档** — `hunt-balance-scan.mjs`:
|
||||
- 新增模式 `bot4`(4 座全 bot 水准)、`opt4`(4 座 optimal)、`mix`(1 optimal + 3 挂机),
|
||||
验收口径:F1/F2 落地后 `bot4` mean 落 6-9、`opt4` mean 8-10(S 可达不恒得)、
|
||||
`mix` 落 5-8。**F1/F2 合入前不得视为完成**。
|
||||
- 改动面:test/hunt-balance-scan.mjs。
|
||||
|
||||
### 1.5 预期指标变化
|
||||
|
||||
| 指标 | 现值 | 目标 |
|
||||
|---|---|---|
|
||||
| 胜率 | 100%(28/28) | 85-95%(弱手房可输、高手房赢得有伤) |
|
||||
| 快速局零损耗房 | 5/5 | ≤1/5,房均损耗中位 0 → 2-3 |
|
||||
| 评级分布 | S 93% | S ≤30% / A≈40% / B≈25% / C+失守 5-10% |
|
||||
| 第 5 波死亡 eta 中位 | 2.2-3.2s | 保持 2-3s(高压来自数量而非读不到) |
|
||||
|
||||
---
|
||||
|
||||
## 2. 发现二:击杀垄断——「先到先得 + 出手权无协调」的结构性结果
|
||||
|
||||
### 2.1 现象(数据)
|
||||
|
||||
快速房击杀分配(killsBySlot,含旋风斩清怪归属):
|
||||
|
||||
| 房 | 分配 | 最高份额 | 0-1 杀者 |
|
||||
|---|---|---|---|
|
||||
| R1-P5CA | **30**/1/4/4(P01) | 77% | P03=1 |
|
||||
| R2-3TJY | **27**/1/4/7(P07) | 69% | P08=1 |
|
||||
| R1-NTGV | **19**/5/15/0(P05,P07) | 49% | **P08=0** |
|
||||
| R2-94FQ | 18/0/1/**20**(P05,P02) | 51% | **P03=0** |
|
||||
| R1-JBP5 | 19/15/5(P10,P09,bot) | 49% | — |
|
||||
|
||||
教学房同理:P01 房 36/4/0(92%)。全场个人击杀 0~36 共存。
|
||||
主观侧直接踩线:P03 三局 1/0/0 杀后退出;P07 复盘"被独狼压制"、两遍
|
||||
`kill_band0`「你还没开张」;P01"我只好一人收 39 只里的 30 只"。
|
||||
|
||||
### 2.2 机制根源(四个机制叠加)
|
||||
|
||||
1. **击杀即死 + 无目标归属**:mob 无 HP(`{id, mkind, dir, eta}`),`adjudicateAttack`
|
||||
弧内取 eta 最小者即刻删除——先出手者独得,没有助攻账。
|
||||
2. **冷却在座不在目标**:`ATTACK_CD_MS` 约束的是单人频率(2.5s/杀),谁先出 cooldown
|
||||
谁先抢下一只;快速手 = 结构性垄断者。P05:"出手权不在最快的手上,在系统的时钟上"
|
||||
——对他这是上限锁,对弱者是抢夺机。
|
||||
3. **感知速度差即击杀权差**:怪进内圈(eta≤4.0,MELEE_ETA)后中位 0.8-1.8s 内被杀;
|
||||
高手 loop 注册率 39/39、clean notice 中位 663-761ms(P05/P01),弱手注册率 12/36、
|
||||
notice 1368-1674ms(P03/P08/P10,brainStats)——**弱手在数学上不可能先到**,
|
||||
他听清时怪已死,声场永远是空的。
|
||||
4. **旋风斩全内圈收割 + 归属出手者**:`adjudicateSkill` 清 eta≤4 全部怪并全部
|
||||
`creditKill(slot)`。P07 三局 37 次旋风斩,3TJY 一局清走 17/39(44%)——
|
||||
高频双击者成为吸尘器,且吃掉的正是别人防区里"即将到手的怪"(P05:"01:14.2 左后狼
|
||||
在我眼前被旋风斩收走")。
|
||||
5. (放大器)**无出手权协调信道**:callout 语义是"求援"不是"这归我",3 局 18 人次
|
||||
仅 3 次呼喊;击杀归属无播报(P01 的"熊债":打残的熊被 bot 补刀无声无息)。
|
||||
|
||||
### 2.3 修复提案
|
||||
|
||||
**F4(P0)防区优先窗(sector yield)** — `hunt-room.js`:
|
||||
- 新常量 `SECTOR_YIELD_ETA = 2.0`。`adjudicateAttack` 选目标时:若 mob.dir 属于**另一在
|
||||
席座位的防区**(LAYOUTS 是全集划分,可 `dirOwner(dir)` 查表)且 `mob.eta >
|
||||
SECTOR_YIELD_ETA` → 跳过该 mob(弧内试下一只;全跳过走既有 miss 路径)。
|
||||
- 语义:防区主人对自家怪有 2s 优先窗(eta 4.0→2.0),过了窗任何人可补——
|
||||
「软防区」从"bot 偏置"升级为"轻出手权",补位语义保留(主人掉线/发呆 2s 后怪仍可救)。
|
||||
- bot 侧自动受限(bot 反应带 ≤2.0-3.0,影响可忽略);教学波怪在玩家防区(N 席 0),
|
||||
教学 bot 不再偷教学狼。
|
||||
- 改动面:hunt-room.js + 设计文档 §3.3(防区三用途 → 四用途)+ §13 断言
|
||||
("主人存活且 eta>2.0 时跨区击杀被跳过")。
|
||||
|
||||
**F5(P1)击杀账改「击杀+协助」双账** — `hunt-room.js` + `game.js` + §6.3/§12:
|
||||
- mob 增加 `hitBy`/`claimedBy` 追踪(首个对其出手者=协助者);`ev end` 的 kills 之外加
|
||||
`assists`(按 slot)。旋风斩清走的怪:击杀记施放者、协助记防区主人。
|
||||
- 客户端 `killBandId`(game.js:94)改按 kills+assists 取档;进度 best 与 summary
|
||||
(§12 生成规则)加入协助数。`kill_band0` 文案改为中性("这一夜你守多攻少"类,
|
||||
台词表 23-hunt-voice-ids.md L 组 + TTS 重生成——归音频域,列依赖)。
|
||||
- 改动面:hunt-room.js / game.js / 设计文档 §6.3(end 字段)/ §12。
|
||||
|
||||
**F6(P2)击杀归属可听化**:「怪被队友收走」短音(<1s,R5 合规)——归音频域,
|
||||
此处只登记需求:P01 熊债、P05 旋风抢怪的直接止痛点。
|
||||
|
||||
### 2.4 预期指标变化
|
||||
|
||||
| 指标 | 现值 | 目标 |
|
||||
|---|---|---|
|
||||
| 房内最高击杀份额(快速局均值) | 59%(77% 峰值) | ≤45%(≤20/39) |
|
||||
| 0 杀快速局人次 | 2/18 | 0 |
|
||||
| 弱手个人击杀(P03/P08 型) | 0-1 | 6-10(自家防区每局 ~10 只轮到名下) |
|
||||
| kill_band0 触发 | 有(且辱骂感) | 基本消失 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 发现三:bot 与真人的强度关系——「带飞」是吞吐结构,不是谁强谁弱
|
||||
|
||||
### 3.1 现象与对照
|
||||
|
||||
| 构型 | 数据 | 结论 |
|
||||
|---|---|---|
|
||||
| 教学房(1 真人+2 bot),弱手 | P03 房 bot 29/39=**74%** 杀、玩家仍 S 余9;P06 房 bot 33% | **bot 带飞**:S 白送,学习不被检验 |
|
||||
| 教学房,高手 | P01 房 bot 4/39=10%、P07 房 6/39 | 玩家吸干 bot:bot 只剩清扫 |
|
||||
| 快速房(3-4 真人,0 bot) | P5CA P01 独得 30/39;3TJY P07 独得 27/39 | **高手带飞**:同一结构换了主体 |
|
||||
| 快速房 2 真人+1 bot | JBP5 bot 仅 5/39 | bot 在混合房自动边缘化 |
|
||||
| 挂机底座 | idle 档:2 bot 独守胜 18/24、mean 3.3 | 纯 bot 下限合格(有输的可能) |
|
||||
|
||||
### 3.2 根因
|
||||
|
||||
- bot 的调参目标(§3.4"solo 余 6-9")是**房间结果**目标,从不约束**击杀经济**。
|
||||
bot 被 `hesitateP=0.8 / reactBase=2.0` 钝化后,在击杀市场里永远是"慢清道夫":
|
||||
房间里有任何比它快的人(= 任何真人),bot 份额就被压到边角。
|
||||
- 因此"教学局 bot 带飞"与"真人局专家带飞"是**同一个吞吐过剩问题的两张脸**:
|
||||
座位数 × 0.4 杀/s 的容量 vs 0.67 只/s 的峰值供给,剩下的人都在分剩余。
|
||||
- 副作用 1(教学):弱手被 bot 抬到 S → 教学局 9/10 是 S,"学会与否"不可见(Q5 域,
|
||||
数值侧证据:教学房 dur mean 9.1 vs idle 档 3.3——玩家贡献被 bot 底座掩盖)。
|
||||
- 副作用 2(P05 的天花板抱怨):bot 钝化把"比 bot 强"的达标线设得过低——
|
||||
optimal 玩家单人即 dur 10,团队协作没有数值上的必要(§1.6 风险③在多人档落空)。
|
||||
|
||||
### 3.3 修复提案
|
||||
|
||||
**F7(P1)教学房 bot 防区锁死** — `hunt-room.js`:教学段(phase=teach + 教学后前 2 波)
|
||||
bot 的 `botPickDir` 只在**自家防区**内选目标(偏置 ×∞ 或硬过滤)。玩家的 1/3 声场真正
|
||||
归玩家,教学结果反映玩家水平(P04 型 = B 而非全班 S)。改动面:hunt-room.js(约 5 行)
|
||||
+ §5 教学房规则补一句。
|
||||
|
||||
**F8(P2,观察项)bot 强度不动**:F1/F2/F4 落地后重跑扩档扫描,若 4 座 bot4 档
|
||||
mean 仍 >9,再考虑 `BOT_TUNING_DEFAULT.hesitateP 0.8→0.7`。当前无证据要求动 bot——
|
||||
先修供给(波次)与分配(出手权),再谈 bot。
|
||||
|
||||
### 3.4 预期指标变化
|
||||
|
||||
- 教学房玩家击杀份额:26-59%(弱手)→ ≥70%;教学房评级分布从 9S/1A/… → 反映真实
|
||||
水平(预期 S≤4/10)。bot 份额与玩家水平的相关斜率变平(不再"越弱越被抬")。
|
||||
|
||||
---
|
||||
|
||||
## 4. 发现四:评级失去分辨力——单一输入(耐久)落在饱和区,且与个人表现完全解耦
|
||||
|
||||
### 4.1 现象(数据)
|
||||
|
||||
- `gradeFor(dur)`:S≥9 / A 7-8 / B 4-6 / C 1-3。实测 26S/1A/1B:**S 是 93% 的缺省值**。
|
||||
- 三局满 S 的 P05 原话:"一个不稀缺的 S 等于没有评级""结算屏给我同一个 S"→ 退出;
|
||||
P01:"两局都 S·营地余 10 之后,我也不知道下一局还能图什么"→ 退出。
|
||||
- **房内所有人同评级**:NTGV 房 P08(0 杀、1 次错弧出手)与 P05(19 杀、26/27 弧对)
|
||||
同为 S。评级对个人零信息。
|
||||
- 即使按扫描 bot 档(3 bot 水准),S 也占 8/24——S 门槛(≤1 点损耗)在原难度下就偏松;
|
||||
难度饱和(发现一)把它彻底推成众数。
|
||||
- 进度 best 排序键(§12:评级 > 营厂余耐久 > 击杀)里第三键从未被用到(dur 恒 10);
|
||||
`end_rank`"猎手榜"只是一句台词(P05/P07 都点名:无名次、无分段、无历史最高)。
|
||||
|
||||
### 4.2 根因
|
||||
|
||||
1. 评级输入只有 dur 一个维度,而 dur 被吞吐冗余饱和(发现一)。
|
||||
2. 评级是房间级共享,个人击杀档(killBandId)只进播报不进评级/best——
|
||||
"30 杀带飞"与"0 杀躺赢"在存档里等价。
|
||||
3. 个人可精进轴(弧错率 22%、notice 时延、旋风时机)没有任何一个进入结算。
|
||||
|
||||
### 4.3 修复提案
|
||||
|
||||
**F9(P0,与 F1/F2 绑定验收)评级分两轴** — `hunt-room.js`(服务端权威,§3.6):
|
||||
- **团队轴**:`gradeFor` 门槛在 F1/F2/F3 扩档扫描上重标定。建议收紧为
|
||||
`S: dur≥10(零损耗)/ A: 8-9 / B: 5-7 / C: 1-4`,验收线:bot4 档 P(S)≤15%、
|
||||
opt4 档 P(S)≥80%(S = 高手护住满血,而非缺省)。
|
||||
- **个人轴**:`ev end` 增 per-slot `contrib`(kills + 0.5×assists,F5 的账)与
|
||||
`quota = 总怪数/席位数`;个人档 `contrib/quota ≥1.2 → 主猎手 / ≥0.6 → 主力 /
|
||||
其余 → 协防`。voice 新增 3 句(23-hunt-voice-ids.md 结算链:grade_* →
|
||||
个人档 → kill_band_* → end_rank),预算 60→63 句(§10.3 核算仍有余量)。
|
||||
- 进度 best(§12)写入个人档与 contrib,summary 加个人档字段(game.js
|
||||
`_saveProgress/_betterThan` + §12 生成规则)。
|
||||
- 改动面:hunt-room.js / game.js / 设计文档 §3.6 / §12 / 台词表。
|
||||
|
||||
**F10(P1)把"榜"做成真榜**:`end_rank` 台词之后上滑可听"本房击杀对比"
|
||||
(复用 kill_band 分档 + 座次 2-3 句资产),进度 API best 已有 kills——
|
||||
跨玩家榜仍是 roadmap,但**房内对比**是 P05/P07 明确要的钩子且零协议改动。
|
||||
改动面:game.js + 台词表。
|
||||
|
||||
### 4.4 预期指标变化
|
||||
|
||||
- 评级分布见发现一目标列;S 成为"零损耗+个人主猎手"的复合稀缺品。
|
||||
- 复测口径:P05 型玩家三局结算不再全同(个人 contrib 有区分度);
|
||||
best 更新触发率(现恒 S+10,二局后不再更新)→ 每局有可刷新字段。
|
||||
|
||||
---
|
||||
|
||||
## 5. 发现五:匹配无水平信号——悬殊同房对弱者是「无声的羞辱局」,对高手是苦役
|
||||
|
||||
### 5.1 现象(数据)
|
||||
|
||||
- `handleJoin` 快速匹配 = 找第一个有空位的 lobby(`r.phase==='lobby' && slots<4`),
|
||||
**无任何水平输入**(协议 join 也不携带,§6.2)。
|
||||
- R1-P5CA 把 P01(15 年读屏、notice 761ms、弧对 59%)与 P03/P02/P04
|
||||
(notice 1368-1575ms、注册率 12-14/36)同房:P01 30 杀,P03 1 杀,P04 4 杀 0 弧对命中杀。
|
||||
- **弱者代价**(P03 三局 1/0/0 → 退出;P08 0/1 杀):
|
||||
- 声场被抽空:高手把怪在 eta 3.2 清掉,弱手 loop 注册率仅 1/3——游戏对他是
|
||||
"5 分钟静坐 + S 屏";
|
||||
- 看门狗误伤:闲置提醒 4-7 次/局(P03/P04/P10,全场 93 次)——不是挂机,是**无怪可打**,
|
||||
`gd_idle` 只看自家手势 10s 窗(game.js 向导层);
|
||||
- 结算羞辱:`kill_band0`"你还没开张"对着 0 杀弱手播(P07 转述两遍);
|
||||
- 贡献不可见:胜利与个人 0 贡献同屏,S 变成嘲讽。
|
||||
- **高手代价**:P01"最后干脆自己全收";P07 R1 被独狼压制后反而上头(要对手),
|
||||
但零心跳局"无聊删得比连输还快"。
|
||||
|
||||
### 5.2 根因
|
||||
|
||||
1. 快速匹配是纯填坑算法,服务端对玩家水平零知识(进度 best 只在客户端)。
|
||||
2. 悬殊房放大发现一/二:高手吞吐过剩 → 弱手零供给;数值上"团队赢"掩盖"个人零参与"。
|
||||
3. 反馈系统(看门狗、kill_band0)假设"没动作=没在玩、0 杀=没出力",在垄断经济下
|
||||
两个假设都反向成立。
|
||||
|
||||
### 5.3 修复提案
|
||||
|
||||
**F11(P1)join 携带水平提示 + 分层匹配** — `hunt-room.js` + `game.js` + §6.2:
|
||||
- join 增可选字段 `skill: 0-3`(客户端由进度算:无 best=0,B/C=1,A=2,S 且 kills≥15=3;
|
||||
老客户端缺省 null,向后兼容 ver 不动)。
|
||||
- 快速匹配从 first-fit 改为最小极差:优先进 `max(skill)-min(skill) ≤ 1` 的 lobby;
|
||||
找不到则等待,`LOBBY_MS` 12s 到点仍回落任意房(小池子兜底,不增等待上限)。
|
||||
- 改动面:hunt-room.js `handleJoin`(约 30 行)/ game.js(算 skill 并携带)/ §6.2 字段表。
|
||||
|
||||
**F12(P2)反饥饿看门狗**(跨域登记,数值侧给判据):`gd_idle` 触发前提改为
|
||||
"近 10s 内**自家防区**出现过内圈怪或 breach"(game.js 有本地怪表可判);
|
||||
starving 弱手的闲置提醒 4-7 次/局 → ≤1 次。
|
||||
|
||||
**F13(P2)kill_band0 文案中性化**(并入 F5 的台词改动)。
|
||||
|
||||
### 5.4 预期指标变化
|
||||
|
||||
- 悬殊房(极差 ≥2 水平档同房)占比 → 目标 <20%(10 人池的现实约束下);
|
||||
- 弱手侧:0-1 杀人次 2/18 → 0(叠加 F4),闲置提醒中位 5 次/局 → ≤1;
|
||||
- 高手侧:房内最高击杀份额下降后,"碾压无聊"局(零 breach 且 top-share>60%)→ 复测追踪。
|
||||
|
||||
---
|
||||
|
||||
## 6. 修复优先级表(按「玩家愿意玩下去」的影响排序)
|
||||
|
||||
| # | 修复 | 定级 | 改动面 | 直接对标的退出原因 | 预期核心指标 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | **F1+F2 波次按座位缩放 + heat 导演**(WAVE_TABLE 换算 / HEAT_* 常量) | **P0** | hunt-room.js + 设计文档 §3.4 | P05"白给 S 就删"、P07"零心跳无聊删"、P01"没有下一局" | 胜率 100%→85-95%;快速零损耗 5/5→≤1/5;S 占比 93%→≤30% |
|
||||
| 2 | **F3 扫描扩档**(bot4/opt4/mix) | **P0**(#1 的验收门槛) | hunt-balance-scan.mjs | —(流程性:防回归) | bot4 落 6-9 带、opt4 不恒 S |
|
||||
| 3 | **F4 防区优先窗**(SECTOR_YIELD_ETA=2.0) | **P0** | hunt-room.js + §3.3/§13 | P03 零参与退出、P07 被压制+受辱、P05 被抢怪 | 0 杀局 2/18→0;top-share 59%→≤45% |
|
||||
| 4 | **F9 评级双轴**(gradeFor 重标定 + contrib 个人档) | **P0** | hunt-room.js / game.js / §3.6/§12/台词表 | P05"不稀缺的 S"、P01"S 后无可图" | S=零损耗+主猎手复合条件;best 可持续刷新 |
|
||||
| 5 | **F5 击杀+协助双账**(ev end.assists / killBandId 口径 / best+summary) | P1 | hunt-room.js / game.js / §6.3/§12 | P01"熊债"、P08 型无感参与 | 协助进结算链;0 贡献玩家归零 |
|
||||
| 6 | **F11 分层匹配**(join.skill + 最小极差选房) | P1 | hunt-room.js / game.js / §6.2 | P03 式悬殊局体验 | 悬殊房 <20%;弱手闲置提醒 ≤1/局(配 F12) |
|
||||
| 7 | **F7 教学房 bot 防区锁死** | P1 | hunt-room.js + §5 | 教学不检验学习(Q5 联动) | 教学房 S 9/10→≤4/10 |
|
||||
| 8 | **F10 房内击杀对比榜**(end_rank 后可听) | P1 | game.js + 台词表 | P07"要可听的排名" | 好胜型留存钩子(复测去留对照) |
|
||||
| 9 | **F12 反饥饿看门狗 + F13 kill_band0 中性化** | P2 | game.js / 台词表 | 弱手被骂式关心 | 闲置提醒全场 93 次→<30 |
|
||||
| 10 | **F6 击杀归属可听化**("被收走"短音) | P2 | 台词/sfx 资产(音频域) | 熊债止痛 | 归音频域实施 |
|
||||
|
||||
**跨域依赖提示**(非本视角所有权,但数值上相关):P01/P05/P07 三人共报的
|
||||
"冷却乱滑 666 次纯 error 震、无剩余时间反馈"(ATTACK_CD_MS 黑箱)与
|
||||
"战斗态下滑双语义误开菜单"属交互域 P0——它们与 #3 同为垄断痛感的放大器,
|
||||
复测前应与数值修复同批落地,否则弱手的"抢不到"会被 UI 挫败混因。
|
||||
|
||||
**复测纪律**(沿用 00-plan §6):同 10 人配置不改;上述改动合入后先跑扩档扫描(F3)
|
||||
再开同阵容复测,对比指标:胜率/评级分布、房均 breach、top-kill-share、0 杀人次、
|
||||
闲置提醒次数、去留决策(重点盯 P01/P05/P07 的"白给 S/无聊"决策点是否消失)。
|
||||
@@ -0,0 +1,168 @@
|
||||
# 02 · 音频信息流设计分析(Q2 方位判读 / Q3 信道拥挤)· Phase 2
|
||||
|
||||
> 视角:纯音频信息流——耳朵在每一秒能听到什么、能不能判读、被谁掩蔽。
|
||||
> 数据:`metrics.md`(28 局总账)+ 4 份抽样精读转写(P02/P08 · R1-quick,P07 · R2-quick,P10 · R0-teach)+ P01/P02/P09/P10 终评。
|
||||
> 硬约束(全程自检):**R6 红线——方位信息永远由声像承载,语音不得报方位**;语音资产每句重新 TTS 有成本。
|
||||
> 改动面缩写:**G** = `web/hunt/game.js`,**S** = `web/server/hunt-room.js`,**V** = `docs/design/23-hunt-voice-ids.md`(含 `tools/gen_voice_dual.py` 两表一致铁律),**D** = `docs/design/23-hunt.md` 同步。
|
||||
|
||||
## 0. 总判断
|
||||
|
||||
信息流层面三个结构性断点,且互相放大:**① 前后轴只有"音量 ×0.6"一条线索,且与距离档共用响度维度(混淆是数学上注定的)**;**② 出击冷却 2.5s 对玩家是纯黑箱(666 次乱滑被拦,无一毫秒就绪信息)**;**③ up/down 手势"有怪=出击、无怪=菜单/状态链"的语境折中,把方位判读弱点直接兑换成误触 UI 与语音轰炸**。R1-R8 机制本身全部成立(无叠播、无超限),但 R2 的"占线丢弃"打在唯一正确的时机上(波始),bot 喊话在快速局近乎绝迹。掩蔽的代价不在判读准确率(10% vs 10%,无差异),而在**漏检与迟到**——当前指标没有这个口径,复测需补。
|
||||
|
||||
---
|
||||
|
||||
## A1 · 前后轴(N/S 家族)判读 63-69%:单线索、且与距离轴共维度
|
||||
|
||||
### 现象(数据+转写引用)
|
||||
|
||||
- 混淆账(821 次登记,按 90° 弧可命中口径):**N 63%(n=120)/ S 69%(n=85)**,而 E/W 100%、四斜向 96-99%。弱点严格落在 "pan=0、只能靠音量分前后" 的家族;N 同时是尝试量最大的桶(玩家默认往前滑)。
|
||||
- 转写翻车样本(全部是前后翻转,不是左右混淆):
|
||||
- P02 R1 `00:45.7`「以为左前实在正左」、`01:11.4`「上滑出击→以为正前的狼(其实在正后)」、`01:18.9`/`01:44.7`「以为正后(其实在正前)→下滑变菜单」;
|
||||
- P07 R2 `01:44.2`「以为正前其实在正后」、`01:51.3`「以为左前其实在正前——挥空」;
|
||||
- P10 R0 `01:53.9`「闷声以为左前,实在左后」、`02:29.1`「以为右后,其实在正前」。
|
||||
- 终评三方盖章:P01(资深,斜向混淆 <8% 的人设)「单音量线索在旁白轰炸下等于无线索」;P02「三局五验同判不同果,等于不可用」;P10「三局了这条规则从没进过我脑子」。
|
||||
|
||||
### 根因(三层,一层比一层深)
|
||||
|
||||
1. **几何层**:`pan = sin(az)`,N/S 同为 0——StereoPanner 前后同位是已知物理边界,设计已用 ×0.6 补偿;但 **-4.4dB 是一个响度差**。
|
||||
2. **维度混淆层(设计根源)**:距离三档 0.30/0.55/0.80 与前后系数 ×0.6 **共用同一个响度维度**,且量级相当(档间差 -5.2dB / -3.2dB vs 前后差 -4.4dB)。具体对撞:前方中档 0.55 vs 后方贴脸档 0.80×0.6=**0.48**——差 0.5dB,人耳不可分;后方中档 0.33 与前方远档 0.30 直接重叠。**"多远"和"前还是后"两个信息轴被压进同一根响度刻度**,这不是练不练的问题,是解码不出来。
|
||||
3. **实现与教学层**:
|
||||
- game.js `_ensureMobLoop` 里"闷"= `vol × 0.6` 纯增益(G:961),**没有任何低通滤波**——设计词面"身后发闷"承诺的是音色,实现只给了响度;
|
||||
- 教学零覆盖:hunt-room.js `tickTeach` 的教学狼全在前半平面(stage1 `dir:'N'`、stage2 `N+NE`,S:591/606-607),`tut_rule` 台词不含闷约定(voice-ids 头注写"由音效演示承担"——**演示狼根本不从身后来**)。P10 终评 P0-1 原话:「闷=身后零教学」。
|
||||
|
||||
### 修复提案(全部不越 R6 红线:方位仍由声像/音色承载,无语音报方位)
|
||||
|
||||
| # | 修法 | 机制/参数 | 改动面 | 新台词? |
|
||||
|---|---|---|---|---|
|
||||
| F1 | **后半平面低通第二线索(音色轴)** | loop 链路 `src→gain→BiquadFilter(lowpass, f≈900Hz, Q≈0.7)→panner→sfxBus`,后半平面启用、前半平面直通;与 ×0.6 音量并行。音色与响度正交,距离档不再污染前后判读。loop 走游戏层自建节点(abyss 先例),**不动引擎面** | G(`_ensureMobLoop`) | 否 |
|
||||
| F2 | **前后系数加深** | ×0.6→**×0.5**(-6dB),配合 F1 后响度只做辅助确认 | G(一行常量)+D §8.3 同步 | 否 |
|
||||
| F3 | **教学补"身后"课** | T1 杀掉 N 狼后补放一只 `dir:'S', eta:12` 教学狼(同样零惩罚、可挥空重教 ≤2 次);新台词点破:`tut_back`「这一声发闷——它在身后。声音发闷,就在背后。」;同时**换写既有 `tut_rule`**:「野兽会从八个方向围上来。声音在哪边,就往哪边滑。听着发闷的,在身后。」(重生成,不加 id) | S(`tickTeach`)+V(+1 id)| **是:新增 `tut_back` 1 id ×2 性别;`tut_rule` + key 变体各重生成 ×2**。预算说明:旁白 60 句已打满,+1 需设计裁决(扩到 61,或砍 1 句低价值句腾位;候选:`st_wave_c`「最后一波了」与 `wave_band5` 语义重复度最高,但状态链在用——建议直接扩容并更新 D §10.3/自检 #5 口径) |
|
||||
| F4 | **挥空增亮反馈(错向的真话由声像自己说)** | `ev miss` 后 0.3s 内,把当前内圈 eta 最小怪的 loop 短暂增亮 0.6s(vol×1.3;若在身后,这 0.6s **暂时解除低通**)——玩家当场听到"真实方位",形成前后轴的即时纠错学习回路 | G(`_onMiss` → `_highlightNearest`) | 否 |
|
||||
| F5 | (P2 备选)呼啸 howl 同样加低通 | howl 走引擎 `opts.pan` one-shot,插滤波需引擎面例外——与 §9"引擎改动唯一一处"冲突,暂缓;外圈损失由中圈 loop(已带 F1)接管 | (引擎例外,暂缓) | 否 |
|
||||
|
||||
### 预期指标变化
|
||||
|
||||
- N/S 可命中率 63%/69% → **≥85%**(R4 同口径复测);斜向 96-99% 与 E/W 100% 不回归(F1 不动 pan)。
|
||||
- 前后翻转型挥空(转写归因"以为前/其实在后"类)样本占比下降 ≥60%;P02 类"同判不同果"主观报告消失(F1 使线索可解码,F3/F4 使其可学习)。
|
||||
- P10 类新手「闷声判反两次」→ 教学局内至少一次正确应对身后世狼。
|
||||
|
||||
---
|
||||
|
||||
## A2 · 冷却黑箱:666 次乱滑被拦,就绪状态零外显
|
||||
|
||||
### 现象
|
||||
|
||||
- 全场 666 次冷却乱滑被拦;P07 R2 一局 **138 次**(`01:48.3-01:49.7` 十一连滑、`02:21.1-02:22.7` 又十余次,每 100-300ms 一记 error 震,间夹 threat 重听);P09 三局局局「回神头两秒全在吃震」,P10「三局从没数清过一次冷却」「一度以为是我滑法不对」。
|
||||
- 实现现状(G):`_attackDir` 冷却内 `vibrate('error'); return;`——**2.5s 冷却没有任何音/震/节拍外显**;旋风斩 8s 有 `skill_ready` 语音,但 `queue:true` 排队在拥挤信道里迟到:P07 R2 `02:25.3` 战斗最烈时排不上,**`02:32.7` 局已进入结算才播出来**(`_enterEnd` 未清 `_skillReadyTimer`,跨局泄漏,bug 级)。
|
||||
- 附带偏差(需核查):P02 R1 `00:37.2/00:38.1/00:39.0` 三次被拦右滑,转写播了 `gd_invalid`「这个操作现在用不上」——设计口径是"冷却仅 error 震、gd_invalid onceKey 同局 1 次"。sim 感知模型与 game.js 两处不符(或真实客户端存在异常路径),实施前先对 harness 复刻核对。
|
||||
|
||||
### 根因
|
||||
|
||||
就绪状态只存在于客户端 `_atkReadyAt` 时间戳,**没有任何模态把它交给耳朵/手掌**;error 震语义是"不行"而不是"还差多久";冷却被拦与无效手势用同一种震(P10 三局分不清是冷却还是手势错);`skill_ready` 绑在语音队列上,信道越挤越迟到。
|
||||
|
||||
### 修复提案
|
||||
|
||||
| # | 修法 | 机制/参数 | 改动面 | 新台词? |
|
||||
|---|---|---|---|---|
|
||||
| F6 | **出击就绪双信号** | 冷却到期播 0.2s 合成短音 `atk_ready`(SYN 高频双 blip,中央,vol 0.5,R5 合规 <1s)+轻触觉(`vibrate('confirm')`)。**节流:仅当本冷却窗内发生过被拦尝试才播**(没人急着出手时不出声,避免每 2.5s 空响成噪声) | G(`_attackDir` 内 arm setTimeout,复用 `_armSkillReady` 模式)+1 条程序合成 sfx | 否(SYN 无 TTS) |
|
||||
| F7 | **被拦反馈分级** | 同一冷却窗内首次被拦:专用触觉模式(0.4s 双脉冲,与"无效手势"单短震区分);第 2 次起合并静默至窗尾(消灭 P07 式连震风暴)。冷却与无效手势两种 error 从此可分辨 | G(`_attackDir` + `_invalid`) | 否 |
|
||||
| F8 | **skill_ready 去语音化+修跨局泄漏** | 改合成 earcon(上行双音 0.3s)+success 轻震;`_enterEnd/_teardownRound/stop` 一律清 `_skillReadyTimer`;`skill_ready` 语音 id 保留给 TEACH 讲解用 | G(`_armSkillReady`、`_enterEnd`)+1 条 SYN sfx | 否 |
|
||||
| F9 | (P2 可选)冷却进度 tick | 被拦时按剩余时间给 1-3 声短 tick(P02 要的"还差半秒");有 F6 后收益边际化 | G | 否 |
|
||||
|
||||
### 预期指标变化
|
||||
|
||||
- 冷却乱滑被拦 **666 → ≤200**(就绪可听后 spam 自熄:P07 类玩家的连滑在第一声 ready 后失去动机)。
|
||||
- P09「回神头两秒吃震」消除;P10「扣的那 1 分」收回;`skill_ready` 跨局/迟到播报归零(语音打断 37 次中 skill_ready 相关子项清空)。
|
||||
|
||||
---
|
||||
|
||||
## A3 · down/up 双语义陷阱:误触菜单与状态链误播
|
||||
|
||||
### 现象
|
||||
|
||||
- **下滑=菜单误触,6/10 玩家中招**:P01 R1 连环 14 次(终评:「下滑退出和下滑打正后是同一根手指,三次下滑全弹回菜单」);P07 R2 `01:15.6-01:17.6` 菜单乒乓 6 轮(每轮 `sys_menu→回到猎场→settings_hint` 三句链互相打断,"回到猎场"四度播不完);P02 R1 五次(`01:18.9/01:44.7/02:20.9-02:21.3` 连环);P08 R1 三次;P09 三局同坑(进菜单后 `01:09.3` 盲单击又误触"重新听帮助")。
|
||||
- **上滑=状态链误播**:错向挥出的上/下滑恰好制造"弧内无怪"→ 变成播报。P02 R1 `01:11.4`「以为正前其实在正后→上滑变成 4 句状态链」;P07 R2 `01:44.2` 同型。状态链 4 句 ≈5-6s 占满语音通道(见 A4)。
|
||||
- 菜单打开战斗照走(E3 豁免本意),P01 终评 P0-1 定性:「操作本身就是在跟系统打架」。
|
||||
|
||||
### 根因
|
||||
|
||||
23-hunt §2.1 表格自身双重定义(四向滑=出击 vs 上滑=状态链/下滑=菜单);game.js 文件头"语境折中"用 `_arcHasTarget()`(客户端本地、eta≤4、事件流瞬时空窗都影响判定)做分流——**把"打不打得到"这个毫秒级动态事实当作"出招还是开 UI"的开关**。且误触率与 A1 前后弱点正相关:错向 → 无怪 → 菜单。退出菜单仍是下滑,同一根手指解自己上的锁。
|
||||
|
||||
### 修复提案
|
||||
|
||||
| # | 修法 | 机制/参数 | 改动面 | 新台词? |
|
||||
|---|---|---|---|---|
|
||||
| F10 | **WAVE 态下滑恒=出击** | 无目标也走完整出击:`atk_whoosh`+服务器 miss → `atk_swish` 真话+error 震(与左/右滑同待遇)。菜单入口改为:①**波间休整**(`wave_clear` 后 8s 窗)内下滑=菜单;②战斗中**长按**=菜单(WAVE 态旁白极少,快进让渡成本最低——需宪法裁决登记 E3 修订);若裁决不动长按,则战斗中无菜单、退出只在波间 | G(`_onWaveGesture`)+D §2.1/§2.4/§2.5 豁免表同步 | 否 |
|
||||
| F11 | **上滑状态链两条护栏** | ①链播中再上滑=**立即停止**(现在会再排 4 句,P02 R0 23 秒里"营地固若金汤"五遍);②**危急截断**:任一怪进入贴脸档(eta<2.5s)时,正在播的状态/菜单/帮助/watchdog 链立即截断(`_chainSeq++`+`stopVoice`;警报/教学/结算链豁免)——即 P02 点名的"危急时刻静默通道",实现"loop 优先"而不动引擎 ducking | G(`_statusChain`、`_refreshLoops` 内挂钩) | 否 |
|
||||
| F12 | **状态链瘦身** | 4 句→按变化播:耐久档+击杀档恒播;波次档仅波次变更后首次播;猎人数仅 roster 变更后播(P08 是状态链重度用户且终评正向——保留主干只砍复读) | G(`_statusIds`) | 否 |
|
||||
|
||||
### 预期指标变化
|
||||
|
||||
- 战斗中 menu-open 误触:P01 的 14 次/局 → **0**(结构性消除)。
|
||||
- 语音打断 37 → **≤15**(大头是菜单乒乓互切,见 A4 清单)。
|
||||
- "状态链压贴脸脚步"型掩蔽案例(P02 R2 01:21.0-01:26.8)归零;P01 P0-1/P0-2 直接收口。
|
||||
|
||||
---
|
||||
|
||||
## A4 · 语音通道 × 战斗信息冲突账
|
||||
|
||||
### 掩蔽源清单(按占用时长与伤害排序;样本来自 4 份精读转写)
|
||||
|
||||
| 源 | 单次占用 | 样本频次 | 价值裁定 |
|
||||
|---|---|---|---|
|
||||
| 误触菜单链(`sys_menu`+`sys_menu_resume`+`settings_hint`) | 3 句 ≈5s | P02 R1 ×5、P07 R2 菜单乒乓期近连续、P08 R1 ×3 | **负价值**;F10 后归零 |
|
||||
| `help_main` 战斗中整播 | ≈8s | P08 R1 `01:33.4/02:02.3`、P07 R2 `01:40.9`、P01 R1 ×2 | **负价值**(P01:「对老手重播基础教学=战斗中没收我的耳朵」);F10 后结构性消失(菜单不在战斗态) |
|
||||
| 状态链 4 句 | ≈5-6s | P08 R1 主动使用 ×6;P02 R0 23s 五遍复读 | **中价值**(P08/P06 靠它感知战局)——瘦身保留(F11/F12),不删功能 |
|
||||
| watchdog 两级(idle 提示音+`gd_idle`) | ≈2s×2 | 全场 93 次 ≈3.3 次/局;P10 R2 七次全误伤(在等怪不是挂机) | **救命索但触发条件错**(P09 走神 9 次全被拽回)。修:inner-ring 有怪、或 5s 内有击杀/被拦/呼喊记录时不触发;第 1 级降为纯震+短音,第 2 级才上语音(G `_rearmWatchdog` 条件) |
|
||||
| 波次/威胁/警报(`wave_band*`/`threat_*`/`breach*`) | 各 1 句 | 合法占用 | **警报可达性 PASS**:28 局 6 次 breach 全部按时到达并正确顶掉状态类(R1 实测有效);`threat_*` 重听是 P07 的双击主出口,属宪法语义,保留 |
|
||||
| `skill_ready` | 1 句 | P07 R2 高频 | F8 去语音化后退出竞争 |
|
||||
|
||||
### 掩蔽 × 误判的诚实读数
|
||||
|
||||
metrics:掩蔽下误判率 10%(n=297)vs 干净时 10%(n=524)——**判读准确率不受掩蔽影响**(拟人模型"听到后"的判读与掩蔽无关)。但掩蔽的真实代价是**漏检/迟到**:P01「menu 播报正好盖掉右后闷脚步→四连打空」、P02「状态链四句压着贴脸脚步」。当前混淆账不测这个。**复测新增指标:「掩蔽窗漏检率」=语音在播期间进入内圈的怪,玩家首次针对性出手延迟 >1.5s 的比例**(基线值 R4 复测时先量再比)。
|
||||
|
||||
### bot 喊话饿死(结构性对撞)
|
||||
|
||||
- R2 客户端规则"旁白在播→延迟 ≤2s→丢弃",撞上服务端触发时机:`greet` 排在开局(`GREET_FIRST_MS` 起,S:352-353)、`wave` 排在波始(S:371)——**这两个时刻旁白必播**(`room_start`+`wave_band1` / `wave_bandN`),氛围句 2s TTL 必死。
|
||||
- 实测:P10 R0 教学局 12 条 botline 中 **7 条被挤掉**(`00:04.6` greet、`01:07.3/02:11.5/02:43.1` 恰为波始),5 条可闻(help_call/help_ack/cover/kill×2——priority 句 4s TTL 兑现了"呼救不可被顶");**P02/P07/P08 三份快速局转写可闻 bot 喊话 0 条**。
|
||||
- 注意另一根因:P01 R1 是 4 真人房(0 bot),bot 喊话结构性为零——"真人房社交声道缺失"要靠呼喊链路补(全场呼喊仅 3 次/28 局,且 P02 R1 `02:12.6` 呼喊的本地反馈在转写里呈现为旁白"重新听帮助。",同房 P01 也没报告听到空间化喊话——**呼喊播放链路需专项核查**)。
|
||||
|
||||
**修法 F13(S+G,无新台词)**:服务端 `wave`/`greet` botline 延迟 3.5s 投递(等 `wave_band` 播完;BOTLINE 预算 10s≤2 不变);客户端非优先句 TTL 2s→4s。预期:快速局人均可闻喊话 0→3-5 条;教学局挤掉 7→≤2。
|
||||
|
||||
---
|
||||
|
||||
## A5 · R1-R8 拥挤规则在真实并发下的表现
|
||||
|
||||
| 规则 | 机制是否成立 | 真实并发下的表现与裁定 |
|
||||
|---|---|---|
|
||||
| R1 旁白单句队列 | ✅ | 全程无叠播;警报顶状态类实测有效(breach 到达 6/6)。代价=队列拥堵与打断(37 次,主因菜单乒乓,F10 后大减);**发现的 bug:`skill_ready` 排队跨入结算链**(P07 R2 02:32.7),F8 修复 |
|
||||
| R2 喊话 sfx ≤1+延迟丢弃 | ✅(但丢弃打错时机) | 上限无违例;丢弃全落在 greet/wave 两类"旁白必播时刻"——**修触发时机(F13),不放宽 ≤1 上限**。help_call/help_ack 优先级兑现(教学局 5 条可闻里 3 条是 priority) |
|
||||
| R3 loop ≤3 路 | ✅ 且无害 | 无"第 4 近怪因静默突入"的可归因案例(快速局 6 局全零 breach);被裁剪怪的方位由击杀倒地音(带 pan)部分补偿。**维持原样** |
|
||||
| R4 one-shot ≤2+呼啸可弃 | ✅ | 波 4-5 生成潮确有呼啸被弃(外圈方向预告缺失),但中圈起 loop 接管,本数据集无可归因损失。可选微调 HOWL_QUEUE_MAX 2→3 / TTL 1.5→1.2s——收益小,列 P2 |
|
||||
| R5 非语音 <1s | ✅ | 无违例 |
|
||||
| R6 方位由声像承载 | ✅ | 全程无语音报方位。**这是立身之本:本报告所有修法(低通/增亮/earcon)均让声像自己说话,明确拒绝"语音报前后"类越线捷径** |
|
||||
| R7 电平分层 | ⚠️ 半成立 | BGM duck 语音方向正确;但"语音 vs loop"无互让——用 F11 危急截断在游戏层实现"贴脸 loop 优先",不动引擎 |
|
||||
| R8 ≤7 声流 | ✅ | 转写无超限/叠爆证据 |
|
||||
|
||||
---
|
||||
|
||||
## 修复优先级表
|
||||
|
||||
| 级 | 编号 | 修法 | 改动面 | 新台词(TTS 成本) | 预期指标 |
|
||||
|---|---|---|---|---|---|
|
||||
| **P0** | F1 | 后半平面 loop 低通(音色第二线索) | G | 否 | N/S 63/69% → ≥80%(配合 F3 冲 ≥85%) |
|
||||
| **P0** | F6 | 出击就绪 earcon+触觉(有被拦才播) | G+1 SYN sfx | 否(程序合成) | 乱滑被拦 666 → ≤200 |
|
||||
| **P0** | F10 | WAVE 下滑恒出击;菜单改波间窗/长按 | G+D(E3 修订) | 否 | 战斗中误触菜单 →0;语音打断 37 → ≤15 |
|
||||
| **P0** | F3 | 教学补身后期:S 向教学狼+`tut_back`+`tut_rule` 换写 | S+V | **是:+1 id×2 性别;`tut_rule`(含 key 变体) 重生成 ×4**;60 句预算需裁决扩容 | 新手前后翻车率减半;「闷」从零教学变一课学会 |
|
||||
| **P1** | F11 | 危急截断+链中再上滑即停 | G | 否 | 状态链压贴脸脚步案例归零 |
|
||||
| **P1** | F7 | 被拦反馈分级(冷却≠无效手势,连震合并) | G | 否 | P10 类"自我怀疑"消除 |
|
||||
| **P1** | F13 | botline 波始延迟 3.5s+客户端 TTL 2→4s;呼喊链路专项核查 | S+G | 否 | 快速局可闻喊话 0→3-5 条/人 |
|
||||
| **P1** | F8 | skill_ready 去语音化+局末清 timer | G+1 SYN sfx | 否 | 跨局泄漏/迟到归零 |
|
||||
| **P1** | F12 | 状态链按变化播(4 句→2-4 句) | G | 否 | "固若金汤"复读投诉归零,状态感知功能保留 |
|
||||
| **P2** | F4 | 挥空增亮(0.6s 突出真方位 loop) | G | 否 | 前后错向即时纠错学习回路 |
|
||||
| **P2** | F2 | 前后系数 0.6→0.5 | G+D §8.3 | 否 | F1 的响度辅助确认 |
|
||||
| **P2** | F5/F9 及 watchdog 降级、HOWL 队列微调 | 见 A4/A5 | G/S | 否 | 边际改善 |
|
||||
|
||||
**汇总账**:12 项修法中仅 F3 需要新台词(1 个新 id + 1 个既有 id 换写重生成,合计 6 条 TTS:`tut_back`×2 性别、`tut_rule`×2 性别+key 变体×2);其余全部是 game.js / hunt-room.js 逻辑与程序合成 sfx,零 TTS 成本。全部修法通过 R6 红线自检(无一句语音报方位)。
|
||||
|
||||
**复测口径提醒(给 synthesis)**:①混淆账同口径重跑(N/S 家族单列);②新增"掩蔽窗漏检率";③新增"战斗中 menu-open 次数""被拦后至就绪出手的中位延迟""bot 喊话可闻条数/人/局";④先核对 sim 感知模型两处偏差(冷却被拦播 `gd_invalid`、呼喊本地反馈异常),确保 R4 对比不被 harness 噪声污染。
|
||||
@@ -0,0 +1,223 @@
|
||||
# 03 · 协作与社交视角分析(Q4:呼喊-补位闭环 / bot 队友 / 开黑感)
|
||||
|
||||
> 分析 agent:协作体验 | 数据:10 人 × 3 轮(R0 教学 10 局 + R1 快速 3 房 + R2 快速 2 房 = 28 局)
|
||||
> 上游:[00-plan §1 Q4](../00-plan.md) | 设计文 [23-hunt §3.3/§7/§1.3](../../../docs/design/23-hunt.md) | 指标 [metrics.md](../metrics.md)
|
||||
> 视角宣言:《围猎》的三大验证命题之三「空间音频协作:呼喊-补位闭环」——**本报告结论:该命题在真人房未获验证,且反向证伪了一层:真人房社交体验劣于 bot 房,直接击穿社交型玩家留存线。**
|
||||
|
||||
## 0. 总账(先摆硬数据)
|
||||
|
||||
| 指标 | 数值 | 出处 |
|
||||
|---|---|---|
|
||||
| 全场呼喊次数 | **3 次 / 28 局**(R0 P06×1、R1 P02×1、R1 P10×1) | metrics.md |
|
||||
| R2 全部 8 名玩家呼喊 | **0 次** | metrics.md 逐局明细 |
|
||||
| 真人房(4 人满编,0 bot)队友喊话 | **0 条 / 局**(NTGV、P5CA、3TJY、94FQ 四房全部) | 各房 percept |
|
||||
| 呼喊→3s 内人声回应率(真人房) | **0%** | P02/P06 终评 |
|
||||
| bot 房(R0)botline 送达 | P06 局听到 9 条,**5 条被信道挤掉(丢弃率 56%)** | R0-teach-P06 percept(00:04.6/00:54.3/01:34.1/02:00.3/02:08.4) |
|
||||
| 闲置提醒("还在吗?")触发 | 93 次 / 28 局——**房间里最活跃的人声是查岗** | metrics.md |
|
||||
| 满编真人房中唯一的呼喊-回应闭环 | **1 次**(R1 JBP5,P10 02:18.9→bot 老周 02:21.8) | R1-quick-P10 percept |
|
||||
|
||||
**关键鉴别性发现(原始事件流对账)**:3 次"呼喊"经 events.jsonl 复核,成色各异——
|
||||
|
||||
1. **P06 R0(00:23.3)是教学 T2 的强制步骤**(teach-t2 旁白后按剧本呼喊,教学 bot 必答),不算自发行为;
|
||||
2. **P02 R1(02:12.6)根本没发出去**:`callout_gesture` 有日志、`act_sent kind:callout` 无日志,客户端实际播的是菜单句"重新听帮助。"(菜单 overlay 吞掉了 tap),同房 P01 的 events 中 **0 条 ev callout**——她对空气喊了一次,还以为"呼喊 bot 零反馈"(P02.review P1#2 原话:"R1 呼喊 1 次、支援回应 0,R2 索性不喊了,这条交互等于不存在");
|
||||
3. **唯一真实且成功的是 P10 R1(02:18.9)**:act 已送达、服务器广播 ev callout、1 秒内 bot 老周回"我这侧吃紧…"(P10 自己的角色声)→ 02:21.8 老周"听见了,这就到。"→ 02:31.7"这边交给我吧。"——而该房(JBP5)恰好是 **R1 唯一有 bot 的房**。
|
||||
|
||||
即:**28 局里自发成立一次呼喊-补位闭环,且它只能发生在有 bot 的房间。**
|
||||
|
||||
---
|
||||
|
||||
## 1. 发现一:呼喊-补位闭环在真人房失效(四层缺失叠加)
|
||||
|
||||
### 1.1 现象
|
||||
|
||||
- R2 全 8 人 0 呼喊;四间满编真人房 0 喊话 0 回应(metrics + 各房 percept)。
|
||||
- 全场呼喊倾向最高的 P06(config:`callout.sectorThreshold=2, useP=0.9`,人设"呼喊积极、阈值低")在 R1 真人房一次都没按。她的归因(P06.review):"前四分之三局没人应过、也没人求过我,**按了也是对空气喊**。求援无回应义务,真人就永远沉默。"
|
||||
- 一次未强化即消退:P02 呼喊一次无任何回音 → R2 起再也不喊(P02.review)。
|
||||
- 唯一闭环案例 P10 的证词(P10.review):"R1 那声 3 秒就回的'听见了,这就到'值一把重启;我还没当上应别人'搭把手'的人。"——闭环体验的留存拉力被明确证词背书,但**两局里他只碰到过一次,且对方是 bot**。
|
||||
|
||||
### 1.2 根因(分层)
|
||||
|
||||
| 层 | 缺失 | 证据 |
|
||||
|---|---|---|
|
||||
| ① 机械回报 | 呼喊的唯一系统效果是"**bot** 朝你侧补位 10s"(§7.3)。4 真人房 0 bot → 呼喊字面上什么都不会发生。无 buff、无积分、无怪物标记 | §7.3;NTGV/P5CA/3TJY/94FQ 四房 roster 全 human |
|
||||
| ② 感知回报 | 即使有队友真去补位,**被帮助者听不见**:真人击杀无归属播报(倒地音无归属、无角色声,P06.review:"倒地闷响居中,分不清谁杀的、在哪个防区")。闭环的"回应端"只存在于 bot 的 24 句台词里 | R1-quick-P06 percept 全程;P01.review P1#3"击杀归属无播报" |
|
||||
| ③ 应答通道 | 真人收到 warning 震+help_call 后,**没有任何"应答"手势存在**(手势宪法:滑=出击/单击=呼喊/双击=旋风斩/上=状态/下=菜单,无 ack)。回应义务无从谈起;且 P02 案例证明 tap 还会被菜单态吞噬 | §2.1 手势表;P02 R1 events(gesture tap → sys_menu_help,无 act) |
|
||||
| ④ 触发条件 | "求援"前置条件是本侧吃紧——但真人房怪活不过 2-3 秒(P10.review:"狼从出现到倒地就两三秒"),P06 的 sectorThreshold=2 在整局从未达到。**没有压力就没有求援**(与发现三同根) | P06.config vs R1 实况;R1 全房营地零损耗 |
|
||||
|
||||
### 1.3 修复提案
|
||||
|
||||
| # | 提案 | 内容 | 改动面 | 新语音资产 |
|
||||
|---|---|---|---|---|
|
||||
| A1 | **呼喊必有声回应(真人房兜底)** | 收到 `ev callout` 后 2s 内若无任何队友 act 朝呼喊者弧 → 服务端指定"最闲座位角色"播 `help_ack`;其后 10s 内**任何人**在呼喊者弧内击杀首只怪 → 播该击杀者座位角色 `cover`("这边交给我")。真人房从此闭环必然响 | server:botline 触发源从"bot 行为"扩展为"事件兜底"(§7.4 调度器加一条规则);client 已能播 | **0**(复用 npc_*_help_ack / cover) |
|
||||
| A2 | **呼喊的机械回报(协同计数)** | 呼喊后 10s 内呼喊者弧内被队友击杀的怪,记呼喊者 1 次"协同";协同数进结算链与评级(见 C4)。呼喊从"一个比特的求援"变成"给队友指目标、给自己记功" | server:callout 状态机 + end 字段 + 评级公式;client 结算链加一段 | 结算播报需新分档句 2-3 句(或先复用 kill_band 措辞改造) |
|
||||
| A3 | **修 tap 吞噬**(P02 案例) | WAVE 态单击恒等于呼喊,菜单 overlay 打开时 tap 不再被菜单抢(与 P01 P0#1"战斗态锁菜单入口"是同一处改动,归上手留存视角报告,此处登记依赖) | client 手势分发 | 0 |
|
||||
| A4 | 首次自发呼喊保底 | 教学已完成玩家每局**第一次**呼喊必得 ack(bot 房天然满足;真人房由 A1 保证)——把教学 T2 建立的条件反射在实战第一次使用时兑现 | server 计数(每 slot 每局 1 次) | 0 |
|
||||
|
||||
### 1.4 预期指标变化
|
||||
|
||||
- 呼喊次数:0.11 次/局 → ≥1 次/局(社交型玩家 ≥3);R2 式"全房 0 呼喊"消失。
|
||||
- callout→ack 送达率(真人房):0% → **100% 且 ≤3s**。
|
||||
- P02 型消退学习被打断:呼喊玩家次局留存呼喊行为率 >80%。
|
||||
- 复测口径:数 events.jsonl 中 `act kind:callout`(不是 percept 的自我报告)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 发现二:「真人房比 bot 房还冷」——社交音频层全部焊死在 bot 实体上
|
||||
|
||||
### 2.1 现象
|
||||
|
||||
- bot 有 3 角色 ×8 句 = 24 条台词撑满氛围(greet 开局报到 / wave 波次鼓劲 / breach 漏怪自责 / kill 杀熊喝彩 / help_ack 应援)。R0 bot 房 P06 听到 9 条 botline、P01 听到 4 条——**"别慌,我来了!""哎呀,漏了一个!""嗯,解决了"是两局里仅有的人味**(P06.decisions)。
|
||||
- R1 NTGV(4 真人):整局 botline **0 条**、真人语音 0 句,队友只以狼倒地闷响存在;波间静默 8 秒无人报点(01:58.0)。P06 闲置提醒被抓 6 次,01:36 走神回微信 8 秒,**局后直接退游**:"真人房比 bot 房还冷。不玩了,拉闺蜜开黑去。"
|
||||
- P01(专业向,非社交型)同样点名:P0#3"真人房社交声道缺失——R1 全局队友喊话 0 条、支援回应 0;R0 bot 房反而有 4 条……真人房比聋哑房还静。修法:真人房默认开启空间化快捷喊话三件套,或至少把队友击杀做成带方位的提示音。"
|
||||
- 反讽细节:真人房里最活跃的人声是看门狗"还在吗?听到请碰一下屏幕"(P06 R1 全局 6 次)。P06:"系统越问,我越确认房间里没活人——这句提醒本身就是冷场的实锤。"P03、P10 同样控诉。
|
||||
- 雪上加霜:bot 房仅有的 botline 还在丢包——R2 规则(同刻 ≤1、队列深 ≤1、新到顶掉)下 P06 R0 的 9 条被挤掉 5 条(56%);P10 R1 也有 4 条被挤。**玩家最珍视的反馈是最脆弱的链路**(P06.review P0#2 原话)。
|
||||
|
||||
### 2.2 根因
|
||||
|
||||
1. **botline 触发源=bot 的行为**(§7.4:greet/cover/kill/breach/skill/wave 全部挂在 bot 事件上)。真人实体不产生任何人声事件:真人杀熊无声、放旋风斩只有气旋音、漏怪只有全局旁白。满编真人房 0 bot → 房间社交声道**物理静音**。
|
||||
2. 真人唯一能发出的声音是 help_call(求援),而它正因发现一而几乎从不响——两条缺陷互为死结。
|
||||
3. 击杀 sfx 无归属无方位(loop 停止+倒地音,pan 在怪方位但无"谁杀的"),P06 想听的"队友在哪个防区、怎么样了"结构性不存在(教学承诺的"上滑状态"只有营地/波次/人数/自己击杀四段,无任何队友信息——P06.review P0#3)。
|
||||
4. 波间休整 8s 是设计的社交真空:无战报、无报点、无搭话,只剩静默和"还在吗?"。
|
||||
5. botline 的信道优先级设计(氛围句可丢)把"人味"当成了可牺牲品——恰恰反了:对社交型玩家,人味是主通道,旁白才是氛围。
|
||||
|
||||
### 2.3 修复提案
|
||||
|
||||
| # | 提案 | 内容 | 改动面 | 新语音资产 |
|
||||
|---|---|---|---|---|
|
||||
| B1 | **botline 事件化:真人行为也说话**(P01 修法原案) | `ev kill`(熊/三连杀)→ 击杀者座位角色播 kill line;`ev skill` 清 ≥3 只 → 播 skill line;本防区漏怪 → 播 breach line;真人加入 → greet。真人"扮演"座位角色的设定(§3.3)本来就写了声音身份,只是没接线 | client:ev→botline 接线(slot→char 映射,slot 3 跳过或哨音);server 调度沿用 §7.4 | **0**(24 句直接复用) |
|
||||
| B2 | **波间战报**(P06 建议原案) | waveclear 休整期播 1 条上一波队友战报("小筝在南边杀了两只""老周那边吃了一只熊"式,按座位角色声)。替换静默与"还在吗?",让"上滑状态"真能听到队友 | server:波间统计+调度;client:状态链加队友段 | **需新台词**(分档整句约 6-10 句,单音色 3 角色声)——预算敏感项,可先做降配版:botline wave 句 + 逐人 kill_band 复述(0 新资产) |
|
||||
| B3 | **help_call/help_ack 永不被挤**(P06 建议原案) | 呼救/应答句进"必达队列"(等待而非丢弃),氛围句(greet/wave)才可丢;§8 R2 的"队列深 ≤1 新到顶掉"仅适用于氛围句 | client sfx 喊话调度优先级 | 0 |
|
||||
| B4 | **看门狗与结算文案止血**(P03/P06/P10 三人共同点名) | 战斗态闲置提醒改社交化("你的防区安静,待命就行")或前两级纯震;结算链删"你还没开张"(0 出手局不播 kill_band0,S 结算后不许补刀) | client watchdog 触发条件(战斗态内有出击/击杀即不触发——P01 P1#1)+ 文案 | 新 1-2 句(kill_band0 换措辞可复用槽位重录) |
|
||||
| B5 | 波间号角后 1.5s 无人声 → 轮转播一条 wave/greet 短句(bot 房行为推广到真人房) | server 定时器 | 0 |
|
||||
|
||||
### 2.4 预期指标变化
|
||||
|
||||
- 真人房每局人声句数:0 → ≥8(botline 事件化后天然达到:每房每局 kill×2-4 + wave×3 + ack/cover×1-2)。
|
||||
- botline 丢弃率:56% → <10%(且丢的全是氛围句)。
|
||||
- 波间静默占比(6-8s 死寂)→ 每 8s 休整期至少 1 条人声。
|
||||
- 直接验收:**P06 型玩家的终评里"真人房比 bot 房冷"这句话消失**;复测她不退游。
|
||||
|
||||
---
|
||||
|
||||
## 3. 发现三:协作的必要性缺失——1 高手 + 3 观众满血通关,防区/补位/分工全体失业
|
||||
|
||||
### 3.1 现象
|
||||
|
||||
- 6 局快速局全部 S·营地耐久终值 10(**零损耗**);全场 28 局 S×26。
|
||||
- P01 R1 一人 30/39 杀带飞 3 个真人(P5CA 房击杀分布 30/1/4/4);R2 3TJY 房 P07 27 杀 vs 队友 1/4/7;P05 三局 28/19/20 杀、零呼喊零沟通,三局全 S。
|
||||
- P05.review:"满耐久 S 白送三局,零分辨力……三局零败绩、零危机时刻,没有压力就没有追分的理由。"P01.review P0#4:"单人可带飞……第二局打完,这个游戏对我就没有下一局了。修法:评级纳入个人弧错率、支援响应、旋风时机;难度随房间表现爬升,或加**多方向同步突入逼真人分工**。"
|
||||
- 弱者侧的同一枚硬币:P03 出手 7→1→0,R2 0 出手 0 杀照样 S(详见发现四)。
|
||||
- 设计文档自我对账:§1.6 风险③"协作流于形式(都能打所有方向=不需要队友)→ 对策:出击冷却 2.5s + 软防区 + bot 补位闭环"。实测三条对策全部失守——2.5s 冷却挡不住旋风斩(全场放出 108 次,P07 单局 13-14 次,8s CD 清**全场**内圈);软防区只是 bot 偏置与 pan 来源,对真人零约束;bot 补位闭环在满编房不存在。§15 裁决 10 自己写了"真人最优仍 23/24 满耐久 S('比 bot 强'空间保留)"——**这个保留空间就是"1 高手满血通关"的空间**。
|
||||
|
||||
### 3.2 根因
|
||||
|
||||
1. **威胁在时间上不重叠、在空间上不强制分流**:刷怪间隔 1.5-3s、狼逼近 8-10s,内圈峰值常态 1-2 只——单人"反应 ~1s + 冷却 2.5s"逐只点名绰绰有余,旋风斩兜底一切多贴脸。从不存在"两个弧同时贴脸、冷却只够打一边"的强制分工时刻。
|
||||
2. **耐久预算过宽**:10 点耐久 vs 实际 6 局零损耗。协作的价值=省耐久,而耐久根本不掉,协作收益无从兑现。
|
||||
3. **击杀纯个人账、无共享目标**:无任何"必须两人"的机制(无重伤/标记/同步门),防区对真人是纯装饰。
|
||||
|
||||
### 3.3 修复提案(按杠杆/改动面排序)
|
||||
|
||||
| # | 提案 | 内容 | 改动面 | 新语音资产 |
|
||||
|---|---|---|---|---|
|
||||
| C1 | **同步突入拍(齐压)**(P01 修法原案) | 波次剧本(§3.4/§3.5)在第 3-5 波插入 1-2 个"齐压拍":2-3 只**对向分布**的怪 eta 校准到同一秒进内圈。单人 2.5s 冷却数学上必漏一只——呼喊、补位、旋风斩分配(清哪边、留哪边)第一次成为唯一解 | server:wave 剧本生成器(seed 派生不变,可复现可单测);配一条齐压预警旁白 | 1 句 ×2 性别(或复用 threat_many) |
|
||||
| C4 | **评级纳入协作与个人表现**(P01/P05 共同要求) | S 的条件从"耐久≥9"改为"耐久≥9 **且** 协同/守土分达标";个人弧错率、协同数进结算链。让 S 重新稀缺、让"带飞局"与"配合局"在结算上可分辨 | server:评级公式 + end 字段;client 结算链 | 结算链加 1-2 段(可复用 grade_* 句式改写) |
|
||||
| C2 | **熊两击重伤制**(深度改动,复测后定) | bear 首击→重伤(不扣耐久、逼近减速 50%、声音变化),任意第二击收走;首击者记助攻。天然制造"我打残你来收"的协作微观瞬间与击杀归属故事 | server 怪物状态机 + 击杀/助攻结算;sfx 1 条(重伤痛吼,或 howl_bear 变调) | sfx 1 条 + kill/assist 播报分档(少量) |
|
||||
| C3 | **旋风斩降格为 180° 扇形**(慎,宪法级手感) | 全场清→半场清,多向齐压时旋风斩不再单人兜底(与 C1 强耦合;若 C1 落地后单人+旋风仍可通,再启用) | server 裁决 1 行 + tut_skill 措辞 | 教学句重录 |
|
||||
|
||||
### 3.4 预期指标变化
|
||||
|
||||
- 满耐久 S 率:26/28 → 快速局 ≤30%(与 hunt-balance-scan 的"真人最优"基准重新校准)。
|
||||
- 单人 ≥25 杀的"带飞局"胜率显著下降、出现真实失守局(P07 型玩家的危机时刻)。
|
||||
- "防区"从装饰变成决策:percept 中出现"我守我的弧、他喊他那侧"的分工行为(复测人设自述可验)。
|
||||
- 连带效应:压力出现 → 呼喊触发条件(发现一④)解除。
|
||||
|
||||
---
|
||||
|
||||
## 4. 发现四:弱者的参与感供给为零——击杀垄断 + 唯一个人叙事线是击杀数
|
||||
|
||||
### 4.1 现象
|
||||
|
||||
- P03(通勤客)出手 7→1→0 三局归零,R2 0 出手 0 杀照样 S,"你还没开张"两局念了 11 遍、S 结算后还补刀(R2 02:32.1)→ **删游戏**。P03.review P0#1:"不是我不想打,是永远轮不到我打——这是删游戏的直接原因。"
|
||||
- P10 R2 从 7 出手掉到 2:"狼从出现到倒地就两三秒,三分钟我只出手 2 次;同期'还在吗'响了七次——我没挂机,是没怪可打,被当成挂机太冤了。"P1#3:"同一个游戏换一批人,体验从 9 分掉到怀疑自己做错了什么。"
|
||||
- 快速局弱者击杀分布:P08 0/1、P04 4/1、P03 1/0——纯观众化。
|
||||
- P03 建议 1(原案):"给每个防区留'保底猎物'……保证每人每局至少 3-5 次真实出手——我三局唯一记住的爽点就是击杀那记 pickup 震动,**有它我根本不会删**。"
|
||||
- P03 建议 3:出手前置信号——"怪进入我可打的弧时给一声短音或轻震",顺带解决看门狗"催我滑、滑了空"的自相矛盾(R2 五次上滑全变"没有能打的怪")。
|
||||
|
||||
### 4.2 根因
|
||||
|
||||
1. **击杀权先到先得、无归属**:快的手全场收割,狼 2-3 秒死亡,慢者的弧永远是空的(P03 R2 十次上滑全部"没有能打的怪")。
|
||||
2. **唯一的个人叙事线=击杀数**(kill_band 0="你还没开张"):没有报点、守土、助攻任何第二角色给弱者记功;辅助位"物理性不存在"(P06.review)。
|
||||
3. 看门狗无法区分"等怪"与"挂机",把旁观者当逃兵念。
|
||||
|
||||
### 4.3 修复提案
|
||||
|
||||
| # | 提案 | 内容 | 改动面 | 新语音资产 |
|
||||
|---|---|---|---|---|
|
||||
| D1 | **保底猎物**(P03 原案) | 每波每座位至少 1 只怪刷进其防区、逼近时长 +2s;进内圈后前 3s **只对该座位出击有效**(他人打=miss,配"被保护"短音)。每人每局保底 3-5 次真实出手 | server:刷怪剧本 + 出击归属裁决(与 §3.5 方位轮转合并设计) | 0-1 条短音(可复用 call_whistle) |
|
||||
| D2 | 助攻/标记回报 | 并入 A2:弱者单击呼喊标记的怪被队友击杀 → 协同分进结算。**报点就是弱者的武器**——听得到、点得出,就能参与 | 同 A2 | 同 A2 |
|
||||
| D3 | **守土分**(个人第二叙事线) | 本防区击杀数、本防区零漏怪进个人结算与波间战报(B2 联动):"南边一寸没丢"——0 出手局也有可听的功劳 | server 统计 + 结算链/战报措辞 | 并入 B2 的新台词预算 |
|
||||
| D4 | 文案止血(并入 B4) | 删"你还没开张";看门狗战斗态文案改"防区安静,待命";有出击记录不触发闲置 | client watchdog + 文案 | 1-2 句 |
|
||||
|
||||
### 4.4 预期指标变化
|
||||
|
||||
- 0 出手局出现率:2/28 → **0**;弱者(P03/P04/P08 型)局均出手 ≥3、击杀 ≥2。
|
||||
- kill_band0 播出次数 → 0;"还在吗"战斗态误触发(对有操作玩家)→ 0。
|
||||
- 复测去留:P03 型"观光一局就删"阈值不再被触发。
|
||||
|
||||
---
|
||||
|
||||
## 5. 发现五:bot 队友的定位需要升格——从"补位劳动力+氛围发生器"到"社交心脏 + 被需要对象"
|
||||
|
||||
### 5.1 现象
|
||||
|
||||
- R1 唯一有 bot 的房(JBP5:P10 + P09 + bot 老周)= **全场唯一呼喊-回应闭环的发生地** + P10 唯一 9 分体验。P10.review:"R1 有'听见了,这就到',R2 全程 0 条队友喊话。"
|
||||
- P06 给设计师的一句话:"bot 那句'别慌,我来了'是我两局里唯一的留存理由,请让它在每一局、每一次呼喊后都能响起。"
|
||||
- 但 bot 战力在真人房几乎不可感:JBP5 bot 仅 5 杀(P10 19、P09 15)——bot 不分担压力,也就不构成"我要照应他"的对象。
|
||||
- bot 呼救条件苛刻(§7.2:主防区压力 ≥3 且 20s 节流)→ 真人房 bot 从不喊"来个人搭把手",玩家没有"被需要"时刻,呼喊的示范用法也看不到。
|
||||
- 满编真人房直接 0 bot(§6.4:开局补至 max(3, 人类数))——**房间社交密度随人数增加而降为零**,这是"真人房比 bot 房冷"的结构性根源(见发现二)。
|
||||
|
||||
### 5.2 根因
|
||||
|
||||
设计没有回答"真人房里的 bot 是什么"。现状答案是无——而数据显示 bot 恰好承载着全部三条社交职能:应答(help_ack)、氛围(greet/wave/kill/breach)、示范(bot 呼救教玩家呼喊怎么用)。战力与话痨度又都调在最低档(裁决 10 调钝战力;§7.4 全局 10s≤2 条 + R2 挤占丢弃),且 botline 信道在实测中丢包 56%。
|
||||
|
||||
### 5.3 修复提案
|
||||
|
||||
| # | 提案 | 内容 | 改动面 | 新语音资产 |
|
||||
|---|---|---|---|---|
|
||||
| E2 | **bot 求援阈值放宽(真人房)** | sectorThreshold 3→2、节流 20s→12s,保证 bot 每局求援 1-2 次——既制造"被需要"时刻(P10:"我还没当上应别人'搭把手'的人"),又是呼喊用法的活教材 | server bot AI 参数(§7.2 数值) | 0 |
|
||||
| E3 | bot 波间主动搭话 | 休整期轮转播 wave/greet/战报(B2/B5 联动),真人房不冷场 | server 调度 | 复用/并入 B2 |
|
||||
| E5 | botline 送达率 | help_* 必达(B3);氛围句配额 10s≤2 → 10s≤3 或"每 bot 每波 ≤1,help 类不占配额" | client 调度 + server §7.4 参数 | 0 |
|
||||
| E4 | bot 战力上调一档(复验后) | 反应带 eta≤2.0+rng → ≤2.5+rng、空转 80%→60%,使 bot 承担 1/4-1/3 击杀:分担弱者的"被带飞"尴尬,也保"真人比 bot 强"空间。**必须跑 hunt-balance-scan 多种子复验**,勿重蹈裁决 10 前的零泄漏覆辙 | server 参数 | 0 |
|
||||
| E1 | 满编房保留 bot 声部(产品裁决项) | 方案 a:快速匹配目标 3 真人 + 1 bot(第 4 人进新房),保证每房有社交心脏;方案 b:满 4 真人时由系统扮演"老兵"声部(B1 事件化已覆盖大半 + E3 定时搭话)。**与"纯真人房"诉求存在张力,提请 synthesis 裁定** | matchmaking 逻辑(a)/ 调度器(b) | 0 |
|
||||
|
||||
### 5.4 预期指标变化
|
||||
|
||||
- 每房每局 botline/人声 ≥6 条(含真人事件化部分);bot 求援 ≥1 次/局。
|
||||
- "应别人呼喊"的行为首次出现在真人身上(P10 的明确诉求);协同分 >0 的玩家覆盖率 ≥60%。
|
||||
- JBP5 式闭环从 1/28 局 → 常态(每局 ≥1 次完整 callout→ack→cover 链)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 修复优先级表
|
||||
|
||||
| 级 | 项 | 对应发现 | 改动面 | 新资产 | 预期主指标 |
|
||||
|---|---|---|---|---|---|
|
||||
| **P0** | A1 呼喊必有声回应(真人房 botline 兜底) | 一 | server 调度器 | 0 | callout→ack 100%≤3s |
|
||||
| **P0** | B1 真人事件接 botline(座位角色说话) | 二 | client 接线 | 0 | 真人房人声 0→≥8/局 |
|
||||
| **P0** | B3 help_call/help_ack 必达、氛围句才可丢 | 一/二/五 | client 调度 | 0 | botline 丢弃 56%→<10% |
|
||||
| **P0** | A3 战斗态锁菜单(修 tap 吞噬;与上手视角 P0 合并实施) | 一 | client 手势分发 | 0 | P02 型"哑呼喊"消失 |
|
||||
| **P0** | B4/D4 文案止血:删"你还没开张"+ 看门狗战斗态改写/改触发 | 二/四 | client + 文案 | 1-2 句 | 查岗误触发↓;P03 型羞辱循环断 |
|
||||
| **P1** | C1 同步突入拍(齐压剧本) | 三 | server 剧本 | 1 句×2 | 满耐久 S 率≤30% |
|
||||
| **P1** | C4 评级纳入协同/守土/弧错 | 三 | server 公式+结算 | 少量 | S 稀缺化;带飞局可分辨 |
|
||||
| **P1** | A2/D2 呼喊标记+协同分 | 一/四 | server 结算 | 2-3 句 | 呼喊 ≥1/局·人 |
|
||||
| **P1** | D1 保底猎物(防区归属 3s) | 四 | server 剧本+裁决 | 0-1 短音 | 0 出手局=0;弱者出手≥3/局 |
|
||||
| **P1** | E2+E3 bot 求援放宽 + 波间搭话 | 五 | server 参数/调度 | 0 | bot 求援≥1/局 |
|
||||
| **P2** | B2/D3 波间队友战报(完整版) | 二/四 | server+client | 6-10 句 | 波间静默↓;守土叙事成立 |
|
||||
| **P2** | C2 熊两击重伤制 | 三 | server 状态机 | sfx 1 条+少量 | 助攻微观瞬间 |
|
||||
| **P2** | C3 旋风斩降 180°(C1 不够再上) | 三 | server 裁决 | 教学句重录 | 单人兜底失效 |
|
||||
| **P2** | E4 bot 战力上调一档(先跑 balance-scan) | 五 | server 参数 | 0 | bot 分担 1/4-1/3 杀 |
|
||||
| **P2** | E1 满编房保留 bot 声部 / 3+1 匹配(synthesis 裁定) | 五 | matchmaking | 0 | 每房社交密度保底 |
|
||||
|
||||
### 给 synthesis 的一句话
|
||||
|
||||
呼喊-补位闭环不是玩家不会用,是**它在真人房从未被允许响过一次**:没有回报(bot-only 补位)、没有应答通道、没有触发压力、连仅有的尝试还被菜单吞掉。修好"必应答 + 真人也会说话 + 压力存在"这三件事(A1/B1/C1,前两项零新资产),再谈协作命题是否成立——P06 的退游和 P10 的 9 分是同一枚硬币的两面,而硬币目前只在 bot 房存在。
|
||||
@@ -0,0 +1,240 @@
|
||||
# 04 · 上手与留存分析(Q5 FTUE / Q6 留存钩子)
|
||||
|
||||
> Phase 2 视角四:上手与留存。数据来源:metrics.md 全场账、P01–P10 终评与局间去留决策、
|
||||
> R0 教学转写抽样(P10/P04)、23-hunt.md §5/§12、23-hunt-voice-ids.md 台词表核对。
|
||||
> 硬信号:4 退(P01/P03/P05/P06)6 留;28 局 0 失守 S×26;呼喊全场 3 次;乱滑被拦 666 次;
|
||||
> 闲置提醒 93 次;N/S 方位可命中率仅 63%/69%(E/W 为 100%)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 四种退游死因的归因链与可修复性
|
||||
|
||||
### 1.1 P01 老鹰(专业玩家)——「跟系统打架」死
|
||||
|
||||
**归因链**:教学局 S 爽 → R1 真人局菜单连环误触 14 次(R1 01:13.8 起三次下滑全弹回菜单,"等于拿同一根手指解它自己上的锁")→ 旁白被打断 15 次 + 战斗中整套重播基础教学("快速局对老手重播基础教学等于战斗中没收我的耳朵")→ 真人房 0 喊话无协作信息 → 两局满耐久 S 后"这个游戏对我就没有下一局了" → 退。
|
||||
|
||||
**现象引用**:"引擎是十年一遇的好引擎,但菜单连环误触和正战重播教学让我每局都在跟系统打架";"修好菜单冲突和教学重播,我再回来"。
|
||||
|
||||
**根因**:① 下滑双语义(打 S 向怪 = 开菜单,§2.1 出击与 §2.4 菜单同手势);② 战斗态语音通道无让位规则(UI 播报/教学重播抢主信道);③ 评级只看营地耐久、不看个人表现,30 杀带飞与 4 杀躺赢同 S。
|
||||
|
||||
**可修复性:高,且最便宜**。三个根因全是实现/接线层问题(手势映射、播报路由、结算公式),无需新玩法。他自己给出了召回条件——这是四死因里唯一"明确可召回"的退游者。
|
||||
|
||||
### 1.2 P03 通勤客(观光无聊)——「参与感真空」死
|
||||
|
||||
**归因链**:R0 教学 7 出手、pickup 震动爽 → R1 出手 1(怪活不到防区就被老鹰旋风斩收走,5 次上滑全变"没有能打的怪"状态播报)→ R2 出手 0 + 11 遍"你还没开张" + 5 次"还在吗" → 正中自设阈值"再观光一局就删"。
|
||||
|
||||
**现象引用**:"不是我不想打,是永远轮不到我打——这是删游戏的直接原因";"最过分的是 02:28.6 刚念完'评级,S!',02:32.1 结算链还追一句'你还没开张'——赢了也要挨说"。
|
||||
|
||||
**根因**:① 无保底猎物机制——快玩家(P05 R2 同房 51 出手)把慢玩家(P03 同房 0 出手)的出手窗口清空,出手权分配无下限;② 看门狗与战绩文案把"没轮到"翻译成"没干活",形成羞辱循环;③ 无出手前置信号(弧内有没有怪,出手前不可知)。
|
||||
|
||||
**可修复性:高**。他明说:"我三局唯一记住的爽点就是击杀那记 pickup 震动……有它我根本不会删。"只要每局保 3–5 次真实出手 + 删羞辱文案即可召回。这同时是 P02/P08/P10 的留存条件(杠杆第二高)。
|
||||
|
||||
### 1.3 P05 独狼(无挑战)——「成绩闭环失效」死
|
||||
|
||||
**归因链**:R0 28 杀 S 白送("教学局白送的 S 不作数")→ 自设验货任务 → R1 19 杀仍满耐久 S、2.5s 冷却 + 队友旋风斩锁死个人上限("中间的人头全被十记旋风斩吃掉")→ R2 把出手从 27 拉到 51 验证上限"它就在那了" → 清单清空,删。
|
||||
|
||||
**现象引用**:"威胁不是气话,是止损";"一个不稀缺的 S 等于没有评级";"我这种人留下来只需要一个理由:下一局有一个比这一局更高的数字。"
|
||||
|
||||
**根因**:① 评级零分辨力(28 局 S×26,营地耐久几乎不动);② 2.5s 冷却封死手速回报(R0 拦近 30 次手);③ "猎手榜"是结算里一句台词(R1 02:31.4 出现一次即消失),无名次无分段——§12 本切片确实只有个人最佳桶,榜根本没长钩。
|
||||
|
||||
**可修复性:中高,工作量最大**。S 稀缺化要动数值与结算;真榜触碰切片纪律(无跨玩家排行 API)。但注意:他要的不是社交,是数字对照系——与协作定位不冲突,是纯内容缺口。与 P07("对手比榜更上头,榜比难度更持久")、P09("给我一个想赢而不是躺着也赢的理由")共享同一根因,修一次管三人。
|
||||
|
||||
### 1.4 P06 社交花(社交真空)——「真人房比 bot 房还冷」死
|
||||
|
||||
**归因链**:R0 教学房呼喊-补位闭环成立(02:25.2 呼喊 → 02:28.0 bot"别慌,我来了!","那一刻我真的踏实了")→ R1 真人房整局队友喊话 0 条、真人语音 0 句、自己的呼喊一次没用("按了也是对空气喊")→ 波间静默 8 秒无人报点、闲置提醒查岗 6 次 → 兑现上局警告退游。
|
||||
|
||||
**现象引用**:"bot 那句'别慌,我来了'是我两局里唯一的留存理由";"求援无回应义务,真人就永远沉默"。
|
||||
|
||||
**根因**:① 呼喊是单向广播、无回应义务,教学房的"必答 bot"(§5 T2)制造了假预期,真人房落差直接砸穿;② 玩家可发出的社交信息只有"求援"一个比特,无报点/应答/夸赞通道;③ bot 喊话被 R2 挤掉 5/9 条,唯一人味在丢包;④ 波间无事可做+队友状态黑箱,"上滑状态"听不到任何队友信息(P06 终评:教学承诺与实际不符)。
|
||||
|
||||
**可修复性:高(机制层)/ 部分受限(范围层)**。呼喊必答兜底、队友击杀带方位提示音、波间战报都在现有 npc_* 24 条资产半径内;跨房聊天/开黑系统超出切片纪律(roadmap)。核心闭环(喊→有人应)可修,深度社交注定本切片给不了——**这是四死因里唯一带"定位边界"成分的**,但杀死她的不是边界,是"真人房社交体验劣于 bot 房"的倒挂。
|
||||
|
||||
### 1.5 可修复性总排序
|
||||
|
||||
| 排序 | 死因 | 性质 | 修复杠杆(谁同时受益) |
|
||||
|---|---|---|---|
|
||||
| 1 | P01 系统摩擦(菜单/语音抢占) | 纯 bug/接线 | 全员(P02/P04/P07/P08/P09 全部点名同一问题) |
|
||||
| 2 | P06 社交真空 | 机制+接线(复用 bot 资产) | P08/P10 的明示条件;P02 呼喊反馈 |
|
||||
| 3 | P03 参与感真空+羞辱文案 | 机制+文案 | P02/P08/P10 同病(强带弱局);文案改动最便宜 |
|
||||
| 4 | P05 成绩闭环失效 | 数值+系统(工作量最大) | P07/P09 的预告死因——不修,6 个留下的人会在第 4–10 局复制这四种死 |
|
||||
|
||||
**结论:四种死因没有一种是"人设注定留不住"**。四人都给出了明确的召回条件(P01"修好再回来"/P03"有 pickup 我根本不会删"/P05"结算屏出现过一个 A 我今天就不会删"/P06"闭环稳定响我就一直来")。真正的定位边界只有两处浅层摩擦:P05 的纯单机追分诉求只能靠榜部分满足、P06 的开黑指挥超出切片范围——但两者都不是他们的直接死因。
|
||||
|
||||
---
|
||||
|
||||
## 2. FTUE 缺口清单:教学该教没教的
|
||||
|
||||
**教学现状**:教学段极短(P10 转写:T0 00:00 → 第 1 波 00:34.8,全程约 35 秒),10 人中 3 人没走完——P02 乱滑两下 15 秒跳过、P04 答错一步 30 秒跳过、P07 在 T2 呼喊步主动跳过。
|
||||
|
||||
### F1 · 闷声辨前后:零教学、零演示(最重缺口)
|
||||
|
||||
- **现象**:P10(人生第一款音频游戏)"'闷=身后'压根没人教过我",R0 两个闷声全判反;P02 三局五次验证"同判不同果,等于不可用";P01(资深)"栽的全是'以为正后其实正前'"。全场 N 可命中 63%、S 69%,是 E/W(100%)之外唯二塌方轴。
|
||||
- **根因**:设计意图是"演示承担"——23-hunt-voice-ids.md `tut_rule` 行注明"含后半平面发闷约定**由音效演示承担**",但 §5 教学剧本的教学狼 T1 恒从 **N(正前)** 生成、T3 双狼只讲技能不讲方位,**身后狼在教学里一次都没出现过,演示从未发生**;语音也不点破。约定只存在于设计文档。
|
||||
- **修复**:教学加 T1.5 步——服务器放一只**专从 S 来**的教学狼,让它突入一次(零惩罚),旁白当场点破"刚才那声发闷——它在身后",再放一只从 N 来的做 A/B 对比。改动面:server 教学剧本(hunt-room.js 教学波)+ 新教学语音 2 句(点破句 + 对比句)×2 性别 = 4 条——60 句预算已满,须挤占低价值句位("你还没开张"改写后可让出结算句位)或走预算修订。
|
||||
- **预期指标**:N/S 可命中率 63%/69% → ≥80%;新手弧错率(P10 类玩家 R0 错弧 2 → ≤1);P02 类"谜题钩子"从三局悬案变一局可解。
|
||||
|
||||
### F2 · 冷却节奏:首次体感发生在真局,且只有惩罚信号
|
||||
|
||||
- **现象**:全场冷却乱滑被拦 **666 次**;P10"连滑四五下'只震了一下',为啥打不出来至今没懂……我给朋友报 9 分扣的那 1 分就是它""我一度以为是我滑法不对";P02"我甚至怀疑是自己手势歪了";P07"五秒三十多下滑全吃 error 震,我根本不知道那刀还剩多久——这是我最可能当场怒删的点";P09"我甚至分不清是冷却还是坏了"。
|
||||
- **根因**:§5 教学每步只放一只怪,**永远不会撞上 2.5s 冷却**,冷却的首次体验被推迟到真波次的激战里,以 error 震(负反馈)形式出现;T3 只教了技能冷却 8s(tut_skill_cd),出击冷却 2.5s 一句没提;冷却结束有"skill_ready"语音但出击冷却无任何"就绪"信号。
|
||||
- **修复**:① 教学加 T1.5/T3.5 步:让玩家在无压力环境连打两次体验"武器还在回气",配一句教学语音"出击后要缓一口气,再滑会只震一下——这不是坏了";② 出击冷却结束加轻叮/短音(可复用 join_chime 降音量,零新资产);③ 连拦节流 + 首拦播一句"回气中"(新语音 1 句 ×2,或改用震动节拍倒数——P07 建议"把 error 震从惩罚改成倒计时",零资产)。改动面:client 手势反馈 + server 教学剧本 + 可选 2 条语音。
|
||||
- **预期指标**:乱滑被拦 666 → <200;"冷却不理解"类 P0 反馈清零;P10 的 9 分扣分项消失。
|
||||
|
||||
### F3 · 呼喊的用途:教了闭环,没教"真人房预期",闭环本身还是全场最脆链路
|
||||
|
||||
- **现象**:全场 28 局呼喊仅 **3 次**。P10 是唯一成功案例(R1 02:18.9 首次单击 → 3 秒后"听见了,这就到"→ 直接 9 分),但同游戏 R2 换一批真人队友"全程 0 条队友喊话——同一个游戏换一批人,体验从 9 分掉到怀疑自己做错了什么";P09(半注意力)"呼喊三局 0 次用出去(根本不知道干嘛的)";P02 R1 呼喊 1 次回应 0,"R2 索性不喊了,这条交互等于不存在"。
|
||||
- **根因**:教学 T2 的闭环建立在"教学 bot 必答"(§5)上,真人房无回应义务、无 bot 兜底应答;教学也没有一句"真人队友不一定出声,但你的呼喊永远有人应"的预期管理。
|
||||
- **修复**:① 呼喊必答兜底——真人 3s 无应答时就近 bot 播 help_ack(P06 明示方案:"哪怕台词全是 bot,只要闭环稳定响,我就一直来"),复用现有 npc 24 条资产,零新语音;② 教学结尾加一句预期管理(新语音 1 句 ×2)。改动面:server botline 调度 + 2 条语音。
|
||||
- **预期指标**:呼喊 3 次/28 局 → ≥15 次/28 局(同阵容复测口径);"社交真空"死因根除。
|
||||
|
||||
### F4 · 教学可被手滑跳过:答错题 = 退学
|
||||
|
||||
- **现象**:P04(45 岁,一遍必须听懂的人)"教学刚开头我滑错一下,它直接'已跳过教学,开打'(00:30),后半截没听着,心里咯噔一下,**记了三局**";P02 同款 15 秒跳过("对我这种烦说教的正好,对真新手是黑洞"——他自己都看出这是坑)。
|
||||
- **根因**:教学态里"步骤作答"与"跳过教学"共用四向滑/下滑(§4.3):T1 教学狼在 N、正确答案是上滑,**下滑既是"答 S 向"又是"跳过"——朝 N 答错方向的人被当成主动退学**。P04 转写 00:28.9"教学中下滑(方向搞错了)"→ 00:30.0"已跳过教学"即此机制。
|
||||
- **修复**:教学作答步骤内的下滑/错向一律走已有"gd_idle 重教 ≤2 次"路径,跳过改为**长按或双击确认**("确定跳过教学?"),非作答窗口才接受跳过。改动面:client TEACH 手势分支,零新资产。
|
||||
- **预期指标**:教学完成率 7/10 → 10/10;"教学半途而废"类终评条目清零。
|
||||
|
||||
### F5 · 真人房预期(隐含缺口,与 F3 合并处理)
|
||||
|
||||
教学房 = bot 必答 + 喊话 4–9 条 + 单人高参与;真人房 = 0 人声 + 出手骤降。**没有任何一句话预告这个落差**。P06/P08 的"R0 比 R1 好玩"倒挂、P10 的"9 分→怀疑自己"都源于此。修复并入 F3 的预期管理句 + §3 的社交兜底。
|
||||
|
||||
### FTUE 缺口小结
|
||||
|
||||
| 缺口 | 该谁教 | 现状 | 后果集中体现在 |
|
||||
|---|---|---|---|
|
||||
| 闷=身后 | 教学演示(设计有意图、剧本没落实) | 从未发生 | P01/P02/P05/P07/P08/P10 六人终评 |
|
||||
| 出击冷却 2.5s | 教学步 | 从未提及 | 666 次乱滑、三人"以为是自己坏了" |
|
||||
| 呼喊用途与真人房预期 | T2 + 结尾一句 | 只教了 bot 必答版 | P02/P06/P09/P10 |
|
||||
| 跳过保护 | 手势映射 | 答错=跳过 | P02/P04(真新手黑洞) |
|
||||
|
||||
---
|
||||
|
||||
## 3. 留存钩子盘点:玩家自己说的
|
||||
|
||||
### 钩子清单(按"谁靠它留下"归类)
|
||||
|
||||
| 钩子 | 玩家原话 | 结实度评估 |
|
||||
|---|---|---|
|
||||
| **pickup 击杀震动/手感** | P03"唯一记住的爽点……有它我根本不会删";P10"7 次出手一次没落空,滑哪边哪边倒";P05"弧向 26/27 比 bot 局还准,手还是我的手" | **最结实**。左右声像跟手是全体共识的正资产,零成本触发、每局必有 |
|
||||
| **谜题(闷=身后)** | P02"'闷=身后'这个案子三局都没结,而一局只要三分半,验证它几乎不要钱";P10"不服气,就想再来一把,把那个闷声搞明白";P01"这个考法值得全论坛来碰" | **结实但被 F1 卡死**:钩子真实存在(P02/P10 靠它续命),但"同判不同果、无差异反馈"使它随时从"练"退化为"赌"——是当前第一钩子也是第一流失开关 |
|
||||
| **呼喊-应答闭环** | P10"那声 3 秒就回的'听见了,这就到'值一把重启;我还没当上应别人'搭把手'的人";P06"bot 那句'别慌,我来了'是两局里唯一的留存理由";P08"R0 bot 的'这边我罩着'恰恰是我敢待下去的原因" | **第二结实但最脆弱**:全场只成功 3 次,且全靠 bot;真人房 0 次。链路优先级还被 R2 压线(P06 房 9 条挤掉 5 条) |
|
||||
| **证明/复仇局** | P02 R1"'你还没开张'这口气咽不下……R2 的 18 验证了这口气值钱";P07"被独狼压着反而热血上头,R2 杀回来才是真爽" | 结实(自发产生),但依赖"差一点"的局——满分 S 局喂不出这口气 |
|
||||
| **榜/名次** | P05"猎手榜是句台词不是系统……唯一可能留住我的钩子没长钩";P07"有榜就能爬""要可听的猎手榜排名";P10"成绩已记入猎手榜,跟朋友有得吹" | **当前最虚**(§12 只有个人最佳桶,结算提一句就消失),但被 1 个退游者 + 2 个条件留玩者点名——潜在杠杆最大的空钩子 |
|
||||
| **低承诺时长** | P02"一局才三分半,验证成本几乎为零";P03"塞进地铁片段";P09"三分钟正好塞进剧的片头空档" | 双刃:降低了再来一局的门槛(P03/P09 因此多留两局),但配合零失败 → P09"走的时候连告辞都不会说" |
|
||||
| **攒战绩吹嘘** | P09"白攒战绩跟室友吹'首局 S',比抖音强一点" | 弱钩,且 S 通胀会让它贬值("第一次白捡 S 还能吹,第三次就麻木了") |
|
||||
| **熊归我/差事感** | P04"两头熊都是我一记滑撂倒的……熊这活我会了、也得意";建议"把每面防区的熊留给守那面的人" | 中等结实、专属慢玩家——是 P04 留下的显性理由,也是现成的"派活"抓手 |
|
||||
|
||||
### 判定
|
||||
|
||||
- **最结实**:pickup 震动 + 左右跟手(引擎层正资产,六留四退无人抱怨);谜题钩真实存在但被教学缺口(F1)卡在"赌"上。
|
||||
- **最虚**:榜(一句台词)与评级(S×26 零分辨力)——所有成绩类钩子被"白给 S"统一做空。P05 已死于此,P07/P09 是排队中的下两个。
|
||||
- **结构缺口**:局与局之间没有系统发的成长线(P02"钩子全靠我自己找谜题");玩家在自发制造钩子(验货局/开张局/20 杀局),游戏一个都不接。
|
||||
|
||||
---
|
||||
|
||||
## 4. 闲置提醒 93 次:照顾 vs 羞辱的分界
|
||||
|
||||
### 分布账(由 metrics 逐局明细汇总)
|
||||
|
||||
| 玩家 | 次数 | 定性 |
|
||||
|---|---|---|
|
||||
| P10 新手 | 18 | 被点破(R2 没怪可打被当挂机,"我没挂机,是没怪可打,被当成挂机太冤了") |
|
||||
| P03 通勤 | 16 | 被点破(0 出手局里催"滑过去",滑了只有"没有能打的怪"——指引自相矛盾) |
|
||||
| P04 老赵 | 14 | 被点破("等它走近"被当呆:"慢不是呆""把四十五岁的老猎人当头一天上工的学徒") |
|
||||
| P09 挂机 | 13 | **被照顾**("还在吗是真正的救命索,R0 走神就是被它拽回来的"——但"文案是社死的") |
|
||||
| P02 小鹿 | 10 | 混合(等冷却被催:"我在等冷却,不是掉线") |
|
||||
| P06 社交 | 9 | 被点破("系统越问,我越确认房间里没活人——这句提醒本身就是冷场的实锤") |
|
||||
| P08 谨慎 | 7 | 被点破(正在一拍一拍确认方位被催"反而更慌、更容易乱滑") |
|
||||
| P05/P07/P01 | 6 | 被点破("守点等信息不等于挂机"/"判定窗口把激战中的有效操作当挂机") |
|
||||
|
||||
### 分界线在哪
|
||||
|
||||
1. **判定线:玩家是"耳朵在场"还是"真离线"**。这个游戏的核心动作是"听",等待是合法玩法(P04 等怪走近、P02 等冷却、P07/P01 守点听动静、P08 数拍子确认)——现判定"无手势=闲置"把全部等待态误判。真正需要拽回的只有 P09 式离线(走神/分屏)。P01 案例(00:42.4 被问"还在吗",00:42.8 刚收掉一只)证明判定窗口连有效操作都拦不住。
|
||||
2. **文案线:救援 or 查岗**。同一句"还在吗?听到请碰一下屏幕",P09 听到是救命索(他确实离线了),P06/P04 听到是"系统替我当众承认挂机"(P09 自己也怕这个)。随附的重教句"听声音的方向,滑过去"只该存在于教学局——在老手耳朵里它是"把我当三岁"(P01)。
|
||||
3. **语境线:提醒指向的动作可不可做**。0 出手局里催"滑过去",滑了只有"没有能打的怪"(P03 五次上滑实录)——提醒在催一件注定无效的事,双重羞辱。
|
||||
4. **频率线**:P10 R2 单局 7 次、约 30 秒一轮;P03/P04 的触发数随轮次**上升**(P04 4→4→6,P10 6→5→7)——出手越被抢走,被点破越勤,闲置提醒成了参与度塌方的放大器。
|
||||
|
||||
**结论**:照顾与羞辱的分界 = 「真离线 + 轻量非语音 + 指向可做之事」vs「在场等待 + 语音查岗重教 + 指向不可做之事」。93 次里按上表口径,真正的"照顾"约 13 次(P09),其余 80 次落在误伤区。
|
||||
|
||||
### 修复
|
||||
|
||||
- 判定:闲置复位信号扩为"任意手势(含上滑状态查询)+ 冷却未结束 + 己弧内圈无怪"三态豁免(P08 明示"有上滑听状态记录就不触发";P03/P10 的 0 出手局自动豁免)。改动面:client 看门狗条件,零资产。
|
||||
- 文案:一级纯震(P04:"R2 01:28.5 的 confirm 纯震就挺好");二级才上语音;删重教句(教学局除外);P09 方案把唤醒改为**一句话战报**("第四波开了,你右前有狼")——既拉回又给下一步,还顺手解决 0 出手局的"催空"矛盾。战报句需数字分档(波次句已有 wave_band 可复用,方位句新增 8 向分档或改"左/右"2 档——建议 2 档 ×2 性别 4 条,挤占预算)。
|
||||
- 节流:同局语音级闲置上限 1 次,其后纯震。改动面:client,零资产。
|
||||
- **预期指标**:93 → ≤30(且 P10/P03/P04 类误伤趋零);"你还没开张"×闲置的双重羞辱链拆除(P03/P04/P08 三人 P0 共享项,见 §6)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 三局会话的节奏问题:没有失败的第一夜
|
||||
|
||||
### 5.1 现象
|
||||
|
||||
- 教学局 ≈ 快速局时长(P10 R0 全长 3:36 vs 快速局 ~3 分钟),教学段本身只有 ~35 秒——"首局含教学 ≈ 6.5 分钟"的设计预期实际没拉开密度差。
|
||||
- **28 局 0 失守、S×26 A×1 B×1**;营地最低到 6(P04 R0),耐久 ≤2 的 danger_low **一次都没触发**,C 档 0、end_lose/突围结算路径零流量——设计里最重的一整套失败反馈(danger 震/danger_low/end_lose/不入榜规则)在本会话中完全未经受测试,玩家也完全没见到。
|
||||
- 出手数在 R0→R1 断崖:P03 7→1→0、P08 18→1→5、P04 12→4→2、P10 7→7→2;同期 P05 同房 51 出手。教学房(单人+2 bot)人人有活,4 人真人房慢手失业。
|
||||
- **首败不存在**:玩家在三局里经历的极端负面只是"打空"和"被念",从未经历"营地失守/评级跌落"。P07"三连 S 正上头……但说死了,再来一把 R1 那种零心跳满血局,无聊删得比连输还快";P09"玩不玩都赢等于弃坑零心理成本";P05"没有压力就没有追分的理由"。
|
||||
|
||||
### 5.2 根因
|
||||
|
||||
1. bot 调参(§15 裁决 10)目标是"挂机会失守",但真人局全员在场出手,吞吐远超剧本压力——真人局难度没有随房间表现自适应的机制。
|
||||
2. 教学波零惩罚(§5"突入不扣耐久")+ 教学狼恒从前方来 → **第一次被咬、第一次听见木栅裂、第一次掉耐久都没有受控地安排在教学里**,而是指望真局自然发生——本会话证明它不发生。
|
||||
3. 无新手第二局保护:R0 教学 S 直接入真人池,P03 怀疑"教学局的 S 把我匹配给大神"(无实锤但模式吻合:连续两局同被带飞)。
|
||||
4. R0→R1 的断崖不止难度,还有社交形态(bot 必答→0 人声)与参与度(人人有活→快者通吃),三个断崖叠加把"第一夜"的高峰全部留在 R0。
|
||||
|
||||
### 5.3 首败设计建议(在哪安排第一次失败)
|
||||
|
||||
- **教学局内**:教学狼从 S 突入一次(并入 F1 的闷声教学步)——零惩罚但"被咬"的体感、木栅裂音、耐久 -1 的账目演示一次到位。改动面:server 教学剧本(零惩罚分支已有),零新语音(复用 breach_thud + alert 句)。
|
||||
- **R1 新手保护**:教学后首 1–2 局维持 bot 参与(3 人房配 1 bot 且 bot 保留补位喊话),把社交闭环和出手保底先喂稳;或按 R0 表现(出击数/弧错率)分层进房。改动面:匹配规则(server),零资产。
|
||||
- **难度自适应**:连续满耐久 S 的房间,下一局剧本加压(狼逼近 -0.5s / 多向同步突入)——P01 建议"多方向同步突入逼真人分工",同时制造 P05/P07 要的"真的会输的夜"。改动面:server 波次剧本参数化 + hunt-balance-scan 复测。
|
||||
- **预期指标**:失守率 0% → 10–20%(R2 后段局);danger_low 触发 ≥1 次/会话;连续 S 局数分布拉开;P07 类"零心跳"抱怨消失;同时 0 出手局随保底机制消失。
|
||||
|
||||
---
|
||||
|
||||
## 6. 修复优先级表
|
||||
|
||||
> 改动面标记:[C]lient / [S]erver / [V]oice 台词接线 / [A]udio 资产 / [D]ata 进度 API。
|
||||
> 语音预算现状:60 句 ×2 已满(§10.3),下列新增语音一律标注"挤占"(替换低价值句)或"零新增"(复用/改写)。
|
||||
|
||||
### P0(不修,留下的 6 人也会走)
|
||||
|
||||
| # | 修复 | 死因/受益 | 改动面 | 新语音 | 预期指标变化 |
|
||||
|---|---|---|---|---|---|
|
||||
| 0-1 | 战斗态下滑只许出击/空挥,菜单入口改长按(或仅波间静默期可开) | P01 退游直接死因;P02/P04/P05/P07/P08/P09 六人 P0 | [C] 手势映射 | 零(空挥复用 atk_swish+error 震) | 菜单误触(P01 单局 14 次)→0;"操作跟系统打架"类反馈清零 |
|
||||
| 0-2 | 冷却反馈重做:就绪轻叮 + 连拦节流 + 首拦一句话(或震动节拍倒数) | 666 次乱滑;P07"最可能当场怒删的点";P10 的 9 分扣分项 | [C](教学步并入 0-5 则加 [S]) | 1 句 ×2(挤占)或零(纯触觉方案) | 乱滑被拦 666 → <200;"以为是自己坏了"类自责清零 |
|
||||
| 0-3 | 羞辱链下架:"你还没开张"退出状态链与结算链,改中性/正向("还差一只开张") | P03"赢了也要挨说";P04"跟工头念活单";P08"点名羞辱" | [V] 改写现有句 | 改写不增条 | R2 0 出手局的羞辱循环拆除;P03/P04/P08 自尊类 P0 清零 |
|
||||
| 0-4 | 闲置看门狗重定义:在场三态豁免 + 一级纯震 + 删重教句 + 同局语音上限 1 次 | 93 次中 ~80 次误伤 | [C] | 战报句 4 条(挤占,可选) | 闲置 93 → ≤30;P10/P03/P04 类误伤趋零 |
|
||||
| 0-5 | 教学补课:闷声身后狼演示步(F1)+ 冷却体验步(F2)+ 呼唤真人房预期句(F3/F5) | P10"把身后和回气藏了三局";P02 谜题钩解锁 | [S] 教学剧本 + [V] | 点破/对比/预期 3–4 句 ×2(挤占) | N/S 可命中 63/69% → ≥80%;教学完成后的"第一局困惑"清零 |
|
||||
| 0-6 | 教学跳过保护:作答步内下滑=答错重教,跳过改长按/确认 | P04"记了三局";真新手黑洞(P02 语) | [C] TEACH 分支 | 零 | 教学完成率 7/10 → 10/10 |
|
||||
| 0-7 | 呼喊必答兜底(真人 3s 无应答 → bot help_ack)+ bot 喊话优先级提到不可挤 | P06 退游直接死因;P08/P10 明示条件 | [S] botline 调度 | 零(复用 npc_24 条) | 呼喊 3 次/28 局 → ≥15;"真人房比 bot 房冷"倒挂消除 |
|
||||
| 0-8 | 保底猎物:怪进己弧内圈给该座位 1–2s 优先归属(或出手前置短音) | P03 退游直接死因;P02/P08/P10 同病 | [S] 裁决 | 零(复用 warning 震/短音) | 0 出手局 = 0;慢手每局真实出手 ≥3;P03 类 pickup 爽点每局保底 |
|
||||
|
||||
### P1(第二夜留存:成绩与耐性)
|
||||
|
||||
| # | 修复 | 受益 | 改动面 | 新语音 | 预期指标变化 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1-1 | S 稀缺化:评级纳入个人弧错率/出手率/支援响应,或加 SS 与个人击杀评级 | P05 退游死因;P07/P09 排队中 | [S] 结算 + [V] 分档句 | 2–4 句(挤占) | S 占比 26/28 → <50%;"白给 S"类反馈清零 |
|
||||
| 1-2 | 难度自适应:连续满耐久房间加压(逼近 -0.5s/多向同步突入) | P05/P07/P09"零心跳";首败载体(§5.3) | [S] 剧本 + balance-scan 复测 | 零 | 失守率 0 → 10–20%;danger_low 有流量 |
|
||||
| 1-3 | 战斗中 UI/教学重播降级:危急窗(贴脸/终波 10s)非必要播报让位脚步;教学重播只许教学局与大厅 | P01"没收耳朵";P02"旁白=占耳朵的弹窗"(R0 23 秒念五遍"固若金汤") | [C] 播报路由 | 零 | 语音打断 37 → <10;掩蔽窗漏怪下降 |
|
||||
| 1-4 | 前后第二线索:身后 loop 节奏差/低通染色/贴脸长震(不动"闷"考法) | P01/P02/P04/P08/P10 五人 P1 | [A] loop 变体(DSP 参数或变体资产) | 零(非语音) | N/S 可命中 → ≥85%;"赌"变"练" |
|
||||
| 1-5 | 个人最佳可听化:TITLE/END 上滑播"历史最高击杀 X、最佳评级 Y、距上一档差 Z"(§12 best 桶已有数据) | P05"榜没长钩"的最小落地 | [C] + [D] 读 best | 数字分档句若干(挤占/复用) | 榜从一句台词变可听对照系 |
|
||||
| 1-6 | 队友击杀归属:队友收走己方打残目标给"被收走"短音;结算报个人/协助 | P01"熊债";P04"分不清谁打的" | [S] 事件 + [A] 短音 | 零 | 击杀归属困惑清零;协作可感知 |
|
||||
|
||||
### P2(打磨与远期)
|
||||
|
||||
| # | 修复 | 受益 | 备注 |
|
||||
|---|---|---|---|
|
||||
| 2-1 | 结算链压缩(9 秒 5 句 → 2 句)与波间队友战报轮播 | P09(通勤/分屏);P06 波间空窗 | [C]+[V] 挤占;战报数字需分档 |
|
||||
| 2-2 | 连击加速冷却/锁定目标出手优先权 | P05"给手速留缝" | [S];需 balance-scan 防崩 |
|
||||
| 2-3 | 按 R0 表现的新手分层匹配 | P03"教学 S 匹配大神"怀疑 | [S];无实锤,低风险试 |
|
||||
| 2-4 | 跨玩家真榜(名次/分段) | P05/P07 终极钩 | 触碰切片纪律,列 roadmap,先落地 1-5 |
|
||||
| 2-5 | 慢节奏对拍:突入前"预备"音;真人局也播 skill_ready | P08"快半拍到底是多快" | [C]+[A];与 0-2 联动 |
|
||||
|
||||
### 复测口径建议(同阵容)
|
||||
|
||||
去留率(6/10 基线,目标 ≥8/10)、闲置 93(目标 ≤30)、乱滑 666(<200)、呼喊 3(≥15)、N/S 可命中 63/69%(≥80%)、0 出手局 6 → 0、失守率 0%→10–20%、教学完成率 7/10→10/10、终评"愿意继续玩"附带条件的解除数(现为 6/6 全带条件)。
|
||||
|
||||
---
|
||||
|
||||
## 7. 一句话总结
|
||||
|
||||
第一夜没有任何人输过——于是四种死因全部来自"赢得太假、被系统羞辱、听不见彼此、跟手势打架",而没有一种来自游戏太难;修好 P0 的八条(菜单、冷却、文案、看门狗、教学三课、呼喊兜底、保底猎物)后,四种退游死因里有三种可直接召回,第四种(P05 成绩真空)靠 P1 的稀缺化与可听榜接住。
|
||||
Reference in New Issue
Block a user