11 KiB
23 · 《围猎》(hunt / Night Hunt)
给开发者的实现要点摘要
- 交互权威:26 号手册。00 §5.3:四向滑动是出击 → 帮助=长按。新手只教三件事:朝声音滑、点一下呼喊、按住问路。不在第一波教旋风斩、菜单、双击。
- 2–4 人实时联机纯音频协作。服务端权威。拥挤控制 R1–R8 与协议全文保留。
- 废除:双击=旋风斩(新手);冷却中双击=重听威胁;战斗下滑开菜单。旋风斩=阶段 4 高级手势(大厅「全部解锁」后双击;冷却中才是重听威胁)。
- 台词 23-hunt-voice-ids.md:旁白 60×2 + bot 喊话 24 条落 sfx/。引擎唯一改动:
opts.pan。- 单局 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. 存档
{
"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 杀不播羞辱句。