Files
2026-10-01 23:26:47 +08:00

200 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 23 · 《围猎》(hunt / Night Hunt)
> **给开发者的实现要点摘要**
> 1. 交互权威:26 号手册。00 §5.3:四向滑动是出击 → **帮助=长按**。新手只教三件事:朝声音滑、点一下呼喊、按住问路。**不**在第一波教旋风斩、菜单、双击。
> 2. 2–4 人实时联机纯音频协作。服务端权威。拥挤控制 R1–R8 与协议全文保留。
> 3. 废除:双击=旋风斩(新手);冷却中双击=重听威胁;战斗下滑开菜单。旋风斩=阶段 4 高级手势(大厅「全部解锁」后双击;冷却中才是重听威胁)。
> 4. 台词 [23-hunt-voice-ids.md](23-hunt-voice-ids.md):旁白 60×2 + bot 喊话 24 条落 sfx/。引擎唯一改动:`opts.pan`。
> 5. 单局 5 波约 5 分钟。教学房学期零惩罚。
---
## 附录 C · 设计单
### 1. 一句话核心动作
**朝声音来的方向滑动就是一刀;点一下喊队友;按住屏幕问营地。**
### 2. 玩家能感知的状态(3 个)
| 状态 | 听感 | Floor |
|---|---|---|
| 围猎 | 最多 3 路怪物 loop(pan+距离档)+ BGM hunt | ACTION |
| 听讲 | 波次/结算/教学旁白,BGM 压低 | SPEAKING |
| 危险 | danger 签名 + 耐久≤2 句(每局一次) | ACTION |
呼喊是短 sfx,不单开第四态。
### 3. 新手手势与解锁(四向是玩法)
| 阶段 | 条件 | 手势 |
|---|---|---|
| 0 | 首次进入 | **四向滑=出击**(90° 弧);**单击=呼喊**(5s 节流);长按尚未教 |
| 1 | 第一次击杀后 | **长按=我在哪**(耐久档。波次。一个动作:「朝叫声滑。」)≤20 字 |
| 2 | 第一局结束(END) | 下滑=菜单(**仅 LOBBY / 波间 8s 休整 / END**;WAVE 内下滑=出击南方) |
| 3 | 累计 3 局 | 双击=重听威胁档(threat_*)。仍不放技能 |
| 4 | 大厅「全部解锁」或专属教学 | 双击=旋风斩(就绪放出;冷却中=重听威胁) |
不要一次教 6 个手势。教学波只走 T0 点一下 → T1 滑砍 → T2 点呼喊 →(可选)T3 长按问路。旋风斩口头不出现。
对局期长按=帮助,关闭旁白加速。
### 4. 状态 × 手势矩阵(新手期)
| 状态 \ 手势 | 单击 | 四向滑动 | 长按 | 双击(未解锁) | 连点/乱滑 |
|---|---|---|---|---|---|
| 匹配/大厅 | 匹配或开局 | invalid | 帮助(最佳/人数) | 按单击 | busy |
| 教学作答 | 按步骤 | 按步骤出击 | 帮助 | 按单击 | 迷茫;挥空真话 |
| WAVE 战斗 | 呼喊 + 空间化喊话(节流内 invalid) | 出击;冷却内仅首次 invalid 震,其后静默,就绪补 beat | 帮助 | 按单击=呼喊 | 乱滑计入迷茫但不放技能 |
| 波间休整 | 无 | invalid | 帮助 | 按单击 | |
| 旁白在播 | 跳句 | 打断并出击 | 打断,帮助 | 按单击 | 第一下 |
| 结算链内 | 吞(800ms 死窗) | 吞 | 吞 | 吞 | 吞 |
| 结算链完 | 再来一局 | invalid | 重听最佳一句 | 按单击 | 第一下 |
| 菜单(非 WAVE) | 确认 | 切项 | 重听说明 | 按单击 | busy |
菜单**不暂停**战斗(联机豁免):因此 WAVE 内根本不打开菜单。休整窗打开时战斗已暂停刷怪。
### 5. 等待点
| id | 期待 | full | short | 静默 | L2 | L3 |
|---|---|---|---|---|---|---|
| intro | tap | 「点一下屏幕。」 | 「点一下。」 | 6s/15s | tap | 替点 |
| teach_hit | 朝狼向滑 | 「朝叫声,滑。」 | 「滑一下。」 | 8s earcon / 15s 短句 | 该向滑 | 游戏杀掉这只教学狼 |
| teach_call | tap | 「点一下,喊人。」 | 「点一下。」 | 8s/15s | tap | 替喊 |
| teach_help | longpress | 「按住屏幕。」 | 「按住。」 | 8s/15s | 长按 | 替播帮助句 |
| lobby | tap | 「点一下,开局。」 | 「单击。」 | 8s(12s 到点自动开) | tap | 自动 start |
| wave | 滑或听 | 不念说明书 | earcon | 本波已出手则永不语音催 | — | — |
WAVE 内「等待是合法玩法」:本波有出击/击杀则一级语音永不触发。
### 6. 首 3 分钟
| 时间 | 播 | 期待 | 没做 | 做错 |
|---|---|---|---|---|
| 0~3s | 篝火+一声狼嚎(N)→「朝叫声,滑。」 | 上滑出击 | 「滑一下。」 | 点:invalid「先滑。」;错向:挥空 atk_swish「在另一边。」 |
| 3~10s | kill_wolf +「对。」(第一次成功) | — | | |
| 10~25s | 第二只狼 →「点一下,喊人。」 | 单击 | 「点一下。」 | 滑:仍可砍(不卡死) |
| 25~40s | bot help_ack(空间化) | 听协作闭环 | | |
| 40~60s | 「按住屏幕,听营地。」 | 长按 | 「按住。」 | |
| 60~90s | tut_done → WAVE1(教学狼突入不扣耐久) | 自由滑砍 | 迷茫 L3 清近狼 | 学期不扣耐久 |
| 90~180s | 第 1–2 波;不提旋风斩 | 滑+喊 | 威胁靠 loop | 冷却连滑不连震 |
### 7. 失败表
| 类型 | 判定 | 归因 | 回到 | 新手期 |
|---|---|---|---|---|
| 挥空 | 弧内无内圈怪 | atk_swish(内容音,可省 ok) | 原地 | 无 |
| 冷却出击 | 2.5s 窗 | 每窗首次 invalid,其后静默 | 原地 | 无 |
| 漏怪突入 | eta 到 0 | breach 闷响;狼 −1 / 熊 −2 | 战斗继续 | 教学波 0 伤 |
| 失守 | dur=0 | end_lose + 击杀档;无评级不入榜 | END | 教学到不了 |
| 呼喊节流 | 5s | invalid 一次解释 | 原地 | 无 |
| 迷茫 | 乱滑无击杀 | L1「朝最响的滑。」→ L2 只放行该弧 → L3 清一只近狼 | 战斗 | 无 |
### 8. 台词类别
- `critical`:开场「朝叫声,滑。」(≤3s)
- `content`:intro、wave_band*、end_*、grade_*、npc 喊话
- `hint`:tut_*(去双击/旋风斩)、hp_band、st_wave、team_*、threat_*、长按帮助句
- `feedback`:atk_swish、gd_invalid、net_*、kill_band 跳过 0 杀羞辱句
- 停用:tut_skill、tut_skill_cd、新手「双击旋风斩」
60 句 ×2 性别 + 24 npc sfx + `_k` 11 对。约 23MB < 30MB。
### 9. 断点复述
联机局不按单机节点存档。TITLE 有 best 时长按/上滑(阶段 1 后长按)播最佳评级+击杀档。重连:30s 内 resume 回槽 + snap;超时转 bot。回来一句:net_back「你回来了。朝叫声滑。」
### 10. 测试记录
改:教学无旋风斩;WAVE 下滑=出击不弹菜单;双击新手=呼喊;长按=帮助。协议、拥挤、断线、评级双轴保留。失败即不通过:loop>3、喊话压旁白、教学扣耐久、服务器接受违规 act。
---
## 1. 概述与切片纪律
夜围猎:听方向滑过去就是一刀,撑过五波天亮。本项目纯音频 MMORPG 路线的**第一阶段切片**,只验证:实时同步(零依赖 WS + 服务端权威)、音频拥挤控制、空间音频协作。不做持久世界、跨房聊天、跨玩家榜、房码录入 UX。
## 2. 世界与数值
圆形猎场,猎人在圆心。狼 8–10s 逼近 −1;熊 11–12s −2。内圈 eta≤4s 可打。出击冷却 2.5s/人。呼喊 5s 节流,bot 朝该防区补位 10s。
四向滑映射 ±45° 弧(上={NW,N,NE} …),客户端只发 N/E/S/W,服务端扩弧。软防区:3 人 [N-E]/[SE-SW]/[W-NW];4 人各 90°。任何方向都能打。
| 波 | 狼 | 熊 | 间隔 | 约 |
|---|---|---|---|---|
| 1 | 4 | 0 | 3.0s | 21s |
| 2 | 6 | 0 | 2.5s | 24s |
| 3 | 7 | 1 | 2.2s | 29s |
| 4 | 8 | 1 | 1.8s | 28s |
| 5 | 10 | 2 | 1.5s | 30s |
3 人房为表内基准;4 人房数量 ×4/3。第 3–5 波可插入齐压拍(跨座同秒进内圈,种子确定)。波间 8s。
评级(服务端):耐久 ≥9 **且** ≥2 名猎人各 ≥6 杀 → S;否则按耐久 A/B/C;0=失守无评级不写 best。bot 让位:怪进内圈头 2s 不与该防区人类抢。
## 3. 状态机
`TITLE / MATCHING / LOBBY / TEACH / WAVE / MENU / END / LOST`。
```
TITLE ──单击──> MATCHING ──joined──> LOBBY ──start/12s/满4──> WAVE
首局 tutDone=false → 教学房 TEACH → WAVE1
WAVE ──ev end──> END ──单击──> MATCHING
WAVE 断线 30s resume 回槽;超时转 bot;末人类断尽灭房
```
开局空位 bot 补至 max(3, 人类数)。座 0–2 角色阿岩/小筝/老周;座 3 呼喊=哨音。
## 4. 协议(实现契约,字段不变)
传输:`GET /ws/hunt`,Node 原生 upgrade + 手写帧,无 npm。mask、opcode 0/1/8/9/10,单条 ≤4KB,15s ping / 45s 死,20 消息/s,snap 可丢。
客户端→服务器:`join`(ver/room/name/teach/resume) / `act`(attack|callout|skill|start + dir + seq) / `leave`。新手客户端不发 skill,直到阶段 4。
服务器→客户端:`joined` / `ev`(spawn kill miss skill breach wave waveclear callout botline roster end) / `snap` 2Hz / `err`。
战斗 tick 100ms,eta 递减。客户端怪表=ev+snap,eta 偏差 >0.5s 校正。渲染:eta>6 静默;≤6 取最近 3 只 loop。
断线:30s 愣在原地;resume 回槽;否则人类≥3 移除槽,否则转 bot。房灭 resume → room_gone。
## 5. Bot
500ms tick。方向压力 Σ(1/eta)×防区 1.5;拟人:eta≤2.0+rng×1.0 且 80% 空转。旋风斩 eta≤2.5 且 ≥3 只且 60%(阶段 4 才与真人技能对等)。呼救防区压力≥3、20s 节流。botline 10s 窗 ≤3 条;help_call/ack **永不超时丢弃**。满编真人房 2.5s 后邻座角色代答 help_ack。杀熊/三连杀可由该座角色播 kill/skill 句(真人扮演座位)。
## 6. 拥挤控制 R1–R8
| # | 规则 |
|---|---|
| R1 | voice 同刻 1 句;警报可顶状态链,教学/结算不可顶 |
| R2 | bot 喊话 sfx 同刻 ≤1,队列深 1;旁白时氛围句延迟 ≤2s 可丢,呼救不丢 |
| R3 | loop ≤3 路,游戏层 panner |
| R4 | 定位 one-shot ≤2,生成潮队列深 2 |
| R5 | 非语音信息 <1s |
| R6 | 威胁只报内圈数量档,永不逐方位枚举 |
| R7 | 喊话 vol 0.55 不抢 duck |
| R8 | 最坏 7 声流;频带分离;峰值不丢警报 |
后半平面:pan=sin(az),且 90°<az<270° 时 loop 音量 ×0.6 **再叠加 750Hz 低通**(闷≠轻)。
## 7. 引擎与资产
`audio.js` sfx/voice 可选 `opts.pan`(−1..1),缺省路径不变。本作旁白不用 voice pan。
BGM:menu / hunt。SFX:atk_whoosh/swish、kill_wolf/bear、skill_spin、breach_thud、horn_wave、join_chime、call_whistle、howl_*、loop_*、npc_*×24。
## 8. 存档
```json
{
"summary": "最佳评级A · 击杀14 · 营地余8 · 共3局",
"best": { "grade": "A", "kills": 14, "durLeft": 8 },
"runs": 3, "totalKills": 31, "tutDone": true
}
```
胜利才按 评级>余耐久>击杀 更新 best。大厅卡片直接显示 summary。
## 9. 设计裁决(仍有效)
出击必有 2.5s 冷却否则单人吞全场。四向必须 ±45° 弧否则斜向怪打不到。房码协议保留、客户端 v1 只 quick。座 3 哨音。喊话走 sfx 才能与旁白并发。失守不入榜。bot 强度按空转校准到 3 bot 余耐久 6–9。WAVE 永不弹菜单。0 杀不播羞辱句。