Skip to content

Commit 4f258c3

Browse files
author
Hardy--Lee
committed
feat: use json for game config
1 parent 9ea2943 commit 4f258c3

File tree

5 files changed

+74
-66
lines changed

5 files changed

+74
-66
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"gameName": "新的 WebGAL 游戏",
3+
"gameKey": "7fe160a6",
4+
"titleImage": "WebGAL_New_Enter_Image.webp",
5+
"titleBgm": "s_Title.mp3",
6+
"gameLogo": ["WebGalEnter.webp"],
7+
"enableAppreciation": true
8+
}

packages/webgal/public/game/config.txt

Lines changed: 0 additions & 6 deletions
This file was deleted.

packages/webgal/src/Core/initializeScript.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const initializeScript = (): void => {
4444
// 获得 user Animation
4545
getUserAnimation();
4646
// 获取游戏信息
47-
infoFetcher('./game/config.txt');
47+
infoFetcher('./game/config.json');
4848
// 获取start场景
4949
const sceneUrl: string = assetSetter('start.txt', fileType.scene);
5050
// 场景写入到运行时

packages/webgal/src/Core/util/coreInitialFunction/infoFetcher.ts

Lines changed: 58 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,67 +2,73 @@ import { webgalStore } from '@/store/store';
22
import { setGlobalVar } from '@/store/userDataReducer';
33
import { setEnableAppreciationMode } from '@/store/GUIReducer';
44
import { Live2D, WebGAL } from '@/Core/WebGAL';
5-
import { WebgalParser } from '@/Core/parser/sceneParser';
65
import { getStorageAsync, setStorage } from '@/Core/controller/storage/storageController';
76
import { initKey } from '@/Core/controller/storage/fastSaveLoad';
87
import { getFastSaveFromStorage, getSavesFromStorage } from '@/Core/controller/storage/savesController';
98
import { logger } from '@/Core/util/logger';
109
import axios from 'axios';
1110

11+
interface IWebgalConfig {
12+
gameName?: string; // 游戏名称
13+
gameKey?: string; // 游戏Key
14+
gameLogo?: string[]; // 游戏Logo
15+
titleImage?: string; // 标题图片
16+
titleBgm?: string; // 标题背景音乐
17+
defaultLanguage?: string; // 默认语言
18+
enableAppreciation?: boolean; // 启用鉴赏功能
19+
enablePanic?: boolean; // 启用紧急回避
20+
enableLegacyExpressionBlendMode?: boolean; // 启用旧版 Live2D 表情混合模式
21+
}
22+
1223
/**
1324
* 获取游戏信息
1425
* @param url 游戏信息路径
1526
*/
16-
export const infoFetcher = (url: string) => {
27+
export const infoFetcher = async (url: string) => {
1728
const dispatch = webgalStore.dispatch;
18-
axios.get(url).then(async (r) => {
19-
let gameConfigRaw: string = r.data;
20-
let gameConfig = WebgalParser.parseConfig(gameConfigRaw);
21-
logger.info('获取到游戏信息', gameConfig);
22-
// 先把 key 找到并设置了
23-
const keyItem = gameConfig.find((e) => e.command === 'Game_key');
24-
WebGAL.gameKey = (keyItem?.args?.[0] as string) ?? '';
25-
initKey();
26-
await getStorageAsync();
27-
getFastSaveFromStorage();
28-
getSavesFromStorage(0, 0);
29-
// 按照游戏的配置开始设置对应的状态
30-
gameConfig.forEach((e) => {
31-
const { command, args } = e;
32-
if (args.length > 0) {
33-
if (args.length > 1) {
34-
dispatch(
35-
setGlobalVar({
36-
key: command,
37-
value: args.join('|'),
38-
}),
39-
);
40-
} else {
41-
let res: any = args[0].trim();
42-
if (/^(true|false)$/g.test(args[0])) {
43-
res = res === 'true';
44-
} else if (/^[0-9]+\.?[0-9]+$/g.test(args[0])) {
45-
res = Number(res);
46-
}
47-
48-
dispatch(
49-
setGlobalVar({
50-
key: command,
51-
value: res,
52-
}),
53-
);
54-
55-
if (command === 'Enable_Appreciation') {
56-
dispatch(setEnableAppreciationMode(res));
57-
}
58-
if (command === 'Legacy_Expression_Blend_Mode') {
59-
Live2D.legacyExpressionBlendMode = res === true;
60-
}
61-
}
62-
}
63-
});
64-
// @ts-expect-error renderPromiseResolve is a global variable
65-
window.renderPromiseResolve();
66-
setStorage();
67-
});
29+
const resp = await axios.get(url);
30+
const gameConfig: IWebgalConfig = resp.data;
31+
logger.info('获取到游戏信息', gameConfig);
32+
// 先把 key 找到并设置了
33+
WebGAL.gameKey = gameConfig.gameKey ?? '';
34+
initKey();
35+
await getStorageAsync();
36+
getFastSaveFromStorage();
37+
getSavesFromStorage(0, 0);
38+
// 将游戏配置写入为全局变量
39+
for (const [key, value] of Object.entries(gameConfig)) {
40+
if (value === undefined) continue;
41+
if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') {
42+
dispatch(
43+
setGlobalVar({
44+
key: key,
45+
value: value,
46+
}),
47+
);
48+
} else if (Array.isArray(value)) {
49+
dispatch(
50+
setGlobalVar({
51+
key: key,
52+
value: value.join('|'),
53+
}),
54+
);
55+
} else {
56+
dispatch(
57+
setGlobalVar({
58+
key: key,
59+
value: String(value),
60+
}),
61+
);
62+
}
63+
}
64+
// 配置游戏
65+
if (gameConfig.enableAppreciation !== undefined) {
66+
dispatch(setEnableAppreciationMode(gameConfig.enableAppreciation));
67+
}
68+
if (gameConfig.enableLegacyExpressionBlendMode !== undefined) {
69+
Live2D.legacyExpressionBlendMode = gameConfig.enableLegacyExpressionBlendMode;
70+
}
71+
// @ts-expect-error renderPromiseResolve is a global variable
72+
window.renderPromiseResolve();
73+
setStorage();
6874
};

packages/webgal/src/hooks/useConfigData.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { useEffect } from 'react';
99
import { useSelector } from 'react-redux';
1010

1111
const useConfigData = () => {
12-
const _map = ['Title_img', 'Game_Logo', 'Title_bgm', 'Game_name', 'Game_key'];
12+
const _map = ['titleImage', 'gameLogo', 'titleBgm', 'gameName', 'gameKey'];
1313
const configData = useSelector((state: RootState) => state.userData.globalGameVar);
1414
return useEffect(() => {
1515
// configData发生变化
@@ -19,33 +19,33 @@ const useConfigData = () => {
1919
}
2020
const val = configData[i] as string;
2121
switch (i) {
22-
case 'Title_img': {
22+
case 'titleImage': {
2323
const titleUrl = assetSetter(val, fileType.background);
2424
webgalStore.dispatch(setGuiAsset({ asset: 'titleBg', value: titleUrl }));
2525
setEbg(titleUrl);
2626
break;
2727
}
2828

29-
case 'Game_Logo': {
29+
case 'gameLogo': {
3030
const logos = val.split('|');
3131
const logoUrlList = logos.map((val) => assetSetter(val, fileType.background));
3232
webgalStore.dispatch(setLogoImage(logoUrlList));
3333
break;
3434
}
3535

36-
case 'Title_bgm': {
36+
case 'titleBgm': {
3737
const bgmUrl = assetSetter(val, fileType.bgm);
3838
webgalStore.dispatch(setGuiAsset({ asset: 'titleBgm', value: bgmUrl }));
3939
break;
4040
}
4141

42-
case 'Game_name': {
42+
case 'gameName': {
4343
WebGAL.gameName = val;
4444
document.title = val;
4545
break;
4646
}
4747

48-
case 'Game_key': {
48+
case 'gameKey': {
4949
WebGAL.gameKey = val;
5050
getStorage();
5151
getFastSaveFromStorage();
@@ -55,6 +55,6 @@ const useConfigData = () => {
5555
}
5656
}
5757
return () => {};
58-
}, [configData.Game_Logo, configData.Game_key, configData.Game_name, configData.Title_bgm, configData.Title_img]);
58+
}, [configData.gameLogo, configData.gameKey, configData.gameName, configData.titleBgm, configData.titleImage]);
5959
};
6060
export default useConfigData;

0 commit comments

Comments
 (0)