round3: G1 gd_answer提前一小节(根因=排程压窗起点) + G2教学降难DDA + G3 count-in修复(根因=未重排调度队列) + G4 escape目标链 + G5 simon双击根治(重听改上滑,重录3句) + G6轮成功/破纪录 + G7 space方向呼喊 + 22语音文件 + guide93断言全绿
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
/**
|
||||
* 《盲航》新手会话剧本:首局完整演练 D1-D4(第二颗故意超时,听当场重教)→
|
||||
* 正式对局躲过保护期(20s/45s 的加速/护盾引入都照做)→ 保护期结束后故意漏两颗
|
||||
* (第 1 次听归因+向导「同向滑动就能拨开」,第 2 次听 gd_last_life「最后一次机会」
|
||||
* ——round2 F2.2:受击经济透明)→ 之后全部躲开,保护期结束后再撑 20 秒以上收工
|
||||
* (不再像 round1 那样在保护期后 8 秒就撤,也没有第三次被撞)。
|
||||
* 正式对局躲过保护期(20s/45s 的加速/护盾引入都照做)→ 每颗陨石都撑到 loud
|
||||
* 警报档(撞击前 500ms:警报 + dir_* 方向呼喊同时响,round3 G7)才拨开 →
|
||||
* 保护期结束后故意漏两颗(第 1 次听归因+向导「同向滑动就能拨开」,第 2 次听
|
||||
* gd_last_life「最后一次机会」——round2 F2.2:受击经济透明)→ 之后全部躲开,
|
||||
* 保护期结束后再撑 20 秒以上收工。
|
||||
*/
|
||||
export function describe(game) {
|
||||
const DIR = { left: '左边', right: '右边', up: '上面', down: '下面' };
|
||||
@@ -48,7 +49,9 @@ export async function session(ctx, mock) {
|
||||
ctx.status('演练做完了,要出发了');
|
||||
|
||||
// 正式对局:保护期 60s + 结束后再撑 20s 以上收工。
|
||||
// 每颗陨石生成(呼啸声起)就在判定窗口将开时同向拨开——比盯着 1.5s 判定窗口更稳。
|
||||
// 每颗陨石都撑到 loud 警报档(撞击前 500ms:第二段警报 + 「左!/右!…」方向
|
||||
// 呼喊同时响,round3 G7)才同向拨开——仍在 1.5s 判定窗口内,稳。呼喊与警报
|
||||
// 同一刻先落,随即滑开(=500ms 阈值恰在 loud 警报定时器触发点上)。
|
||||
//(刷怪链是自驱动的定时器链——禁止裸 waitIdle,等待一律挂条件)
|
||||
await ctx.waitCond(() => game.phase === 'playing');
|
||||
ctx.status('出发。引擎声起来了,保护期里先练手');
|
||||
@@ -75,9 +78,10 @@ export async function session(ctx, mock) {
|
||||
: '被撞了。先听到方位归因,又听到「同向滑动就能拨开」');
|
||||
continue;
|
||||
}
|
||||
// 只在判定窗口将开未开时出手(警报第一响 = 撞击前 1s,窗口内)
|
||||
// 撑到 loud 警报档(撞击前 0.5s,第二段警报 + dir 方向呼喊同窗)再出手
|
||||
//(=500ms 恰在 loud 警报定时器触发点:呼喊先落,同一拍跟着滑开)
|
||||
const target = [...game.obstacles].find((o) => !dodged.has(o)
|
||||
&& o.impactAt - performance.now() < 1300);
|
||||
&& o.impactAt - performance.now() <= 500);
|
||||
if (target) {
|
||||
if (eaten < 2 && performance.now() >= game.protectionUntil) {
|
||||
eaten++;
|
||||
@@ -89,13 +93,14 @@ export async function session(ctx, mock) {
|
||||
continue;
|
||||
}
|
||||
dodged.add(target);
|
||||
ctx.note('听到第二段警报和方向呼喊,同向滑开');
|
||||
await ctx.gesture(target.dir);
|
||||
continue;
|
||||
}
|
||||
await ctx.waitCond(() => game.phase !== 'playing'
|
||||
|| victims.some((v) => !game.obstacles.has(v))
|
||||
|| [...game.obstacles].some((o) => !dodged.has(o) && o.impactAt - performance.now() < 1300));
|
||||
|| [...game.obstacles].some((o) => !dodged.has(o) && o.impactAt - performance.now() <= 500));
|
||||
}
|
||||
const aliveSec = Math.round((performance.now() - game.runStart) / 1000);
|
||||
ctx.status(`保护期结束后撑了 ${aliveSec - 60} 秒、挨了两下还活着(警报也只起一波了),先到这`);
|
||||
ctx.status(`保护期结束后撑了 ${aliveSec - 60} 秒、挨了两下还活着;每回撞击前半秒都能听到方向呼喊,先到这`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user