200 lines
11 KiB
Markdown
200 lines
11 KiB
Markdown
# 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 杀不播羞辱句。
|