Skip to content

Commit f65e7ec

Browse files
committed
Refactor loading logic
1 parent cb94d35 commit f65e7ec

File tree

3 files changed

+67
-106
lines changed

3 files changed

+67
-106
lines changed

GDJS/Runtime/RuntimeInstanceContainer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ namespace gdjs {
623623

624624
/**
625625
* Create a new object from its name. The object is also added to the instances
626-
* living in the container (No need to call {@link gdjs.RuntimeScene.addObject})
626+
* living in the container (No need to call {@link addObject})
627627
* @param objectName The name of the object to be created
628628
* @return The created object
629629
*/

GDJS/Runtime/runtimegame.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1391,7 +1391,7 @@ namespace gdjs {
13911391
if (syncData.ss) {
13921392
this._sceneStack.updateFromNetworkSyncData(syncData.ss);
13931393
}
1394-
if (syncData.sm) {
1394+
if (options.clearMemory && syncData.sm) {
13951395
this.getSoundManager().updateFromNetworkSyncData(syncData.sm);
13961396
}
13971397
if (syncData.extVar) {

GDJS/Runtime/scenestack.ts

+65-104
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,36 @@ namespace gdjs {
3434
}
3535
}
3636

37+
_loadGameFromSave(saveState: GameSaveState): void {
38+
const options: UpdateFromNetworkSyncDataOptions = {
39+
clearMemory: true,
40+
};
41+
42+
this._runtimeGame.updateFromNetworkSyncData(
43+
saveState.gameNetworkSyncData,
44+
options
45+
);
46+
47+
this.applyUpdateFromNetworkSyncDataIfAny(options);
48+
49+
const sceneStack = this._stack;
50+
sceneStack.forEach((scene, index) => {
51+
const layoutSyncData = saveState.layoutNetworkSyncDatas[index];
52+
if (!layoutSyncData) return;
53+
54+
scene.updateFromNetworkSyncData(layoutSyncData.sceneData, options);
55+
56+
const objectDatas = layoutSyncData.objectDatas;
57+
for (const id in objectDatas) {
58+
const objectNetworkSyncData = objectDatas[id];
59+
const object = scene.createObject(objectNetworkSyncData.n || '');
60+
if (object) {
61+
object.updateFromNetworkSyncData(objectNetworkSyncData, options);
62+
}
63+
}
64+
});
65+
}
66+
3767
step(elapsedTime: float): boolean {
3868
this._throwIfDisposed();
3969
if (this._isNextLayoutLoading || this._stack.length === 0) {
@@ -70,115 +100,46 @@ namespace gdjs {
70100
}
71101
}
72102

73-
const loadRequestOptions: LoadRequestOptions | null =
74-
currentScene.getLoadRequestOptions();
75-
if (loadRequestOptions) {
76-
const options: UpdateFromNetworkSyncDataOptions = {
77-
clearMemory: true,
78-
};
103+
const loadRequestOptions = currentScene.getLoadRequestOptions();
104+
if (!loadRequestOptions) return true;
105+
106+
currentScene.requestLoadSnapshot(null);
107+
108+
if (loadRequestOptions.loadVariable) {
79109
if (
80-
loadRequestOptions.loadVariable &&
81110
loadRequestOptions.loadVariable !==
82-
gdjs.VariablesContainer.badVariable
111+
gdjs.VariablesContainer.badVariable
83112
) {
84-
try {
85-
const allSyncData =
86-
loadRequestOptions.loadVariable.toJSObject() as GameSaveState;
87-
currentScene.requestLoadSnapshot(null);
88-
if (allSyncData) {
89-
currentScene
90-
.getGame()
91-
.updateFromNetworkSyncData(
92-
allSyncData.gameNetworkSyncData,
93-
options
94-
);
95-
96-
this.applyUpdateFromNetworkSyncDataIfAny(options);
97-
98-
const sceneStack = this._stack;
99-
sceneStack.forEach((scene, index) => {
100-
const layoutSyncData =
101-
allSyncData.layoutNetworkSyncDatas[index];
102-
if (!layoutSyncData) return;
103-
scene.updateFromNetworkSyncData(
104-
layoutSyncData.sceneData,
105-
options
106-
);
107-
108-
const objectDatas = layoutSyncData.objectDatas;
109-
for (const id in objectDatas) {
110-
const objectNetworkSyncData = objectDatas[id];
111-
const object = scene.createObject(
112-
objectNetworkSyncData.n || ''
113-
);
114-
if (object) {
115-
object.updateFromNetworkSyncData(
116-
objectNetworkSyncData,
117-
options
118-
);
119-
}
120-
}
121-
});
122-
}
123-
} catch (error) {
124-
logger.error('Failed to load from variable:', error);
125-
}
126-
} else {
127-
const storageKey =
128-
loadRequestOptions.loadStorageName || gdjs.saveState.INDEXED_DB_KEY;
129-
currentScene.requestLoadSnapshot(null);
130-
131-
gdjs
132-
.loadFromIndexedDB(
133-
gdjs.saveState.INDEXED_DB_NAME,
134-
gdjs.saveState.INDEXED_DB_OBJECT_STORE,
135-
storageKey
136-
)
137-
.then((jsonData) => {
138-
const allSyncData = JSON.parse(jsonData) as GameSaveState;
139-
140-
if (allSyncData) {
141-
currentScene
142-
.getGame()
143-
.updateFromNetworkSyncData(
144-
allSyncData.gameNetworkSyncData,
145-
options
146-
);
147-
148-
this.applyUpdateFromNetworkSyncDataIfAny(options);
149-
150-
const sceneStack = this._stack;
151-
sceneStack.forEach((scene, index) => {
152-
const layoutSyncData =
153-
allSyncData.layoutNetworkSyncDatas[index];
154-
if (!layoutSyncData) return;
155-
156-
scene.updateFromNetworkSyncData(
157-
layoutSyncData.sceneData,
158-
options
159-
);
160-
161-
const objectDatas = layoutSyncData.objectDatas;
162-
for (const id in objectDatas) {
163-
const objectNetworkSyncData = objectDatas[id];
164-
const object = scene.createObject(
165-
objectNetworkSyncData.n || ''
166-
);
167-
if (object) {
168-
object.updateFromNetworkSyncData(
169-
objectNetworkSyncData,
170-
options
171-
);
172-
}
173-
}
174-
});
175-
}
176-
})
177-
.catch((error) => {
178-
logger.error('Error loading from IndexedDB:', error);
179-
});
113+
throw new Error(
114+
'Requested loading save from wrongly defined variable.'
115+
);
116+
}
117+
const saveState =
118+
loadRequestOptions.loadVariable.toJSObject() as GameSaveState;
119+
try {
120+
this._loadGameFromSave(saveState);
121+
} catch (error) {
122+
logger.error('Error loading from variable:', error);
180123
}
124+
} else {
125+
const storageKey =
126+
loadRequestOptions.loadStorageName || gdjs.saveState.INDEXED_DB_KEY;
127+
128+
gdjs
129+
.loadFromIndexedDB(
130+
gdjs.saveState.INDEXED_DB_NAME,
131+
gdjs.saveState.INDEXED_DB_OBJECT_STORE,
132+
storageKey
133+
)
134+
.then((jsonData) => {
135+
const saveState = JSON.parse(jsonData) as GameSaveState;
136+
this._loadGameFromSave(saveState);
137+
})
138+
.catch((error) => {
139+
logger.error('Error loading from IndexedDB:', error);
140+
});
181141
}
142+
182143
return true;
183144
}
184145

0 commit comments

Comments
 (0)