gdcore-tools 2.0.0-beta2 → 2.0.0-beta4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Runtime/AsyncTasksManager.js +2 -2
- package/dist/Runtime/AsyncTasksManager.js.map +2 -2
- package/dist/Runtime/Cordova/config.xml +23 -1
- package/dist/Runtime/Cordova/www/LICENSE.GDevelop.txt +2 -0
- package/dist/Runtime/Cordova/www/index.html +1 -1
- package/dist/Runtime/CustomRuntimeObject.js +1 -1
- package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
- package/dist/Runtime/CustomRuntimeObject2D.js +2 -0
- package/dist/Runtime/CustomRuntimeObject2D.js.map +7 -0
- package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js +1 -1
- package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js.map +2 -2
- package/dist/Runtime/Electron/LICENSE.GDevelop.txt +2 -0
- package/dist/Runtime/Electron/package.json +3 -0
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js +1 -1
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3DRenderer.js +1 -1
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3DRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/3D/AmbientLight.js +1 -1
- package/dist/Runtime/Extensions/3D/AmbientLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Base3DBehavior.js +1 -1
- package/dist/Runtime/Extensions/3D/Base3DBehavior.js.map +2 -2
- package/dist/Runtime/Extensions/3D/BloomEffect.js +1 -1
- package/dist/Runtime/Extensions/3D/BloomEffect.js.map +2 -2
- package/dist/Runtime/Extensions/3D/BrightnessAndContrastEffect.js +1 -1
- package/dist/Runtime/Extensions/3D/BrightnessAndContrastEffect.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js +1 -1
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js +2 -0
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +7 -0
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3DRenderer.js +2 -0
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3DRenderer.js.map +7 -0
- package/dist/Runtime/Extensions/3D/DirectionalLight.js +1 -1
- package/dist/Runtime/Extensions/3D/DirectionalLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/ExponentialFog.js +1 -1
- package/dist/Runtime/Extensions/3D/ExponentialFog.js.map +2 -2
- package/dist/Runtime/Extensions/3D/ExposureEffect.js +1 -1
- package/dist/Runtime/Extensions/3D/ExposureEffect.js.map +2 -2
- package/dist/Runtime/Extensions/3D/HemisphereLight.js +1 -1
- package/dist/Runtime/Extensions/3D/HemisphereLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/HueAndSaturationEffect.js +1 -1
- package/dist/Runtime/Extensions/3D/HueAndSaturationEffect.js.map +2 -2
- package/dist/Runtime/Extensions/3D/JsExtension.js +56 -24
- package/dist/Runtime/Extensions/3D/LinearFog.js +1 -1
- package/dist/Runtime/Extensions/3D/LinearFog.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js +1 -1
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js +1 -1
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/AdMob/JsExtension.js +11 -10
- package/dist/Runtime/Extensions/AdMob/admobtools.js +1 -1
- package/dist/Runtime/Extensions/AdMob/admobtools.js.map +2 -2
- package/dist/Runtime/Extensions/AnchorBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/BBText/JsExtension.js +20 -11
- package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/BitmapText/JsExtension.js +2 -8
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/CMakeLists.txt +35 -0
- package/dist/Runtime/Extensions/CMakeUtils.txt +81 -0
- package/dist/Runtime/Extensions/DestroyOutsideBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/DestroyOutsideBehavior/destroyoutsideruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/DialogueTree/bondage.js/version.txt +5 -0
- package/dist/Runtime/Extensions/DraggableBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/Effects/adjustment-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/adjustment-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/advanced-bloom-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/advanced-bloom-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/ascii-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/ascii-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/black-and-white-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/black-and-white-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/blending-mode-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/blending-mode-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/brightness-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/brightness-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/bulge-pinch-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/bulge-pinch-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-map-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/color-map-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/crt-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/crt-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/displacement-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/displacement-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/dot-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/dot-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glitch-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/glitch-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/godray-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/godray-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/hsl-adjustment-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/hsl-adjustment-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/light-night-pixi-filter.js +2 -2
- package/dist/Runtime/Extensions/Effects/light-night-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/motion-blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/motion-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/night-pixi-filter.js +2 -2
- package/dist/Runtime/Extensions/Effects/night-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/noise-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/noise-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/old-film-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/old-film-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/pixelate-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/pixelate-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/radial-blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/radial-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/reflection-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/reflection-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/rgb-split-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/rgb-split-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/sepia-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/sepia-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/shockwave-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/shockwave-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/tilt-shift-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/tilt-shift-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/twist-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/twist-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/zoom-blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/zoom-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/ExampleJsExtension/JsExtension.js +2 -11
- package/dist/Runtime/Extensions/ExampleJsExtension/dummyeffect.js +1 -1
- package/dist/Runtime/Extensions/ExampleJsExtension/dummyeffect.js.map +2 -2
- package/dist/Runtime/Extensions/FileSystem/JsExtension.js +22 -0
- package/dist/Runtime/Extensions/FileSystem/filesystemtools.js +1 -1
- package/dist/Runtime/Extensions/FileSystem/filesystemtools.js.map +2 -2
- package/dist/Runtime/Extensions/Firebase/A_firebasejs/NOTICE.txt +6 -0
- package/dist/Runtime/Extensions/Inventory/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/JsExtensionTypes.d.ts +13 -4
- package/dist/Runtime/Extensions/Leaderboards/JsExtension.js +42 -1
- package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js +1 -1
- package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/JsExtension.js +2 -11
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/LinkedObjects/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/LinkedObjects/linkedobjects.js +1 -1
- package/dist/Runtime/Extensions/LinkedObjects/linkedobjects.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/JsExtension.js +1130 -0
- package/dist/Runtime/Extensions/Multiplayer/messageManager.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/messageManager.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerVariablesManager.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerVariablesManager.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/peer.js +10 -0
- package/dist/Runtime/Extensions/Multiplayer/peer.js.map +1 -0
- package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/peerjs.d.ts +509 -0
- package/dist/Runtime/Extensions/P2P/A_peer.js +8 -2
- package/dist/Runtime/Extensions/P2P/A_peer.js.map +1 -1
- package/dist/Runtime/Extensions/P2P/B_p2ptools.js +1 -1
- package/dist/Runtime/Extensions/P2P/B_p2ptools.js.map +2 -2
- package/dist/Runtime/Extensions/P2P/JsExtension.js +27 -0
- package/dist/Runtime/Extensions/PanelSpriteObject/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js +1 -1
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js.map +2 -2
- package/dist/Runtime/Extensions/PathfindingBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Physics2Behavior/JsExtension.js +47 -4
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js +1 -1
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PhysicsBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PlatformBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlayerAuthentication/JsExtension.js +6 -3
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationcomponents.js +4 -4
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationcomponents.js.map +2 -2
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js +1 -1
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/Shopify/CMakeLists.txt +26 -0
- package/dist/Runtime/Extensions/Spine/CMakeLists.txt +20 -0
- package/dist/Runtime/Extensions/Spine/JsExtension.js +11 -2
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-atlas-manager.js +1 -1
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-atlas-manager.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-manager.js +1 -1
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-manager.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/pixi-spine/Spine-Runtimes-License-Agreement.txt +11 -0
- package/dist/Runtime/Extensions/Spine/pixi-spine/pixi-spine.js +5 -3
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/SystemInfo/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TextEntryObject/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TextInput/JsExtension.js +3 -10
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TextObject/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TextObject/textruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TextObject/textruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/JsExtension.js +834 -23
- package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js +1 -1
- package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js +1 -1
- package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.d.ts +2 -0
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/CommonTypes.d.ts +12 -0
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/CommonTypes.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts +119 -5
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapManager.d.ts +25 -0
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapManager.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts +16 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js +2 -0
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +7 -0
- package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TiledSpriteObject/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TopDownMovementBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/TweenBehavior/JsExtension.js +2 -2
- package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Video/JsExtension.js +2 -11
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
- package/dist/Runtime/RuntimeInstanceContainer.js +1 -1
- package/dist/Runtime/RuntimeInstanceContainer.js.map +2 -2
- package/dist/Runtime/SpriteAnimator.js +2 -0
- package/dist/Runtime/SpriteAnimator.js.map +7 -0
- package/dist/Runtime/debugger-client/hot-reloader.js +1 -1
- package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
- package/dist/Runtime/events-tools/objecttools.js +1 -1
- package/dist/Runtime/events-tools/objecttools.js.map +2 -2
- package/dist/Runtime/events-tools/runtimescenetools.js +1 -1
- package/dist/Runtime/events-tools/runtimescenetools.js.map +2 -2
- package/dist/Runtime/force.js +1 -1
- package/dist/Runtime/force.js.map +2 -2
- package/dist/Runtime/object-capabilities/TextContainerBehavior.js.map +1 -1
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js +2 -0
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js.map +7 -0
- package/dist/Runtime/pixi-renderers/DebuggerPixiRenderer.js +1 -1
- package/dist/Runtime/pixi-renderers/DebuggerPixiRenderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/layer-pixi-renderer.js +2 -2
- package/dist/Runtime/pixi-renderers/layer-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-filters-tools.js +1 -1
- package/dist/Runtime/pixi-renderers/pixi-filters-tools.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-image-manager.js.map +2 -2
- package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js +1 -1
- package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/polygon.js +1 -1
- package/dist/Runtime/polygon.js.map +2 -2
- package/dist/Runtime/runtimebehavior.js +1 -1
- package/dist/Runtime/runtimebehavior.js.map +2 -2
- package/dist/Runtime/runtimegame.js +1 -1
- package/dist/Runtime/runtimegame.js.map +2 -2
- package/dist/Runtime/runtimeobject.js +1 -1
- package/dist/Runtime/runtimeobject.js.map +2 -2
- package/dist/Runtime/runtimescene.js +1 -1
- package/dist/Runtime/runtimescene.js.map +2 -2
- package/dist/Runtime/scenestack.js +1 -1
- package/dist/Runtime/scenestack.js.map +2 -2
- package/dist/Runtime/spriteruntimeobject.js +1 -1
- package/dist/Runtime/spriteruntimeobject.js.map +2 -2
- package/dist/Runtime/timer.js +1 -1
- package/dist/Runtime/timer.js.map +2 -2
- package/dist/Runtime/types/project-data.d.ts +115 -0
- package/dist/Runtime/variable.js +1 -1
- package/dist/Runtime/variable.js.map +2 -2
- package/dist/Runtime/variablescontainer.js +1 -1
- package/dist/Runtime/variablescontainer.js.map +2 -2
- package/dist/lib/libGD.cjs +2 -1
- package/dist/lib/libGD.wasm +0 -0
- package/dist/loaders.cjs +2 -1
- package/gd.d.ts +217 -223
- package/package.json +15 -7
- package/src/index.js +2 -0
- package/src/open_project.js +1 -1
- package/types/index.d.ts +2 -2
- package/types/open_project.d.ts +5 -5
- package/dist/Runtime/Extensions/Spine/pixi-spine/pixi-spine.js.map +0 -7
- package/dist/Runtime/pixi-renderers/CustomObjectPixiRenderer.js +0 -2
- package/dist/Runtime/pixi-renderers/CustomObjectPixiRenderer.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../GDevelop/GDJS/Runtime/debugger-client/hot-reloader.ts"],
|
|
4
|
-
"sourcesContent": ["namespace gdjs {\n const logger = new gdjs.Logger('Hot reloader');\n export type HotReloaderLog = {\n message: string;\n kind: 'fatal' | 'error' | 'warning' | 'info';\n };\n\n export type ChangedRuntimeBehavior = {\n oldBehaviorConstructor: Function;\n newBehaviorConstructor: Function;\n behaviorTypeName: string;\n };\n\n /**\n * Reload scripts/data of an exported game and applies the changes\n * to the running runtime game.\n */\n export class HotReloader {\n _runtimeGame: gdjs.RuntimeGame;\n _reloadedScriptElement: Record<string, HTMLScriptElement> = {};\n _logs: HotReloaderLog[] = [];\n _alreadyLoadedScriptFiles: Record<string, boolean> = {};\n\n /**\n * @param runtimeGame - The `gdjs.RuntimeGame` to be hot-reloaded.\n */\n constructor(runtimeGame: gdjs.RuntimeGame) {\n this._runtimeGame = runtimeGame;\n }\n\n static groupByPersistentUuid<\n ObjectWithPersistentId extends { persistentUuid: string | null }\n >(\n objectsWithPersistentId: ObjectWithPersistentId[]\n ): Record<string, ObjectWithPersistentId> {\n return objectsWithPersistentId.reduce(function (objectsMap, object) {\n if (object.persistentUuid) {\n objectsMap[object.persistentUuid] = object;\n }\n return objectsMap;\n }, {});\n }\n\n _canReloadScriptFile(srcFilename: string): boolean {\n function endsWith(str: string, suffix: string): boolean {\n const suffixPosition = str.indexOf(suffix);\n return (\n suffixPosition !== -1 && suffixPosition === str.length - suffix.length\n );\n }\n\n // Never reload .h script files, as they are leaking by mistake from C++ extensions.\n if (endsWith(srcFilename, '.h')) {\n return false;\n }\n\n // Make sure some files are loaded only once.\n if (this._alreadyLoadedScriptFiles[srcFilename]) {\n if (\n // Don't reload Box2d as it would confuse and crash the asm.js library.\n endsWith(srcFilename, 'box2d.js') ||\n // Don't reload sha256.js library.\n endsWith(srcFilename, 'sha256.js') ||\n // Don't reload shifty.js library.\n endsWith(srcFilename, 'shifty.js') ||\n // Don't reload shopify-buy library.\n endsWith(srcFilename, 'shopify-buy.umd.polyfilled.min.js') ||\n // Don't reload pixi-multistyle-text library.\n endsWith(srcFilename, 'pixi-multistyle-text.umd.js') ||\n // Don't reload pixi-tilemap library.\n endsWith(srcFilename, 'pixi-tilemap.umd.js') ||\n // Don't reload bondage.js library.\n endsWith(srcFilename, 'bondage.min.js') ||\n // Don't reload pixi-particles library.\n endsWith(srcFilename, 'pixi-particles-pixi-renderer.min.js') ||\n // Don't reload pixi-tilemap amd pixi-tilemap-helper libraries.\n endsWith(srcFilename, 'pixi-tilemap.umd.js') ||\n endsWith(srcFilename, 'pixi-tilemap-helper.js') ||\n // Don't reload pako library (used in pixi-tilemap)\n endsWith(srcFilename, 'pako/dist/pako.min')\n ) {\n return false;\n }\n }\n return true;\n }\n\n _reloadScript(srcFilename: string): Promise<void> {\n function endsWith(str: string, suffix: string): boolean {\n const suffixPosition = str.indexOf(suffix);\n return (\n suffixPosition !== -1 && suffixPosition === str.length - suffix.length\n );\n }\n if (!this._canReloadScriptFile(srcFilename)) {\n this._logs.push({\n kind: 'info',\n message:\n 'Not reloading ' +\n srcFilename +\n ' as it is blocked for hot-reloading.',\n });\n return Promise.resolve();\n }\n const head = document.getElementsByTagName('head')[0];\n if (!head) {\n return Promise.reject(\n new Error('No head element found, are you in a navigator?')\n );\n }\n return new Promise((resolve, reject) => {\n const existingScriptElement = this._reloadedScriptElement[srcFilename];\n if (existingScriptElement) {\n head.removeChild(existingScriptElement);\n } else {\n // Check if there is an existing scriptElement in head\n const headScriptElements = head.getElementsByTagName('script');\n for (let i = 0; i < headScriptElements.length; ++i) {\n const scriptElement = headScriptElements[i];\n if (endsWith(scriptElement.src, srcFilename)) {\n head.removeChild(scriptElement);\n }\n }\n }\n const reloadedScriptElement = document.createElement('script');\n reloadedScriptElement.src = srcFilename + '?timestamp=' + Date.now();\n reloadedScriptElement.onload = () => {\n resolve();\n };\n reloadedScriptElement.onerror = (event) => {\n reject(event);\n };\n head.appendChild(reloadedScriptElement);\n this._reloadedScriptElement[srcFilename] = reloadedScriptElement;\n });\n }\n\n hotReload(): Promise<HotReloaderLog[]> {\n logger.info('Hot reload started');\n this._runtimeGame.pause(true);\n this._logs = [];\n\n // Save old data of the project, to be used to compute\n // the difference between the old and new project data:\n\n const oldProjectData: ProjectData = gdjs.projectData;\n\n const oldScriptFiles = gdjs.runtimeGameOptions\n .scriptFiles as RuntimeGameOptionsScriptFile[];\n\n oldScriptFiles.forEach((scriptFile) => {\n this._alreadyLoadedScriptFiles[scriptFile.path] = true;\n });\n const oldBehaviorConstructors: { [key: string]: Function } = {};\n\n for (let behaviorTypeName in gdjs.behaviorsTypes.items) {\n oldBehaviorConstructors[behaviorTypeName] =\n gdjs.behaviorsTypes.items[behaviorTypeName];\n }\n\n // Reload projectData and runtimeGameOptions stored by convention in data.js:\n return this._reloadScript('data.js').then(() => {\n const newProjectData: ProjectData = gdjs.projectData;\n\n const newRuntimeGameOptions: RuntimeGameOptions =\n gdjs.runtimeGameOptions;\n\n const newScriptFiles = newRuntimeGameOptions.scriptFiles as RuntimeGameOptionsScriptFile[];\n const projectDataOnlyExport = !!newRuntimeGameOptions.projectDataOnlyExport;\n\n // Reload the changed scripts, which will have the side effects of re-running\n // the new scripts, potentially replacing the code of the free functions from\n // extensions (which is fine) and registering updated behaviors (which will\n // need to be re-instantiated in runtime objects).\n return this.reloadScriptFiles(\n newProjectData,\n oldScriptFiles,\n newScriptFiles,\n projectDataOnlyExport\n )\n .then(() => {\n const changedRuntimeBehaviors = this._computeChangedRuntimeBehaviors(\n oldBehaviorConstructors,\n gdjs.behaviorsTypes.items\n );\n return this._hotReloadRuntimeGame(\n oldProjectData,\n newProjectData,\n changedRuntimeBehaviors,\n this._runtimeGame\n );\n })\n .catch((error) => {\n const errorTarget = error.target;\n if (errorTarget instanceof HTMLScriptElement) {\n this._logs.push({\n kind: 'fatal',\n message: 'Unable to reload script:' + errorTarget.src,\n });\n } else {\n this._logs.push({\n kind: 'fatal',\n message:\n 'Unexpected error happened while hot-reloading:' +\n error.message,\n });\n }\n })\n .then(() => {\n logger.info('Hot reload finished with logs:', this._logs);\n this._runtimeGame.pause(false);\n return this._logs;\n });\n });\n }\n\n _computeChangedRuntimeBehaviors(\n oldBehaviorConstructors: Record<string, Function>,\n newBehaviorConstructors: Record<string, Function>\n ): ChangedRuntimeBehavior[] {\n const changedRuntimeBehaviors: ChangedRuntimeBehavior[] = [];\n for (let behaviorTypeName in oldBehaviorConstructors) {\n const oldBehaviorConstructor =\n oldBehaviorConstructors[behaviorTypeName];\n const newBehaviorConstructor =\n newBehaviorConstructors[behaviorTypeName];\n if (!newBehaviorConstructor) {\n this._logs.push({\n kind: 'warning',\n message:\n 'Behavior with type ' +\n behaviorTypeName +\n ' was removed from the registered behaviors in gdjs.',\n });\n } else {\n if (oldBehaviorConstructor !== newBehaviorConstructor) {\n this._logs.push({\n kind: 'info',\n message:\n 'Behavior with type ' +\n behaviorTypeName +\n ' was changed, and will be re-instantiated in gdjs.RuntimeObjects using it.',\n });\n changedRuntimeBehaviors.push({\n oldBehaviorConstructor,\n newBehaviorConstructor,\n behaviorTypeName,\n });\n }\n }\n }\n return changedRuntimeBehaviors;\n }\n\n reloadScriptFiles(\n newProjectData: ProjectData,\n oldScriptFiles: RuntimeGameOptionsScriptFile[],\n newScriptFiles: RuntimeGameOptionsScriptFile[],\n projectDataOnlyExport: boolean\n ): Promise<void[]> {\n const reloadPromises: Array<Promise<void>> = [];\n\n // Reload events, only if they were exported.\n if (!projectDataOnlyExport) {\n newProjectData.layouts.forEach((_layoutData, index) => {\n reloadPromises.push(this._reloadScript('code' + index + '.js'));\n });\n }\n for (let i = 0; i < newScriptFiles.length; ++i) {\n const newScriptFile = newScriptFiles[i];\n const oldScriptFile = oldScriptFiles.filter(\n (scriptFile) => scriptFile.path === newScriptFile.path\n )[0];\n if (!oldScriptFile) {\n // Script file added\n this._logs.push({\n kind: 'info',\n message:\n 'Loading ' +\n newScriptFile.path +\n ' as it was added to the list of scripts.',\n });\n reloadPromises.push(this._reloadScript(newScriptFile.path));\n } else {\n // Script file changed, which can be the case for extensions created\n // from the editor, containing free functions or behaviors.\n if (newScriptFile.hash !== oldScriptFile.hash) {\n this._logs.push({\n kind: 'info',\n message:\n 'Reloading ' + newScriptFile.path + ' because it was changed.',\n });\n reloadPromises.push(this._reloadScript(newScriptFile.path));\n }\n }\n }\n for (let i = 0; i < oldScriptFiles.length; ++i) {\n const oldScriptFile = oldScriptFiles[i];\n const newScriptFile = newScriptFiles.filter(\n (scriptFile) => scriptFile.path === oldScriptFile.path\n )[0];\n\n // A file may be removed because of a partial preview.\n if (!newScriptFile && !projectDataOnlyExport) {\n this._logs.push({\n kind: 'warning',\n message: 'Script file ' + oldScriptFile.path + ' was removed.',\n });\n }\n }\n return Promise.all(reloadPromises);\n }\n\n async _hotReloadRuntimeGame(\n oldProjectData: ProjectData,\n newProjectData: ProjectData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n runtimeGame: gdjs.RuntimeGame\n ): Promise<void> {\n const sceneStack = runtimeGame.getSceneStack();\n const currentScene = sceneStack.getCurrentScene();\n if (!currentScene) {\n // It can't actually happen.\n this._logs.push({\n kind: 'error',\n message: \"Can't hot-reload as no scene are opened.\",\n });\n return;\n }\n // Update project data and re-load assets (sound/image/font/json managers\n // will take care of reloading only what is needed).\n runtimeGame.setProjectData(newProjectData);\n await runtimeGame.loadFirstAssetsAndStartBackgroundLoading(\n currentScene.getName(),\n () => {}\n );\n this._hotReloadVariablesContainer(\n oldProjectData.variables,\n newProjectData.variables,\n runtimeGame.getVariables()\n );\n\n // Reload runtime scenes\n sceneStack._stack.forEach((runtimeScene) => {\n const oldLayoutData = oldProjectData.layouts.filter(\n (layoutData) => layoutData.name === runtimeScene.getName()\n )[0];\n const newLayoutData = newProjectData.layouts.filter(\n (layoutData) => layoutData.name === runtimeScene.getName()\n )[0];\n if (oldLayoutData && newLayoutData) {\n this._hotReloadRuntimeScene(\n oldLayoutData,\n newLayoutData,\n changedRuntimeBehaviors,\n runtimeScene\n );\n } else {\n // A scene was removed. Not hot-reloading this.\n this._logs.push({\n kind: 'error',\n message:\n 'Scene ' +\n oldLayoutData.name +\n ' was removed. A fresh preview should be launched.',\n });\n }\n });\n\n // Reload changes in external layouts\n newProjectData.externalLayouts.forEach((newExternalLayoutData) => {\n const oldExternalLayoutData = oldProjectData.externalLayouts.filter(\n (externalLayoutData) =>\n externalLayoutData.name === newExternalLayoutData.name\n )[0];\n if (\n oldExternalLayoutData &&\n // Check if there are actual changes, to avoid useless work trying to\n // hot-reload all the scenes.\n !HotReloader.deepEqual(oldExternalLayoutData, newExternalLayoutData)\n ) {\n sceneStack._stack.forEach((runtimeScene) => {\n this._hotReloadRuntimeSceneInstances(\n oldExternalLayoutData.instances,\n newExternalLayoutData.instances,\n runtimeScene\n );\n });\n }\n });\n }\n\n _hotReloadVariablesContainer(\n oldVariablesData: RootVariableData[],\n newVariablesData: RootVariableData[],\n variablesContainer: gdjs.VariablesContainer\n ): void {\n newVariablesData.forEach((newVariableData) => {\n const variableName = newVariableData.name;\n const oldVariableData = oldVariablesData.find(\n (variable) => variable.name === variableName\n );\n const variable = variablesContainer.get(newVariableData.name);\n\n if (!oldVariableData) {\n // New variable\n variablesContainer.add(\n variableName,\n new gdjs.Variable(newVariableData)\n );\n } else if (\n gdjs.Variable.isPrimitive(newVariableData.type || 'number') &&\n (oldVariableData.value !== newVariableData.value ||\n !gdjs.Variable.isPrimitive(oldVariableData.type || 'number'))\n ) {\n // Variable value was changed or was converted from\n // a structure to a variable with value.\n variablesContainer.remove(variableName);\n variablesContainer.add(\n variableName,\n new gdjs.Variable(newVariableData)\n );\n } else if (\n !gdjs.Variable.isPrimitive(newVariableData.type || 'number')\n ) {\n // Variable is a structure or array (or was converted from a primitive\n // to one of those).\n if (newVariableData.type === 'structure')\n this._hotReloadStructureVariable(\n //@ts-ignore If the type is structure, it is assured that the children have a name\n oldVariableData.children,\n newVariableData.children,\n variable\n );\n else {\n // Arrays cannot be hot reloaded.\n // As indices can change at runtime, and in the IDE, they can be desynchronized.\n // It will in that case mess up the whole array,\n // and there is no way to know if that was the case.\n //\n // We therefore just replace the old array with the new one.\n variablesContainer.remove(variableName);\n variablesContainer.add(\n variableName,\n new gdjs.Variable(newVariableData)\n );\n }\n }\n });\n oldVariablesData.forEach((oldVariableData) => {\n const newVariableData = newVariablesData.find(\n (variable) => variable.name === oldVariableData.name\n );\n\n if (!newVariableData) {\n // Variable was removed\n variablesContainer.remove(oldVariableData.name);\n }\n });\n }\n\n _hotReloadStructureVariable(\n oldChildren: RootVariableData[],\n newChildren: RootVariableData[],\n variable: gdjs.Variable\n ): void {\n if (oldChildren) {\n oldChildren.forEach((oldChildVariableData) => {\n const newChildVariableData = newChildren.find(\n (childVariableData) =>\n childVariableData.name === oldChildVariableData.name\n );\n\n if (!newChildVariableData) {\n // Child variable was removed.\n variable.removeChild(oldChildVariableData.name);\n } else if (\n gdjs.Variable.isPrimitive(newChildVariableData.type || 'number') &&\n (oldChildVariableData.value !== newChildVariableData.value ||\n !gdjs.Variable.isPrimitive(oldChildVariableData.type || 'number'))\n ) {\n // The child variable value was changed or was converted from\n // structure to a variable with value.\n variable.addChild(\n newChildVariableData.name,\n new gdjs.Variable(newChildVariableData)\n );\n } else if (\n !gdjs.Variable.isPrimitive(newChildVariableData.type || 'number')\n ) {\n // Variable is a structure or array (or was converted from a primitive\n // to one of those).\n if (newChildVariableData.type === 'structure')\n this._hotReloadStructureVariable(\n //@ts-ignore If the type is structure, it is assured that the children have a name\n oldChildVariableData.children,\n newChildVariableData.children as Required<VariableData>[],\n variable.getChild(newChildVariableData.name)\n );\n else {\n // Arrays cannot be hot reloaded.\n // As indices can change at runtime, and in the IDE, they can be desynchronized.\n // It will in that case mess up the whole array,\n // and there is no way to know if that was the case.\n //\n // We therefore just replace the old array with the new one.\n variable.addChild(\n newChildVariableData.name,\n new gdjs.Variable(newChildVariableData)\n );\n }\n }\n });\n newChildren.forEach((newChildVariableData) => {\n const oldChildVariableData = oldChildren.find(\n (childVariableData) =>\n childVariableData.name === newChildVariableData.name\n );\n\n if (!oldChildVariableData) {\n // Child variable was added\n variable.addChild(\n newChildVariableData.name,\n new gdjs.Variable(newChildVariableData)\n );\n }\n });\n } else {\n // Variable was converted from a value to a structure:\n newChildren.forEach((newChildVariableData) => {\n variable.addChild(\n newChildVariableData.name,\n new gdjs.Variable(newChildVariableData)\n );\n });\n }\n }\n\n _hotReloadRuntimeScene(\n oldLayoutData: LayoutData,\n newLayoutData: LayoutData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n runtimeScene.setBackgroundColor(\n newLayoutData.r,\n newLayoutData.v,\n newLayoutData.b\n );\n if (oldLayoutData.title !== newLayoutData.title) {\n runtimeScene\n .getGame()\n .getRenderer()\n .setWindowTitle(newLayoutData.title);\n }\n this._hotReloadVariablesContainer(\n oldLayoutData.variables as Required<VariableData>[],\n newLayoutData.variables as Required<VariableData>[],\n runtimeScene.getVariables()\n );\n this._hotReloadRuntimeSceneBehaviorsSharedData(\n oldLayoutData.behaviorsSharedData,\n newLayoutData.behaviorsSharedData,\n runtimeScene\n );\n\n // Re-instantiate any gdjs.RuntimeBehavior that was changed.\n this._reinstantiateRuntimeSceneRuntimeBehaviors(\n changedRuntimeBehaviors,\n newLayoutData.objects,\n runtimeScene\n );\n this._hotReloadRuntimeSceneObjects(\n oldLayoutData.objects,\n newLayoutData.objects,\n runtimeScene\n );\n this._hotReloadRuntimeSceneInstances(\n oldLayoutData.instances,\n newLayoutData.instances,\n runtimeScene\n );\n this._hotReloadRuntimeSceneLayers(\n oldLayoutData.layers,\n newLayoutData.layers,\n runtimeScene\n );\n\n // Update the events generated code launched at each frame. Events generated code\n // script files were already reloaded at the beginning of the hot-reload. Note that\n // if they have not changed, it's still fine to call this, it will be basically a\n // no-op.\n runtimeScene.setEventsGeneratedCodeFunction(newLayoutData);\n }\n\n _hotReloadRuntimeSceneBehaviorsSharedData(\n oldBehaviorsSharedData: BehaviorSharedData[],\n newBehaviorsSharedData: BehaviorSharedData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n oldBehaviorsSharedData.forEach((oldBehaviorSharedData) => {\n const name = oldBehaviorSharedData.name;\n const newBehaviorSharedData = newBehaviorsSharedData.filter(\n (behaviorSharedData) => behaviorSharedData.name === name\n )[0];\n if (!newBehaviorSharedData) {\n // Behavior shared data was removed.\n runtimeScene.setInitialSharedDataForBehavior(\n oldBehaviorSharedData.name,\n null\n );\n } else {\n if (\n !HotReloader.deepEqual(oldBehaviorSharedData, newBehaviorSharedData)\n ) {\n // Behavior shared data was modified\n runtimeScene.setInitialSharedDataForBehavior(\n newBehaviorSharedData.name,\n newBehaviorSharedData\n );\n }\n }\n });\n newBehaviorsSharedData.forEach((newBehaviorSharedData) => {\n const name = newBehaviorSharedData.name;\n const oldBehaviorSharedData = oldBehaviorsSharedData.filter(\n (behaviorSharedData) => behaviorSharedData.name === name\n )[0];\n if (!oldBehaviorSharedData) {\n // Behavior shared data was added\n runtimeScene.setInitialSharedDataForBehavior(\n newBehaviorSharedData.name,\n newBehaviorSharedData\n );\n }\n });\n }\n\n _reinstantiateRuntimeSceneRuntimeBehaviors(\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n newObjects: ObjectData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n newObjects.forEach((newObjectData) => {\n const objectName = newObjectData.name;\n const newBehaviors = newObjectData.behaviors;\n const runtimeObjects = runtimeScene.getObjects(objectName)!;\n changedRuntimeBehaviors.forEach((changedRuntimeBehavior) => {\n const behaviorTypeName = changedRuntimeBehavior.behaviorTypeName;\n\n // If the changed behavior is used by the object, re-instantiate\n // it.\n newBehaviors\n .filter((behaviorData) => behaviorData.type === behaviorTypeName)\n .forEach((changedBehaviorNewData) => {\n const name = changedBehaviorNewData.name;\n this._logs.push({\n kind: 'info',\n message:\n 'Re-instantiating behavior named \"' +\n name +\n '\" for instances of object \"' +\n objectName +\n '\".',\n });\n runtimeObjects.forEach((runtimeObject) => {\n this._reinstantiateRuntimeObjectRuntimeBehavior(\n changedBehaviorNewData,\n runtimeObject\n );\n });\n });\n });\n });\n }\n\n _reinstantiateRuntimeObjectRuntimeBehavior(\n behaviorData: BehaviorData,\n runtimeObject: gdjs.RuntimeObject\n ): void {\n const behaviorName = behaviorData.name;\n const oldRuntimeBehavior = runtimeObject.getBehavior(behaviorName);\n if (!oldRuntimeBehavior) {\n return;\n }\n\n // Remove and re-add the behavior so that it's using the newly\n // registered gdjs.RuntimeBehavior.\n runtimeObject.removeBehavior(behaviorName);\n runtimeObject.addNewBehavior(behaviorData);\n const newRuntimeBehavior = runtimeObject.getBehavior(behaviorName);\n if (!newRuntimeBehavior) {\n this._logs.push({\n kind: 'error',\n message:\n 'Could not create behavior ' +\n behaviorName +\n ' (type: ' +\n behaviorData.type +\n ') for object ' +\n runtimeObject.getName(),\n });\n return;\n }\n\n // Copy the properties from the old behavior to the new one.\n for (let behaviorProperty in oldRuntimeBehavior) {\n if (!oldRuntimeBehavior.hasOwnProperty(behaviorProperty)) {\n continue;\n }\n if (behaviorProperty === '_behaviorData') {\n // For property \"_behaviorData\" that we know to be an object,\n // do a copy of each property of\n // this object so that we keep the new ones (useful if a new property was added).\n newRuntimeBehavior[behaviorProperty] =\n newRuntimeBehavior[behaviorProperty] || {};\n for (let property in oldRuntimeBehavior[behaviorProperty]) {\n newRuntimeBehavior[behaviorProperty][property] =\n oldRuntimeBehavior[behaviorProperty][property];\n }\n } else {\n newRuntimeBehavior[behaviorProperty] =\n oldRuntimeBehavior[behaviorProperty];\n }\n }\n return;\n }\n\n _hotReloadRuntimeSceneObjects(\n oldObjects: ObjectData[],\n newObjects: ObjectData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n oldObjects.forEach((oldObjectData) => {\n const name = oldObjectData.name;\n const newObjectData = newObjects.filter(\n (objectData) => objectData.name === name\n )[0];\n\n // Note: if an object is renamed in the editor, it will be considered as removed,\n // and the new object name as a new object to register.\n // It's not ideal because living instances of the object will be destroyed,\n // but it would be complex to iterate over instances of the object and change\n // its name (it's not expected to change).\n if (!newObjectData || oldObjectData.type !== newObjectData.type) {\n // Object was removed or object type was changed (considered as a removal of the old object)\n runtimeScene.unregisterObject(name);\n } else {\n if (runtimeScene.isObjectRegistered(name)) {\n this._hotReloadRuntimeSceneObject(\n oldObjectData,\n newObjectData,\n runtimeScene\n );\n }\n }\n });\n newObjects.forEach((newObjectData) => {\n const name = newObjectData.name;\n const oldObjectData = oldObjects.filter(\n (layerData) => layerData.name === name\n )[0];\n if (\n (!oldObjectData || oldObjectData.type !== newObjectData.type) &&\n !runtimeScene.isObjectRegistered(name)\n ) {\n // Object was added or object type was changed (considered as adding the new object)\n runtimeScene.registerObject(newObjectData);\n }\n });\n }\n\n _hotReloadRuntimeSceneObject(\n oldObjectData: ObjectData,\n newObjectData: ObjectData,\n runtimeScene: gdjs.RuntimeScene\n ): void {\n let hotReloadSucceeded = true;\n if (!HotReloader.deepEqual(oldObjectData, newObjectData)) {\n this._logs.push({\n kind: 'info',\n message:\n 'Object \"' +\n newObjectData.name +\n '\" was modified and is hot-reloaded.',\n });\n\n // Register the updated object data, used for new instances.\n runtimeScene.updateObject(newObjectData);\n\n // Update existing instances\n const runtimeObjects = runtimeScene.getObjects(newObjectData.name)!;\n\n // Update instances state\n runtimeObjects.forEach((runtimeObject) => {\n // Update the runtime object\n hotReloadSucceeded =\n runtimeObject.updateFromObjectData(oldObjectData, newObjectData) &&\n hotReloadSucceeded;\n });\n\n // Don't update the variables, behaviors and effects for each runtime object to avoid\n // doing the check for differences for every single object.\n\n // Update variables\n runtimeObjects.forEach((runtimeObject) => {\n this._hotReloadVariablesContainer(\n oldObjectData.variables as Required<VariableData>[],\n newObjectData.variables as Required<VariableData>[],\n runtimeObject.getVariables()\n );\n });\n\n // Update behaviors\n this._hotReloadRuntimeObjectsBehaviors(\n oldObjectData.behaviors,\n newObjectData.behaviors,\n runtimeObjects\n );\n\n // Update effects\n this._hotReloadRuntimeObjectsEffects(\n oldObjectData.effects,\n newObjectData.effects,\n runtimeObjects\n );\n }\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n 'Object \"' +\n newObjectData.name +\n '\" could not be hot-reloaded. A fresh preview should be run.',\n });\n }\n }\n\n _hotReloadRuntimeObjectsBehaviors(\n oldBehaviors: BehaviorData[],\n newBehaviors: BehaviorData[],\n runtimeObjects: gdjs.RuntimeObject[]\n ): void {\n oldBehaviors.forEach((oldBehaviorData) => {\n const name = oldBehaviorData.name;\n const newBehaviorData = newBehaviors.filter(\n (behaviorData) => behaviorData.name === name\n )[0];\n if (!newBehaviorData) {\n // Behavior was removed\n runtimeObjects.forEach((runtimeObject) => {\n if (runtimeObject.hasBehavior(name)) {\n if (!runtimeObject.removeBehavior(name)) {\n this._logs.push({\n kind: 'error',\n message:\n 'Behavior ' +\n name +\n ' could not be removed from object' +\n runtimeObject.getName(),\n });\n }\n }\n });\n } else {\n if (!HotReloader.deepEqual(oldBehaviorData, newBehaviorData)) {\n let hotReloadSucceeded = true;\n runtimeObjects.forEach((runtimeObject) => {\n const runtimeBehavior = runtimeObject.getBehavior(\n newBehaviorData.name\n );\n if (runtimeBehavior) {\n hotReloadSucceeded =\n this._hotReloadRuntimeBehavior(\n oldBehaviorData,\n newBehaviorData,\n runtimeBehavior\n ) && hotReloadSucceeded;\n }\n });\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n newBehaviorData.name + ' behavior could not be hot-reloaded.',\n });\n }\n }\n }\n });\n newBehaviors.forEach((newBehaviorData) => {\n const name = newBehaviorData.name;\n const oldBehaviorData = oldBehaviors.filter(\n (layerData) => layerData.name === name\n )[0];\n if (!oldBehaviorData) {\n // Behavior was added\n let hotReloadSucceeded = true;\n runtimeObjects.forEach((runtimeObject) => {\n hotReloadSucceeded =\n runtimeObject.addNewBehavior(newBehaviorData) &&\n hotReloadSucceeded;\n });\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n newBehaviorData.name +\n ' behavior could not be added during hot-reload.',\n });\n }\n }\n });\n }\n\n _hotReloadRuntimeObjectsEffects(\n oldEffects: EffectData[],\n newEffects: EffectData[],\n runtimeObjects: RuntimeObject[]\n ): void {\n oldEffects.forEach((oldEffectData) => {\n const name = oldEffectData.name;\n const newEffectData = newEffects.filter(\n (effectData) => effectData.name === name\n )[0];\n if (!newEffectData) {\n // Effect was removed.\n runtimeObjects.forEach((runtimeObject) => {\n if (runtimeObject.hasEffect(name)) {\n if (!runtimeObject.removeEffect(name)) {\n this._logs.push({\n kind: 'error',\n message:\n 'Effect ' +\n name +\n ' could not be removed from object' +\n runtimeObject.getName(),\n });\n }\n }\n });\n } else {\n if (!HotReloader.deepEqual(oldEffectData, newEffectData)) {\n let hotReloadSucceeded = true;\n runtimeObjects.forEach((runtimeObject) => {\n if (oldEffectData.effectType === newEffectData.effectType) {\n hotReloadSucceeded =\n runtimeObject.updateAllEffectParameters(newEffectData) &&\n hotReloadSucceeded;\n } else {\n // Another effect type was applied\n runtimeObject.removeEffect(oldEffectData.name);\n runtimeObject.addEffect(newEffectData);\n }\n });\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n newEffectData.name + ' effect could not be hot-reloaded.',\n });\n }\n }\n }\n });\n newEffects.forEach((newEffectData) => {\n const name = newEffectData.name;\n const oldEffectData = oldEffects.filter(\n (oldEffectData) => oldEffectData.name === name\n )[0];\n if (!oldEffectData) {\n // Effect was added\n let hotReloadSucceeded = true;\n runtimeObjects.forEach((runtimeObject) => {\n hotReloadSucceeded =\n runtimeObject.addEffect(newEffectData) && hotReloadSucceeded;\n });\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n newEffectData.name +\n ' effect could not be added during hot-reload.',\n });\n }\n }\n });\n }\n\n /**\n * @returns true if hot-reload succeeded, false otherwise.\n */\n _hotReloadRuntimeBehavior(\n oldBehaviorData: BehaviorData,\n newBehaviorData: BehaviorData,\n runtimeBehavior: gdjs.RuntimeBehavior\n ): boolean {\n // Don't check here for deep equality between oldBehaviorData and newBehaviorData.\n // This would be too costly to do for each runtime object.\n // It's supposed to be done once by the caller.\n return runtimeBehavior.updateFromBehaviorData(\n oldBehaviorData,\n newBehaviorData\n );\n }\n\n _hotReloadRuntimeSceneLayers(\n oldLayers: LayerData[],\n newLayers: LayerData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n oldLayers.forEach((oldLayerData) => {\n const name = oldLayerData.name;\n const newLayerData = newLayers.filter(\n (layerData) => layerData.name === name\n )[0];\n if (!newLayerData) {\n // Layer was removed\n runtimeScene.removeLayer(name);\n } else {\n if (runtimeScene.hasLayer(name)) {\n const layer = runtimeScene.getLayer(name);\n this._hotReloadRuntimeLayer(oldLayerData, newLayerData, layer);\n }\n }\n });\n newLayers.forEach((newLayerData) => {\n const name = newLayerData.name;\n const oldLayerData = oldLayers.filter(\n (layerData) => layerData.name === name\n )[0];\n if (!oldLayerData && !runtimeScene.hasLayer(name)) {\n // Layer was added\n runtimeScene.addLayer(newLayerData);\n }\n });\n newLayers.forEach((newLayerData, index) => {\n runtimeScene.setLayerIndex(newLayerData.name, index);\n });\n }\n\n _hotReloadRuntimeLayer(\n oldLayer: LayerData,\n newLayer: LayerData,\n runtimeLayer: gdjs.RuntimeLayer\n ): void {\n // Properties\n if (oldLayer.visibility !== newLayer.visibility) {\n runtimeLayer.show(newLayer.visibility);\n }\n if (newLayer.isLightingLayer) {\n if (\n oldLayer.ambientLightColorR !== newLayer.ambientLightColorR ||\n oldLayer.ambientLightColorG !== newLayer.ambientLightColorG ||\n oldLayer.ambientLightColorB !== newLayer.ambientLightColorB\n ) {\n runtimeLayer.setClearColor(\n newLayer.ambientLightColorR,\n newLayer.ambientLightColorG,\n newLayer.ambientLightColorB\n );\n }\n if (oldLayer.followBaseLayerCamera !== newLayer.followBaseLayerCamera) {\n runtimeLayer.setFollowBaseLayerCamera(newLayer.followBaseLayerCamera);\n }\n }\n\n // Rendering type can't be easily changed at runtime.\n if (oldLayer.renderingType !== newLayer.renderingType) {\n this._logs.push({\n kind: 'error',\n message: `Could not change the rendering type (2D, 3D...) layer at runtime (for layer \"${newLayer.name}\").`,\n });\n }\n if (newLayer.isLightingLayer !== oldLayer.isLightingLayer) {\n this._logs.push({\n kind: 'error',\n message: `Could not add/remove a lighting layer at runtime (for layer \"${newLayer.name}\").`,\n });\n }\n\n // Effects\n this._hotReloadRuntimeLayerEffects(\n oldLayer.effects,\n newLayer.effects,\n runtimeLayer\n );\n }\n\n _hotReloadRuntimeLayerEffects(\n oldEffectsData: EffectData[],\n newEffectsData: EffectData[],\n runtimeLayer: gdjs.RuntimeLayer\n ): void {\n oldEffectsData.forEach((oldEffectData) => {\n const name = oldEffectData.name;\n const newEffectData = newEffectsData.filter(\n (effectData) => effectData.name === name\n )[0];\n if (!newEffectData) {\n // Effect was removed\n runtimeLayer.removeEffect(name);\n } else {\n if (runtimeLayer.hasEffect(name)) {\n if (oldEffectData.effectType !== newEffectData.effectType) {\n // Effect changed type, consider it was removed and added back.\n runtimeLayer.removeEffect(name);\n runtimeLayer.addEffect(newEffectData);\n } else {\n this._hotReloadRuntimeLayerEffect(\n oldEffectData,\n newEffectData,\n runtimeLayer,\n name\n );\n }\n }\n }\n });\n newEffectsData.forEach((newEffectData) => {\n const name = newEffectData.name;\n const oldEffectData = oldEffectsData.filter(\n (layerData) => layerData.name === name\n )[0];\n if (!oldEffectData && !runtimeLayer.hasEffect(name)) {\n // Effect was added\n runtimeLayer.addEffect(newEffectData);\n }\n });\n }\n\n _hotReloadRuntimeLayerEffect(\n oldEffectData: EffectData,\n newEffectData: EffectData,\n runtimeLayer: gdjs.RuntimeLayer,\n effectName: string\n ): void {\n // We consider oldEffectData.effectType and newEffectData.effectType\n // are the same - it's responsibility of the caller to verify this.\n for (let parameterName in newEffectData.booleanParameters) {\n const value = newEffectData.booleanParameters[parameterName];\n if (value !== oldEffectData.booleanParameters[parameterName]) {\n runtimeLayer.setEffectBooleanParameter(\n effectName,\n parameterName,\n value\n );\n }\n }\n for (let parameterName in newEffectData.doubleParameters) {\n const value = newEffectData.doubleParameters[parameterName];\n if (value !== oldEffectData.doubleParameters[parameterName]) {\n runtimeLayer.setEffectDoubleParameter(\n effectName,\n parameterName,\n value\n );\n }\n }\n for (let parameterName in newEffectData.stringParameters) {\n const value = newEffectData.stringParameters[parameterName];\n if (value !== oldEffectData.stringParameters[parameterName]) {\n runtimeLayer.setEffectStringParameter(\n effectName,\n parameterName,\n value\n );\n }\n }\n }\n\n _hotReloadRuntimeSceneInstances(\n oldInstances: InstanceData[],\n newInstances: InstanceData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n const runtimeObjects = runtimeScene.getAdhocListOfAllInstances();\n const groupedOldInstances: {\n [key: number]: InstanceData;\n } = HotReloader.groupByPersistentUuid(oldInstances);\n const groupedNewInstances: {\n [key: number]: InstanceData;\n } = HotReloader.groupByPersistentUuid(newInstances);\n const groupedRuntimeObjects: {\n [key: number]: gdjs.RuntimeObject;\n } = HotReloader.groupByPersistentUuid(runtimeObjects);\n for (let persistentUuid in groupedOldInstances) {\n const oldInstance = groupedOldInstances[persistentUuid];\n const newInstance = groupedNewInstances[persistentUuid];\n const runtimeObject = groupedRuntimeObjects[persistentUuid];\n if (\n oldInstance &&\n (!newInstance || oldInstance.name !== newInstance.name)\n ) {\n // Instance was deleted (or object name changed, in which case it will be re-created later)\n if (runtimeObject) {\n runtimeObject.deleteFromScene(runtimeScene);\n }\n } else {\n if (oldInstance && newInstance && runtimeObject) {\n // Instance was not deleted nor created, maybe modified (or not):\n this._hotReloadRuntimeInstance(\n oldInstance,\n newInstance,\n runtimeObject\n );\n }\n }\n }\n for (let persistentUuid in groupedNewInstances) {\n const oldInstance = groupedOldInstances[persistentUuid];\n const newInstance = groupedNewInstances[persistentUuid];\n const runtimeObject = groupedRuntimeObjects[persistentUuid];\n if (\n newInstance &&\n (!oldInstance || oldInstance.name !== newInstance.name) &&\n !runtimeObject\n ) {\n // Instance was created (or object name changed, in which case it was destroyed previously)\n // and we verified that runtimeObject does not exist.\n runtimeScene.createObjectsFrom(\n [newInstance],\n 0,\n 0,\n 0,\n /*trackByPersistentUuid=*/\n true\n );\n }\n }\n }\n\n _hotReloadRuntimeInstance(\n oldInstance: InstanceData,\n newInstance: InstanceData,\n runtimeObject: gdjs.RuntimeObject\n ): void {\n let somethingChanged = false;\n\n // Check if default properties changed\n if (oldInstance.x !== newInstance.x) {\n runtimeObject.setX(newInstance.x);\n somethingChanged = true;\n }\n if (oldInstance.y !== newInstance.y) {\n runtimeObject.setY(newInstance.y);\n somethingChanged = true;\n }\n if (oldInstance.angle !== newInstance.angle) {\n runtimeObject.setAngle(newInstance.angle);\n somethingChanged = true;\n }\n if (oldInstance.zOrder !== newInstance.zOrder) {\n runtimeObject.setZOrder(newInstance.zOrder);\n somethingChanged = true;\n }\n if (oldInstance.layer !== newInstance.layer) {\n runtimeObject.setLayer(newInstance.layer);\n somethingChanged = true;\n }\n if (\n gdjs.RuntimeObject3D &&\n runtimeObject instanceof gdjs.RuntimeObject3D\n ) {\n if (oldInstance.z !== newInstance.z && newInstance.z !== undefined) {\n runtimeObject.setZ(newInstance.z);\n somethingChanged = true;\n }\n if (\n oldInstance.rotationX !== newInstance.rotationX &&\n newInstance.rotationX !== undefined\n ) {\n runtimeObject.setRotationX(newInstance.rotationX);\n somethingChanged = true;\n }\n if (\n oldInstance.rotationY !== newInstance.rotationY &&\n newInstance.rotationY !== undefined\n ) {\n runtimeObject.setRotationY(newInstance.rotationY);\n somethingChanged = true;\n }\n }\n\n // Check if size changed\n let sizeChanged = false;\n if (newInstance.customSize) {\n if (!oldInstance.customSize) {\n // A custom size was set\n runtimeObject.setWidth(newInstance.width);\n runtimeObject.setHeight(newInstance.height);\n somethingChanged = true;\n sizeChanged = true;\n } else {\n // The custom size was changed\n if (oldInstance.width !== newInstance.width) {\n runtimeObject.setWidth(newInstance.width);\n somethingChanged = true;\n sizeChanged = true;\n }\n if (oldInstance.height !== newInstance.height) {\n runtimeObject.setHeight(newInstance.height);\n somethingChanged = true;\n sizeChanged = true;\n }\n }\n } else {\n if (!newInstance.customSize && oldInstance.customSize) {\n // The custom size was removed. Just flag the size as changed\n // and hope the object will handle this in\n // `extraInitializationFromInitialInstance`.\n sizeChanged = true;\n }\n }\n if (\n gdjs.RuntimeObject3D &&\n runtimeObject instanceof gdjs.RuntimeObject3D\n ) {\n // A custom depth was set or changed\n if (\n oldInstance.depth !== newInstance.depth &&\n newInstance.depth !== undefined\n ) {\n runtimeObject.setDepth(newInstance.depth);\n somethingChanged = true;\n sizeChanged = true;\n } else if (\n newInstance.depth === undefined &&\n oldInstance.depth !== undefined\n ) {\n // The custom depth was removed. Just flag the depth as changed\n // and hope the object will handle this in\n // `extraInitializationFromInitialInstance`.\n sizeChanged = true;\n }\n }\n\n // Update variables\n this._hotReloadVariablesContainer(\n oldInstance.initialVariables as Required<VariableData>[],\n newInstance.initialVariables as Required<VariableData>[],\n runtimeObject.getVariables()\n );\n\n // Check if custom properties changed (specific to each object type)\n const numberPropertiesChanged = newInstance.numberProperties.some(\n (numberProperty) => {\n const name = numberProperty.name;\n const value = numberProperty.value;\n const oldNumberProperty = oldInstance.numberProperties.filter(\n (numberProperty) => numberProperty.name === name\n )[0];\n return !oldNumberProperty || oldNumberProperty.value !== value;\n }\n );\n const stringPropertiesChanged = newInstance.stringProperties.some(\n (stringProperty) => {\n const name = stringProperty.name;\n const value = stringProperty.value;\n const oldStringProperty = oldInstance.stringProperties.filter(\n (stringProperty) => stringProperty.name === name\n )[0];\n return !oldStringProperty || oldStringProperty.value !== value;\n }\n );\n if (numberPropertiesChanged || stringPropertiesChanged || sizeChanged) {\n runtimeObject.extraInitializationFromInitialInstance(newInstance);\n somethingChanged = true;\n }\n if (somethingChanged) {\n // If we changed the runtime object position/size/angle or another property,\n // notify behaviors that the runtime object was reloaded.\n // This is useful for behaviors like the physics engine that are watching the\n // object position/size and need to be notified when changed (otherwise, they\n // would continue using the previous position, so the object would not be moved\n // or updated according to the changes made in the project instance).\n runtimeObject.notifyBehaviorsObjectHotReloaded();\n }\n }\n\n /**\n * Deep check equality between the two objects/arrays/primitives.\n *\n * Inspired from https://github.com/epoberezkin/fast-deep-equal\n * @param a The first object/array/primitive to compare\n * @param b The second object/array/primitive to compare\n */\n static deepEqual(a: any, b: any): boolean {\n if (a === b) {\n return true;\n }\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) {\n return false;\n }\n let length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) {\n return false;\n }\n for (i = length; i-- !== 0; ) {\n if (!HotReloader.deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n if (a.valueOf !== Object.prototype.valueOf) {\n return a.valueOf() === b.valueOf();\n }\n if (a.toString !== Object.prototype.toString) {\n return a.toString() === b.toString();\n }\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) {\n return false;\n }\n for (i = length; i-- !== 0; ) {\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) {\n return false;\n }\n }\n for (i = length; i-- !== 0; ) {\n const key = keys[i];\n if (!HotReloader.deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n\n // true if both NaN, false otherwise\n return a !== a && b !== b;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["namespace gdjs {\n const logger = new gdjs.Logger('Hot reloader');\n export type HotReloaderLog = {\n message: string;\n kind: 'fatal' | 'error' | 'warning' | 'info';\n };\n\n export type ChangedRuntimeBehavior = {\n oldBehaviorConstructor: Function;\n newBehaviorConstructor: Function;\n behaviorTypeName: string;\n };\n\n /**\n * Reload scripts/data of an exported game and applies the changes\n * to the running runtime game.\n */\n export class HotReloader {\n _runtimeGame: gdjs.RuntimeGame;\n _reloadedScriptElement: Record<string, HTMLScriptElement> = {};\n _logs: HotReloaderLog[] = [];\n _alreadyLoadedScriptFiles: Record<string, boolean> = {};\n\n /**\n * @param runtimeGame - The `gdjs.RuntimeGame` to be hot-reloaded.\n */\n constructor(runtimeGame: gdjs.RuntimeGame) {\n this._runtimeGame = runtimeGame;\n }\n\n static groupByPersistentUuid<\n ObjectWithPersistentId extends { persistentUuid: string | null }\n >(\n objectsWithPersistentId: ObjectWithPersistentId[]\n ): Record<string, ObjectWithPersistentId> {\n return objectsWithPersistentId.reduce(function (objectsMap, object) {\n if (object.persistentUuid) {\n objectsMap[object.persistentUuid] = object;\n }\n return objectsMap;\n }, {});\n }\n\n _canReloadScriptFile(srcFilename: string): boolean {\n function endsWith(str: string, suffix: string): boolean {\n const suffixPosition = str.indexOf(suffix);\n return (\n suffixPosition !== -1 && suffixPosition === str.length - suffix.length\n );\n }\n\n // Never reload .h script files, as they are leaking by mistake from C++ extensions.\n if (endsWith(srcFilename, '.h')) {\n return false;\n }\n\n // Make sure some files are loaded only once.\n if (this._alreadyLoadedScriptFiles[srcFilename]) {\n if (\n // Don't reload Box2d as it would confuse and crash the asm.js library.\n endsWith(srcFilename, 'box2d.js') ||\n // Don't reload sha256.js library.\n endsWith(srcFilename, 'sha256.js') ||\n // Don't reload shopify-buy library.\n endsWith(srcFilename, 'shopify-buy.umd.polyfilled.min.js') ||\n // Don't reload pixi-multistyle-text library.\n endsWith(srcFilename, 'pixi-multistyle-text.umd.js') ||\n // Don't reload pixi-tilemap library.\n endsWith(srcFilename, 'pixi-tilemap.umd.js') ||\n // Don't reload bondage.js library.\n endsWith(srcFilename, 'bondage.min.js') ||\n // Don't reload pixi-particles library.\n endsWith(srcFilename, 'pixi-particles-pixi-renderer.min.js') ||\n // Don't reload pixi-tilemap amd pixi-tilemap-helper libraries.\n endsWith(srcFilename, 'pixi-tilemap.umd.js') ||\n endsWith(srcFilename, 'pixi-tilemap-helper.js') ||\n // Don't reload pako library (used in pixi-tilemap)\n endsWith(srcFilename, 'pako/dist/pako.min')\n ) {\n return false;\n }\n }\n return true;\n }\n\n _reloadScript(srcFilename: string): Promise<void> {\n function endsWith(str: string, suffix: string): boolean {\n const suffixPosition = str.indexOf(suffix);\n return (\n suffixPosition !== -1 && suffixPosition === str.length - suffix.length\n );\n }\n if (!this._canReloadScriptFile(srcFilename)) {\n this._logs.push({\n kind: 'info',\n message:\n 'Not reloading ' +\n srcFilename +\n ' as it is blocked for hot-reloading.',\n });\n return Promise.resolve();\n }\n const head = document.getElementsByTagName('head')[0];\n if (!head) {\n return Promise.reject(\n new Error('No head element found, are you in a navigator?')\n );\n }\n return new Promise((resolve, reject) => {\n const existingScriptElement = this._reloadedScriptElement[srcFilename];\n if (existingScriptElement) {\n head.removeChild(existingScriptElement);\n } else {\n // Check if there is an existing scriptElement in head\n const headScriptElements = head.getElementsByTagName('script');\n for (let i = 0; i < headScriptElements.length; ++i) {\n const scriptElement = headScriptElements[i];\n if (endsWith(scriptElement.src, srcFilename)) {\n head.removeChild(scriptElement);\n }\n }\n }\n const reloadedScriptElement = document.createElement('script');\n reloadedScriptElement.src = srcFilename + '?timestamp=' + Date.now();\n reloadedScriptElement.onload = () => {\n resolve();\n };\n reloadedScriptElement.onerror = (event) => {\n reject(event);\n };\n head.appendChild(reloadedScriptElement);\n this._reloadedScriptElement[srcFilename] = reloadedScriptElement;\n });\n }\n\n hotReload(): Promise<HotReloaderLog[]> {\n logger.info('Hot reload started');\n this._runtimeGame.pause(true);\n this._logs = [];\n\n // Save old data of the project, to be used to compute\n // the difference between the old and new project data:\n\n const oldProjectData: ProjectData = gdjs.projectData;\n\n const oldScriptFiles = gdjs.runtimeGameOptions\n .scriptFiles as RuntimeGameOptionsScriptFile[];\n\n oldScriptFiles.forEach((scriptFile) => {\n this._alreadyLoadedScriptFiles[scriptFile.path] = true;\n });\n const oldBehaviorConstructors: { [key: string]: Function } = {};\n\n for (let behaviorTypeName in gdjs.behaviorsTypes.items) {\n oldBehaviorConstructors[behaviorTypeName] =\n gdjs.behaviorsTypes.items[behaviorTypeName];\n }\n\n // Reload projectData and runtimeGameOptions stored by convention in data.js:\n return this._reloadScript('data.js').then(() => {\n const newProjectData: ProjectData = gdjs.projectData;\n\n const newRuntimeGameOptions: RuntimeGameOptions =\n gdjs.runtimeGameOptions;\n\n const newScriptFiles = newRuntimeGameOptions.scriptFiles as RuntimeGameOptionsScriptFile[];\n const projectDataOnlyExport = !!newRuntimeGameOptions.projectDataOnlyExport;\n\n // Reload the changed scripts, which will have the side effects of re-running\n // the new scripts, potentially replacing the code of the free functions from\n // extensions (which is fine) and registering updated behaviors (which will\n // need to be re-instantiated in runtime objects).\n return this.reloadScriptFiles(\n newProjectData,\n oldScriptFiles,\n newScriptFiles,\n projectDataOnlyExport\n )\n .then(() => {\n const changedRuntimeBehaviors = this._computeChangedRuntimeBehaviors(\n oldBehaviorConstructors,\n gdjs.behaviorsTypes.items\n );\n return this._hotReloadRuntimeGame(\n oldProjectData,\n newProjectData,\n changedRuntimeBehaviors,\n this._runtimeGame\n );\n })\n .catch((error) => {\n const errorTarget = error.target;\n if (errorTarget instanceof HTMLScriptElement) {\n this._logs.push({\n kind: 'fatal',\n message: 'Unable to reload script:' + errorTarget.src,\n });\n } else {\n this._logs.push({\n kind: 'fatal',\n message:\n 'Unexpected error happened while hot-reloading:' +\n error.message,\n });\n }\n })\n .then(() => {\n logger.info('Hot reload finished with logs:', this._logs);\n this._runtimeGame.pause(false);\n return this._logs;\n });\n });\n }\n\n _computeChangedRuntimeBehaviors(\n oldBehaviorConstructors: Record<string, Function>,\n newBehaviorConstructors: Record<string, Function>\n ): ChangedRuntimeBehavior[] {\n const changedRuntimeBehaviors: ChangedRuntimeBehavior[] = [];\n for (let behaviorTypeName in oldBehaviorConstructors) {\n const oldBehaviorConstructor =\n oldBehaviorConstructors[behaviorTypeName];\n const newBehaviorConstructor =\n newBehaviorConstructors[behaviorTypeName];\n if (!newBehaviorConstructor) {\n this._logs.push({\n kind: 'warning',\n message:\n 'Behavior with type ' +\n behaviorTypeName +\n ' was removed from the registered behaviors in gdjs.',\n });\n } else {\n if (oldBehaviorConstructor !== newBehaviorConstructor) {\n this._logs.push({\n kind: 'info',\n message:\n 'Behavior with type ' +\n behaviorTypeName +\n ' was changed, and will be re-instantiated in gdjs.RuntimeObjects using it.',\n });\n changedRuntimeBehaviors.push({\n oldBehaviorConstructor,\n newBehaviorConstructor,\n behaviorTypeName,\n });\n }\n }\n }\n return changedRuntimeBehaviors;\n }\n\n reloadScriptFiles(\n newProjectData: ProjectData,\n oldScriptFiles: RuntimeGameOptionsScriptFile[],\n newScriptFiles: RuntimeGameOptionsScriptFile[],\n projectDataOnlyExport: boolean\n ): Promise<void[]> {\n const reloadPromises: Array<Promise<void>> = [];\n\n // Reload events, only if they were exported.\n if (!projectDataOnlyExport) {\n newProjectData.layouts.forEach((_layoutData, index) => {\n reloadPromises.push(this._reloadScript('code' + index + '.js'));\n });\n }\n for (let i = 0; i < newScriptFiles.length; ++i) {\n const newScriptFile = newScriptFiles[i];\n const oldScriptFile = oldScriptFiles.filter(\n (scriptFile) => scriptFile.path === newScriptFile.path\n )[0];\n if (!oldScriptFile) {\n // Script file added\n this._logs.push({\n kind: 'info',\n message:\n 'Loading ' +\n newScriptFile.path +\n ' as it was added to the list of scripts.',\n });\n reloadPromises.push(this._reloadScript(newScriptFile.path));\n } else {\n // Script file changed, which can be the case for extensions created\n // from the editor, containing free functions or behaviors.\n if (newScriptFile.hash !== oldScriptFile.hash) {\n this._logs.push({\n kind: 'info',\n message:\n 'Reloading ' + newScriptFile.path + ' because it was changed.',\n });\n reloadPromises.push(this._reloadScript(newScriptFile.path));\n }\n }\n }\n for (let i = 0; i < oldScriptFiles.length; ++i) {\n const oldScriptFile = oldScriptFiles[i];\n const newScriptFile = newScriptFiles.filter(\n (scriptFile) => scriptFile.path === oldScriptFile.path\n )[0];\n\n // A file may be removed because of a partial preview.\n if (!newScriptFile && !projectDataOnlyExport) {\n this._logs.push({\n kind: 'warning',\n message: 'Script file ' + oldScriptFile.path + ' was removed.',\n });\n }\n }\n return Promise.all(reloadPromises);\n }\n\n async _hotReloadRuntimeGame(\n oldProjectData: ProjectData,\n newProjectData: ProjectData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n runtimeGame: gdjs.RuntimeGame\n ): Promise<void> {\n const sceneStack = runtimeGame.getSceneStack();\n const currentScene = sceneStack.getCurrentScene();\n if (!currentScene) {\n // It can't actually happen.\n this._logs.push({\n kind: 'error',\n message: \"Can't hot-reload as no scene are opened.\",\n });\n return;\n }\n // Update project data and re-load assets (sound/image/font/json managers\n // will take care of reloading only what is needed).\n runtimeGame.setProjectData(newProjectData);\n await runtimeGame.loadFirstAssetsAndStartBackgroundLoading(\n currentScene.getName(),\n () => {}\n );\n this._hotReloadVariablesContainer(\n oldProjectData.variables,\n newProjectData.variables,\n runtimeGame.getVariables()\n );\n\n // Reload runtime scenes\n sceneStack._stack.forEach((runtimeScene) => {\n const oldLayoutData = oldProjectData.layouts.filter(\n (layoutData) => layoutData.name === runtimeScene.getName()\n )[0];\n const newLayoutData = newProjectData.layouts.filter(\n (layoutData) => layoutData.name === runtimeScene.getName()\n )[0];\n if (oldLayoutData && newLayoutData) {\n this._hotReloadRuntimeScene(\n oldLayoutData,\n newLayoutData,\n changedRuntimeBehaviors,\n runtimeScene\n );\n } else {\n // A scene was removed. Not hot-reloading this.\n this._logs.push({\n kind: 'error',\n message:\n 'Scene ' +\n oldLayoutData.name +\n ' was removed. A fresh preview should be launched.',\n });\n }\n });\n\n // Reload changes in external layouts\n newProjectData.externalLayouts.forEach((newExternalLayoutData) => {\n const oldExternalLayoutData = oldProjectData.externalLayouts.filter(\n (externalLayoutData) =>\n externalLayoutData.name === newExternalLayoutData.name\n )[0];\n if (\n oldExternalLayoutData &&\n // Check if there are actual changes, to avoid useless work trying to\n // hot-reload all the scenes.\n !HotReloader.deepEqual(oldExternalLayoutData, newExternalLayoutData)\n ) {\n sceneStack._stack.forEach((runtimeScene) => {\n this._hotReloadRuntimeSceneInstances(\n oldExternalLayoutData.instances,\n newExternalLayoutData.instances,\n runtimeScene\n );\n });\n }\n });\n }\n\n _hotReloadVariablesContainer(\n oldVariablesData: RootVariableData[],\n newVariablesData: RootVariableData[],\n variablesContainer: gdjs.VariablesContainer\n ): void {\n newVariablesData.forEach((newVariableData) => {\n const variableName = newVariableData.name;\n const oldVariableData = oldVariablesData.find(\n (variable) => variable.name === variableName\n );\n const variable = variablesContainer.get(newVariableData.name);\n\n if (!oldVariableData) {\n // New variable\n variablesContainer.add(\n variableName,\n new gdjs.Variable(newVariableData)\n );\n } else if (\n gdjs.Variable.isPrimitive(newVariableData.type || 'number') &&\n (oldVariableData.value !== newVariableData.value ||\n !gdjs.Variable.isPrimitive(oldVariableData.type || 'number'))\n ) {\n // Variable value was changed or was converted from\n // a structure to a variable with value.\n variablesContainer.remove(variableName);\n variablesContainer.add(\n variableName,\n new gdjs.Variable(newVariableData)\n );\n } else if (\n !gdjs.Variable.isPrimitive(newVariableData.type || 'number')\n ) {\n // Variable is a structure or array (or was converted from a primitive\n // to one of those).\n if (newVariableData.type === 'structure')\n this._hotReloadStructureVariable(\n //@ts-ignore If the type is structure, it is assured that the children have a name\n oldVariableData.children,\n newVariableData.children,\n variable\n );\n else {\n // Arrays cannot be hot reloaded.\n // As indices can change at runtime, and in the IDE, they can be desynchronized.\n // It will in that case mess up the whole array,\n // and there is no way to know if that was the case.\n //\n // We therefore just replace the old array with the new one.\n variablesContainer.remove(variableName);\n variablesContainer.add(\n variableName,\n new gdjs.Variable(newVariableData)\n );\n }\n }\n });\n oldVariablesData.forEach((oldVariableData) => {\n const newVariableData = newVariablesData.find(\n (variable) => variable.name === oldVariableData.name\n );\n\n if (!newVariableData) {\n // Variable was removed\n variablesContainer.remove(oldVariableData.name);\n }\n });\n }\n\n _hotReloadStructureVariable(\n oldChildren: RootVariableData[],\n newChildren: RootVariableData[],\n variable: gdjs.Variable\n ): void {\n if (oldChildren) {\n oldChildren.forEach((oldChildVariableData) => {\n const newChildVariableData = newChildren.find(\n (childVariableData) =>\n childVariableData.name === oldChildVariableData.name\n );\n\n if (!newChildVariableData) {\n // Child variable was removed.\n variable.removeChild(oldChildVariableData.name);\n } else if (\n gdjs.Variable.isPrimitive(newChildVariableData.type || 'number') &&\n (oldChildVariableData.value !== newChildVariableData.value ||\n !gdjs.Variable.isPrimitive(oldChildVariableData.type || 'number'))\n ) {\n // The child variable value was changed or was converted from\n // structure to a variable with value.\n variable.addChild(\n newChildVariableData.name,\n new gdjs.Variable(newChildVariableData)\n );\n } else if (\n !gdjs.Variable.isPrimitive(newChildVariableData.type || 'number')\n ) {\n // Variable is a structure or array (or was converted from a primitive\n // to one of those).\n if (newChildVariableData.type === 'structure')\n this._hotReloadStructureVariable(\n //@ts-ignore If the type is structure, it is assured that the children have a name\n oldChildVariableData.children,\n newChildVariableData.children as Required<VariableData>[],\n variable.getChild(newChildVariableData.name)\n );\n else {\n // Arrays cannot be hot reloaded.\n // As indices can change at runtime, and in the IDE, they can be desynchronized.\n // It will in that case mess up the whole array,\n // and there is no way to know if that was the case.\n //\n // We therefore just replace the old array with the new one.\n variable.addChild(\n newChildVariableData.name,\n new gdjs.Variable(newChildVariableData)\n );\n }\n }\n });\n newChildren.forEach((newChildVariableData) => {\n const oldChildVariableData = oldChildren.find(\n (childVariableData) =>\n childVariableData.name === newChildVariableData.name\n );\n\n if (!oldChildVariableData) {\n // Child variable was added\n variable.addChild(\n newChildVariableData.name,\n new gdjs.Variable(newChildVariableData)\n );\n }\n });\n } else {\n // Variable was converted from a value to a structure:\n newChildren.forEach((newChildVariableData) => {\n variable.addChild(\n newChildVariableData.name,\n new gdjs.Variable(newChildVariableData)\n );\n });\n }\n }\n\n _hotReloadRuntimeScene(\n oldLayoutData: LayoutData,\n newLayoutData: LayoutData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n runtimeScene.setBackgroundColor(\n newLayoutData.r,\n newLayoutData.v,\n newLayoutData.b\n );\n if (oldLayoutData.title !== newLayoutData.title) {\n runtimeScene\n .getGame()\n .getRenderer()\n .setWindowTitle(newLayoutData.title);\n }\n this._hotReloadVariablesContainer(\n oldLayoutData.variables as Required<VariableData>[],\n newLayoutData.variables as Required<VariableData>[],\n runtimeScene.getVariables()\n );\n this._hotReloadRuntimeSceneBehaviorsSharedData(\n oldLayoutData.behaviorsSharedData,\n newLayoutData.behaviorsSharedData,\n runtimeScene\n );\n\n // Re-instantiate any gdjs.RuntimeBehavior that was changed.\n this._reinstantiateRuntimeSceneRuntimeBehaviors(\n changedRuntimeBehaviors,\n newLayoutData.objects,\n runtimeScene\n );\n this._hotReloadRuntimeSceneObjects(\n oldLayoutData.objects,\n newLayoutData.objects,\n runtimeScene\n );\n this._hotReloadRuntimeSceneInstances(\n oldLayoutData.instances,\n newLayoutData.instances,\n runtimeScene\n );\n this._hotReloadRuntimeSceneLayers(\n oldLayoutData.layers,\n newLayoutData.layers,\n runtimeScene\n );\n\n // Update the events generated code launched at each frame. Events generated code\n // script files were already reloaded at the beginning of the hot-reload. Note that\n // if they have not changed, it's still fine to call this, it will be basically a\n // no-op.\n runtimeScene.setEventsGeneratedCodeFunction(newLayoutData);\n }\n\n _hotReloadRuntimeSceneBehaviorsSharedData(\n oldBehaviorsSharedData: BehaviorSharedData[],\n newBehaviorsSharedData: BehaviorSharedData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n oldBehaviorsSharedData.forEach((oldBehaviorSharedData) => {\n const name = oldBehaviorSharedData.name;\n const newBehaviorSharedData = newBehaviorsSharedData.filter(\n (behaviorSharedData) => behaviorSharedData.name === name\n )[0];\n if (!newBehaviorSharedData) {\n // Behavior shared data was removed.\n runtimeScene.setInitialSharedDataForBehavior(\n oldBehaviorSharedData.name,\n null\n );\n } else {\n if (\n !HotReloader.deepEqual(oldBehaviorSharedData, newBehaviorSharedData)\n ) {\n // Behavior shared data was modified\n runtimeScene.setInitialSharedDataForBehavior(\n newBehaviorSharedData.name,\n newBehaviorSharedData\n );\n }\n }\n });\n newBehaviorsSharedData.forEach((newBehaviorSharedData) => {\n const name = newBehaviorSharedData.name;\n const oldBehaviorSharedData = oldBehaviorsSharedData.filter(\n (behaviorSharedData) => behaviorSharedData.name === name\n )[0];\n if (!oldBehaviorSharedData) {\n // Behavior shared data was added\n runtimeScene.setInitialSharedDataForBehavior(\n newBehaviorSharedData.name,\n newBehaviorSharedData\n );\n }\n });\n }\n\n _reinstantiateRuntimeSceneRuntimeBehaviors(\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n newObjects: ObjectData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n newObjects.forEach((newObjectData) => {\n const objectName = newObjectData.name;\n const newBehaviors = newObjectData.behaviors;\n const runtimeObjects = runtimeScene.getObjects(objectName)!;\n changedRuntimeBehaviors.forEach((changedRuntimeBehavior) => {\n const behaviorTypeName = changedRuntimeBehavior.behaviorTypeName;\n\n // If the changed behavior is used by the object, re-instantiate\n // it.\n newBehaviors\n .filter((behaviorData) => behaviorData.type === behaviorTypeName)\n .forEach((changedBehaviorNewData) => {\n const name = changedBehaviorNewData.name;\n this._logs.push({\n kind: 'info',\n message:\n 'Re-instantiating behavior named \"' +\n name +\n '\" for instances of object \"' +\n objectName +\n '\".',\n });\n runtimeObjects.forEach((runtimeObject) => {\n this._reinstantiateRuntimeObjectRuntimeBehavior(\n changedBehaviorNewData,\n runtimeObject\n );\n });\n });\n });\n });\n }\n\n _reinstantiateRuntimeObjectRuntimeBehavior(\n behaviorData: BehaviorData,\n runtimeObject: gdjs.RuntimeObject\n ): void {\n const behaviorName = behaviorData.name;\n const oldRuntimeBehavior = runtimeObject.getBehavior(behaviorName);\n if (!oldRuntimeBehavior) {\n return;\n }\n\n // Remove and re-add the behavior so that it's using the newly\n // registered gdjs.RuntimeBehavior.\n runtimeObject.removeBehavior(behaviorName);\n runtimeObject.addNewBehavior(behaviorData);\n const newRuntimeBehavior = runtimeObject.getBehavior(behaviorName);\n if (!newRuntimeBehavior) {\n this._logs.push({\n kind: 'error',\n message:\n 'Could not create behavior ' +\n behaviorName +\n ' (type: ' +\n behaviorData.type +\n ') for object ' +\n runtimeObject.getName(),\n });\n return;\n }\n\n // Copy the properties from the old behavior to the new one.\n for (let behaviorProperty in oldRuntimeBehavior) {\n if (!oldRuntimeBehavior.hasOwnProperty(behaviorProperty)) {\n continue;\n }\n if (behaviorProperty === '_behaviorData') {\n // For property \"_behaviorData\" that we know to be an object,\n // do a copy of each property of\n // this object so that we keep the new ones (useful if a new property was added).\n newRuntimeBehavior[behaviorProperty] =\n newRuntimeBehavior[behaviorProperty] || {};\n for (let property in oldRuntimeBehavior[behaviorProperty]) {\n newRuntimeBehavior[behaviorProperty][property] =\n oldRuntimeBehavior[behaviorProperty][property];\n }\n } else {\n newRuntimeBehavior[behaviorProperty] =\n oldRuntimeBehavior[behaviorProperty];\n }\n }\n return;\n }\n\n _hotReloadRuntimeSceneObjects(\n oldObjects: ObjectData[],\n newObjects: ObjectData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n oldObjects.forEach((oldObjectData) => {\n const name = oldObjectData.name;\n const newObjectData = newObjects.filter(\n (objectData) => objectData.name === name\n )[0];\n\n // Note: if an object is renamed in the editor, it will be considered as removed,\n // and the new object name as a new object to register.\n // It's not ideal because living instances of the object will be destroyed,\n // but it would be complex to iterate over instances of the object and change\n // its name (it's not expected to change).\n if (!newObjectData || oldObjectData.type !== newObjectData.type) {\n // Object was removed or object type was changed (considered as a removal of the old object)\n runtimeScene.unregisterObject(name);\n } else {\n if (runtimeScene.isObjectRegistered(name)) {\n this._hotReloadRuntimeSceneObject(\n oldObjectData,\n newObjectData,\n runtimeScene\n );\n }\n }\n });\n newObjects.forEach((newObjectData) => {\n const name = newObjectData.name;\n const oldObjectData = oldObjects.filter(\n (layerData) => layerData.name === name\n )[0];\n if (\n (!oldObjectData || oldObjectData.type !== newObjectData.type) &&\n !runtimeScene.isObjectRegistered(name)\n ) {\n // Object was added or object type was changed (considered as adding the new object)\n runtimeScene.registerObject(newObjectData);\n }\n });\n }\n\n _hotReloadRuntimeSceneObject(\n oldObjectData: ObjectData,\n newObjectData: ObjectData,\n runtimeScene: gdjs.RuntimeScene\n ): void {\n let hotReloadSucceeded = true;\n if (!HotReloader.deepEqual(oldObjectData, newObjectData)) {\n this._logs.push({\n kind: 'info',\n message:\n 'Object \"' +\n newObjectData.name +\n '\" was modified and is hot-reloaded.',\n });\n\n // Register the updated object data, used for new instances.\n runtimeScene.updateObject(newObjectData);\n\n // Update existing instances\n const runtimeObjects = runtimeScene.getObjects(newObjectData.name)!;\n\n // Update instances state\n runtimeObjects.forEach((runtimeObject) => {\n // Update the runtime object\n hotReloadSucceeded =\n runtimeObject.updateFromObjectData(oldObjectData, newObjectData) &&\n hotReloadSucceeded;\n });\n\n // Don't update the variables, behaviors and effects for each runtime object to avoid\n // doing the check for differences for every single object.\n\n // Update variables\n runtimeObjects.forEach((runtimeObject) => {\n this._hotReloadVariablesContainer(\n oldObjectData.variables as Required<VariableData>[],\n newObjectData.variables as Required<VariableData>[],\n runtimeObject.getVariables()\n );\n });\n\n // Update behaviors\n this._hotReloadRuntimeObjectsBehaviors(\n oldObjectData.behaviors,\n newObjectData.behaviors,\n runtimeObjects\n );\n\n // Update effects\n this._hotReloadRuntimeObjectsEffects(\n oldObjectData.effects,\n newObjectData.effects,\n runtimeObjects\n );\n }\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n 'Object \"' +\n newObjectData.name +\n '\" could not be hot-reloaded. A fresh preview should be run.',\n });\n }\n }\n\n _hotReloadRuntimeObjectsBehaviors(\n oldBehaviors: BehaviorData[],\n newBehaviors: BehaviorData[],\n runtimeObjects: gdjs.RuntimeObject[]\n ): void {\n oldBehaviors.forEach((oldBehaviorData) => {\n const name = oldBehaviorData.name;\n const newBehaviorData = newBehaviors.filter(\n (behaviorData) => behaviorData.name === name\n )[0];\n if (!newBehaviorData) {\n // Behavior was removed\n runtimeObjects.forEach((runtimeObject) => {\n if (runtimeObject.hasBehavior(name)) {\n if (!runtimeObject.removeBehavior(name)) {\n this._logs.push({\n kind: 'error',\n message:\n 'Behavior ' +\n name +\n ' could not be removed from object' +\n runtimeObject.getName(),\n });\n }\n }\n });\n } else {\n if (!HotReloader.deepEqual(oldBehaviorData, newBehaviorData)) {\n let hotReloadSucceeded = true;\n runtimeObjects.forEach((runtimeObject) => {\n const runtimeBehavior = runtimeObject.getBehavior(\n newBehaviorData.name\n );\n if (runtimeBehavior) {\n hotReloadSucceeded =\n this._hotReloadRuntimeBehavior(\n oldBehaviorData,\n newBehaviorData,\n runtimeBehavior\n ) && hotReloadSucceeded;\n }\n });\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n newBehaviorData.name + ' behavior could not be hot-reloaded.',\n });\n }\n }\n }\n });\n newBehaviors.forEach((newBehaviorData) => {\n const name = newBehaviorData.name;\n const oldBehaviorData = oldBehaviors.filter(\n (layerData) => layerData.name === name\n )[0];\n if (!oldBehaviorData) {\n // Behavior was added\n let hotReloadSucceeded = true;\n runtimeObjects.forEach((runtimeObject) => {\n hotReloadSucceeded =\n runtimeObject.addNewBehavior(newBehaviorData) &&\n hotReloadSucceeded;\n });\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n newBehaviorData.name +\n ' behavior could not be added during hot-reload.',\n });\n }\n }\n });\n }\n\n _hotReloadRuntimeObjectsEffects(\n oldEffects: EffectData[],\n newEffects: EffectData[],\n runtimeObjects: RuntimeObject[]\n ): void {\n oldEffects.forEach((oldEffectData) => {\n const name = oldEffectData.name;\n const newEffectData = newEffects.filter(\n (effectData) => effectData.name === name\n )[0];\n if (!newEffectData) {\n // Effect was removed.\n runtimeObjects.forEach((runtimeObject) => {\n if (runtimeObject.hasEffect(name)) {\n if (!runtimeObject.removeEffect(name)) {\n this._logs.push({\n kind: 'error',\n message:\n 'Effect ' +\n name +\n ' could not be removed from object' +\n runtimeObject.getName(),\n });\n }\n }\n });\n } else {\n if (!HotReloader.deepEqual(oldEffectData, newEffectData)) {\n let hotReloadSucceeded = true;\n runtimeObjects.forEach((runtimeObject) => {\n if (oldEffectData.effectType === newEffectData.effectType) {\n hotReloadSucceeded =\n runtimeObject.updateAllEffectParameters(newEffectData) &&\n hotReloadSucceeded;\n } else {\n // Another effect type was applied\n runtimeObject.removeEffect(oldEffectData.name);\n runtimeObject.addEffect(newEffectData);\n }\n });\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n newEffectData.name + ' effect could not be hot-reloaded.',\n });\n }\n }\n }\n });\n newEffects.forEach((newEffectData) => {\n const name = newEffectData.name;\n const oldEffectData = oldEffects.filter(\n (oldEffectData) => oldEffectData.name === name\n )[0];\n if (!oldEffectData) {\n // Effect was added\n let hotReloadSucceeded = true;\n runtimeObjects.forEach((runtimeObject) => {\n hotReloadSucceeded =\n runtimeObject.addEffect(newEffectData) && hotReloadSucceeded;\n });\n if (!hotReloadSucceeded) {\n this._logs.push({\n kind: 'error',\n message:\n newEffectData.name +\n ' effect could not be added during hot-reload.',\n });\n }\n }\n });\n }\n\n /**\n * @returns true if hot-reload succeeded, false otherwise.\n */\n _hotReloadRuntimeBehavior(\n oldBehaviorData: BehaviorData,\n newBehaviorData: BehaviorData,\n runtimeBehavior: gdjs.RuntimeBehavior\n ): boolean {\n // Don't check here for deep equality between oldBehaviorData and newBehaviorData.\n // This would be too costly to do for each runtime object.\n // It's supposed to be done once by the caller.\n return runtimeBehavior.updateFromBehaviorData(\n oldBehaviorData,\n newBehaviorData\n );\n }\n\n _hotReloadRuntimeSceneLayers(\n oldLayers: LayerData[],\n newLayers: LayerData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n oldLayers.forEach((oldLayerData) => {\n const name = oldLayerData.name;\n const newLayerData = newLayers.filter(\n (layerData) => layerData.name === name\n )[0];\n if (!newLayerData) {\n // Layer was removed\n runtimeScene.removeLayer(name);\n } else {\n if (runtimeScene.hasLayer(name)) {\n const layer = runtimeScene.getLayer(name);\n this._hotReloadRuntimeLayer(oldLayerData, newLayerData, layer);\n }\n }\n });\n newLayers.forEach((newLayerData) => {\n const name = newLayerData.name;\n const oldLayerData = oldLayers.filter(\n (layerData) => layerData.name === name\n )[0];\n if (!oldLayerData && !runtimeScene.hasLayer(name)) {\n // Layer was added\n runtimeScene.addLayer(newLayerData);\n }\n });\n newLayers.forEach((newLayerData, index) => {\n runtimeScene.setLayerIndex(newLayerData.name, index);\n });\n }\n\n _hotReloadRuntimeLayer(\n oldLayer: LayerData,\n newLayer: LayerData,\n runtimeLayer: gdjs.RuntimeLayer\n ): void {\n // Properties\n if (oldLayer.visibility !== newLayer.visibility) {\n runtimeLayer.show(newLayer.visibility);\n }\n if (newLayer.isLightingLayer) {\n if (\n oldLayer.ambientLightColorR !== newLayer.ambientLightColorR ||\n oldLayer.ambientLightColorG !== newLayer.ambientLightColorG ||\n oldLayer.ambientLightColorB !== newLayer.ambientLightColorB\n ) {\n runtimeLayer.setClearColor(\n newLayer.ambientLightColorR,\n newLayer.ambientLightColorG,\n newLayer.ambientLightColorB\n );\n }\n if (oldLayer.followBaseLayerCamera !== newLayer.followBaseLayerCamera) {\n runtimeLayer.setFollowBaseLayerCamera(newLayer.followBaseLayerCamera);\n }\n }\n\n // Rendering type can't be easily changed at runtime.\n if (oldLayer.renderingType !== newLayer.renderingType) {\n this._logs.push({\n kind: 'error',\n message: `Could not change the rendering type (2D, 3D...) layer at runtime (for layer \"${newLayer.name}\").`,\n });\n }\n if (newLayer.isLightingLayer !== oldLayer.isLightingLayer) {\n this._logs.push({\n kind: 'error',\n message: `Could not add/remove a lighting layer at runtime (for layer \"${newLayer.name}\").`,\n });\n }\n\n // Effects\n this._hotReloadRuntimeLayerEffects(\n oldLayer.effects,\n newLayer.effects,\n runtimeLayer\n );\n }\n\n _hotReloadRuntimeLayerEffects(\n oldEffectsData: EffectData[],\n newEffectsData: EffectData[],\n runtimeLayer: gdjs.RuntimeLayer\n ): void {\n oldEffectsData.forEach((oldEffectData) => {\n const name = oldEffectData.name;\n const newEffectData = newEffectsData.filter(\n (effectData) => effectData.name === name\n )[0];\n if (!newEffectData) {\n // Effect was removed\n runtimeLayer.removeEffect(name);\n } else {\n if (runtimeLayer.hasEffect(name)) {\n if (oldEffectData.effectType !== newEffectData.effectType) {\n // Effect changed type, consider it was removed and added back.\n runtimeLayer.removeEffect(name);\n runtimeLayer.addEffect(newEffectData);\n } else {\n this._hotReloadRuntimeLayerEffect(\n oldEffectData,\n newEffectData,\n runtimeLayer,\n name\n );\n }\n }\n }\n });\n newEffectsData.forEach((newEffectData) => {\n const name = newEffectData.name;\n const oldEffectData = oldEffectsData.filter(\n (layerData) => layerData.name === name\n )[0];\n if (!oldEffectData && !runtimeLayer.hasEffect(name)) {\n // Effect was added\n runtimeLayer.addEffect(newEffectData);\n }\n });\n }\n\n _hotReloadRuntimeLayerEffect(\n oldEffectData: EffectData,\n newEffectData: EffectData,\n runtimeLayer: gdjs.RuntimeLayer,\n effectName: string\n ): void {\n // We consider oldEffectData.effectType and newEffectData.effectType\n // are the same - it's responsibility of the caller to verify this.\n for (let parameterName in newEffectData.booleanParameters) {\n const value = newEffectData.booleanParameters[parameterName];\n if (value !== oldEffectData.booleanParameters[parameterName]) {\n runtimeLayer.setEffectBooleanParameter(\n effectName,\n parameterName,\n value\n );\n }\n }\n for (let parameterName in newEffectData.doubleParameters) {\n const value = newEffectData.doubleParameters[parameterName];\n if (value !== oldEffectData.doubleParameters[parameterName]) {\n runtimeLayer.setEffectDoubleParameter(\n effectName,\n parameterName,\n value\n );\n }\n }\n for (let parameterName in newEffectData.stringParameters) {\n const value = newEffectData.stringParameters[parameterName];\n if (value !== oldEffectData.stringParameters[parameterName]) {\n runtimeLayer.setEffectStringParameter(\n effectName,\n parameterName,\n value\n );\n }\n }\n }\n\n _hotReloadRuntimeSceneInstances(\n oldInstances: InstanceData[],\n newInstances: InstanceData[],\n runtimeScene: gdjs.RuntimeScene\n ): void {\n const runtimeObjects = runtimeScene.getAdhocListOfAllInstances();\n const groupedOldInstances: {\n [key: number]: InstanceData;\n } = HotReloader.groupByPersistentUuid(oldInstances);\n const groupedNewInstances: {\n [key: number]: InstanceData;\n } = HotReloader.groupByPersistentUuid(newInstances);\n const groupedRuntimeObjects: {\n [key: number]: gdjs.RuntimeObject;\n } = HotReloader.groupByPersistentUuid(runtimeObjects);\n for (let persistentUuid in groupedOldInstances) {\n const oldInstance = groupedOldInstances[persistentUuid];\n const newInstance = groupedNewInstances[persistentUuid];\n const runtimeObject = groupedRuntimeObjects[persistentUuid];\n if (\n oldInstance &&\n (!newInstance || oldInstance.name !== newInstance.name)\n ) {\n // Instance was deleted (or object name changed, in which case it will be re-created later)\n if (runtimeObject) {\n runtimeObject.deleteFromScene(runtimeScene);\n }\n } else {\n if (oldInstance && newInstance && runtimeObject) {\n // Instance was not deleted nor created, maybe modified (or not):\n this._hotReloadRuntimeInstance(\n oldInstance,\n newInstance,\n runtimeObject\n );\n }\n }\n }\n for (let persistentUuid in groupedNewInstances) {\n const oldInstance = groupedOldInstances[persistentUuid];\n const newInstance = groupedNewInstances[persistentUuid];\n const runtimeObject = groupedRuntimeObjects[persistentUuid];\n if (\n newInstance &&\n (!oldInstance || oldInstance.name !== newInstance.name) &&\n !runtimeObject\n ) {\n // Instance was created (or object name changed, in which case it was destroyed previously)\n // and we verified that runtimeObject does not exist.\n runtimeScene.createObjectsFrom(\n [newInstance],\n 0,\n 0,\n 0,\n /*trackByPersistentUuid=*/\n true\n );\n }\n }\n }\n\n _hotReloadRuntimeInstance(\n oldInstance: InstanceData,\n newInstance: InstanceData,\n runtimeObject: gdjs.RuntimeObject\n ): void {\n let somethingChanged = false;\n\n // Check if default properties changed\n if (oldInstance.x !== newInstance.x) {\n runtimeObject.setX(newInstance.x);\n somethingChanged = true;\n }\n if (oldInstance.y !== newInstance.y) {\n runtimeObject.setY(newInstance.y);\n somethingChanged = true;\n }\n if (oldInstance.angle !== newInstance.angle) {\n runtimeObject.setAngle(newInstance.angle);\n somethingChanged = true;\n }\n if (oldInstance.zOrder !== newInstance.zOrder) {\n runtimeObject.setZOrder(newInstance.zOrder);\n somethingChanged = true;\n }\n if (oldInstance.layer !== newInstance.layer) {\n runtimeObject.setLayer(newInstance.layer);\n somethingChanged = true;\n }\n if (gdjs.Base3DHandler && gdjs.Base3DHandler.is3D(runtimeObject)) {\n if (oldInstance.z !== newInstance.z && newInstance.z !== undefined) {\n runtimeObject.setZ(newInstance.z);\n somethingChanged = true;\n }\n if (\n oldInstance.rotationX !== newInstance.rotationX &&\n newInstance.rotationX !== undefined\n ) {\n runtimeObject.setRotationX(newInstance.rotationX);\n somethingChanged = true;\n }\n if (\n oldInstance.rotationY !== newInstance.rotationY &&\n newInstance.rotationY !== undefined\n ) {\n runtimeObject.setRotationY(newInstance.rotationY);\n somethingChanged = true;\n }\n }\n\n // Check if size changed\n let sizeChanged = false;\n if (newInstance.customSize) {\n if (!oldInstance.customSize) {\n // A custom size was set\n runtimeObject.setWidth(newInstance.width);\n runtimeObject.setHeight(newInstance.height);\n somethingChanged = true;\n sizeChanged = true;\n } else {\n // The custom size was changed\n if (oldInstance.width !== newInstance.width) {\n runtimeObject.setWidth(newInstance.width);\n somethingChanged = true;\n sizeChanged = true;\n }\n if (oldInstance.height !== newInstance.height) {\n runtimeObject.setHeight(newInstance.height);\n somethingChanged = true;\n sizeChanged = true;\n }\n }\n } else {\n if (!newInstance.customSize && oldInstance.customSize) {\n // The custom size was removed. Just flag the size as changed\n // and hope the object will handle this in\n // `extraInitializationFromInitialInstance`.\n sizeChanged = true;\n }\n }\n if (gdjs.Base3DHandler && gdjs.Base3DHandler.is3D(runtimeObject)) {\n // A custom depth was set or changed\n if (\n oldInstance.depth !== newInstance.depth &&\n newInstance.depth !== undefined\n ) {\n runtimeObject.setDepth(newInstance.depth);\n somethingChanged = true;\n sizeChanged = true;\n } else if (\n newInstance.depth === undefined &&\n oldInstance.depth !== undefined\n ) {\n // The custom depth was removed. Just flag the depth as changed\n // and hope the object will handle this in\n // `extraInitializationFromInitialInstance`.\n sizeChanged = true;\n }\n }\n\n // Update variables\n this._hotReloadVariablesContainer(\n oldInstance.initialVariables as Required<VariableData>[],\n newInstance.initialVariables as Required<VariableData>[],\n runtimeObject.getVariables()\n );\n\n // Check if custom properties changed (specific to each object type)\n const numberPropertiesChanged = newInstance.numberProperties.some(\n (numberProperty) => {\n const name = numberProperty.name;\n const value = numberProperty.value;\n const oldNumberProperty = oldInstance.numberProperties.filter(\n (numberProperty) => numberProperty.name === name\n )[0];\n return !oldNumberProperty || oldNumberProperty.value !== value;\n }\n );\n const stringPropertiesChanged = newInstance.stringProperties.some(\n (stringProperty) => {\n const name = stringProperty.name;\n const value = stringProperty.value;\n const oldStringProperty = oldInstance.stringProperties.filter(\n (stringProperty) => stringProperty.name === name\n )[0];\n return !oldStringProperty || oldStringProperty.value !== value;\n }\n );\n if (numberPropertiesChanged || stringPropertiesChanged || sizeChanged) {\n runtimeObject.extraInitializationFromInitialInstance(newInstance);\n somethingChanged = true;\n }\n if (somethingChanged) {\n // If we changed the runtime object position/size/angle or another property,\n // notify behaviors that the runtime object was reloaded.\n // This is useful for behaviors like the physics engine that are watching the\n // object position/size and need to be notified when changed (otherwise, they\n // would continue using the previous position, so the object would not be moved\n // or updated according to the changes made in the project instance).\n runtimeObject.notifyBehaviorsObjectHotReloaded();\n }\n }\n\n /**\n * Deep check equality between the two objects/arrays/primitives.\n *\n * Inspired from https://github.com/epoberezkin/fast-deep-equal\n * @param a The first object/array/primitive to compare\n * @param b The second object/array/primitive to compare\n */\n static deepEqual(a: any, b: any): boolean {\n if (a === b) {\n return true;\n }\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) {\n return false;\n }\n let length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) {\n return false;\n }\n for (i = length; i-- !== 0; ) {\n if (!HotReloader.deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n if (a.valueOf !== Object.prototype.valueOf) {\n return a.valueOf() === b.valueOf();\n }\n if (a.toString !== Object.prototype.toString) {\n return a.toString() === b.toString();\n }\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) {\n return false;\n }\n for (i = length; i-- !== 0; ) {\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) {\n return false;\n }\n }\n for (i = length; i-- !== 0; ) {\n const key = keys[i];\n if (!HotReloader.deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n\n // true if both NaN, false otherwise\n return a !== a && b !== b;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var gdjs;(function(
|
|
1
|
+
var gdjs;(function(i){let y;(function(O){let w;(function(g){g.pickOnly=function(s,t){for(const e in s.items)if(s.items.hasOwnProperty(e)){const n=s.items[e];n.indexOf(t)===-1?n.length=0:(n.length=0,n.push(t))}},g.twoListsTest=function(s,t,e,n,o){let f=!1;const l=i.staticArray(i.evtTools.object.twoListsTest);t.values(l);const u=i.staticArray2(i.evtTools.object.twoListsTest);e.values(u);for(let c=0,p=l.length;c<p;++c){let a=l[c];for(let r=0,b=a.length;r<b;++r)a[r].pick=!1}for(let c=0,p=u.length;c<p;++c){let a=u[c];for(let r=0,b=a.length;r<b;++r)a[r].pick=!1}for(let c=0,p=l.length;c<p;++c){const a=l[c];for(let r=0,b=a.length;r<b;++r){let d=!1;for(let k=0,C=u.length;k<C;++k){const T=u[k];for(let h=0,R=T.length;h<R;++h)a[r].pick&&T[h].pick||a[r].id!==T[h].id&&s(a[r],T[h],o)&&(n||(f=!0,a[r].pick=!0,T[h].pick=!0),d=!0)}!d&&n&&(f=!0,a[r].pick=!0)}}for(let c=0,p=l.length;c<p;++c){let a=l[c],r=0;for(let b=0,d=a.length;b<d;++b){let k=a[b];a[b].pick&&(a[r]=k,r++)}a.length=r}if(!n)for(let c=0,p=u.length;c<p;++c){let a=u[c],r=0;for(let b=0,d=a.length;b<d;++b){let k=a[b];a[b].pick&&(a[r]=k,r++)}a.length=r}return f},g.pickObjectsIf=function(s,t,e,n){let o=!1;const f=i.staticArray(i.evtTools.object.pickObjectsIf);t.values(f);for(let l=0,u=f.length;l<u;++l){const c=f[l];for(let p=0,a=c.length;p<a;++p){const r=c[p];e^s(r,n)?(o=!0,r.pick=!0):r.pick=!1}}for(let l=0,u=f.length;l<u;++l)i.evtTools.object.filterPickedObjectsList(f[l]);return o},g.filterPickedObjectsList=function(s){let t=0;for(let e=0,n=s.length;e<n;++e){const o=s[e];o.pick&&(s[t]=o,t++)}s.length=t},g.hitBoxesCollisionTest=function(s,t,e,n,o){return i.evtTools.object.twoListsTest(i.RuntimeObject.collisionTest,s,t,e,o)},g._distanceBetweenObjects=function(s,t,e){return s.getSqDistanceToObject(t)<=e},g.distanceTest=function(s,t,e,n){return i.evtTools.object.twoListsTest(i.evtTools.object._distanceBetweenObjects,s,t,n,e*e)},g._movesToward=function(s,t,e){if(s.hasNoForces())return!1;let n=Math.atan2(t.getDrawableY()+t.getCenterY()-(s.getDrawableY()+s.getCenterY()),t.getDrawableX()+t.getCenterX()-(s.getDrawableX()+s.getCenterX()));return n*=180/3.14159,Math.abs(i.evtTools.common.angleDifference(s.getAverageForce().getAngle(),n))<=e/2},g.movesTowardTest=function(s,t,e,n){return i.evtTools.object.twoListsTest(i.evtTools.object._movesToward,s,t,n,e)},g._turnedToward=function(s,t,e){let n=Math.atan2(t.getDrawableY()+t.getCenterY()-(s.getDrawableY()+s.getCenterY()),t.getDrawableX()+t.getCenterX()-(s.getDrawableX()+s.getCenterX()));return n*=180/3.14159,Math.abs(i.evtTools.common.angleDifference(s.getAngle(),n))<=e/2},g.turnedTowardTest=function(s,t,e,n){return i.evtTools.object.twoListsTest(i.evtTools.object._turnedToward,s,t,n,e)},g.pickAllObjects=function(s,t){for(const e in t.items)if(t.items.hasOwnProperty(e)){const n=s.getObjects(e),o=t.items[e];o.length=0,o.push.apply(o,n)}return!0},g.pickRandomObject=function(s,t){let e=0;for(let l in t.items)t.items.hasOwnProperty(l)&&(e+=t.items[l].length);if(e===0)return!1;let n=Math.floor(Math.random()*e);n>=e&&(n=e-1);let o=0,f=null;for(let l in t.items)if(t.items.hasOwnProperty(l)){let u=t.items[l];if(n-o<u.length){f=u[n-o];break}o+=u.length}return i.evtTools.object.pickOnly(t,f),!0},g.pickNearestObject=function(s,t,e,n){let o=null,f=0,l=!0;const u=i.staticArray(i.evtTools.object.pickNearestObject);s.values(u);for(let c=0,p=u.length;c<p;++c){const a=u[c];for(let r=0;r<a.length;++r){const b=a[r],d=b.getSqDistanceToPosition(t,e);(l||d<f^n)&&(f=d,o=b),l=!1}}return o?(i.evtTools.object.pickOnly(s,o),!0):!1},g.raycastObject=function(s,t,e,n,o,f,l,u){return i.evtTools.object.raycastObjectToPosition(s,t,e,t+o*Math.cos(n*Math.PI/180),e+o*Math.sin(n*Math.PI/180),f,l,u)},g.raycastObjectToPosition=function(s,t,e,n,o,f,l,u){let c=null,p=u?0:(n-t)*(n-t)+(o-e)*(o-e),a=0,r=0;const b=i.staticArray(i.evtTools.object.raycastObjectToPosition);s.values(b);for(let d=0;d<b.length;d++){const k=b[d];for(let C=0;C<k.length;C++){const T=k[C],h=T.raycastTest(t,e,n,o,!u);h.collision&&(!u&&h.closeSqDist<=p?(p=h.closeSqDist,c=T,a=h.closeX,r=h.closeY):u&&h.farSqDist>=p&&(p=h.farSqDist,c=T,a=h.farX,r=h.farY))}}return c?(i.evtTools.object.pickOnly(s,c),f.setNumber(a),l.setNumber(r),!0):!1},g.doCreateObjectOnScene=function(s,t,e,n,o,f){const l=s.createObject(t),u=s.getLayer(f);return l!==null&&(l.setPosition(n,o),l.setLayer(f),l.setZOrder(u.getDefaultZOrder()),e.containsKey(t)&&e.get(t).push(l)),l},g.createObjectOnScene=function(s,t,e,n,o){return i.evtTools.object.doCreateObjectOnScene(s,t.firstKey(),t,e,n,o)},g.createObjectFromGroupOnScene=function(s,t,e,n,o,f){i.evtTools.object.doCreateObjectOnScene(s,e,t,n,o,f)},g.getPickedInstancesCount=s=>{let t=0;const e=i.staticArray(i.evtTools.object.getPickedInstancesCount);s.values(e);for(let n=0,o=e.length;n<o;++n)t+=e[n].length;return t},g.getSceneInstancesCount=(s,t)=>{let e=0;const n=i.staticArray(i.evtTools.object.getSceneInstancesCount);t.keys(n);const o=new Set(n);for(const f of o)e+=s.getInstancesCountOnScene(f);return e},g.pickedObjectsCount=g.getPickedInstancesCount})(w=O.object||(O.object={}))})(y=i.evtTools||(i.evtTools={}));class L{constructor(){this.objectsLists=new Map;this.localVariablesContainers=[];this.callbacks=new Map;this.parent=null}static from(O){const j=new L;return j.parent=O,j}getOrCreateList(O){return this.objectsLists.has(O)||this.objectsLists.set(O,[]),this.objectsLists.get(O)}getObjects(O){return!this.objectsLists.has(O)&&this.parent?this.parent.getObjects(O):this.objectsLists.get(O)||[]}addObject(O,j){const v=this.getOrCreateList(O);if(v.includes(j))return;v.push(j);const m=()=>this.removeObject(O,j);this.callbacks.set(j,m),j.registerDestroyCallback(m)}removeObject(O,j){const v=this.getOrCreateList(O),m=v.indexOf(j);m!==-1&&(v.splice(m,1),j.unregisterDestroyCallback(this.callbacks.get(j)),this.callbacks.delete(j))}restoreLocalVariablesContainers(O){i.copyArray(this.localVariablesContainers,O)}backupLocalVariablesContainers(O){i.copyArray(O,this.localVariablesContainers)}}i.LongLivedObjectsList=L})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=objecttools.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../GDevelop/GDJS/Runtime/events-tools/objecttools.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n * GDevelop JS Platform\n * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved.\n * This project is released under the MIT License.\n */\nnamespace gdjs {\n export namespace evtTools {\n export namespace object {\n /**\n * Keep only the specified object in the lists of picked objects.\n *\n * @param objectsLists The lists of objects to trim\n * @param runtimeObject The object to keep in the lists\n */\n export const pickOnly = function (\n objectsLists: ObjectsLists,\n runtimeObject: gdjs.RuntimeObject\n ) {\n for (const listName in objectsLists.items) {\n if (objectsLists.items.hasOwnProperty(listName)) {\n const list = objectsLists.items[listName];\n\n //Be sure not to lose the reference to the original array\n if (list.indexOf(runtimeObject) === -1) {\n list.length = 0;\n } else {\n list.length = 0;\n\n //Be sure not to lose the reference to the original array\n list.push(runtimeObject);\n }\n }\n }\n };\n\n /**\n * Do a test on two tables of objects so as to pick only the pair of objects for which the test is true.\n *\n * Note that the predicate method is not called strictly for each pair: When considering a pair of objects, if\n * these objects have already been marked as picked, the predicate method won't be called again.\n *\n * Cost (Worst case, predicate being always false):\n * Cost(Setting property 'picked' of NbObjList1+NbObjList2 objects to false)\n * + Cost(predicate)*NbObjList1*NbObjList2\n * + Cost(Testing NbObjList1+NbObjList2 booleans)\n * + Cost(Removing NbObjList1+NbObjList2 objects from all the lists)\n *\n * Cost (Best case, predicate being always true):\n * Cost(Setting property 'picked' of NbObjList1+NbObjList2 objects to false)\n * + Cost(predicate)*(NbObjList1+NbObjList2)\n * + Cost(Testing NbObjList1+NbObjList2 booleans)\n *\n *\n * @param predicate The predicate function is called with the two objects to compare, and an optional argument `extraArg`\n * @param objectsLists1 The first lists of objects\n * @param objectsLists2 The second lists of objects\n * @param inverted If `inverted` == true, only the objects of the first table are filtered.\n * @param extraArg (optional) This argument should be used to avoid declaring the predicate as a closure that would be created and destroyed at each call to twoListsTest (potentially multiple time per frame).\n */\n export const twoListsTest = function (\n predicate: (\n object1: gdjs.RuntimeObject,\n object2: gdjs.RuntimeObject,\n extraArg: any\n ) => boolean,\n objectsLists1: ObjectsLists,\n objectsLists2: ObjectsLists,\n inverted: boolean,\n extraArg: any\n ) {\n let isTrue = false;\n const objects1Lists = gdjs.staticArray(\n gdjs.evtTools.object.twoListsTest\n );\n objectsLists1.values(objects1Lists);\n const objects2Lists = gdjs.staticArray2(\n gdjs.evtTools.object.twoListsTest\n );\n objectsLists2.values(objects2Lists);\n for (let i = 0, leni = objects1Lists.length; i < leni; ++i) {\n let arr = objects1Lists[i];\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n arr[k].pick = false;\n }\n }\n for (let i = 0, leni = objects2Lists.length; i < leni; ++i) {\n let arr = objects2Lists[i];\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n arr[k].pick = false;\n }\n }\n\n //Launch the function for each object of the first list with each object\n //of the second list.\n for (let i = 0, leni = objects1Lists.length; i < leni; ++i) {\n const arr1 = objects1Lists[i];\n for (let k = 0, lenk = arr1.length; k < lenk; ++k) {\n let atLeastOneObject = false;\n for (let j = 0, lenj = objects2Lists.length; j < lenj; ++j) {\n const arr2 = objects2Lists[j];\n for (let l = 0, lenl = arr2.length; l < lenl; ++l) {\n if (arr1[k].pick && arr2[l].pick) {\n continue;\n }\n\n //Avoid unnecessary costly call to predicate.\n if (\n arr1[k].id !== arr2[l].id &&\n predicate(arr1[k], arr2[l], extraArg)\n ) {\n if (!inverted) {\n isTrue = true;\n\n //Pick the objects\n arr1[k].pick = true;\n arr2[l].pick = true;\n }\n atLeastOneObject = true;\n }\n }\n }\n if (!atLeastOneObject && inverted) {\n //For example, the object is not overlapping any other object.\n isTrue = true;\n arr1[k].pick = true;\n }\n }\n }\n\n //Trim not picked objects from lists.\n for (let i = 0, leni = objects1Lists.length; i < leni; ++i) {\n let arr = objects1Lists[i];\n let finalSize = 0;\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n let obj = arr[k];\n if (arr[k].pick) {\n arr[finalSize] = obj;\n finalSize++;\n }\n }\n arr.length = finalSize;\n }\n if (!inverted) {\n for (let i = 0, leni = objects2Lists.length; i < leni; ++i) {\n let arr = objects2Lists[i];\n let finalSize = 0;\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n let obj = arr[k];\n if (arr[k].pick) {\n arr[finalSize] = obj;\n finalSize++;\n }\n }\n arr.length = finalSize;\n }\n }\n return isTrue;\n };\n\n /**\n * Filter objects to keep only the one that fullfil the predicate\n *\n * Objects that do not fullfil the predicate are removed from objects lists.\n *\n * @param predicate The function applied to each object: must return true if the object fulfill the predicate.\n * @param objectsLists The lists of objects to trim\n * @param negatePredicate If set to true, the result of the predicate is negated.\n * @param extraArg Argument passed to the predicate (along with the object). Useful for avoiding relying on temporary closures.\n * @return true if at least one object fulfill the predicate.\n */\n export const pickObjectsIf = function (\n predicate: Function,\n objectsLists: ObjectsLists,\n negatePredicate: boolean,\n extraArg: any\n ): boolean {\n let isTrue = false;\n const lists = gdjs.staticArray(gdjs.evtTools.object.pickObjectsIf);\n objectsLists.values(lists);\n\n // Pick only objects that are fulfilling the predicate.\n for (let i = 0, leni = lists.length; i < leni; ++i) {\n const arr = lists[i];\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n const object = arr[k];\n // @ts-ignore\n if (negatePredicate ^ predicate(object, extraArg)) {\n isTrue = true;\n object.pick = true;\n } else {\n object.pick = false;\n }\n }\n }\n\n // Trim not picked objects from lists.\n for (let i = 0, leni = lists.length; i < leni; ++i) {\n gdjs.evtTools.object.filterPickedObjectsList(lists[i]);\n }\n return isTrue;\n };\n\n /**\n * Filter in-place the specified array to remove objects for which\n * `pick` property is set to false.\n */\n export const filterPickedObjectsList = function (\n arr: gdjs.RuntimeObject[]\n ) {\n let finalSize = 0;\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n const obj = arr[k];\n if (obj.pick) {\n arr[finalSize] = obj;\n finalSize++;\n }\n }\n arr.length = finalSize;\n };\n\n export const hitBoxesCollisionTest = function (\n objectsLists1: ObjectsLists,\n objectsLists2: ObjectsLists,\n inverted: boolean,\n instanceContainer: gdjs.RuntimeInstanceContainer,\n ignoreTouchingEdges: boolean\n ) {\n return gdjs.evtTools.object.twoListsTest(\n gdjs.RuntimeObject.collisionTest,\n objectsLists1,\n objectsLists2,\n inverted,\n ignoreTouchingEdges\n );\n };\n\n export const _distanceBetweenObjects = function (obj1, obj2, distance) {\n return obj1.getSqDistanceToObject(obj2) <= distance;\n };\n\n export const distanceTest = function (\n objectsLists1: ObjectsLists,\n objectsLists2: ObjectsLists,\n distance: float,\n inverted: boolean\n ) {\n return gdjs.evtTools.object.twoListsTest(\n gdjs.evtTools.object._distanceBetweenObjects,\n objectsLists1,\n objectsLists2,\n inverted,\n distance * distance\n );\n };\n\n export const _movesToward = function (obj1, obj2, tolerance) {\n if (obj1.hasNoForces()) {\n return false;\n }\n let objAngle = Math.atan2(\n obj2.getDrawableY() +\n obj2.getCenterY() -\n (obj1.getDrawableY() + obj1.getCenterY()),\n obj2.getDrawableX() +\n obj2.getCenterX() -\n (obj1.getDrawableX() + obj1.getCenterX())\n );\n objAngle *= 180 / 3.14159;\n return (\n Math.abs(\n gdjs.evtTools.common.angleDifference(\n obj1.getAverageForce().getAngle(),\n objAngle\n )\n ) <=\n tolerance / 2\n );\n };\n\n export const movesTowardTest = function (\n objectsLists1: ObjectsLists,\n objectsLists2: ObjectsLists,\n tolerance: float,\n inverted: boolean\n ) {\n return gdjs.evtTools.object.twoListsTest(\n gdjs.evtTools.object._movesToward,\n objectsLists1,\n objectsLists2,\n inverted,\n tolerance\n );\n };\n\n export const _turnedToward = function (obj1, obj2, tolerance) {\n let objAngle = Math.atan2(\n obj2.getDrawableY() +\n obj2.getCenterY() -\n (obj1.getDrawableY() + obj1.getCenterY()),\n obj2.getDrawableX() +\n obj2.getCenterX() -\n (obj1.getDrawableX() + obj1.getCenterX())\n );\n objAngle *= 180 / 3.14159;\n return (\n Math.abs(\n gdjs.evtTools.common.angleDifference(obj1.getAngle(), objAngle)\n ) <=\n tolerance / 2\n );\n };\n\n export const turnedTowardTest = function (\n objectsLists1,\n objectsLists2,\n tolerance,\n inverted\n ) {\n return gdjs.evtTools.object.twoListsTest(\n gdjs.evtTools.object._turnedToward,\n objectsLists1,\n objectsLists2,\n inverted,\n tolerance\n );\n };\n\n export const pickAllObjects = function (objectsContext, objectsLists) {\n for (const name in objectsLists.items) {\n if (objectsLists.items.hasOwnProperty(name)) {\n const allObjects = objectsContext.getObjects(name);\n const objectsList = objectsLists.items[name];\n objectsList.length = 0;\n objectsList.push.apply(objectsList, allObjects);\n }\n }\n return true;\n };\n\n export const pickRandomObject = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n objectsLists: ObjectsLists\n ) {\n // Compute one many objects we have\n let objectsCount = 0;\n for (let listName in objectsLists.items) {\n if (objectsLists.items.hasOwnProperty(listName)) {\n let list = objectsLists.items[listName];\n objectsCount += list.length;\n }\n }\n if (objectsCount === 0) {\n return false;\n }\n\n // Pick one random object\n let index = Math.floor(Math.random() * objectsCount);\n if (index >= objectsCount) {\n index = objectsCount - 1;\n }\n\n //Should never happen.\n\n // Find the object\n let startIndex = 0;\n let theChosenOne: gdjs.RuntimeObject | null = null;\n for (let listName in objectsLists.items) {\n if (objectsLists.items.hasOwnProperty(listName)) {\n let list = objectsLists.items[listName];\n if (index - startIndex < list.length) {\n theChosenOne = list[index - startIndex];\n break;\n }\n startIndex += list.length;\n }\n }\n // @ts-ignore\n gdjs.evtTools.object.pickOnly(objectsLists, theChosenOne);\n return true;\n };\n\n export const pickNearestObject = function (objectsLists, x, y, inverted) {\n let bestObject = null;\n let best = 0;\n let first = true;\n const lists = gdjs.staticArray(gdjs.evtTools.object.pickNearestObject);\n objectsLists.values(lists);\n for (let i = 0, len = lists.length; i < len; ++i) {\n const list = lists[i];\n for (let j = 0; j < list.length; ++j) {\n const object = list[j];\n const distance = object.getSqDistanceToPosition(x, y);\n // @ts-ignore\n if (first || (distance < best) ^ inverted) {\n best = distance;\n bestObject = object;\n }\n first = false;\n }\n }\n if (!bestObject) {\n return false;\n }\n gdjs.evtTools.object.pickOnly(objectsLists, bestObject);\n return true;\n };\n\n export const raycastObject = function (\n objectsLists: ObjectsLists,\n x: float,\n y: float,\n angle: float,\n dist: float,\n varX: gdjs.Variable,\n varY: gdjs.Variable,\n inverted: boolean\n ) {\n return gdjs.evtTools.object.raycastObjectToPosition(\n objectsLists,\n x,\n y,\n x + dist * Math.cos((angle * Math.PI) / 180.0),\n y + dist * Math.sin((angle * Math.PI) / 180.0),\n varX,\n varY,\n inverted\n );\n };\n\n export const raycastObjectToPosition = function (\n objectsLists: ObjectsLists,\n x: float,\n y: float,\n endX: float,\n endY: float,\n varX: gdjs.Variable,\n varY: gdjs.Variable,\n inverted: boolean\n ) {\n let matchObject: gdjs.RuntimeObject | null = null;\n let testSqDist = inverted\n ? 0\n : (endX - x) * (endX - x) + (endY - y) * (endY - y);\n let resultX = 0;\n let resultY = 0;\n const lists: RuntimeObject[][] = gdjs.staticArray(\n gdjs.evtTools.object.raycastObjectToPosition\n );\n objectsLists.values(lists);\n for (let i = 0; i < lists.length; i++) {\n const list = lists[i];\n for (let j = 0; j < list.length; j++) {\n const object = list[j];\n const result = object.raycastTest(x, y, endX, endY, !inverted);\n if (result.collision) {\n if (!inverted && result.closeSqDist <= testSqDist) {\n testSqDist = result.closeSqDist;\n matchObject = object;\n resultX = result.closeX;\n resultY = result.closeY;\n } else {\n if (inverted && result.farSqDist >= testSqDist) {\n testSqDist = result.farSqDist;\n matchObject = object;\n resultX = result.farX;\n resultY = result.farY;\n }\n }\n }\n }\n }\n if (!matchObject) {\n return false;\n }\n gdjs.evtTools.object.pickOnly(objectsLists, matchObject);\n varX.setNumber(resultX);\n varY.setNumber(resultY);\n return true;\n };\n\n /**\n * Do the work of creating a new object\n */\n export const doCreateObjectOnScene = function (\n objectsContext: EventsFunctionContext | gdjs.RuntimeScene,\n objectName: string,\n objectsLists: ObjectsLists,\n x: float,\n y: float,\n layerName: string\n ): gdjs.RuntimeObject | null {\n // objectsContext will either be the gdjs.RuntimeScene or, in an events function, the\n // eventsFunctionContext. We can't directly use runtimeScene because the object name could\n // be different than the real object name (this is the case in a function. The eventsFunctionContext\n // will take care of this in createObject).\n const obj = objectsContext.createObject(objectName);\n const layer = objectsContext.getLayer(layerName);\n if (obj !== null) {\n //Do some extra setup\n obj.setPosition(x, y);\n obj.setLayer(layerName);\n obj.setZOrder(layer.getDefaultZOrder());\n\n //Let the new object be picked by next actions/conditions.\n if (objectsLists.containsKey(objectName)) {\n objectsLists.get(objectName).push(obj);\n }\n }\n return obj;\n };\n\n /**\n * Allows events to create a new object on a scene.\n */\n export const createObjectOnScene = function (\n objectsContext: EventsFunctionContext | gdjs.RuntimeScene,\n objectsLists: ObjectsLists,\n x: float,\n y: float,\n layerName: string\n ): gdjs.RuntimeObject | null {\n return gdjs.evtTools.object.doCreateObjectOnScene(\n objectsContext,\n objectsLists.firstKey() as string,\n objectsLists,\n x,\n y,\n layerName\n );\n };\n\n /**\n * Allows events to create a new object on a scene.\n */\n export const createObjectFromGroupOnScene = function (\n objectsContext: EventsFunctionContext | gdjs.RuntimeScene,\n objectsLists: ObjectsLists,\n objectName: string,\n x: float,\n y: float,\n layerName: string\n ) {\n gdjs.evtTools.object.doCreateObjectOnScene(\n objectsContext,\n objectName,\n objectsLists,\n x,\n y,\n layerName\n );\n };\n\n /**\n * Return the number of instances in the specified lists of objects.\n */\n export const getPickedInstancesCount = (objectsLists: ObjectsLists) => {\n let count = 0;\n const lists = gdjs.staticArray(\n gdjs.evtTools.object.getPickedInstancesCount\n );\n objectsLists.values(lists);\n for (let i = 0, len = lists.length; i < len; ++i) {\n count += lists[i].length;\n }\n return count;\n };\n\n /**\n * Return the number of instances of the specified objects living on the scene.\n */\n export const getSceneInstancesCount = (\n objectsContext: EventsFunctionContext | gdjs.RuntimeScene,\n objectsLists: ObjectsLists\n ) => {\n let count = 0;\n\n const objectNames = gdjs.staticArray(\n gdjs.evtTools.object.getSceneInstancesCount\n );\n objectsLists.keys(objectNames);\n\n const uniqueObjectNames = new Set(objectNames);\n for (const objectName of uniqueObjectNames) {\n count += objectsContext.getInstancesCountOnScene(objectName);\n }\n return count;\n };\n\n /** @deprecated */\n export const pickedObjectsCount = getPickedInstancesCount;\n }\n }\n\n /**\n * A container for objects lists that should last more than the current frame.\n * It automatically removes objects that were destroyed from the objects lists.\n */\n export class LongLivedObjectsList {\n private objectsLists = new Map<string, Array<RuntimeObject>>();\n private callbacks = new Map<RuntimeObject, () => void>();\n private parent: LongLivedObjectsList | null = null;\n\n /**\n * Create a new container for objects lists, inheriting from another one. This is\n * useful should we get the objects that have not been saved in this context (using\n * `addObject`) but saved in a parent context.\n * This avoids to save all object lists every time we create a new `LongLivedObjectsList`,\n * despite not all objects lists being used.\n *\n * @param parent\n * @returns\n */\n static from(parent: LongLivedObjectsList): LongLivedObjectsList {\n const newList = new LongLivedObjectsList();\n newList.parent = parent;\n return newList;\n }\n\n private getOrCreateList(objectName: string): RuntimeObject[] {\n if (!this.objectsLists.has(objectName))\n this.objectsLists.set(objectName, []);\n return this.objectsLists.get(objectName)!;\n }\n\n getObjects(objectName: string): RuntimeObject[] {\n if (!this.objectsLists.has(objectName) && this.parent)\n return this.parent.getObjects(objectName);\n return this.objectsLists.get(objectName) || [];\n }\n\n addObject(objectName: string, runtimeObject: gdjs.RuntimeObject): void {\n const list = this.getOrCreateList(objectName);\n if (list.includes(runtimeObject)) return;\n list.push(runtimeObject);\n\n // Register callbacks for when the object is destroyed\n const onDestroy = () => this.removeObject(objectName, runtimeObject);\n this.callbacks.set(runtimeObject, onDestroy);\n runtimeObject.registerDestroyCallback(onDestroy);\n }\n\n removeObject(objectName: string, runtimeObject: gdjs.RuntimeObject): void {\n const list = this.getOrCreateList(objectName);\n const index = list.indexOf(runtimeObject);\n if (index === -1) return;\n list.splice(index, 1);\n\n // Properly remove callbacks to not leak the object\n runtimeObject.unregisterDestroyCallback(\n this.callbacks.get(runtimeObject)!\n );\n this.callbacks.delete(runtimeObject);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/*\n * GDevelop JS Platform\n * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved.\n * This project is released under the MIT License.\n */\nnamespace gdjs {\n export namespace evtTools {\n export namespace object {\n /**\n * Keep only the specified object in the lists of picked objects.\n *\n * @param objectsLists The lists of objects to trim\n * @param runtimeObject The object to keep in the lists\n */\n export const pickOnly = function (\n objectsLists: ObjectsLists,\n runtimeObject: gdjs.RuntimeObject\n ) {\n for (const listName in objectsLists.items) {\n if (objectsLists.items.hasOwnProperty(listName)) {\n const list = objectsLists.items[listName];\n\n //Be sure not to lose the reference to the original array\n if (list.indexOf(runtimeObject) === -1) {\n list.length = 0;\n } else {\n list.length = 0;\n\n //Be sure not to lose the reference to the original array\n list.push(runtimeObject);\n }\n }\n }\n };\n\n /**\n * Do a test on two tables of objects so as to pick only the pair of objects for which the test is true.\n *\n * Note that the predicate method is not called strictly for each pair: When considering a pair of objects, if\n * these objects have already been marked as picked, the predicate method won't be called again.\n *\n * Cost (Worst case, predicate being always false):\n * Cost(Setting property 'picked' of NbObjList1+NbObjList2 objects to false)\n * + Cost(predicate)*NbObjList1*NbObjList2\n * + Cost(Testing NbObjList1+NbObjList2 booleans)\n * + Cost(Removing NbObjList1+NbObjList2 objects from all the lists)\n *\n * Cost (Best case, predicate being always true):\n * Cost(Setting property 'picked' of NbObjList1+NbObjList2 objects to false)\n * + Cost(predicate)*(NbObjList1+NbObjList2)\n * + Cost(Testing NbObjList1+NbObjList2 booleans)\n *\n *\n * @param predicate The predicate function is called with the two objects to compare, and an optional argument `extraArg`\n * @param objectsLists1 The first lists of objects\n * @param objectsLists2 The second lists of objects\n * @param inverted If `inverted` == true, only the objects of the first table are filtered.\n * @param extraArg (optional) This argument should be used to avoid declaring the predicate as a closure that would be created and destroyed at each call to twoListsTest (potentially multiple time per frame).\n */\n export const twoListsTest = function (\n predicate: (\n object1: gdjs.RuntimeObject,\n object2: gdjs.RuntimeObject,\n extraArg: any\n ) => boolean,\n objectsLists1: ObjectsLists,\n objectsLists2: ObjectsLists,\n inverted: boolean,\n extraArg: any\n ) {\n let isTrue = false;\n const objects1Lists = gdjs.staticArray(\n gdjs.evtTools.object.twoListsTest\n );\n objectsLists1.values(objects1Lists);\n const objects2Lists = gdjs.staticArray2(\n gdjs.evtTools.object.twoListsTest\n );\n objectsLists2.values(objects2Lists);\n for (let i = 0, leni = objects1Lists.length; i < leni; ++i) {\n let arr = objects1Lists[i];\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n arr[k].pick = false;\n }\n }\n for (let i = 0, leni = objects2Lists.length; i < leni; ++i) {\n let arr = objects2Lists[i];\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n arr[k].pick = false;\n }\n }\n\n //Launch the function for each object of the first list with each object\n //of the second list.\n for (let i = 0, leni = objects1Lists.length; i < leni; ++i) {\n const arr1 = objects1Lists[i];\n for (let k = 0, lenk = arr1.length; k < lenk; ++k) {\n let atLeastOneObject = false;\n for (let j = 0, lenj = objects2Lists.length; j < lenj; ++j) {\n const arr2 = objects2Lists[j];\n for (let l = 0, lenl = arr2.length; l < lenl; ++l) {\n if (arr1[k].pick && arr2[l].pick) {\n continue;\n }\n\n //Avoid unnecessary costly call to predicate.\n if (\n arr1[k].id !== arr2[l].id &&\n predicate(arr1[k], arr2[l], extraArg)\n ) {\n if (!inverted) {\n isTrue = true;\n\n //Pick the objects\n arr1[k].pick = true;\n arr2[l].pick = true;\n }\n atLeastOneObject = true;\n }\n }\n }\n if (!atLeastOneObject && inverted) {\n //For example, the object is not overlapping any other object.\n isTrue = true;\n arr1[k].pick = true;\n }\n }\n }\n\n //Trim not picked objects from lists.\n for (let i = 0, leni = objects1Lists.length; i < leni; ++i) {\n let arr = objects1Lists[i];\n let finalSize = 0;\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n let obj = arr[k];\n if (arr[k].pick) {\n arr[finalSize] = obj;\n finalSize++;\n }\n }\n arr.length = finalSize;\n }\n if (!inverted) {\n for (let i = 0, leni = objects2Lists.length; i < leni; ++i) {\n let arr = objects2Lists[i];\n let finalSize = 0;\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n let obj = arr[k];\n if (arr[k].pick) {\n arr[finalSize] = obj;\n finalSize++;\n }\n }\n arr.length = finalSize;\n }\n }\n return isTrue;\n };\n\n /**\n * Filter objects to keep only the one that fullfil the predicate\n *\n * Objects that do not fullfil the predicate are removed from objects lists.\n *\n * @param predicate The function applied to each object: must return true if the object fulfill the predicate.\n * @param objectsLists The lists of objects to trim\n * @param negatePredicate If set to true, the result of the predicate is negated.\n * @param extraArg Argument passed to the predicate (along with the object). Useful for avoiding relying on temporary closures.\n * @return true if at least one object fulfill the predicate.\n */\n export const pickObjectsIf = function (\n predicate: Function,\n objectsLists: ObjectsLists,\n negatePredicate: boolean,\n extraArg: any\n ): boolean {\n let isTrue = false;\n const lists = gdjs.staticArray(gdjs.evtTools.object.pickObjectsIf);\n objectsLists.values(lists);\n\n // Pick only objects that are fulfilling the predicate.\n for (let i = 0, leni = lists.length; i < leni; ++i) {\n const arr = lists[i];\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n const object = arr[k];\n // @ts-ignore\n if (negatePredicate ^ predicate(object, extraArg)) {\n isTrue = true;\n object.pick = true;\n } else {\n object.pick = false;\n }\n }\n }\n\n // Trim not picked objects from lists.\n for (let i = 0, leni = lists.length; i < leni; ++i) {\n gdjs.evtTools.object.filterPickedObjectsList(lists[i]);\n }\n return isTrue;\n };\n\n /**\n * Filter in-place the specified array to remove objects for which\n * `pick` property is set to false.\n */\n export const filterPickedObjectsList = function (\n arr: gdjs.RuntimeObject[]\n ) {\n let finalSize = 0;\n for (let k = 0, lenk = arr.length; k < lenk; ++k) {\n const obj = arr[k];\n if (obj.pick) {\n arr[finalSize] = obj;\n finalSize++;\n }\n }\n arr.length = finalSize;\n };\n\n export const hitBoxesCollisionTest = function (\n objectsLists1: ObjectsLists,\n objectsLists2: ObjectsLists,\n inverted: boolean,\n instanceContainer: gdjs.RuntimeInstanceContainer,\n ignoreTouchingEdges: boolean\n ) {\n return gdjs.evtTools.object.twoListsTest(\n gdjs.RuntimeObject.collisionTest,\n objectsLists1,\n objectsLists2,\n inverted,\n ignoreTouchingEdges\n );\n };\n\n export const _distanceBetweenObjects = function (obj1, obj2, distance) {\n return obj1.getSqDistanceToObject(obj2) <= distance;\n };\n\n export const distanceTest = function (\n objectsLists1: ObjectsLists,\n objectsLists2: ObjectsLists,\n distance: float,\n inverted: boolean\n ) {\n return gdjs.evtTools.object.twoListsTest(\n gdjs.evtTools.object._distanceBetweenObjects,\n objectsLists1,\n objectsLists2,\n inverted,\n distance * distance\n );\n };\n\n export const _movesToward = function (obj1, obj2, tolerance) {\n if (obj1.hasNoForces()) {\n return false;\n }\n let objAngle = Math.atan2(\n obj2.getDrawableY() +\n obj2.getCenterY() -\n (obj1.getDrawableY() + obj1.getCenterY()),\n obj2.getDrawableX() +\n obj2.getCenterX() -\n (obj1.getDrawableX() + obj1.getCenterX())\n );\n objAngle *= 180 / 3.14159;\n return (\n Math.abs(\n gdjs.evtTools.common.angleDifference(\n obj1.getAverageForce().getAngle(),\n objAngle\n )\n ) <=\n tolerance / 2\n );\n };\n\n export const movesTowardTest = function (\n objectsLists1: ObjectsLists,\n objectsLists2: ObjectsLists,\n tolerance: float,\n inverted: boolean\n ) {\n return gdjs.evtTools.object.twoListsTest(\n gdjs.evtTools.object._movesToward,\n objectsLists1,\n objectsLists2,\n inverted,\n tolerance\n );\n };\n\n export const _turnedToward = function (obj1, obj2, tolerance) {\n let objAngle = Math.atan2(\n obj2.getDrawableY() +\n obj2.getCenterY() -\n (obj1.getDrawableY() + obj1.getCenterY()),\n obj2.getDrawableX() +\n obj2.getCenterX() -\n (obj1.getDrawableX() + obj1.getCenterX())\n );\n objAngle *= 180 / 3.14159;\n return (\n Math.abs(\n gdjs.evtTools.common.angleDifference(obj1.getAngle(), objAngle)\n ) <=\n tolerance / 2\n );\n };\n\n export const turnedTowardTest = function (\n objectsLists1,\n objectsLists2,\n tolerance,\n inverted\n ) {\n return gdjs.evtTools.object.twoListsTest(\n gdjs.evtTools.object._turnedToward,\n objectsLists1,\n objectsLists2,\n inverted,\n tolerance\n );\n };\n\n export const pickAllObjects = function (objectsContext, objectsLists) {\n for (const name in objectsLists.items) {\n if (objectsLists.items.hasOwnProperty(name)) {\n const allObjects = objectsContext.getObjects(name);\n const objectsList = objectsLists.items[name];\n objectsList.length = 0;\n objectsList.push.apply(objectsList, allObjects);\n }\n }\n return true;\n };\n\n export const pickRandomObject = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n objectsLists: ObjectsLists\n ) {\n // Compute one many objects we have\n let objectsCount = 0;\n for (let listName in objectsLists.items) {\n if (objectsLists.items.hasOwnProperty(listName)) {\n let list = objectsLists.items[listName];\n objectsCount += list.length;\n }\n }\n if (objectsCount === 0) {\n return false;\n }\n\n // Pick one random object\n let index = Math.floor(Math.random() * objectsCount);\n if (index >= objectsCount) {\n index = objectsCount - 1;\n }\n\n //Should never happen.\n\n // Find the object\n let startIndex = 0;\n let theChosenOne: gdjs.RuntimeObject | null = null;\n for (let listName in objectsLists.items) {\n if (objectsLists.items.hasOwnProperty(listName)) {\n let list = objectsLists.items[listName];\n if (index - startIndex < list.length) {\n theChosenOne = list[index - startIndex];\n break;\n }\n startIndex += list.length;\n }\n }\n // @ts-ignore\n gdjs.evtTools.object.pickOnly(objectsLists, theChosenOne);\n return true;\n };\n\n export const pickNearestObject = function (objectsLists, x, y, inverted) {\n let bestObject = null;\n let best = 0;\n let first = true;\n const lists = gdjs.staticArray(gdjs.evtTools.object.pickNearestObject);\n objectsLists.values(lists);\n for (let i = 0, len = lists.length; i < len; ++i) {\n const list = lists[i];\n for (let j = 0; j < list.length; ++j) {\n const object = list[j];\n const distance = object.getSqDistanceToPosition(x, y);\n // @ts-ignore\n if (first || (distance < best) ^ inverted) {\n best = distance;\n bestObject = object;\n }\n first = false;\n }\n }\n if (!bestObject) {\n return false;\n }\n gdjs.evtTools.object.pickOnly(objectsLists, bestObject);\n return true;\n };\n\n export const raycastObject = function (\n objectsLists: ObjectsLists,\n x: float,\n y: float,\n angle: float,\n dist: float,\n varX: gdjs.Variable,\n varY: gdjs.Variable,\n inverted: boolean\n ) {\n return gdjs.evtTools.object.raycastObjectToPosition(\n objectsLists,\n x,\n y,\n x + dist * Math.cos((angle * Math.PI) / 180.0),\n y + dist * Math.sin((angle * Math.PI) / 180.0),\n varX,\n varY,\n inverted\n );\n };\n\n export const raycastObjectToPosition = function (\n objectsLists: ObjectsLists,\n x: float,\n y: float,\n endX: float,\n endY: float,\n varX: gdjs.Variable,\n varY: gdjs.Variable,\n inverted: boolean\n ) {\n let matchObject: gdjs.RuntimeObject | null = null;\n let testSqDist = inverted\n ? 0\n : (endX - x) * (endX - x) + (endY - y) * (endY - y);\n let resultX = 0;\n let resultY = 0;\n const lists: RuntimeObject[][] = gdjs.staticArray(\n gdjs.evtTools.object.raycastObjectToPosition\n );\n objectsLists.values(lists);\n for (let i = 0; i < lists.length; i++) {\n const list = lists[i];\n for (let j = 0; j < list.length; j++) {\n const object = list[j];\n const result = object.raycastTest(x, y, endX, endY, !inverted);\n if (result.collision) {\n if (!inverted && result.closeSqDist <= testSqDist) {\n testSqDist = result.closeSqDist;\n matchObject = object;\n resultX = result.closeX;\n resultY = result.closeY;\n } else {\n if (inverted && result.farSqDist >= testSqDist) {\n testSqDist = result.farSqDist;\n matchObject = object;\n resultX = result.farX;\n resultY = result.farY;\n }\n }\n }\n }\n }\n if (!matchObject) {\n return false;\n }\n gdjs.evtTools.object.pickOnly(objectsLists, matchObject);\n varX.setNumber(resultX);\n varY.setNumber(resultY);\n return true;\n };\n\n /**\n * Do the work of creating a new object\n */\n export const doCreateObjectOnScene = function (\n objectsContext: EventsFunctionContext | gdjs.RuntimeScene,\n objectName: string,\n objectsLists: ObjectsLists,\n x: float,\n y: float,\n layerName: string\n ): gdjs.RuntimeObject | null {\n // objectsContext will either be the gdjs.RuntimeScene or, in an events function, the\n // eventsFunctionContext. We can't directly use runtimeScene because the object name could\n // be different than the real object name (this is the case in a function. The eventsFunctionContext\n // will take care of this in createObject).\n const obj = objectsContext.createObject(objectName);\n const layer = objectsContext.getLayer(layerName);\n if (obj !== null) {\n //Do some extra setup\n obj.setPosition(x, y);\n obj.setLayer(layerName);\n obj.setZOrder(layer.getDefaultZOrder());\n\n //Let the new object be picked by next actions/conditions.\n if (objectsLists.containsKey(objectName)) {\n objectsLists.get(objectName).push(obj);\n }\n }\n return obj;\n };\n\n /**\n * Allows events to create a new object on a scene.\n */\n export const createObjectOnScene = function (\n objectsContext: EventsFunctionContext | gdjs.RuntimeScene,\n objectsLists: ObjectsLists,\n x: float,\n y: float,\n layerName: string\n ): gdjs.RuntimeObject | null {\n return gdjs.evtTools.object.doCreateObjectOnScene(\n objectsContext,\n objectsLists.firstKey() as string,\n objectsLists,\n x,\n y,\n layerName\n );\n };\n\n /**\n * Allows events to create a new object on a scene.\n */\n export const createObjectFromGroupOnScene = function (\n objectsContext: EventsFunctionContext | gdjs.RuntimeScene,\n objectsLists: ObjectsLists,\n objectName: string,\n x: float,\n y: float,\n layerName: string\n ) {\n gdjs.evtTools.object.doCreateObjectOnScene(\n objectsContext,\n objectName,\n objectsLists,\n x,\n y,\n layerName\n );\n };\n\n /**\n * Return the number of instances in the specified lists of objects.\n */\n export const getPickedInstancesCount = (objectsLists: ObjectsLists) => {\n let count = 0;\n const lists = gdjs.staticArray(\n gdjs.evtTools.object.getPickedInstancesCount\n );\n objectsLists.values(lists);\n for (let i = 0, len = lists.length; i < len; ++i) {\n count += lists[i].length;\n }\n return count;\n };\n\n /**\n * Return the number of instances of the specified objects living on the scene.\n */\n export const getSceneInstancesCount = (\n objectsContext: EventsFunctionContext | gdjs.RuntimeScene,\n objectsLists: ObjectsLists\n ) => {\n let count = 0;\n\n const objectNames = gdjs.staticArray(\n gdjs.evtTools.object.getSceneInstancesCount\n );\n objectsLists.keys(objectNames);\n\n const uniqueObjectNames = new Set(objectNames);\n for (const objectName of uniqueObjectNames) {\n count += objectsContext.getInstancesCountOnScene(objectName);\n }\n return count;\n };\n\n /** @deprecated */\n export const pickedObjectsCount = getPickedInstancesCount;\n }\n }\n\n /**\n * A container for objects lists that should last more than the current frame.\n * It automatically removes objects that were destroyed from the objects lists.\n */\n export class LongLivedObjectsList {\n private objectsLists = new Map<string, Array<RuntimeObject>>();\n private localVariablesContainers: Array<gdjs.VariablesContainer> = [];\n private callbacks = new Map<RuntimeObject, () => void>();\n private parent: LongLivedObjectsList | null = null;\n\n /**\n * Create a new container for objects lists, inheriting from another one. This is\n * useful should we get the objects that have not been saved in this context (using\n * `addObject`) but saved in a parent context.\n * This avoids to save all object lists every time we create a new `LongLivedObjectsList`,\n * despite not all objects lists being used.\n *\n * @param parent\n * @returns\n */\n static from(parent: LongLivedObjectsList): LongLivedObjectsList {\n const newList = new LongLivedObjectsList();\n newList.parent = parent;\n return newList;\n }\n\n private getOrCreateList(objectName: string): RuntimeObject[] {\n if (!this.objectsLists.has(objectName))\n this.objectsLists.set(objectName, []);\n return this.objectsLists.get(objectName)!;\n }\n\n getObjects(objectName: string): RuntimeObject[] {\n if (!this.objectsLists.has(objectName) && this.parent)\n return this.parent.getObjects(objectName);\n return this.objectsLists.get(objectName) || [];\n }\n\n addObject(objectName: string, runtimeObject: gdjs.RuntimeObject): void {\n const list = this.getOrCreateList(objectName);\n if (list.includes(runtimeObject)) return;\n list.push(runtimeObject);\n\n // Register callbacks for when the object is destroyed\n const onDestroy = () => this.removeObject(objectName, runtimeObject);\n this.callbacks.set(runtimeObject, onDestroy);\n runtimeObject.registerDestroyCallback(onDestroy);\n }\n\n removeObject(objectName: string, runtimeObject: gdjs.RuntimeObject): void {\n const list = this.getOrCreateList(objectName);\n const index = list.indexOf(runtimeObject);\n if (index === -1) return;\n list.splice(index, 1);\n\n // Properly remove callbacks to not leak the object\n runtimeObject.unregisterDestroyCallback(\n this.callbacks.get(runtimeObject)!\n );\n this.callbacks.delete(runtimeObject);\n }\n\n restoreLocalVariablesContainers(\n variablesContainers: Array<gdjs.VariablesContainer>\n ): void {\n gdjs.copyArray(this.localVariablesContainers, variablesContainers);\n }\n\n backupLocalVariablesContainers(\n variablesContainers: Array<gdjs.VariablesContainer>\n ): void {\n gdjs.copyArray(variablesContainers, this.localVariablesContainers);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var gdjs;(function(r){let c;(function(i){let u;(function(s){s.sceneJustBegins=function(e){return e.getScene().getTimeManager().isFirstFrame()},s.sceneJustResumed=function(e){return e.getScene().sceneJustResumed()},s.getSceneName=function(e){return e.getScene().getName()},s.setBackgroundColor=function(e,t){const n=t.split(";");n.length<3||e.getScene().setBackgroundColor(parseInt(n[0]),parseInt(n[1]),parseInt(n[2]))},s.getElapsedTimeInSeconds=function(e){return e.getScene().getTimeManager().getElapsedTime()/1e3},s.setTimeScale=function(e,t){return e.getScene().getTimeManager().setTimeScale(t)},s.getTimeScale=function(e){return e.getScene().getTimeManager().getTimeScale()},s.timerElapsedTime=function(e,t,n){const a=e.getScene().getTimeManager();return a.hasTimer(n)?a.getTimer(n).getTime()/1e3>=t:(a.addTimer(n),!1)},s.timerPaused=function(e,t){const n=e.getScene().getTimeManager();return n.hasTimer(t)?n.getTimer(t).isPaused():!1},s.resetTimer=function(e,t){const n=e.getScene().getTimeManager();n.hasTimer(t)?n.getTimer(t).reset():n.addTimer(t)},s.pauseTimer=function(e,t){const n=e.getScene().getTimeManager();n.hasTimer(t)||n.addTimer(t),n.getTimer(t).setPaused(!0)},s.unpauseTimer=function(e,t){const n=e.getScene().getTimeManager();return n.hasTimer(t)||n.addTimer(t),n.getTimer(t).setPaused(!1)},s.removeTimer=function(e,t){e.getScene().getTimeManager().removeTimer(t)};class m extends r.AsyncTask{constructor(t){super();this.timeElapsedOnScene=0;this.duration=t}update(t){return this.timeElapsedOnScene+=t.getScene().getTimeManager().getElapsedTime(),this.timeElapsedOnScene>=this.duration}}s.WaitTask=m,s.wait=e=>new m(e*1e3),s.getTimerElapsedTimeInSeconds=function(e,t){const n=e.getScene().getTimeManager();return n.hasTimer(t)?n.getTimer(t).getTime()/1e3:0},s.getTimerElapsedTimeInSecondsOrNaN=function(e,t){const n=e.getScene().getTimeManager();return n.hasTimer(t)?n.getTimer(t).getTime()/1e3:Number.NaN},s.getTimeFromStartInSeconds=function(e){return e.getScene().getTimeManager().getTimeFromStart()/1e3},s.getTime=function(e,t){if(t==="timestamp")return Date.now();const n=new Date;if(t==="hour")return n.getHours();if(t==="min")return n.getMinutes();if(t==="sec")return n.getSeconds();if(t==="mday")return n.getDate();if(t==="mon")return n.getMonth();if(t==="year")return n.getFullYear()-1900;if(t==="wday")return n.getDay();if(t==="yday"){const a=new Date(n.getFullYear(),0,0),o=n.getTime()-a.getTime(),g=1e3*60*60*24;return Math.floor(o/g)}return 0},s.replaceScene=function(e,t,n){!e.getGame().
|
|
1
|
+
var gdjs;(function(r){let c;(function(i){let u;(function(s){s.sceneJustBegins=function(e){return e.getScene().getTimeManager().isFirstFrame()},s.sceneJustResumed=function(e){return e.getScene().sceneJustResumed()},s.getSceneName=function(e){return e.getScene().getName()},s.setBackgroundColor=function(e,t){const n=t.split(";");n.length<3||e.getScene().setBackgroundColor(parseInt(n[0]),parseInt(n[1]),parseInt(n[2]))},s.getElapsedTimeInSeconds=function(e){return e.getScene().getTimeManager().getElapsedTime()/1e3},s.setTimeScale=function(e,t){return e.getScene().getTimeManager().setTimeScale(t)},s.getTimeScale=function(e){return e.getScene().getTimeManager().getTimeScale()},s.timerElapsedTime=function(e,t,n){const a=e.getScene().getTimeManager();return a.hasTimer(n)?a.getTimer(n).getTime()/1e3>=t:(a.addTimer(n),!1)},s.timerPaused=function(e,t){const n=e.getScene().getTimeManager();return n.hasTimer(t)?n.getTimer(t).isPaused():!1},s.resetTimer=function(e,t){const n=e.getScene().getTimeManager();n.hasTimer(t)?n.getTimer(t).reset():n.addTimer(t)},s.pauseTimer=function(e,t){const n=e.getScene().getTimeManager();n.hasTimer(t)||n.addTimer(t),n.getTimer(t).setPaused(!0)},s.unpauseTimer=function(e,t){const n=e.getScene().getTimeManager();return n.hasTimer(t)||n.addTimer(t),n.getTimer(t).setPaused(!1)},s.removeTimer=function(e,t){e.getScene().getTimeManager().removeTimer(t)};class m extends r.AsyncTask{constructor(t){super();this.timeElapsedOnScene=0;this.duration=t}update(t){return this.timeElapsedOnScene+=t.getScene().getTimeManager().getElapsedTime(),this.timeElapsedOnScene>=this.duration}}s.WaitTask=m,s.wait=e=>new m(e*1e3),s.getTimerElapsedTimeInSeconds=function(e,t){const n=e.getScene().getTimeManager();return n.hasTimer(t)?n.getTimer(t).getTime()/1e3:0},s.getTimerElapsedTimeInSecondsOrNaN=function(e,t){const n=e.getScene().getTimeManager();return n.hasTimer(t)?n.getTimer(t).getTime()/1e3:Number.NaN},s.getTimeFromStartInSeconds=function(e){return e.getScene().getTimeManager().getTimeFromStart()/1e3},s.getTime=function(e,t){if(t==="timestamp")return Date.now();const n=new Date;if(t==="hour")return n.getHours();if(t==="min")return n.getMinutes();if(t==="sec")return n.getSeconds();if(t==="mday")return n.getDate();if(t==="mon")return n.getMonth();if(t==="year")return n.getFullYear()-1900;if(t==="wday")return n.getDay();if(t==="yday"){const a=new Date(n.getFullYear(),0,0),o=n.getTime()-a.getTime(),g=1e3*60*60*24;return Math.floor(o/g)}return 0},s.replaceScene=function(e,t,n){!e.getGame().getSceneAndExtensionsData(t)||e.getScene().requestChange(n?r.SceneChangeRequest.CLEAR_SCENES:r.SceneChangeRequest.REPLACE_SCENE,t)},s.pushScene=function(e,t){!e.getGame().getSceneAndExtensionsData(t)||e.getScene().requestChange(r.SceneChangeRequest.PUSH_SCENE,t)},s.popScene=function(e){e.getScene().requestChange(r.SceneChangeRequest.POP_SCENE)},s.stopGame=function(e){e.getScene().requestChange(r.SceneChangeRequest.STOP_GAME)},s.createObjectsFromExternalLayout=function(e,t,n,a,o){const g=e.getGame().getExternalLayoutData(t);g!==null&&e.getScene().createObjectsFrom(g.instances,n,a,o||0,!1)},s.hasGameJustResumed=e=>e.getGame().hasJustResumed(),s.doesSceneExist=(e,t)=>e.getGame().hasScene(t),s.prioritizeLoadingOfScene=(e,t)=>{e.getGame().prioritizeLoadingOfScene(t)},s.getSceneLoadingProgress=(e,t)=>e.getGame().getSceneLoadingProgress(t),s.areSceneAssetsLoaded=(e,t)=>e.getGame().areSceneAssetsLoaded(t)})(u=i.runtimeScene||(i.runtimeScene={}))})(c=r.evtTools||(r.evtTools={}))})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=runtimescenetools.js.map
|