gdcore-tools 2.0.0-beta6 → 2.0.0-beta8
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/Cordova/config.xml +4 -0
- package/dist/Runtime/Cordova/package.json +12 -20
- package/dist/Runtime/CustomRuntimeObject.js +1 -1
- package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
- package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js +1 -1
- package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js.map +2 -2
- 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/AmbientLight.js +1 -1
- package/dist/Runtime/Extensions/3D/AmbientLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js +1 -1
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +2 -2
- 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/HemisphereLight.js +1 -1
- package/dist/Runtime/Extensions/3D/HemisphereLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/JsExtension.js +419 -228
- 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/AdvancedWindow/electron-advancedwindowtools.js +1 -1
- package/dist/Runtime/Extensions/AdvancedWindow/electron-advancedwindowtools.js.map +2 -2
- package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/BBText/JsExtension.js +45 -42
- 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 +40 -49
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.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/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/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/glow-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/glow-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/ExampleJsExtension/JsExtension.js +18 -21
- package/dist/Runtime/Extensions/Firebase/B_firebasetools/C_firebasetools.js +1 -1
- package/dist/Runtime/Extensions/Firebase/B_firebasetools/C_firebasetools.js.map +2 -2
- package/dist/Runtime/Extensions/JsExtensionTypes.d.ts +8 -2
- 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 +50 -38
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/JsExtension.js +15 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js.map +2 -2
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
- 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/Physics2Behavior/JsExtension.js +76 -24
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js +1 -1
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.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/shapepainterruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/JsExtension.js +45 -36
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TextInput/JsExtension.js +52 -55
- 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/textruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js.map +2 -2
- 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 +430 -261
- 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.js +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts +1 -0
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +2 -2
- 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.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/Video/JsExtension.js +35 -44
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
- package/dist/Runtime/ResourceLoader.js +1 -1
- package/dist/Runtime/ResourceLoader.js.map +2 -2
- package/dist/Runtime/RuntimeInstanceContainer.js.map +2 -2
- package/dist/Runtime/debugger-client/hot-reloader.js +2 -2
- package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
- package/dist/Runtime/events-tools/inputtools.js +1 -1
- package/dist/Runtime/events-tools/inputtools.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/gd.js +1 -1
- package/dist/Runtime/gd.js.map +2 -2
- package/dist/Runtime/howler-sound-manager/howler-sound-manager.js +1 -1
- package/dist/Runtime/howler-sound-manager/howler-sound-manager.js.map +2 -2
- package/dist/Runtime/inputmanager.js +1 -1
- package/dist/Runtime/inputmanager.js.map +2 -2
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js +1 -1
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.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/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/runtimegame.js +1 -1
- package/dist/Runtime/runtimegame.js.map +1 -1
- package/dist/Runtime/runtimeobject.js +1 -1
- package/dist/Runtime/runtimeobject.js.map +2 -2
- package/dist/Runtime/spriteruntimeobject.js +1 -1
- package/dist/Runtime/spriteruntimeobject.js.map +2 -2
- package/dist/Runtime/types/project-data.d.ts +5 -0
- package/dist/lib/libGD.cjs +1 -1
- package/dist/lib/libGD.d.cts +5 -0
- package/dist/lib/libGD.wasm +0 -0
- package/dist/loaders.cjs +3 -1
- package/dist/loaders.d.cts +2 -0
- package/gd.d.ts +74 -30
- package/package.json +3 -3
|
@@ -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 static indexByName<E extends { name: string | null }>(\n objectsWithName: E[]\n ): Map<string, E> {\n return objectsWithName.reduce(function (objectsMap, object) {\n if (object.name) {\n objectsMap.set(object.name, object);\n }\n return objectsMap;\n }, new Map<string, E>());\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(\n 'Hot reload finished with logs:',\n this._logs.map((log) => '\\n' + log.kind + ': ' + log.message)\n );\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 // Update extension's global variables.\n for (const newExtensionData of newProjectData.eventsFunctionsExtensions) {\n const oldExtensionData = oldProjectData.eventsFunctionsExtensions.find(\n (oldExtensionData) => oldExtensionData.name === newExtensionData.name\n );\n\n const oldGlobalVariables = oldExtensionData\n ? oldExtensionData.globalVariables\n : [];\n const newGlobalVariables = newExtensionData.globalVariables;\n\n if (oldGlobalVariables.length > 0 || newGlobalVariables.length > 0) {\n const currentVariables = runtimeGame.getVariablesForExtension(\n newExtensionData.name\n );\n if (currentVariables) {\n this._hotReloadVariablesContainer(\n oldGlobalVariables,\n newGlobalVariables,\n currentVariables\n );\n } else {\n runtimeGame._variablesByExtensionName.set(\n newExtensionData.name,\n new gdjs.VariablesContainer(newGlobalVariables)\n );\n }\n }\n }\n\n const oldlayoutDataMap = HotReloader.indexByName(oldProjectData.layouts);\n const newlayoutDataMap = HotReloader.indexByName(newProjectData.layouts);\n\n // Reload runtime scenes\n sceneStack._stack.forEach((runtimeScene) => {\n const oldLayoutData = oldlayoutDataMap.get(runtimeScene.getName());\n const newLayoutData = newlayoutDataMap.get(runtimeScene.getName());\n if (oldLayoutData && newLayoutData) {\n this._hotReloadRuntimeScene(\n oldProjectData,\n newProjectData,\n oldLayoutData,\n newLayoutData,\n changedRuntimeBehaviors,\n runtimeScene\n );\n\n // Update extension's scene variables.\n for (const newExtensionData of newProjectData.eventsFunctionsExtensions) {\n const oldExtensionData = oldProjectData.eventsFunctionsExtensions.find(\n (oldExtensionData) =>\n oldExtensionData.name === newExtensionData.name\n );\n\n const oldSceneVariables = oldExtensionData\n ? oldExtensionData.sceneVariables\n : [];\n const newSceneVariables = newExtensionData.sceneVariables;\n\n if (oldSceneVariables.length > 0 || newSceneVariables.length > 0) {\n const currentVariables = runtimeScene.getVariablesForExtension(\n newExtensionData.name\n );\n if (currentVariables) {\n this._hotReloadVariablesContainer(\n oldSceneVariables,\n newSceneVariables,\n currentVariables\n );\n } else {\n runtimeScene._variablesByExtensionName.set(\n newExtensionData.name,\n new gdjs.VariablesContainer(newSceneVariables)\n );\n }\n }\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 && 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 const oldLayoutData = oldlayoutDataMap.get(\n oldExternalLayoutData.associatedLayout\n );\n const newLayoutData = newlayoutDataMap.get(\n newExternalLayoutData.associatedLayout\n );\n\n sceneStack._stack.forEach((runtimeScene) => {\n this._hotReloadRuntimeSceneInstances(\n oldProjectData,\n newProjectData,\n changedRuntimeBehaviors,\n oldLayoutData ? oldLayoutData.objects : [],\n newLayoutData ? newLayoutData.objects : [],\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 variablesContainer.rebuildIndexFrom(newVariablesData);\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 oldProjectData: ProjectData,\n newProjectData: ProjectData,\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 this._hotReloadRuntimeInstanceContainer(\n oldProjectData,\n newProjectData,\n oldLayoutData,\n newLayoutData,\n changedRuntimeBehaviors,\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 static resolveCustomObjectConfigurations(\n projectData: ProjectData,\n objectDatas: ObjectData[]\n ): ObjectData[] {\n return objectDatas.map((objectData) => {\n const [extensionName, eventsBasedObjectName] = objectData.type.split(\n '::'\n );\n\n const extensionData = projectData.eventsFunctionsExtensions.find(\n (extension) => extension.name === extensionName\n );\n if (!extensionData) {\n return objectData;\n }\n\n const eventsBasedObjectData =\n extensionData &&\n extensionData.eventsBasedObjects.find(\n (object) => object.name === eventsBasedObjectName\n );\n if (!eventsBasedObjectData) {\n return objectData;\n }\n\n const customObjectConfiguration = objectData as ObjectData &\n CustomObjectConfiguration;\n\n const mergedChildObjectDataList = customObjectConfiguration.childrenContent\n ? eventsBasedObjectData.objects.map((objectData) => ({\n ...objectData,\n ...customObjectConfiguration.childrenContent[objectData.name],\n }))\n : eventsBasedObjectData.objects;\n\n const mergedObjectConfiguration = {\n ...eventsBasedObjectData,\n ...objectData,\n // ObjectData doesn't have an `objects` attribute.\n // This is a small optimization to avoid to create an\n // InstanceContainerData for each instance to hot-reload their inner\n // scene (see `_hotReloadRuntimeInstanceContainer` call from\n // `_hotReloadRuntimeSceneInstances`).\n objects: mergedChildObjectDataList,\n childrenContent: mergedChildObjectDataList,\n };\n return mergedObjectConfiguration;\n });\n }\n\n _hotReloadRuntimeInstanceContainer(\n oldProjectData: ProjectData,\n newProjectData: ProjectData,\n oldLayoutData: InstanceContainerData,\n newLayoutData: InstanceContainerData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n const oldObjectDataList = HotReloader.resolveCustomObjectConfigurations(\n oldProjectData,\n oldLayoutData.objects\n );\n const newObjectDataList = HotReloader.resolveCustomObjectConfigurations(\n newProjectData,\n newLayoutData.objects\n );\n\n // Re-instantiate any gdjs.RuntimeBehavior that was changed.\n this._reinstantiateRuntimeSceneRuntimeBehaviors(\n changedRuntimeBehaviors,\n newObjectDataList,\n runtimeInstanceContainer\n );\n this._hotReloadRuntimeSceneObjects(\n oldObjectDataList,\n newObjectDataList,\n runtimeInstanceContainer\n );\n this._hotReloadRuntimeSceneInstances(\n oldProjectData,\n newProjectData,\n changedRuntimeBehaviors,\n oldObjectDataList,\n newObjectDataList,\n oldLayoutData.instances,\n newLayoutData.instances,\n runtimeInstanceContainer\n );\n this._hotReloadRuntimeSceneLayers(\n oldLayoutData.layers,\n newLayoutData.layers,\n runtimeInstanceContainer\n );\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 runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n newObjects.forEach((newObjectData) => {\n const objectName = newObjectData.name;\n const newBehaviors = newObjectData.behaviors;\n const runtimeObjects = runtimeInstanceContainer.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 runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\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 runtimeInstanceContainer.unregisterObject(name);\n } else {\n if (runtimeInstanceContainer.isObjectRegistered(name)) {\n this._hotReloadRuntimeSceneObject(\n oldObjectData,\n newObjectData,\n runtimeInstanceContainer\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 !runtimeInstanceContainer.isObjectRegistered(name)\n ) {\n // Object was added or object type was changed (considered as adding the new object)\n runtimeInstanceContainer.registerObject(newObjectData);\n }\n });\n }\n\n _hotReloadRuntimeSceneObject(\n oldObjectData: ObjectData,\n newObjectData: ObjectData,\n runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\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 runtimeInstanceContainer.updateObject(newObjectData);\n\n // Update existing instances\n const runtimeObjects = runtimeInstanceContainer.getObjects(\n newObjectData.name\n )!;\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 runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\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 runtimeInstanceContainer.removeLayer(name);\n } else {\n if (runtimeInstanceContainer.hasLayer(name)) {\n const layer = runtimeInstanceContainer.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 && !runtimeInstanceContainer.hasLayer(name)) {\n // Layer was added\n runtimeInstanceContainer.addLayer(newLayerData);\n }\n });\n newLayers.forEach((newLayerData, index) => {\n runtimeInstanceContainer.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 oldProjectData: ProjectData,\n newProjectData: ProjectData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n oldObjects: ObjectData[],\n newObjects: ObjectData[],\n oldInstances: InstanceData[],\n newInstances: InstanceData[],\n runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n const runtimeObjects = runtimeInstanceContainer.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\n const oldObjectsMap = HotReloader.indexByName(oldObjects);\n const newObjectsMap = HotReloader.indexByName(newObjects);\n\n for (const persistentUuid in groupedOldInstances) {\n const oldInstance = groupedOldInstances[persistentUuid];\n const newInstance = groupedNewInstances[persistentUuid];\n const runtimeObject = groupedRuntimeObjects[persistentUuid];\n\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(runtimeInstanceContainer);\n }\n } else {\n }\n }\n\n for (const persistentUuid in groupedRuntimeObjects) {\n const runtimeObject = groupedRuntimeObjects[persistentUuid];\n const oldObjectData = oldObjectsMap.get(runtimeObject.getName());\n const newObjectData = newObjectsMap.get(runtimeObject.getName());\n if (!runtimeObject || !oldObjectData || !newObjectData) {\n // New objects or deleted objects can't have instances to hot-reload.\n continue;\n }\n const oldInstance = groupedOldInstances[persistentUuid];\n const newInstance = groupedNewInstances[persistentUuid];\n if (oldInstance && newInstance) {\n // Instance was not deleted nor created, maybe modified (or not):\n this._hotReloadRuntimeInstance(\n oldProjectData,\n newProjectData,\n changedRuntimeBehaviors,\n oldObjectData,\n newObjectData,\n oldInstance,\n newInstance,\n runtimeObject\n );\n } else if (runtimeObject instanceof gdjs.CustomRuntimeObject) {\n const childrenInstanceContainer = runtimeObject.getChildrenContainer();\n\n // The `objects` attribute is already resolved by `resolveCustomObjectConfigurations()`.\n const oldCustomObjectData = oldObjectData as ObjectData &\n CustomObjectConfiguration &\n InstanceContainerData;\n const newCustomObjectData = newObjectData as ObjectData &\n CustomObjectConfiguration &\n InstanceContainerData;\n\n // Reload the content of custom objects that were created at runtime.\n this._hotReloadRuntimeInstanceContainer(\n oldProjectData,\n newProjectData,\n oldCustomObjectData,\n newCustomObjectData,\n changedRuntimeBehaviors,\n childrenInstanceContainer\n );\n }\n }\n\n for (const 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 runtimeInstanceContainer.createObjectsFrom(\n [newInstance],\n 0,\n 0,\n 0,\n /*trackByPersistentUuid=*/\n true\n );\n }\n }\n }\n\n _hotReloadRuntimeInstance(\n oldProjectData: ProjectData,\n newProjectData: ProjectData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n oldObjectData: ObjectData,\n newObjectData: ObjectData,\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 if (runtimeObject instanceof gdjs.CustomRuntimeObject) {\n const childrenInstanceContainer = runtimeObject.getChildrenContainer();\n\n // The `objects` attribute is already resolved by `resolveCustomObjectConfigurations()`.\n const oldCustomObjectData = oldObjectData as ObjectData &\n CustomObjectConfiguration &\n InstanceContainerData;\n const newCustomObjectData = newObjectData as ObjectData &\n CustomObjectConfiguration &\n InstanceContainerData;\n\n this._hotReloadRuntimeInstanceContainer(\n oldProjectData,\n newProjectData,\n oldCustomObjectData,\n newCustomObjectData,\n changedRuntimeBehaviors,\n childrenInstanceContainer\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 indexByPersistentUuid<\n ObjectWithPersistentId extends { persistentUuid: string | null }\n >(\n objectsWithPersistentId: ObjectWithPersistentId[]\n ): Map<string, ObjectWithPersistentId> {\n return objectsWithPersistentId.reduce(function (objectsMap, object) {\n if (object.persistentUuid) {\n objectsMap.set(object.persistentUuid, object);\n }\n return objectsMap;\n }, new Map<string, ObjectWithPersistentId>());\n }\n\n static indexByName<E extends { name: string | null }>(\n objectsWithName: E[]\n ): Map<string, E> {\n return objectsWithName.reduce(function (objectsMap, object) {\n if (object.name) {\n objectsMap.set(object.name, object);\n }\n return objectsMap;\n }, new Map<string, E>());\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(\n 'Hot reload finished with logs:',\n this._logs.map((log) => '\\n' + log.kind + ': ' + log.message)\n );\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 // Update extension's global variables.\n for (const newExtensionData of newProjectData.eventsFunctionsExtensions) {\n const oldExtensionData = oldProjectData.eventsFunctionsExtensions.find(\n (oldExtensionData) => oldExtensionData.name === newExtensionData.name\n );\n\n const oldGlobalVariables = oldExtensionData\n ? oldExtensionData.globalVariables\n : [];\n const newGlobalVariables = newExtensionData.globalVariables;\n\n if (oldGlobalVariables.length > 0 || newGlobalVariables.length > 0) {\n const currentVariables = runtimeGame.getVariablesForExtension(\n newExtensionData.name\n );\n if (currentVariables) {\n this._hotReloadVariablesContainer(\n oldGlobalVariables,\n newGlobalVariables,\n currentVariables\n );\n } else {\n runtimeGame._variablesByExtensionName.set(\n newExtensionData.name,\n new gdjs.VariablesContainer(newGlobalVariables)\n );\n }\n }\n }\n\n const oldlayoutDataMap = HotReloader.indexByName(oldProjectData.layouts);\n const newlayoutDataMap = HotReloader.indexByName(newProjectData.layouts);\n\n // Reload runtime scenes\n sceneStack._stack.forEach((runtimeScene) => {\n const oldLayoutData = oldlayoutDataMap.get(runtimeScene.getName());\n const newLayoutData = newlayoutDataMap.get(runtimeScene.getName());\n if (oldLayoutData && newLayoutData) {\n this._hotReloadRuntimeScene(\n oldProjectData,\n newProjectData,\n oldLayoutData,\n newLayoutData,\n changedRuntimeBehaviors,\n runtimeScene\n );\n\n // Update extension's scene variables.\n for (const newExtensionData of newProjectData.eventsFunctionsExtensions) {\n const oldExtensionData = oldProjectData.eventsFunctionsExtensions.find(\n (oldExtensionData) =>\n oldExtensionData.name === newExtensionData.name\n );\n\n const oldSceneVariables = oldExtensionData\n ? oldExtensionData.sceneVariables\n : [];\n const newSceneVariables = newExtensionData.sceneVariables;\n\n if (oldSceneVariables.length > 0 || newSceneVariables.length > 0) {\n const currentVariables = runtimeScene.getVariablesForExtension(\n newExtensionData.name\n );\n if (currentVariables) {\n this._hotReloadVariablesContainer(\n oldSceneVariables,\n newSceneVariables,\n currentVariables\n );\n } else {\n runtimeScene._variablesByExtensionName.set(\n newExtensionData.name,\n new gdjs.VariablesContainer(newSceneVariables)\n );\n }\n }\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 && 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 const oldLayoutData = oldlayoutDataMap.get(\n oldExternalLayoutData.associatedLayout\n );\n const newLayoutData = newlayoutDataMap.get(\n newExternalLayoutData.associatedLayout\n );\n\n sceneStack._stack.forEach((runtimeScene) => {\n this._hotReloadRuntimeSceneInstances(\n oldProjectData,\n newProjectData,\n changedRuntimeBehaviors,\n oldLayoutData ? oldLayoutData.objects : [],\n newLayoutData ? newLayoutData.objects : [],\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 variablesContainer.rebuildIndexFrom(newVariablesData);\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 oldProjectData: ProjectData,\n newProjectData: ProjectData,\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 this._hotReloadRuntimeInstanceContainer(\n oldProjectData,\n newProjectData,\n oldLayoutData,\n newLayoutData,\n changedRuntimeBehaviors,\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 static resolveCustomObjectConfigurations(\n projectData: ProjectData,\n objectDatas: ObjectData[]\n ): ObjectData[] {\n return objectDatas.map((objectData) => {\n const [extensionName, eventsBasedObjectName] = objectData.type.split(\n '::'\n );\n\n const extensionData = projectData.eventsFunctionsExtensions.find(\n (extension) => extension.name === extensionName\n );\n if (!extensionData) {\n return objectData;\n }\n\n const eventsBasedObjectData =\n extensionData &&\n extensionData.eventsBasedObjects.find(\n (object) => object.name === eventsBasedObjectName\n );\n if (!eventsBasedObjectData) {\n return objectData;\n }\n\n const customObjectConfiguration = objectData as ObjectData &\n CustomObjectConfiguration;\n\n const mergedChildObjectDataList = customObjectConfiguration.childrenContent\n ? eventsBasedObjectData.objects.map((objectData) => ({\n ...objectData,\n ...customObjectConfiguration.childrenContent[objectData.name],\n }))\n : eventsBasedObjectData.objects;\n\n const mergedObjectConfiguration = {\n ...eventsBasedObjectData,\n ...objectData,\n // ObjectData doesn't have an `objects` attribute.\n // This is a small optimization to avoid to create an\n // InstanceContainerData for each instance to hot-reload their inner\n // scene (see `_hotReloadRuntimeInstanceContainer` call from\n // `_hotReloadRuntimeSceneInstances`).\n objects: mergedChildObjectDataList,\n childrenContent: mergedChildObjectDataList,\n };\n return mergedObjectConfiguration;\n });\n }\n\n _hotReloadRuntimeInstanceContainer(\n oldProjectData: ProjectData,\n newProjectData: ProjectData,\n oldLayoutData: InstanceContainerData,\n newLayoutData: InstanceContainerData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n const oldObjectDataList = HotReloader.resolveCustomObjectConfigurations(\n oldProjectData,\n oldLayoutData.objects\n );\n const newObjectDataList = HotReloader.resolveCustomObjectConfigurations(\n newProjectData,\n newLayoutData.objects\n );\n\n // Re-instantiate any gdjs.RuntimeBehavior that was changed.\n this._reinstantiateRuntimeSceneRuntimeBehaviors(\n changedRuntimeBehaviors,\n newObjectDataList,\n runtimeInstanceContainer\n );\n this._hotReloadRuntimeSceneObjects(\n oldObjectDataList,\n newObjectDataList,\n runtimeInstanceContainer\n );\n this._hotReloadRuntimeSceneInstances(\n oldProjectData,\n newProjectData,\n changedRuntimeBehaviors,\n oldObjectDataList,\n newObjectDataList,\n oldLayoutData.instances,\n newLayoutData.instances,\n runtimeInstanceContainer\n );\n this._hotReloadRuntimeSceneLayers(\n oldLayoutData.layers,\n newLayoutData.layers,\n runtimeInstanceContainer\n );\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 runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n newObjects.forEach((newObjectData) => {\n const objectName = newObjectData.name;\n const newBehaviors = newObjectData.behaviors;\n const runtimeObjects = runtimeInstanceContainer.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 runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\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 runtimeInstanceContainer.unregisterObject(name);\n } else {\n if (runtimeInstanceContainer.isObjectRegistered(name)) {\n this._hotReloadRuntimeSceneObject(\n oldObjectData,\n newObjectData,\n runtimeInstanceContainer\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 !runtimeInstanceContainer.isObjectRegistered(name)\n ) {\n // Object was added or object type was changed (considered as adding the new object)\n runtimeInstanceContainer.registerObject(newObjectData);\n }\n });\n }\n\n _hotReloadRuntimeSceneObject(\n oldObjectData: ObjectData,\n newObjectData: ObjectData,\n runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\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 runtimeInstanceContainer.updateObject(newObjectData);\n\n // Update existing instances\n const runtimeObjects = runtimeInstanceContainer.getObjects(\n newObjectData.name\n )!;\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 behaviors and effects for each runtime object to avoid\n // doing the check for differences for every single object.\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 runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\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 runtimeInstanceContainer.removeLayer(name);\n } else {\n if (runtimeInstanceContainer.hasLayer(name)) {\n const layer = runtimeInstanceContainer.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 && !runtimeInstanceContainer.hasLayer(name)) {\n // Layer was added\n runtimeInstanceContainer.addLayer(newLayerData);\n }\n });\n newLayers.forEach((newLayerData, index) => {\n runtimeInstanceContainer.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 oldProjectData: ProjectData,\n newProjectData: ProjectData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n oldObjects: ObjectData[],\n newObjects: ObjectData[],\n oldInstances: InstanceData[],\n newInstances: InstanceData[],\n runtimeInstanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n const runtimeObjects = runtimeInstanceContainer.getAdhocListOfAllInstances();\n const oldInstanceByUuid = HotReloader.indexByPersistentUuid(oldInstances);\n const newInstanceByUuid = HotReloader.indexByPersistentUuid(newInstances);\n const runtimeObjectByUuid = HotReloader.indexByPersistentUuid(\n runtimeObjects\n );\n\n const oldObjectsMap = HotReloader.indexByName(oldObjects);\n const newObjectsMap = HotReloader.indexByName(newObjects);\n\n for (const persistentUuid of oldInstanceByUuid.keys()) {\n const oldInstance = oldInstanceByUuid.get(persistentUuid);\n const newInstance = newInstanceByUuid.get(persistentUuid);\n const runtimeObject = runtimeObjectByUuid.get(persistentUuid);\n\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(runtimeInstanceContainer);\n }\n } else {\n }\n }\n\n for (const runtimeObject of runtimeObjects) {\n const oldObjectData = oldObjectsMap.get(runtimeObject.getName());\n const newObjectData = newObjectsMap.get(runtimeObject.getName());\n if (!runtimeObject || !oldObjectData || !newObjectData) {\n // New objects or deleted objects can't have instances to hot-reload.\n continue;\n }\n const oldInstance = oldInstanceByUuid.get(\n // @ts-ignore Private attribute\n runtimeObject.persistentUuid\n );\n const newInstance = newInstanceByUuid.get(\n // @ts-ignore Private attribute\n runtimeObject.persistentUuid\n );\n if (oldInstance && newInstance) {\n // Instance was not deleted nor created, maybe modified (or not):\n this._hotReloadRuntimeInstance(\n oldProjectData,\n newProjectData,\n changedRuntimeBehaviors,\n oldObjectData,\n newObjectData,\n oldInstance,\n newInstance,\n runtimeObject\n );\n } else {\n // Reload objects that were created at runtime.\n\n // Update variables\n this._hotReloadVariablesContainer(\n oldObjectData.variables,\n newObjectData.variables,\n runtimeObject.getVariables()\n );\n\n if (runtimeObject instanceof gdjs.CustomRuntimeObject) {\n const childrenInstanceContainer = runtimeObject.getChildrenContainer();\n\n // The `objects` attribute is already resolved by `resolveCustomObjectConfigurations()`.\n const oldCustomObjectData = oldObjectData as ObjectData &\n CustomObjectConfiguration &\n InstanceContainerData;\n const newCustomObjectData = newObjectData as ObjectData &\n CustomObjectConfiguration &\n InstanceContainerData;\n\n // Reload the content of custom objects that were created at runtime.\n this._hotReloadRuntimeInstanceContainer(\n oldProjectData,\n newProjectData,\n oldCustomObjectData,\n newCustomObjectData,\n changedRuntimeBehaviors,\n childrenInstanceContainer\n );\n }\n }\n }\n\n for (const persistentUuid of newInstanceByUuid.keys()) {\n const oldInstance = oldInstanceByUuid.get(persistentUuid);\n const newInstance = newInstanceByUuid.get(persistentUuid);\n const runtimeObject = runtimeObjectByUuid.get(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 runtimeInstanceContainer.createObjectsFrom(\n [newInstance],\n 0,\n 0,\n 0,\n /*trackByPersistentUuid=*/\n true\n );\n }\n }\n }\n\n _hotReloadRuntimeInstance(\n oldProjectData: ProjectData,\n newProjectData: ProjectData,\n changedRuntimeBehaviors: ChangedRuntimeBehavior[],\n oldObjectData: ObjectData,\n newObjectData: ObjectData,\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 if (runtimeObject instanceof gdjs.CustomRuntimeObject) {\n const childrenInstanceContainer = runtimeObject.getChildrenContainer();\n\n // The `objects` attribute is already resolved by `resolveCustomObjectConfigurations()`.\n const oldCustomObjectData = oldObjectData as ObjectData &\n CustomObjectConfiguration &\n InstanceContainerData;\n const newCustomObjectData = newObjectData as ObjectData &\n CustomObjectConfiguration &\n InstanceContainerData;\n\n this._hotReloadRuntimeInstanceContainer(\n oldProjectData,\n newProjectData,\n oldCustomObjectData,\n newCustomObjectData,\n changedRuntimeBehaviors,\n childrenInstanceContainer\n );\n }\n\n // Update variables\n this._hotReloadVariablesContainer(\n this._mergeObjectVariablesData(\n oldObjectData.variables,\n oldInstance.initialVariables\n ),\n this._mergeObjectVariablesData(\n newObjectData.variables,\n newInstance.initialVariables\n ),\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 _mergeObjectVariablesData(\n objectVariablesData: RootVariableData[],\n instanceVariablesData: RootVariableData[]\n ): RootVariableData[] {\n if (instanceVariablesData.length === 0) {\n return objectVariablesData;\n }\n const variablesData = [...objectVariablesData];\n for (const instanceVariableData of instanceVariablesData) {\n const index = variablesData.indexOf(\n (variableData) => variableData.name === instanceVariableData.name\n );\n if (index >= 0) {\n variablesData[index] = instanceVariableData;\n }\n }\n return variablesData;\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(o){let i;(function(c){let d;(function(n){n.lastTouchId=0,n.lastEndedTouchId=0,n.keysNameToCode={a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,Num0:48,Num1:49,Num2:50,Num3:51,Num4:52,Num5:53,Num6:54,Num7:55,Num8:56,Num9:57,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,LShift:1016,RShift:2016,LControl:1017,RControl:2017,LAlt:1018,RAlt:2018,LSystem:1091,RSystem:2091,SemiColon:186,Comma:188,Period:190,Quote:222,Slash:191,BackSlash:220,Equal:187,Dash:189,Menu:93,LBracket:219,RBracket:221,Tilde:192,Space:32,Back:8,Tab:9,Delete:46,Insert:45,Escape:27,PageUp:33,PageDown:34,End:35,Home:36,Return:13,NumpadPageUp:3033,NumpadPageDown:3034,NumpadEnd:3035,NumpadHome:3036,NumpadReturn:3013,Add:107,Subtract:109,Multiply:106,Divide:111,NumpadAdd:3107,NumpadSubtract:3109,NumpadMultiply:3106,NumpadDivide:3111,Left:37,Up:38,Right:39,Down:40,NumpadLeft:3037,NumpadUp:3038,NumpadRight:3039,NumpadDown:3040,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,Pause:19};const u={};for(const e in n.keysNameToCode)n.keysNameToCode.hasOwnProperty(e)&&(u[n.keysNameToCode[e]]=e);n.mouseButtonsNameToCode={Left:o.InputManager.MOUSE_LEFT_BUTTON,Right:o.InputManager.MOUSE_RIGHT_BUTTON,Middle:o.InputManager.MOUSE_MIDDLE_BUTTON,Back:o.InputManager.MOUSE_BACK_BUTTON,Forward:o.InputManager.MOUSE_FORWARD_BUTTON},n.isKeyPressed=function(e,t){return o.evtTools.input.keysNameToCode.hasOwnProperty(t)?e.getGame().getInputManager().isKeyPressed(o.evtTools.input.keysNameToCode[t]):!1},n.wasKeyReleased=function(e,t){return o.evtTools.input.keysNameToCode.hasOwnProperty(t)?e.getGame().getInputManager().wasKeyReleased(o.evtTools.input.keysNameToCode[t]):!1},n.lastPressedKey=function(e){const t=e.getGame().getInputManager().getLastPressedKey();return u.hasOwnProperty(t)?u[t]:""},n.anyKeyPressed=function(e){return e.getGame().getInputManager().anyKeyPressed()},n.anyKeyReleased=function(e){return e.getGame().getInputManager().anyKeyReleased()},n.isMouseButtonPressed=function(e,t){return o.evtTools.input.mouseButtonsNameToCode.hasOwnProperty(t)?e.getGame().getInputManager().isMouseButtonPressed(o.evtTools.input.mouseButtonsNameToCode[t]):!1},n.isMouseButtonReleased=function(e,t){return o.evtTools.input.mouseButtonsNameToCode.hasOwnProperty(t)?e.getGame().getInputManager().isMouseButtonReleased(o.evtTools.input.mouseButtonsNameToCode[t]):!1},n.hideCursor=function(e){e.getScene().getRenderer().hideCursor()},n.showCursor=function(e){e.getScene().getRenderer().showCursor()},n.getMouseWheelDelta=function(e){return e.getGame().getInputManager().getMouseWheelDelta()},n.isScrollingUp=function(e){return e.getGame().getInputManager().isScrollingUp()},n.isScrollingDown=function(e){return e.getGame().getInputManager().isScrollingDown()},n.getMouseX=function(e,t,r){return n.getCursorX(e,t,r)},n.getMouseY=function(e,t,r){return n.getCursorY(e,t,r)},n.getCursorX=function(e,t,r){const a=o.staticArray(o.evtTools.input.getCursorX);return e.getLayer(t).convertCoords(e.getGame().getInputManager().getCursorX(),e.getGame().getInputManager().getCursorY(),0,a)[0]},n.getCursorY=function(e,t,r){const a=o.staticArray(o.evtTools.input.getCursorY);return e.getLayer(t).convertCoords(e.getGame().getInputManager().getCursorX(),e.getGame().getInputManager().getCursorY(),0,a)[1]},n.getMouseOnlyCursorX=function(e,t,r){const a=o.staticArray(o.evtTools.input.getMouseOnlyCursorX);return e.getLayer(t).convertCoords(e.getGame().getInputManager().getMouseX(),e.getGame().getInputManager().getMouseY(),0,a)[0]},n.getMouseOnlyCursorY=function(e,t,r){const a=o.staticArray(o.evtTools.input.getMouseOnlyCursorY);return e.getLayer(t).convertCoords(e.getGame().getInputManager().getMouseX(),e.getGame().getInputManager().getMouseY(),0,a)[1]},n.isMouseInsideCanvas=function(e){return e.getGame().getInputManager().isMouseInsideCanvas()};const I=function(e,t){return e.cursorOnObject(t)};n.cursorOnObject=function(e,t,r,a){return o.evtTools.object.pickObjectsIf(I,e,a,t)},n.getTouchX=function(e,t,r,a){const g=o.staticArray(o.evtTools.input.getTouchX);return e.getLayer(r).convertCoords(e.getGame().getInputManager().getTouchX(t),e.getGame().getInputManager().getTouchY(t),0,g)[0]},n.getTouchY=(e,t,r,a)=>{const g=o.staticArray(o.evtTools.input.getTouchY);return e.getLayer(r).convertCoords(e.getGame().getInputManager().getTouchX(t),e.getGame().getInputManager().getTouchY(t),0,g)[1]},n.hasAnyTouchStarted=e=>{const t=e.getGame().getInputManager().getStartedTouchIdentifiers();return t.length>1||t.length>0&&t[0]!==o.InputManager.MOUSE_TOUCH_ID},n.getStartedTouchCount=e=>{const t=e.getGame().getInputManager().getStartedTouchIdentifiers();return t.length+(t.includes(o.InputManager.MOUSE_TOUCH_ID)?-1:0)},n.getStartedTouchIdentifier=(e,t)=>{const r=e.getGame().getInputManager().getStartedTouchIdentifiers(),a=r.indexOf(o.InputManager.MOUSE_TOUCH_ID);return a<0?r[t]:r[t<a?t:t+1]},n.hasAnyTouchOrMouseStarted=e=>e.getGame().getInputManager().getStartedTouchIdentifiers().length>0,n.getStartedTouchOrMouseCount=e=>e.getGame().getInputManager().getStartedTouchIdentifiers().length,n.getStartedTouchOrMouseIdentifier=(e,t)=>e.getGame().getInputManager().getStartedTouchIdentifiers()[t],n.hasTouchEnded=(e,t)=>e.getGame().getInputManager().hasTouchEnded(t),n.getLastTouchId=function(){return o.evtTools.input.lastTouchId||0},n.getLastEndedTouchId=function(){return o.evtTools.input.lastEndedTouchId||0},n.popStartedTouch=function(e){const t=e.getGame().getInputManager().popStartedTouch();return t!==void 0?(o.evtTools.input.lastTouchId=t,!0):!1},n.popEndedTouch=function(e){const t=e.getGame().getInputManager().popEndedTouch();return t!==void 0?(o.evtTools.input.lastEndedTouchId=t,!0):!1},n.touchSimulateMouse=function(e,t){e.getGame().getInputManager().touchSimulateMouse(t)}})(d=c.input||(c.input={}))})(i=o.evtTools||(o.evtTools={}))})(gdjs||(gdjs={}));
|
|
1
|
+
var gdjs;(function(o){let i;(function(c){let d;(function(n){n.lastTouchId=0,n.lastEndedTouchId=0,n.keysNameToCode={a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,Num0:48,Num1:49,Num2:50,Num3:51,Num4:52,Num5:53,Num6:54,Num7:55,Num8:56,Num9:57,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,LShift:1016,RShift:2016,LControl:1017,RControl:2017,LAlt:1018,RAlt:2018,LSystem:1091,RSystem:2091,SemiColon:186,Comma:188,Period:190,Quote:222,Slash:191,BackSlash:220,Equal:187,Dash:189,Menu:93,LBracket:219,RBracket:221,Tilde:192,Space:32,Back:8,Tab:9,Delete:46,Insert:45,Escape:27,PageUp:33,PageDown:34,End:35,Home:36,Return:13,NumpadPageUp:3033,NumpadPageDown:3034,NumpadEnd:3035,NumpadHome:3036,NumpadReturn:3013,Add:107,Subtract:109,Multiply:106,Divide:111,NumpadAdd:3107,NumpadSubtract:3109,NumpadMultiply:3106,NumpadDivide:3111,Left:37,Up:38,Right:39,Down:40,NumpadLeft:3037,NumpadUp:3038,NumpadRight:3039,NumpadDown:3040,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,Pause:19};const u={};for(const e in n.keysNameToCode)n.keysNameToCode.hasOwnProperty(e)&&(u[n.keysNameToCode[e]]=e);n.mouseButtonsNameToCode={Left:o.InputManager.MOUSE_LEFT_BUTTON,Right:o.InputManager.MOUSE_RIGHT_BUTTON,Middle:o.InputManager.MOUSE_MIDDLE_BUTTON,Back:o.InputManager.MOUSE_BACK_BUTTON,Forward:o.InputManager.MOUSE_FORWARD_BUTTON},n.isKeyPressed=function(e,t){return o.evtTools.input.keysNameToCode.hasOwnProperty(t)?e.getGame().getInputManager().isKeyPressed(o.evtTools.input.keysNameToCode[t]):!1},n.wasKeyReleased=function(e,t){return o.evtTools.input.keysNameToCode.hasOwnProperty(t)?e.getGame().getInputManager().wasKeyReleased(o.evtTools.input.keysNameToCode[t]):!1},n.lastPressedKey=function(e){const t=e.getGame().getInputManager().getLastPressedKey();return u.hasOwnProperty(t)?u[t]:""},n.anyKeyPressed=function(e){return e.getGame().getInputManager().anyKeyPressed()},n.anyKeyReleased=function(e){return e.getGame().getInputManager().anyKeyReleased()},n.isMouseButtonPressed=function(e,t){return o.evtTools.input.mouseButtonsNameToCode.hasOwnProperty(t)?e.getGame().getInputManager().isMouseButtonPressed(o.evtTools.input.mouseButtonsNameToCode[t]):!1},n.isMouseButtonReleased=function(e,t){return o.evtTools.input.mouseButtonsNameToCode.hasOwnProperty(t)?e.getGame().getInputManager().isMouseButtonReleased(o.evtTools.input.mouseButtonsNameToCode[t]):!1},n.hideCursor=function(e){e.getScene().getRenderer().hideCursor()},n.showCursor=function(e){e.getScene().getRenderer().showCursor()},n.getMouseWheelDelta=function(e){return e.getGame().getInputManager().getMouseWheelDelta()},n.isScrollingUp=function(e){return e.getGame().getInputManager().isScrollingUp()},n.isScrollingDown=function(e){return e.getGame().getInputManager().isScrollingDown()},n.getMouseX=function(e,t,r){return n.getCursorX(e,t,r)},n.getMouseY=function(e,t,r){return n.getCursorY(e,t,r)},n.getCursorX=function(e,t,r){const a=o.staticArray(o.evtTools.input.getCursorX);return e.getLayer(t).convertCoords(e.getGame().getInputManager().getCursorX(),e.getGame().getInputManager().getCursorY(),0,a)[0]},n.getCursorY=function(e,t,r){const a=o.staticArray(o.evtTools.input.getCursorY);return e.getLayer(t).convertCoords(e.getGame().getInputManager().getCursorX(),e.getGame().getInputManager().getCursorY(),0,a)[1]},n.getMouseOnlyCursorX=function(e,t,r){const a=o.staticArray(o.evtTools.input.getMouseOnlyCursorX);return e.getLayer(t).convertCoords(e.getGame().getInputManager().getMouseX(),e.getGame().getInputManager().getMouseY(),0,a)[0]},n.getMouseOnlyCursorY=function(e,t,r){const a=o.staticArray(o.evtTools.input.getMouseOnlyCursorY);return e.getLayer(t).convertCoords(e.getGame().getInputManager().getMouseX(),e.getGame().getInputManager().getMouseY(),0,a)[1]},n.isMouseInsideCanvas=function(e){return e.getGame().getInputManager().isMouseInsideCanvas()};const I=function(e,t){return e.cursorOnObject(t)};n.cursorOnObject=function(e,t,r,a){return o.evtTools.object.pickObjectsIf(I,e,a,t)},n.getTouchX=function(e,t,r,a){const g=o.staticArray(o.evtTools.input.getTouchX);return e.getLayer(r).convertCoords(e.getGame().getInputManager().getTouchX(t),e.getGame().getInputManager().getTouchY(t),0,g)[0]},n.getTouchY=(e,t,r,a)=>{const g=o.staticArray(o.evtTools.input.getTouchY);return e.getLayer(r).convertCoords(e.getGame().getInputManager().getTouchX(t),e.getGame().getInputManager().getTouchY(t),0,g)[1]},n.hasAnyTouchStarted=e=>{const t=e.getGame().getInputManager().getStartedTouchIdentifiers();return t.length>1||t.length>0&&t[0]!==o.InputManager.MOUSE_TOUCH_ID},n.getStartedTouchCount=e=>{const t=e.getGame().getInputManager().getStartedTouchIdentifiers();return t.length+(t.includes(o.InputManager.MOUSE_TOUCH_ID)?-1:0)},n.getStartedTouchIdentifier=(e,t)=>{const r=e.getGame().getInputManager().getStartedTouchIdentifiers(),a=r.indexOf(o.InputManager.MOUSE_TOUCH_ID);return a<0?r[t]:r[t<a?t:t+1]},n.hasAnyTouchOrMouseStarted=e=>e.getGame().getInputManager().getStartedTouchIdentifiers().length>0,n.getStartedTouchOrMouseCount=e=>e.getGame().getInputManager().getStartedTouchIdentifiers().length,n.getStartedTouchOrMouseIdentifier=(e,t)=>e.getGame().getInputManager().getStartedTouchIdentifiers()[t]||0,n.hasTouchEnded=(e,t)=>e.getGame().getInputManager().hasTouchEnded(t),n.getLastTouchId=function(){return o.evtTools.input.lastTouchId||0},n.getLastEndedTouchId=function(){return o.evtTools.input.lastEndedTouchId||0},n.popStartedTouch=function(e){const t=e.getGame().getInputManager().popStartedTouch();return t!==void 0?(o.evtTools.input.lastTouchId=t,!0):!1},n.popEndedTouch=function(e){const t=e.getGame().getInputManager().popEndedTouch();return t!==void 0?(o.evtTools.input.lastEndedTouchId=t,!0):!1},n.touchSimulateMouse=function(e,t){e.getGame().getInputManager().touchSimulateMouse(t)}})(d=c.input||(c.input={}))})(i=o.evtTools||(o.evtTools={}))})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=inputtools.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../GDevelop/GDJS/Runtime/events-tools/inputtools.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 input {\n /**\n * @deprecated\n */\n export let lastTouchId = 0;\n /**\n * @deprecated\n */\n export let lastEndedTouchId = 0;\n\n /**\n * Hashmap associated each name of a key to its location-aware keyCode.\n * @memberof gdjs.evtTools\n */\n export const keysNameToCode = {\n a: 65,\n b: 66,\n c: 67,\n d: 68,\n e: 69,\n f: 70,\n g: 71,\n h: 72,\n i: 73,\n j: 74,\n k: 75,\n l: 76,\n m: 77,\n n: 78,\n o: 79,\n p: 80,\n q: 81,\n r: 82,\n s: 83,\n t: 84,\n u: 85,\n v: 86,\n w: 87,\n x: 88,\n y: 89,\n z: 90,\n Num0: 48,\n Num1: 49,\n Num2: 50,\n Num3: 51,\n Num4: 52,\n Num5: 53,\n Num6: 54,\n Num7: 55,\n Num8: 56,\n Num9: 57,\n Numpad0: 96,\n Numpad1: 97,\n Numpad2: 98,\n Numpad3: 99,\n Numpad4: 100,\n Numpad5: 101,\n Numpad6: 102,\n Numpad7: 103,\n Numpad8: 104,\n Numpad9: 105,\n LShift: 1016,\n RShift: 2016,\n LControl: 1017,\n RControl: 2017,\n LAlt: 1018,\n RAlt: 2018,\n LSystem: 1091,\n RSystem: 2091,\n SemiColon: 186,\n Comma: 188,\n Period: 190,\n Quote: 222,\n Slash: 191,\n BackSlash: 220,\n Equal: 187,\n Dash: 189,\n Menu: 93,\n LBracket: 219,\n RBracket: 221,\n Tilde: 192,\n Space: 32,\n Back: 8,\n Tab: 9,\n Delete: 46,\n Insert: 45,\n Escape: 27,\n PageUp: 33,\n PageDown: 34,\n End: 35,\n Home: 36,\n Return: 13,\n NumpadPageUp: 3033,\n NumpadPageDown: 3034,\n NumpadEnd: 3035,\n NumpadHome: 3036,\n NumpadReturn: 3013,\n Add: 107,\n Subtract: 109,\n Multiply: 106,\n Divide: 111,\n NumpadAdd: 3107,\n NumpadSubtract: 3109,\n NumpadMultiply: 3106,\n NumpadDivide: 3111,\n Left: 37,\n Up: 38,\n Right: 39,\n Down: 40,\n NumpadLeft: 3037,\n NumpadUp: 3038,\n NumpadRight: 3039,\n NumpadDown: 3040,\n F1: 112,\n F2: 113,\n F3: 114,\n F4: 115,\n F5: 116,\n F6: 117,\n F7: 118,\n F8: 119,\n F9: 120,\n F10: 121,\n F11: 122,\n F12: 123,\n Pause: 19,\n };\n\n const keysCodeToName = {};\n for (const p in keysNameToCode) {\n if (keysNameToCode.hasOwnProperty(p)) {\n keysCodeToName[keysNameToCode[p]] = p;\n }\n }\n\n /**\n * A hashmap associates each name of a mouse button with its respective code.\n * @memberof gdjs.evtTools\n */\n export const mouseButtonsNameToCode = {\n Left: gdjs.InputManager.MOUSE_LEFT_BUTTON,\n Right: gdjs.InputManager.MOUSE_RIGHT_BUTTON,\n Middle: gdjs.InputManager.MOUSE_MIDDLE_BUTTON,\n Back: gdjs.InputManager.MOUSE_BACK_BUTTON,\n Forward: gdjs.InputManager.MOUSE_FORWARD_BUTTON,\n };\n\n /**\n * Return true if the specified key is pressed\n *\n */\n export const isKeyPressed = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n key: string\n ) {\n if (gdjs.evtTools.input.keysNameToCode.hasOwnProperty(key)) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .isKeyPressed(gdjs.evtTools.input.keysNameToCode[key]);\n }\n return false;\n };\n\n /**\n * Return true if the specified key was just released\n *\n */\n export const wasKeyReleased = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n key: string\n ) {\n if (gdjs.evtTools.input.keysNameToCode.hasOwnProperty(key)) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .wasKeyReleased(gdjs.evtTools.input.keysNameToCode[key]);\n }\n return false;\n };\n\n /**\n * Return the name of the last key pressed in the game\n */\n export const lastPressedKey = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n const keyCode = instanceContainer\n .getGame()\n .getInputManager()\n .getLastPressedKey();\n if (keysCodeToName.hasOwnProperty(keyCode)) {\n return keysCodeToName[keyCode];\n }\n return '';\n };\n\n export const anyKeyPressed = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer.getGame().getInputManager().anyKeyPressed();\n };\n\n export const anyKeyReleased = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer.getGame().getInputManager().anyKeyReleased();\n };\n\n export const isMouseButtonPressed = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n button: string\n ) {\n if (gdjs.evtTools.input.mouseButtonsNameToCode.hasOwnProperty(button)) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .isMouseButtonPressed(\n gdjs.evtTools.input.mouseButtonsNameToCode[button]\n );\n }\n return false;\n };\n\n export const isMouseButtonReleased = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n button: string\n ) {\n if (gdjs.evtTools.input.mouseButtonsNameToCode.hasOwnProperty(button)) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .isMouseButtonReleased(\n gdjs.evtTools.input.mouseButtonsNameToCode[button]\n );\n }\n return false;\n };\n\n export const hideCursor = function (\n instanceContainer: gdjs.RuntimeScene\n ) {\n instanceContainer.getScene().getRenderer().hideCursor();\n };\n\n export const showCursor = function (\n instanceContainer: gdjs.RuntimeScene\n ) {\n instanceContainer.getScene().getRenderer().showCursor();\n };\n\n export const getMouseWheelDelta = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .getMouseWheelDelta();\n };\n\n export const isScrollingUp = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer.getGame().getInputManager().isScrollingUp();\n };\n\n export const isScrollingDown = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer.getGame().getInputManager().isScrollingDown();\n };\n\n /**\n * @deprecated Use getCursorX instead.\n */\n export const getMouseX = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n return getCursorX(instanceContainer, layer, camera);\n };\n\n /**\n * @deprecated Use getCursorY instead.\n */\n export const getMouseY = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n return getCursorY(instanceContainer, layer, camera);\n };\n\n export const getCursorX = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getCursorX\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getCursorX(),\n instanceContainer.getGame().getInputManager().getCursorY(),\n 0,\n workingPoint\n )[0];\n };\n\n export const getCursorY = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getCursorY\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getCursorX(),\n instanceContainer.getGame().getInputManager().getCursorY(),\n 0,\n workingPoint\n )[1];\n };\n\n export const getMouseOnlyCursorX = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getMouseOnlyCursorX\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getMouseX(),\n instanceContainer.getGame().getInputManager().getMouseY(),\n 0,\n workingPoint\n )[0];\n };\n\n export const getMouseOnlyCursorY = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getMouseOnlyCursorY\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getMouseX(),\n instanceContainer.getGame().getInputManager().getMouseY(),\n 0,\n workingPoint\n )[1];\n };\n\n export const isMouseInsideCanvas = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .isMouseInsideCanvas();\n };\n\n const _cursorIsOnObject = function (\n obj: gdjs.RuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return obj.cursorOnObject(instanceContainer);\n };\n\n export const cursorOnObject = function (\n objectsLists: Hashtable<gdjs.RuntimeObject[]>,\n instanceContainer: gdjs.RuntimeInstanceContainer,\n accurate: boolean,\n inverted: boolean\n ) {\n return gdjs.evtTools.object.pickObjectsIf(\n _cursorIsOnObject,\n objectsLists,\n inverted,\n instanceContainer\n );\n };\n\n export const getTouchX = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n identifier: integer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getTouchX\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getTouchX(identifier),\n instanceContainer.getGame().getInputManager().getTouchY(identifier),\n 0,\n workingPoint\n )[0];\n };\n\n export const getTouchY = (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n identifier: integer,\n layer: string,\n camera: integer\n ) => {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getTouchY\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getTouchX(identifier),\n instanceContainer.getGame().getInputManager().getTouchY(identifier),\n 0,\n workingPoint\n )[1];\n };\n\n /**\n * @deprecated\n */\n export const hasAnyTouchStarted = (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): boolean => {\n const startedTouchIdentifiers = instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers();\n return (\n startedTouchIdentifiers.length > 1 ||\n (startedTouchIdentifiers.length > 0 &&\n startedTouchIdentifiers[0] !== gdjs.InputManager.MOUSE_TOUCH_ID)\n );\n };\n\n /**\n * @deprecated\n */\n export const getStartedTouchCount = (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): integer => {\n const startedTouchIdentifiers = instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers();\n return (\n startedTouchIdentifiers.length +\n (startedTouchIdentifiers.includes(gdjs.InputManager.MOUSE_TOUCH_ID)\n ? -1\n : 0)\n );\n };\n\n /**\n * @deprecated\n */\n export const getStartedTouchIdentifier = (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n index: integer\n ): integer => {\n const startedTouchIdentifiers = instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers();\n const mouseIndex = startedTouchIdentifiers.indexOf(\n gdjs.InputManager.MOUSE_TOUCH_ID\n );\n return mouseIndex < 0\n ? startedTouchIdentifiers[index]\n : startedTouchIdentifiers[index < mouseIndex ? index : index + 1];\n };\n\n export const hasAnyTouchOrMouseStarted = (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): boolean => {\n return (\n instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers().length > 0\n );\n };\n\n export const getStartedTouchOrMouseCount = (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): integer => {\n return instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers().length;\n };\n\n export const getStartedTouchOrMouseIdentifier = (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n index: integer\n ): integer => {\n return instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers()[index];\n };\n\n export const hasTouchEnded = (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n identifier: integer\n ): boolean => {\n return instanceContainer\n .getGame()\n .getInputManager()\n .hasTouchEnded(identifier);\n };\n\n /**\n * @deprecated\n */\n export const getLastTouchId = function () {\n return gdjs.evtTools.input.lastTouchId || 0;\n };\n\n /**\n * @deprecated\n */\n export const getLastEndedTouchId = function () {\n return gdjs.evtTools.input.lastEndedTouchId || 0;\n };\n\n /**\n * @deprecated\n */\n export const popStartedTouch = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n const startedTouchId = instanceContainer\n .getGame()\n .getInputManager()\n .popStartedTouch();\n if (startedTouchId !== undefined) {\n gdjs.evtTools.input.lastTouchId = startedTouchId;\n return true;\n }\n return false;\n };\n\n /**\n * @deprecated\n */\n export const popEndedTouch = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n const endedTouchId = instanceContainer\n .getGame()\n .getInputManager()\n .popEndedTouch();\n if (endedTouchId !== undefined) {\n gdjs.evtTools.input.lastEndedTouchId = endedTouchId;\n return true;\n }\n return false;\n };\n\n export const touchSimulateMouse = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n enable: boolean\n ) {\n instanceContainer\n .getGame()\n .getInputManager()\n .touchSimulateMouse(enable);\n };\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 input {\n /**\n * @deprecated\n */\n export let lastTouchId = 0;\n /**\n * @deprecated\n */\n export let lastEndedTouchId = 0;\n\n /**\n * Hashmap associated each name of a key to its location-aware keyCode.\n * @memberof gdjs.evtTools\n */\n export const keysNameToCode = {\n a: 65,\n b: 66,\n c: 67,\n d: 68,\n e: 69,\n f: 70,\n g: 71,\n h: 72,\n i: 73,\n j: 74,\n k: 75,\n l: 76,\n m: 77,\n n: 78,\n o: 79,\n p: 80,\n q: 81,\n r: 82,\n s: 83,\n t: 84,\n u: 85,\n v: 86,\n w: 87,\n x: 88,\n y: 89,\n z: 90,\n Num0: 48,\n Num1: 49,\n Num2: 50,\n Num3: 51,\n Num4: 52,\n Num5: 53,\n Num6: 54,\n Num7: 55,\n Num8: 56,\n Num9: 57,\n Numpad0: 96,\n Numpad1: 97,\n Numpad2: 98,\n Numpad3: 99,\n Numpad4: 100,\n Numpad5: 101,\n Numpad6: 102,\n Numpad7: 103,\n Numpad8: 104,\n Numpad9: 105,\n LShift: 1016,\n RShift: 2016,\n LControl: 1017,\n RControl: 2017,\n LAlt: 1018,\n RAlt: 2018,\n LSystem: 1091,\n RSystem: 2091,\n SemiColon: 186,\n Comma: 188,\n Period: 190,\n Quote: 222,\n Slash: 191,\n BackSlash: 220,\n Equal: 187,\n Dash: 189,\n Menu: 93,\n LBracket: 219,\n RBracket: 221,\n Tilde: 192,\n Space: 32,\n Back: 8,\n Tab: 9,\n Delete: 46,\n Insert: 45,\n Escape: 27,\n PageUp: 33,\n PageDown: 34,\n End: 35,\n Home: 36,\n Return: 13,\n NumpadPageUp: 3033,\n NumpadPageDown: 3034,\n NumpadEnd: 3035,\n NumpadHome: 3036,\n NumpadReturn: 3013,\n Add: 107,\n Subtract: 109,\n Multiply: 106,\n Divide: 111,\n NumpadAdd: 3107,\n NumpadSubtract: 3109,\n NumpadMultiply: 3106,\n NumpadDivide: 3111,\n Left: 37,\n Up: 38,\n Right: 39,\n Down: 40,\n NumpadLeft: 3037,\n NumpadUp: 3038,\n NumpadRight: 3039,\n NumpadDown: 3040,\n F1: 112,\n F2: 113,\n F3: 114,\n F4: 115,\n F5: 116,\n F6: 117,\n F7: 118,\n F8: 119,\n F9: 120,\n F10: 121,\n F11: 122,\n F12: 123,\n Pause: 19,\n };\n\n const keysCodeToName = {};\n for (const p in keysNameToCode) {\n if (keysNameToCode.hasOwnProperty(p)) {\n keysCodeToName[keysNameToCode[p]] = p;\n }\n }\n\n /**\n * A hashmap associates each name of a mouse button with its respective code.\n * @memberof gdjs.evtTools\n */\n export const mouseButtonsNameToCode = {\n Left: gdjs.InputManager.MOUSE_LEFT_BUTTON,\n Right: gdjs.InputManager.MOUSE_RIGHT_BUTTON,\n Middle: gdjs.InputManager.MOUSE_MIDDLE_BUTTON,\n Back: gdjs.InputManager.MOUSE_BACK_BUTTON,\n Forward: gdjs.InputManager.MOUSE_FORWARD_BUTTON,\n };\n\n /**\n * Return true if the specified key is pressed\n *\n */\n export const isKeyPressed = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n key: string\n ) {\n if (gdjs.evtTools.input.keysNameToCode.hasOwnProperty(key)) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .isKeyPressed(gdjs.evtTools.input.keysNameToCode[key]);\n }\n return false;\n };\n\n /**\n * Return true if the specified key was just released\n *\n */\n export const wasKeyReleased = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n key: string\n ) {\n if (gdjs.evtTools.input.keysNameToCode.hasOwnProperty(key)) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .wasKeyReleased(gdjs.evtTools.input.keysNameToCode[key]);\n }\n return false;\n };\n\n /**\n * Return the name of the last key pressed in the game\n */\n export const lastPressedKey = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n const keyCode = instanceContainer\n .getGame()\n .getInputManager()\n .getLastPressedKey();\n if (keysCodeToName.hasOwnProperty(keyCode)) {\n return keysCodeToName[keyCode];\n }\n return '';\n };\n\n export const anyKeyPressed = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer.getGame().getInputManager().anyKeyPressed();\n };\n\n export const anyKeyReleased = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer.getGame().getInputManager().anyKeyReleased();\n };\n\n export const isMouseButtonPressed = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n button: string\n ) {\n if (gdjs.evtTools.input.mouseButtonsNameToCode.hasOwnProperty(button)) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .isMouseButtonPressed(\n gdjs.evtTools.input.mouseButtonsNameToCode[button]\n );\n }\n return false;\n };\n\n export const isMouseButtonReleased = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n button: string\n ) {\n if (gdjs.evtTools.input.mouseButtonsNameToCode.hasOwnProperty(button)) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .isMouseButtonReleased(\n gdjs.evtTools.input.mouseButtonsNameToCode[button]\n );\n }\n return false;\n };\n\n export const hideCursor = function (\n instanceContainer: gdjs.RuntimeScene\n ) {\n instanceContainer.getScene().getRenderer().hideCursor();\n };\n\n export const showCursor = function (\n instanceContainer: gdjs.RuntimeScene\n ) {\n instanceContainer.getScene().getRenderer().showCursor();\n };\n\n export const getMouseWheelDelta = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .getMouseWheelDelta();\n };\n\n export const isScrollingUp = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer.getGame().getInputManager().isScrollingUp();\n };\n\n export const isScrollingDown = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer.getGame().getInputManager().isScrollingDown();\n };\n\n /**\n * @deprecated Use getCursorX instead.\n */\n export const getMouseX = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n return getCursorX(instanceContainer, layer, camera);\n };\n\n /**\n * @deprecated Use getCursorY instead.\n */\n export const getMouseY = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n return getCursorY(instanceContainer, layer, camera);\n };\n\n export const getCursorX = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getCursorX\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getCursorX(),\n instanceContainer.getGame().getInputManager().getCursorY(),\n 0,\n workingPoint\n )[0];\n };\n\n export const getCursorY = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getCursorY\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getCursorX(),\n instanceContainer.getGame().getInputManager().getCursorY(),\n 0,\n workingPoint\n )[1];\n };\n\n export const getMouseOnlyCursorX = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getMouseOnlyCursorX\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getMouseX(),\n instanceContainer.getGame().getInputManager().getMouseY(),\n 0,\n workingPoint\n )[0];\n };\n\n export const getMouseOnlyCursorY = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getMouseOnlyCursorY\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getMouseX(),\n instanceContainer.getGame().getInputManager().getMouseY(),\n 0,\n workingPoint\n )[1];\n };\n\n export const isMouseInsideCanvas = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return instanceContainer\n .getGame()\n .getInputManager()\n .isMouseInsideCanvas();\n };\n\n const _cursorIsOnObject = function (\n obj: gdjs.RuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n return obj.cursorOnObject(instanceContainer);\n };\n\n export const cursorOnObject = function (\n objectsLists: Hashtable<gdjs.RuntimeObject[]>,\n instanceContainer: gdjs.RuntimeInstanceContainer,\n accurate: boolean,\n inverted: boolean\n ) {\n return gdjs.evtTools.object.pickObjectsIf(\n _cursorIsOnObject,\n objectsLists,\n inverted,\n instanceContainer\n );\n };\n\n export const getTouchX = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n identifier: integer,\n layer: string,\n camera: integer\n ) {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getTouchX\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getTouchX(identifier),\n instanceContainer.getGame().getInputManager().getTouchY(identifier),\n 0,\n workingPoint\n )[0];\n };\n\n export const getTouchY = (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n identifier: integer,\n layer: string,\n camera: integer\n ) => {\n const workingPoint: FloatPoint = gdjs.staticArray(\n gdjs.evtTools.input.getTouchY\n ) as FloatPoint;\n return instanceContainer\n .getLayer(layer)\n .convertCoords(\n instanceContainer.getGame().getInputManager().getTouchX(identifier),\n instanceContainer.getGame().getInputManager().getTouchY(identifier),\n 0,\n workingPoint\n )[1];\n };\n\n /**\n * @deprecated\n */\n export const hasAnyTouchStarted = (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): boolean => {\n const startedTouchIdentifiers = instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers();\n return (\n startedTouchIdentifiers.length > 1 ||\n (startedTouchIdentifiers.length > 0 &&\n startedTouchIdentifiers[0] !== gdjs.InputManager.MOUSE_TOUCH_ID)\n );\n };\n\n /**\n * @deprecated\n */\n export const getStartedTouchCount = (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): integer => {\n const startedTouchIdentifiers = instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers();\n return (\n startedTouchIdentifiers.length +\n (startedTouchIdentifiers.includes(gdjs.InputManager.MOUSE_TOUCH_ID)\n ? -1\n : 0)\n );\n };\n\n /**\n * @deprecated\n */\n export const getStartedTouchIdentifier = (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n index: integer\n ): integer => {\n const startedTouchIdentifiers = instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers();\n const mouseIndex = startedTouchIdentifiers.indexOf(\n gdjs.InputManager.MOUSE_TOUCH_ID\n );\n return mouseIndex < 0\n ? startedTouchIdentifiers[index]\n : startedTouchIdentifiers[index < mouseIndex ? index : index + 1];\n };\n\n export const hasAnyTouchOrMouseStarted = (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): boolean => {\n return (\n instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers().length > 0\n );\n };\n\n export const getStartedTouchOrMouseCount = (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): integer => {\n return instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers().length;\n };\n\n export const getStartedTouchOrMouseIdentifier = (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n index: integer\n ): integer => {\n return (\n instanceContainer\n .getGame()\n .getInputManager()\n .getStartedTouchIdentifiers()[index] || 0\n );\n };\n\n export const hasTouchEnded = (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n identifier: integer\n ): boolean => {\n return instanceContainer\n .getGame()\n .getInputManager()\n .hasTouchEnded(identifier);\n };\n\n /**\n * @deprecated\n */\n export const getLastTouchId = function () {\n return gdjs.evtTools.input.lastTouchId || 0;\n };\n\n /**\n * @deprecated\n */\n export const getLastEndedTouchId = function () {\n return gdjs.evtTools.input.lastEndedTouchId || 0;\n };\n\n /**\n * @deprecated\n */\n export const popStartedTouch = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n const startedTouchId = instanceContainer\n .getGame()\n .getInputManager()\n .popStartedTouch();\n if (startedTouchId !== undefined) {\n gdjs.evtTools.input.lastTouchId = startedTouchId;\n return true;\n }\n return false;\n };\n\n /**\n * @deprecated\n */\n export const popEndedTouch = function (\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n const endedTouchId = instanceContainer\n .getGame()\n .getInputManager()\n .popEndedTouch();\n if (endedTouchId !== undefined) {\n gdjs.evtTools.input.lastEndedTouchId = endedTouchId;\n return true;\n }\n return false;\n };\n\n export const touchSimulateMouse = function (\n instanceContainer: gdjs.RuntimeInstanceContainer,\n enable: boolean\n ) {\n instanceContainer\n .getGame()\n .getInputManager()\n .touchSimulateMouse(enable);\n };\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(o){let y;(function(O){let w;(function(g){g.pickOnly=function(e,t){for(const s in e.items)if(e.items.hasOwnProperty(s)){const n=e.items[s];n.indexOf(t)===-1?n.length=0:(n.length=0,n.push(t))}},g.twoListsTest=function(e,t,s,n,i){let f=!1;const r=o.staticArray(o.evtTools.object.twoListsTest);t.values(r);const u=o.staticArray2(o.evtTools.object.twoListsTest);s.values(u);for(let a=0,j=r.length;a<j;++a){let c=r[a];for(let l=0,b=c.length;l<b;++l)c[l].pick=!1}for(let a=0,j=u.length;a<j;++a){let c=u[a];for(let l=0,b=c.length;l<b;++l)c[l].pick=!1}for(let a=0,j=r.length;a<j;++a){const c=r[a];for(let l=0,b=c.length;l<b;++l){let d=!1;for(let T=0,L=u.length;T<L;++T){const k=u[T];for(let p=0,R=k.length;p<R;++p)c[l].pick&&k[p].pick||c[l].id!==k[p].id&&e(c[l],k[p],i)&&(n||(f=!0,c[l].pick=!0,k[p].pick=!0),d=!0)}!d&&n&&(f=!0,c[l].pick=!0)}}for(let a=0,j=r.length;a<j;++a){let c=r[a],l=0;for(let b=0,d=c.length;b<d;++b){let T=c[b];c[b].pick&&(c[l]=T,l++)}c.length=l}if(!n)for(let a=0,j=u.length;a<j;++a){let c=u[a],l=0;for(let b=0,d=c.length;b<d;++b){let T=c[b];c[b].pick&&(c[l]=T,l++)}c.length=l}return f},g.pickObjectsIf=function(e,t,s,n){let i=!1;const f=o.staticArray(o.evtTools.object.pickObjectsIf);t.values(f);for(let r=0,u=f.length;r<u;++r){const a=f[r];for(let j=0,c=a.length;j<c;++j){const l=a[j];s^e(l,n)?(i=!0,l.pick=!0):l.pick=!1}}for(let r=0,u=f.length;r<u;++r)o.evtTools.object.filterPickedObjectsList(f[r]);return i},g.filterPickedObjectsList=function(e){let t=0;for(let s=0,n=e.length;s<n;++s){const i=e[s];i.pick&&(e[t]=i,t++)}e.length=t},g.hitBoxesCollisionTest=function(e,t,s,n,i){return o.evtTools.object.twoListsTest(o.RuntimeObject.collisionTest,e,t,s,i)},g._distanceBetweenObjects=function(e,t,s){return e.getSqDistanceToObject(t)<=s},g.distanceTest=function(e,t,s,n){return o.evtTools.object.twoListsTest(o.evtTools.object._distanceBetweenObjects,e,t,n,s*s)},g._movesToward=function(e,t,s){if(e.hasNoForces())return!1;let n=Math.atan2(t.getDrawableY()+t.getCenterY()-(e.getDrawableY()+e.getCenterY()),t.getDrawableX()+t.getCenterX()-(e.getDrawableX()+e.getCenterX()));return n*=180/3.14159,Math.abs(o.evtTools.common.angleDifference(e.getAverageForce().getAngle(),n))<=s/2},g.movesTowardTest=function(e,t,s,n){return o.evtTools.object.twoListsTest(o.evtTools.object._movesToward,e,t,n,s)},g._turnedToward=function(e,t,s){let n=Math.atan2(t.getDrawableY()+t.getCenterY()-(e.getDrawableY()+e.getCenterY()),t.getDrawableX()+t.getCenterX()-(e.getDrawableX()+e.getCenterX()));return n*=180/3.14159,Math.abs(o.evtTools.common.angleDifference(e.getAngle(),n))<=s/2},g.turnedTowardTest=function(e,t,s,n){return o.evtTools.object.twoListsTest(o.evtTools.object._turnedToward,e,t,n,s)},g._isTurnedTowardObject=function(e,t,s){return Math.abs(o.evtTools.common.angleDifference(e.getAngle(),e.getAngleToObject(t)))<=s},g.isTurnedTowardObject=function(e,t,s,n){return o.evtTools.object.twoListsTest(o.evtTools.object._isTurnedTowardObject,e,t,n,s)},g.pickAllObjects=function(e,t){for(const s in t.items)if(t.items.hasOwnProperty(s)){const n=e.getObjects(s),i=t.items[s];i.length=0,i.push.apply(i,n)}return!0},g.pickRandomObject=function(e,t){let s=0;for(let r in t.items)t.items.hasOwnProperty(r)&&(s+=t.items[r].length);if(s===0)return!1;let n=Math.floor(Math.random()*s);n>=s&&(n=s-1);let i=0,f=null;for(let r in t.items)if(t.items.hasOwnProperty(r)){let u=t.items[r];if(n-i<u.length){f=u[n-i];break}i+=u.length}return o.evtTools.object.pickOnly(t,f),!0},g.pickNearestObject=function(e,t,s,n){let i=null,f=0,r=!0;const u=o.staticArray(o.evtTools.object.pickNearestObject);e.values(u);for(let a=0,j=u.length;a<j;++a){const c=u[a];for(let l=0;l<c.length;++l){const b=c[l],d=b.getSqDistanceToPosition(t,s);(r||d<f^n)&&(f=d,i=b),r=!1}}return i?(o.evtTools.object.pickOnly(e,i),!0):!1},g.raycastObject=function(e,t,s,n,i,f,r,u){return o.evtTools.object.raycastObjectToPosition(e,t,s,t+i*Math.cos(n*Math.PI/180),s+i*Math.sin(n*Math.PI/180),f,r,u)},g.raycastObjectToPosition=function(e,t,s,n,i,f,r,u){let a=null,j=u?0:(n-t)*(n-t)+(i-s)*(i-s),c=0,l=0;const b=o.staticArray(o.evtTools.object.raycastObjectToPosition);e.values(b);for(let d=0;d<b.length;d++){const T=b[d];for(let L=0;L<T.length;L++){const k=T[L],p=k.raycastTest(t,s,n,i,!u);p.collision&&(!u&&p.closeSqDist<=j?(j=p.closeSqDist,a=k,c=p.closeX,l=p.closeY):u&&p.farSqDist>=j&&(j=p.farSqDist,a=k,c=p.farX,l=p.farY))}}return a?(o.evtTools.object.pickOnly(e,a),f.setNumber(c),r.setNumber(l),!0):!1},g.doCreateObjectOnScene=function(e,t,s,n,i,f){const r=e.createObject(t),u=e.getLayer(f);return r!==null&&(r.setPosition(n,i),r.setLayer(f),r.setZOrder(u.getDefaultZOrder()),s.containsKey(t)&&s.get(t).push(r)),r},g.createObjectOnScene=function(e,t,s,n,i){return o.evtTools.object.doCreateObjectOnScene(e,t.firstKey(),t,s,n,i)},g.createObjectFromGroupOnScene=function(e,t,s,n,i,f){o.evtTools.object.doCreateObjectOnScene(e,s,t,n,i,f)},g.getPickedInstancesCount=e=>{let t=0;const s=o.staticArray(o.evtTools.object.getPickedInstancesCount);e.values(s);for(let n=0,i=s.length;n<i;++n)t+=s[n].length;return t},g.getSceneInstancesCount=(e,t)=>{let s=0;const n=o.staticArray(o.evtTools.object.getSceneInstancesCount);t.keys(n);const i=new Set(n);for(const f of i)s+=e.getInstancesCountOnScene(f);return s},g.pickedObjectsCount=g.getPickedInstancesCount})(w=O.object||(O.object={}))})(y=o.evtTools||(o.evtTools={}));class C{constructor(){this.objectsLists=new Map;this.localVariablesContainers=[];this.callbacks=new Map;this.parent=null}static from(O){const h=new C;return h.parent=O,h}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,h){const m=this.getOrCreateList(O);if(m.includes(h))return;m.push(h);const v=()=>this.removeObject(O,h);this.callbacks.set(h,v),h.registerDestroyCallback(v)}removeObject(O,h){const m=this.getOrCreateList(O),v=m.indexOf(h);v!==-1&&(m.splice(v,1),h.unregisterDestroyCallback(this.callbacks.get(h)),this.callbacks.delete(h))}restoreLocalVariablesContainers(O){o.copyArray(this.localVariablesContainers,O)}backupLocalVariablesContainers(O){o.copyArray(O,this.localVariablesContainers)}}o.LongLivedObjectsList=C})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=objecttools.js.map
|