gdcore-tools 2.0.0-beta3 → 2.0.0-beta4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/dist/Runtime/AsyncTasksManager.js +2 -2
  2. package/dist/Runtime/AsyncTasksManager.js.map +2 -2
  3. package/dist/Runtime/Cordova/config.xml +23 -1
  4. package/dist/Runtime/Cordova/www/LICENSE.GDevelop.txt +2 -0
  5. package/dist/Runtime/Cordova/www/index.html +1 -1
  6. package/dist/Runtime/CustomRuntimeObject.js +1 -1
  7. package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
  8. package/dist/Runtime/CustomRuntimeObject2D.js +2 -0
  9. package/dist/Runtime/CustomRuntimeObject2D.js.map +7 -0
  10. package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js +1 -1
  11. package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js.map +2 -2
  12. package/dist/Runtime/Electron/LICENSE.GDevelop.txt +2 -0
  13. package/dist/Runtime/Electron/package.json +3 -0
  14. package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js +1 -1
  15. package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js.map +2 -2
  16. package/dist/Runtime/Extensions/3D/A_RuntimeObject3DRenderer.js +1 -1
  17. package/dist/Runtime/Extensions/3D/A_RuntimeObject3DRenderer.js.map +2 -2
  18. package/dist/Runtime/Extensions/3D/AmbientLight.js +1 -1
  19. package/dist/Runtime/Extensions/3D/AmbientLight.js.map +2 -2
  20. package/dist/Runtime/Extensions/3D/Base3DBehavior.js +1 -1
  21. package/dist/Runtime/Extensions/3D/Base3DBehavior.js.map +2 -2
  22. package/dist/Runtime/Extensions/3D/BloomEffect.js +1 -1
  23. package/dist/Runtime/Extensions/3D/BloomEffect.js.map +2 -2
  24. package/dist/Runtime/Extensions/3D/BrightnessAndContrastEffect.js +1 -1
  25. package/dist/Runtime/Extensions/3D/BrightnessAndContrastEffect.js.map +2 -2
  26. package/dist/Runtime/Extensions/3D/CMakeLists.txt +23 -0
  27. package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js +1 -1
  28. package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js.map +2 -2
  29. package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js +2 -0
  30. package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +7 -0
  31. package/dist/Runtime/Extensions/3D/CustomRuntimeObject3DRenderer.js +2 -0
  32. package/dist/Runtime/Extensions/3D/CustomRuntimeObject3DRenderer.js.map +7 -0
  33. package/dist/Runtime/Extensions/3D/DirectionalLight.js +1 -1
  34. package/dist/Runtime/Extensions/3D/DirectionalLight.js.map +2 -2
  35. package/dist/Runtime/Extensions/3D/ExponentialFog.js +1 -1
  36. package/dist/Runtime/Extensions/3D/ExponentialFog.js.map +2 -2
  37. package/dist/Runtime/Extensions/3D/ExposureEffect.js +1 -1
  38. package/dist/Runtime/Extensions/3D/ExposureEffect.js.map +2 -2
  39. package/dist/Runtime/Extensions/3D/HemisphereLight.js +1 -1
  40. package/dist/Runtime/Extensions/3D/HemisphereLight.js.map +2 -2
  41. package/dist/Runtime/Extensions/3D/HueAndSaturationEffect.js +1 -1
  42. package/dist/Runtime/Extensions/3D/HueAndSaturationEffect.js.map +2 -2
  43. package/dist/Runtime/Extensions/3D/JsExtension.js +56 -24
  44. package/dist/Runtime/Extensions/3D/LinearFog.js +1 -1
  45. package/dist/Runtime/Extensions/3D/LinearFog.js.map +2 -2
  46. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js +1 -1
  47. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js.map +2 -2
  48. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js +1 -1
  49. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js.map +2 -2
  50. package/dist/Runtime/Extensions/AdMob/JsExtension.js +11 -10
  51. package/dist/Runtime/Extensions/AdMob/admobtools.js +1 -1
  52. package/dist/Runtime/Extensions/AdMob/admobtools.js.map +2 -2
  53. package/dist/Runtime/Extensions/AnchorBehavior/CMakeLists.txt +23 -0
  54. package/dist/Runtime/Extensions/BBText/JsExtension.js +20 -11
  55. package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js +1 -1
  56. package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js.map +2 -2
  57. package/dist/Runtime/Extensions/BitmapText/JsExtension.js +2 -8
  58. package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js +1 -1
  59. package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js.map +2 -2
  60. package/dist/Runtime/Extensions/CMakeLists.txt +35 -0
  61. package/dist/Runtime/Extensions/CMakeUtils.txt +81 -0
  62. package/dist/Runtime/Extensions/DestroyOutsideBehavior/CMakeLists.txt +23 -0
  63. package/dist/Runtime/Extensions/DestroyOutsideBehavior/destroyoutsideruntimebehavior.js.map +2 -2
  64. package/dist/Runtime/Extensions/DialogueTree/bondage.js/version.txt +5 -0
  65. package/dist/Runtime/Extensions/DraggableBehavior/CMakeLists.txt +23 -0
  66. package/dist/Runtime/Extensions/Effects/adjustment-pixi-filter.js +1 -1
  67. package/dist/Runtime/Extensions/Effects/adjustment-pixi-filter.js.map +2 -2
  68. package/dist/Runtime/Extensions/Effects/advanced-bloom-pixi-filter.js +1 -1
  69. package/dist/Runtime/Extensions/Effects/advanced-bloom-pixi-filter.js.map +2 -2
  70. package/dist/Runtime/Extensions/Effects/ascii-pixi-filter.js +1 -1
  71. package/dist/Runtime/Extensions/Effects/ascii-pixi-filter.js.map +2 -2
  72. package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js +1 -1
  73. package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js.map +2 -2
  74. package/dist/Runtime/Extensions/Effects/black-and-white-pixi-filter.js +1 -1
  75. package/dist/Runtime/Extensions/Effects/black-and-white-pixi-filter.js.map +2 -2
  76. package/dist/Runtime/Extensions/Effects/blending-mode-pixi-filter.js +1 -1
  77. package/dist/Runtime/Extensions/Effects/blending-mode-pixi-filter.js.map +2 -2
  78. package/dist/Runtime/Extensions/Effects/blur-pixi-filter.js +1 -1
  79. package/dist/Runtime/Extensions/Effects/blur-pixi-filter.js.map +2 -2
  80. package/dist/Runtime/Extensions/Effects/brightness-pixi-filter.js +1 -1
  81. package/dist/Runtime/Extensions/Effects/brightness-pixi-filter.js.map +2 -2
  82. package/dist/Runtime/Extensions/Effects/bulge-pinch-pixi-filter.js +1 -1
  83. package/dist/Runtime/Extensions/Effects/bulge-pinch-pixi-filter.js.map +2 -2
  84. package/dist/Runtime/Extensions/Effects/color-map-pixi-filter.js +1 -1
  85. package/dist/Runtime/Extensions/Effects/color-map-pixi-filter.js.map +2 -2
  86. package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js +1 -1
  87. package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js.map +2 -2
  88. package/dist/Runtime/Extensions/Effects/crt-pixi-filter.js +1 -1
  89. package/dist/Runtime/Extensions/Effects/crt-pixi-filter.js.map +2 -2
  90. package/dist/Runtime/Extensions/Effects/displacement-pixi-filter.js +1 -1
  91. package/dist/Runtime/Extensions/Effects/displacement-pixi-filter.js.map +2 -2
  92. package/dist/Runtime/Extensions/Effects/dot-pixi-filter.js +1 -1
  93. package/dist/Runtime/Extensions/Effects/dot-pixi-filter.js.map +2 -2
  94. package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js +1 -1
  95. package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js.map +2 -2
  96. package/dist/Runtime/Extensions/Effects/glitch-pixi-filter.js +1 -1
  97. package/dist/Runtime/Extensions/Effects/glitch-pixi-filter.js.map +2 -2
  98. package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js +1 -1
  99. package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js.map +2 -2
  100. package/dist/Runtime/Extensions/Effects/godray-pixi-filter.js +1 -1
  101. package/dist/Runtime/Extensions/Effects/godray-pixi-filter.js.map +2 -2
  102. package/dist/Runtime/Extensions/Effects/hsl-adjustment-pixi-filter.js +1 -1
  103. package/dist/Runtime/Extensions/Effects/hsl-adjustment-pixi-filter.js.map +2 -2
  104. package/dist/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js +1 -1
  105. package/dist/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js.map +2 -2
  106. package/dist/Runtime/Extensions/Effects/light-night-pixi-filter.js +2 -2
  107. package/dist/Runtime/Extensions/Effects/light-night-pixi-filter.js.map +2 -2
  108. package/dist/Runtime/Extensions/Effects/motion-blur-pixi-filter.js +1 -1
  109. package/dist/Runtime/Extensions/Effects/motion-blur-pixi-filter.js.map +2 -2
  110. package/dist/Runtime/Extensions/Effects/night-pixi-filter.js +2 -2
  111. package/dist/Runtime/Extensions/Effects/night-pixi-filter.js.map +2 -2
  112. package/dist/Runtime/Extensions/Effects/noise-pixi-filter.js +1 -1
  113. package/dist/Runtime/Extensions/Effects/noise-pixi-filter.js.map +2 -2
  114. package/dist/Runtime/Extensions/Effects/old-film-pixi-filter.js +1 -1
  115. package/dist/Runtime/Extensions/Effects/old-film-pixi-filter.js.map +2 -2
  116. package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js +1 -1
  117. package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js.map +2 -2
  118. package/dist/Runtime/Extensions/Effects/pixelate-pixi-filter.js +1 -1
  119. package/dist/Runtime/Extensions/Effects/pixelate-pixi-filter.js.map +2 -2
  120. package/dist/Runtime/Extensions/Effects/radial-blur-pixi-filter.js +1 -1
  121. package/dist/Runtime/Extensions/Effects/radial-blur-pixi-filter.js.map +2 -2
  122. package/dist/Runtime/Extensions/Effects/reflection-pixi-filter.js +1 -1
  123. package/dist/Runtime/Extensions/Effects/reflection-pixi-filter.js.map +2 -2
  124. package/dist/Runtime/Extensions/Effects/rgb-split-pixi-filter.js +1 -1
  125. package/dist/Runtime/Extensions/Effects/rgb-split-pixi-filter.js.map +2 -2
  126. package/dist/Runtime/Extensions/Effects/sepia-pixi-filter.js +1 -1
  127. package/dist/Runtime/Extensions/Effects/sepia-pixi-filter.js.map +2 -2
  128. package/dist/Runtime/Extensions/Effects/shockwave-pixi-filter.js +1 -1
  129. package/dist/Runtime/Extensions/Effects/shockwave-pixi-filter.js.map +2 -2
  130. package/dist/Runtime/Extensions/Effects/tilt-shift-pixi-filter.js +1 -1
  131. package/dist/Runtime/Extensions/Effects/tilt-shift-pixi-filter.js.map +2 -2
  132. package/dist/Runtime/Extensions/Effects/twist-pixi-filter.js +1 -1
  133. package/dist/Runtime/Extensions/Effects/twist-pixi-filter.js.map +2 -2
  134. package/dist/Runtime/Extensions/Effects/zoom-blur-pixi-filter.js +1 -1
  135. package/dist/Runtime/Extensions/Effects/zoom-blur-pixi-filter.js.map +2 -2
  136. package/dist/Runtime/Extensions/ExampleJsExtension/JsExtension.js +2 -11
  137. package/dist/Runtime/Extensions/ExampleJsExtension/dummyeffect.js +1 -1
  138. package/dist/Runtime/Extensions/ExampleJsExtension/dummyeffect.js.map +2 -2
  139. package/dist/Runtime/Extensions/FileSystem/JsExtension.js +22 -0
  140. package/dist/Runtime/Extensions/FileSystem/filesystemtools.js +1 -1
  141. package/dist/Runtime/Extensions/FileSystem/filesystemtools.js.map +2 -2
  142. package/dist/Runtime/Extensions/Firebase/A_firebasejs/NOTICE.txt +6 -0
  143. package/dist/Runtime/Extensions/Inventory/CMakeLists.txt +23 -0
  144. package/dist/Runtime/Extensions/JsExtensionTypes.d.ts +13 -4
  145. package/dist/Runtime/Extensions/Leaderboards/JsExtension.js +42 -1
  146. package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js +1 -1
  147. package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js.map +2 -2
  148. package/dist/Runtime/Extensions/Lighting/JsExtension.js +2 -11
  149. package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js +1 -1
  150. package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js.map +2 -2
  151. package/dist/Runtime/Extensions/LinkedObjects/CMakeLists.txt +23 -0
  152. package/dist/Runtime/Extensions/LinkedObjects/linkedobjects.js +1 -1
  153. package/dist/Runtime/Extensions/LinkedObjects/linkedobjects.js.map +2 -2
  154. package/dist/Runtime/Extensions/Multiplayer/JsExtension.js +1130 -0
  155. package/dist/Runtime/Extensions/Multiplayer/messageManager.js +2 -0
  156. package/dist/Runtime/Extensions/Multiplayer/messageManager.js.map +7 -0
  157. package/dist/Runtime/Extensions/Multiplayer/multiplayerVariablesManager.js +2 -0
  158. package/dist/Runtime/Extensions/Multiplayer/multiplayerVariablesManager.js.map +7 -0
  159. package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js +2 -0
  160. package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js.map +7 -0
  161. package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js +2 -0
  162. package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +7 -0
  163. package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js +2 -0
  164. package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js.map +7 -0
  165. package/dist/Runtime/Extensions/Multiplayer/peer.js +10 -0
  166. package/dist/Runtime/Extensions/Multiplayer/peer.js.map +1 -0
  167. package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js +2 -0
  168. package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js.map +7 -0
  169. package/dist/Runtime/Extensions/Multiplayer/peerjs.d.ts +509 -0
  170. package/dist/Runtime/Extensions/P2P/A_peer.js +8 -2
  171. package/dist/Runtime/Extensions/P2P/A_peer.js.map +1 -1
  172. package/dist/Runtime/Extensions/P2P/B_p2ptools.js +1 -1
  173. package/dist/Runtime/Extensions/P2P/B_p2ptools.js.map +2 -2
  174. package/dist/Runtime/Extensions/P2P/JsExtension.js +27 -0
  175. package/dist/Runtime/Extensions/PanelSpriteObject/CMakeLists.txt +23 -0
  176. package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js +1 -1
  177. package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
  178. package/dist/Runtime/Extensions/ParticleSystem/CMakeLists.txt +23 -0
  179. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js +1 -1
  180. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js.map +2 -2
  181. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js +1 -1
  182. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js.map +2 -2
  183. package/dist/Runtime/Extensions/PathfindingBehavior/CMakeLists.txt +23 -0
  184. package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js +1 -1
  185. package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js.map +2 -2
  186. package/dist/Runtime/Extensions/Physics2Behavior/JsExtension.js +47 -4
  187. package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js +1 -1
  188. package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js.map +2 -2
  189. package/dist/Runtime/Extensions/PhysicsBehavior/CMakeLists.txt +23 -0
  190. package/dist/Runtime/Extensions/PlatformBehavior/CMakeLists.txt +23 -0
  191. package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js +1 -1
  192. package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js.map +2 -2
  193. package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js +1 -1
  194. package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js.map +2 -2
  195. package/dist/Runtime/Extensions/PlayerAuthentication/JsExtension.js +6 -3
  196. package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationcomponents.js +4 -4
  197. package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationcomponents.js.map +2 -2
  198. package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js +1 -1
  199. package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js.map +2 -2
  200. package/dist/Runtime/Extensions/PrimitiveDrawing/CMakeLists.txt +23 -0
  201. package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js +1 -1
  202. package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js.map +2 -2
  203. package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js +1 -1
  204. package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
  205. package/dist/Runtime/Extensions/Shopify/CMakeLists.txt +26 -0
  206. package/dist/Runtime/Extensions/Spine/CMakeLists.txt +20 -0
  207. package/dist/Runtime/Extensions/Spine/JsExtension.js +11 -2
  208. package/dist/Runtime/Extensions/Spine/managers/pixi-spine-atlas-manager.js +1 -1
  209. package/dist/Runtime/Extensions/Spine/managers/pixi-spine-atlas-manager.js.map +2 -2
  210. package/dist/Runtime/Extensions/Spine/managers/pixi-spine-manager.js +1 -1
  211. package/dist/Runtime/Extensions/Spine/managers/pixi-spine-manager.js.map +2 -2
  212. package/dist/Runtime/Extensions/Spine/pixi-spine/Spine-Runtimes-License-Agreement.txt +11 -0
  213. package/dist/Runtime/Extensions/Spine/pixi-spine/pixi-spine.js +5 -3
  214. package/dist/Runtime/Extensions/Spine/spineruntimeobject.js +1 -1
  215. package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
  216. package/dist/Runtime/Extensions/SystemInfo/CMakeLists.txt +23 -0
  217. package/dist/Runtime/Extensions/TextEntryObject/CMakeLists.txt +23 -0
  218. package/dist/Runtime/Extensions/TextInput/JsExtension.js +3 -10
  219. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js +1 -1
  220. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js.map +2 -2
  221. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js +1 -1
  222. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js.map +2 -2
  223. package/dist/Runtime/Extensions/TextObject/CMakeLists.txt +23 -0
  224. package/dist/Runtime/Extensions/TextObject/textruntimeobject.js +1 -1
  225. package/dist/Runtime/Extensions/TextObject/textruntimeobject.js.map +2 -2
  226. package/dist/Runtime/Extensions/TileMap/JsExtension.js +834 -23
  227. package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js +1 -1
  228. package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js.map +2 -2
  229. package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js +1 -1
  230. package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js.map +2 -2
  231. package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.d.ts +2 -0
  232. package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js +1 -1
  233. package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js.map +1 -1
  234. package/dist/Runtime/Extensions/TileMap/helper/dts/model/CommonTypes.d.ts +12 -0
  235. package/dist/Runtime/Extensions/TileMap/helper/dts/model/CommonTypes.d.ts.map +1 -1
  236. package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts +119 -5
  237. package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map +1 -1
  238. package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapManager.d.ts +25 -0
  239. package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapManager.d.ts.map +1 -1
  240. package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts +16 -1
  241. package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts.map +1 -1
  242. package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js +2 -0
  243. package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +7 -0
  244. package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js +1 -1
  245. package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js.map +2 -2
  246. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js +1 -1
  247. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js.map +2 -2
  248. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js +1 -1
  249. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
  250. package/dist/Runtime/Extensions/TiledSpriteObject/CMakeLists.txt +23 -0
  251. package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js +1 -1
  252. package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
  253. package/dist/Runtime/Extensions/TopDownMovementBehavior/CMakeLists.txt +23 -0
  254. package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js +1 -1
  255. package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js.map +2 -2
  256. package/dist/Runtime/Extensions/TweenBehavior/JsExtension.js +2 -2
  257. package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js +1 -1
  258. package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js.map +2 -2
  259. package/dist/Runtime/Extensions/Video/JsExtension.js +2 -11
  260. package/dist/Runtime/Extensions/Video/videoruntimeobject.js +1 -1
  261. package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
  262. package/dist/Runtime/RuntimeInstanceContainer.js +1 -1
  263. package/dist/Runtime/RuntimeInstanceContainer.js.map +2 -2
  264. package/dist/Runtime/SpriteAnimator.js +2 -0
  265. package/dist/Runtime/SpriteAnimator.js.map +7 -0
  266. package/dist/Runtime/debugger-client/hot-reloader.js +1 -1
  267. package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
  268. package/dist/Runtime/events-tools/objecttools.js +1 -1
  269. package/dist/Runtime/events-tools/objecttools.js.map +2 -2
  270. package/dist/Runtime/events-tools/runtimescenetools.js +1 -1
  271. package/dist/Runtime/events-tools/runtimescenetools.js.map +2 -2
  272. package/dist/Runtime/force.js +1 -1
  273. package/dist/Runtime/force.js.map +2 -2
  274. package/dist/Runtime/object-capabilities/TextContainerBehavior.js.map +1 -1
  275. package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js +2 -0
  276. package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js.map +7 -0
  277. package/dist/Runtime/pixi-renderers/DebuggerPixiRenderer.js +1 -1
  278. package/dist/Runtime/pixi-renderers/DebuggerPixiRenderer.js.map +2 -2
  279. package/dist/Runtime/pixi-renderers/layer-pixi-renderer.js +2 -2
  280. package/dist/Runtime/pixi-renderers/layer-pixi-renderer.js.map +2 -2
  281. package/dist/Runtime/pixi-renderers/pixi-filters-tools.js +1 -1
  282. package/dist/Runtime/pixi-renderers/pixi-filters-tools.js.map +2 -2
  283. package/dist/Runtime/pixi-renderers/pixi-image-manager.js.map +2 -2
  284. package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js +1 -1
  285. package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js.map +2 -2
  286. package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js +1 -1
  287. package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js.map +2 -2
  288. package/dist/Runtime/polygon.js +1 -1
  289. package/dist/Runtime/polygon.js.map +2 -2
  290. package/dist/Runtime/runtimebehavior.js +1 -1
  291. package/dist/Runtime/runtimebehavior.js.map +2 -2
  292. package/dist/Runtime/runtimegame.js +1 -1
  293. package/dist/Runtime/runtimegame.js.map +2 -2
  294. package/dist/Runtime/runtimeobject.js +1 -1
  295. package/dist/Runtime/runtimeobject.js.map +2 -2
  296. package/dist/Runtime/runtimescene.js +1 -1
  297. package/dist/Runtime/runtimescene.js.map +2 -2
  298. package/dist/Runtime/scenestack.js +1 -1
  299. package/dist/Runtime/scenestack.js.map +2 -2
  300. package/dist/Runtime/spriteruntimeobject.js +1 -1
  301. package/dist/Runtime/spriteruntimeobject.js.map +2 -2
  302. package/dist/Runtime/timer.js +1 -1
  303. package/dist/Runtime/timer.js.map +2 -2
  304. package/dist/Runtime/types/project-data.d.ts +115 -0
  305. package/dist/Runtime/variable.js +1 -1
  306. package/dist/Runtime/variable.js.map +2 -2
  307. package/dist/Runtime/variablescontainer.js +1 -1
  308. package/dist/Runtime/variablescontainer.js.map +2 -2
  309. package/dist/lib/libGD.cjs +2 -1
  310. package/dist/lib/libGD.d.cts +5 -0
  311. package/dist/lib/libGD.wasm +0 -0
  312. package/dist/loaders.cjs +2 -1
  313. package/dist/loaders.d.cts +2 -0
  314. package/gd.d.ts +217 -223
  315. package/package.json +8 -6
  316. package/src/index.js +2 -0
  317. package/types/index.d.ts +2 -2
  318. package/types/open_project.d.ts +4 -4
  319. package/dist/Runtime/Extensions/Spine/pixi-spine/pixi-spine.js.map +0 -7
  320. package/dist/Runtime/pixi-renderers/CustomObjectPixiRenderer.js +0 -2
  321. package/dist/Runtime/pixi-renderers/CustomObjectPixiRenderer.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../GDevelop/Extensions/ParticleSystem/particleemitterobject.ts"],
4
- "sourcesContent": ["/*\n * GDevelop - Particle System Extension\n * Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)\n * This project is released under the MIT License.\n */\n\nnamespace gdjs {\n export type ParticleEmitterObjectDataType = {\n /**\n * @deprecated Data not used\n */\n emitterAngleA: number;\n emitterForceMin: number;\n /**\n * Cone spray angle (degrees)\n */\n emitterAngleB: number;\n zoneRadius: number;\n emitterForceMax: number;\n particleLifeTimeMax: number;\n particleLifeTimeMin: number;\n particleGravityY: number;\n particleGravityX: number;\n particleRed2: number;\n particleRed1: number;\n particleGreen2: number;\n particleGreen1: number;\n particleBlue2: number;\n particleBlue1: number;\n particleSize2: number;\n particleSize1: number;\n /**\n * Particle max rotation speed (degrees/second)\n */\n particleAngle2: number;\n /**\n * Particle min rotation speed (degrees/second)\n */\n particleAngle1: number;\n particleAlpha1: number;\n rendererType: string;\n particleAlpha2: number;\n rendererParam2: number;\n rendererParam1: number;\n particleSizeRandomness1: number;\n particleSizeRandomness2: number;\n maxParticleNb: number;\n additive: boolean;\n /** Resource name for image in particle */\n textureParticleName: string;\n tank: number;\n flow: number;\n /** Destroy the object when there is no particles? */\n destroyWhenNoParticles: boolean;\n jumpForwardInTimeOnCreation: number;\n };\n\n export type ParticleEmitterObjectData = ObjectData &\n ParticleEmitterObjectDataType;\n\n /**\n * Displays particles.\n */\n export class ParticleEmitterObject extends gdjs.RuntimeObject {\n /**\n * @deprecated Data not used\n */\n angleA: number;\n angleB: number;\n forceMin: number;\n forceMax: float;\n zoneRadius: number;\n lifeTimeMin: number;\n lifeTimeMax: float;\n gravityX: number;\n gravityY: number;\n colorR1: number;\n colorR2: number;\n colorG1: number;\n colorG2: number;\n colorB1: number;\n colorB2: number;\n size1: number;\n size2: number;\n alpha1: number;\n alpha2: number;\n rendererType: string;\n rendererParam1: number;\n rendererParam2: number;\n texture: string;\n flow: number;\n tank: number;\n destroyWhenNoParticles: boolean;\n particleRotationMinSpeed: number;\n particleRotationMaxSpeed: number;\n maxParticlesCount: number;\n additiveRendering: boolean;\n jumpForwardInTimeOnCreation: number;\n _jumpForwardInTimeCompleted: boolean = false;\n _posDirty: boolean = true;\n _angleDirty: boolean = true;\n _forceDirty: boolean = true;\n _zoneRadiusDirty: boolean = true;\n _lifeTimeDirty: boolean = true;\n _gravityDirty: boolean = true;\n _colorDirty: boolean = true;\n _sizeDirty: boolean = true;\n _alphaDirty: boolean = true;\n _flowDirty: boolean = true;\n _tankDirty: boolean = true;\n _particleRotationSpeedDirty: boolean = true;\n _maxParticlesCountDirty: boolean = true;\n _additiveRenderingDirty: boolean = true;\n // Don't mark texture as dirty if not using one.\n _textureDirty: boolean;\n\n // @ts-ignore\n _renderer: gdjs.ParticleEmitterObjectRenderer;\n\n /**\n * @param instanceContainer the container the object belongs to\n * @param particleObjectData The initial properties of the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n particleObjectData: ParticleEmitterObjectData\n ) {\n super(instanceContainer, particleObjectData);\n this._renderer = new gdjs.ParticleEmitterObjectRenderer(\n instanceContainer,\n this,\n particleObjectData\n );\n this.angleA = particleObjectData.emitterAngleA;\n this.angleB = particleObjectData.emitterAngleB;\n this.forceMin = particleObjectData.emitterForceMin;\n this.forceMax = particleObjectData.emitterForceMax;\n this.zoneRadius = particleObjectData.zoneRadius;\n this.lifeTimeMin = particleObjectData.particleLifeTimeMin;\n this.lifeTimeMax = particleObjectData.particleLifeTimeMax;\n this.gravityX = particleObjectData.particleGravityX;\n this.gravityY = particleObjectData.particleGravityY;\n this.colorR1 = particleObjectData.particleRed1;\n this.colorR2 = particleObjectData.particleRed2;\n this.colorG1 = particleObjectData.particleGreen1;\n this.colorG2 = particleObjectData.particleGreen2;\n this.colorB1 = particleObjectData.particleBlue1;\n this.colorB2 = particleObjectData.particleBlue2;\n this.size1 = particleObjectData.particleSize1;\n this.size2 = particleObjectData.particleSize2;\n this.alpha1 = particleObjectData.particleAlpha1;\n this.alpha2 = particleObjectData.particleAlpha2;\n this.rendererType = particleObjectData.rendererType;\n this.rendererParam1 = particleObjectData.rendererParam1;\n this.rendererParam2 = particleObjectData.rendererParam2;\n this.texture = particleObjectData.textureParticleName;\n this.flow = particleObjectData.flow;\n this.tank = particleObjectData.tank;\n this.destroyWhenNoParticles = particleObjectData.destroyWhenNoParticles;\n this.particleRotationMinSpeed = particleObjectData.particleAngle1;\n this.particleRotationMaxSpeed = particleObjectData.particleAngle2;\n this.maxParticlesCount = particleObjectData.maxParticleNb;\n this.additiveRendering = particleObjectData.additive;\n this.jumpForwardInTimeOnCreation =\n particleObjectData.jumpForwardInTimeOnCreation;\n this._textureDirty = this.texture !== '';\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n setX(x: number): void {\n if (this.x !== x) {\n this._posDirty = true;\n }\n super.setX(x);\n }\n\n setY(y: number): void {\n if (this.y !== y) {\n this._posDirty = true;\n }\n super.setY(y);\n }\n\n setAngle(angle): void {\n if (this.angle !== angle) {\n this._angleDirty = true;\n }\n super.setAngle(angle);\n }\n\n getRendererObject() {\n return this._renderer.getRendererObject();\n }\n\n updateFromObjectData(\n oldObjectData: ParticleEmitterObjectData,\n newObjectData: ParticleEmitterObjectData\n ): boolean {\n if (oldObjectData.emitterAngleA !== newObjectData.emitterAngleA) {\n this.setEmitterAngleA(newObjectData.emitterAngleA);\n }\n if (oldObjectData.emitterAngleB !== newObjectData.emitterAngleB) {\n this.setEmitterAngleB(newObjectData.emitterAngleB);\n }\n if (oldObjectData.emitterForceMin !== newObjectData.emitterForceMin) {\n this.setEmitterForceMin(newObjectData.emitterForceMin);\n }\n if (oldObjectData.particleAngle1 !== newObjectData.particleAngle1) {\n this.setParticleRotationMinSpeed(newObjectData.particleAngle1);\n }\n if (oldObjectData.particleAngle2 !== newObjectData.particleAngle2) {\n this.setParticleRotationMaxSpeed(newObjectData.particleAngle2);\n }\n if (oldObjectData.maxParticleNb !== newObjectData.maxParticleNb) {\n this.setMaxParticlesCount(newObjectData.maxParticleNb);\n }\n if (oldObjectData.additive !== newObjectData.additive) {\n this.setAdditiveRendering(newObjectData.additive);\n }\n if (oldObjectData.emitterForceMax !== newObjectData.emitterForceMax) {\n this.setEmitterForceMax(newObjectData.emitterForceMax);\n }\n if (oldObjectData.zoneRadius !== newObjectData.zoneRadius) {\n this.setZoneRadius(newObjectData.zoneRadius);\n }\n if (\n oldObjectData.particleLifeTimeMin !== newObjectData.particleLifeTimeMin\n ) {\n this.setParticleLifeTimeMin(newObjectData.particleLifeTimeMin);\n }\n if (\n oldObjectData.particleLifeTimeMax !== newObjectData.particleLifeTimeMax\n ) {\n this.setParticleLifeTimeMax(newObjectData.particleLifeTimeMax);\n }\n if (oldObjectData.particleGravityX !== newObjectData.particleGravityX) {\n this.setParticleGravityX(newObjectData.particleGravityX);\n }\n if (oldObjectData.particleGravityY !== newObjectData.particleGravityY) {\n this.setParticleGravityY(newObjectData.particleGravityY);\n }\n if (oldObjectData.particleRed1 !== newObjectData.particleRed1) {\n this.setParticleRed1(newObjectData.particleRed1);\n }\n if (oldObjectData.particleRed2 !== newObjectData.particleRed2) {\n this.setParticleRed2(newObjectData.particleRed2);\n }\n if (oldObjectData.particleGreen1 !== newObjectData.particleGreen1) {\n this.setParticleGreen1(newObjectData.particleGreen1);\n }\n if (oldObjectData.particleGreen2 !== newObjectData.particleGreen2) {\n this.setParticleGreen2(newObjectData.particleGreen2);\n }\n if (oldObjectData.particleBlue1 !== newObjectData.particleBlue1) {\n this.setParticleBlue1(newObjectData.particleBlue1);\n }\n if (oldObjectData.particleBlue2 !== newObjectData.particleBlue2) {\n this.setParticleBlue2(newObjectData.particleBlue2);\n }\n if (oldObjectData.particleSize1 !== newObjectData.particleSize1) {\n this.setParticleSize1(newObjectData.particleSize1);\n }\n if (oldObjectData.particleSize2 !== newObjectData.particleSize2) {\n this.setParticleSize2(newObjectData.particleSize2);\n }\n if (oldObjectData.particleAlpha1 !== newObjectData.particleAlpha1) {\n this.setParticleAlpha1(newObjectData.particleAlpha1);\n }\n if (oldObjectData.particleAlpha2 !== newObjectData.particleAlpha2) {\n this.setParticleAlpha2(newObjectData.particleAlpha2);\n }\n if (\n oldObjectData.textureParticleName !== newObjectData.textureParticleName\n ) {\n this.setTexture(\n newObjectData.textureParticleName,\n this.getRuntimeScene()\n );\n }\n if (oldObjectData.flow !== newObjectData.flow) {\n this.setFlow(newObjectData.flow);\n }\n if (oldObjectData.tank !== newObjectData.tank) {\n this.setTank(newObjectData.tank);\n }\n if (\n oldObjectData.destroyWhenNoParticles !==\n newObjectData.destroyWhenNoParticles\n ) {\n this.destroyWhenNoParticles = newObjectData.destroyWhenNoParticles;\n }\n if (\n oldObjectData.particleSizeRandomness1 !==\n newObjectData.particleSizeRandomness1 ||\n oldObjectData.particleSizeRandomness2 !==\n newObjectData.particleSizeRandomness2 ||\n oldObjectData.particleAngle1 !== newObjectData.particleAngle1 ||\n oldObjectData.particleAngle2 !== newObjectData.particleAngle2 ||\n oldObjectData.maxParticleNb !== newObjectData.maxParticleNb ||\n oldObjectData.additive !== newObjectData.additive ||\n oldObjectData.rendererType !== newObjectData.rendererType ||\n oldObjectData.rendererParam1 !== newObjectData.rendererParam1 ||\n oldObjectData.rendererParam2 !== newObjectData.rendererParam2\n ) {\n // Destroy the renderer, ensure it's removed from the layer.\n const layer = this.getInstanceContainer().getLayer(this.layer);\n layer\n .getRenderer()\n .removeRendererObject(this._renderer.getRendererObject());\n this._renderer.destroy();\n\n // and recreate the renderer, which will add itself to the layer.\n this._renderer = new gdjs.ParticleEmitterObjectRenderer(\n this.getInstanceContainer(),\n this,\n newObjectData\n );\n\n // Consider every state dirty as the renderer was just re-created, so it needs\n // to be repositioned, angle updated, etc...\n this._posDirty = this._angleDirty = this._forceDirty = this._zoneRadiusDirty = true;\n this._lifeTimeDirty = this._gravityDirty = this._colorDirty = this._sizeDirty = true;\n this._alphaDirty = this._flowDirty = this._tankDirty = this._textureDirty = true;\n }\n return true;\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n if (this._posDirty) {\n this._renderer.setPosition(this.getX(), this.getY());\n }\n if (this._particleRotationSpeedDirty) {\n this._renderer.setParticleRotationSpeed(\n this.particleRotationMinSpeed,\n this.particleRotationMaxSpeed\n );\n }\n if (this._maxParticlesCountDirty) {\n this._renderer.setMaxParticlesCount(this.maxParticlesCount);\n }\n if (this._additiveRenderingDirty) {\n this._renderer.setAdditiveRendering(this.additiveRendering);\n }\n if (this._angleDirty) {\n const angle = this.getAngle();\n this._renderer.setAngle(\n angle - this.angleB / 2.0,\n angle + this.angleB / 2.0\n );\n }\n if (this._forceDirty) {\n this._renderer.setForce(this.forceMin, this.forceMax);\n }\n if (this._zoneRadiusDirty) {\n this._renderer.setZoneRadius(this.zoneRadius);\n }\n if (this._lifeTimeDirty) {\n this._renderer.setLifeTime(this.lifeTimeMin, this.lifeTimeMax);\n }\n if (this._gravityDirty) {\n this._renderer.setGravity(this.gravityX, this.gravityY);\n }\n if (this._colorDirty) {\n this._renderer.setColor(\n this.colorR1,\n this.colorG1,\n this.colorB1,\n this.colorR2,\n this.colorG2,\n this.colorB2\n );\n }\n if (this._sizeDirty) {\n this._renderer.setSize(this.size1, this.size2);\n }\n if (this._alphaDirty) {\n this._renderer.setAlpha(this.alpha1, this.alpha2);\n }\n if (this._flowDirty || this._tankDirty) {\n this._renderer.resetEmission(this.flow, this.tank);\n }\n if (this._textureDirty) {\n this._renderer.setTextureName(this.texture, instanceContainer);\n }\n this._posDirty = this._angleDirty = this._forceDirty = this._zoneRadiusDirty = false;\n this._lifeTimeDirty = this._gravityDirty = this._colorDirty = this._sizeDirty = false;\n this._alphaDirty = this._flowDirty = this._textureDirty = this._tankDirty = false;\n this._additiveRenderingDirty = this._maxParticlesCountDirty = this._particleRotationSpeedDirty = false;\n this._renderer.update(this.getElapsedTime() / 1000.0);\n if (\n this._renderer.hasStarted() &&\n this.getParticleCount() === 0 &&\n this.destroyWhenNoParticles\n ) {\n this.deleteFromScene(instanceContainer);\n }\n if (\n this.jumpForwardInTimeOnCreation > 0 &&\n this._jumpForwardInTimeCompleted === false\n ) {\n this._renderer.update(this.jumpForwardInTimeOnCreation);\n this._jumpForwardInTimeCompleted = true;\n }\n }\n\n onDestroyed(): void {\n this._renderer.destroy();\n super.onDestroyed();\n }\n\n getEmitterForceMin(): number {\n return this.forceMin;\n }\n\n setEmitterForceMin(force: float): void {\n if (force < 0) {\n force = 0;\n }\n if (this.forceMin !== force) {\n this._forceDirty = true;\n this.forceMin = force;\n }\n }\n\n getEmitterForceMax(): number {\n return this.forceMax;\n }\n\n setEmitterForceMax(force: float): void {\n if (force < 0) {\n force = 0;\n }\n if (this.forceMax !== force) {\n this._forceDirty = true;\n this.forceMax = force;\n }\n }\n\n setParticleRotationMinSpeed(speed: number): void {\n if (this.particleRotationMinSpeed !== speed) {\n this._particleRotationSpeedDirty = true;\n this.particleRotationMinSpeed = speed;\n }\n }\n\n getParticleRotationMinSpeed(): number {\n return this.particleRotationMinSpeed;\n }\n\n setParticleRotationMaxSpeed(speed: number): void {\n if (this.particleRotationMaxSpeed !== speed) {\n this._particleRotationSpeedDirty = true;\n this.particleRotationMaxSpeed = speed;\n }\n }\n\n getParticleRotationMaxSpeed(): number {\n return this.particleRotationMaxSpeed;\n }\n\n setMaxParticlesCount(count: number): void {\n if (this.maxParticlesCount !== count) {\n this._maxParticlesCountDirty = true;\n this.maxParticlesCount = count;\n }\n }\n\n getMaxParticlesCount(): number {\n return this.maxParticlesCount;\n }\n\n setAdditiveRendering(enabled: boolean) {\n if (this.additiveRendering !== enabled) {\n this._additiveRenderingDirty = true;\n this.additiveRendering = enabled;\n }\n }\n\n getAdditiveRendering(): boolean {\n return this.additiveRendering;\n }\n\n /**\n * @deprecated Prefer using getAngle\n */\n getEmitterAngle(): float {\n return (this.angleA + this.angleB) / 2.0;\n }\n\n /**\n * @deprecated Prefer using setAngle\n */\n setEmitterAngle(angle: float): void {\n const oldAngle = this.getEmitterAngle();\n if (angle !== oldAngle) {\n this._angleDirty = true;\n this.angleA += angle - oldAngle;\n this.angleB += angle - oldAngle;\n }\n }\n\n /**\n * @deprecated This function returns data that is not used.\n */\n getEmitterAngleA(): float {\n return this.angleA;\n }\n\n /**\n * @deprecated This function sets data that is not used.\n */\n setEmitterAngleA(angle: float): void {\n if (this.angleA !== angle) {\n this._angleDirty = true;\n this.angleA = angle;\n }\n }\n\n getEmitterAngleB(): float {\n return this.angleB;\n }\n\n setEmitterAngleB(angle: float): void {\n if (this.angleB !== angle) {\n this._angleDirty = true;\n this.angleB = angle;\n }\n }\n\n getConeSprayAngle(): float {\n return this.getEmitterAngleB();\n }\n\n setConeSprayAngle(angle: float): void {\n this.setEmitterAngleB(angle);\n }\n\n getZoneRadius(): float {\n return this.zoneRadius;\n }\n\n setZoneRadius(radius: float): void {\n if (radius < 0) {\n radius = 0;\n }\n if (this.zoneRadius !== radius && radius > 0) {\n this._zoneRadiusDirty = true;\n this.zoneRadius = radius;\n }\n }\n\n getParticleLifeTimeMin(): float {\n return this.lifeTimeMin;\n }\n\n setParticleLifeTimeMin(lifeTime: float): void {\n if (lifeTime < 0) {\n lifeTime = 0;\n }\n if (this.lifeTimeMin !== lifeTime) {\n this._lifeTimeDirty = true;\n this.lifeTimeMin = lifeTime;\n }\n }\n\n getParticleLifeTimeMax(): float {\n return this.lifeTimeMax;\n }\n\n setParticleLifeTimeMax(lifeTime: float): void {\n if (lifeTime < 0) {\n lifeTime = 0;\n }\n if (this.lifeTimeMax !== lifeTime) {\n this._lifeTimeDirty = true;\n this.lifeTimeMax = lifeTime;\n }\n }\n\n getParticleGravityX(): float {\n return this.gravityX;\n }\n\n setParticleGravityX(x: float): void {\n if (this.gravityX !== x) {\n this._gravityDirty = true;\n this.gravityX = x;\n }\n }\n\n getParticleGravityY(): float {\n return this.gravityY;\n }\n\n setParticleGravityY(y: float): void {\n if (this.gravityY !== y) {\n this._gravityDirty = true;\n this.gravityY = y;\n }\n }\n\n getParticleGravityAngle(): float {\n return (Math.atan2(this.gravityY, this.gravityX) * 180.0) / Math.PI;\n }\n\n setParticleGravityAngle(angle: float): void {\n const oldAngle = this.getParticleGravityAngle();\n if (oldAngle !== angle) {\n this._gravityDirty = true;\n const length = this.getParticleGravityLength();\n this.gravityX = length * Math.cos((angle * Math.PI) / 180.0);\n this.gravityY = length * Math.sin((angle * Math.PI) / 180.0);\n }\n }\n\n getParticleGravityLength(): float {\n return Math.sqrt(\n this.gravityX * this.gravityX + this.gravityY * this.gravityY\n );\n }\n\n setParticleGravityLength(length: float): void {\n if (length < 0) {\n length = 0;\n }\n const oldLength = this.getParticleGravityLength();\n if (oldLength !== length) {\n this._gravityDirty = true;\n this.gravityX *= length / oldLength;\n this.gravityY *= length / oldLength;\n }\n }\n\n getParticleRed1(): number {\n return this.colorR1;\n }\n\n setParticleRed1(red: number): void {\n if (red < 0) {\n red = 0;\n }\n if (red > 255) {\n red = 255;\n }\n if (this.colorR1 !== red) {\n this._colorDirty = true;\n this.colorR1 = red;\n }\n }\n\n getParticleRed2(): number {\n return this.colorR2;\n }\n\n setParticleRed2(red: number): void {\n if (red < 0) {\n red = 0;\n }\n if (red > 255) {\n red = 255;\n }\n if (this.colorR2 !== red) {\n this._colorDirty = true;\n this.colorR2 = red;\n }\n }\n\n getParticleGreen1(): number {\n return this.colorG1;\n }\n\n setParticleGreen1(green: number): void {\n if (green < 0) {\n green = 0;\n }\n if (green > 255) {\n green = 255;\n }\n if (this.colorG1 !== green) {\n this._colorDirty = true;\n this.colorG1 = green;\n }\n }\n\n getParticleGreen2(): number {\n return this.colorG2;\n }\n\n setParticleGreen2(green: number): void {\n if (green < 0) {\n green = 0;\n }\n if (green > 255) {\n green = 255;\n }\n if (this.colorG2 !== green) {\n this._colorDirty = true;\n this.colorG2 = green;\n }\n }\n\n getParticleBlue1(): number {\n return this.colorB1;\n }\n\n setParticleBlue1(blue: number): void {\n if (blue < 0) {\n blue = 0;\n }\n if (blue > 255) {\n blue = 255;\n }\n if (this.colorB1 !== blue) {\n this._colorDirty = true;\n this.colorB1 = blue;\n }\n }\n\n getParticleBlue2(): number {\n return this.colorB2;\n }\n\n setParticleBlue2(blue: number): void {\n if (blue < 0) {\n blue = 0;\n }\n if (blue > 255) {\n blue = 255;\n }\n if (this.colorB2 !== blue) {\n this._colorDirty = true;\n this.colorB2 = blue;\n }\n }\n\n setParticleColor1(rgbColor: string): void {\n const colors = rgbColor.split(';');\n if (colors.length < 3) {\n return;\n }\n this.setParticleRed1(parseInt(colors[0], 10));\n this.setParticleGreen1(parseInt(colors[1], 10));\n this.setParticleBlue1(parseInt(colors[2], 10));\n }\n\n setParticleColor2(rgbColor: string): void {\n const colors = rgbColor.split(';');\n if (colors.length < 3) {\n return;\n }\n this.setParticleRed2(parseInt(colors[0], 10));\n this.setParticleGreen2(parseInt(colors[1], 10));\n this.setParticleBlue2(parseInt(colors[2], 10));\n }\n\n getParticleSize1(): float {\n return this.size1;\n }\n\n setParticleSize1(size: float): void {\n if (size < 0) {\n size = 0;\n }\n if (this.size1 !== size) {\n this._sizeDirty = true;\n this.size1 = size;\n }\n }\n\n getParticleSize2(): float {\n return this.size2;\n }\n\n setParticleSize2(size: float): void {\n if (this.size2 !== size) {\n this._sizeDirty = true;\n this.size2 = size;\n }\n }\n\n getParticleAlpha1(): number {\n return this.alpha1;\n }\n\n setParticleAlpha1(alpha: number): void {\n if (this.alpha1 !== alpha) {\n this._alphaDirty = true;\n this.alpha1 = alpha;\n }\n }\n\n getParticleAlpha2(): number {\n return this.alpha2;\n }\n\n setParticleAlpha2(alpha: number): void {\n if (this.alpha2 !== alpha) {\n this._alphaDirty = true;\n this.alpha2 = alpha;\n }\n }\n\n startEmission(): void {\n this._renderer.start();\n }\n\n stopEmission(): void {\n this._renderer.stop();\n }\n\n isEmitting(): boolean {\n return this._renderer.emitter.emit;\n }\n\n noMoreParticles(): boolean {\n return !this.isEmitting();\n }\n\n recreateParticleSystem(): void {\n this._renderer.recreate();\n }\n\n getFlow(): number {\n return this.flow;\n }\n\n setFlow(flow: number): void {\n if (this.flow !== flow) {\n this.flow = flow;\n this._flowDirty = true;\n }\n }\n\n getParticleCount(): number {\n return this._renderer.getParticleCount();\n }\n\n getTank(): number {\n return this.tank;\n }\n\n setTank(tank: number): void {\n this.tank = tank;\n this._tankDirty = true;\n }\n\n getTexture(): string {\n return this.texture;\n }\n\n setTexture(\n texture: string,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n if (this.texture !== texture) {\n if (this._renderer.isTextureNameValid(texture, instanceContainer)) {\n this.texture = texture;\n this._textureDirty = true;\n }\n }\n }\n\n jumpEmitterForwardInTime(timeSkipped: number): void {\n this._renderer.update(timeSkipped);\n }\n }\n gdjs.registerObject(\n 'ParticleSystem::ParticleEmitter',\n gdjs.ParticleEmitterObject\n );\n}\n"],
5
- "mappings": "AAMA,GAAU,MAAV,UAAU,EAAV,CAyDS,eAAoC,GAAK,aAAc,CA4D5D,YACE,EACA,EACA,CACA,MAAM,EAAmB,GA7B3B,iCAAuC,GACvC,eAAqB,GACrB,iBAAuB,GACvB,iBAAuB,GACvB,sBAA4B,GAC5B,oBAA0B,GAC1B,mBAAyB,GACzB,iBAAuB,GACvB,gBAAsB,GACtB,iBAAuB,GACvB,gBAAsB,GACtB,gBAAsB,GACtB,iCAAuC,GACvC,6BAAmC,GACnC,6BAAmC,GAgBjC,KAAK,UAAY,GAAI,GAAK,8BACxB,EACA,KACA,GAEF,KAAK,OAAS,EAAmB,cACjC,KAAK,OAAS,EAAmB,cACjC,KAAK,SAAW,EAAmB,gBACnC,KAAK,SAAW,EAAmB,gBACnC,KAAK,WAAa,EAAmB,WACrC,KAAK,YAAc,EAAmB,oBACtC,KAAK,YAAc,EAAmB,oBACtC,KAAK,SAAW,EAAmB,iBACnC,KAAK,SAAW,EAAmB,iBACnC,KAAK,QAAU,EAAmB,aAClC,KAAK,QAAU,EAAmB,aAClC,KAAK,QAAU,EAAmB,eAClC,KAAK,QAAU,EAAmB,eAClC,KAAK,QAAU,EAAmB,cAClC,KAAK,QAAU,EAAmB,cAClC,KAAK,MAAQ,EAAmB,cAChC,KAAK,MAAQ,EAAmB,cAChC,KAAK,OAAS,EAAmB,eACjC,KAAK,OAAS,EAAmB,eACjC,KAAK,aAAe,EAAmB,aACvC,KAAK,eAAiB,EAAmB,eACzC,KAAK,eAAiB,EAAmB,eACzC,KAAK,QAAU,EAAmB,oBAClC,KAAK,KAAO,EAAmB,KAC/B,KAAK,KAAO,EAAmB,KAC/B,KAAK,uBAAyB,EAAmB,uBACjD,KAAK,yBAA2B,EAAmB,eACnD,KAAK,yBAA2B,EAAmB,eACnD,KAAK,kBAAoB,EAAmB,cAC5C,KAAK,kBAAoB,EAAmB,SAC5C,KAAK,4BACH,EAAmB,4BACrB,KAAK,cAAgB,KAAK,UAAY,GAGtC,KAAK,YAGP,KAAK,EAAiB,CACpB,AAAI,KAAK,IAAM,GACb,MAAK,UAAY,IAEnB,MAAM,KAAK,GAGb,KAAK,EAAiB,CACpB,AAAI,KAAK,IAAM,GACb,MAAK,UAAY,IAEnB,MAAM,KAAK,GAGb,SAAS,EAAa,CACpB,AAAI,KAAK,QAAU,GACjB,MAAK,YAAc,IAErB,MAAM,SAAS,GAGjB,mBAAoB,CAClB,MAAO,MAAK,UAAU,oBAGxB,qBACE,EACA,EACS,CACT,MAAI,GAAc,gBAAkB,EAAc,eAChD,KAAK,iBAAiB,EAAc,eAElC,EAAc,gBAAkB,EAAc,eAChD,KAAK,iBAAiB,EAAc,eAElC,EAAc,kBAAoB,EAAc,iBAClD,KAAK,mBAAmB,EAAc,iBAEpC,EAAc,iBAAmB,EAAc,gBACjD,KAAK,4BAA4B,EAAc,gBAE7C,EAAc,iBAAmB,EAAc,gBACjD,KAAK,4BAA4B,EAAc,gBAE7C,EAAc,gBAAkB,EAAc,eAChD,KAAK,qBAAqB,EAAc,eAEtC,EAAc,WAAa,EAAc,UAC3C,KAAK,qBAAqB,EAAc,UAEtC,EAAc,kBAAoB,EAAc,iBAClD,KAAK,mBAAmB,EAAc,iBAEpC,EAAc,aAAe,EAAc,YAC7C,KAAK,cAAc,EAAc,YAGjC,EAAc,sBAAwB,EAAc,qBAEpD,KAAK,uBAAuB,EAAc,qBAG1C,EAAc,sBAAwB,EAAc,qBAEpD,KAAK,uBAAuB,EAAc,qBAExC,EAAc,mBAAqB,EAAc,kBACnD,KAAK,oBAAoB,EAAc,kBAErC,EAAc,mBAAqB,EAAc,kBACnD,KAAK,oBAAoB,EAAc,kBAErC,EAAc,eAAiB,EAAc,cAC/C,KAAK,gBAAgB,EAAc,cAEjC,EAAc,eAAiB,EAAc,cAC/C,KAAK,gBAAgB,EAAc,cAEjC,EAAc,iBAAmB,EAAc,gBACjD,KAAK,kBAAkB,EAAc,gBAEnC,EAAc,iBAAmB,EAAc,gBACjD,KAAK,kBAAkB,EAAc,gBAEnC,EAAc,gBAAkB,EAAc,eAChD,KAAK,iBAAiB,EAAc,eAElC,EAAc,gBAAkB,EAAc,eAChD,KAAK,iBAAiB,EAAc,eAElC,EAAc,gBAAkB,EAAc,eAChD,KAAK,iBAAiB,EAAc,eAElC,EAAc,gBAAkB,EAAc,eAChD,KAAK,iBAAiB,EAAc,eAElC,EAAc,iBAAmB,EAAc,gBACjD,KAAK,kBAAkB,EAAc,gBAEnC,EAAc,iBAAmB,EAAc,gBACjD,KAAK,kBAAkB,EAAc,gBAGrC,EAAc,sBAAwB,EAAc,qBAEpD,KAAK,WACH,EAAc,oBACd,KAAK,mBAGL,EAAc,OAAS,EAAc,MACvC,KAAK,QAAQ,EAAc,MAEzB,EAAc,OAAS,EAAc,MACvC,KAAK,QAAQ,EAAc,MAG3B,EAAc,yBACd,EAAc,wBAEd,MAAK,uBAAyB,EAAc,wBAG5C,GAAc,0BACZ,EAAc,yBAChB,EAAc,0BACZ,EAAc,yBAChB,EAAc,iBAAmB,EAAc,gBAC/C,EAAc,iBAAmB,EAAc,gBAC/C,EAAc,gBAAkB,EAAc,eAC9C,EAAc,WAAa,EAAc,UACzC,EAAc,eAAiB,EAAc,cAC7C,EAAc,iBAAmB,EAAc,gBAC/C,EAAc,iBAAmB,EAAc,iBAI/C,CADc,KAAK,uBAAuB,SAAS,KAAK,OAErD,cACA,qBAAqB,KAAK,UAAU,qBACvC,KAAK,UAAU,UAGf,KAAK,UAAY,GAAI,GAAK,8BACxB,KAAK,uBACL,KACA,GAKF,KAAK,UAAY,KAAK,YAAc,KAAK,YAAc,KAAK,iBAAmB,GAC/E,KAAK,eAAiB,KAAK,cAAgB,KAAK,YAAc,KAAK,WAAa,GAChF,KAAK,YAAc,KAAK,WAAa,KAAK,WAAa,KAAK,cAAgB,IAEvE,GAGT,OAAO,EAAwD,CAgB7D,GAfI,KAAK,WACP,KAAK,UAAU,YAAY,KAAK,OAAQ,KAAK,QAE3C,KAAK,6BACP,KAAK,UAAU,yBACb,KAAK,yBACL,KAAK,0BAGL,KAAK,yBACP,KAAK,UAAU,qBAAqB,KAAK,mBAEvC,KAAK,yBACP,KAAK,UAAU,qBAAqB,KAAK,mBAEvC,KAAK,YAAa,CACpB,KAAM,GAAQ,KAAK,WACnB,KAAK,UAAU,SACb,EAAQ,KAAK,OAAS,EACtB,EAAQ,KAAK,OAAS,GAG1B,AAAI,KAAK,aACP,KAAK,UAAU,SAAS,KAAK,SAAU,KAAK,UAE1C,KAAK,kBACP,KAAK,UAAU,cAAc,KAAK,YAEhC,KAAK,gBACP,KAAK,UAAU,YAAY,KAAK,YAAa,KAAK,aAEhD,KAAK,eACP,KAAK,UAAU,WAAW,KAAK,SAAU,KAAK,UAE5C,KAAK,aACP,KAAK,UAAU,SACb,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,QACL,KAAK,SAGL,KAAK,YACP,KAAK,UAAU,QAAQ,KAAK,MAAO,KAAK,OAEtC,KAAK,aACP,KAAK,UAAU,SAAS,KAAK,OAAQ,KAAK,QAExC,MAAK,YAAc,KAAK,aAC1B,KAAK,UAAU,cAAc,KAAK,KAAM,KAAK,MAE3C,KAAK,eACP,KAAK,UAAU,eAAe,KAAK,QAAS,GAE9C,KAAK,UAAY,KAAK,YAAc,KAAK,YAAc,KAAK,iBAAmB,GAC/E,KAAK,eAAiB,KAAK,cAAgB,KAAK,YAAc,KAAK,WAAa,GAChF,KAAK,YAAc,KAAK,WAAa,KAAK,cAAgB,KAAK,WAAa,GAC5E,KAAK,wBAA0B,KAAK,wBAA0B,KAAK,4BAA8B,GACjG,KAAK,UAAU,OAAO,KAAK,iBAAmB,KAE5C,KAAK,UAAU,cACf,KAAK,qBAAuB,GAC5B,KAAK,wBAEL,KAAK,gBAAgB,GAGrB,KAAK,4BAA8B,GACnC,KAAK,8BAAgC,IAErC,MAAK,UAAU,OAAO,KAAK,6BAC3B,KAAK,4BAA8B,IAIvC,aAAoB,CAClB,KAAK,UAAU,UACf,MAAM,cAGR,oBAA6B,CAC3B,MAAO,MAAK,SAGd,mBAAmB,EAAoB,CACrC,AAAI,EAAQ,GACV,GAAQ,GAEN,KAAK,WAAa,GACpB,MAAK,YAAc,GACnB,KAAK,SAAW,GAIpB,oBAA6B,CAC3B,MAAO,MAAK,SAGd,mBAAmB,EAAoB,CACrC,AAAI,EAAQ,GACV,GAAQ,GAEN,KAAK,WAAa,GACpB,MAAK,YAAc,GACnB,KAAK,SAAW,GAIpB,4BAA4B,EAAqB,CAC/C,AAAI,KAAK,2BAA6B,GACpC,MAAK,4BAA8B,GACnC,KAAK,yBAA2B,GAIpC,6BAAsC,CACpC,MAAO,MAAK,yBAGd,4BAA4B,EAAqB,CAC/C,AAAI,KAAK,2BAA6B,GACpC,MAAK,4BAA8B,GACnC,KAAK,yBAA2B,GAIpC,6BAAsC,CACpC,MAAO,MAAK,yBAGd,qBAAqB,EAAqB,CACxC,AAAI,KAAK,oBAAsB,GAC7B,MAAK,wBAA0B,GAC/B,KAAK,kBAAoB,GAI7B,sBAA+B,CAC7B,MAAO,MAAK,kBAGd,qBAAqB,EAAkB,CACrC,AAAI,KAAK,oBAAsB,GAC7B,MAAK,wBAA0B,GAC/B,KAAK,kBAAoB,GAI7B,sBAAgC,CAC9B,MAAO,MAAK,kBAMd,iBAAyB,CACvB,MAAQ,MAAK,OAAS,KAAK,QAAU,EAMvC,gBAAgB,EAAoB,CAClC,KAAM,GAAW,KAAK,kBACtB,AAAI,IAAU,GACZ,MAAK,YAAc,GACnB,KAAK,QAAU,EAAQ,EACvB,KAAK,QAAU,EAAQ,GAO3B,kBAA0B,CACxB,MAAO,MAAK,OAMd,iBAAiB,EAAoB,CACnC,AAAI,KAAK,SAAW,GAClB,MAAK,YAAc,GACnB,KAAK,OAAS,GAIlB,kBAA0B,CACxB,MAAO,MAAK,OAGd,iBAAiB,EAAoB,CACnC,AAAI,KAAK,SAAW,GAClB,MAAK,YAAc,GACnB,KAAK,OAAS,GAIlB,mBAA2B,CACzB,MAAO,MAAK,mBAGd,kBAAkB,EAAoB,CACpC,KAAK,iBAAiB,GAGxB,eAAuB,CACrB,MAAO,MAAK,WAGd,cAAc,EAAqB,CACjC,AAAI,EAAS,GACX,GAAS,GAEP,KAAK,aAAe,GAAU,EAAS,GACzC,MAAK,iBAAmB,GACxB,KAAK,WAAa,GAItB,wBAAgC,CAC9B,MAAO,MAAK,YAGd,uBAAuB,EAAuB,CAC5C,AAAI,EAAW,GACb,GAAW,GAET,KAAK,cAAgB,GACvB,MAAK,eAAiB,GACtB,KAAK,YAAc,GAIvB,wBAAgC,CAC9B,MAAO,MAAK,YAGd,uBAAuB,EAAuB,CAC5C,AAAI,EAAW,GACb,GAAW,GAET,KAAK,cAAgB,GACvB,MAAK,eAAiB,GACtB,KAAK,YAAc,GAIvB,qBAA6B,CAC3B,MAAO,MAAK,SAGd,oBAAoB,EAAgB,CAClC,AAAI,KAAK,WAAa,GACpB,MAAK,cAAgB,GACrB,KAAK,SAAW,GAIpB,qBAA6B,CAC3B,MAAO,MAAK,SAGd,oBAAoB,EAAgB,CAClC,AAAI,KAAK,WAAa,GACpB,MAAK,cAAgB,GACrB,KAAK,SAAW,GAIpB,yBAAiC,CAC/B,MAAQ,MAAK,MAAM,KAAK,SAAU,KAAK,UAAY,IAAS,KAAK,GAGnE,wBAAwB,EAAoB,CAE1C,GAAI,AADa,KAAK,4BACL,EAAO,CACtB,KAAK,cAAgB,GACrB,KAAM,GAAS,KAAK,2BACpB,KAAK,SAAW,EAAS,KAAK,IAAK,EAAQ,KAAK,GAAM,KACtD,KAAK,SAAW,EAAS,KAAK,IAAK,EAAQ,KAAK,GAAM,MAI1D,0BAAkC,CAChC,MAAO,MAAK,KACV,KAAK,SAAW,KAAK,SAAW,KAAK,SAAW,KAAK,UAIzD,yBAAyB,EAAqB,CAC5C,AAAI,EAAS,GACX,GAAS,GAEX,KAAM,GAAY,KAAK,2BACvB,AAAI,IAAc,GAChB,MAAK,cAAgB,GACrB,KAAK,UAAY,EAAS,EAC1B,KAAK,UAAY,EAAS,GAI9B,iBAA0B,CACxB,MAAO,MAAK,QAGd,gBAAgB,EAAmB,CACjC,AAAI,EAAM,GACR,GAAM,GAEJ,EAAM,KACR,GAAM,KAEJ,KAAK,UAAY,GACnB,MAAK,YAAc,GACnB,KAAK,QAAU,GAInB,iBAA0B,CACxB,MAAO,MAAK,QAGd,gBAAgB,EAAmB,CACjC,AAAI,EAAM,GACR,GAAM,GAEJ,EAAM,KACR,GAAM,KAEJ,KAAK,UAAY,GACnB,MAAK,YAAc,GACnB,KAAK,QAAU,GAInB,mBAA4B,CAC1B,MAAO,MAAK,QAGd,kBAAkB,EAAqB,CACrC,AAAI,EAAQ,GACV,GAAQ,GAEN,EAAQ,KACV,GAAQ,KAEN,KAAK,UAAY,GACnB,MAAK,YAAc,GACnB,KAAK,QAAU,GAInB,mBAA4B,CAC1B,MAAO,MAAK,QAGd,kBAAkB,EAAqB,CACrC,AAAI,EAAQ,GACV,GAAQ,GAEN,EAAQ,KACV,GAAQ,KAEN,KAAK,UAAY,GACnB,MAAK,YAAc,GACnB,KAAK,QAAU,GAInB,kBAA2B,CACzB,MAAO,MAAK,QAGd,iBAAiB,EAAoB,CACnC,AAAI,EAAO,GACT,GAAO,GAEL,EAAO,KACT,GAAO,KAEL,KAAK,UAAY,GACnB,MAAK,YAAc,GACnB,KAAK,QAAU,GAInB,kBAA2B,CACzB,MAAO,MAAK,QAGd,iBAAiB,EAAoB,CACnC,AAAI,EAAO,GACT,GAAO,GAEL,EAAO,KACT,GAAO,KAEL,KAAK,UAAY,GACnB,MAAK,YAAc,GACnB,KAAK,QAAU,GAInB,kBAAkB,EAAwB,CACxC,KAAM,GAAS,EAAS,MAAM,KAC9B,AAAI,EAAO,OAAS,GAGpB,MAAK,gBAAgB,SAAS,EAAO,GAAI,KACzC,KAAK,kBAAkB,SAAS,EAAO,GAAI,KAC3C,KAAK,iBAAiB,SAAS,EAAO,GAAI,MAG5C,kBAAkB,EAAwB,CACxC,KAAM,GAAS,EAAS,MAAM,KAC9B,AAAI,EAAO,OAAS,GAGpB,MAAK,gBAAgB,SAAS,EAAO,GAAI,KACzC,KAAK,kBAAkB,SAAS,EAAO,GAAI,KAC3C,KAAK,iBAAiB,SAAS,EAAO,GAAI,MAG5C,kBAA0B,CACxB,MAAO,MAAK,MAGd,iBAAiB,EAAmB,CAClC,AAAI,EAAO,GACT,GAAO,GAEL,KAAK,QAAU,GACjB,MAAK,WAAa,GAClB,KAAK,MAAQ,GAIjB,kBAA0B,CACxB,MAAO,MAAK,MAGd,iBAAiB,EAAmB,CAClC,AAAI,KAAK,QAAU,GACjB,MAAK,WAAa,GAClB,KAAK,MAAQ,GAIjB,mBAA4B,CAC1B,MAAO,MAAK,OAGd,kBAAkB,EAAqB,CACrC,AAAI,KAAK,SAAW,GAClB,MAAK,YAAc,GACnB,KAAK,OAAS,GAIlB,mBAA4B,CAC1B,MAAO,MAAK,OAGd,kBAAkB,EAAqB,CACrC,AAAI,KAAK,SAAW,GAClB,MAAK,YAAc,GACnB,KAAK,OAAS,GAIlB,eAAsB,CACpB,KAAK,UAAU,QAGjB,cAAqB,CACnB,KAAK,UAAU,OAGjB,YAAsB,CACpB,MAAO,MAAK,UAAU,QAAQ,KAGhC,iBAA2B,CACzB,MAAO,CAAC,KAAK,aAGf,wBAA+B,CAC7B,KAAK,UAAU,WAGjB,SAAkB,CAChB,MAAO,MAAK,KAGd,QAAQ,EAAoB,CAC1B,AAAI,KAAK,OAAS,GAChB,MAAK,KAAO,EACZ,KAAK,WAAa,IAItB,kBAA2B,CACzB,MAAO,MAAK,UAAU,mBAGxB,SAAkB,CAChB,MAAO,MAAK,KAGd,QAAQ,EAAoB,CAC1B,KAAK,KAAO,EACZ,KAAK,WAAa,GAGpB,YAAqB,CACnB,MAAO,MAAK,QAGd,WACE,EACA,EACM,CACN,AAAI,KAAK,UAAY,GACf,KAAK,UAAU,mBAAmB,EAAS,IAC7C,MAAK,QAAU,EACf,KAAK,cAAgB,IAK3B,yBAAyB,EAA2B,CAClD,KAAK,UAAU,OAAO,IAlyBnB,EAAM,wBAqyBb,EAAK,eACH,kCACA,EAAK,yBAh2BC",
4
+ "sourcesContent": ["/*\n * GDevelop - Particle System Extension\n * Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)\n * This project is released under the MIT License.\n */\n\nnamespace gdjs {\n export type ParticleEmitterObjectDataType = {\n /**\n * @deprecated Data not used\n */\n emitterAngleA: number;\n emitterForceMin: number;\n /**\n * Cone spray angle (degrees)\n */\n emitterAngleB: number;\n zoneRadius: number;\n emitterForceMax: number;\n particleLifeTimeMax: number;\n particleLifeTimeMin: number;\n particleGravityY: number;\n particleGravityX: number;\n particleRed2: number;\n particleRed1: number;\n particleGreen2: number;\n particleGreen1: number;\n particleBlue2: number;\n particleBlue1: number;\n particleSize2: number;\n particleSize1: number;\n /**\n * Particle max rotation speed (degrees/second)\n */\n particleAngle2: number;\n /**\n * Particle min rotation speed (degrees/second)\n */\n particleAngle1: number;\n particleAlpha1: number;\n rendererType: string;\n particleAlpha2: number;\n rendererParam2: number;\n rendererParam1: number;\n particleSizeRandomness1: number;\n particleSizeRandomness2: number;\n maxParticleNb: number;\n additive: boolean;\n /** Resource name for image in particle */\n textureParticleName: string;\n tank: number;\n flow: number;\n /** Destroy the object when there is no particles? */\n destroyWhenNoParticles: boolean;\n jumpForwardInTimeOnCreation: number;\n };\n\n export type ParticleEmitterObjectData = ObjectData &\n ParticleEmitterObjectDataType;\n\n export type ParticleEmitterObjectNetworkSyncDataType = {\n // Technically, all attributes can change at runtime, so we sync as many as possible.\n // TODO: ensure we only send props that change to optimize the sync.\n // dirty attributes are not synced, they are defined by the update method if the value has changed.\n // Particle Rotation Speed\n prms: number;\n prmx: number;\n // Max Particles Count\n mpc: number;\n // Additive Rendering\n addr: boolean;\n // Angle\n angb: number;\n // Force\n formin: number;\n formax: number;\n // Zone Radius\n zr: number;\n // Life Time\n ltmin: number;\n ltmax: number;\n // Gravity\n gravx: number;\n gravy: number;\n // Color\n colr1: number;\n colr2: number;\n colg1: number;\n colg2: number;\n colb1: number;\n colb2: number;\n // Size\n size1: number;\n size2: number;\n // Alpha\n alp1: number;\n alp2: number;\n // Flow\n flow: number;\n // Tank\n tank: number;\n // Texture\n text: string;\n // Pause\n paused: boolean;\n };\n\n export type ParticleEmitterObjectNetworkSyncData = ObjectNetworkSyncData &\n ParticleEmitterObjectNetworkSyncDataType;\n\n /**\n * Displays particles.\n */\n export class ParticleEmitterObject extends gdjs.RuntimeObject {\n /**\n * @deprecated Data not used\n */\n angleA: number;\n angleB: number;\n forceMin: number;\n forceMax: float;\n zoneRadius: number;\n lifeTimeMin: number;\n lifeTimeMax: float;\n gravityX: number;\n gravityY: number;\n colorR1: number;\n colorR2: number;\n colorG1: number;\n colorG2: number;\n colorB1: number;\n colorB2: number;\n size1: number;\n size2: number;\n alpha1: number;\n alpha2: number;\n rendererType: string;\n rendererParam1: number;\n rendererParam2: number;\n texture: string;\n flow: number;\n tank: number;\n destroyWhenNoParticles: boolean;\n particleRotationMinSpeed: number;\n particleRotationMaxSpeed: number;\n maxParticlesCount: number;\n additiveRendering: boolean;\n jumpForwardInTimeOnCreation: number;\n _jumpForwardInTimeCompleted: boolean = false;\n _posDirty: boolean = true;\n _angleDirty: boolean = true;\n _forceDirty: boolean = true;\n _zoneRadiusDirty: boolean = true;\n _lifeTimeDirty: boolean = true;\n _gravityDirty: boolean = true;\n _colorDirty: boolean = true;\n _sizeDirty: boolean = true;\n _alphaDirty: boolean = true;\n _flowDirty: boolean = true;\n _tankDirty: boolean = true;\n _particleRotationSpeedDirty: boolean = true;\n _maxParticlesCountDirty: boolean = true;\n _additiveRenderingDirty: boolean = true;\n // Don't mark texture as dirty if not using one.\n _textureDirty: boolean;\n /**\n * `true` only when the emission is paused by events.\n * It allows to tell the end of emission apart from it.\n */\n _isEmissionPaused: boolean = false;\n\n // @ts-ignore\n _renderer: gdjs.ParticleEmitterObjectRenderer;\n\n /**\n * @param instanceContainer the container the object belongs to\n * @param particleObjectData The initial properties of the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n particleObjectData: ParticleEmitterObjectData\n ) {\n super(instanceContainer, particleObjectData);\n this._renderer = new gdjs.ParticleEmitterObjectRenderer(\n instanceContainer,\n this,\n particleObjectData\n );\n this.angleA = particleObjectData.emitterAngleA;\n this.angleB = particleObjectData.emitterAngleB;\n this.forceMin = particleObjectData.emitterForceMin;\n this.forceMax = particleObjectData.emitterForceMax;\n this.zoneRadius = particleObjectData.zoneRadius;\n this.lifeTimeMin = particleObjectData.particleLifeTimeMin;\n this.lifeTimeMax = particleObjectData.particleLifeTimeMax;\n this.gravityX = particleObjectData.particleGravityX;\n this.gravityY = particleObjectData.particleGravityY;\n this.colorR1 = particleObjectData.particleRed1;\n this.colorR2 = particleObjectData.particleRed2;\n this.colorG1 = particleObjectData.particleGreen1;\n this.colorG2 = particleObjectData.particleGreen2;\n this.colorB1 = particleObjectData.particleBlue1;\n this.colorB2 = particleObjectData.particleBlue2;\n this.size1 = particleObjectData.particleSize1;\n this.size2 = particleObjectData.particleSize2;\n this.alpha1 = particleObjectData.particleAlpha1;\n this.alpha2 = particleObjectData.particleAlpha2;\n this.rendererType = particleObjectData.rendererType;\n this.rendererParam1 = particleObjectData.rendererParam1;\n this.rendererParam2 = particleObjectData.rendererParam2;\n this.texture = particleObjectData.textureParticleName;\n this.flow = particleObjectData.flow;\n this.tank = particleObjectData.tank;\n this.destroyWhenNoParticles = particleObjectData.destroyWhenNoParticles;\n this.particleRotationMinSpeed = particleObjectData.particleAngle1;\n this.particleRotationMaxSpeed = particleObjectData.particleAngle2;\n this.maxParticlesCount = particleObjectData.maxParticleNb;\n this.additiveRendering = particleObjectData.additive;\n this.jumpForwardInTimeOnCreation =\n particleObjectData.jumpForwardInTimeOnCreation;\n this._textureDirty = this.texture !== '';\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n setX(x: number): void {\n if (this.x !== x) {\n this._posDirty = true;\n }\n super.setX(x);\n }\n\n setY(y: number): void {\n if (this.y !== y) {\n this._posDirty = true;\n }\n super.setY(y);\n }\n\n setAngle(angle): void {\n if (this.angle !== angle) {\n this._angleDirty = true;\n }\n super.setAngle(angle);\n }\n\n getRendererObject() {\n return this._renderer.getRendererObject();\n }\n\n updateFromObjectData(\n oldObjectData: ParticleEmitterObjectData,\n newObjectData: ParticleEmitterObjectData\n ): boolean {\n if (oldObjectData.emitterAngleA !== newObjectData.emitterAngleA) {\n this.setEmitterAngleA(newObjectData.emitterAngleA);\n }\n if (oldObjectData.emitterAngleB !== newObjectData.emitterAngleB) {\n this.setEmitterAngleB(newObjectData.emitterAngleB);\n }\n if (oldObjectData.emitterForceMin !== newObjectData.emitterForceMin) {\n this.setEmitterForceMin(newObjectData.emitterForceMin);\n }\n if (oldObjectData.particleAngle1 !== newObjectData.particleAngle1) {\n this.setParticleRotationMinSpeed(newObjectData.particleAngle1);\n }\n if (oldObjectData.particleAngle2 !== newObjectData.particleAngle2) {\n this.setParticleRotationMaxSpeed(newObjectData.particleAngle2);\n }\n if (oldObjectData.maxParticleNb !== newObjectData.maxParticleNb) {\n this.setMaxParticlesCount(newObjectData.maxParticleNb);\n }\n if (oldObjectData.additive !== newObjectData.additive) {\n this.setAdditiveRendering(newObjectData.additive);\n }\n if (oldObjectData.emitterForceMax !== newObjectData.emitterForceMax) {\n this.setEmitterForceMax(newObjectData.emitterForceMax);\n }\n if (oldObjectData.zoneRadius !== newObjectData.zoneRadius) {\n this.setZoneRadius(newObjectData.zoneRadius);\n }\n if (\n oldObjectData.particleLifeTimeMin !== newObjectData.particleLifeTimeMin\n ) {\n this.setParticleLifeTimeMin(newObjectData.particleLifeTimeMin);\n }\n if (\n oldObjectData.particleLifeTimeMax !== newObjectData.particleLifeTimeMax\n ) {\n this.setParticleLifeTimeMax(newObjectData.particleLifeTimeMax);\n }\n if (oldObjectData.particleGravityX !== newObjectData.particleGravityX) {\n this.setParticleGravityX(newObjectData.particleGravityX);\n }\n if (oldObjectData.particleGravityY !== newObjectData.particleGravityY) {\n this.setParticleGravityY(newObjectData.particleGravityY);\n }\n if (oldObjectData.particleRed1 !== newObjectData.particleRed1) {\n this.setParticleRed1(newObjectData.particleRed1);\n }\n if (oldObjectData.particleRed2 !== newObjectData.particleRed2) {\n this.setParticleRed2(newObjectData.particleRed2);\n }\n if (oldObjectData.particleGreen1 !== newObjectData.particleGreen1) {\n this.setParticleGreen1(newObjectData.particleGreen1);\n }\n if (oldObjectData.particleGreen2 !== newObjectData.particleGreen2) {\n this.setParticleGreen2(newObjectData.particleGreen2);\n }\n if (oldObjectData.particleBlue1 !== newObjectData.particleBlue1) {\n this.setParticleBlue1(newObjectData.particleBlue1);\n }\n if (oldObjectData.particleBlue2 !== newObjectData.particleBlue2) {\n this.setParticleBlue2(newObjectData.particleBlue2);\n }\n if (oldObjectData.particleSize1 !== newObjectData.particleSize1) {\n this.setParticleSize1(newObjectData.particleSize1);\n }\n if (oldObjectData.particleSize2 !== newObjectData.particleSize2) {\n this.setParticleSize2(newObjectData.particleSize2);\n }\n if (oldObjectData.particleAlpha1 !== newObjectData.particleAlpha1) {\n this.setParticleAlpha1(newObjectData.particleAlpha1);\n }\n if (oldObjectData.particleAlpha2 !== newObjectData.particleAlpha2) {\n this.setParticleAlpha2(newObjectData.particleAlpha2);\n }\n if (\n oldObjectData.textureParticleName !== newObjectData.textureParticleName\n ) {\n this.setTexture(\n newObjectData.textureParticleName,\n this.getRuntimeScene()\n );\n }\n if (oldObjectData.flow !== newObjectData.flow) {\n this.setFlow(newObjectData.flow);\n }\n if (oldObjectData.tank !== newObjectData.tank) {\n this.setTank(newObjectData.tank);\n }\n if (\n oldObjectData.destroyWhenNoParticles !==\n newObjectData.destroyWhenNoParticles\n ) {\n this.destroyWhenNoParticles = newObjectData.destroyWhenNoParticles;\n }\n if (\n oldObjectData.particleSizeRandomness1 !==\n newObjectData.particleSizeRandomness1 ||\n oldObjectData.particleSizeRandomness2 !==\n newObjectData.particleSizeRandomness2 ||\n oldObjectData.particleAngle1 !== newObjectData.particleAngle1 ||\n oldObjectData.particleAngle2 !== newObjectData.particleAngle2 ||\n oldObjectData.maxParticleNb !== newObjectData.maxParticleNb ||\n oldObjectData.additive !== newObjectData.additive ||\n oldObjectData.rendererType !== newObjectData.rendererType ||\n oldObjectData.rendererParam1 !== newObjectData.rendererParam1 ||\n oldObjectData.rendererParam2 !== newObjectData.rendererParam2\n ) {\n // Destroy the renderer, ensure it's removed from the layer.\n const layer = this.getInstanceContainer().getLayer(this.layer);\n layer\n .getRenderer()\n .removeRendererObject(this._renderer.getRendererObject());\n this._renderer.destroy();\n\n // and recreate the renderer, which will add itself to the layer.\n this._renderer = new gdjs.ParticleEmitterObjectRenderer(\n this.getInstanceContainer(),\n this,\n newObjectData\n );\n\n // Consider every state dirty as the renderer was just re-created, so it needs\n // to be repositioned, angle updated, etc...\n this._posDirty = this._angleDirty = this._forceDirty = this._zoneRadiusDirty = true;\n this._lifeTimeDirty = this._gravityDirty = this._colorDirty = this._sizeDirty = true;\n this._alphaDirty = this._flowDirty = this._tankDirty = this._textureDirty = true;\n }\n return true;\n }\n\n getNetworkSyncData(): ParticleEmitterObjectNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n prms: this.particleRotationMinSpeed,\n prmx: this.particleRotationMaxSpeed,\n mpc: this.maxParticlesCount,\n addr: this.additiveRendering,\n angb: this.angleB,\n formin: this.forceMin,\n formax: this.forceMax,\n zr: this.zoneRadius,\n ltmin: this.lifeTimeMin,\n ltmax: this.lifeTimeMax,\n gravx: this.gravityX,\n gravy: this.gravityY,\n colr1: this.colorR1,\n colr2: this.colorR2,\n colg1: this.colorG1,\n colg2: this.colorG2,\n colb1: this.colorB1,\n colb2: this.colorB2,\n size1: this.size1,\n size2: this.size2,\n alp1: this.alpha1,\n alp2: this.alpha2,\n flow: this.flow,\n tank: this.tank,\n text: this.texture,\n paused: this._isEmissionPaused,\n };\n }\n\n updateFromNetworkSyncData(\n syncData: ParticleEmitterObjectNetworkSyncData\n ): void {\n super.updateFromNetworkSyncData(syncData);\n if (syncData.x !== undefined) {\n this.setX(syncData.x);\n }\n if (syncData.y !== undefined) {\n this.setY(syncData.y);\n }\n if (syncData.a !== undefined) {\n this.setAngle(syncData.a);\n }\n if (syncData.prms !== undefined) {\n this.setParticleRotationMinSpeed(syncData.prms);\n }\n if (syncData.prmx !== undefined) {\n this.setParticleRotationMaxSpeed(syncData.prmx);\n }\n if (syncData.mpc !== undefined) {\n this.setMaxParticlesCount(syncData.mpc);\n }\n if (syncData.addr !== undefined) {\n this.setAdditiveRendering(syncData.addr);\n }\n if (syncData.angb !== undefined) {\n this.setEmitterAngleB(syncData.angb);\n }\n if (syncData.formin !== undefined) {\n this.setEmitterForceMin(syncData.formin);\n }\n if (syncData.formax !== undefined) {\n this.setEmitterForceMax(syncData.formax);\n }\n if (syncData.zr !== undefined) {\n this.setZoneRadius(syncData.zr);\n }\n if (syncData.ltmin !== undefined) {\n this.setParticleLifeTimeMin(syncData.ltmin);\n }\n if (syncData.ltmax !== undefined) {\n this.setParticleLifeTimeMax(syncData.ltmax);\n }\n if (syncData.gravx !== undefined) {\n this.setParticleGravityX(syncData.gravx);\n }\n if (syncData.gravy !== undefined) {\n this.setParticleGravityY(syncData.gravy);\n }\n if (syncData.colr1 !== undefined) {\n this.setParticleRed1(syncData.colr1);\n }\n if (syncData.colr2 !== undefined) {\n this.setParticleRed2(syncData.colr2);\n }\n if (syncData.colg1 !== undefined) {\n this.setParticleGreen1(syncData.colg1);\n }\n if (syncData.colg2 !== undefined) {\n this.setParticleGreen2(syncData.colg2);\n }\n if (syncData.colb1 !== undefined) {\n this.setParticleBlue1(syncData.colb1);\n }\n if (syncData.colb2 !== undefined) {\n this.setParticleBlue2(syncData.colb2);\n }\n if (syncData.size1 !== undefined) {\n this.setParticleSize1(syncData.size1);\n }\n if (syncData.size2 !== undefined) {\n this.setParticleSize2(syncData.size2);\n }\n if (syncData.alp1 !== undefined) {\n this.setParticleAlpha1(syncData.alp1);\n }\n if (syncData.alp2 !== undefined) {\n this.setParticleAlpha2(syncData.alp2);\n }\n if (syncData.flow !== undefined) {\n this.setFlow(syncData.flow);\n }\n if (syncData.tank !== undefined) {\n this.setTank(syncData.tank);\n }\n if (syncData.text !== undefined) {\n this.setTexture(syncData.text, this.getRuntimeScene());\n }\n if (syncData.paused !== undefined) {\n if (syncData.paused) {\n this.stopEmission();\n } else {\n this.startEmission();\n }\n }\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n if (this._posDirty) {\n this._renderer.setPosition(this.getX(), this.getY());\n }\n if (this._particleRotationSpeedDirty) {\n this._renderer.setParticleRotationSpeed(\n this.particleRotationMinSpeed,\n this.particleRotationMaxSpeed\n );\n }\n if (this._maxParticlesCountDirty) {\n this._renderer.setMaxParticlesCount(this.maxParticlesCount);\n }\n if (this._additiveRenderingDirty) {\n this._renderer.setAdditiveRendering(this.additiveRendering);\n }\n if (this._angleDirty) {\n const angle = this.getAngle();\n this._renderer.setAngle(\n angle - this.angleB / 2.0,\n angle + this.angleB / 2.0\n );\n }\n if (this._forceDirty) {\n this._renderer.setForce(this.forceMin, this.forceMax);\n }\n if (this._zoneRadiusDirty) {\n this._renderer.setZoneRadius(this.zoneRadius);\n }\n if (this._lifeTimeDirty) {\n this._renderer.setLifeTime(this.lifeTimeMin, this.lifeTimeMax);\n }\n if (this._gravityDirty) {\n this._renderer.setGravity(this.gravityX, this.gravityY);\n }\n if (this._colorDirty) {\n this._renderer.setColor(\n this.colorR1,\n this.colorG1,\n this.colorB1,\n this.colorR2,\n this.colorG2,\n this.colorB2\n );\n }\n if (this._sizeDirty) {\n this._renderer.setSize(this.size1, this.size2);\n }\n if (this._alphaDirty) {\n this._renderer.setAlpha(this.alpha1, this.alpha2);\n }\n if (this._flowDirty || this._tankDirty) {\n this._renderer.resetEmission(this.flow, this.tank);\n }\n if (this._textureDirty) {\n this._renderer.setTextureName(this.texture, instanceContainer);\n }\n this._posDirty = this._angleDirty = this._forceDirty = this._zoneRadiusDirty = false;\n this._lifeTimeDirty = this._gravityDirty = this._colorDirty = this._sizeDirty = false;\n this._alphaDirty = this._flowDirty = this._textureDirty = this._tankDirty = false;\n this._additiveRenderingDirty = this._maxParticlesCountDirty = this._particleRotationSpeedDirty = false;\n this._renderer.update(this.getElapsedTime() / 1000.0);\n if (\n this.destroyWhenNoParticles &&\n this.getParticleCount() === 0 &&\n this._renderer.hasStarted() &&\n !this._isEmissionPaused &&\n this._renderer._mayHaveEndedEmission()\n ) {\n this.deleteFromScene(instanceContainer);\n }\n if (\n this.jumpForwardInTimeOnCreation > 0 &&\n this._jumpForwardInTimeCompleted === false\n ) {\n this._renderer.update(this.jumpForwardInTimeOnCreation);\n this._jumpForwardInTimeCompleted = true;\n }\n }\n\n onDestroyed(): void {\n this._renderer.destroy();\n super.onDestroyed();\n }\n\n getEmitterForceMin(): number {\n return this.forceMin;\n }\n\n setEmitterForceMin(force: float): void {\n if (force < 0) {\n force = 0;\n }\n if (this.forceMin !== force) {\n this._forceDirty = true;\n this.forceMin = force;\n }\n }\n\n getEmitterForceMax(): number {\n return this.forceMax;\n }\n\n setEmitterForceMax(force: float): void {\n if (force < 0) {\n force = 0;\n }\n if (this.forceMax !== force) {\n this._forceDirty = true;\n this.forceMax = force;\n }\n }\n\n setParticleRotationMinSpeed(speed: number): void {\n if (this.particleRotationMinSpeed !== speed) {\n this._particleRotationSpeedDirty = true;\n this.particleRotationMinSpeed = speed;\n }\n }\n\n getParticleRotationMinSpeed(): number {\n return this.particleRotationMinSpeed;\n }\n\n setParticleRotationMaxSpeed(speed: number): void {\n if (this.particleRotationMaxSpeed !== speed) {\n this._particleRotationSpeedDirty = true;\n this.particleRotationMaxSpeed = speed;\n }\n }\n\n getParticleRotationMaxSpeed(): number {\n return this.particleRotationMaxSpeed;\n }\n\n setMaxParticlesCount(count: number): void {\n if (this.maxParticlesCount !== count) {\n this._maxParticlesCountDirty = true;\n this.maxParticlesCount = count;\n }\n }\n\n getMaxParticlesCount(): number {\n return this.maxParticlesCount;\n }\n\n setAdditiveRendering(enabled: boolean) {\n if (this.additiveRendering !== enabled) {\n this._additiveRenderingDirty = true;\n this.additiveRendering = enabled;\n }\n }\n\n getAdditiveRendering(): boolean {\n return this.additiveRendering;\n }\n\n /**\n * @deprecated Prefer using getAngle\n */\n getEmitterAngle(): float {\n return (this.angleA + this.angleB) / 2.0;\n }\n\n /**\n * @deprecated Prefer using setAngle\n */\n setEmitterAngle(angle: float): void {\n const oldAngle = this.getEmitterAngle();\n if (angle !== oldAngle) {\n this._angleDirty = true;\n this.angleA += angle - oldAngle;\n this.angleB += angle - oldAngle;\n }\n }\n\n /**\n * @deprecated This function returns data that is not used.\n */\n getEmitterAngleA(): float {\n return this.angleA;\n }\n\n /**\n * @deprecated This function sets data that is not used.\n */\n setEmitterAngleA(angle: float): void {\n if (this.angleA !== angle) {\n this._angleDirty = true;\n this.angleA = angle;\n }\n }\n\n getEmitterAngleB(): float {\n return this.angleB;\n }\n\n setEmitterAngleB(angle: float): void {\n if (this.angleB !== angle) {\n this._angleDirty = true;\n this.angleB = angle;\n }\n }\n\n getConeSprayAngle(): float {\n return this.getEmitterAngleB();\n }\n\n setConeSprayAngle(angle: float): void {\n this.setEmitterAngleB(angle);\n }\n\n getZoneRadius(): float {\n return this.zoneRadius;\n }\n\n setZoneRadius(radius: float): void {\n if (radius < 0) {\n radius = 0;\n }\n if (this.zoneRadius !== radius && radius > 0) {\n this._zoneRadiusDirty = true;\n this.zoneRadius = radius;\n }\n }\n\n getParticleLifeTimeMin(): float {\n return this.lifeTimeMin;\n }\n\n setParticleLifeTimeMin(lifeTime: float): void {\n if (lifeTime < 0) {\n lifeTime = 0;\n }\n if (this.lifeTimeMin !== lifeTime) {\n this._lifeTimeDirty = true;\n this.lifeTimeMin = lifeTime;\n }\n }\n\n getParticleLifeTimeMax(): float {\n return this.lifeTimeMax;\n }\n\n setParticleLifeTimeMax(lifeTime: float): void {\n if (lifeTime < 0) {\n lifeTime = 0;\n }\n if (this.lifeTimeMax !== lifeTime) {\n this._lifeTimeDirty = true;\n this.lifeTimeMax = lifeTime;\n }\n }\n\n getParticleGravityX(): float {\n return this.gravityX;\n }\n\n setParticleGravityX(x: float): void {\n if (this.gravityX !== x) {\n this._gravityDirty = true;\n this.gravityX = x;\n }\n }\n\n getParticleGravityY(): float {\n return this.gravityY;\n }\n\n setParticleGravityY(y: float): void {\n if (this.gravityY !== y) {\n this._gravityDirty = true;\n this.gravityY = y;\n }\n }\n\n getParticleGravityAngle(): float {\n return (Math.atan2(this.gravityY, this.gravityX) * 180.0) / Math.PI;\n }\n\n setParticleGravityAngle(angle: float): void {\n const oldAngle = this.getParticleGravityAngle();\n if (oldAngle !== angle) {\n this._gravityDirty = true;\n const length = this.getParticleGravityLength();\n this.gravityX = length * Math.cos((angle * Math.PI) / 180.0);\n this.gravityY = length * Math.sin((angle * Math.PI) / 180.0);\n }\n }\n\n getParticleGravityLength(): float {\n return Math.sqrt(\n this.gravityX * this.gravityX + this.gravityY * this.gravityY\n );\n }\n\n setParticleGravityLength(length: float): void {\n if (length < 0) {\n length = 0;\n }\n const oldLength = this.getParticleGravityLength();\n if (oldLength !== length) {\n this._gravityDirty = true;\n this.gravityX *= length / oldLength;\n this.gravityY *= length / oldLength;\n }\n }\n\n getParticleRed1(): number {\n return this.colorR1;\n }\n\n setParticleRed1(red: number): void {\n if (red < 0) {\n red = 0;\n }\n if (red > 255) {\n red = 255;\n }\n if (this.colorR1 !== red) {\n this._colorDirty = true;\n this.colorR1 = red;\n }\n }\n\n getParticleRed2(): number {\n return this.colorR2;\n }\n\n setParticleRed2(red: number): void {\n if (red < 0) {\n red = 0;\n }\n if (red > 255) {\n red = 255;\n }\n if (this.colorR2 !== red) {\n this._colorDirty = true;\n this.colorR2 = red;\n }\n }\n\n getParticleGreen1(): number {\n return this.colorG1;\n }\n\n setParticleGreen1(green: number): void {\n if (green < 0) {\n green = 0;\n }\n if (green > 255) {\n green = 255;\n }\n if (this.colorG1 !== green) {\n this._colorDirty = true;\n this.colorG1 = green;\n }\n }\n\n getParticleGreen2(): number {\n return this.colorG2;\n }\n\n setParticleGreen2(green: number): void {\n if (green < 0) {\n green = 0;\n }\n if (green > 255) {\n green = 255;\n }\n if (this.colorG2 !== green) {\n this._colorDirty = true;\n this.colorG2 = green;\n }\n }\n\n getParticleBlue1(): number {\n return this.colorB1;\n }\n\n setParticleBlue1(blue: number): void {\n if (blue < 0) {\n blue = 0;\n }\n if (blue > 255) {\n blue = 255;\n }\n if (this.colorB1 !== blue) {\n this._colorDirty = true;\n this.colorB1 = blue;\n }\n }\n\n getParticleBlue2(): number {\n return this.colorB2;\n }\n\n setParticleBlue2(blue: number): void {\n if (blue < 0) {\n blue = 0;\n }\n if (blue > 255) {\n blue = 255;\n }\n if (this.colorB2 !== blue) {\n this._colorDirty = true;\n this.colorB2 = blue;\n }\n }\n\n setParticleColor1(rgbColor: string): void {\n const colors = rgbColor.split(';');\n if (colors.length < 3) {\n return;\n }\n this.setParticleRed1(parseInt(colors[0], 10));\n this.setParticleGreen1(parseInt(colors[1], 10));\n this.setParticleBlue1(parseInt(colors[2], 10));\n }\n\n setParticleColor2(rgbColor: string): void {\n const colors = rgbColor.split(';');\n if (colors.length < 3) {\n return;\n }\n this.setParticleRed2(parseInt(colors[0], 10));\n this.setParticleGreen2(parseInt(colors[1], 10));\n this.setParticleBlue2(parseInt(colors[2], 10));\n }\n\n getParticleSize1(): float {\n return this.size1;\n }\n\n setParticleSize1(size: float): void {\n if (size < 0) {\n size = 0;\n }\n if (this.size1 !== size) {\n this._sizeDirty = true;\n this.size1 = size;\n }\n }\n\n getParticleSize2(): float {\n return this.size2;\n }\n\n setParticleSize2(size: float): void {\n if (this.size2 !== size) {\n this._sizeDirty = true;\n this.size2 = size;\n }\n }\n\n getParticleAlpha1(): number {\n return this.alpha1;\n }\n\n setParticleAlpha1(alpha: number): void {\n if (this.alpha1 !== alpha) {\n this._alphaDirty = true;\n this.alpha1 = alpha;\n }\n }\n\n getParticleAlpha2(): number {\n return this.alpha2;\n }\n\n setParticleAlpha2(alpha: number): void {\n if (this.alpha2 !== alpha) {\n this._alphaDirty = true;\n this.alpha2 = alpha;\n }\n }\n\n startEmission(): void {\n this._isEmissionPaused = false;\n this._renderer.start();\n }\n\n stopEmission(): void {\n this._isEmissionPaused = true;\n this._renderer.stop();\n }\n\n isEmitting(): boolean {\n return this._renderer.emitter.emit;\n }\n\n noMoreParticles(): boolean {\n return !this.isEmitting();\n }\n\n recreateParticleSystem(): void {\n this._renderer.recreate();\n }\n\n getFlow(): number {\n return this.flow;\n }\n\n setFlow(flow: number): void {\n if (this.flow !== flow) {\n this.flow = flow;\n this._flowDirty = true;\n }\n }\n\n getParticleCount(): number {\n return this._renderer.getParticleCount();\n }\n\n getTank(): number {\n return this.tank;\n }\n\n setTank(tank: number): void {\n this.tank = tank;\n this._tankDirty = true;\n }\n\n getTexture(): string {\n return this.texture;\n }\n\n setTexture(\n texture: string,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n if (this.texture !== texture) {\n if (this._renderer.isTextureNameValid(texture, instanceContainer)) {\n this.texture = texture;\n this._textureDirty = true;\n }\n }\n }\n\n jumpEmitterForwardInTime(timeSkipped: number): void {\n this._renderer.update(timeSkipped);\n }\n }\n gdjs.registerObject(\n 'ParticleSystem::ParticleEmitter',\n gdjs.ParticleEmitterObject\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,23 @@
1
+ cmake_minimum_required(VERSION 3.5)
2
+
3
+ project(PathfindingBehavior)
4
+ gd_add_extension_includes()
5
+
6
+ # Defines
7
+ #
8
+ gd_add_extension_definitions(PathfindingBehavior)
9
+
10
+ # The targets
11
+ #
12
+ include_directories(.)
13
+ file(
14
+ GLOB
15
+ source_files
16
+ *.cpp
17
+ *.h)
18
+ gd_add_clang_utils(PathfindingBehavior "${source_files}")
19
+ gd_add_extension_target(PathfindingBehavior "${source_files}")
20
+
21
+ # Linker files for the IDE extension
22
+ #
23
+ gd_extension_link_libraries(PathfindingBehavior)
@@ -1,2 +1,2 @@
1
- var gdjs;(function(l){const p=new l.Logger("Pathfinding behavior");class f extends l.RuntimeBehavior{constructor(s,e,o){super(s,e,o);this._path=[];this._pathFound=!1;this._speed=0;this._angularSpeed=0;this._distanceOnSegment=0;this._totalSegmentDistance=0;this._currentSegment=0;this._reachedEnd=!1;this._movementAngle=0;this._path===void 0||(this._path.length=0),this._allowDiagonals=e.allowDiagonals,this._acceleration=e.acceleration,this._maxSpeed=e.maxSpeed,this._angularMaxSpeed=e.angularMaxSpeed,this._rotateObject=e.rotateObject,this._angleOffset=e.angleOffset,this._cellWidth=e.cellWidth,this._cellHeight=e.cellHeight,this._gridOffsetX=e.gridOffsetX||0,this._gridOffsetY=e.gridOffsetY||0,this._extraBorder=e.extraBorder,this._smoothingMaxCellGap=e.smoothingMaxCellGap||0,this._manager=l.PathfindingObstaclesManager.getManager(s),this._searchContext=new l.PathfindingRuntimeBehavior.SearchContext(this._manager)}updateFromBehaviorData(s,e){return s.allowDiagonals!==e.allowDiagonals&&this.allowDiagonals(e.allowDiagonals),s.acceleration!==e.acceleration&&this.setAcceleration(e.acceleration),s.maxSpeed!==e.maxSpeed&&this.setMaxSpeed(e.maxSpeed),s.angularMaxSpeed!==e.angularMaxSpeed&&this.setAngularMaxSpeed(e.angularMaxSpeed),s.rotateObject!==e.rotateObject&&this.setRotateObject(e.rotateObject),s.angleOffset!==e.angleOffset&&this.setAngleOffset(e.angleOffset),s.cellWidth!==e.cellWidth&&this.setCellWidth(e.cellWidth),s.cellHeight!==e.cellHeight&&this.setCellHeight(e.cellHeight),s.gridOffsetX!==e.gridOffsetX&&(this._gridOffsetX=e.gridOffsetX),s.gridOffsetY!==e.gridOffsetY&&(this._gridOffsetY=e.gridOffsetY),s.extraBorder!==e.extraBorder&&this.setExtraBorder(e.extraBorder),s.smoothingMaxCellGap!==e.smoothingMaxCellGap&&(this._smoothingMaxCellGap=e.smoothingMaxCellGap),!0}setCellWidth(s){this._cellWidth=s}getCellWidth(){return this._cellWidth}setCellHeight(s){this._cellHeight=s}getCellHeight(){return this._cellHeight}setGridOffsetX(s){this._gridOffsetX=s}getGridOffsetX(){return this._gridOffsetX}setGridOffsetY(s){this._gridOffsetY=s}getGridOffsetY(){return this._gridOffsetY}setAcceleration(s){this._acceleration=s}getAcceleration(){return this._acceleration}setMaxSpeed(s){this._maxSpeed=s}getMaxSpeed(){return this._maxSpeed}setSpeed(s){this._speed=s}getSpeed(){return this._speed}getMovementAngle(){return this._movementAngle}movementAngleIsAround(s,e){return Math.abs(l.evtTools.common.angleDifference(this._movementAngle,s))<=e}setAngularMaxSpeed(s){this._angularMaxSpeed=s}getAngularMaxSpeed(){return this._angularMaxSpeed}setAngleOffset(s){this._angleOffset=s}getAngleOffset(){return this._angleOffset}setExtraBorder(s){this._extraBorder=s}getExtraBorder(){return this._extraBorder}allowDiagonals(s){this._allowDiagonals=s}diagonalsAllowed(){return this._allowDiagonals}setRotateObject(s){this._rotateObject=s}isObjectRotated(){return this._rotateObject}getNodeX(s){return s<this._path.length?this._path[s][0]:0}getNodeY(s){return s<this._path.length?this._path[s][1]:0}getNextNodeIndex(){return this._currentSegment+1<this._path.length?this._currentSegment+1:this._path.length-1}getNodeCount(){return this._path.length}getNextNodeX(){return this._path.length===0?0:this._currentSegment+1<this._path.length?this._path[this._currentSegment+1][0]:this._path[this._path.length-1][0]}getNextNodeY(){return this._path.length===0?0:this._currentSegment+1<this._path.length?this._path[this._currentSegment+1][1]:this._path[this._path.length-1][1]}getLastNodeX(){return this._path.length<2?0:this._currentSegment<this._path.length-1?this._path[this._currentSegment][0]:this._path[this._path.length-1][0]}getLastNodeY(){return this._path.length<2?0:this._currentSegment<this._path.length-1?this._path[this._currentSegment][1]:this._path[this._path.length-1][1]}getDestinationX(){return this._path.length===0?0:this._path[this._path.length-1][0]}getDestinationY(){return this._path.length===0?0:this._path[this._path.length-1][1]}pathFound(){return this._pathFound}destinationReached(){return this._reachedEnd}moveTo(s,e,o){const t=this.owner,i=Math.round((e-this._gridOffsetX)/this._cellWidth),h=Math.round((o-this._gridOffsetY)/this._cellHeight),r=Math.round((t.getX()-this._gridOffsetX)/this._cellWidth),n=Math.round((t.getY()-this._gridOffsetY)/this._cellHeight);if(r==i&&n==h){this._path.length=0,this._path.push([t.getX(),t.getY()]),this._path.push([e,o]),this._enterSegment(0),this._pathFound=!0;return}if(this._searchContext.allowDiagonals(this._allowDiagonals),this._searchContext.setObstacles(this._manager),this._searchContext.setCellSize(this._cellWidth,this._cellHeight),this._searchContext.setGridOffset(this._gridOffsetX,this._gridOffsetY),this._searchContext.setStartPosition(t.getX(),t.getY()),this._searchContext.setObjectSize(t.getX()-t.getDrawableX()+this._extraBorder,t.getY()-t.getDrawableY()+this._extraBorder,t.getWidth()-(t.getX()-t.getDrawableX())+this._extraBorder,t.getHeight()-(t.getY()-t.getDrawableY())+this._extraBorder),this._searchContext.computePathTo(e,o)){let a=this._searchContext.getFinalNode(),_=0;for(;a;)_===this._path.length&&this._path.push([0,0]),this._path[_][0]=a.pos[0]*this._cellWidth+this._gridOffsetX,this._path[_][1]=a.pos[1]*this._cellHeight+this._gridOffsetY,a=a.parent,_++;if(this._path.length=_,this._path.reverse(),this._path[0][0]=t.getX(),this._path[0][1]=t.getY(),this._allowDiagonals&&this._smoothingMaxCellGap>0){l.pathfinding.simplifyPath(this._path,this._smoothingMaxCellGap*Math.min(this._cellWidth,this._cellHeight),l.PathfindingRuntimeBehavior._smoothingResultVertices,l.PathfindingRuntimeBehavior._smoothingWorkingVertices);let g=this._path;this._path=l.PathfindingRuntimeBehavior._smoothingResultVertices,l.PathfindingRuntimeBehavior._smoothingResultVertices=g}this._enterSegment(0),this._pathFound=!0;return}this._pathFound=!1}_enterSegment(s){if(this._path.length!==0)if(this._currentSegment=s,this._currentSegment<this._path.length-1){const e=this._path[this._currentSegment+1][0]-this._path[this._currentSegment][0],o=this._path[this._currentSegment+1][1]-this._path[this._currentSegment][1];this._totalSegmentDistance=Math.sqrt(e*e+o*o),this._distanceOnSegment=0,this._reachedEnd=!1,this._movementAngle=(l.toDegrees(Math.atan2(o,e))+360)%360}else this._reachedEnd=!0,this._speed=0}doStepPreEvents(s){if(this._path.length===0||this._reachedEnd)return;const e=this.owner.getElapsedTime()/1e3,o=this._speed;this._speed!==this._maxSpeed&&(this._speed+=this._acceleration*e,this._speed>this._maxSpeed&&(this._speed=this._maxSpeed)),this._angularSpeed=this._angularMaxSpeed,this._distanceOnSegment+=(this._speed+o)/2*e;const t=this._totalSegmentDistance-this._distanceOnSegment;t<=0&&this._currentSegment<this._path.length&&(this._enterSegment(this._currentSegment+1),this._distanceOnSegment=-t);let i=[0,0];this._currentSegment<this._path.length-1?(i[0]=l.evtTools.common.lerp(this._path[this._currentSegment][0],this._path[this._currentSegment+1][0],this._distanceOnSegment/this._totalSegmentDistance),i[1]=l.evtTools.common.lerp(this._path[this._currentSegment][1],this._path[this._currentSegment+1][1],this._distanceOnSegment/this._totalSegmentDistance),this._rotateObject&&this.owner.getAngle()!==this._movementAngle+this._angleOffset&&this.owner.rotateTowardAngle(this._movementAngle+this._angleOffset,this._angularSpeed)):i=this._path[this._path.length-1],this.owner.setX(i[0]),this.owner.setY(i[1])}doStepPostEvents(s){}static euclideanDistance(s,e){return Math.sqrt((s[0]-e[0])*(s[0]-e[0])+(s[1]-e[1])*(s[1]-e[1]))}static manhattanDistance(s,e){return Math.abs(s[0]-e[0])+Math.abs(s[1]-e[1])}}f._smoothingResultVertices=[],f._smoothingWorkingVertices=[],l.PathfindingRuntimeBehavior=f,l.registerBehavior("PathfindingBehavior::PathfindingBehavior",l.PathfindingRuntimeBehavior),function(e){class c{constructor(t,i){this.cost=0;this.smallestCost=-1;this.estimateCost=-1;this.parent=null;this.open=!0;this.pos=[t,i]}reinitialize(t,i){this.pos[0]=t,this.pos[1]=i,this.cost=0,this.smallestCost=-1,this.estimateCost=-1,this.parent=null,this.open=!0}}e.Node=c;class s{constructor(t){this._finalNode=null;this._destination=[0,0];this._start=[0,0];this._startX=0;this._startY=0;this._allowDiagonals=!0;this._maxComplexityFactor=50;this._cellWidth=20;this._cellHeight=20;this._gridOffsetX=0;this._gridOffsetY=0;this._leftBorder=0;this._rightBorder=0;this._topBorder=0;this._bottomBorder=0;this._allNodes=[];this._openNodes=[];this._closeObstacles=[];this._nodeCache=[];this._obstacles=t,this._distanceFunction=e.euclideanDistance}setObstacles(t){return this._obstacles=t,this}getFinalNode(){return this._finalNode}allowDiagonals(t){return this._allowDiagonals=t,this._distanceFunction=t?e.euclideanDistance:e.manhattanDistance,this}setStartPosition(t,i){return this._startX=t,this._startY=i,this}setObjectSize(t,i,h,r){return this._leftBorder=t,this._rightBorder=h,this._topBorder=i,this._bottomBorder=r,this}setCellSize(t,i){return this._cellWidth=t,this._cellHeight=i,this}setGridOffset(t,i){return this._gridOffsetX=t,this._gridOffsetY=i,this}computePathTo(t,i){if(this._obstacles===null){p.log("You tried to compute a path without specifying the obstacles");return}this._destination[0]=Math.round((t-this._gridOffsetX)/this._cellWidth),this._destination[1]=Math.round((i-this._gridOffsetY)/this._cellHeight),this._start[0]=Math.round((this._startX-this._gridOffsetX)/this._cellWidth),this._start[1]=Math.round((this._startY-this._gridOffsetY)/this._cellHeight),this._freeAllNodes();const h=this._getNode(this._start[0],this._start[1]);h.smallestCost=0,h.estimateCost=0+this._distanceFunction(this._start,this._destination),this._openNodes.length=0,this._openNodes.push(h);let r=0;const n=h.estimateCost*this._maxComplexityFactor;for(;this._openNodes.length!==0;){if(r++>n)return console.warn(`No path was found after covering ${n} cells.`),!1;const a=this._openNodes.shift();if(a.open=!1,a.pos[0]==this._destination[0]&&a.pos[1]==this._destination[1])return this._finalNode=a,!0;this._insertNeighbors(a)}return!1}_freeAllNodes(){if(this._nodeCache.length<=32e3){for(const t in this._allNodes)if(this._allNodes.hasOwnProperty(t)){const i=this._allNodes[t];for(const h in i)i.hasOwnProperty(h)&&this._nodeCache.push(i[h])}}this._allNodes=[]}_insertNeighbors(t){this._addOrUpdateNode(t.pos[0]+1,t.pos[1],t,1),this._addOrUpdateNode(t.pos[0]-1,t.pos[1],t,1),this._addOrUpdateNode(t.pos[0],t.pos[1]+1,t,1),this._addOrUpdateNode(t.pos[0],t.pos[1]-1,t,1),this._allowDiagonals&&(this._addOrUpdateNode(t.pos[0]+1,t.pos[1]+1,t,1.414213562),this._addOrUpdateNode(t.pos[0]+1,t.pos[1]-1,t,1.414213562),this._addOrUpdateNode(t.pos[0]-1,t.pos[1]-1,t,1.414213562),this._addOrUpdateNode(t.pos[0]-1,t.pos[1]+1,t,1.414213562))}_getNode(t,i){if(this._allNodes.hasOwnProperty(t)){if(this._allNodes[t].hasOwnProperty(i))return this._allNodes[t][i]}else this._allNodes[t]=[];let h;this._nodeCache.length!==0?(h=this._nodeCache.shift(),h.reinitialize(t,i)):h=new c(t,i);const r=t*this._cellWidth+this._gridOffsetX,n=i*this._cellHeight+this._gridOffsetY;let a=!1;const _=this._cellHeight>this._cellWidth?this._cellHeight*2:this._cellWidth*2;this._obstacles.getAllObstaclesAround(r,n,_,this._closeObstacles);for(let g=0;g<this._closeObstacles.length;++g){const d=this._closeObstacles[g].owner,u=Math.floor((d.getDrawableX()-this._rightBorder-this._gridOffsetX)/this._cellWidth),m=Math.floor((d.getDrawableY()-this._bottomBorder-this._gridOffsetY)/this._cellHeight),O=Math.ceil((d.getDrawableX()+d.getWidth()+this._leftBorder-this._gridOffsetX)/this._cellWidth),S=Math.ceil((d.getDrawableY()+d.getHeight()+this._topBorder-this._gridOffsetY)/this._cellHeight);if(u<t&&t<O&&m<i&&i<S)if(a=!0,this._closeObstacles[g].isImpassable()){h.cost=-1;break}else h.cost+=this._closeObstacles[g].getCost()}return a||(h.cost=1),this._allNodes[t][i]=h,h}_addOrUpdateNode(t,i,h,r){const n=this._getNode(t,i);if(!(!n.open||n.cost<0)&&(n.smallestCost===-1||n.smallestCost>h.smallestCost+(h.cost+n.cost)/2*r)){if(n.smallestCost!=-1){for(let a=0;a<this._openNodes.length;++a)if(this._openNodes[a].pos[0]==n.pos[0]&&this._openNodes[a].pos[1]==n.pos[1]){this._openNodes.splice(a,1);break}}if(n.smallestCost=h.smallestCost+(h.cost+n.cost)/2*r,n.parent=h,n.estimateCost=n.smallestCost+this._distanceFunction(n.pos,this._destination),this._openNodes.length===0||this._openNodes[this._openNodes.length-1].estimateCost<n.estimateCost)this._openNodes.push(n);else for(let a=0;a<this._openNodes.length;++a)if(this._openNodes[a].estimateCost>=n.estimateCost){this._openNodes.splice(a,0,n);break}}}}e.SearchContext=s}(f=l.PathfindingRuntimeBehavior||(l.PathfindingRuntimeBehavior={}))})(gdjs||(gdjs={}));
1
+ var gdjs;(function(o){const p=new o.Logger("Pathfinding behavior");class f extends o.RuntimeBehavior{constructor(s,e,l){super(s,e,l);this._path=[];this._pathFound=!1;this._speed=0;this._angularSpeed=0;this._distanceOnSegment=0;this._totalSegmentDistance=0;this._currentSegment=0;this._reachedEnd=!1;this._movementAngle=0;this._path===void 0||(this._path.length=0),this._allowDiagonals=e.allowDiagonals,this._acceleration=e.acceleration,this._maxSpeed=e.maxSpeed,this._angularMaxSpeed=e.angularMaxSpeed,this._rotateObject=e.rotateObject,this._angleOffset=e.angleOffset,this._cellWidth=e.cellWidth,this._cellHeight=e.cellHeight,this._gridOffsetX=e.gridOffsetX||0,this._gridOffsetY=e.gridOffsetY||0,this._extraBorder=e.extraBorder,this._smoothingMaxCellGap=e.smoothingMaxCellGap||0,this._manager=o.PathfindingObstaclesManager.getManager(s),this._searchContext=new o.PathfindingRuntimeBehavior.SearchContext(this._manager)}updateFromBehaviorData(s,e){return s.allowDiagonals!==e.allowDiagonals&&this.allowDiagonals(e.allowDiagonals),s.acceleration!==e.acceleration&&this.setAcceleration(e.acceleration),s.maxSpeed!==e.maxSpeed&&this.setMaxSpeed(e.maxSpeed),s.angularMaxSpeed!==e.angularMaxSpeed&&this.setAngularMaxSpeed(e.angularMaxSpeed),s.rotateObject!==e.rotateObject&&this.setRotateObject(e.rotateObject),s.angleOffset!==e.angleOffset&&this.setAngleOffset(e.angleOffset),s.cellWidth!==e.cellWidth&&this.setCellWidth(e.cellWidth),s.cellHeight!==e.cellHeight&&this.setCellHeight(e.cellHeight),s.gridOffsetX!==e.gridOffsetX&&(this._gridOffsetX=e.gridOffsetX),s.gridOffsetY!==e.gridOffsetY&&(this._gridOffsetY=e.gridOffsetY),s.extraBorder!==e.extraBorder&&this.setExtraBorder(e.extraBorder),s.smoothingMaxCellGap!==e.smoothingMaxCellGap&&(this._smoothingMaxCellGap=e.smoothingMaxCellGap),!0}getNetworkSyncData(){return{...super.getNetworkSyncData(),props:{path:this._path,pf:this._pathFound,sp:this._speed,as:this._angularSpeed,cs:this._currentSegment,tss:this._totalSegmentDistance,re:this._reachedEnd,ma:this._movementAngle}}}updateFromNetworkSyncData(s){super.updateFromNetworkSyncData(s);const e=s.props;e.path!==void 0&&(this._path=e.path),e.pf!==void 0&&(this._pathFound=e.pf),e.sp!==void 0&&(this._speed=e.sp),e.as!==void 0&&(this._angularSpeed=e.as),e.cs!==void 0&&e.cs!==this._currentSegment&&(this._currentSegment=e.cs),e.tss!==void 0&&(this._totalSegmentDistance=e.tss),e.re!==void 0&&(this._reachedEnd=e.re),e.ma!==void 0&&(this._movementAngle=e.ma)}setCellWidth(s){this._cellWidth=s}getCellWidth(){return this._cellWidth}setCellHeight(s){this._cellHeight=s}getCellHeight(){return this._cellHeight}setGridOffsetX(s){this._gridOffsetX=s}getGridOffsetX(){return this._gridOffsetX}setGridOffsetY(s){this._gridOffsetY=s}getGridOffsetY(){return this._gridOffsetY}setAcceleration(s){this._acceleration=s}getAcceleration(){return this._acceleration}setMaxSpeed(s){this._maxSpeed=s}getMaxSpeed(){return this._maxSpeed}setSpeed(s){this._speed=s}getSpeed(){return this._speed}getMovementAngle(){return this._movementAngle}movementAngleIsAround(s,e){return Math.abs(o.evtTools.common.angleDifference(this._movementAngle,s))<=e}setAngularMaxSpeed(s){this._angularMaxSpeed=s}getAngularMaxSpeed(){return this._angularMaxSpeed}setAngleOffset(s){this._angleOffset=s}getAngleOffset(){return this._angleOffset}setExtraBorder(s){this._extraBorder=s}getExtraBorder(){return this._extraBorder}allowDiagonals(s){this._allowDiagonals=s}diagonalsAllowed(){return this._allowDiagonals}setRotateObject(s){this._rotateObject=s}isObjectRotated(){return this._rotateObject}getNodeX(s){return s<this._path.length?this._path[s][0]:0}getNodeY(s){return s<this._path.length?this._path[s][1]:0}getNextNodeIndex(){return this._currentSegment+1<this._path.length?this._currentSegment+1:this._path.length-1}getNodeCount(){return this._path.length}getNextNodeX(){return this._path.length===0?0:this._currentSegment+1<this._path.length?this._path[this._currentSegment+1][0]:this._path[this._path.length-1][0]}getNextNodeY(){return this._path.length===0?0:this._currentSegment+1<this._path.length?this._path[this._currentSegment+1][1]:this._path[this._path.length-1][1]}getLastNodeX(){return this._path.length<2?0:this._currentSegment<this._path.length-1?this._path[this._currentSegment][0]:this._path[this._path.length-1][0]}getLastNodeY(){return this._path.length<2?0:this._currentSegment<this._path.length-1?this._path[this._currentSegment][1]:this._path[this._path.length-1][1]}getDestinationX(){return this._path.length===0?0:this._path[this._path.length-1][0]}getDestinationY(){return this._path.length===0?0:this._path[this._path.length-1][1]}pathFound(){return this._pathFound}destinationReached(){return this._reachedEnd}moveTo(s,e,l){const t=this.owner,i=Math.round((e-this._gridOffsetX)/this._cellWidth),n=Math.round((l-this._gridOffsetY)/this._cellHeight),r=Math.round((t.getX()-this._gridOffsetX)/this._cellWidth),h=Math.round((t.getY()-this._gridOffsetY)/this._cellHeight);if(r==i&&h==n){this._path.length=0,this._path.push([t.getX(),t.getY()]),this._path.push([e,l]),this._enterSegment(0),this._pathFound=!0;return}if(this._searchContext.allowDiagonals(this._allowDiagonals),this._searchContext.setObstacles(this._manager),this._searchContext.setCellSize(this._cellWidth,this._cellHeight),this._searchContext.setGridOffset(this._gridOffsetX,this._gridOffsetY),this._searchContext.setStartPosition(t.getX(),t.getY()),this._searchContext.setObjectSize(t.getX()-t.getDrawableX()+this._extraBorder,t.getY()-t.getDrawableY()+this._extraBorder,t.getWidth()-(t.getX()-t.getDrawableX())+this._extraBorder,t.getHeight()-(t.getY()-t.getDrawableY())+this._extraBorder),this._searchContext.computePathTo(e,l)){let a=this._searchContext.getFinalNode(),_=0;for(;a;)_===this._path.length&&this._path.push([0,0]),this._path[_][0]=a.pos[0]*this._cellWidth+this._gridOffsetX,this._path[_][1]=a.pos[1]*this._cellHeight+this._gridOffsetY,a=a.parent,_++;if(this._path.length=_,this._path.reverse(),this._path[0][0]=t.getX(),this._path[0][1]=t.getY(),this._allowDiagonals&&this._smoothingMaxCellGap>0){o.pathfinding.simplifyPath(this._path,this._smoothingMaxCellGap*Math.min(this._cellWidth,this._cellHeight),o.PathfindingRuntimeBehavior._smoothingResultVertices,o.PathfindingRuntimeBehavior._smoothingWorkingVertices);let g=this._path;this._path=o.PathfindingRuntimeBehavior._smoothingResultVertices,o.PathfindingRuntimeBehavior._smoothingResultVertices=g}this._enterSegment(0),this._pathFound=!0;return}this._pathFound=!1}_enterSegment(s){if(this._path.length!==0)if(this._currentSegment=s,this._currentSegment<this._path.length-1){const e=this._path[this._currentSegment+1][0]-this._path[this._currentSegment][0],l=this._path[this._currentSegment+1][1]-this._path[this._currentSegment][1];this._totalSegmentDistance=Math.sqrt(e*e+l*l),this._distanceOnSegment=0,this._reachedEnd=!1,this._movementAngle=(o.toDegrees(Math.atan2(l,e))+360)%360}else this._reachedEnd=!0,this._speed=0}doStepPreEvents(s){if(this._path.length===0||this._reachedEnd)return;const e=this.owner.getElapsedTime()/1e3,l=this._speed;this._speed!==this._maxSpeed&&(this._speed+=this._acceleration*e,this._speed>this._maxSpeed&&(this._speed=this._maxSpeed)),this._angularSpeed=this._angularMaxSpeed,this._distanceOnSegment+=(this._speed+l)/2*e;const t=this._totalSegmentDistance-this._distanceOnSegment;t<=0&&this._currentSegment<this._path.length&&(this._enterSegment(this._currentSegment+1),this._distanceOnSegment=-t);let i=[0,0];this._currentSegment<this._path.length-1?(i[0]=o.evtTools.common.lerp(this._path[this._currentSegment][0],this._path[this._currentSegment+1][0],this._distanceOnSegment/this._totalSegmentDistance),i[1]=o.evtTools.common.lerp(this._path[this._currentSegment][1],this._path[this._currentSegment+1][1],this._distanceOnSegment/this._totalSegmentDistance),this._rotateObject&&this.owner.getAngle()!==this._movementAngle+this._angleOffset&&this.owner.rotateTowardAngle(this._movementAngle+this._angleOffset,this._angularSpeed)):i=this._path[this._path.length-1],this.owner.setX(i[0]),this.owner.setY(i[1])}doStepPostEvents(s){}static euclideanDistance(s,e){return Math.sqrt((s[0]-e[0])*(s[0]-e[0])+(s[1]-e[1])*(s[1]-e[1]))}static manhattanDistance(s,e){return Math.abs(s[0]-e[0])+Math.abs(s[1]-e[1])}}f._smoothingResultVertices=[],f._smoothingWorkingVertices=[],o.PathfindingRuntimeBehavior=f,o.registerBehavior("PathfindingBehavior::PathfindingBehavior",o.PathfindingRuntimeBehavior),function(e){class c{constructor(t,i){this.cost=0;this.smallestCost=-1;this.estimateCost=-1;this.parent=null;this.open=!0;this.pos=[t,i]}reinitialize(t,i){this.pos[0]=t,this.pos[1]=i,this.cost=0,this.smallestCost=-1,this.estimateCost=-1,this.parent=null,this.open=!0}}e.Node=c;class s{constructor(t){this._finalNode=null;this._destination=[0,0];this._start=[0,0];this._startX=0;this._startY=0;this._allowDiagonals=!0;this._maxComplexityFactor=50;this._cellWidth=20;this._cellHeight=20;this._gridOffsetX=0;this._gridOffsetY=0;this._leftBorder=0;this._rightBorder=0;this._topBorder=0;this._bottomBorder=0;this._allNodes=[];this._openNodes=[];this._closeObstacles=[];this._nodeCache=[];this._obstacles=t,this._distanceFunction=e.euclideanDistance}setObstacles(t){return this._obstacles=t,this}getFinalNode(){return this._finalNode}allowDiagonals(t){return this._allowDiagonals=t,this._distanceFunction=t?e.euclideanDistance:e.manhattanDistance,this}setStartPosition(t,i){return this._startX=t,this._startY=i,this}setObjectSize(t,i,n,r){return this._leftBorder=t,this._rightBorder=n,this._topBorder=i,this._bottomBorder=r,this}setCellSize(t,i){return this._cellWidth=t,this._cellHeight=i,this}setGridOffset(t,i){return this._gridOffsetX=t,this._gridOffsetY=i,this}computePathTo(t,i){if(this._obstacles===null){p.log("You tried to compute a path without specifying the obstacles");return}this._destination[0]=Math.round((t-this._gridOffsetX)/this._cellWidth),this._destination[1]=Math.round((i-this._gridOffsetY)/this._cellHeight),this._start[0]=Math.round((this._startX-this._gridOffsetX)/this._cellWidth),this._start[1]=Math.round((this._startY-this._gridOffsetY)/this._cellHeight),this._freeAllNodes();const n=this._getNode(this._start[0],this._start[1]);n.smallestCost=0,n.estimateCost=0+this._distanceFunction(this._start,this._destination),this._openNodes.length=0,this._openNodes.push(n);let r=0;const h=n.estimateCost*this._maxComplexityFactor;for(;this._openNodes.length!==0;){if(r++>h)return console.warn(`No path was found after covering ${h} cells.`),!1;const a=this._openNodes.shift();if(a.open=!1,a.pos[0]==this._destination[0]&&a.pos[1]==this._destination[1])return this._finalNode=a,!0;this._insertNeighbors(a)}return!1}_freeAllNodes(){if(this._nodeCache.length<=32e3){for(const t in this._allNodes)if(this._allNodes.hasOwnProperty(t)){const i=this._allNodes[t];for(const n in i)i.hasOwnProperty(n)&&this._nodeCache.push(i[n])}}this._allNodes=[]}_insertNeighbors(t){this._addOrUpdateNode(t.pos[0]+1,t.pos[1],t,1),this._addOrUpdateNode(t.pos[0]-1,t.pos[1],t,1),this._addOrUpdateNode(t.pos[0],t.pos[1]+1,t,1),this._addOrUpdateNode(t.pos[0],t.pos[1]-1,t,1),this._allowDiagonals&&(this._addOrUpdateNode(t.pos[0]+1,t.pos[1]+1,t,1.414213562),this._addOrUpdateNode(t.pos[0]+1,t.pos[1]-1,t,1.414213562),this._addOrUpdateNode(t.pos[0]-1,t.pos[1]-1,t,1.414213562),this._addOrUpdateNode(t.pos[0]-1,t.pos[1]+1,t,1.414213562))}_getNode(t,i){if(this._allNodes.hasOwnProperty(t)){if(this._allNodes[t].hasOwnProperty(i))return this._allNodes[t][i]}else this._allNodes[t]=[];let n;this._nodeCache.length!==0?(n=this._nodeCache.shift(),n.reinitialize(t,i)):n=new c(t,i);const r=t*this._cellWidth+this._gridOffsetX,h=i*this._cellHeight+this._gridOffsetY;let a=!1;const _=this._cellHeight>this._cellWidth?this._cellHeight*2:this._cellWidth*2;this._obstacles.getAllObstaclesAround(r,h,_,this._closeObstacles);for(let g=0;g<this._closeObstacles.length;++g){const d=this._closeObstacles[g].owner,u=Math.floor((d.getDrawableX()-this._rightBorder-this._gridOffsetX)/this._cellWidth),m=Math.floor((d.getDrawableY()-this._bottomBorder-this._gridOffsetY)/this._cellHeight),O=Math.ceil((d.getDrawableX()+d.getWidth()+this._leftBorder-this._gridOffsetX)/this._cellWidth),S=Math.ceil((d.getDrawableY()+d.getHeight()+this._topBorder-this._gridOffsetY)/this._cellHeight);if(u<t&&t<O&&m<i&&i<S)if(a=!0,this._closeObstacles[g].isImpassable()){n.cost=-1;break}else n.cost+=this._closeObstacles[g].getCost()}return a||(n.cost=1),this._allNodes[t][i]=n,n}_addOrUpdateNode(t,i,n,r){const h=this._getNode(t,i);if(!(!h.open||h.cost<0)&&(h.smallestCost===-1||h.smallestCost>n.smallestCost+(n.cost+h.cost)/2*r)){if(h.smallestCost!=-1){for(let a=0;a<this._openNodes.length;++a)if(this._openNodes[a].pos[0]==h.pos[0]&&this._openNodes[a].pos[1]==h.pos[1]){this._openNodes.splice(a,1);break}}if(h.smallestCost=n.smallestCost+(n.cost+h.cost)/2*r,h.parent=n,h.estimateCost=h.smallestCost+this._distanceFunction(h.pos,this._destination),this._openNodes.length===0||this._openNodes[this._openNodes.length-1].estimateCost<h.estimateCost)this._openNodes.push(h);else for(let a=0;a<this._openNodes.length;++a)if(this._openNodes[a].estimateCost>=h.estimateCost){this._openNodes.splice(a,0,h);break}}}}e.SearchContext=s}(f=o.PathfindingRuntimeBehavior||(o.PathfindingRuntimeBehavior={}))})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=pathfindingruntimebehavior.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../GDevelop/Extensions/PathfindingBehavior/pathfindingruntimebehavior.ts"],
4
- "sourcesContent": ["/*\nGDevelop - Pathfinding Behavior Extension\nCopyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)\n */\nnamespace gdjs {\n const logger = new gdjs.Logger('Pathfinding behavior');\n /**\n * PathfindingRuntimeBehavior represents a behavior allowing objects to\n * follow a path computed to avoid obstacles.\n */\n export class PathfindingRuntimeBehavior extends gdjs.RuntimeBehavior {\n _path: Array<FloatPoint> = [];\n /** Used by the path simplification algorithm */\n static _smoothingResultVertices: Array<FloatPoint> = [];\n /** Used by the path simplification algorithm */\n static _smoothingWorkingVertices: Array<FloatPoint> = [];\n\n //Behavior configuration:\n _allowDiagonals: boolean;\n _acceleration: float;\n _maxSpeed: float;\n _angularMaxSpeed: float;\n _rotateObject: boolean;\n _angleOffset: float;\n _cellWidth: float;\n _cellHeight: float;\n _gridOffsetX: float;\n _gridOffsetY: float;\n _extraBorder: float;\n _smoothingMaxCellGap: float;\n\n //Attributes used for traveling on the path:\n _pathFound: boolean = false;\n _speed: float = 0;\n _angularSpeed: float = 0;\n _distanceOnSegment: float = 0;\n _totalSegmentDistance: float = 0;\n _currentSegment: integer = 0;\n _reachedEnd: boolean = false;\n _manager: PathfindingObstaclesManager;\n _searchContext: PathfindingRuntimeBehavior.SearchContext;\n\n _movementAngle: float = 0;\n\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n behaviorData,\n owner: gdjs.RuntimeObject\n ) {\n super(instanceContainer, behaviorData, owner);\n\n //The path computed and followed by the object (Array of arrays containing x and y position)\n if (this._path === undefined) {\n } else {\n this._path.length = 0;\n }\n this._allowDiagonals = behaviorData.allowDiagonals;\n this._acceleration = behaviorData.acceleration;\n this._maxSpeed = behaviorData.maxSpeed;\n this._angularMaxSpeed = behaviorData.angularMaxSpeed;\n this._rotateObject = behaviorData.rotateObject;\n this._angleOffset = behaviorData.angleOffset;\n this._cellWidth = behaviorData.cellWidth;\n this._cellHeight = behaviorData.cellHeight;\n this._gridOffsetX = behaviorData.gridOffsetX || 0;\n this._gridOffsetY = behaviorData.gridOffsetY || 0;\n this._extraBorder = behaviorData.extraBorder;\n this._smoothingMaxCellGap = behaviorData.smoothingMaxCellGap || 0;\n this._manager = gdjs.PathfindingObstaclesManager.getManager(\n instanceContainer\n );\n this._searchContext = new gdjs.PathfindingRuntimeBehavior.SearchContext(\n this._manager\n );\n }\n\n updateFromBehaviorData(oldBehaviorData, newBehaviorData): boolean {\n if (oldBehaviorData.allowDiagonals !== newBehaviorData.allowDiagonals) {\n this.allowDiagonals(newBehaviorData.allowDiagonals);\n }\n if (oldBehaviorData.acceleration !== newBehaviorData.acceleration) {\n this.setAcceleration(newBehaviorData.acceleration);\n }\n if (oldBehaviorData.maxSpeed !== newBehaviorData.maxSpeed) {\n this.setMaxSpeed(newBehaviorData.maxSpeed);\n }\n if (oldBehaviorData.angularMaxSpeed !== newBehaviorData.angularMaxSpeed) {\n this.setAngularMaxSpeed(newBehaviorData.angularMaxSpeed);\n }\n if (oldBehaviorData.rotateObject !== newBehaviorData.rotateObject) {\n this.setRotateObject(newBehaviorData.rotateObject);\n }\n if (oldBehaviorData.angleOffset !== newBehaviorData.angleOffset) {\n this.setAngleOffset(newBehaviorData.angleOffset);\n }\n if (oldBehaviorData.cellWidth !== newBehaviorData.cellWidth) {\n this.setCellWidth(newBehaviorData.cellWidth);\n }\n if (oldBehaviorData.cellHeight !== newBehaviorData.cellHeight) {\n this.setCellHeight(newBehaviorData.cellHeight);\n }\n if (oldBehaviorData.gridOffsetX !== newBehaviorData.gridOffsetX) {\n this._gridOffsetX = newBehaviorData.gridOffsetX;\n }\n if (oldBehaviorData.gridOffsetY !== newBehaviorData.gridOffsetY) {\n this._gridOffsetY = newBehaviorData.gridOffsetY;\n }\n if (oldBehaviorData.extraBorder !== newBehaviorData.extraBorder) {\n this.setExtraBorder(newBehaviorData.extraBorder);\n }\n if (\n oldBehaviorData.smoothingMaxCellGap !==\n newBehaviorData.smoothingMaxCellGap\n ) {\n this._smoothingMaxCellGap = newBehaviorData.smoothingMaxCellGap;\n }\n return true;\n }\n\n setCellWidth(width: float): void {\n this._cellWidth = width;\n }\n\n getCellWidth(): float {\n return this._cellWidth;\n }\n\n setCellHeight(height: float): void {\n this._cellHeight = height;\n }\n\n getCellHeight(): float {\n return this._cellHeight;\n }\n\n setGridOffsetX(gridOffsetX: float): void {\n this._gridOffsetX = gridOffsetX;\n }\n\n getGridOffsetX(): float {\n return this._gridOffsetX;\n }\n\n setGridOffsetY(gridOffsetY: float): void {\n this._gridOffsetY = gridOffsetY;\n }\n\n getGridOffsetY(): float {\n return this._gridOffsetY;\n }\n\n setAcceleration(acceleration: float): void {\n this._acceleration = acceleration;\n }\n\n getAcceleration() {\n return this._acceleration;\n }\n\n setMaxSpeed(maxSpeed: float): void {\n this._maxSpeed = maxSpeed;\n }\n\n getMaxSpeed() {\n return this._maxSpeed;\n }\n\n setSpeed(speed: float): void {\n this._speed = speed;\n }\n\n getSpeed() {\n return this._speed;\n }\n\n getMovementAngle() {\n return this._movementAngle;\n }\n\n movementAngleIsAround(degreeAngle: float, tolerance: float) {\n return (\n Math.abs(\n gdjs.evtTools.common.angleDifference(this._movementAngle, degreeAngle)\n ) <= tolerance\n );\n }\n\n setAngularMaxSpeed(angularMaxSpeed: float): void {\n this._angularMaxSpeed = angularMaxSpeed;\n }\n\n getAngularMaxSpeed() {\n return this._angularMaxSpeed;\n }\n\n setAngleOffset(angleOffset: float): void {\n this._angleOffset = angleOffset;\n }\n\n getAngleOffset() {\n return this._angleOffset;\n }\n\n setExtraBorder(extraBorder): void {\n this._extraBorder = extraBorder;\n }\n\n getExtraBorder() {\n return this._extraBorder;\n }\n\n allowDiagonals(allow: boolean) {\n this._allowDiagonals = allow;\n }\n\n diagonalsAllowed() {\n return this._allowDiagonals;\n }\n\n setRotateObject(allow: boolean): void {\n this._rotateObject = allow;\n }\n\n isObjectRotated(): boolean {\n return this._rotateObject;\n }\n\n getNodeX(index: integer): float {\n if (index < this._path.length) {\n return this._path[index][0];\n }\n return 0;\n }\n\n getNodeY(index: integer): float {\n if (index < this._path.length) {\n return this._path[index][1];\n }\n return 0;\n }\n\n getNextNodeIndex() {\n if (this._currentSegment + 1 < this._path.length) {\n return this._currentSegment + 1;\n } else {\n return this._path.length - 1;\n }\n }\n\n getNodeCount(): integer {\n return this._path.length;\n }\n\n getNextNodeX(): float {\n if (this._path.length === 0) {\n return 0;\n }\n if (this._currentSegment + 1 < this._path.length) {\n return this._path[this._currentSegment + 1][0];\n } else {\n return this._path[this._path.length - 1][0];\n }\n }\n\n getNextNodeY(): float {\n if (this._path.length === 0) {\n return 0;\n }\n if (this._currentSegment + 1 < this._path.length) {\n return this._path[this._currentSegment + 1][1];\n } else {\n return this._path[this._path.length - 1][1];\n }\n }\n\n getLastNodeX(): float {\n if (this._path.length < 2) {\n return 0;\n }\n if (this._currentSegment < this._path.length - 1) {\n return this._path[this._currentSegment][0];\n } else {\n return this._path[this._path.length - 1][0];\n }\n }\n\n getLastNodeY(): float {\n if (this._path.length < 2) {\n return 0;\n }\n if (this._currentSegment < this._path.length - 1) {\n return this._path[this._currentSegment][1];\n } else {\n return this._path[this._path.length - 1][1];\n }\n }\n\n getDestinationX(): float {\n if (this._path.length === 0) {\n return 0;\n }\n return this._path[this._path.length - 1][0];\n }\n\n getDestinationY(): float {\n if (this._path.length === 0) {\n return 0;\n }\n return this._path[this._path.length - 1][1];\n }\n\n /**\n * Return true if the latest call to moveTo succeeded.\n */\n pathFound() {\n return this._pathFound;\n }\n\n /**\n * Return true if the object reached its destination.\n */\n destinationReached() {\n return this._reachedEnd;\n }\n\n /**\n * Compute and move on the path to the specified destination.\n */\n moveTo(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n x: float,\n y: float\n ) {\n const owner = this.owner;\n\n //First be sure that there is a path to compute.\n const targetCellX = Math.round((x - this._gridOffsetX) / this._cellWidth);\n const targetCellY = Math.round(\n (y - this._gridOffsetY) / this._cellHeight\n );\n const startCellX = Math.round(\n (owner.getX() - this._gridOffsetX) / this._cellWidth\n );\n const startCellY = Math.round(\n (owner.getY() - this._gridOffsetY) / this._cellHeight\n );\n if (startCellX == targetCellX && startCellY == targetCellY) {\n this._path.length = 0;\n this._path.push([owner.getX(), owner.getY()]);\n this._path.push([x, y]);\n this._enterSegment(0);\n this._pathFound = true;\n return;\n }\n\n //Start searching for a path\n this._searchContext.allowDiagonals(this._allowDiagonals);\n this._searchContext.setObstacles(this._manager);\n this._searchContext.setCellSize(this._cellWidth, this._cellHeight);\n this._searchContext.setGridOffset(this._gridOffsetX, this._gridOffsetY);\n this._searchContext.setStartPosition(owner.getX(), owner.getY());\n this._searchContext.setObjectSize(\n owner.getX() - owner.getDrawableX() + this._extraBorder,\n owner.getY() - owner.getDrawableY() + this._extraBorder,\n owner.getWidth() -\n (owner.getX() - owner.getDrawableX()) +\n this._extraBorder,\n owner.getHeight() -\n (owner.getY() - owner.getDrawableY()) +\n this._extraBorder\n );\n if (this._searchContext.computePathTo(x, y)) {\n //Path found: memorize it\n let node = this._searchContext.getFinalNode();\n let finalPathLength = 0;\n while (node) {\n if (finalPathLength === this._path.length) {\n this._path.push([0, 0]);\n }\n this._path[finalPathLength][0] =\n node.pos[0] * this._cellWidth + this._gridOffsetX;\n this._path[finalPathLength][1] =\n node.pos[1] * this._cellHeight + this._gridOffsetY;\n node = node.parent;\n finalPathLength++;\n }\n this._path.length = finalPathLength;\n this._path.reverse();\n this._path[0][0] = owner.getX();\n this._path[0][1] = owner.getY();\n\n if (this._allowDiagonals && this._smoothingMaxCellGap > 0) {\n gdjs.pathfinding.simplifyPath(\n this._path,\n this._smoothingMaxCellGap *\n Math.min(this._cellWidth, this._cellHeight),\n gdjs.PathfindingRuntimeBehavior._smoothingResultVertices,\n gdjs.PathfindingRuntimeBehavior._smoothingWorkingVertices\n );\n let swapArray = this._path;\n this._path = gdjs.PathfindingRuntimeBehavior._smoothingResultVertices;\n gdjs.PathfindingRuntimeBehavior._smoothingResultVertices = swapArray;\n }\n\n this._enterSegment(0);\n this._pathFound = true;\n return;\n }\n\n //Not path found\n this._pathFound = false;\n }\n\n _enterSegment(segmentNumber: integer) {\n if (this._path.length === 0) {\n return;\n }\n this._currentSegment = segmentNumber;\n if (this._currentSegment < this._path.length - 1) {\n const pathX =\n this._path[this._currentSegment + 1][0] -\n this._path[this._currentSegment][0];\n const pathY =\n this._path[this._currentSegment + 1][1] -\n this._path[this._currentSegment][1];\n this._totalSegmentDistance = Math.sqrt(pathX * pathX + pathY * pathY);\n this._distanceOnSegment = 0;\n this._reachedEnd = false;\n this._movementAngle =\n (gdjs.toDegrees(Math.atan2(pathY, pathX)) + 360) % 360;\n } else {\n this._reachedEnd = true;\n this._speed = 0;\n }\n }\n\n doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {\n if (this._path.length === 0 || this._reachedEnd) {\n return;\n }\n\n // Update the speed of the object\n const timeDelta = this.owner.getElapsedTime() / 1000;\n const previousSpeed = this._speed;\n if (this._speed !== this._maxSpeed) {\n this._speed += this._acceleration * timeDelta;\n if (this._speed > this._maxSpeed) {\n this._speed = this._maxSpeed;\n }\n }\n this._angularSpeed = this._angularMaxSpeed;\n\n // Update the time on the segment and change segment if needed\n // Use a Verlet integration to be frame rate independent.\n this._distanceOnSegment +=\n ((this._speed + previousSpeed) / 2) * timeDelta;\n const remainingDistanceOnSegment =\n this._totalSegmentDistance - this._distanceOnSegment;\n if (\n remainingDistanceOnSegment <= 0 &&\n this._currentSegment < this._path.length\n ) {\n this._enterSegment(this._currentSegment + 1);\n this._distanceOnSegment = -remainingDistanceOnSegment;\n }\n\n // Position object on the segment and update its angle\n let newPos = [0, 0];\n if (this._currentSegment < this._path.length - 1) {\n newPos[0] = gdjs.evtTools.common.lerp(\n this._path[this._currentSegment][0],\n this._path[this._currentSegment + 1][0],\n this._distanceOnSegment / this._totalSegmentDistance\n );\n newPos[1] = gdjs.evtTools.common.lerp(\n this._path[this._currentSegment][1],\n this._path[this._currentSegment + 1][1],\n this._distanceOnSegment / this._totalSegmentDistance\n );\n if (\n this._rotateObject &&\n this.owner.getAngle() !== this._movementAngle + this._angleOffset\n ) {\n this.owner.rotateTowardAngle(\n this._movementAngle + this._angleOffset,\n this._angularSpeed\n );\n }\n } else {\n newPos = this._path[this._path.length - 1];\n }\n this.owner.setX(newPos[0]);\n this.owner.setY(newPos[1]);\n }\n\n doStepPostEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {}\n\n /**\n * Compute the euclidean distance between two positions.\n * @memberof gdjs.PathfindingRuntimeBehavior\n */\n static euclideanDistance(a: FloatPoint, b: FloatPoint) {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1])\n );\n }\n\n /**\n * Compute the taxi distance between two positions.\n * @memberof gdjs.PathfindingRuntimeBehavior\n */\n static manhattanDistance(a: FloatPoint, b: FloatPoint) {\n return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n }\n }\n gdjs.registerBehavior(\n 'PathfindingBehavior::PathfindingBehavior',\n gdjs.PathfindingRuntimeBehavior\n );\n\n export namespace PathfindingRuntimeBehavior {\n /**\n * Internal tool class representing a node when looking for a path\n */\n export class Node {\n pos: FloatPoint;\n cost: integer = 0;\n smallestCost: integer = -1;\n estimateCost: integer = -1;\n parent: Node | null = null;\n open: boolean = true;\n\n constructor(xPos: integer, yPos: integer) {\n this.pos = [xPos, yPos];\n }\n\n reinitialize(xPos: integer, yPos: integer) {\n this.pos[0] = xPos;\n this.pos[1] = yPos;\n this.cost = 0;\n this.smallestCost = -1;\n this.estimateCost = -1;\n this.parent = null;\n this.open = true;\n }\n }\n\n /**\n * Internal tool class containing the structures used by A* and members functions related\n * to them.\n * @ignore\n */\n export class SearchContext {\n _obstacles: PathfindingObstaclesManager;\n _finalNode: Node | null = null;\n _destination: FloatPoint = [0, 0];\n _start: FloatPoint = [0, 0];\n _startX: float = 0;\n _startY: float = 0;\n _allowDiagonals: boolean = true;\n _maxComplexityFactor: integer = 50;\n _cellWidth: float = 20;\n _cellHeight: float = 20;\n _gridOffsetX: float = 0;\n _gridOffsetY: float = 0;\n\n _leftBorder: integer = 0;\n _rightBorder: integer = 0;\n _topBorder: integer = 0;\n _bottomBorder: integer = 0;\n _distanceFunction: (pt1: FloatPoint, pt2: FloatPoint) => float;\n //An array of array. Nodes are indexed by their x position, and then by their y position.\n _allNodes: Node[][] = [];\n //An array of nodes sorted by their estimate cost (First node = Lower estimate cost).\n _openNodes: Node[] = [];\n //Used by getNodes to temporarily store obstacles near a position.\n _closeObstacles: gdjs.PathfindingObstacleRuntimeBehavior[] = [];\n //Old nodes constructed in a previous search are stored here to avoid temporary objects (see _freeAllNodes method).\n _nodeCache: Node[] = [];\n\n constructor(obstacles: PathfindingObstaclesManager) {\n this._obstacles = obstacles;\n this._distanceFunction = PathfindingRuntimeBehavior.euclideanDistance;\n }\n\n setObstacles(\n obstacles: PathfindingObstaclesManager\n ): PathfindingRuntimeBehavior.SearchContext {\n this._obstacles = obstacles;\n return this;\n }\n\n getFinalNode() {\n return this._finalNode;\n }\n\n allowDiagonals(allowDiagonals: boolean) {\n this._allowDiagonals = allowDiagonals;\n this._distanceFunction = allowDiagonals\n ? PathfindingRuntimeBehavior.euclideanDistance\n : PathfindingRuntimeBehavior.manhattanDistance;\n return this;\n }\n\n setStartPosition(\n x: float,\n y: float\n ): PathfindingRuntimeBehavior.SearchContext {\n this._startX = x;\n this._startY = y;\n return this;\n }\n\n setObjectSize(\n leftBorder: integer,\n topBorder: integer,\n rightBorder: integer,\n bottomBorder: integer\n ): PathfindingRuntimeBehavior.SearchContext {\n this._leftBorder = leftBorder;\n this._rightBorder = rightBorder;\n this._topBorder = topBorder;\n this._bottomBorder = bottomBorder;\n return this;\n }\n\n setCellSize(\n cellWidth: float,\n cellHeight: float\n ): PathfindingRuntimeBehavior.SearchContext {\n this._cellWidth = cellWidth;\n this._cellHeight = cellHeight;\n return this;\n }\n\n setGridOffset(\n gridOffsetX: float,\n gridOffsetY: float\n ): PathfindingRuntimeBehavior.SearchContext {\n this._gridOffsetX = gridOffsetX;\n this._gridOffsetY = gridOffsetY;\n return this;\n }\n\n computePathTo(targetX: float, targetY: float) {\n if (this._obstacles === null) {\n logger.log(\n 'You tried to compute a path without specifying the obstacles'\n );\n return;\n }\n this._destination[0] = Math.round(\n (targetX - this._gridOffsetX) / this._cellWidth\n );\n this._destination[1] = Math.round(\n (targetY - this._gridOffsetY) / this._cellHeight\n );\n this._start[0] = Math.round(\n (this._startX - this._gridOffsetX) / this._cellWidth\n );\n this._start[1] = Math.round(\n (this._startY - this._gridOffsetY) / this._cellHeight\n );\n\n //Initialize the algorithm\n this._freeAllNodes();\n const startNode = this._getNode(this._start[0], this._start[1]);\n startNode.smallestCost = 0;\n startNode.estimateCost =\n 0 + this._distanceFunction(this._start, this._destination);\n this._openNodes.length = 0;\n this._openNodes.push(startNode);\n\n //A* algorithm main loop\n let iterationCount = 0;\n const maxIterationCount =\n startNode.estimateCost * this._maxComplexityFactor;\n while (this._openNodes.length !== 0) {\n //Make sure we do not search forever.\n if (iterationCount++ > maxIterationCount) {\n console.warn(\n `No path was found after covering ${maxIterationCount} cells.`\n );\n return false;\n }\n\n //Get the most promising node...\n const n = this._openNodes.shift()!;\n //...and flag it as explored\n n.open = false;\n\n //Check if we reached destination?\n if (\n n.pos[0] == this._destination[0] &&\n n.pos[1] == this._destination[1]\n ) {\n this._finalNode = n;\n return true;\n }\n\n //No, so add neighbors to the nodes to explore.\n this._insertNeighbors(n);\n }\n return false;\n }\n\n _freeAllNodes() {\n if (this._nodeCache.length <= 32000) {\n for (const i in this._allNodes) {\n if (this._allNodes.hasOwnProperty(i)) {\n const nodeArray = this._allNodes[i];\n for (const j in nodeArray) {\n if (nodeArray.hasOwnProperty(j)) {\n this._nodeCache.push(nodeArray[j]);\n }\n }\n }\n }\n }\n this._allNodes = [];\n }\n\n /**\n * Insert the neighbors of the current node in the open list\n * (Only if they are not closed, and if the cost is better than the already existing smallest cost).\n */\n _insertNeighbors(currentNode: Node) {\n this._addOrUpdateNode(\n currentNode.pos[0] + 1,\n currentNode.pos[1],\n currentNode,\n 1\n );\n this._addOrUpdateNode(\n currentNode.pos[0] - 1,\n currentNode.pos[1],\n currentNode,\n 1\n );\n this._addOrUpdateNode(\n currentNode.pos[0],\n currentNode.pos[1] + 1,\n currentNode,\n 1\n );\n this._addOrUpdateNode(\n currentNode.pos[0],\n currentNode.pos[1] - 1,\n currentNode,\n 1\n );\n if (this._allowDiagonals) {\n this._addOrUpdateNode(\n currentNode.pos[0] + 1,\n currentNode.pos[1] + 1,\n currentNode,\n 1.414213562\n );\n this._addOrUpdateNode(\n currentNode.pos[0] + 1,\n currentNode.pos[1] - 1,\n currentNode,\n 1.414213562\n );\n this._addOrUpdateNode(\n currentNode.pos[0] - 1,\n currentNode.pos[1] - 1,\n currentNode,\n 1.414213562\n );\n this._addOrUpdateNode(\n currentNode.pos[0] - 1,\n currentNode.pos[1] + 1,\n currentNode,\n 1.414213562\n );\n }\n }\n\n /**\n * Get (or dynamically construct) a node.\n *\n * *All* nodes should be created using this method: The cost of the node is computed thanks\n * to the objects flagged as obstacles.\n */\n _getNode(xPos: integer, yPos: integer): Node {\n //First check if their is a node a the specified position.\n if (this._allNodes.hasOwnProperty(xPos)) {\n if (this._allNodes[xPos].hasOwnProperty(yPos)) {\n return this._allNodes[xPos][yPos];\n }\n } else {\n this._allNodes[xPos] = [];\n }\n\n //No so construct a new node (or get it from the cache)...\n let newNode: Node;\n if (this._nodeCache.length !== 0) {\n newNode = this._nodeCache.shift()!;\n newNode.reinitialize(xPos, yPos);\n } else {\n newNode = new Node(xPos, yPos);\n }\n\n const nodeCenterX = xPos * this._cellWidth + this._gridOffsetX;\n const nodeCenterY = yPos * this._cellHeight + this._gridOffsetY;\n\n //...and update its cost according to obstacles\n let objectsOnCell = false;\n const radius =\n this._cellHeight > this._cellWidth\n ? this._cellHeight * 2\n : this._cellWidth * 2;\n this._obstacles.getAllObstaclesAround(\n nodeCenterX,\n nodeCenterY,\n radius,\n this._closeObstacles\n );\n for (let k = 0; k < this._closeObstacles.length; ++k) {\n const obj = this._closeObstacles[k].owner;\n const topLeftCellX = Math.floor(\n (obj.getDrawableX() - this._rightBorder - this._gridOffsetX) /\n this._cellWidth\n );\n const topLeftCellY = Math.floor(\n (obj.getDrawableY() - this._bottomBorder - this._gridOffsetY) /\n this._cellHeight\n );\n const bottomRightCellX = Math.ceil(\n (obj.getDrawableX() +\n obj.getWidth() +\n this._leftBorder -\n this._gridOffsetX) /\n this._cellWidth\n );\n const bottomRightCellY = Math.ceil(\n (obj.getDrawableY() +\n obj.getHeight() +\n this._topBorder -\n this._gridOffsetY) /\n this._cellHeight\n );\n if (\n topLeftCellX < xPos &&\n xPos < bottomRightCellX &&\n topLeftCellY < yPos &&\n yPos < bottomRightCellY\n ) {\n objectsOnCell = true;\n if (this._closeObstacles[k].isImpassable()) {\n //The cell is impassable, stop here.\n newNode.cost = -1;\n break;\n } else {\n //Superimpose obstacles\n newNode.cost += this._closeObstacles[k].getCost();\n }\n }\n }\n if (!objectsOnCell) {\n newNode.cost = 1;\n }\n\n //Default cost when no objects put on the cell.\n this._allNodes[xPos][yPos] = newNode;\n return newNode;\n }\n\n /**\n * Add a node to the openNodes (only if the cost to reach it is less than the existing cost, if any).\n */\n _addOrUpdateNode(\n newNodeX: integer,\n newNodeY: integer,\n currentNode: Node,\n factor: float\n ) {\n const neighbor = this._getNode(newNodeX, newNodeY);\n\n //cost < 0 means impassable obstacle\n if (!neighbor.open || neighbor.cost < 0) {\n return;\n }\n\n //Update the node costs and parent if the path coming from currentNode is better:\n if (\n neighbor.smallestCost === -1 ||\n neighbor.smallestCost >\n currentNode.smallestCost +\n ((currentNode.cost + neighbor.cost) / 2.0) * factor\n ) {\n if (neighbor.smallestCost != -1) {\n //The node is already in the open list..\n for (let i = 0; i < this._openNodes.length; ++i) {\n if (\n this._openNodes[i].pos[0] == neighbor.pos[0] &&\n this._openNodes[i].pos[1] == neighbor.pos[1]\n ) {\n this._openNodes.splice(\n i,\n //..so remove it as its estimate cost will be updated.\n 1\n );\n break;\n }\n }\n }\n neighbor.smallestCost =\n currentNode.smallestCost +\n ((currentNode.cost + neighbor.cost) / 2.0) * factor;\n neighbor.parent = currentNode;\n neighbor.estimateCost =\n neighbor.smallestCost +\n this._distanceFunction(neighbor.pos, this._destination);\n\n //Add the neighbor to open nodes, which are sorted by their estimate cost:\n if (\n this._openNodes.length === 0 ||\n this._openNodes[this._openNodes.length - 1].estimateCost <\n neighbor.estimateCost\n ) {\n this._openNodes.push(neighbor);\n } else {\n for (let i = 0; i < this._openNodes.length; ++i) {\n if (this._openNodes[i].estimateCost >= neighbor.estimateCost) {\n this._openNodes.splice(i, 0, neighbor);\n break;\n }\n }\n }\n }\n }\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nGDevelop - Pathfinding Behavior Extension\nCopyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)\n */\nnamespace gdjs {\n const logger = new gdjs.Logger('Pathfinding behavior');\n\n interface PathfindingNetworkSyncDataType {\n // Syncing the path should be enough to have a good prediction.\n path: FloatPoint[];\n pf: boolean;\n sp: number;\n as: number;\n cs: number;\n tss: number;\n re: boolean;\n ma: number;\n }\n\n export interface PathfindingNetworkSyncData extends BehaviorNetworkSyncData {\n props: PathfindingNetworkSyncDataType;\n }\n\n /**\n * PathfindingRuntimeBehavior represents a behavior allowing objects to\n * follow a path computed to avoid obstacles.\n */\n export class PathfindingRuntimeBehavior extends gdjs.RuntimeBehavior {\n _path: Array<FloatPoint> = [];\n /** Used by the path simplification algorithm */\n static _smoothingResultVertices: Array<FloatPoint> = [];\n /** Used by the path simplification algorithm */\n static _smoothingWorkingVertices: Array<FloatPoint> = [];\n\n //Behavior configuration:\n _allowDiagonals: boolean;\n _acceleration: float;\n _maxSpeed: float;\n _angularMaxSpeed: float;\n _rotateObject: boolean;\n _angleOffset: float;\n _cellWidth: float;\n _cellHeight: float;\n _gridOffsetX: float;\n _gridOffsetY: float;\n _extraBorder: float;\n _smoothingMaxCellGap: float;\n\n //Attributes used for traveling on the path:\n _pathFound: boolean = false;\n _speed: float = 0;\n _angularSpeed: float = 0;\n _distanceOnSegment: float = 0;\n _totalSegmentDistance: float = 0;\n _currentSegment: integer = 0;\n _reachedEnd: boolean = false;\n _manager: PathfindingObstaclesManager;\n _searchContext: PathfindingRuntimeBehavior.SearchContext;\n\n _movementAngle: float = 0;\n\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n behaviorData,\n owner: gdjs.RuntimeObject\n ) {\n super(instanceContainer, behaviorData, owner);\n\n //The path computed and followed by the object (Array of arrays containing x and y position)\n if (this._path === undefined) {\n } else {\n this._path.length = 0;\n }\n this._allowDiagonals = behaviorData.allowDiagonals;\n this._acceleration = behaviorData.acceleration;\n this._maxSpeed = behaviorData.maxSpeed;\n this._angularMaxSpeed = behaviorData.angularMaxSpeed;\n this._rotateObject = behaviorData.rotateObject;\n this._angleOffset = behaviorData.angleOffset;\n this._cellWidth = behaviorData.cellWidth;\n this._cellHeight = behaviorData.cellHeight;\n this._gridOffsetX = behaviorData.gridOffsetX || 0;\n this._gridOffsetY = behaviorData.gridOffsetY || 0;\n this._extraBorder = behaviorData.extraBorder;\n this._smoothingMaxCellGap = behaviorData.smoothingMaxCellGap || 0;\n this._manager = gdjs.PathfindingObstaclesManager.getManager(\n instanceContainer\n );\n this._searchContext = new gdjs.PathfindingRuntimeBehavior.SearchContext(\n this._manager\n );\n }\n\n updateFromBehaviorData(oldBehaviorData, newBehaviorData): boolean {\n if (oldBehaviorData.allowDiagonals !== newBehaviorData.allowDiagonals) {\n this.allowDiagonals(newBehaviorData.allowDiagonals);\n }\n if (oldBehaviorData.acceleration !== newBehaviorData.acceleration) {\n this.setAcceleration(newBehaviorData.acceleration);\n }\n if (oldBehaviorData.maxSpeed !== newBehaviorData.maxSpeed) {\n this.setMaxSpeed(newBehaviorData.maxSpeed);\n }\n if (oldBehaviorData.angularMaxSpeed !== newBehaviorData.angularMaxSpeed) {\n this.setAngularMaxSpeed(newBehaviorData.angularMaxSpeed);\n }\n if (oldBehaviorData.rotateObject !== newBehaviorData.rotateObject) {\n this.setRotateObject(newBehaviorData.rotateObject);\n }\n if (oldBehaviorData.angleOffset !== newBehaviorData.angleOffset) {\n this.setAngleOffset(newBehaviorData.angleOffset);\n }\n if (oldBehaviorData.cellWidth !== newBehaviorData.cellWidth) {\n this.setCellWidth(newBehaviorData.cellWidth);\n }\n if (oldBehaviorData.cellHeight !== newBehaviorData.cellHeight) {\n this.setCellHeight(newBehaviorData.cellHeight);\n }\n if (oldBehaviorData.gridOffsetX !== newBehaviorData.gridOffsetX) {\n this._gridOffsetX = newBehaviorData.gridOffsetX;\n }\n if (oldBehaviorData.gridOffsetY !== newBehaviorData.gridOffsetY) {\n this._gridOffsetY = newBehaviorData.gridOffsetY;\n }\n if (oldBehaviorData.extraBorder !== newBehaviorData.extraBorder) {\n this.setExtraBorder(newBehaviorData.extraBorder);\n }\n if (\n oldBehaviorData.smoothingMaxCellGap !==\n newBehaviorData.smoothingMaxCellGap\n ) {\n this._smoothingMaxCellGap = newBehaviorData.smoothingMaxCellGap;\n }\n return true;\n }\n\n getNetworkSyncData(): PathfindingNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n props: {\n path: this._path,\n pf: this._pathFound,\n sp: this._speed,\n as: this._angularSpeed,\n cs: this._currentSegment,\n tss: this._totalSegmentDistance,\n re: this._reachedEnd,\n ma: this._movementAngle,\n },\n };\n }\n\n updateFromNetworkSyncData(\n networkSyncData: PathfindingNetworkSyncData\n ): void {\n super.updateFromNetworkSyncData(networkSyncData);\n const behaviorSpecificProps = networkSyncData.props;\n if (behaviorSpecificProps.path !== undefined) {\n this._path = behaviorSpecificProps.path;\n }\n if (behaviorSpecificProps.pf !== undefined) {\n this._pathFound = behaviorSpecificProps.pf;\n }\n if (behaviorSpecificProps.sp !== undefined) {\n this._speed = behaviorSpecificProps.sp;\n }\n if (behaviorSpecificProps.as !== undefined) {\n this._angularSpeed = behaviorSpecificProps.as;\n }\n if (\n behaviorSpecificProps.cs !== undefined &&\n behaviorSpecificProps.cs !== this._currentSegment\n ) {\n this._currentSegment = behaviorSpecificProps.cs;\n }\n if (behaviorSpecificProps.tss !== undefined) {\n this._totalSegmentDistance = behaviorSpecificProps.tss;\n }\n if (behaviorSpecificProps.re !== undefined) {\n this._reachedEnd = behaviorSpecificProps.re;\n }\n if (behaviorSpecificProps.ma !== undefined) {\n this._movementAngle = behaviorSpecificProps.ma;\n }\n }\n\n setCellWidth(width: float): void {\n this._cellWidth = width;\n }\n\n getCellWidth(): float {\n return this._cellWidth;\n }\n\n setCellHeight(height: float): void {\n this._cellHeight = height;\n }\n\n getCellHeight(): float {\n return this._cellHeight;\n }\n\n setGridOffsetX(gridOffsetX: float): void {\n this._gridOffsetX = gridOffsetX;\n }\n\n getGridOffsetX(): float {\n return this._gridOffsetX;\n }\n\n setGridOffsetY(gridOffsetY: float): void {\n this._gridOffsetY = gridOffsetY;\n }\n\n getGridOffsetY(): float {\n return this._gridOffsetY;\n }\n\n setAcceleration(acceleration: float): void {\n this._acceleration = acceleration;\n }\n\n getAcceleration() {\n return this._acceleration;\n }\n\n setMaxSpeed(maxSpeed: float): void {\n this._maxSpeed = maxSpeed;\n }\n\n getMaxSpeed() {\n return this._maxSpeed;\n }\n\n setSpeed(speed: float): void {\n this._speed = speed;\n }\n\n getSpeed() {\n return this._speed;\n }\n\n getMovementAngle() {\n return this._movementAngle;\n }\n\n movementAngleIsAround(degreeAngle: float, tolerance: float) {\n return (\n Math.abs(\n gdjs.evtTools.common.angleDifference(this._movementAngle, degreeAngle)\n ) <= tolerance\n );\n }\n\n setAngularMaxSpeed(angularMaxSpeed: float): void {\n this._angularMaxSpeed = angularMaxSpeed;\n }\n\n getAngularMaxSpeed() {\n return this._angularMaxSpeed;\n }\n\n setAngleOffset(angleOffset: float): void {\n this._angleOffset = angleOffset;\n }\n\n getAngleOffset() {\n return this._angleOffset;\n }\n\n setExtraBorder(extraBorder): void {\n this._extraBorder = extraBorder;\n }\n\n getExtraBorder() {\n return this._extraBorder;\n }\n\n allowDiagonals(allow: boolean) {\n this._allowDiagonals = allow;\n }\n\n diagonalsAllowed() {\n return this._allowDiagonals;\n }\n\n setRotateObject(allow: boolean): void {\n this._rotateObject = allow;\n }\n\n isObjectRotated(): boolean {\n return this._rotateObject;\n }\n\n getNodeX(index: integer): float {\n if (index < this._path.length) {\n return this._path[index][0];\n }\n return 0;\n }\n\n getNodeY(index: integer): float {\n if (index < this._path.length) {\n return this._path[index][1];\n }\n return 0;\n }\n\n getNextNodeIndex() {\n if (this._currentSegment + 1 < this._path.length) {\n return this._currentSegment + 1;\n } else {\n return this._path.length - 1;\n }\n }\n\n getNodeCount(): integer {\n return this._path.length;\n }\n\n getNextNodeX(): float {\n if (this._path.length === 0) {\n return 0;\n }\n if (this._currentSegment + 1 < this._path.length) {\n return this._path[this._currentSegment + 1][0];\n } else {\n return this._path[this._path.length - 1][0];\n }\n }\n\n getNextNodeY(): float {\n if (this._path.length === 0) {\n return 0;\n }\n if (this._currentSegment + 1 < this._path.length) {\n return this._path[this._currentSegment + 1][1];\n } else {\n return this._path[this._path.length - 1][1];\n }\n }\n\n getLastNodeX(): float {\n if (this._path.length < 2) {\n return 0;\n }\n if (this._currentSegment < this._path.length - 1) {\n return this._path[this._currentSegment][0];\n } else {\n return this._path[this._path.length - 1][0];\n }\n }\n\n getLastNodeY(): float {\n if (this._path.length < 2) {\n return 0;\n }\n if (this._currentSegment < this._path.length - 1) {\n return this._path[this._currentSegment][1];\n } else {\n return this._path[this._path.length - 1][1];\n }\n }\n\n getDestinationX(): float {\n if (this._path.length === 0) {\n return 0;\n }\n return this._path[this._path.length - 1][0];\n }\n\n getDestinationY(): float {\n if (this._path.length === 0) {\n return 0;\n }\n return this._path[this._path.length - 1][1];\n }\n\n /**\n * Return true if the latest call to moveTo succeeded.\n */\n pathFound() {\n return this._pathFound;\n }\n\n /**\n * Return true if the object reached its destination.\n */\n destinationReached() {\n return this._reachedEnd;\n }\n\n /**\n * Compute and move on the path to the specified destination.\n */\n moveTo(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n x: float,\n y: float\n ) {\n const owner = this.owner;\n\n //First be sure that there is a path to compute.\n const targetCellX = Math.round((x - this._gridOffsetX) / this._cellWidth);\n const targetCellY = Math.round(\n (y - this._gridOffsetY) / this._cellHeight\n );\n const startCellX = Math.round(\n (owner.getX() - this._gridOffsetX) / this._cellWidth\n );\n const startCellY = Math.round(\n (owner.getY() - this._gridOffsetY) / this._cellHeight\n );\n if (startCellX == targetCellX && startCellY == targetCellY) {\n this._path.length = 0;\n this._path.push([owner.getX(), owner.getY()]);\n this._path.push([x, y]);\n this._enterSegment(0);\n this._pathFound = true;\n return;\n }\n\n //Start searching for a path\n this._searchContext.allowDiagonals(this._allowDiagonals);\n this._searchContext.setObstacles(this._manager);\n this._searchContext.setCellSize(this._cellWidth, this._cellHeight);\n this._searchContext.setGridOffset(this._gridOffsetX, this._gridOffsetY);\n this._searchContext.setStartPosition(owner.getX(), owner.getY());\n this._searchContext.setObjectSize(\n owner.getX() - owner.getDrawableX() + this._extraBorder,\n owner.getY() - owner.getDrawableY() + this._extraBorder,\n owner.getWidth() -\n (owner.getX() - owner.getDrawableX()) +\n this._extraBorder,\n owner.getHeight() -\n (owner.getY() - owner.getDrawableY()) +\n this._extraBorder\n );\n if (this._searchContext.computePathTo(x, y)) {\n //Path found: memorize it\n let node = this._searchContext.getFinalNode();\n let finalPathLength = 0;\n while (node) {\n if (finalPathLength === this._path.length) {\n this._path.push([0, 0]);\n }\n this._path[finalPathLength][0] =\n node.pos[0] * this._cellWidth + this._gridOffsetX;\n this._path[finalPathLength][1] =\n node.pos[1] * this._cellHeight + this._gridOffsetY;\n node = node.parent;\n finalPathLength++;\n }\n this._path.length = finalPathLength;\n this._path.reverse();\n this._path[0][0] = owner.getX();\n this._path[0][1] = owner.getY();\n\n if (this._allowDiagonals && this._smoothingMaxCellGap > 0) {\n gdjs.pathfinding.simplifyPath(\n this._path,\n this._smoothingMaxCellGap *\n Math.min(this._cellWidth, this._cellHeight),\n gdjs.PathfindingRuntimeBehavior._smoothingResultVertices,\n gdjs.PathfindingRuntimeBehavior._smoothingWorkingVertices\n );\n let swapArray = this._path;\n this._path = gdjs.PathfindingRuntimeBehavior._smoothingResultVertices;\n gdjs.PathfindingRuntimeBehavior._smoothingResultVertices = swapArray;\n }\n\n this._enterSegment(0);\n this._pathFound = true;\n return;\n }\n\n // No path found\n this._pathFound = false;\n }\n\n _enterSegment(segmentNumber: integer) {\n if (this._path.length === 0) {\n return;\n }\n this._currentSegment = segmentNumber;\n if (this._currentSegment < this._path.length - 1) {\n const pathX =\n this._path[this._currentSegment + 1][0] -\n this._path[this._currentSegment][0];\n const pathY =\n this._path[this._currentSegment + 1][1] -\n this._path[this._currentSegment][1];\n this._totalSegmentDistance = Math.sqrt(pathX * pathX + pathY * pathY);\n this._distanceOnSegment = 0;\n this._reachedEnd = false;\n this._movementAngle =\n (gdjs.toDegrees(Math.atan2(pathY, pathX)) + 360) % 360;\n } else {\n this._reachedEnd = true;\n this._speed = 0;\n }\n }\n\n doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {\n if (this._path.length === 0 || this._reachedEnd) {\n return;\n }\n\n // Update the speed of the object\n const timeDelta = this.owner.getElapsedTime() / 1000;\n const previousSpeed = this._speed;\n if (this._speed !== this._maxSpeed) {\n this._speed += this._acceleration * timeDelta;\n if (this._speed > this._maxSpeed) {\n this._speed = this._maxSpeed;\n }\n }\n this._angularSpeed = this._angularMaxSpeed;\n\n // Update the time on the segment and change segment if needed\n // Use a Verlet integration to be frame rate independent.\n this._distanceOnSegment +=\n ((this._speed + previousSpeed) / 2) * timeDelta;\n const remainingDistanceOnSegment =\n this._totalSegmentDistance - this._distanceOnSegment;\n if (\n remainingDistanceOnSegment <= 0 &&\n this._currentSegment < this._path.length\n ) {\n this._enterSegment(this._currentSegment + 1);\n this._distanceOnSegment = -remainingDistanceOnSegment;\n }\n\n // Position object on the segment and update its angle\n let newPos = [0, 0];\n if (this._currentSegment < this._path.length - 1) {\n newPos[0] = gdjs.evtTools.common.lerp(\n this._path[this._currentSegment][0],\n this._path[this._currentSegment + 1][0],\n this._distanceOnSegment / this._totalSegmentDistance\n );\n newPos[1] = gdjs.evtTools.common.lerp(\n this._path[this._currentSegment][1],\n this._path[this._currentSegment + 1][1],\n this._distanceOnSegment / this._totalSegmentDistance\n );\n if (\n this._rotateObject &&\n this.owner.getAngle() !== this._movementAngle + this._angleOffset\n ) {\n this.owner.rotateTowardAngle(\n this._movementAngle + this._angleOffset,\n this._angularSpeed\n );\n }\n } else {\n newPos = this._path[this._path.length - 1];\n }\n this.owner.setX(newPos[0]);\n this.owner.setY(newPos[1]);\n }\n\n doStepPostEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {}\n\n /**\n * Compute the euclidean distance between two positions.\n * @memberof gdjs.PathfindingRuntimeBehavior\n */\n static euclideanDistance(a: FloatPoint, b: FloatPoint) {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1])\n );\n }\n\n /**\n * Compute the taxi distance between two positions.\n * @memberof gdjs.PathfindingRuntimeBehavior\n */\n static manhattanDistance(a: FloatPoint, b: FloatPoint) {\n return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n }\n }\n gdjs.registerBehavior(\n 'PathfindingBehavior::PathfindingBehavior',\n gdjs.PathfindingRuntimeBehavior\n );\n\n export namespace PathfindingRuntimeBehavior {\n /**\n * Internal tool class representing a node when looking for a path\n */\n export class Node {\n pos: FloatPoint;\n cost: integer = 0;\n smallestCost: integer = -1;\n estimateCost: integer = -1;\n parent: Node | null = null;\n open: boolean = true;\n\n constructor(xPos: integer, yPos: integer) {\n this.pos = [xPos, yPos];\n }\n\n reinitialize(xPos: integer, yPos: integer) {\n this.pos[0] = xPos;\n this.pos[1] = yPos;\n this.cost = 0;\n this.smallestCost = -1;\n this.estimateCost = -1;\n this.parent = null;\n this.open = true;\n }\n }\n\n /**\n * Internal tool class containing the structures used by A* and members functions related\n * to them.\n * @ignore\n */\n export class SearchContext {\n _obstacles: PathfindingObstaclesManager;\n _finalNode: Node | null = null;\n _destination: FloatPoint = [0, 0];\n _start: FloatPoint = [0, 0];\n _startX: float = 0;\n _startY: float = 0;\n _allowDiagonals: boolean = true;\n _maxComplexityFactor: integer = 50;\n _cellWidth: float = 20;\n _cellHeight: float = 20;\n _gridOffsetX: float = 0;\n _gridOffsetY: float = 0;\n\n _leftBorder: integer = 0;\n _rightBorder: integer = 0;\n _topBorder: integer = 0;\n _bottomBorder: integer = 0;\n _distanceFunction: (pt1: FloatPoint, pt2: FloatPoint) => float;\n //An array of array. Nodes are indexed by their x position, and then by their y position.\n _allNodes: Node[][] = [];\n //An array of nodes sorted by their estimate cost (First node = Lower estimate cost).\n _openNodes: Node[] = [];\n //Used by getNodes to temporarily store obstacles near a position.\n _closeObstacles: gdjs.PathfindingObstacleRuntimeBehavior[] = [];\n //Old nodes constructed in a previous search are stored here to avoid temporary objects (see _freeAllNodes method).\n _nodeCache: Node[] = [];\n\n constructor(obstacles: PathfindingObstaclesManager) {\n this._obstacles = obstacles;\n this._distanceFunction = PathfindingRuntimeBehavior.euclideanDistance;\n }\n\n setObstacles(\n obstacles: PathfindingObstaclesManager\n ): PathfindingRuntimeBehavior.SearchContext {\n this._obstacles = obstacles;\n return this;\n }\n\n getFinalNode() {\n return this._finalNode;\n }\n\n allowDiagonals(allowDiagonals: boolean) {\n this._allowDiagonals = allowDiagonals;\n this._distanceFunction = allowDiagonals\n ? PathfindingRuntimeBehavior.euclideanDistance\n : PathfindingRuntimeBehavior.manhattanDistance;\n return this;\n }\n\n setStartPosition(\n x: float,\n y: float\n ): PathfindingRuntimeBehavior.SearchContext {\n this._startX = x;\n this._startY = y;\n return this;\n }\n\n setObjectSize(\n leftBorder: integer,\n topBorder: integer,\n rightBorder: integer,\n bottomBorder: integer\n ): PathfindingRuntimeBehavior.SearchContext {\n this._leftBorder = leftBorder;\n this._rightBorder = rightBorder;\n this._topBorder = topBorder;\n this._bottomBorder = bottomBorder;\n return this;\n }\n\n setCellSize(\n cellWidth: float,\n cellHeight: float\n ): PathfindingRuntimeBehavior.SearchContext {\n this._cellWidth = cellWidth;\n this._cellHeight = cellHeight;\n return this;\n }\n\n setGridOffset(\n gridOffsetX: float,\n gridOffsetY: float\n ): PathfindingRuntimeBehavior.SearchContext {\n this._gridOffsetX = gridOffsetX;\n this._gridOffsetY = gridOffsetY;\n return this;\n }\n\n computePathTo(targetX: float, targetY: float) {\n if (this._obstacles === null) {\n logger.log(\n 'You tried to compute a path without specifying the obstacles'\n );\n return;\n }\n this._destination[0] = Math.round(\n (targetX - this._gridOffsetX) / this._cellWidth\n );\n this._destination[1] = Math.round(\n (targetY - this._gridOffsetY) / this._cellHeight\n );\n this._start[0] = Math.round(\n (this._startX - this._gridOffsetX) / this._cellWidth\n );\n this._start[1] = Math.round(\n (this._startY - this._gridOffsetY) / this._cellHeight\n );\n\n //Initialize the algorithm\n this._freeAllNodes();\n const startNode = this._getNode(this._start[0], this._start[1]);\n startNode.smallestCost = 0;\n startNode.estimateCost =\n 0 + this._distanceFunction(this._start, this._destination);\n this._openNodes.length = 0;\n this._openNodes.push(startNode);\n\n //A* algorithm main loop\n let iterationCount = 0;\n const maxIterationCount =\n startNode.estimateCost * this._maxComplexityFactor;\n while (this._openNodes.length !== 0) {\n //Make sure we do not search forever.\n if (iterationCount++ > maxIterationCount) {\n console.warn(\n `No path was found after covering ${maxIterationCount} cells.`\n );\n return false;\n }\n\n //Get the most promising node...\n const n = this._openNodes.shift()!;\n //...and flag it as explored\n n.open = false;\n\n //Check if we reached destination?\n if (\n n.pos[0] == this._destination[0] &&\n n.pos[1] == this._destination[1]\n ) {\n this._finalNode = n;\n return true;\n }\n\n //No, so add neighbors to the nodes to explore.\n this._insertNeighbors(n);\n }\n return false;\n }\n\n _freeAllNodes() {\n if (this._nodeCache.length <= 32000) {\n for (const i in this._allNodes) {\n if (this._allNodes.hasOwnProperty(i)) {\n const nodeArray = this._allNodes[i];\n for (const j in nodeArray) {\n if (nodeArray.hasOwnProperty(j)) {\n this._nodeCache.push(nodeArray[j]);\n }\n }\n }\n }\n }\n this._allNodes = [];\n }\n\n /**\n * Insert the neighbors of the current node in the open list\n * (Only if they are not closed, and if the cost is better than the already existing smallest cost).\n */\n _insertNeighbors(currentNode: Node) {\n this._addOrUpdateNode(\n currentNode.pos[0] + 1,\n currentNode.pos[1],\n currentNode,\n 1\n );\n this._addOrUpdateNode(\n currentNode.pos[0] - 1,\n currentNode.pos[1],\n currentNode,\n 1\n );\n this._addOrUpdateNode(\n currentNode.pos[0],\n currentNode.pos[1] + 1,\n currentNode,\n 1\n );\n this._addOrUpdateNode(\n currentNode.pos[0],\n currentNode.pos[1] - 1,\n currentNode,\n 1\n );\n if (this._allowDiagonals) {\n this._addOrUpdateNode(\n currentNode.pos[0] + 1,\n currentNode.pos[1] + 1,\n currentNode,\n 1.414213562\n );\n this._addOrUpdateNode(\n currentNode.pos[0] + 1,\n currentNode.pos[1] - 1,\n currentNode,\n 1.414213562\n );\n this._addOrUpdateNode(\n currentNode.pos[0] - 1,\n currentNode.pos[1] - 1,\n currentNode,\n 1.414213562\n );\n this._addOrUpdateNode(\n currentNode.pos[0] - 1,\n currentNode.pos[1] + 1,\n currentNode,\n 1.414213562\n );\n }\n }\n\n /**\n * Get (or dynamically construct) a node.\n *\n * *All* nodes should be created using this method: The cost of the node is computed thanks\n * to the objects flagged as obstacles.\n */\n _getNode(xPos: integer, yPos: integer): Node {\n //First check if their is a node a the specified position.\n if (this._allNodes.hasOwnProperty(xPos)) {\n if (this._allNodes[xPos].hasOwnProperty(yPos)) {\n return this._allNodes[xPos][yPos];\n }\n } else {\n this._allNodes[xPos] = [];\n }\n\n //No so construct a new node (or get it from the cache)...\n let newNode: Node;\n if (this._nodeCache.length !== 0) {\n newNode = this._nodeCache.shift()!;\n newNode.reinitialize(xPos, yPos);\n } else {\n newNode = new Node(xPos, yPos);\n }\n\n const nodeCenterX = xPos * this._cellWidth + this._gridOffsetX;\n const nodeCenterY = yPos * this._cellHeight + this._gridOffsetY;\n\n //...and update its cost according to obstacles\n let objectsOnCell = false;\n const radius =\n this._cellHeight > this._cellWidth\n ? this._cellHeight * 2\n : this._cellWidth * 2;\n this._obstacles.getAllObstaclesAround(\n nodeCenterX,\n nodeCenterY,\n radius,\n this._closeObstacles\n );\n for (let k = 0; k < this._closeObstacles.length; ++k) {\n const obj = this._closeObstacles[k].owner;\n const topLeftCellX = Math.floor(\n (obj.getDrawableX() - this._rightBorder - this._gridOffsetX) /\n this._cellWidth\n );\n const topLeftCellY = Math.floor(\n (obj.getDrawableY() - this._bottomBorder - this._gridOffsetY) /\n this._cellHeight\n );\n const bottomRightCellX = Math.ceil(\n (obj.getDrawableX() +\n obj.getWidth() +\n this._leftBorder -\n this._gridOffsetX) /\n this._cellWidth\n );\n const bottomRightCellY = Math.ceil(\n (obj.getDrawableY() +\n obj.getHeight() +\n this._topBorder -\n this._gridOffsetY) /\n this._cellHeight\n );\n if (\n topLeftCellX < xPos &&\n xPos < bottomRightCellX &&\n topLeftCellY < yPos &&\n yPos < bottomRightCellY\n ) {\n objectsOnCell = true;\n if (this._closeObstacles[k].isImpassable()) {\n //The cell is impassable, stop here.\n newNode.cost = -1;\n break;\n } else {\n //Superimpose obstacles\n newNode.cost += this._closeObstacles[k].getCost();\n }\n }\n }\n if (!objectsOnCell) {\n newNode.cost = 1;\n }\n\n //Default cost when no objects put on the cell.\n this._allNodes[xPos][yPos] = newNode;\n return newNode;\n }\n\n /**\n * Add a node to the openNodes (only if the cost to reach it is less than the existing cost, if any).\n */\n _addOrUpdateNode(\n newNodeX: integer,\n newNodeY: integer,\n currentNode: Node,\n factor: float\n ) {\n const neighbor = this._getNode(newNodeX, newNodeY);\n\n //cost < 0 means impassable obstacle\n if (!neighbor.open || neighbor.cost < 0) {\n return;\n }\n\n //Update the node costs and parent if the path coming from currentNode is better:\n if (\n neighbor.smallestCost === -1 ||\n neighbor.smallestCost >\n currentNode.smallestCost +\n ((currentNode.cost + neighbor.cost) / 2.0) * factor\n ) {\n if (neighbor.smallestCost != -1) {\n //The node is already in the open list..\n for (let i = 0; i < this._openNodes.length; ++i) {\n if (\n this._openNodes[i].pos[0] == neighbor.pos[0] &&\n this._openNodes[i].pos[1] == neighbor.pos[1]\n ) {\n this._openNodes.splice(\n i,\n //..so remove it as its estimate cost will be updated.\n 1\n );\n break;\n }\n }\n }\n neighbor.smallestCost =\n currentNode.smallestCost +\n ((currentNode.cost + neighbor.cost) / 2.0) * factor;\n neighbor.parent = currentNode;\n neighbor.estimateCost =\n neighbor.smallestCost +\n this._distanceFunction(neighbor.pos, this._destination);\n\n //Add the neighbor to open nodes, which are sorted by their estimate cost:\n if (\n this._openNodes.length === 0 ||\n this._openNodes[this._openNodes.length - 1].estimateCost <\n neighbor.estimateCost\n ) {\n this._openNodes.push(neighbor);\n } else {\n for (let i = 0; i < this._openNodes.length; ++i) {\n if (this._openNodes[i].estimateCost >= neighbor.estimateCost) {\n this._openNodes.splice(i, 0, neighbor);\n break;\n }\n }\n }\n }\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -586,7 +586,8 @@ module.exports = {
586
586
  .addParameter('behavior', _('Behavior'), 'Physics2Behavior')
587
587
  .addParameter('expression', _('Time scale (1 by default)'))
588
588
  .getCodeExtraInformation()
589
- .setIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
589
+ .addIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
590
+ .addIncludeFile('Extensions/Physics2Behavior/physics2runtimebehavior.js')
590
591
  .setFunctionName('gdjs.physics2.setTimeScale');
591
592
 
592
593
  aut
@@ -1394,6 +1395,7 @@ module.exports = {
1394
1395
  .getCodeExtraInformation()
1395
1396
  .setFunctionName('getLinearVelocityLength');
1396
1397
 
1398
+ // Deprecated
1397
1399
  aut
1398
1400
  .addCondition(
1399
1401
  'LinearVelocityAngle',
@@ -1412,9 +1414,47 @@ module.exports = {
1412
1414
  _('Angle to compare to (in degrees)')
1413
1415
  )
1414
1416
  )
1417
+ .setHidden()
1415
1418
  .getCodeExtraInformation()
1416
1419
  .setFunctionName('getLinearVelocityAngle');
1417
1420
 
1421
+ aut
1422
+ .addScopedCondition(
1423
+ 'IsLinearVelocityAngleAround',
1424
+ _('Linear velocity angle'),
1425
+ _('Compare the linear velocity angle of the object.'),
1426
+ _('Angle of movement of _PARAM0_ is _PARAM2_ ± _PARAM3_°'),
1427
+ _('Velocity'),
1428
+ 'res/physics32.png',
1429
+ 'res/physics32.png'
1430
+ )
1431
+ .addParameter('object', _('Object'), '', false)
1432
+ .addParameter('behavior', _('Behavior'), 'Physics2Behavior')
1433
+ .addParameter('expression', _('Angle (in degrees)'))
1434
+ .addParameter('expression', _('Tolerance (in degrees)'))
1435
+ .getCodeExtraInformation()
1436
+ .setFunctionName('isLinearVelocityAngleAround');
1437
+
1438
+ aut
1439
+ .addAction(
1440
+ 'LinearVelocityAngle',
1441
+ _('Linear velocity towards an angle'),
1442
+ _('Set the linear velocity towards an angle.'),
1443
+ _(
1444
+ 'Set the linear velocity of _PARAM0_ towards angle: _PARAM2_ degrees, speed: _PARAM3_ pixels per second'
1445
+ ),
1446
+ _('Velocity'),
1447
+ 'res/physics32.png',
1448
+ 'res/physics32.png'
1449
+ )
1450
+ .addParameter('object', _('Object'), '', false)
1451
+ .addParameter('behavior', _('Behavior'), 'Physics2Behavior')
1452
+ .addParameter('expression', _('Angle'))
1453
+ .addParameter('expression', _('Speed (in pixels per second)'))
1454
+ .getCodeExtraInformation()
1455
+ .setFunctionName('setLinearVelocityAngle')
1456
+ .setGetter('getLinearVelocityAngle');
1457
+
1418
1458
  aut
1419
1459
  .addExpression(
1420
1460
  'LinearVelocityAngle',
@@ -4074,7 +4114,8 @@ module.exports = {
4074
4114
  .addParameter('objectList', _('Object'), '', false)
4075
4115
  .addCodeOnlyParameter('conditionInverted', '')
4076
4116
  .getCodeExtraInformation()
4077
- .setIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
4117
+ .addIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
4118
+ .addIncludeFile('Extensions/Physics2Behavior/physics2runtimebehavior.js')
4078
4119
  .setFunctionName('gdjs.physics2.objectsCollide');
4079
4120
 
4080
4121
  extension
@@ -4092,7 +4133,8 @@ module.exports = {
4092
4133
  .addParameter('objectList', _('Object'), '', false)
4093
4134
  .addCodeOnlyParameter('conditionInverted', '')
4094
4135
  .getCodeExtraInformation()
4095
- .setIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
4136
+ .addIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
4137
+ .addIncludeFile('Extensions/Physics2Behavior/physics2runtimebehavior.js')
4096
4138
  .setFunctionName('gdjs.physics2.haveObjectsStartedColliding');
4097
4139
 
4098
4140
  extension
@@ -4110,7 +4152,8 @@ module.exports = {
4110
4152
  .addParameter('objectList', _('Object'), '', false)
4111
4153
  .addCodeOnlyParameter('conditionInverted', '')
4112
4154
  .getCodeExtraInformation()
4113
- .setIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
4155
+ .addIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
4156
+ .addIncludeFile('Extensions/Physics2Behavior/physics2runtimebehavior.js')
4114
4157
  .setFunctionName('gdjs.physics2.haveObjectsStoppedColliding');
4115
4158
 
4116
4159
  return extension;