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

11 KiB
Raw Permalink Blame History

23 · 《围猎》(hunt / Night Hunt)

给开发者的实现要点摘要

  1. 交互权威:26 号手册。00 §5.3:四向滑动是出击 → 帮助=长按。新手只教三件事:朝声音滑、点一下呼喊、按住问路。不在第一波教旋风斩、菜单、双击。
  2. 2–4 人实时联机纯音频协作。服务端权威。拥挤控制 R1–R8 与协议全文保留。
  3. 废除:双击=旋风斩(新手);冷却中双击=重听威胁;战斗下滑开菜单。旋风斩=阶段 4 高级手势(大厅「全部解锁」后双击;冷却中才是重听威胁)。
  4. 台词 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. 存档

{
  "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 杀不播羞辱句。