From 37b0c40efdba0ffcfcd8fa5029558b2a6c41903c Mon Sep 17 00:00:00 2001 From: PleGGen Date: Sat, 13 Jun 2026 19:17:03 +0800 Subject: [PATCH 1/3] fix(backlog): stop other backlog audio and game vocal on click MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backlog 界面点击语音按钮时只调用 play(),未暂停其他 正在播放的 backlog 音频元素,导致多条语音同时播放。 同时未暂停游戏内正在播放的 currentVocal 语音, 点击 backlog 语音时与游戏内语音混合。 通过 querySelectorAll 匹配所有 backlog audio 元素, 在播放新语音前暂停并重置其他元素;同时暂停并重置 currentVocal 元素以避免与 backlog 语音混合。 Closes #866 --- packages/webgal/src/UI/Backlog/Backlog.tsx | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/webgal/src/UI/Backlog/Backlog.tsx b/packages/webgal/src/UI/Backlog/Backlog.tsx index 878f79f20..89adba5cb 100644 --- a/packages/webgal/src/UI/Backlog/Backlog.tsx +++ b/packages/webgal/src/UI/Backlog/Backlog.tsx @@ -127,10 +127,24 @@ export const Backlog = () => {
{ playSeClick(); + // 暂停其他所有正在播放的 backlog 语音,避免多条音频混合 + const currentAudioId = 'backlog_audio_play_element_' + indexOfBacklog; + document + .querySelectorAll('[id^="backlog_audio_play_element_"]') + .forEach((audio: any) => { + if (audio.id !== currentAudioId) { + audio.pause(); + audio.currentTime = 0; + } + }); + // 暂停游戏内正在播放的语音,避免与 backlog 语音混合 + const currentVocal = document.getElementById('currentVocal') as HTMLAudioElement | null; + if (currentVocal) { + currentVocal.pause(); + currentVocal.currentTime = 0; + } // 获取到播放 backlog 语音的元素 - const backlog_audio_element: any = document.getElementById( - 'backlog_audio_play_element_' + indexOfBacklog, - ); + const backlog_audio_element: any = document.getElementById(currentAudioId); if (backlog_audio_element) { backlog_audio_element.currentTime = 0; const userDataStore = webgalStore.getState().userData; From 5b5b79dc874ae2592c1d97ac8300218f554d57e1 Mon Sep 17 00:00:00 2001 From: PleGGen Date: Sat, 13 Jun 2026 19:17:28 +0800 Subject: [PATCH 2/3] fix(autoplay): pause auto play while Backlog is open MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backlog 打开时自动播放不应推进剧情,否则在历史界面 点选 backlog 语音暂停 currentVocal 后,auto 会立即推进 到下一句对话并触发新的 vocal 播放,导致 Backlog 中听到 两条声音。 - autoPlay 在 Backlog 打开时直接 return,避免推进 - Backlog 点击 backlog 语音时同时 unmount vocal-play perform,清理外部 pause 留下的状态不一致 属于 #866 修复的延伸场景。 --- packages/webgal/src/Core/controller/gamePlay/autoPlay.ts | 4 ++++ packages/webgal/src/UI/Backlog/Backlog.tsx | 2 ++ 2 files changed, 6 insertions(+) diff --git a/packages/webgal/src/Core/controller/gamePlay/autoPlay.ts b/packages/webgal/src/Core/controller/gamePlay/autoPlay.ts index 575ae7d41..9f2052fc3 100644 --- a/packages/webgal/src/Core/controller/gamePlay/autoPlay.ts +++ b/packages/webgal/src/Core/controller/gamePlay/autoPlay.ts @@ -59,6 +59,10 @@ const autoPlay = () => { const data = webgalStore.getState().userData.optionData.autoSpeed; // 范围为 [250, 1750] const autoPlayDelay = 250 + (100 - data) * 15; + // Backlog 打开时不推进,避免在历史界面里自动播放导致剧情继续 + if (webgalStore.getState().GUI.showBacklog) { + return; + } let isBlockingAuto = false; WebGAL.gameplay.performController.performList.forEach((e) => { if (e.blockingAuto()) diff --git a/packages/webgal/src/UI/Backlog/Backlog.tsx b/packages/webgal/src/UI/Backlog/Backlog.tsx index 89adba5cb..d33188c8a 100644 --- a/packages/webgal/src/UI/Backlog/Backlog.tsx +++ b/packages/webgal/src/UI/Backlog/Backlog.tsx @@ -143,6 +143,8 @@ export const Backlog = () => { currentVocal.pause(); currentVocal.currentTime = 0; } + // 卸载 vocal-play perform,避免其 blockingAuto 阻塞自动播放 + WebGAL.gameplay.performController.unmountPerform('vocal-play', true); // 获取到播放 backlog 语音的元素 const backlog_audio_element: any = document.getElementById(currentAudioId); if (backlog_audio_element) { From c7cd1bcc84704b7608b8e0ce7e792970101fad17 Mon Sep 17 00:00:00 2001 From: PleGGen Date: Mon, 15 Jun 2026 21:25:18 +0800 Subject: [PATCH 3/3] refactor(backlog): unconditionally pause all backlog audios MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除 'audio.id !== currentAudioId' 排除判断。后续逻辑会 重置并播放当前音频(currentTime = 0 + play()),故前置 pause 不需要排除当前。简化代码,无功能差异。 反馈来源:PR review --- packages/webgal/src/UI/Backlog/Backlog.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/webgal/src/UI/Backlog/Backlog.tsx b/packages/webgal/src/UI/Backlog/Backlog.tsx index d33188c8a..30234d533 100644 --- a/packages/webgal/src/UI/Backlog/Backlog.tsx +++ b/packages/webgal/src/UI/Backlog/Backlog.tsx @@ -127,15 +127,12 @@ export const Backlog = () => {
{ playSeClick(); - // 暂停其他所有正在播放的 backlog 语音,避免多条音频混合 - const currentAudioId = 'backlog_audio_play_element_' + indexOfBacklog; + // 暂停所有 backlog 语音(包括当前;后续会重置并播放当前) document .querySelectorAll('[id^="backlog_audio_play_element_"]') .forEach((audio: any) => { - if (audio.id !== currentAudioId) { - audio.pause(); - audio.currentTime = 0; - } + audio.pause(); + audio.currentTime = 0; }); // 暂停游戏内正在播放的语音,避免与 backlog 语音混合 const currentVocal = document.getElementById('currentVocal') as HTMLAudioElement | null; @@ -146,7 +143,9 @@ export const Backlog = () => { // 卸载 vocal-play perform,避免其 blockingAuto 阻塞自动播放 WebGAL.gameplay.performController.unmountPerform('vocal-play', true); // 获取到播放 backlog 语音的元素 - const backlog_audio_element: any = document.getElementById(currentAudioId); + const backlog_audio_element: any = document.getElementById( + 'backlog_audio_play_element_' + indexOfBacklog, + ); if (backlog_audio_element) { backlog_audio_element.currentTime = 0; const userDataStore = webgalStore.getState().userData;