fix(hunt): v2 九修 S1-S9 落地——10 人并发模拟迭代裁定(同阵容复测:去留 6/10→10/10)
研究闭环:v1 三轮 28 局四死因(失衡/社交真空/交互摩擦/观光羞辱)→ 四视角分析 → synthesis S1-S9 裁定 → 实施 → 同 10 人配置复测两轮 20 局。依据 research/hunt-sim/ (synthesis.md / metrics-v2.md / report.md),设计登记 23-hunt.md §16。 服务端 hunt-room.js: - S5 协作人声包:真人座位角色接线(杀熊/三连杀/旋风斩≥3 播角色句、greet 全座位); 满编真人房呼喊 2.5s 无 bot 应答 → 邻座角色代答 help_ack;喊话预算 10s 窗 2→3 - S7 难度重构:waveCounts 4 人房 ×4/3;alignPincers 第 3-5 波齐压拍(跨座位同种类 同秒进内圈,种子确定性保持);mobYielded bot 对人类防区怪让位 2s(只约束 bot, 不拦真人避免挥空真话说谎);gradeForEx 双轴评级(S=耐久≥9 且 ≥2 人各 6 杀, 单人带飞局上限 A) 客户端 game.js: - S1 WAVE 下滑恒出击(无怪=空挥真话),菜单收窄到波间休整窗(E3 修订)—— v1 误触菜单单人单局最多 14 次清零 - S2 冷却首拦才震 + 就绪 beat 轻叮(v1 全场 666 次乱滑连震) - S3 0 杀不播 kill_band0(「你还没开张」下架;复测 P08 0杀→12杀) - S4 看门狗重定义:本波出过手一级语音不触发、语音闲置每局 ≤1、一级降纯震 - S5③ help_call/help_ack 永不超时丢弃 - S6 后半平面 loop 低通 750Hz 第二线索(N/S 判读 63/69%→75/81%) - S8 教学作答步(T1-T3)下滑不再误跳 - S9 状态链按变化播(「固若金汤」复读归零) 测试同步:hunt-sim A1/A2/A12 断言更新(真人 greet/波次缩放/预算 3)、 playtest Block 3 按 S1 新语义改写(战斗中下滑=空挥 + 波间菜单) 回归:hunt-sim 16/16 + playtest 213 + guide 132 + engine-voice 19 全绿; balance-scan:挂机局 5/8 落 C/失守带(v1 恒满血)、optimal 单人带飞封顶 A 遗留:营地零损耗未破(18/20 局余10)——v3 头号,参数方案 report.md §5
This commit is contained in:
@@ -278,6 +278,7 @@ const evMiss = (slot, dir, ts = now) => ({ t: 'ev', kind: 'miss', ts, slot, dir
|
||||
const evSkill = (slot, cleared, ts = now) => ({ t: 'ev', kind: 'skill', ts, slot, cleared });
|
||||
const evBreach = (id, mkind, dir, dur, ts = now) => ({ t: 'ev', kind: 'breach', ts, id, mkind, dir, dur });
|
||||
const evWave = (wave, ts = now) => ({ t: 'ev', kind: 'wave', ts, wave });
|
||||
const evWaveclear = (wave, ts = now) => ({ t: 'ev', kind: 'waveclear', ts, wave });
|
||||
const evCallout = (slot, ts = now) => ({ t: 'ev', kind: 'callout', ts, slot });
|
||||
const evBotline = (slot, line, ts = now) => ({ t: 'ev', kind: 'botline', ts, slot, line });
|
||||
const evRoster = (roster, ts = now) => ({ t: 'ev', kind: 'roster', ts, roster });
|
||||
@@ -841,9 +842,21 @@ realLog('== Block 3 · 菜单不暂停(E3)+ 语境折中 ==');
|
||||
ws.inject(conn, evKill('s1', 2, 'S')); // bot 补刀清场(kills 归 slot 2)
|
||||
await flush();
|
||||
|
||||
// 无 S 弧目标时下滑 = 菜单(三件套保留):sys_menu + 首项 + settings_hint
|
||||
// v2 S1:战斗中下滑恒出击(无怪 = 空挥真话 atk_swish),不再弹菜单
|
||||
const cdT0 = performance.now();
|
||||
await advance(() => performance.now() - cdT0 >= 2600); // 过 2.5s 出击冷却
|
||||
const atkBefore = ws.acts(conn, 'attack').length;
|
||||
await g(game, 'down');
|
||||
assert(game._menuOpen === true, '无目标下滑 → 模态菜单打开');
|
||||
assert(ws.acts(conn, 'attack').length === atkBefore + 1
|
||||
&& ws.acts(conn, 'attack')[atkBefore].dir === 'S',
|
||||
'v2 S1:战斗中无怪下滑 = 空挥出击(act attack dir:S)');
|
||||
assert(game._menuOpen === false, 'v2 S1:战斗中下滑绝不打开菜单');
|
||||
|
||||
// v2 S1:菜单只在波间休整窗(waveclear 后 8s)开放
|
||||
ws.inject(conn, evWaveclear(1));
|
||||
await flush();
|
||||
await g(game, 'down');
|
||||
assert(game._menuOpen === true, '波间休整窗下滑 → 模态菜单打开');
|
||||
await advance(() => playsOf(playLog, 'voice/settings_hint') === 1);
|
||||
assert(chainOrderOk(playLog, ['sys_menu', 'sys_menu_resume', 'settings_hint']),
|
||||
'菜单打开即播 sys_menu + 首项 + settings_hint(设置只读、回大厅修改)');
|
||||
@@ -874,8 +887,10 @@ realLog('== Block 3 · 菜单不暂停(E3)+ 语境折中 ==');
|
||||
assert(game._menuOpen === false, '菜单内下滑 = 关闭');
|
||||
|
||||
// 双击确认:选中"重新听帮助"→ 播 help_main 且菜单不收
|
||||
ws.inject(conn, evWaveclear(1)); // 重置 8s 休整窗
|
||||
await flush();
|
||||
await g(game, 'down');
|
||||
assert(game._menuOpen === true, '菜单再次打开');
|
||||
assert(game._menuOpen === true, '菜单再次打开(休整窗内)');
|
||||
await advance(() => !audio.isVoicePlaying());
|
||||
await g(game, 'tap'); // idx 1 = sys_menu_help
|
||||
await g(game, 'doubletap');
|
||||
@@ -886,6 +901,8 @@ realLog('== Block 3 · 菜单不暂停(E3)+ 语境折中 ==');
|
||||
assert(game._menuOpen === false, '菜单再次关闭');
|
||||
|
||||
// 双击确认"退出房间回大厅":发 leave + 跳转大厅
|
||||
ws.inject(conn, evWaveclear(1)); // 重置 8s 休整窗
|
||||
await flush();
|
||||
await g(game, 'down');
|
||||
await advance(() => !audio.isVoicePlaying());
|
||||
await g(game, 'tap');
|
||||
|
||||
Reference in New Issue
Block a user