feat(playbook): 26 号交互手册首批落地——storyline/escape/simon 全面重构 + 引擎六模块
按 docs/design/26-audio-interaction-playbook.md 重构三款游戏(对白重写 + 双性别语音重生成 580 文件)。 引擎层(web/engine/,其余 12 款游戏零改动): - floor.js 发言权管理器:SPEAKING/YOUR_TURN/BUSY/ACTION 四态、交接提示音、 等待声(220/330Hz 嘟-嘟,20s 后放缓)、跨链音乐压低(audio.js holdDuck) - receipts.js 输入回执三件套(ok/invalid/busy,100ms 内,原则 4) - confusion.js 迷茫检测(乱点/无效/静默信号 → 三级接管,§4.5) - hints.js 等待点 + 三档提示(full→short→提示音,30s 台账跨点去重,原则 9) - novice.js 手势解锁阶梯(up/down/doubletap 跨局持久,§4.3) - pipeline.js 输入管道(回执收口、防连点 400ms、双击折算、explainOnce) 游戏层: - storyline R3:开场 71.7s 规则念白 → 3 秒内动手;双击=重播(反模式5)废除; 抉择点三档提示+主动重听;断点存档复述(§4.12) - escape R3:单击=检查+使用合并(双击用法废除);长按=我在哪(四向玩法裁定); 撞墙归因每方向一次(原则 7);迷茫 L2 缩小/L3 演示;坐标存档续玩 - simon R3:新手三音色,按实力渐进解锁(+up/down/dt);失败表替代机会账 (归因 2s 内→免费重听→放慢→结算,原则 15);播放期手势=busy 回执 测试:三款 playtest 重写(含 §6.2 乱点机器人:无声操作/被动重复/打断失败全 0, 首操作 ~2s);guide.test 改为 Guide 层单测+rhythm/space 段。全部通过 (38+33+22+72+19+35 断言)。设计单见 docs/design/26-apply-*.md。
This commit is contained in:
@@ -300,6 +300,18 @@ export class WebAudioEngine {
|
||||
this._unduckBgm();
|
||||
}
|
||||
|
||||
/**
|
||||
* 语音链级压低持有(26 号文档 §4.1「音乐压低要跨整条链」):游戏层用
|
||||
* onComplete 一句句接起来的链,句间引擎队列是空的、会恢复音乐音量,
|
||||
* 玩家就听到一次「好像轮到我了」。Floor 在整条链期间持有一份压低,
|
||||
* 链结束/被打断时释放。可重入(计数)。
|
||||
* @param {boolean} on true=持有一份压低;false=释放一份
|
||||
*/
|
||||
holdDuck(on) {
|
||||
this._duckHolds = Math.max(0, (this._duckHolds || 0) + (on ? 1 : -1));
|
||||
if (on) this._duckBgm();
|
||||
}
|
||||
|
||||
/**
|
||||
* 跳过当前对白:停掉当前 voice 并**视为这句自然播完**——触发其
|
||||
* onComplete(链播下一句)并继续等待队列。与 stopVoice 的差异:
|
||||
@@ -443,6 +455,7 @@ export class WebAudioEngine {
|
||||
}
|
||||
|
||||
_unduckBgm() {
|
||||
if (this._duckHolds > 0) return; // Floor 持有链级压低:句间不恢复(26 号 §4.1)
|
||||
if (this._bgmBus) this._fadeGain(this._bgmBus, 1, this.duckMs);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user