From 9d14899db5dd1b18bb691cb86d32bbd2d2e76826 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Mon, 22 Jul 2024 21:08:47 +0800 Subject: [PATCH 01/17] fix: match style-alltext. --- packages/webgal/src/Stage/TextBox/TextBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webgal/src/Stage/TextBox/TextBox.tsx b/packages/webgal/src/Stage/TextBox/TextBox.tsx index cdfaad11c..87b569d39 100644 --- a/packages/webgal/src/Stage/TextBox/TextBox.tsx +++ b/packages/webgal/src/Stage/TextBox/TextBox.tsx @@ -231,7 +231,7 @@ function parseString(input: string): Segment[] { const enhance = match[3]; let parsedEnhanced: KeyValuePair[] = []; let ruby = ''; - if (enhance.match(/style=|tips=|ruby=/)) { + if (enhance.match(/style=|tips=|ruby=|style-alltext=/)) { parsedEnhanced = parseEnhancedString(enhance); } else { ruby = enhance; From b227488fbd06d82f7940830b77bba4e4b5d26599 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Sun, 28 Jul 2024 14:46:52 +0800 Subject: [PATCH 02/17] fix: '-concat' option animation error in new line --- packages/webgal/src/Stage/TextBox/IMSSTextbox.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webgal/src/Stage/TextBox/IMSSTextbox.tsx b/packages/webgal/src/Stage/TextBox/IMSSTextbox.tsx index 12cde162a..b6179a4a0 100644 --- a/packages/webgal/src/Stage/TextBox/IMSSTextbox.tsx +++ b/packages/webgal/src/Stage/TextBox/IMSSTextbox.tsx @@ -71,12 +71,12 @@ export default function IMSSTextbox(props: ITextboxProps) { let delay = allTextIndex * textDelay; allTextIndex++; let prevLength = currentConcatDialogPrev.length; - if (currentConcatDialogPrev !== '' && index >= prevLength) { + if (currentConcatDialogPrev !== '' && allTextIndex >= prevLength) { delay = delay - prevLength * textDelay; } const styleClassName = ' ' + css(style); const styleAllText = ' ' + css(style_alltext); - if (index < prevLength) { + if (allTextIndex < prevLength) { return ( Date: Sat, 3 Aug 2024 21:23:38 +0800 Subject: [PATCH 03/17] fix: ruby not display when style defined --- packages/webgal/src/Stage/TextBox/TextBox.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/webgal/src/Stage/TextBox/TextBox.tsx b/packages/webgal/src/Stage/TextBox/TextBox.tsx index 87b569d39..fb349516d 100644 --- a/packages/webgal/src/Stage/TextBox/TextBox.tsx +++ b/packages/webgal/src/Stage/TextBox/TextBox.tsx @@ -233,6 +233,10 @@ function parseString(input: string): Segment[] { let ruby = ''; if (enhance.match(/style=|tips=|ruby=|style-alltext=/)) { parsedEnhanced = parseEnhancedString(enhance); + const rubyKvPair = parsedEnhanced.find((e) => e.key === 'ruby'); + if (rubyKvPair) { + ruby = rubyKvPair.value; + } } else { ruby = enhance; } From 833efedb8252ea43425d3c415d533425a0b77eea Mon Sep 17 00:00:00 2001 From: Mahiru Date: Sat, 17 Aug 2024 01:06:15 +0800 Subject: [PATCH 04/17] feat: impl -continue arg --- .../src/Core/Modules/perform/performController.ts | 14 ++++++++++---- packages/webgal/src/Core/gameScripts/intro.tsx | 5 ++--- packages/webgal/src/Core/gameScripts/playVideo.tsx | 2 -- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/webgal/src/Core/Modules/perform/performController.ts b/packages/webgal/src/Core/Modules/perform/performController.ts index b26f55d9d..54dccad4f 100644 --- a/packages/webgal/src/Core/Modules/perform/performController.ts +++ b/packages/webgal/src/Core/Modules/perform/performController.ts @@ -35,13 +35,11 @@ export class PerformController { if (!perform.isHoldOn) { // 如果不是保持演出,清除 this.unmountPerform(perform.performName); - if (perform.goNextWhenOver) { - // nextSentence(); - this.goNextWhenOver(); - } } }, perform.duration); + if (script.args.find((e) => e.key === 'continue' && e.value === true)) perform.goNextWhenOver = true; + this.performList.push(perform); } @@ -52,6 +50,10 @@ export class PerformController { if (!e.isHoldOn && e.performName === name) { e.stopFunction(); clearTimeout(e.stopTimeout as unknown as number); + if (e.goNextWhenOver) { + // nextSentence(); + this.goNextWhenOver(); + } this.performList.splice(i, 1); i--; } @@ -62,6 +64,10 @@ export class PerformController { if (e.performName === name) { e.stopFunction(); clearTimeout(e.stopTimeout as unknown as number); + if (e.goNextWhenOver) { + // nextSentence(); + this.goNextWhenOver(); + } this.performList.splice(i, 1); i--; /** diff --git a/packages/webgal/src/Core/gameScripts/intro.tsx b/packages/webgal/src/Core/gameScripts/intro.tsx index cdbf65e23..919727987 100644 --- a/packages/webgal/src/Core/gameScripts/intro.tsx +++ b/packages/webgal/src/Core/gameScripts/intro.tsx @@ -87,7 +87,7 @@ export const intro = (sentence: ISentence): IPerform => { let endWait = 1000; let baseDuration = endWait + delayTime * introArray.length; - const duration = isHold ? 1000 * 60 * 60 * 24 : 1000 + delayTime * introArray.length; + const duration = 1000 + delayTime * introArray.length; let isBlocking = true; let setBlockingStateTimeout = setTimeout(() => { isBlocking = false; @@ -127,7 +127,6 @@ export const intro = (sentence: ISentence): IPerform => { if (!isHold) { timeout = setTimeout(() => { WebGAL.gameplay.performController.unmountPerform(performName); - setTimeout(nextSentence, 0); }, baseDuration); } } @@ -178,6 +177,6 @@ export const intro = (sentence: ISentence): IPerform => { blockingNext: () => isBlocking, blockingAuto: () => isBlocking, stopTimeout: undefined, // 暂时不用,后面会交给自动清除 - goNextWhenOver: true, + goNextWhenOver: !isHold, }; }; diff --git a/packages/webgal/src/Core/gameScripts/playVideo.tsx b/packages/webgal/src/Core/gameScripts/playVideo.tsx index 1d137fe14..f57e41fdd 100644 --- a/packages/webgal/src/Core/gameScripts/playVideo.tsx +++ b/packages/webgal/src/Core/gameScripts/playVideo.tsx @@ -4,7 +4,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; import styles from '@/Stage/FullScreenPerform/fullScreenPerform.module.scss'; import { webgalStore } from '@/store/store'; -import { nextSentence } from '@/Core/controller/gamePlay/nextSentence'; import { getRandomPerformName, PerformController } from '@/Core/Modules/perform/performController'; import { getSentenceArgByKey } from '@/Core/util/getSentenceArg'; import { WebGAL } from '@/Core/WebGAL'; @@ -55,7 +54,6 @@ export const playVideo = (sentence: ISentence): IPerform => { isOver = true; e.stopFunction(); WebGAL.gameplay.performController.unmountPerform(e.performName); - nextSentence(); } } }; From 2fc161b52a48b63cecbe3051c87a251f490d7de6 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Sat, 17 Aug 2024 01:23:29 +0800 Subject: [PATCH 05/17] fix: hold problem of intro --- packages/webgal/src/Core/controller/gamePlay/nextSentence.ts | 2 ++ packages/webgal/src/Core/gameScripts/intro.tsx | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/webgal/src/Core/controller/gamePlay/nextSentence.ts b/packages/webgal/src/Core/controller/gamePlay/nextSentence.ts index 2699ef181..97c72b5a8 100644 --- a/packages/webgal/src/Core/controller/gamePlay/nextSentence.ts +++ b/packages/webgal/src/Core/controller/gamePlay/nextSentence.ts @@ -72,6 +72,7 @@ export const nextSentence = () => { isGoNext = true; } if (!e.skipNextCollect) { + // 由于提前结束使用的不是 unmountPerform 标准 API,所以不会触发两次 nextSentence e.stopFunction(); clearTimeout(e.stopTimeout as unknown as number); WebGAL.gameplay.performController.performList.splice(i, 1); @@ -80,6 +81,7 @@ export const nextSentence = () => { } } if (isGoNext) { + // 由于不使用 unmountPerform 标准 API,这里需要手动收集一下 isGoNext nextSentence(); } }; diff --git a/packages/webgal/src/Core/gameScripts/intro.tsx b/packages/webgal/src/Core/gameScripts/intro.tsx index 919727987..fd984ae4c 100644 --- a/packages/webgal/src/Core/gameScripts/intro.tsx +++ b/packages/webgal/src/Core/gameScripts/intro.tsx @@ -87,7 +87,7 @@ export const intro = (sentence: ISentence): IPerform => { let endWait = 1000; let baseDuration = endWait + delayTime * introArray.length; - const duration = 1000 + delayTime * introArray.length; + const duration = isHold ? 1000 * 60 * 60 * 24 : 1000 + delayTime * introArray.length; let isBlocking = true; let setBlockingStateTimeout = setTimeout(() => { isBlocking = false; @@ -177,6 +177,6 @@ export const intro = (sentence: ISentence): IPerform => { blockingNext: () => isBlocking, blockingAuto: () => isBlocking, stopTimeout: undefined, // 暂时不用,后面会交给自动清除 - goNextWhenOver: !isHold, + goNextWhenOver: true, }; }; From 2fc9a04cfc7036bccd9edc769aa7715029e50d42 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Sat, 17 Aug 2024 01:46:48 +0800 Subject: [PATCH 06/17] =?UTF-8?q?fix:=20performList=20=E7=A5=9E=E7=A7=98?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/webgal/public/game/scene/demo_zh_cn.txt | 2 +- packages/webgal/src/Core/Modules/perform/performController.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webgal/public/game/scene/demo_zh_cn.txt b/packages/webgal/public/game/scene/demo_zh_cn.txt index 263138674..c6230e31b 100644 --- a/packages/webgal/public/game/scene/demo_zh_cn.txt +++ b/packages/webgal/public/game/scene/demo_zh_cn.txt @@ -13,7 +13,7 @@ miniAvatar:miniavatar.png; changeFigure:stand2.png -right -next; {egine} 是使用 Web 技术开发的引擎,因此在网页端有良好的表现。 -v2.wav; 由于这个特性,如果你将 {egine} 部署到服务器或网页托管平台上,玩家只需要一串链接就可以开始游玩! -v3.wav; -setAnimation:move-front-and-back -target=fig-left -next; +setAnimation:move-front-and-back -target=fig-left -continue; 听起来是不是非常吸引人? -v4.wav; changeFigure:none -right -next; setTransform:{"position": {"x": 500,"y": 0}} -target=fig-left -next; diff --git a/packages/webgal/src/Core/Modules/perform/performController.ts b/packages/webgal/src/Core/Modules/perform/performController.ts index 54dccad4f..cfdc46903 100644 --- a/packages/webgal/src/Core/Modules/perform/performController.ts +++ b/packages/webgal/src/Core/Modules/perform/performController.ts @@ -95,7 +95,7 @@ export class PerformController { private goNextWhenOver() { let isBlockingAuto = false; - this.performList.forEach((e) => { + this.performList?.forEach((e) => { if (e.blockingAuto()) // 阻塞且没有结束的演出 isBlockingAuto = true; From 16664f3f5ddfbba22691e8baeeff22c0395f0e6f Mon Sep 17 00:00:00 2001 From: Mahiru Date: Sat, 17 Aug 2024 02:15:08 +0800 Subject: [PATCH 07/17] fix: say delay calculate --- packages/webgal/src/Core/gameScripts/say.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/webgal/src/Core/gameScripts/say.ts b/packages/webgal/src/Core/gameScripts/say.ts index 5267c3476..9048c4365 100644 --- a/packages/webgal/src/Core/gameScripts/say.ts +++ b/packages/webgal/src/Core/gameScripts/say.ts @@ -8,6 +8,7 @@ import { getRandomPerformName, PerformController } from '@/Core/Modules/perform/ import { getSentenceArgByKey } from '@/Core/util/getSentenceArg'; import { textSize, voiceOption } from '@/store/userDataInterface'; import { WebGAL } from '@/Core/WebGAL'; +import { compileSentence } from '@/Stage/TextBox/TextBox'; /** * 进行普通对话的显示 @@ -50,7 +51,9 @@ export const say = (sentence: ISentence): IPerform => { // 计算延迟 const textDelay = useTextDelay(userDataState.optionData.textSpeed); // 本句延迟 - const sentenceDelay = textDelay * sentence.content.length; + const textNodes = compileSentence(sentence.content, 3); + const len = textNodes.reduce((prev, curr) => prev + curr.length, 0); + const sentenceDelay = textDelay * len; for (const e of sentence.args) { if (e.key === 'fontSize') { From 74b9984b1e73e404362f453259569e80eb3f49e0 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Mon, 19 Aug 2024 20:59:09 +0800 Subject: [PATCH 08/17] =?UTF-8?q?fix:=20restoreScene=20=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E7=AB=9E=E4=BA=89=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Core/controller/scene/restoreScene.ts | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/webgal/src/Core/controller/scene/restoreScene.ts b/packages/webgal/src/Core/controller/scene/restoreScene.ts index b75e5b44d..1486c272c 100644 --- a/packages/webgal/src/Core/controller/scene/restoreScene.ts +++ b/packages/webgal/src/Core/controller/scene/restoreScene.ts @@ -11,11 +11,21 @@ import { WebGAL } from '@/Core/WebGAL'; * @param entry 场景入口 */ export const restoreScene = (entry: ISceneEntry) => { + if (WebGAL.sceneManager.lockSceneWrite) { + return; + } + WebGAL.sceneManager.lockSceneWrite = true; // 场景写入到运行时 - sceneFetcher(entry.sceneUrl).then((rawScene) => { - WebGAL.sceneManager.sceneData.currentScene = sceneParser(rawScene, entry.sceneName, entry.sceneUrl); - WebGAL.sceneManager.sceneData.currentSentenceId = entry.continueLine + 1; // 重设场景 - logger.debug('现在恢复场景,恢复后场景:', WebGAL.sceneManager.sceneData.currentScene); - nextSentence(); - }); + sceneFetcher(entry.sceneUrl) + .then((rawScene) => { + WebGAL.sceneManager.sceneData.currentScene = sceneParser(rawScene, entry.sceneName, entry.sceneUrl); + WebGAL.sceneManager.sceneData.currentSentenceId = entry.continueLine + 1; // 重设场景 + logger.debug('现在恢复场景,恢复后场景:', WebGAL.sceneManager.sceneData.currentScene); + WebGAL.sceneManager.lockSceneWrite = false; + nextSentence(); + }) + .catch((e) => { + logger.error('场景调用错误', e); + WebGAL.sceneManager.lockSceneWrite = false; + }); }; From b42ca3b4181fe0628c9d270fa37987ef08bd28b0 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Mon, 19 Aug 2024 21:32:08 +0800 Subject: [PATCH 09/17] fix: delete closed free figure --- packages/webgal/src/store/stageReducer.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/webgal/src/store/stageReducer.ts b/packages/webgal/src/store/stageReducer.ts index 0eb86aa94..37c9abb1a 100644 --- a/packages/webgal/src/store/stageReducer.ts +++ b/packages/webgal/src/store/stageReducer.ts @@ -137,8 +137,17 @@ const stageSlice = createSlice({ const newFigure = action.payload; const index = currentFreeFigures.findIndex((figure) => figure.key === newFigure.key); if (index >= 0) { - currentFreeFigures[index].basePosition = newFigure.basePosition; - currentFreeFigures[index].name = newFigure.name; + if (newFigure.name === '') { + // 删掉立绘和相关的动画 + currentFreeFigures.splice(index, 1); + const figureAssociatedAnimationIndex = state.figureAssociatedAnimation.findIndex( + (a) => a.targetId === newFigure.key, + ); + state.figureAssociatedAnimation.splice(figureAssociatedAnimationIndex, 1); + } else { + currentFreeFigures[index].basePosition = newFigure.basePosition; + currentFreeFigures[index].name = newFigure.name; + } } else { // 新加 if (newFigure.name !== '') currentFreeFigures.push(newFigure); From 8891431ea8557def1c4e04d08b07d60c9286dbea Mon Sep 17 00:00:00 2001 From: hundun Date: Thu, 22 Aug 2024 13:57:04 +0800 Subject: [PATCH 10/17] fix: var value handle --- .../controller/gamePlay/scriptExecutor.ts | 8 +++--- .../webgal/src/Core/gameScripts/setVar.ts | 28 ++++++++++++++----- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/packages/webgal/src/Core/controller/gamePlay/scriptExecutor.ts b/packages/webgal/src/Core/controller/gamePlay/scriptExecutor.ts index eb07f7684..db7d6d0ca 100644 --- a/packages/webgal/src/Core/controller/gamePlay/scriptExecutor.ts +++ b/packages/webgal/src/Core/controller/gamePlay/scriptExecutor.ts @@ -4,7 +4,7 @@ import { logger } from '../../util/logger'; import { IStageState } from '@/store/stageInterface'; import { restoreScene } from '../scene/restoreScene'; import { webgalStore } from '@/store/store'; -import { getValueFromState } from '@/Core/gameScripts/setVar'; +import { getValueFromStateElseKey } from '@/Core/gameScripts/setVar'; import { strIf } from '@/Core/controller/gamePlay/strIf'; import { nextSentence } from '@/Core/controller/gamePlay/nextSentence'; import cloneDeep from 'lodash/cloneDeep'; @@ -25,7 +25,7 @@ export const whenChecker = (whenValue: string | undefined): boolean => { if (e.match(/true/) || e.match(/false/)) { return e; } - return getValueFromState(e).toString(); + return getValueFromStateElseKey(e); } else return e; }) .reduce((pre, curr) => pre + curr, ''); @@ -59,8 +59,8 @@ export const scriptExecutor = () => { if (contentExp !== null) { contentExp.forEach((e) => { - const contentVarValue = getValueFromState(e.replace(/(? { // 将变量替换为变量的值,然后合成表达式字符串 const valExp2 = valExpArr .map((e) => { - if (e.match(/\$?[.a-zA-Z]/)) { - return String(getValueFromState(e.trim())); - } else return e; + return getValueFromStateElseKey(e.trim()); }) .reduce((pre, curr) => pre + curr, ''); const exp = compile(valExp2); @@ -54,11 +52,13 @@ export const setVar = (sentence: ISentence): IPerform => { if (valExp.match(/false/)) { webgalStore.dispatch(targetReducerFunction({ key, value: false })); } + } else if (valExp.length == 0) { + webgalStore.dispatch(targetReducerFunction({ key, value: '' })); } else { if (!isNaN(Number(valExp))) { webgalStore.dispatch(targetReducerFunction({ key, value: Number(valExp) })); } else { - webgalStore.dispatch(targetReducerFunction({ key, value: valExp })); + webgalStore.dispatch(targetReducerFunction({ key, value: getValueFromStateElseKey(valExp) })); } } if (setGlobal) { @@ -79,10 +79,13 @@ export const setVar = (sentence: ISentence): IPerform => { }; }; -type BaseVal = string | number | boolean; +type BaseVal = string | number | boolean | undefined; +/** + * 取不到时返回 undefined + */ export function getValueFromState(key: string) { - let ret: any = 0; + let ret: any = undefined; const stage = webgalStore.getState().stage; const userData = webgalStore.getState().userData; const _Merge = { stage, userData }; // 不要直接合并到一起,防止可能的键冲突 @@ -92,7 +95,18 @@ export function getValueFromState(key: string) { ret = userData.globalGameVar[key]; } else if (key.startsWith('$')) { const propertyKey = key.replace('$', ''); - ret = get(_Merge, propertyKey, 0) as BaseVal; + ret = get(_Merge, propertyKey, undefined) as BaseVal; } return ret; } + +/** + * 取不到时返回 key + */ +export function getValueFromStateElseKey(key: string) { + const valueFromState = getValueFromState(key); + if (valueFromState == null) { + logger.warn('valueFromState result null, key = ' + key); + } + return valueFromState != null ? valueFromState : key; +} From 0b6849e5bd2edf067566791db8daec65b4ca136f Mon Sep 17 00:00:00 2001 From: xiaoxustudio <1783558957@qq.com> Date: Thu, 22 Aug 2024 19:12:06 +0800 Subject: [PATCH 11/17] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8DsetVar=E8=BF=9B?= =?UTF-8?q?=E8=A1=8Ccompile=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=97=B6=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/webgal/src/Core/gameScripts/setVar.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/webgal/src/Core/gameScripts/setVar.ts b/packages/webgal/src/Core/gameScripts/setVar.ts index 7cec5c2dc..bd48bb6a5 100644 --- a/packages/webgal/src/Core/gameScripts/setVar.ts +++ b/packages/webgal/src/Core/gameScripts/setVar.ts @@ -40,7 +40,8 @@ export const setVar = (sentence: ISentence): IPerform => { const valExp2 = valExpArr .map((e) => { if (e.match(/\$?[.a-zA-Z]/)) { - return String(getValueFromState(e.trim())); + const _r = getValueFromState(e.trim()); + return typeof _r === 'string' ? `'${_r}'` : _r; } else return e; }) .reduce((pre, curr) => pre + curr, ''); From 49fe482e75c2bb561dd3be7e5a74887a7fabf3e4 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Thu, 22 Aug 2024 19:52:28 +0800 Subject: [PATCH 12/17] add try catch --- packages/webgal/src/Core/gameScripts/setVar.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/webgal/src/Core/gameScripts/setVar.ts b/packages/webgal/src/Core/gameScripts/setVar.ts index bd48bb6a5..c29e70f3a 100644 --- a/packages/webgal/src/Core/gameScripts/setVar.ts +++ b/packages/webgal/src/Core/gameScripts/setVar.ts @@ -45,8 +45,13 @@ export const setVar = (sentence: ISentence): IPerform => { } else return e; }) .reduce((pre, curr) => pre + curr, ''); - const exp = compile(valExp2); - const result = exp(); + let result = ''; + try { + const exp = compile(valExp2); + result = exp(); + } catch (e) { + logger.error('expression compile error', e); + } webgalStore.dispatch(targetReducerFunction({ key, value: result })); } else if (valExp.match(/true|false/)) { if (valExp.match(/true/)) { From 444d188453e464a364e44d577cc412bfaace589b Mon Sep 17 00:00:00 2001 From: Mahiru Date: Thu, 22 Aug 2024 20:01:29 +0800 Subject: [PATCH 13/17] enhance getValueFromState --- packages/webgal/src/Core/gameScripts/setVar.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/webgal/src/Core/gameScripts/setVar.ts b/packages/webgal/src/Core/gameScripts/setVar.ts index 81a4d5ca6..a996bb8be 100644 --- a/packages/webgal/src/Core/gameScripts/setVar.ts +++ b/packages/webgal/src/Core/gameScripts/setVar.ts @@ -39,10 +39,8 @@ export const setVar = (sentence: ISentence): IPerform => { // 将变量替换为变量的值,然后合成表达式字符串 const valExp2 = valExpArr .map((e) => { - if (e.match(/\$?[.a-zA-Z]/)) { - const _r = getValueFromStateElseKey(e.trim()); - return typeof _r === 'string' ? `'${_r}'` : _r; - } else return e; + const _r = getValueFromStateElseKey(e.trim()); + return typeof _r === 'string' ? `'${_r}'` : _r; }) .reduce((pre, curr) => pre + curr, ''); let result = ''; @@ -60,7 +58,7 @@ export const setVar = (sentence: ISentence): IPerform => { if (valExp.match(/false/)) { webgalStore.dispatch(targetReducerFunction({ key, value: false })); } - } else if (valExp.length == 0) { + } else if (valExp.length === 0) { webgalStore.dispatch(targetReducerFunction({ key, value: '' })); } else { if (!isNaN(Number(valExp))) { @@ -93,7 +91,7 @@ type BaseVal = string | number | boolean | undefined; * 取不到时返回 undefined */ export function getValueFromState(key: string) { - let ret: any = undefined; + let ret: any; const stage = webgalStore.getState().stage; const userData = webgalStore.getState().userData; const _Merge = { stage, userData }; // 不要直接合并到一起,防止可能的键冲突 @@ -113,8 +111,9 @@ export function getValueFromState(key: string) { */ export function getValueFromStateElseKey(key: string) { const valueFromState = getValueFromState(key); - if (valueFromState == null) { + if (valueFromState === null || valueFromState === undefined) { logger.warn('valueFromState result null, key = ' + key); + return key; } - return valueFromState != null ? valueFromState : key; + return valueFromState; } From 7875bba17ecaa5a9e4e462ae3f322982a5d9c69c Mon Sep 17 00:00:00 2001 From: Mahiru Date: Thu, 22 Aug 2024 20:22:24 +0800 Subject: [PATCH 14/17] fix: check is variable name --- packages/webgal/src/Core/gameScripts/setVar.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/webgal/src/Core/gameScripts/setVar.ts b/packages/webgal/src/Core/gameScripts/setVar.ts index a996bb8be..df5fb413b 100644 --- a/packages/webgal/src/Core/gameScripts/setVar.ts +++ b/packages/webgal/src/Core/gameScripts/setVar.ts @@ -39,6 +39,10 @@ export const setVar = (sentence: ISentence): IPerform => { // 将变量替换为变量的值,然后合成表达式字符串 const valExp2 = valExpArr .map((e) => { + if (!e.trim().match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) { + // 检查是否是变量名,不是就返回本身 + return e; + } const _r = getValueFromStateElseKey(e.trim()); return typeof _r === 'string' ? `'${_r}'` : _r; }) From 20e76fac4c6557775c258d7ee1b3f8b6240ce174 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Thu, 22 Aug 2024 21:18:45 +0800 Subject: [PATCH 15/17] fix: variable regexp --- packages/webgal/src/Core/gameScripts/setVar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webgal/src/Core/gameScripts/setVar.ts b/packages/webgal/src/Core/gameScripts/setVar.ts index df5fb413b..3bc391ff5 100644 --- a/packages/webgal/src/Core/gameScripts/setVar.ts +++ b/packages/webgal/src/Core/gameScripts/setVar.ts @@ -39,7 +39,7 @@ export const setVar = (sentence: ISentence): IPerform => { // 将变量替换为变量的值,然后合成表达式字符串 const valExp2 = valExpArr .map((e) => { - if (!e.trim().match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) { + if (!e.trim().match(/^[a-zA-Z_$][a-zA-Z0-9_.]*$/)) { // 检查是否是变量名,不是就返回本身 return e; } From 3e28267de20bd34f4c7ef03bced92097687f16b7 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Sat, 24 Aug 2024 18:14:56 +0800 Subject: [PATCH 16/17] fix: logo image --- .../util/coreInitialFunction/infoFetcher.ts | 33 ++++++++++++------- packages/webgal/src/UI/Logo/Logo.tsx | 2 +- packages/webgal/src/hooks/useConfigData.ts | 15 ++++----- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts b/packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts index f807cd369..333d9f7b9 100644 --- a/packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts +++ b/packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts @@ -34,19 +34,28 @@ export const infoFetcher = (url: string) => { gameConfig.forEach((e) => { const { command, args } = e; if (args.length > 0) { - let res: any = args[0].trim(); - if (/^(true|false)$/g.test(args[0])) { - res = !!res; - } else if (/^[0-9]+\.?[0-9]+$/g.test(args[0])) { - res = Number(res); - } + if (args.length > 1) { + dispatch( + setGlobalVar({ + key: command, + value: args.join('|'), + }), + ); + } else { + let res: any = args[0].trim(); + if (/^(true|false)$/g.test(args[0])) { + res = !!res; + } else if (/^[0-9]+\.?[0-9]+$/g.test(args[0])) { + res = Number(res); + } - dispatch( - setGlobalVar({ - key: command, - value: res, - }), - ); + dispatch( + setGlobalVar({ + key: command, + value: res, + }), + ); + } } }); diff --git a/packages/webgal/src/UI/Logo/Logo.tsx b/packages/webgal/src/UI/Logo/Logo.tsx index c8ed9b799..a1b3eb6b8 100644 --- a/packages/webgal/src/UI/Logo/Logo.tsx +++ b/packages/webgal/src/UI/Logo/Logo.tsx @@ -34,7 +34,7 @@ const Logo: FC = () => { currentLogoIndex.set(0); currentTimeOutId.set(setTimeout(nextImg, animationDuration)); } - }, [isEnterGame, logoImage]); + }, [isEnterGame]); const currentLogoUrl = currentLogoIndex.value === -1 ? '' : logoImage[currentLogoIndex.value]; return ( diff --git a/packages/webgal/src/hooks/useConfigData.ts b/packages/webgal/src/hooks/useConfigData.ts index be2a23b41..830976794 100644 --- a/packages/webgal/src/hooks/useConfigData.ts +++ b/packages/webgal/src/hooks/useConfigData.ts @@ -25,14 +25,13 @@ const useConfigData = () => { setEbg(titleUrl); break; } - /** - * TODO:Game_Logo 是个数组,并且改变后会造成进入游戏界面重新渲染,以后再考虑如何处理 - */ - // case 'Game_Logo': { - // const logoUrlList = [assetSetter(val, fileType.background)]; - // webgalStore.dispatch(setLogoImage(logoUrlList)); - // break; - // } + + case 'Game_Logo': { + const logos = val.split('|'); + const logoUrlList = logos.map((val) => assetSetter(val, fileType.background)); + webgalStore.dispatch(setLogoImage(logoUrlList)); + break; + } case 'Title_bgm': { const bgmUrl = assetSetter(val, fileType.bgm); From 959185e109a5a0663985aa1b7d0d8ca1c6f2e187 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Sat, 24 Aug 2024 21:25:20 +0800 Subject: [PATCH 17/17] update version --- packages/webgal/package.json | 2 +- .../webgal/public/game/template/template.json | 2 +- packages/webgal/src/config/info.ts | 19 +--- releasenote.md | 87 ++++++++++++++----- 4 files changed, 67 insertions(+), 43 deletions(-) diff --git a/packages/webgal/package.json b/packages/webgal/package.json index 29290e283..1d2f930a2 100644 --- a/packages/webgal/package.json +++ b/packages/webgal/package.json @@ -1,7 +1,7 @@ { "name": "webgal", "private": true, - "version": "4.5.4", + "version": "4.5.5", "scripts": { "dev": "vite --host --port 3000", "build": "cross-env NODE_ENV=production tsc && vite build --base=./", diff --git a/packages/webgal/public/game/template/template.json b/packages/webgal/public/game/template/template.json index 58e0b8552..742428439 100644 --- a/packages/webgal/public/game/template/template.json +++ b/packages/webgal/public/game/template/template.json @@ -1,4 +1,4 @@ { "name":"Default Template", - "webgal-version":"4.5.4" + "webgal-version":"4.5.5" } diff --git a/packages/webgal/src/config/info.ts b/packages/webgal/src/config/info.ts index 9edbbfe1e..0cac928f3 100644 --- a/packages/webgal/src/config/info.ts +++ b/packages/webgal/src/config/info.ts @@ -1,21 +1,6 @@ export const __INFO = { - version: 'WebGAL 4.5.4', + version: 'WebGAL 4.5.5', contributors: [ - { username: 'Mahiru', link: 'https://github.com/MakinoharaShoko' }, - { username: 'Hoshinokinya', link: 'https://github.com/hshqwq' }, - { username: 'Junbo Xiong', link: 'https://github.com/C6H5-NO2' }, - { username: 'lykl', link: 'https://github.com/lykl' }, - { username: 'SakuraSnow', link: 'https://github.com/sliyoxn' }, - { username: 'bcqsd', link: 'https://github.com/bcqsd' }, - { username: 'Yuji Sakai', link: 'https://github.com/generalfreed' }, - { username: 'Iara', link: 'https://github.com/labiker' }, - { username: '22', link: 'https://github.com/nini22P' }, - { username: '德布罗煜', link: 'https://github.com/ch1ny' }, - { username: 'Mike Zhou', link: 'https://github.com/mikezzb' }, - { username: 'Murasame0721', link: 'https://github.com/Murasame0721' }, - { username: 'loliko', link: 'https://github.com/loliko114514' }, - { username: 'IdrilK', link: 'https://github.com/IdrilK' }, - { username: 'callofblood', link: 'https://github.com/callofblood' }, - { username: 'lyle', link: 'https://github.com/lylelove' }, + // 现在改为跳转到 GitHub 了 ], }; diff --git a/releasenote.md b/releasenote.md index e4a4f65fd..f1ff0bcff 100644 --- a/releasenote.md +++ b/releasenote.md @@ -8,13 +8,34 @@ #### 新功能 -允许使用脚本修改标题画面等游戏配置选项 - -允许使用变量获取一部分引擎状态 +新增参数,用于控制 “在本条语句的演出结束后,执行下一条”。 #### 修复 -为部分字符添加转义 +修复了 `-concat` 选项动画在新行中的错误。 + +修复了样式定义时 ruby 不显示的问题。 + +修复了 intro 的 hold 问题。 + +修复了 say 延迟计算问题。 + +修复了 restoreScene 中的竞争状态。 + +修复了删除已关闭的自由图形的问题。 + +修复了变量值处理的问题。 + +修复了 setVar 进行 compile 字符串时异常的问题。 + +增强了 getValueFromState。 + +调整了对 `style-alltext` 键的正则匹配,使其可以触发文本框的样式修改。 + +修复了变量正则表达式的问题。 + +修复了 logo 图片的问题。 + ## Release Notes @@ -27,13 +48,34 @@ #### New Features -Allow using scripts to modify game configuration options such as title screen - -Allow using variables to get some engine states +Added a new parameter to control "execute the next statement after the performance of this statement is finished". #### Bug Fixes -Added escaping for some characters +Fixed an animation error with the `-concat` option in a new line. + +Fixed an issue where ruby was not displayed when a style was defined. + +Fixed the hold problem of intro. + +Fixed the say delay calculation problem. + +Fixed a race condition in restoreScene. + +Fixed an issue with deleting closed free figures. + +Fixed the variable value handling problem. + +Fixed an exception when setVar compiled a string. + +Enhanced getValueFromState. + +Adjusted the regular expression matching for the `style-alltext` key to allow it to trigger text box style modifications. + +Fixed the variable regular expression problem. + +Fixed the logo image issue. + ## リリースノート @@ -46,33 +88,30 @@ Added escaping for some characters #### 新機能 -スクリプトを使用してタイトル画面などのゲーム設定オプションを変更できるようになりました - -変数を使用して一部のエンジン状態を取得できるようになりました +「このステートメントの演出終了後に次のステートメントを実行する」を制御するための新しいパラメータが追加されました。 #### 修正 -一部の文字のエスケープを追加しました +`-concat` オプションのアニメーションが新しい行でエラーになる問題を修正しました。 +スタイルが定義されているときにルビが表示されない問題を修正しました。 +イントロのホールド問題を修正しました。 +say 遅延計算の問題を修正しました。 +restoreScene の競合状態を修正しました。 -[//]: # () +閉じたフリーフィギュアを削除する際の問題を修正しました。 -[//]: # (#### Nouvelles fonctionnalités) +変数値処理の問題を修正しました。 -[//]: # () -[//]: # (Prise en charge partielle des styles CSS pour le texte des boîtes de dialogue) +setVar が文字列をコンパイルする際の例外を修正しました。 -[//]: # () -[//]: # (Personnalisation de l'interface des choix) +getValueFromState を強化しました。 -[//]: # () -[//]: # (#### Corrections) +`style-alltext` キーの正規表現マッチングを調整し、テキストボックスのスタイル変更をトリガーできるようにしました。 -[//]: # () -[//]: # (Fuite de mémoire avec l'effet de pluie) +変数正規表現の問題を修正しました。 -[//]: # () -[//]: # (Conflit lors de l'appel simultané de plusieurs callScene ou changeScene) +ロゴ画像の問題を修正しました。