From cbd0232d153580b2e6084ed2f740785c837c905c Mon Sep 17 00:00:00 2001 From: xiaoxustudio Date: Thu, 5 Feb 2026 13:35:39 +0800 Subject: [PATCH 1/2] feat: add nobreak argument for wait --- .../src/Core/controller/gamePlay/nextSentence.ts | 5 +++++ packages/webgal/src/Core/gameScripts/wait.ts | 12 ++++++++++++ packages/webgal/src/store/GUIReducer.ts | 6 ++++++ packages/webgal/src/store/guiInterface.ts | 1 + 4 files changed, 24 insertions(+) diff --git a/packages/webgal/src/Core/controller/gamePlay/nextSentence.ts b/packages/webgal/src/Core/controller/gamePlay/nextSentence.ts index 7cb4a9f78..46022eaf3 100644 --- a/packages/webgal/src/Core/controller/gamePlay/nextSentence.ts +++ b/packages/webgal/src/Core/controller/gamePlay/nextSentence.ts @@ -24,6 +24,11 @@ export const nextSentence = () => { return; } + // 如果处于 wait 指令的不可中断状态,那么不进行下一句 + if (GUIState.waitNoBreak) { + return; + } + // 第一步,检查是否存在 blockNext 的演出 let isBlockingNext = false; WebGAL.gameplay.performController.performList.forEach((e) => { diff --git a/packages/webgal/src/Core/gameScripts/wait.ts b/packages/webgal/src/Core/gameScripts/wait.ts index 17380d094..51b843ade 100644 --- a/packages/webgal/src/Core/gameScripts/wait.ts +++ b/packages/webgal/src/Core/gameScripts/wait.ts @@ -1,5 +1,8 @@ import { ISentence } from '@/Core/controller/scene/sceneInterface'; import { IPerform } from '@/Core/Modules/perform/performInterface'; +import { setWaitNoBreak } from '@/store/GUIReducer'; +import { webgalStore } from '@/store/store'; +import { getBooleanArgByKey } from '../util/getSentenceArg'; /** * 等待 n 毫秒 @@ -8,6 +11,15 @@ import { IPerform } from '@/Core/Modules/perform/performInterface'; export const wait = (sentence: ISentence): IPerform => { const duration = Number(sentence.content); const performName = `wait${Math.random().toString()}`; + const nobreak = getBooleanArgByKey(sentence, 'nobreak') ?? false; + + if (nobreak) { + webgalStore.dispatch(setWaitNoBreak(true)); + setTimeout(() => { + webgalStore.dispatch(setWaitNoBreak(false)); + }, duration); + } + return { performName, duration: duration, diff --git a/packages/webgal/src/store/GUIReducer.ts b/packages/webgal/src/store/GUIReducer.ts index 7d87e2439..392e15f41 100644 --- a/packages/webgal/src/store/GUIReducer.ts +++ b/packages/webgal/src/store/GUIReducer.ts @@ -33,6 +33,7 @@ const initState: IGuiState = { isShowLogo: true, enableAppreciationMode: false, // Paf87 fontOptimization: false, + waitNoBreak: false, }; /** @@ -87,6 +88,10 @@ const GUISlice = createSlice({ setFontOptions: (state, action: PayloadAction) => { state.fontOptions = [...action.payload]; }, + + setWaitNoBreak: (state, action: PayloadAction) => { + state.waitNoBreak = action.payload; + }, }, }); @@ -98,6 +103,7 @@ export const { setEnableAppreciationMode, setFontOptimization, setFontOptions, + setWaitNoBreak, } = GUISlice.actions; export default GUISlice.reducer; diff --git a/packages/webgal/src/store/guiInterface.ts b/packages/webgal/src/store/guiInterface.ts index 1fc4fdaeb..84af0a752 100644 --- a/packages/webgal/src/store/guiInterface.ts +++ b/packages/webgal/src/store/guiInterface.ts @@ -30,6 +30,7 @@ export interface IGuiState { isShowLogo: boolean; enableAppreciationMode: boolean; // Pc102 fontOptimization: boolean; // 字体优化 + waitNoBreak: boolean; // 处于不可中断的等待 } export type componentsVisibility = Pick< From 9920561034a7caaf68b33fbd4423a75886226996 Mon Sep 17 00:00:00 2001 From: xiaoxustudio Date: Thu, 5 Feb 2026 13:44:31 +0800 Subject: [PATCH 2/2] feat: change stop logic --- packages/webgal/src/Core/gameScripts/wait.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/webgal/src/Core/gameScripts/wait.ts b/packages/webgal/src/Core/gameScripts/wait.ts index 51b843ade..dc4b57e4c 100644 --- a/packages/webgal/src/Core/gameScripts/wait.ts +++ b/packages/webgal/src/Core/gameScripts/wait.ts @@ -13,19 +13,16 @@ export const wait = (sentence: ISentence): IPerform => { const performName = `wait${Math.random().toString()}`; const nobreak = getBooleanArgByKey(sentence, 'nobreak') ?? false; - if (nobreak) { - webgalStore.dispatch(setWaitNoBreak(true)); - setTimeout(() => { - webgalStore.dispatch(setWaitNoBreak(false)); - }, duration); - } + if (nobreak) webgalStore.dispatch(setWaitNoBreak(true)); return { performName, duration: duration, goNextWhenOver: true, isHoldOn: false, - stopFunction: () => {}, + stopFunction: () => { + webgalStore.dispatch(setWaitNoBreak(false)); + }, blockingNext: () => false, blockingAuto: () => true, stopTimeout: undefined, // 暂时不用,后面会交给自动清除