Skip to content

Commit 8565d40

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

File tree

5 files changed

+76
-66
lines changed

5 files changed

+76
-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: 60 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,67 +2,75 @@ 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+
description?: string; // 游戏描述
18+
defaultLanguage?: string; // 默认语言
19+
packageName?: string; // 包名
20+
enableExtra?: boolean; // 启用鉴赏功能
21+
enablePanic?: boolean; // 启用紧急回避
22+
enableLegacyExpressionBlendMode?: boolean; // 启用旧版 Live2D 表情混合模式
23+
}
24+
1225
/**
1326
* 获取游戏信息
1427
* @param url 游戏信息路径
1528
*/
16-
export const infoFetcher = (url: string) => {
29+
export const infoFetcher = async (url: string) => {
1730
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-
});
31+
const resp = await axios.get(url);
32+
const gameConfig: IWebgalConfig = resp.data;
33+
logger.info('获取到游戏信息', gameConfig);
34+
// 先把 key 找到并设置了
35+
WebGAL.gameKey = gameConfig.gameKey ?? '';
36+
initKey();
37+
await getStorageAsync();
38+
getFastSaveFromStorage();
39+
getSavesFromStorage(0, 0);
40+
// 将游戏配置写入为全局变量
41+
for (const [key, value] of Object.entries(gameConfig)) {
42+
if (value === undefined) continue;
43+
if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') {
44+
dispatch(
45+
setGlobalVar({
46+
key: key,
47+
value: value,
48+
}),
49+
);
50+
} else if (Array.isArray(value)) {
51+
dispatch(
52+
setGlobalVar({
53+
key: key,
54+
value: value.join('|'),
55+
}),
56+
);
57+
} else {
58+
dispatch(
59+
setGlobalVar({
60+
key: key,
61+
value: String(value),
62+
}),
63+
);
64+
}
65+
}
66+
// 配置游戏
67+
if (gameConfig.enableExtra !== undefined) {
68+
dispatch(setEnableAppreciationMode(gameConfig.enableExtra));
69+
}
70+
if (gameConfig.enableLegacyExpressionBlendMode !== undefined) {
71+
Live2D.legacyExpressionBlendMode = gameConfig.enableLegacyExpressionBlendMode;
72+
}
73+
// @ts-expect-error renderPromiseResolve is a global variable
74+
window.renderPromiseResolve();
75+
setStorage();
6876
};

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)