round4: H1 escape目标带实时方位 + H2 simon轮次占用预告(根治手势两义) + H3 重听账目真实化(诊断=初始发放1次vs承诺2次) + H4 input看门狗5s + H5 归因真话(gd_miss_none) + 20语音 + guide120断言全绿

This commit is contained in:
SoundGame Dev
2026-08-31 02:51:41 +08:00
parent 6be3d29b78
commit 3d37d4656d
55 changed files with 822 additions and 215 deletions
+7 -5
View File
@@ -1,10 +1,11 @@
/**
* 《节拍行者》新手会话剧本:首局完整走教学 T1-T3(第 2 句故意连错两遍,
* 《节拍行者》新手会话剧本:首局完整走教学 T1-T3(第 2 句先整拍不出手——
* round4 H5 归因真话律:听到的是「这拍没接」而不是「慢了半拍」;再连错一遍
* 触发 round3 G2 的「降速 25% 重演 + gd_slow」,跟着慢速领奏做对后恢复正常)
* → 曲目一(90 BPM);曲中下滑呼出菜单逛一圈再恢复(round3 G3:恢复先听
* gd_count「四拍之后,继续」,再跟 4 拍底鼓 count-in 进场;首个应答窗口前
* 整整 1 小节有 gd_answer+turn 交接标记);第一乐句故意整句漏掉(连 2 Miss
* 触发向导「慢了半拍」提示),之后跟着领奏把一曲打完到结算。
* 整整 1 小节有 gd_answer+turn 交接标记);正片第一乐句故意整句漏掉(连 2 Miss
* 触发向导 gd_miss「慢了半拍」——正片规则不变),之后跟着领奏把一曲打完到结算。
*/
export function describe(game) {
switch (game.phase) {
@@ -37,11 +38,12 @@ export async function session(ctx, mock) {
await ctx.waitCond(() => game.phase === 'tut' && game._cues.length > 0 && game._tutAttempts.length === 0);
ctx.status(`教学第 ${step + 1}/3 句`);
if (step === 1) {
// round3 G2 剧本:这一句故意连错两遍(整句不出手),听它放慢一些再带着打。
// round4 H5 剧本:这一句先整拍不出手——归因必须是「这拍没接」(gd_miss_none),
// 不是「慢了半拍」;再连错一遍(整句不出手)听它放慢一些再带着打(G2)。
// 注意 _tutEvaluate 判定即把 _phaseEnd 置 Infinity 防重入——等待一律挂
// 「持久里程碑」条件(_tutFails/_tutSlowUsed),别挂阶段末时刻。
await ctx.waitCond(() => game._tutFails === 1); // 失败①:没出手
ctx.status('第一遍没敢出手,先听它归因');
ctx.status('第一遍整拍没出手——听到的是「这拍没接。我停下的时候,就轮到你了」,不是「慢了半拍」');
await ctx.waitCond(() => game._phaseEnd < 1e8 && t() < game._phaseEnd - 1); // 纠正链播完、重新领奏
ctx.status('又重新领奏了一遍,还是没敢出手');
await ctx.waitCond(() => game._tutSlowUsed === true); // 失败② → 触发降速重演