# 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°余耐久>击杀 更新 best。大厅卡片直接显示 summary。 ## 9. 设计裁决(仍有效) 出击必有 2.5s 冷却否则单人吞全场。四向必须 ±45° 弧否则斜向怪打不到。房码协议保留、客户端 v1 只 quick。座 3 哨音。喊话走 sfx 才能与旁白并发。失守不入榜。bot 强度按空转校准到 3 bot 余耐久 6–9。WAVE 永不弹菜单。0 杀不播羞辱句。