From 8565d403fac137cb577762d6f7fcfe09c4d7e9b2 Mon Sep 17 00:00:00 2001 From: Hardy--Lee <> Date: Fri, 14 Nov 2025 13:20:17 +0800 Subject: [PATCH 1/2] feat: use json for game config --- packages/webgal/public/game/config.json | 8 ++ packages/webgal/public/game/config.txt | 6 - packages/webgal/src/Core/initializeScript.ts | 2 +- .../util/coreInitialFunction/infoFetcher.ts | 112 ++++++++++-------- packages/webgal/src/hooks/useConfigData.ts | 14 +-- 5 files changed, 76 insertions(+), 66 deletions(-) create mode 100644 packages/webgal/public/game/config.json delete mode 100644 packages/webgal/public/game/config.txt diff --git a/packages/webgal/public/game/config.json b/packages/webgal/public/game/config.json new file mode 100644 index 000000000..52c014229 --- /dev/null +++ b/packages/webgal/public/game/config.json @@ -0,0 +1,8 @@ +{ + "gameName": "新的 WebGAL 游戏", + "gameKey": "7fe160a6", + "titleImage": "WebGAL_New_Enter_Image.webp", + "titleBgm": "s_Title.mp3", + "gameLogo": ["WebGalEnter.webp"], + "enableAppreciation": true +} diff --git a/packages/webgal/public/game/config.txt b/packages/webgal/public/game/config.txt deleted file mode 100644 index 972b4e06c..000000000 --- a/packages/webgal/public/game/config.txt +++ /dev/null @@ -1,6 +0,0 @@ -Game_name:欢迎使用WebGAL!; -Game_key:0f87dstRg; -Title_img:WebGAL_New_Enter_Image.webp; -Title_bgm:s_Title.mp3; -Game_Logo:WebGalEnter.webp; -Enable_Appreciation:true; diff --git a/packages/webgal/src/Core/initializeScript.ts b/packages/webgal/src/Core/initializeScript.ts index ebab753e2..7f713b67e 100644 --- a/packages/webgal/src/Core/initializeScript.ts +++ b/packages/webgal/src/Core/initializeScript.ts @@ -44,7 +44,7 @@ export const initializeScript = (): void => { // 获得 user Animation getUserAnimation(); // 获取游戏信息 - infoFetcher('./game/config.txt'); + infoFetcher('./game/config.json'); // 获取start场景 const sceneUrl: string = assetSetter('start.txt', fileType.scene); // 场景写入到运行时 diff --git a/packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts b/packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts index 3ee48216c..cf8c08cf4 100644 --- a/packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts +++ b/packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts @@ -2,67 +2,75 @@ import { webgalStore } from '@/store/store'; import { setGlobalVar } from '@/store/userDataReducer'; import { setEnableAppreciationMode } from '@/store/GUIReducer'; import { Live2D, WebGAL } from '@/Core/WebGAL'; -import { WebgalParser } from '@/Core/parser/sceneParser'; import { getStorageAsync, setStorage } from '@/Core/controller/storage/storageController'; import { initKey } from '@/Core/controller/storage/fastSaveLoad'; import { getFastSaveFromStorage, getSavesFromStorage } from '@/Core/controller/storage/savesController'; import { logger } from '@/Core/util/logger'; import axios from 'axios'; +interface IWebgalConfig { + gameName?: string; // 游戏名称 + gameKey?: string; // 游戏Key + gameLogo?: string[]; // 游戏Logo + titleImage?: string; // 标题图片 + titleBgm?: string; // 标题背景音乐 + description?: string; // 游戏描述 + defaultLanguage?: string; // 默认语言 + packageName?: string; // 包名 + enableExtra?: boolean; // 启用鉴赏功能 + enablePanic?: boolean; // 启用紧急回避 + enableLegacyExpressionBlendMode?: boolean; // 启用旧版 Live2D 表情混合模式 +} + /** * 获取游戏信息 * @param url 游戏信息路径 */ -export const infoFetcher = (url: string) => { +export const infoFetcher = async (url: string) => { const dispatch = webgalStore.dispatch; - axios.get(url).then(async (r) => { - let gameConfigRaw: string = r.data; - let gameConfig = WebgalParser.parseConfig(gameConfigRaw); - logger.info('获取到游戏信息', gameConfig); - // 先把 key 找到并设置了 - const keyItem = gameConfig.find((e) => e.command === 'Game_key'); - WebGAL.gameKey = (keyItem?.args?.[0] as string) ?? ''; - initKey(); - await getStorageAsync(); - getFastSaveFromStorage(); - getSavesFromStorage(0, 0); - // 按照游戏的配置开始设置对应的状态 - gameConfig.forEach((e) => { - const { command, args } = e; - if (args.length > 0) { - 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 === 'true'; - } else if (/^[0-9]+\.?[0-9]+$/g.test(args[0])) { - res = Number(res); - } - - dispatch( - setGlobalVar({ - key: command, - value: res, - }), - ); - - if (command === 'Enable_Appreciation') { - dispatch(setEnableAppreciationMode(res)); - } - if (command === 'Legacy_Expression_Blend_Mode') { - Live2D.legacyExpressionBlendMode = res === true; - } - } - } - }); - // @ts-expect-error renderPromiseResolve is a global variable - window.renderPromiseResolve(); - setStorage(); - }); + const resp = await axios.get(url); + const gameConfig: IWebgalConfig = resp.data; + logger.info('获取到游戏信息', gameConfig); + // 先把 key 找到并设置了 + WebGAL.gameKey = gameConfig.gameKey ?? ''; + initKey(); + await getStorageAsync(); + getFastSaveFromStorage(); + getSavesFromStorage(0, 0); + // 将游戏配置写入为全局变量 + for (const [key, value] of Object.entries(gameConfig)) { + if (value === undefined) continue; + if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') { + dispatch( + setGlobalVar({ + key: key, + value: value, + }), + ); + } else if (Array.isArray(value)) { + dispatch( + setGlobalVar({ + key: key, + value: value.join('|'), + }), + ); + } else { + dispatch( + setGlobalVar({ + key: key, + value: String(value), + }), + ); + } + } + // 配置游戏 + if (gameConfig.enableExtra !== undefined) { + dispatch(setEnableAppreciationMode(gameConfig.enableExtra)); + } + if (gameConfig.enableLegacyExpressionBlendMode !== undefined) { + Live2D.legacyExpressionBlendMode = gameConfig.enableLegacyExpressionBlendMode; + } + // @ts-expect-error renderPromiseResolve is a global variable + window.renderPromiseResolve(); + setStorage(); }; diff --git a/packages/webgal/src/hooks/useConfigData.ts b/packages/webgal/src/hooks/useConfigData.ts index 830976794..9160ae67f 100644 --- a/packages/webgal/src/hooks/useConfigData.ts +++ b/packages/webgal/src/hooks/useConfigData.ts @@ -9,7 +9,7 @@ import { useEffect } from 'react'; import { useSelector } from 'react-redux'; const useConfigData = () => { - const _map = ['Title_img', 'Game_Logo', 'Title_bgm', 'Game_name', 'Game_key']; + const _map = ['titleImage', 'gameLogo', 'titleBgm', 'gameName', 'gameKey']; const configData = useSelector((state: RootState) => state.userData.globalGameVar); return useEffect(() => { // configData发生变化 @@ -19,33 +19,33 @@ const useConfigData = () => { } const val = configData[i] as string; switch (i) { - case 'Title_img': { + case 'titleImage': { const titleUrl = assetSetter(val, fileType.background); webgalStore.dispatch(setGuiAsset({ asset: 'titleBg', value: titleUrl })); setEbg(titleUrl); break; } - case 'Game_Logo': { + case 'gameLogo': { const logos = val.split('|'); const logoUrlList = logos.map((val) => assetSetter(val, fileType.background)); webgalStore.dispatch(setLogoImage(logoUrlList)); break; } - case 'Title_bgm': { + case 'titleBgm': { const bgmUrl = assetSetter(val, fileType.bgm); webgalStore.dispatch(setGuiAsset({ asset: 'titleBgm', value: bgmUrl })); break; } - case 'Game_name': { + case 'gameName': { WebGAL.gameName = val; document.title = val; break; } - case 'Game_key': { + case 'gameKey': { WebGAL.gameKey = val; getStorage(); getFastSaveFromStorage(); @@ -55,6 +55,6 @@ const useConfigData = () => { } } return () => {}; - }, [configData.Game_Logo, configData.Game_key, configData.Game_name, configData.Title_bgm, configData.Title_img]); + }, [configData.gameLogo, configData.gameKey, configData.gameName, configData.titleBgm, configData.titleImage]); }; export default useConfigData; From d3d2887746b654eb2492424c5ec4571fabd0ec33 Mon Sep 17 00:00:00 2001 From: Hardy--Lee <> Date: Fri, 14 Nov 2025 18:39:06 +0800 Subject: [PATCH 2/2] refactor: change enableAppreciation to enableExtra --- packages/webgal/public/game/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webgal/public/game/config.json b/packages/webgal/public/game/config.json index 52c014229..5dc8228f1 100644 --- a/packages/webgal/public/game/config.json +++ b/packages/webgal/public/game/config.json @@ -4,5 +4,5 @@ "titleImage": "WebGAL_New_Enter_Image.webp", "titleBgm": "s_Title.mp3", "gameLogo": ["WebGalEnter.webp"], - "enableAppreciation": true + "enableExtra": true }