From abf79e1803a3791b1c42a94d62fca9137ef68f94 Mon Sep 17 00:00:00 2001 From: hundun Date: Thu, 22 Aug 2024 13:57:04 +0800 Subject: [PATCH 1/3] 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 9935d3d4c9bfdea68a3b41d46b08b9537286e20d Mon Sep 17 00:00:00 2001 From: Mahiru Date: Thu, 22 Aug 2024 20:01:29 +0800 Subject: [PATCH 2/3] 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 73d39f62d512a7c8fc31a2884d9fa8d9b77ecf83 Mon Sep 17 00:00:00 2001 From: Mahiru Date: Thu, 22 Aug 2024 20:22:24 +0800 Subject: [PATCH 3/3] 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; })