Skip to content

Commit 8469d9a

Browse files
psuh for save
1 parent 9cbb13a commit 8469d9a

File tree

9 files changed

+198
-108
lines changed

9 files changed

+198
-108
lines changed

Extensions/3D/JsExtension.js

-26
Original file line numberDiff line numberDiff line change
@@ -814,32 +814,6 @@ module.exports = {
814814
.addParameter('object', _('3D model'), 'Model3DObject', false)
815815
.addParameter('number', _('Crossfade duration (in seconds)'), '', false)
816816
.setFunctionName('setCrossfadeDuration');
817-
818-
object
819-
.addScopedAction(
820-
'SyncAll',
821-
_('Save the whole game'),
822-
_('Save the wole game.'),
823-
_('Syncall'),
824-
_('Animations and images'),
825-
'res/conditions/animation24.png',
826-
'res/conditions/animation.png'
827-
)
828-
.addCodeOnlyParameter('currentScene', '')
829-
.setFunctionName('saveWholeGame');
830-
831-
object
832-
.addScopedAction(
833-
'LoadAll',
834-
_('loadAll'),
835-
_('Set the crossfade duration when switching to a new animation.'),
836-
_('loadALl'),
837-
_('Animations and images'),
838-
'res/conditions/animation24.png',
839-
'res/conditions/animation.png'
840-
)
841-
.setFunctionName('loadWholeGame');
842-
843817
}
844818

845819
const Cube3DObject = new gd.ObjectJsImplementation();

Extensions/3D/Model3DRuntimeObject.ts

+3-66
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ namespace gdjs {
126126
this.onModelChanged(objectData);
127127

128128
this._crossfadeDuration = objectData.content.crossfadeDuration || 0;
129-
this._allSyncData = "";
129+
this._allSyncData = '';
130130

131131
// *ALWAYS* call `this.onCreated()` at the very end of your object constructor.
132132
this.onCreated();
@@ -252,71 +252,8 @@ namespace gdjs {
252252
this.onModelChanged(objectData);
253253
}
254254

255-
a(currentScene : RuntimeScene) : void
256-
{
257-
console.log("pomme");
258-
}
259-
260-
saveWholeGame(currentScene : RuntimeScene ): void {
261-
console.log("là on est bons");
262-
263-
// let allSyncData: { gameNetworkSyncData: GameNetworkSyncData } = { gameNetworkSyncData: {} as GameNetworkSyncData };
264-
// const gameData = currentScene.getGame().getNetworkSyncData({syncEverythingForWholeGameSaveState: true});
265-
// if(gameData)
266-
// {
267-
// allSyncData.gameNetworkSyncData = gameData;
268-
// }
269-
// this._allSyncData = JSON.stringify(allSyncData);
270-
// sceneStack.forEach(scene => {
271-
// allSyncData.push(scene.getNetworkSyncData({syncEverythingForWholeGameSaveState:true}))
272-
// }
273-
// );
274-
// sceneStack.forEach(scene => {
275-
// const sceneObjects = scene.getAdhocListOfAllInstances();
276-
// for (const key in sceneObjects) {
277-
// if (sceneObjects.hasOwnProperty(key)) {
278-
// const object = sceneObjects[key];
279-
// if (object.getNetworkSyncData) {
280-
// const syncData = object.getNetworkSyncData(true);
281-
// allSyncData.push(syncData);
282-
// }
283-
// }
284-
// }
285-
// });
286-
// const syncDataJson = JSON.stringify(allSyncData);
287-
// this.LoadWholeGame(syncDataJson);
288-
}
289-
loadWholeGame(): void {
290-
this._runtimeScene._destroy();
291-
const allSyncData = JSON.parse(this._allSyncData);
292-
const sceneStack = allSyncData[0].ss;
293-
console.log(sceneStack);
294-
let sceneIndex = 1;
295-
sceneStack.forEach((sceneData: any) => {
296-
let scene = sceneStack[sceneIndex];
297-
298-
if (!scene) {
299-
const sceneAndExtensionData = allSyncData[sceneIndex];
300-
scene = new gdjs.RuntimeScene(this._runtimeScene.getGame());
301-
scene.loadFromScene(sceneAndExtensionData, {skipCreatingInstances: true});
302-
console.log(scene);
303-
}
304-
scene.updateFromNetworkSyncData();
305-
const sceneObjects = scene.getAdhocListOfAllInstances();
306-
for (const key in sceneObjects) {
307-
if (sceneObjects.hasOwnProperty(key)) {
308-
const object = sceneObjects[key];
309-
const objectSyncData = sceneData.objects[key];
310-
if (objectSyncData) {
311-
object.onCreated();
312-
object.updateFromNetworkSyncData(objectSyncData);
313-
}
314-
315-
}
316-
}
317-
318-
sceneIndex++;
319-
});
255+
a(currentScene: RuntimeScene): void {
256+
console.log('pomme');
320257
}
321258

322259
_updateModel(objectData: Model3DObjectData) {

Extensions/SaveState/JsExtension.js

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//@ts-check
2+
/// <reference path="../JsExtensionTypes.d.ts" />
3+
/**
4+
* This is a declaration of an extension for GDevelop 5.
5+
*
6+
* ℹ️ Changes in this file are watched and automatically imported if the editor
7+
* is running. You can also manually run `node import-GDJS-Runtime.js` (in newIDE/app/scripts).
8+
*
9+
* The file must be named "JsExtension.js", otherwise GDevelop won't load it.
10+
* ⚠️ If you make a change and the extension is not loaded, open the developer console
11+
* and search for any errors.
12+
*
13+
* More information on https://github.com/4ian/GDevelop/blob/master/newIDE/README-extensions.md
14+
*/
15+
16+
/** @type {ExtensionModule} */
17+
module.exports = {
18+
createExtension: function (_, gd) {
19+
const extension = new gd.PlatformExtension();
20+
extension
21+
.setExtensionInformation(
22+
'SaveState',
23+
_('Save State'),
24+
25+
'This allows to save and load whole games.',
26+
'Neyl Mahfouf',
27+
'Gdevelop'
28+
)
29+
.setExtensionHelpPath('/all-features/device-vibration')
30+
.setCategory('User interface');
31+
extension
32+
.addInstructionOrExpressionGroupMetadata(_('Save State'))
33+
.setIcon('JsPlatform/Extensions/vibration_start32.png');
34+
35+
extension
36+
.addAction(
37+
'SyncAll',
38+
_('Save the whole game'),
39+
_('Save the wole game.'),
40+
_('Syncall'),
41+
'res/conditions/animation24.png',
42+
'res/conditions/animation.png'
43+
)
44+
.addCodeOnlyParameter('currentScene', '')
45+
.getCodeExtraInformation()
46+
.setIncludeFile('Extensions/SaveState/savestatetools.js')
47+
.setFunctionName('gdjs.saveState.saveWholeGame');
48+
49+
extension
50+
.addAction(
51+
'LoadAll',
52+
_('Load the whole game'),
53+
_('Load the wole game.'),
54+
_('Loadall'),
55+
'res/conditions/animation24.png',
56+
'res/conditions/animation.png'
57+
)
58+
.addCodeOnlyParameter('currentScene', '')
59+
.getCodeExtraInformation()
60+
.setIncludeFile('Extensions/SaveState/savestatetools.js')
61+
.setFunctionName('gdjs.saveState.loadWholeGame');
62+
63+
return extension;
64+
},
65+
runExtensionSanityTests: function (gd, extension) {
66+
return [];
67+
},
68+
};
+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
namespace gdjs {
2+
export namespace saveState {
3+
const fs = require('fs');
4+
export const saveWholeGame = function (currentScene: RuntimeScene) {
5+
let allSyncData: GameSaveState = {
6+
gameNetworkSyncData: {},
7+
layoutNetworkSyncDatas: [],
8+
};
9+
const gameData = currentScene
10+
.getGame()
11+
.getNetworkSyncData({ syncEverythingForWholeGameSaveState: true });
12+
const sceneStack = currentScene.getGame()._sceneStack._stack;
13+
if (gameData) {
14+
allSyncData.gameNetworkSyncData = gameData;
15+
}
16+
17+
if (sceneStack) {
18+
sceneStack.forEach((scene, index) => {
19+
const sceneDatas = scene.getNetworkSyncData({
20+
syncEverythingForWholeGameSaveState: true,
21+
});
22+
if (sceneDatas) {
23+
allSyncData.layoutNetworkSyncDatas[index] = {
24+
sceneData: {} as LayoutNetworkSyncData,
25+
objectDatas: {},
26+
};
27+
allSyncData.layoutNetworkSyncDatas[index].sceneData = sceneDatas;
28+
const sceneObjects = scene.getAdhocListOfAllInstances();
29+
for (const key in sceneObjects) {
30+
if (sceneObjects.hasOwnProperty(key)) {
31+
const object = sceneObjects[key];
32+
const syncData = object.getNetworkSyncData(true);
33+
allSyncData.layoutNetworkSyncDatas[index].objectDatas[
34+
object.name
35+
] = [];
36+
allSyncData.layoutNetworkSyncDatas[index].objectDatas[
37+
object.name
38+
].push(syncData);
39+
}
40+
}
41+
}
42+
});
43+
}
44+
const syncDataJson = JSON.stringify(allSyncData);
45+
fs.writeFile('UsersData.json', syncDataJson, (error) => {
46+
if (error) {
47+
console.log(error);
48+
}
49+
});
50+
console.log(syncDataJson);
51+
// this.LoadWholeGame(syncDataJson);
52+
};
53+
54+
export const loadWholeGame = function () {
55+
this._runtimeScene._destroy();
56+
const allSyncData = JSON.parse(this._allSyncData);
57+
const sceneStack = allSyncData[0].ss;
58+
console.log(sceneStack);
59+
let sceneIndex = 1;
60+
sceneStack.forEach((sceneData: any) => {
61+
let scene = sceneStack[sceneIndex];
62+
63+
if (!scene) {
64+
const sceneAndExtensionData = allSyncData[sceneIndex];
65+
scene = new gdjs.RuntimeScene(this._runtimeScene.getGame());
66+
scene.loadFromScene(sceneAndExtensionData, {
67+
skipCreatingInstances: true,
68+
});
69+
console.log(scene);
70+
}
71+
scene.updateFromNetworkSyncData();
72+
const sceneObjects = scene.getAdhocListOfAllInstances();
73+
for (const key in sceneObjects) {
74+
if (sceneObjects.hasOwnProperty(key)) {
75+
const object = sceneObjects[key];
76+
const objectSyncData = sceneData.objects[key];
77+
if (objectSyncData) {
78+
object.onCreated();
79+
object.updateFromNetworkSyncData(objectSyncData);
80+
}
81+
}
82+
}
83+
84+
sceneIndex++;
85+
});
86+
};
87+
}
88+
}

GDJS/Runtime/runtimegame.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -1360,14 +1360,18 @@ namespace gdjs {
13601360
const extensionVariablesSyncData =
13611361
variables.getNetworkSyncData(syncOptions);
13621362
// If there is no variables to sync, don't include the extension in the sync data.
1363-
if (extensionVariablesSyncData.length && !syncOptions.syncEverythingForWholeGameSaveState) {
1363+
if (
1364+
extensionVariablesSyncData.length &&
1365+
!syncOptions.syncEverythingForWholeGameSaveState
1366+
) {
13641367
extensionsVariablesSyncData[extensionName] =
13651368
extensionVariablesSyncData;
13661369
}
13671370
});
13681371
syncData.extVar = extensionsVariablesSyncData;
13691372

1370-
if (!syncOptions.syncEverythingForWholeGameSaveState &&
1373+
if (
1374+
!syncOptions.syncEverythingForWholeGameSaveState &&
13711375
(!syncData.var || syncData.var.length === 0) &&
13721376
!syncData.ss &&
13731377
(!syncData.extVar || Object.keys(syncData.extVar).length === 0)

GDJS/Runtime/runtimeobject.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ namespace gdjs {
454454
* This can be redefined by objects to send more information.
455455
* @returns The full network sync data.
456456
*/
457-
getNetworkSyncData(saveWholeGame? : boolean): ObjectNetworkSyncData {
457+
getNetworkSyncData(saveWholeGame?: boolean): ObjectNetworkSyncData {
458458
const behaviorNetworkSyncData = {};
459459
this._behaviors.forEach((behavior) => {
460460
if (!behavior.isSyncedOverNetwork() && !saveWholeGame) {

GDJS/Runtime/runtimescene.ts

+17-13
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ namespace gdjs {
124124
* @param sceneAndExtensionsData An object containing the scene data.
125125
* @see gdjs.RuntimeGame#getSceneAndExtensionsData
126126
*/
127-
loadFromScene(sceneAndExtensionsData: SceneAndExtensionsData | null, options?: {skipCreatingInstances?: boolean}) {
127+
loadFromScene(
128+
sceneAndExtensionsData: SceneAndExtensionsData | null,
129+
options?: { skipCreatingInstances?: boolean }
130+
) {
128131
if (!sceneAndExtensionsData) {
129132
logger.error('loadFromScene was called without a scene');
130133
return;
@@ -182,15 +185,15 @@ namespace gdjs {
182185
}
183186

184187
//Create initial instances of objects
185-
if(!options || !options.skipCreatingInstances)
186-
this.createObjectsFrom(
187-
sceneData.instances,
188-
0,
189-
0,
190-
0,
191-
/*trackByPersistentUuid=*/
192-
true
193-
);
188+
if (!options || !options.skipCreatingInstances)
189+
this.createObjectsFrom(
190+
sceneData.instances,
191+
0,
192+
0,
193+
0,
194+
/*trackByPersistentUuid=*/
195+
true
196+
);
194197

195198
// Set up the default z order (for objects created from events)
196199
this._setLayerDefaultZOrders();
@@ -813,7 +816,10 @@ namespace gdjs {
813816
const extensionVariablesSyncData =
814817
variables.getNetworkSyncData(syncOptions);
815818
// If there is no variables to sync, don't include the extension in the sync data.
816-
if (extensionVariablesSyncData && !syncOptions.syncEverythingForWholeGameSaveState) {
819+
if (
820+
extensionVariablesSyncData &&
821+
!syncOptions.syncEverythingForWholeGameSaveState
822+
) {
817823
extensionsVariablesSyncData[extensionName] =
818824
extensionVariablesSyncData;
819825
}
@@ -841,7 +847,6 @@ namespace gdjs {
841847
}
842848

843849
updateFromNetworkSyncData(syncData: LayoutNetworkSyncData) {
844-
845850
if (syncData.var) {
846851
this._variables.updateFromNetworkSyncData(syncData.var);
847852
}
@@ -861,7 +866,6 @@ namespace gdjs {
861866
}
862867
}
863868
}
864-
865869

866870
getOrCreateNetworkId(): string {
867871
if (!this.networkId) {

GDJS/Runtime/types/save-state.d.ts

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
declare type SceneSaveState = {
2+
sceneData: LayoutNetworkSyncData;
3+
objectDatas: { [objectName: string]: ObjectNetworkSyncData[] };
4+
};
5+
6+
declare type GameSaveState = {
7+
gameNetworkSyncData: GameNetworkSyncData;
8+
layoutNetworkSyncDatas: SceneSaveState[];
9+
};

newIDE/app/src/JsExtensionsLoader/BrowserJsExtensionsLoader.js

+6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ const jsExtensions = [
4141
extensionModule: require('GDJS-for-web-app-only/Runtime/Extensions/DeviceVibration/JsExtension.js'),
4242
objectsRenderingServiceModules: {},
4343
},
44+
{
45+
name: 'SaveState',
46+
// $FlowExpectedError - this path is ignored for Flow.
47+
extensionModule: require('GDJS-for-web-app-only/Runtime/Extensions/SaveState/JsExtension.js'),
48+
objectsRenderingServiceModules: {},
49+
},
4450
{
4551
name: 'DebuggerTools',
4652
// $FlowExpectedError - this path is ignored for Flow.

0 commit comments

Comments
 (0)