Make "Pause Scene" function more usable by saving audio and tween data

Hello there whoever this may concern

This suggestion is to automatically pause the audio and current tweens as well when pausing a scene.
Currently when pausing a scene and returning to the scene, all sounds that were being played when paused stop and down start playing again.
And when you pause a scene while an object is tweenes, it also creates weird behaviors:
it does not continue the tweens where they stopped, also I had the impression that it turns all tweened objects visible, even when they were invisible on pause. And after an object has been paused during a tween once, then you come back, the object moves, and then when you pause and unpause a scene again, the object is not where it was at the end, but jumps back to where it was paused the first time during the tween.

So the feature request is:
save audio and tween data for pausing scenes.

I will avoid the pause function from now on, because it is too clumsy and it creates too many issues.
But pausing a scene manually (stopping all moving objects, storing all objects forces to continue them later on, storing all tween data, storing all audio positions and volume, etc.) is a lot of work. So having an automated function that handles it would be of great help.

And since it’s related, I will add that what has been already requested before (here or here, indirectly here), that multiple paused scenes can be helpful.

Pausing scenes should pause tweens - if it’s not working that’s a bug and I encourage you to prepare a small project showcasing the issue so we can debug it :slight_smile:

And scenes are also made so that multiple scenes can be paused. Same thing, if it’s not working for you, I encourage to build a minimal project showing the issue, because from what I remember last time I tried it worked.

@4ian

I have tested and confirmed that tweens are pausing fine. https://game-previews.gdevelop-app.com/1662982194080-127915/index.html

However, sounds/music do behave oddly when paused. Basically if you “stop and go back to a previous scene” with audio playing, it behaves as if you have the “Stop music and sounds on startup” disabled. The music/sound from the last “new” scene keeps playing over the resumed scene.

I expect that it’s likely because the resumed scene isn’t “starting up”, but I would expect this to be undesired behavior for the developer, and believe that if you’re resuming a scene it should probably resume all sound/music playing at the offset they were at when paused. I did also test pausing the sound channel before pausing the scene, then starting the paused sound channel back up upon resume, but it acts like there’s no paused channel.

Here’s the exported JSON that you can copy and paste into a json file to test locally. (This doesn’t include the pause channel/resume channel logic as that was on an earlier version)

{"firstLayout":"","gdVersion":{"build":99,"major":4,"minor":0,"revision":0},"properties":{"adaptGameResolutionAtRuntime":true,"folderProject":false,"orientation":"landscape","packageName":"com.example.gamename","pixelsRounding":false,"projectUuid":"60a28356-5ff7-4280-934f-e10e54e35125","scaleMode":"linear","sizeOnStartupMode":"adaptWidth","templateSlug":"","useExternalSourceFiles":false,"version":"1.0.0","name":"Absorbing Fact","description":"","author":"","windowWidth":800,"windowHeight":600,"latestCompilationDirectory":"","maxFPS":60,"minFPS":20,"verticalSync":false,"platformSpecificAssets":{},"loadingScreen":{"backgroundColor":0,"backgroundFadeInDuration":0.2,"backgroundImageResourceName":"","gdevelopLogoStyle":"light","logoAndProgressFadeInDuration":0.2,"logoAndProgressLogoFadeInDelay":0.2,"minDuration":1.5,"progressBarColor":16777215,"progressBarHeight":20,"progressBarMaxWidth":200,"progressBarMinWidth":40,"progressBarWidthPercent":30,"showGDevelopSplash":true,"showProgressBar":true},"authorIds":[],"categories":[],"playableDevices":[],"extensionProperties":[],"platforms":[{"name":"GDevelop JS platform"}],"currentPlatform":"GDevelop JS platform"},"resources":{"resources":[{"alwaysLoaded":false,"file":"https://resources.gdevelop-app.com/assets/Interface/PX UI Basic/Blue Box_No Shadow.png","kind":"image","metadata":"","name":"Blue Box_No Shadow.png","smoothed":true,"userAdded":false,"origin":{"identifier":"https://resources.gdevelop-app.com/assets/Interface/PX UI Basic/Blue Box_No Shadow.png","name":"gdevelop-asset-store"}},{"alwaysLoaded":false,"file":"https://resources.gdevelop-app.com/assets/Interface/PX UI Basic/Blue Box_Shadow.png","kind":"image","metadata":"","name":"Blue Box_Shadow.png","smoothed":true,"userAdded":false,"origin":{"identifier":"https://resources.gdevelop-app.com/assets/Interface/PX UI Basic/Blue Box_Shadow.png","name":"gdevelop-asset-store"}},{"file":"https://resources.gdevelop-app.com/assets/Music/Electronic/Meditating Beat.aac","kind":"audio","metadata":"","name":"Meditating Beat.aac","preloadAsMusic":false,"preloadAsSound":true,"preloadInCache":false,"userAdded":true,"origin":{"identifier":"https://resources.gdevelop-app.com/assets/Music/Electronic/Meditating Beat.aac","name":"gdevelop-asset-store"}},{"file":"https://resources.gdevelop-app.com/assets/Music/Underscoring/Desert Fox Underscore.aac","kind":"audio","metadata":"","name":"Desert Fox Underscore.aac","preloadAsMusic":false,"preloadAsSound":true,"preloadInCache":false,"userAdded":true,"origin":{"identifier":"https://resources.gdevelop-app.com/assets/Music/Underscoring/Desert Fox Underscore.aac","name":"gdevelop-asset-store"}},{"file":"https://resources.gdevelop-app.com/assets/Music/Horror/Consecrated Ground.aac","kind":"audio","metadata":"","name":"Consecrated Ground.aac","preloadAsMusic":false,"preloadAsSound":true,"preloadInCache":false,"userAdded":false,"origin":{"identifier":"https://resources.gdevelop-app.com/assets/Music/Horror/Consecrated Ground.aac","name":"gdevelop-asset-store"}}],"resourceFolders":[]},"objects":[],"objectsGroups":[],"variables":[],"layouts":[{"b":209,"disableInputWhenNotFocused":true,"mangledName":"Untitled_32scene3","name":"Untitled scene3","r":209,"standardSortMethod":true,"stopSoundsOnStartup":true,"title":"","v":209,"uiSettings":{"grid":false,"gridType":"rectangular","gridWidth":32,"gridHeight":32,"gridOffsetX":0,"gridOffsetY":0,"gridColor":10401023,"gridAlpha":0.8,"snap":false,"zoomFactor":1,"windowMask":false},"objectsGroups":[],"variables":[],"instances":[{"angle":0,"customSize":false,"height":0,"layer":"","name":"BlueBox","persistentUuid":"268fa641-5695-4acf-81c0-99bc91b009dc","width":0,"x":268,"y":433,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0,"customSize":false,"height":0,"layer":"","name":"NewText","persistentUuid":"509385dd-461e-444a-9d93-671f4b73ddbe","width":0,"x":477,"y":29,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"objects":[{"assetStoreId":"af21f69c20a38f1d1aefb475da60f7ff181f851b4f74ead05d185b7f104d2af8","name":"BlueBox","tags":"","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[{"name":"Tween","type":"Tween::TweenBehavior"}],"animations":[{"name":"No Shadow","useMultipleDirections":false,"directions":[{"looping":true,"timeBetweenFrames":0.02500000037252903,"sprites":[{"hasCustomCollisionMask":false,"image":"Blue Box_No Shadow.png","points":[],"originPoint":{"name":"origine","x":0,"y":0},"centerPoint":{"automatic":true,"name":"centre","x":0,"y":0},"customCollisionMask":[]}]}]},{"name":"Shadow","useMultipleDirections":false,"directions":[{"looping":true,"timeBetweenFrames":0.02500000037252903,"sprites":[{"hasCustomCollisionMask":false,"image":"Blue Box_Shadow.png","points":[],"originPoint":{"name":"origine","x":0,"y":0},"centerPoint":{"automatic":true,"name":"centre","x":0,"y":0},"customCollisionMask":[]}]}]}]},{"assetStoreId":"","bold":false,"italic":false,"name":"NewText","smoothed":true,"tags":"","type":"TextObject::Text","underlined":false,"variables":[],"effects":[],"behaviors":[],"string":"Press B to return to Scene 2","font":"","characterSize":20,"color":{"b":0,"g":0,"r":0}}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"DepartScene"},"parameters":[""]}],"actions":[{"type":{"value":"PlaySoundCanal"},"parameters":["","Consecrated Ground.aac","3","yes","",""]},{"type":{"value":"Tween::AddObjectScaleTween"},"parameters":["BlueBox","Tween","\"bounceUp\"","3","3","\"bounce\"","3000","","yes"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"Tween::HasFinished"},"parameters":["BlueBox","Tween","\"bounceUp\""]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"Tween::AddObjectScaleTween"},"parameters":["BlueBox","Tween","\"bounceDown\"","1","1","\"bounce\"","3000","","yes"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"Tween::HasFinished"},"parameters":["BlueBox","Tween","\"bounceDown\""]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"Tween::AddObjectScaleTween"},"parameters":["BlueBox","Tween","\"bounceUp\"","3","3","\"bounce\"","3000","","yes"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"KeyPressed"},"parameters":["","b"]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"PopScene"},"parameters":[""]}]}],"layers":[{"ambientLightColorB":32,"ambientLightColorG":0,"ambientLightColorR":0,"followBaseLayerCamera":false,"isLightingLayer":false,"name":"","visibility":true,"cameras":[{"defaultSize":true,"defaultViewport":true,"height":0,"viewportBottom":1,"viewportLeft":0,"viewportRight":1,"viewportTop":0,"width":0}],"effects":[]}],"behaviorsSharedData":[{"name":"Tween","type":"Tween::TweenBehavior"}]},{"b":209,"disableInputWhenNotFocused":true,"mangledName":"Untitled_32scene2","name":"Untitled scene2","r":209,"standardSortMethod":true,"stopSoundsOnStartup":true,"title":"","v":209,"uiSettings":{"grid":false,"gridType":"rectangular","gridWidth":32,"gridHeight":32,"gridOffsetX":0,"gridOffsetY":0,"gridColor":10401023,"gridAlpha":0.8,"snap":false,"zoomFactor":1,"windowMask":false},"objectsGroups":[],"variables":[],"instances":[{"angle":0,"customSize":false,"height":0,"layer":"","name":"BlueBox","persistentUuid":"268fa641-5695-4acf-81c0-99bc91b009dc","width":0,"x":268,"y":433,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0,"customSize":false,"height":0,"layer":"","name":"NewText","persistentUuid":"9d4ce17a-b4a3-47de-b24a-d936f046af31","width":0,"x":448,"y":28,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"objects":[{"assetStoreId":"af21f69c20a38f1d1aefb475da60f7ff181f851b4f74ead05d185b7f104d2af8","name":"BlueBox","tags":"","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[{"name":"Tween","type":"Tween::TweenBehavior"}],"animations":[{"name":"No Shadow","useMultipleDirections":false,"directions":[{"looping":true,"timeBetweenFrames":0.02500000037252903,"sprites":[{"hasCustomCollisionMask":false,"image":"Blue Box_No Shadow.png","points":[],"originPoint":{"name":"origine","x":0,"y":0},"centerPoint":{"automatic":true,"name":"centre","x":0,"y":0},"customCollisionMask":[]}]}]},{"name":"Shadow","useMultipleDirections":false,"directions":[{"looping":true,"timeBetweenFrames":0.02500000037252903,"sprites":[{"hasCustomCollisionMask":false,"image":"Blue Box_Shadow.png","points":[],"originPoint":{"name":"origine","x":0,"y":0},"centerPoint":{"automatic":true,"name":"centre","x":0,"y":0},"customCollisionMask":[]}]}]}]},{"assetStoreId":"","bold":false,"italic":false,"name":"NewText","smoothed":true,"tags":"","type":"TextObject::Text","underlined":false,"variables":[],"effects":[],"behaviors":[],"string":"Press 2 to pause and go to Scene 3\nPress A to return to Scene 1","font":"","characterSize":20,"color":{"b":0,"g":0,"r":0}}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"DepartScene"},"parameters":[""]}],"actions":[{"type":{"value":"PlaySoundCanal"},"parameters":["","Desert Fox Underscore.aac","2","yes","",""]},{"type":{"value":"Tween::AddObjectPositionXTween"},"parameters":["BlueBox","Tween","\"bounceUp\"","500","\"bounce\"","3000","3000"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"Tween::HasFinished"},"parameters":["BlueBox","Tween","\"bounceUp\""]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"Tween::AddObjectPositionXTween"},"parameters":["BlueBox","Tween","\"bounceDown\"","268","\"bounce\"","3000","3000"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"Tween::HasFinished"},"parameters":["BlueBox","Tween","\"bounceDown\""]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"Tween::AddObjectPositionXTween"},"parameters":["BlueBox","Tween","\"bounceUp\"","500","\"bounce\"","3000","3000"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"KeyPressed"},"parameters":["","Num2"]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"PushScene"},"parameters":["","\"Untitled scene3\""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"KeyPressed"},"parameters":["","a"]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"PopScene"},"parameters":[""]}]}],"layers":[{"ambientLightColorB":32,"ambientLightColorG":0,"ambientLightColorR":0,"followBaseLayerCamera":false,"isLightingLayer":false,"name":"","visibility":true,"cameras":[{"defaultSize":true,"defaultViewport":true,"height":0,"viewportBottom":1,"viewportLeft":0,"viewportRight":1,"viewportTop":0,"width":0}],"effects":[]}],"behaviorsSharedData":[{"name":"Tween","type":"Tween::TweenBehavior"}]},{"b":209,"disableInputWhenNotFocused":true,"mangledName":"Untitled_32scene","name":"Untitled scene","r":209,"standardSortMethod":true,"stopSoundsOnStartup":true,"title":"","v":209,"uiSettings":{"grid":false,"gridType":"rectangular","gridWidth":32,"gridHeight":32,"gridOffsetX":0,"gridOffsetY":0,"gridColor":10401023,"gridAlpha":0.8,"snap":false,"zoomFactor":1,"windowMask":false},"objectsGroups":[],"variables":[],"instances":[{"angle":0,"customSize":false,"height":0,"layer":"","name":"BlueBox","persistentUuid":"268fa641-5695-4acf-81c0-99bc91b009dc","width":0,"x":268,"y":433,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0,"customSize":false,"height":0,"layer":"","name":"NewText","persistentUuid":"4e09fa8c-af90-4c19-ba55-c2eea5dec224","width":0,"x":452,"y":37,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"objects":[{"assetStoreId":"af21f69c20a38f1d1aefb475da60f7ff181f851b4f74ead05d185b7f104d2af8","name":"BlueBox","tags":"","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[{"name":"Tween","type":"Tween::TweenBehavior"}],"animations":[{"name":"No Shadow","useMultipleDirections":false,"directions":[{"looping":true,"timeBetweenFrames":0.02500000037252903,"sprites":[{"hasCustomCollisionMask":false,"image":"Blue Box_No Shadow.png","points":[],"originPoint":{"name":"origine","x":0,"y":0},"centerPoint":{"automatic":true,"name":"centre","x":0,"y":0},"customCollisionMask":[]}]}]},{"name":"Shadow","useMultipleDirections":false,"directions":[{"looping":true,"timeBetweenFrames":0.02500000037252903,"sprites":[{"hasCustomCollisionMask":false,"image":"Blue Box_Shadow.png","points":[],"originPoint":{"name":"origine","x":0,"y":0},"centerPoint":{"automatic":true,"name":"centre","x":0,"y":0},"customCollisionMask":[]}]}]}]},{"assetStoreId":"","bold":false,"italic":false,"name":"NewText","smoothed":true,"tags":"","type":"TextObject::Text","underlined":false,"variables":[],"effects":[],"behaviors":[],"string":"Press 1 to pause and go to Scene 2\n","font":"","characterSize":20,"color":{"b":0,"g":0,"r":0}}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"DepartScene"},"parameters":[""]}],"actions":[{"type":{"value":"PlaySoundCanal"},"parameters":["","Meditating Beat.aac","1","yes","",""]},{"type":{"value":"Tween::AddObjectPositionTween"},"parameters":["BlueBox","Tween","\"bounceUp\"","0","0","\"bounce\"","3000",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"Tween::HasFinished"},"parameters":["BlueBox","Tween","\"bounceUp\""]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"Tween::AddObjectPositionTween"},"parameters":["BlueBox","Tween","\"bounceDown\"","268","433","\"bounce\"","3000",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"Tween::HasFinished"},"parameters":["BlueBox","Tween","\"bounceDown\""]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"Tween::AddObjectPositionTween"},"parameters":["BlueBox","Tween","\"bounceUp\"","0","0","\"bounce\"","3000",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"KeyPressed"},"parameters":["","Num1"]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"PauseSoundCanal"},"parameters":["","1"]},{"type":{"value":"PushScene"},"parameters":["","\"Untitled scene2\""]}]}],"layers":[{"ambientLightColorB":32,"ambientLightColorG":0,"ambientLightColorR":0,"followBaseLayerCamera":false,"isLightingLayer":false,"name":"","visibility":true,"cameras":[{"defaultSize":true,"defaultViewport":true,"height":0,"viewportBottom":1,"viewportLeft":0,"viewportRight":1,"viewportTop":0,"width":0}],"effects":[]}],"behaviorsSharedData":[{"name":"Tween","type":"Tween::TweenBehavior"}]}],"externalEvents":[],"eventsFunctionsExtensions":[],"externalLayouts":[],"externalSourceFiles":[]}

For @LeakySafe, feel free to look at the project to see where your resuming is going wrong. Make sure you’re using the “Pause and change to scene” and “Stop and go back to previous scene” actions. Paused scenes act like a stack of cards, you can only resume one at a time in order from top down. If you ever use “Change the scene” it does not resume the scene you’re changing to.

1.) Regarding thet tweens issue for the pausing, I will create a sample project with the issue when I have the time, so that you can check why it goes wrong. It might be a combination of tweens with other actions together that cause the bug.
Basically the enemies do not regain their original size after the tween has finished, as they would if I hadn’t paused the scene. And when I pause and return to the scene multiple times, they respawn at the position where the player collided with them, instead of where they were when I last paused the scene.

2.) I am aware that multiple scenes can be paused without a limit. However you can only pause one scene and use it.
To clarify:
In this theoretical example you have 3 scenes. I can pause scene 1, move to scene 2, pause scene 2, move to scene 3. Now I cannot go back to the paused scene 1 without quitting scene 3 and 2 first to return to the previous scene. I cannot keep two or more scenes paused at the same time, and access them interchangeably.

sample

There is no way to keep scenes 2 and 3 paused and return to the previous scene 1. You currently have to close scenes 2 and 3 to go back to scene 1. That’s why effectively you cannot pause more than one scene to which you can return.

After pausing scenes 1,2 and 3 and then being on scene 3, if now I pause scene 3 and open scene 1, it creates a new instance of the scene inside the scene array, instead of going back to the already paused scene 1:

So that is the reason why you cannot pause multiple scenes.
The most intuitive functions to solve that I thought of would be:
-close current scene and open ‘this’ scene (equivalent to current “Change Scene” function)
-pause current scene and open ‘this’ scene (and now if the newly opened scene is already paused, it goes to the paused instance of the scene instead of creating a new instance of the scene)
(an additional option could be to add:
-keep current scene running in the background and open ‘this’ scene, which would be ideal for idle games, adventure games, time based building games etc.)

I hope that made it clearer.

Basically there is a need to access any of all paused scene deliberately, without closing the current scene.

Edit:
It might be more efficient to implement:
Just when pausing a scene and opening a new one, if it opens the already paused scenes instead of creating a new instance of them, that would already solve the entire issue.

Regarding the scenes, I described the scene dynamics I’m talking about in detail above.

Regarding sounds, here is the detailed behavior:

When pausing scene 1 and opening scene 2, and then returning to scene 1:
the current behavior:
1.) the sounds of scene 1 all have been stopped and do not resume at the time where they were when the scene was paused
2.) the sounds of scene 2 continue, despite scene 2 having been closed.

desired behavior:
1.) the sounds of scene 1 continue where you left them when pausing the scene
2.) the sounds of scene 2 stop when closing scene 2.

This is the sample project for the tween/pause bug. I tried to exclude all parts unrelated to the bug:

When you collide with the yellow objects, the yellow object quickly tween shrinks and then reappears outside of the screen at the normal size.

However when I pause the scene and then return to the scene, all yellow objects that I collided with, now have a way too small size, and re-appear exactly at the position where I collided with them instead where they were when I paused the game.

Screenshot right before I pause the scene:

Screenshot right after I return to that same scene:

Here is the project file:

The collision and tweening happens in the external event “Enemy behavior”

Hi there,

did the download link work, were you able to open the project file?

I made one last change to simplify the project and make it clearer, so that the camera is zoomed out and you can see everything that happens, and removed the sound.

Be patient with the devs, it could take a few days before they can look in to this.
You may also want to post this in to the bug report section or GitHub.

If you want to allow players to save the game, quit and then load the save when the game is launched again, you need to use storage events anyway. So I would recommend to implement your own pause mechanic using storage events. It is more efficient and you also have more control, maybe able to fix some of the bugs and limitations you mention.

Sure I wasn’t actually asking or expecting anyone to look into this right now, I was just verifying if the download link works, possibly also with the question in mind if maybe more information is needed from my side, and everything I wrote was clear, since there was no confirmation. It’s also my first time using WeTransfer. Does the download link work for you?

Yep, I might do that thanks

Long term save/load storage does not really work for html5, and I don’t usually use a save/load system. Also for many types of projects that would mean spending 50% of the time just working on a pause scene instead of the game itself: saving position, current forces, current scale, width, height, tint, effect, every single effect parameter for every effect for every single object. All the scene variables, all the global variables, all the object variables…
And let alone the work for 100 different instances of an object when they have different parameters depending on their progress. Also you cannot save a tween progress exactly if you have cubic easing for example, you cannot recreate and continue it exactly, only approximately. Also you cannot save particle progress and the amount of particles currently on screen. Also all data stored by extensions and dependencies might be difficult to get access to and store as well. For example for the rectangular movement extension, you cannot save the movement progress. You would have to restart the movement from position 0 of the rectangular movement when reloading a scene that way.

And since all progress is stored inside the paused scene array tables anyways, it seems to be more viable to make paused scenes interchangeable and more accessible, instead of basically having to manually recreate the entire scene data array a second time in storage. It would be more intuitive.