Skip to content

Commit 2b41eed

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

File tree

6 files changed

+76
-66
lines changed

6 files changed

+76
-66
lines changed

packages/parser/src/configParser/configParser.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
import { argsParser } from '../scriptParser/argsParser';
22

3+
// 新版 Webgal 配置接口
4+
export interface IWebgalConfig {
5+
gameName?: string; // 游戏名称
6+
gameKey?: string; // 游戏Key
7+
gameLogo?: string[]; // 游戏Logo
8+
titleImage?: string; // 标题图片
9+
titleBgm?: string; // 标题背景音乐
10+
defaultLanguage?: string; // 默认语言
11+
enableAppreciation?: boolean; // 启用鉴赏功能
12+
enablePanic?: boolean; // 启用紧急回避
13+
enableLegacyExpressionBlendMode?: boolean; // 启用旧版 Live2D 表情混合模式
14+
}
15+
316
interface IOptionItem {
417
key: string;
518
value: string | number | boolean;
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: 47 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,67 +2,62 @@ 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';
10+
import { IWebgalConfig } from 'webgal-parser/build/types/configParser/configParser';
1111

1212
/**
1313
* 获取游戏信息
1414
* @param url 游戏信息路径
1515
*/
16-
export const infoFetcher = (url: string) => {
16+
export const infoFetcher = async (url: string) => {
1717
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-
});
18+
const resp = await axios.get(url);
19+
const gameConfig: IWebgalConfig = resp.data;
20+
logger.info('获取到游戏信息', gameConfig);
21+
// 先把 key 找到并设置了
22+
WebGAL.gameKey = gameConfig.gameKey ?? '';
23+
initKey();
24+
await getStorageAsync();
25+
getFastSaveFromStorage();
26+
getSavesFromStorage(0, 0);
27+
// 将游戏配置写入为全局变量
28+
for (const [key, value] of Object.entries(gameConfig)) {
29+
if (value === undefined) continue;
30+
if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') {
31+
dispatch(
32+
setGlobalVar({
33+
key: key,
34+
value: value,
35+
}),
36+
);
37+
} else if (Array.isArray(value)) {
38+
dispatch(
39+
setGlobalVar({
40+
key: key,
41+
value: value.join('|'),
42+
}),
43+
);
44+
} else {
45+
dispatch(
46+
setGlobalVar({
47+
key: key,
48+
value: String(value),
49+
}),
50+
);
51+
}
52+
}
53+
// 配置游戏
54+
if (gameConfig.enableAppreciation !== undefined) {
55+
dispatch(setEnableAppreciationMode(gameConfig.enableAppreciation));
56+
}
57+
if (gameConfig.enableLegacyExpressionBlendMode !== undefined) {
58+
Live2D.legacyExpressionBlendMode = gameConfig.enableLegacyExpressionBlendMode;
59+
}
60+
// @ts-expect-error renderPromiseResolve is a global variable
61+
window.renderPromiseResolve();
62+
setStorage();
6863
};

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)