Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/parser/src/sceneParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,13 @@ export const sceneParser = (
let assetsList: Array<IAsset> = []; // 场景资源列表
let subSceneList: Array<string> = []; // 子场景列表
const sentenceList: Array<ISentence> = rawSentenceListWithoutEmpty.map(
(sentence) => {
(sentence, index) => {
const returnSentence: ISentence = scriptParser(
sentence,
assetSetter,
ADD_NEXT_ARG_LIST,
SCRIPT_CONFIG_MAP,
index,
);
// 在这里解析出语句可能携带的资源和场景,合并到 assetsList 和 subSceneList
assetsList = [...assetsList, ...returnSentence.sentenceAssets];
Expand Down
13 changes: 7 additions & 6 deletions packages/parser/src/scriptParser/assetsScanner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export const assetsScanner = (
command: commandType,
content: string,
args: Array<arg>,
lineNumber: number,
): Array<IAsset> => {
let hasVocalArg = false;
const returnAssetsList: Array<IAsset> = [];
Expand All @@ -22,7 +23,7 @@ export const assetsScanner = (
returnAssetsList.push({
name: e.value as string,
url: e.value as string,
lineNumber: 0,
lineNumber,
type: fileType.vocal,
});
}
Expand All @@ -36,39 +37,39 @@ export const assetsScanner = (
returnAssetsList.push({
name: content,
url: content,
lineNumber: 0,
lineNumber,
type: fileType.background,
});
}
if (command === commandType.changeFigure) {
returnAssetsList.push({
name: content,
url: content,
lineNumber: 0,
lineNumber,
type: fileType.figure,
});
}
if (command === commandType.miniAvatar) {
returnAssetsList.push({
name: content,
url: content,
lineNumber: 0,
lineNumber,
type: fileType.figure,
});
}
if (command === commandType.video) {
returnAssetsList.push({
name: content,
url: content,
lineNumber: 0,
lineNumber,
type: fileType.video,
});
}
if (command === commandType.bgm) {
returnAssetsList.push({
name: content,
url: content,
lineNumber: 0,
lineNumber,
type: fileType.bgm,
});
}
Expand Down
3 changes: 2 additions & 1 deletion packages/parser/src/scriptParser/scriptParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export const scriptParser = (
assetSetter: any,
ADD_NEXT_ARG_LIST: commandType[],
SCRIPT_CONFIG_MAP: ConfigMap,
lineNumber = 0,
): ISentence => {
let command: commandType; // 默认为对话
let content: string; // 语句内容
Expand Down Expand Up @@ -105,7 +106,7 @@ export const scriptParser = (
}

content = contentParser(newSentenceRaw.trim(), command, assetSetter); // 将语句内容里的文件名转为相对或绝对路径
sentenceAssets = assetsScanner(command, content, args); // 扫描语句携带资源
sentenceAssets = assetsScanner(command, content, args, lineNumber); // 扫描语句携带资源
subScene = subSceneScanner(command, content); // 扫描语句携带子场景
return {
command: command, // 语句类型
Expand Down
2 changes: 1 addition & 1 deletion packages/parser/test/parser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ test("args", async () => {
{ key: "left", value: true },
{ key: "next", value: true }
],
sentenceAssets: [{ name: "m2.png", url: 'm2.png', type: fileType.figure, lineNumber: 0 }],
sentenceAssets: [{ name: "m2.png", url: 'm2.png', type: fileType.figure, lineNumber: 24 }],
subScene: [],
inlineComment: ""
};
Expand Down
30 changes: 30 additions & 0 deletions packages/webgal/public/webgal-serviceworker.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,24 @@ async function cacheFirst(request) {
return response;
}

async function prefetchFromMessage(urlString) {
const requestUrl = new URL(urlString, self.location.origin).toString();
const request = new Request(requestUrl, { method: 'GET' });
if (!isCriticalGameRequest(request)) {
return;
}
const cache = await caches.open(CACHE_NAME);
const hasCached = await cache.match(requestUrl);
if (hasCached) {
return;
}
const response = await fetch(request);
if (response.ok && response.status === 200) {
await cache.put(requestUrl, response.clone());
logOnce(`message-cache:${requestUrl}`, 'message cached:', new URL(requestUrl).pathname);
}
}

self.addEventListener('fetch', (event) => {
const { request } = event;
if (!isCriticalGameRequest(request)) return;
Expand All @@ -67,3 +85,15 @@ self.addEventListener('fetch', (event) => {
}),
);
});

self.addEventListener('message', (event) => {
const data = event.data || {};
if (data.type !== 'WEBGAL_PREFETCH_ASSET' || typeof data.url !== 'string') {
return;
}
event.waitUntil(
prefetchFromMessage(data.url).catch((error) => {
console.warn(LOG_PREFIX, 'message prefetch failed:', error);
}),
);
});
6 changes: 4 additions & 2 deletions packages/webgal/src/Core/Modules/scene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,16 @@ export const initSceneData = {
};

export class SceneManager {
public settledScenes: Array<string> = [];
public settledAssets: Array<string> = [];
public settledScenes: Set<string> = new Set();
public settledAssets: Set<string> = new Set();
public sceneData: ISceneData = cloneDeep(initSceneData);
public lockSceneWrite = false;

public resetScene() {
this.sceneData.currentSentenceId = 0;
this.sceneData.sceneStack = [];
this.sceneData.currentScene = cloneDeep(initSceneData.currentScene);
this.settledScenes.clear();
this.settledAssets.clear();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { IBacklogItem } from '@/Core/Modules/backlog';
import { SYSTEM_CONFIG } from '@/config';
import { WebGAL } from '@/Core/WebGAL';
import { getBooleanArgByKey, getStringArgByKey } from '@/Core/util/getSentenceArg';
import { prefetchCurrentSceneByProgress } from '@/Core/util/prefetcher/progressPrefetcher';

export const whenChecker = (whenValue: string | undefined): boolean => {
if (whenValue === undefined) {
Expand All @@ -39,6 +40,7 @@ export const whenChecker = (whenValue: string | undefined): boolean => {
* 执行语句,同步场景状态,并根据情况立即执行下一句或者加入backlog
*/
export const scriptExecutor = () => {
prefetchCurrentSceneByProgress();
// 超过总语句数量,则从场景栈拿出一个需要继续的场景,然后继续流程。若场景栈清空,则停止流程
if (
WebGAL.sceneManager.sceneData.currentSentenceId >
Expand Down
10 changes: 3 additions & 7 deletions packages/webgal/src/Core/controller/scene/callScene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import { sceneFetcher } from './sceneFetcher';
import { sceneParser } from '../../parser/sceneParser';
import { logger } from '../../util/logger';
import { nextSentence } from '@/Core/controller/gamePlay/nextSentence';
import uniqWith from 'lodash/uniqWith';
import { scenePrefetcher } from '@/Core/util/prefetcher/scenePrefetcher';
import { clearPrefetchLinks } from '@/Core/util/prefetcher/assetsPrefetcher';

import { WebGAL } from '@/Core/WebGAL';

Expand All @@ -28,11 +27,8 @@ export const callScene = (sceneUrl: string, sceneName: string) => {
.then((rawScene) => {
WebGAL.sceneManager.sceneData.currentScene = sceneParser(rawScene, sceneName, sceneUrl);
WebGAL.sceneManager.sceneData.currentSentenceId = 0;
// 开始场景的预加载
const subSceneList = WebGAL.sceneManager.sceneData.currentScene.subSceneList;
WebGAL.sceneManager.settledScenes.push(sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
const subSceneListUniq = uniqWith(subSceneList); // 去重
scenePrefetcher(subSceneListUniq);
clearPrefetchLinks();
WebGAL.sceneManager.settledScenes.add(sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
logger.debug('现在调用场景,调用结果:', WebGAL.sceneManager.sceneData);
WebGAL.sceneManager.lockSceneWrite = false;
nextSentence();
Expand Down
10 changes: 3 additions & 7 deletions packages/webgal/src/Core/controller/scene/changeScene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import { sceneFetcher } from './sceneFetcher';
import { sceneParser } from '../../parser/sceneParser';
import { logger } from '../../util/logger';
import { nextSentence } from '@/Core/controller/gamePlay/nextSentence';
import uniqWith from 'lodash/uniqWith';
import { scenePrefetcher } from '@/Core/util/prefetcher/scenePrefetcher';
import { clearPrefetchLinks } from '@/Core/util/prefetcher/assetsPrefetcher';

import { WebGAL } from '@/Core/WebGAL';

Expand All @@ -22,11 +21,8 @@ export const changeScene = (sceneUrl: string, sceneName: string) => {
.then((rawScene) => {
WebGAL.sceneManager.sceneData.currentScene = sceneParser(rawScene, sceneName, sceneUrl);
WebGAL.sceneManager.sceneData.currentSentenceId = 0;
// 开始场景的预加载
const subSceneList = WebGAL.sceneManager.sceneData.currentScene.subSceneList;
WebGAL.sceneManager.settledScenes.push(sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
const subSceneListUniq = uniqWith(subSceneList); // 去重
scenePrefetcher(subSceneListUniq);
clearPrefetchLinks();
WebGAL.sceneManager.settledScenes.add(sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
logger.debug('现在切换场景,切换后的结果:', WebGAL.sceneManager.sceneData);
WebGAL.sceneManager.lockSceneWrite = false;
nextSentence();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import { setVisibility } from '@/store/GUIReducer';
import { runScript } from '@/Core/controller/gamePlay/runScript';
import { stopAllPerform } from '@/Core/controller/gamePlay/stopAllPerform';
import cloneDeep from 'lodash/cloneDeep';
import uniqWith from 'lodash/uniqWith';
import { scenePrefetcher } from '@/Core/util/prefetcher/scenePrefetcher';

import { WebGAL } from '@/Core/WebGAL';

Expand Down Expand Up @@ -44,11 +42,7 @@ export const jumpFromBacklog = (index: number, refetchScene = true) => {
backlogFile.saveScene.sceneName,
backlogFile.saveScene.sceneUrl,
);
// 开始场景的预加载
const subSceneList = WebGAL.sceneManager.sceneData.currentScene.subSceneList;
WebGAL.sceneManager.settledScenes.push(WebGAL.sceneManager.sceneData.currentScene.sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
const subSceneListUniq = uniqWith(subSceneList); // 去重
scenePrefetcher(subSceneListUniq);
WebGAL.sceneManager.settledScenes.add(WebGAL.sceneManager.sceneData.currentScene.sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
});
WebGAL.sceneManager.sceneData.currentSentenceId = backlogFile.saveScene.currentSentenceId;
WebGAL.sceneManager.sceneData.sceneStack = cloneDeep(backlogFile.saveScene.sceneStack);
Expand Down
8 changes: 1 addition & 7 deletions packages/webgal/src/Core/controller/storage/loadGame.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import { setVisibility } from '@/store/GUIReducer';
import { restorePerform } from './jumpFromBacklog';
import { stopAllPerform } from '@/Core/controller/gamePlay/stopAllPerform';
import cloneDeep from 'lodash/cloneDeep';
import uniqWith from 'lodash/uniqWith';
import { scenePrefetcher } from '@/Core/util/prefetcher/scenePrefetcher';
import { setEbg } from '@/Core/gameScripts/changeBg/setEbg';

import { WebGAL } from '@/Core/WebGAL';
Expand Down Expand Up @@ -40,11 +38,7 @@ export function loadGameFromStageData(stageData: ISaveData) {
loadFile.sceneData.sceneName,
loadFile.sceneData.sceneUrl,
);
// 开始场景的预加载
const subSceneList = WebGAL.sceneManager.sceneData.currentScene.subSceneList;
WebGAL.sceneManager.settledScenes.push(WebGAL.sceneManager.sceneData.currentScene.sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
const subSceneListUniq = uniqWith(subSceneList); // 去重
scenePrefetcher(subSceneListUniq);
WebGAL.sceneManager.settledScenes.add(WebGAL.sceneManager.sceneData.currentScene.sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
});
WebGAL.sceneManager.sceneData.currentSentenceId = loadFile.sceneData.currentSentenceId;
WebGAL.sceneManager.sceneData.sceneStack = cloneDeep(loadFile.sceneData.sceneStack);
Expand Down
8 changes: 1 addition & 7 deletions packages/webgal/src/Core/initializeScript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import { sceneFetcher } from './controller/scene/sceneFetcher';
import { sceneParser } from './parser/sceneParser';
import { bindExtraFunc } from '@/Core/util/coreInitialFunction/bindExtraFunc';
import { webSocketFunc } from '@/Core/util/syncWithEditor/webSocketFunc';
import uniqWith from 'lodash/uniqWith';
import { scenePrefetcher } from './util/prefetcher/scenePrefetcher';
import PixiStage from '@/Core/controller/stage/pixi/PixiController';
import axios from 'axios';
import { __INFO } from '@/config/info';
Expand Down Expand Up @@ -51,11 +49,7 @@ export const initializeScript = (): void => {
// 场景写入到运行时
sceneFetcher(sceneUrl).then((rawScene) => {
WebGAL.sceneManager.sceneData.currentScene = sceneParser(rawScene, 'start.txt', sceneUrl);
// 开始场景的预加载
const subSceneList = WebGAL.sceneManager.sceneData.currentScene.subSceneList;
WebGAL.sceneManager.settledScenes.push(sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
const subSceneListUniq = uniqWith(subSceneList); // 去重
scenePrefetcher(subSceneListUniq);
WebGAL.sceneManager.settledScenes.add(sceneUrl); // 放入已加载场景列表,避免递归加载相同场景
});
/**
* 启动Pixi
Expand Down
Loading
Loading