round2: 看门狗礼仪F1(不重播/单句升级/idle-skip) + 分档归因F2 + 交接count-in/answer F3 + 教学看表现F4-F5 + 警报去叠F6 + 回绕F7 + 开场瘦身F8 + 10句新语音 + 测试全绿(6playtest零改动+guide52断言+资产终检)

This commit is contained in:
SoundGame Dev
2026-08-31 00:26:25 +08:00
parent 296c996fb9
commit 902461f0f4
65 changed files with 1094 additions and 775 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+13 -17
View File
@@ -82,8 +82,10 @@ const VOICE_WATCHDOG_MS = 30000;
/** 抉择提示音 id(voice/p1~p8):播放中单击不可跳过(12 号文档 §1.2)。 */
const PROMPT_RE = /^voice\/p\d/;
// 向导层(schemes.md §2):W1 静默看门狗阈值——8s 轻提醒+gd_continue,20s 升级重播帮助
const GUIDE_WATCHDOG_AT = [8000, 20000];
// 向导层(14 号文档 + round2 synthesis F1.1):剧情类等待默认低频——25s 轻提醒
// +gd_continue,50s 升级只重申手势(gd_again),**永不重播 help/进度/当前节点**;
// 同一等待点最多 2 次提示后彻底静默(guide.js 升级链用尽自动停止)
const GUIDE_WATCHDOG_AT = [25000, 50000];
export class StorylineGame extends Game {
constructor(audio, root) {
@@ -104,10 +106,6 @@ export class StorylineGame extends Game {
this.companion = false; // 带上了小满
this.knowTrap = false; // 装死时听到北区陷阱的情报
this.betrayed = false; // 向猎狗交出过坐标
// 向导层:升级帮助播过后不再自动重挂看门狗(L4"之后停止,不轰炸"),
// 玩家下一次手势即复位
this._guideHelped = false;
}
// ---------------------------------------------------------------- Game
@@ -123,7 +121,6 @@ export class StorylineGame extends Game {
onGesture(g) {
console.log(`[StorylineGame] onGesture: ${g} mode=${this.mode} node=${this.nodeId} armed=${this.choiceArmed} playing=${this.voicePlaying}`);
this.guide.disarm(); // 任何手势复位静默看门狗(guide=off 时 no-op)
this._guideHelped = false; // 玩家有动作,恢复看门狗自动挂载
if (this.mode === MODE.MENU) this.onMenuGesture(g);
else this.onStoryGesture(g);
}
@@ -201,6 +198,10 @@ export class StorylineGame extends Game {
this.awaitingRestart = false;
if (node.sfx) this.audio.play(node.sfx);
const seq = [...node.voices];
// F8 开场瘦身(round2):操作口令 gd_brief(≤8s)前置到开场链最前,
// 「brief→intro」;原 intro 长句里的操作教学资产保留不动。
// 向导句只在 full 档插播(off/standard 保持纯剧情链)。
if (id === 'n00' && this.guide.level() === 'full') seq.unshift('voice/gd_brief');
// 开场教学:intro 早期追加一次"单击可跳过旁白"提示(每局只播一次,重开不重播)
if (id === 'n00' && !this.skipHintShown) {
this.skipHintShown = true;
@@ -241,19 +242,14 @@ export class StorylineGame extends Game {
} else if (node.ending) {
this.awaitingRestart = true;
}
// W1/W3 静默等待看门狗(向导层,schemes §2):8s nudge+gd_continue;
// 20s 升级 = 复用 playHelpAndResume(帮助+进度+重播当前节点),升级后不再
// 自动重挂(防循环轰炸),玩家下一次手势恢复。抉择态与语音播放中不挂。
if (node.prompt == null && !this._guideHelped) {
// W1/W3 静默等待看门狗(向导层,round2 F1.1 礼仪重构):25s nudge+gd_continue;
// 50s 升级只重申手势(gd_again)——**不再重播 help+进度+当前节点**。两级用尽
// 彻底静默,玩家下一次手势(新节点播完)重新挂载。抉择态与语音播放中不挂。
if (node.prompt == null) {
this.guide.watchdog({
arm: true,
at: GUIDE_WATCHDOG_AT,
say: ['gd_continue', null],
onEscalate: (n) => {
if (n !== 2 || this.mode !== MODE.STORY) return;
this._guideHelped = true;
this.playHelpAndResume();
},
say: ['gd_continue', 'gd_again'],
cond: () => this.mode === MODE.STORY && !this.voicePlaying,
});
}