diff --git a/packages/webgal/src/Core/gameScripts/getUserInput/index.tsx b/packages/webgal/src/Core/gameScripts/getUserInput/index.tsx index 9793d3300..4c5a4e82c 100644 --- a/packages/webgal/src/Core/gameScripts/getUserInput/index.tsx +++ b/packages/webgal/src/Core/gameScripts/getUserInput/index.tsx @@ -13,6 +13,8 @@ import { getStringArgByKey } from '@/Core/util/getSentenceArg'; import { nextSentence } from '@/Core/controller/gamePlay/nextSentence'; import { setStageVar } from '@/store/stageReducer'; import { getCurrentFontFamily } from '@/hooks/useFontFamily'; +import { logger } from '@/Core/util/logger'; +import { tryToRegex } from '@/Core/util/global'; /** * 显示选择枝 @@ -26,6 +28,9 @@ export const getUserInput = (sentence: ISentence): IPerform => { let buttonText = getStringArgByKey(sentence, 'buttonText') ?? ''; buttonText = buttonText === '' ? 'OK' : buttonText; const defaultValue = getStringArgByKey(sentence, 'defaultValue'); + const rule = getStringArgByKey(sentence, 'rule'); + const ruleFlag = getStringArgByKey(sentence, 'ruleFlag'); + const ruleText = getStringArgByKey(sentence, 'ruleText'); const font = getCurrentFontFamily(); @@ -39,6 +44,16 @@ export const getUserInput = (sentence: ISentence): IPerform => { onMouseEnter={playSeEnter} onClick={() => { const userInput: HTMLInputElement = document.getElementById('user-input') as HTMLInputElement; + if (rule) { + const reg = tryToRegex(rule, ruleFlag); + if (reg && !reg.test(userInput.value)) { + if (ruleText) alert(ruleText.replaceAll(/\$0/g, userInput.value)); + return; + } + if (!reg) { + logger.warn(`getUserInput: rule ${rule} is not a valid regex`); + } + } if (userInput) { webgalStore.dispatch( setStageVar({ diff --git a/packages/webgal/src/Core/util/global.ts b/packages/webgal/src/Core/util/global.ts new file mode 100644 index 000000000..4c4a8e4d1 --- /dev/null +++ b/packages/webgal/src/Core/util/global.ts @@ -0,0 +1,7 @@ +export function tryToRegex(str: string, flag: string | null): RegExp | false { + try { + return new RegExp(str, flag || ''); + } catch (e) { + return false; + } +}