Skip to content

Commit 1ec55a6

Browse files
Hardy--LeeHardyNLee
authored andcommitted
feat: use json for game config
1 parent f191b10 commit 1ec55a6

5 files changed

Lines changed: 80 additions & 70 deletions

File tree

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
@@ -46,7 +46,7 @@ export const initializeScript = (): void => {
4646
// 获得 user Animation
4747
getUserAnimation();
4848
// 获取游戏信息
49-
infoFetcher('./game/config.txt');
49+
infoFetcher('./game/config.json');
5050
// 获取start场景
5151
const sceneUrl: string = assetSetter('start.txt', fileType.scene);
5252
// 场景写入到运行时

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

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

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)