@nice2dev/game-engine 0.1.0

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 (519) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +21 -0
  3. package/README.md +105 -0
  4. package/dist/cjs/accessibility/Accessibility.js +162 -0
  5. package/dist/cjs/accessibility/Accessibility.js.map +1 -0
  6. package/dist/cjs/ai/AI.js +321 -0
  7. package/dist/cjs/ai/AI.js.map +1 -0
  8. package/dist/cjs/animation/Animation.js +233 -0
  9. package/dist/cjs/animation/Animation.js.map +1 -0
  10. package/dist/cjs/audio/AudioAdvanced.js +262 -0
  11. package/dist/cjs/audio/AudioAdvanced.js.map +1 -0
  12. package/dist/cjs/audio/AudioManager.js +248 -0
  13. package/dist/cjs/audio/AudioManager.js.map +1 -0
  14. package/dist/cjs/core/EventBus.js +63 -0
  15. package/dist/cjs/core/EventBus.js.map +1 -0
  16. package/dist/cjs/core/GameClock.js +70 -0
  17. package/dist/cjs/core/GameClock.js.map +1 -0
  18. package/dist/cjs/core/GameConfig.js +86 -0
  19. package/dist/cjs/core/GameConfig.js.map +1 -0
  20. package/dist/cjs/core/GameLoop.js +93 -0
  21. package/dist/cjs/core/GameLoop.js.map +1 -0
  22. package/dist/cjs/core/ServiceLocator.js +73 -0
  23. package/dist/cjs/core/ServiceLocator.js.map +1 -0
  24. package/dist/cjs/core/Validation.js +119 -0
  25. package/dist/cjs/core/Validation.js.map +1 -0
  26. package/dist/cjs/core/math.js +116 -0
  27. package/dist/cjs/core/math.js.map +1 -0
  28. package/dist/cjs/devtools/DevTools.js +560 -0
  29. package/dist/cjs/devtools/DevTools.js.map +1 -0
  30. package/dist/cjs/devtools/DeveloperExperience.js +562 -0
  31. package/dist/cjs/devtools/DeveloperExperience.js.map +1 -0
  32. package/dist/cjs/docs/DocGenerator.js +357 -0
  33. package/dist/cjs/docs/DocGenerator.js.map +1 -0
  34. package/dist/cjs/ecs/World.js +280 -0
  35. package/dist/cjs/ecs/World.js.map +1 -0
  36. package/dist/cjs/editor/AdvancedEditor.js +149 -0
  37. package/dist/cjs/editor/AdvancedEditor.js.map +1 -0
  38. package/dist/cjs/editor/AssetManager.js +190 -0
  39. package/dist/cjs/editor/AssetManager.js.map +1 -0
  40. package/dist/cjs/editor/DebugTools.js +187 -0
  41. package/dist/cjs/editor/DebugTools.js.map +1 -0
  42. package/dist/cjs/editor/NiceGameEditor.js +361 -0
  43. package/dist/cjs/editor/NiceGameEditor.js.map +1 -0
  44. package/dist/cjs/editor/SceneEditor.js +223 -0
  45. package/dist/cjs/editor/SceneEditor.js.map +1 -0
  46. package/dist/cjs/engine/NiceGameEngine.js +172 -0
  47. package/dist/cjs/engine/NiceGameEngine.js.map +1 -0
  48. package/dist/cjs/enterprise/Enterprise.js +258 -0
  49. package/dist/cjs/enterprise/Enterprise.js.map +1 -0
  50. package/dist/cjs/i18n/I18n.js +634 -0
  51. package/dist/cjs/i18n/I18n.js.map +1 -0
  52. package/dist/cjs/i18n/useTranslation.js +100 -0
  53. package/dist/cjs/i18n/useTranslation.js.map +1 -0
  54. package/dist/cjs/index.js +526 -0
  55. package/dist/cjs/index.js.map +1 -0
  56. package/dist/cjs/input/GamepadNavigation.js +181 -0
  57. package/dist/cjs/input/GamepadNavigation.js.map +1 -0
  58. package/dist/cjs/input/InputManager.js +404 -0
  59. package/dist/cjs/input/InputManager.js.map +1 -0
  60. package/dist/cjs/input/useGamepads.js +86 -0
  61. package/dist/cjs/input/useGamepads.js.map +1 -0
  62. package/dist/cjs/kids/KidMode.js +670 -0
  63. package/dist/cjs/kids/KidMode.js.map +1 -0
  64. package/dist/cjs/kids/KidTools.js +533 -0
  65. package/dist/cjs/kids/KidTools.js.map +1 -0
  66. package/dist/cjs/monetization/Monetization.js +197 -0
  67. package/dist/cjs/monetization/Monetization.js.map +1 -0
  68. package/dist/cjs/multiplayer/LocalMultiplayer.js +288 -0
  69. package/dist/cjs/multiplayer/LocalMultiplayer.js.map +1 -0
  70. package/dist/cjs/multiplayer/MiniGameTypes.js +70 -0
  71. package/dist/cjs/multiplayer/MiniGameTypes.js.map +1 -0
  72. package/dist/cjs/network/MultiplayerTransport.js +109 -0
  73. package/dist/cjs/network/MultiplayerTransport.js.map +1 -0
  74. package/dist/cjs/network/Networking.js +569 -0
  75. package/dist/cjs/network/Networking.js.map +1 -0
  76. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js +32 -0
  77. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -0
  78. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js +51 -0
  79. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -0
  80. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js +46 -0
  81. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -0
  82. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js +18 -0
  83. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -0
  84. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js +145 -0
  85. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -0
  86. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js +161 -0
  87. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -0
  88. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js +56 -0
  89. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -0
  90. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js +11 -0
  91. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -0
  92. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js +52 -0
  93. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -0
  94. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js +576 -0
  95. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -0
  96. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js +956 -0
  97. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -0
  98. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js +149 -0
  99. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -0
  100. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js +25 -0
  101. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -0
  102. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js +27 -0
  103. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -0
  104. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js +26 -0
  105. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -0
  106. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js +124 -0
  107. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -0
  108. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js +17 -0
  109. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -0
  110. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js +188 -0
  111. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -0
  112. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js +199 -0
  113. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -0
  114. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js +108 -0
  115. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -0
  116. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js +38 -0
  117. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -0
  118. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js +24 -0
  119. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -0
  120. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js +264 -0
  121. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -0
  122. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js +160 -0
  123. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -0
  124. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js +88 -0
  125. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -0
  126. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/index.js +50 -0
  127. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/index.js.map +1 -0
  128. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js +6 -0
  129. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -0
  130. package/dist/cjs/pathfinding/Pathfinding.js +255 -0
  131. package/dist/cjs/pathfinding/Pathfinding.js.map +1 -0
  132. package/dist/cjs/performance/BenchmarkSuite.js +318 -0
  133. package/dist/cjs/performance/BenchmarkSuite.js.map +1 -0
  134. package/dist/cjs/performance/Performance.js +180 -0
  135. package/dist/cjs/performance/Performance.js.map +1 -0
  136. package/dist/cjs/performance/PerformanceAdvanced.js +628 -0
  137. package/dist/cjs/performance/PerformanceAdvanced.js.map +1 -0
  138. package/dist/cjs/physics/PhysicsAdvanced.js +432 -0
  139. package/dist/cjs/physics/PhysicsAdvanced.js.map +1 -0
  140. package/dist/cjs/physics/PhysicsEngine2D.js +445 -0
  141. package/dist/cjs/physics/PhysicsEngine2D.js.map +1 -0
  142. package/dist/cjs/plugins/PluginSDK.js +488 -0
  143. package/dist/cjs/plugins/PluginSDK.js.map +1 -0
  144. package/dist/cjs/plugins/PluginTestKit.js +368 -0
  145. package/dist/cjs/plugins/PluginTestKit.js.map +1 -0
  146. package/dist/cjs/procedural/Procedural.js +288 -0
  147. package/dist/cjs/procedural/Procedural.js.map +1 -0
  148. package/dist/cjs/procedural/WorldBuilding.js +246 -0
  149. package/dist/cjs/procedural/WorldBuilding.js.map +1 -0
  150. package/dist/cjs/release/MobileExport.js +149 -0
  151. package/dist/cjs/release/MobileExport.js.map +1 -0
  152. package/dist/cjs/release/Release.js +151 -0
  153. package/dist/cjs/release/Release.js.map +1 -0
  154. package/dist/cjs/rendering/Camera2D.js +129 -0
  155. package/dist/cjs/rendering/Camera2D.js.map +1 -0
  156. package/dist/cjs/rendering/Renderer2D.js +337 -0
  157. package/dist/cjs/rendering/Renderer2D.js.map +1 -0
  158. package/dist/cjs/runtime3d/Runtime3D.js +381 -0
  159. package/dist/cjs/runtime3d/Runtime3D.js.map +1 -0
  160. package/dist/cjs/runtime3d/SceneEditor3D.js +316 -0
  161. package/dist/cjs/runtime3d/SceneEditor3D.js.map +1 -0
  162. package/dist/cjs/scene/SceneManager.js +186 -0
  163. package/dist/cjs/scene/SceneManager.js.map +1 -0
  164. package/dist/cjs/scripting/NodeGraph.js +573 -0
  165. package/dist/cjs/scripting/NodeGraph.js.map +1 -0
  166. package/dist/cjs/social/Social.js +91 -0
  167. package/dist/cjs/social/Social.js.map +1 -0
  168. package/dist/cjs/templates/ActionTemplates.js +229 -0
  169. package/dist/cjs/templates/ActionTemplates.js.map +1 -0
  170. package/dist/cjs/templates/PartyTemplates.js +221 -0
  171. package/dist/cjs/templates/PartyTemplates.js.map +1 -0
  172. package/dist/cjs/templates/PuzzleTemplates.js +283 -0
  173. package/dist/cjs/templates/PuzzleTemplates.js.map +1 -0
  174. package/dist/cjs/templates/RPGTemplates.js +209 -0
  175. package/dist/cjs/templates/RPGTemplates.js.map +1 -0
  176. package/dist/cjs/templates/SportsTemplates.js +272 -0
  177. package/dist/cjs/templates/SportsTemplates.js.map +1 -0
  178. package/dist/cjs/templates/StrategyTemplates.js +173 -0
  179. package/dist/cjs/templates/StrategyTemplates.js.map +1 -0
  180. package/dist/cjs/templates/WaveDefense.js +470 -0
  181. package/dist/cjs/templates/WaveDefense.js.map +1 -0
  182. package/dist/cjs/tilemap/Tilemap.js +208 -0
  183. package/dist/cjs/tilemap/Tilemap.js.map +1 -0
  184. package/dist/cjs/tutorials/TutorialBranching.js +392 -0
  185. package/dist/cjs/tutorials/TutorialBranching.js.map +1 -0
  186. package/dist/cjs/tutorials/TutorialEngine.js +903 -0
  187. package/dist/cjs/tutorials/TutorialEngine.js.map +1 -0
  188. package/dist/cjs/tutorials/TutorialOverlay.js +602 -0
  189. package/dist/cjs/tutorials/TutorialOverlay.js.map +1 -0
  190. package/dist/cjs/tutorials/content/Tutorials_T05_T08.js +816 -0
  191. package/dist/cjs/tutorials/content/Tutorials_T05_T08.js.map +1 -0
  192. package/dist/cjs/tutorials/content/Tutorials_T09_T11.js +741 -0
  193. package/dist/cjs/tutorials/content/Tutorials_T09_T11.js.map +1 -0
  194. package/dist/cjs/tutorials/content/Tutorials_T12_T15.js +786 -0
  195. package/dist/cjs/tutorials/content/Tutorials_T12_T15.js.map +1 -0
  196. package/dist/cjs/ui/GameUI.js +312 -0
  197. package/dist/cjs/ui/GameUI.js.map +1 -0
  198. package/dist/cjs/xr/ARVR.js +197 -0
  199. package/dist/cjs/xr/ARVR.js.map +1 -0
  200. package/dist/esm/accessibility/Accessibility.js +153 -0
  201. package/dist/esm/accessibility/Accessibility.js.map +1 -0
  202. package/dist/esm/ai/AI.js +302 -0
  203. package/dist/esm/ai/AI.js.map +1 -0
  204. package/dist/esm/animation/Animation.js +227 -0
  205. package/dist/esm/animation/Animation.js.map +1 -0
  206. package/dist/esm/audio/AudioAdvanced.js +243 -0
  207. package/dist/esm/audio/AudioAdvanced.js.map +1 -0
  208. package/dist/esm/audio/AudioManager.js +246 -0
  209. package/dist/esm/audio/AudioManager.js.map +1 -0
  210. package/dist/esm/core/EventBus.js +61 -0
  211. package/dist/esm/core/EventBus.js.map +1 -0
  212. package/dist/esm/core/GameClock.js +68 -0
  213. package/dist/esm/core/GameClock.js.map +1 -0
  214. package/dist/esm/core/GameConfig.js +80 -0
  215. package/dist/esm/core/GameConfig.js.map +1 -0
  216. package/dist/esm/core/GameLoop.js +91 -0
  217. package/dist/esm/core/GameLoop.js.map +1 -0
  218. package/dist/esm/core/ServiceLocator.js +70 -0
  219. package/dist/esm/core/ServiceLocator.js.map +1 -0
  220. package/dist/esm/core/Validation.js +108 -0
  221. package/dist/esm/core/Validation.js.map +1 -0
  222. package/dist/esm/core/math.js +114 -0
  223. package/dist/esm/core/math.js.map +1 -0
  224. package/dist/esm/devtools/DevTools.js +555 -0
  225. package/dist/esm/devtools/DevTools.js.map +1 -0
  226. package/dist/esm/devtools/DeveloperExperience.js +547 -0
  227. package/dist/esm/devtools/DeveloperExperience.js.map +1 -0
  228. package/dist/esm/docs/DocGenerator.js +353 -0
  229. package/dist/esm/docs/DocGenerator.js.map +1 -0
  230. package/dist/esm/ecs/World.js +276 -0
  231. package/dist/esm/ecs/World.js.map +1 -0
  232. package/dist/esm/editor/AdvancedEditor.js +141 -0
  233. package/dist/esm/editor/AdvancedEditor.js.map +1 -0
  234. package/dist/esm/editor/AssetManager.js +188 -0
  235. package/dist/esm/editor/AssetManager.js.map +1 -0
  236. package/dist/esm/editor/DebugTools.js +179 -0
  237. package/dist/esm/editor/DebugTools.js.map +1 -0
  238. package/dist/esm/editor/NiceGameEditor.js +355 -0
  239. package/dist/esm/editor/NiceGameEditor.js.map +1 -0
  240. package/dist/esm/editor/SceneEditor.js +209 -0
  241. package/dist/esm/editor/SceneEditor.js.map +1 -0
  242. package/dist/esm/engine/NiceGameEngine.js +170 -0
  243. package/dist/esm/engine/NiceGameEngine.js.map +1 -0
  244. package/dist/esm/enterprise/Enterprise.js +246 -0
  245. package/dist/esm/enterprise/Enterprise.js.map +1 -0
  246. package/dist/esm/i18n/I18n.js +622 -0
  247. package/dist/esm/i18n/I18n.js.map +1 -0
  248. package/dist/esm/i18n/useTranslation.js +95 -0
  249. package/dist/esm/i18n/useTranslation.js.map +1 -0
  250. package/dist/esm/index.js +71 -0
  251. package/dist/esm/index.js.map +1 -0
  252. package/dist/esm/input/GamepadNavigation.js +178 -0
  253. package/dist/esm/input/GamepadNavigation.js.map +1 -0
  254. package/dist/esm/input/InputManager.js +399 -0
  255. package/dist/esm/input/InputManager.js.map +1 -0
  256. package/dist/esm/input/useGamepads.js +83 -0
  257. package/dist/esm/input/useGamepads.js.map +1 -0
  258. package/dist/esm/kids/KidMode.js +663 -0
  259. package/dist/esm/kids/KidMode.js.map +1 -0
  260. package/dist/esm/kids/KidTools.js +529 -0
  261. package/dist/esm/kids/KidTools.js.map +1 -0
  262. package/dist/esm/monetization/Monetization.js +186 -0
  263. package/dist/esm/monetization/Monetization.js.map +1 -0
  264. package/dist/esm/multiplayer/LocalMultiplayer.js +284 -0
  265. package/dist/esm/multiplayer/LocalMultiplayer.js.map +1 -0
  266. package/dist/esm/multiplayer/MiniGameTypes.js +60 -0
  267. package/dist/esm/multiplayer/MiniGameTypes.js.map +1 -0
  268. package/dist/esm/network/MultiplayerTransport.js +106 -0
  269. package/dist/esm/network/MultiplayerTransport.js.map +1 -0
  270. package/dist/esm/network/Networking.js +561 -0
  271. package/dist/esm/network/Networking.js.map +1 -0
  272. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js +30 -0
  273. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -0
  274. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js +49 -0
  275. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -0
  276. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js +44 -0
  277. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -0
  278. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js +16 -0
  279. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -0
  280. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js +136 -0
  281. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -0
  282. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js +159 -0
  283. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -0
  284. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js +54 -0
  285. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -0
  286. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js +9 -0
  287. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -0
  288. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js +49 -0
  289. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -0
  290. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js +573 -0
  291. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -0
  292. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js +954 -0
  293. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -0
  294. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js +147 -0
  295. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -0
  296. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js +25 -0
  297. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -0
  298. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js +27 -0
  299. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -0
  300. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js +26 -0
  301. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -0
  302. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js +122 -0
  303. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -0
  304. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js +15 -0
  305. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -0
  306. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js +186 -0
  307. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -0
  308. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js +197 -0
  309. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -0
  310. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js +106 -0
  311. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -0
  312. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js +36 -0
  313. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -0
  314. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js +22 -0
  315. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -0
  316. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js +249 -0
  317. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -0
  318. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js +158 -0
  319. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -0
  320. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js +86 -0
  321. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -0
  322. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/index.js +13 -0
  323. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/index.js.map +1 -0
  324. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js +4 -0
  325. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -0
  326. package/dist/esm/pathfinding/Pathfinding.js +250 -0
  327. package/dist/esm/pathfinding/Pathfinding.js.map +1 -0
  328. package/dist/esm/performance/BenchmarkSuite.js +315 -0
  329. package/dist/esm/performance/BenchmarkSuite.js.map +1 -0
  330. package/dist/esm/performance/Performance.js +171 -0
  331. package/dist/esm/performance/Performance.js.map +1 -0
  332. package/dist/esm/performance/PerformanceAdvanced.js +620 -0
  333. package/dist/esm/performance/PerformanceAdvanced.js.map +1 -0
  334. package/dist/esm/physics/PhysicsAdvanced.js +417 -0
  335. package/dist/esm/physics/PhysicsAdvanced.js.map +1 -0
  336. package/dist/esm/physics/PhysicsEngine2D.js +442 -0
  337. package/dist/esm/physics/PhysicsEngine2D.js.map +1 -0
  338. package/dist/esm/plugins/PluginSDK.js +484 -0
  339. package/dist/esm/plugins/PluginSDK.js.map +1 -0
  340. package/dist/esm/plugins/PluginTestKit.js +359 -0
  341. package/dist/esm/plugins/PluginTestKit.js.map +1 -0
  342. package/dist/esm/procedural/Procedural.js +282 -0
  343. package/dist/esm/procedural/Procedural.js.map +1 -0
  344. package/dist/esm/procedural/WorldBuilding.js +225 -0
  345. package/dist/esm/procedural/WorldBuilding.js.map +1 -0
  346. package/dist/esm/release/MobileExport.js +142 -0
  347. package/dist/esm/release/MobileExport.js.map +1 -0
  348. package/dist/esm/release/Release.js +141 -0
  349. package/dist/esm/release/Release.js.map +1 -0
  350. package/dist/esm/rendering/Camera2D.js +127 -0
  351. package/dist/esm/rendering/Camera2D.js.map +1 -0
  352. package/dist/esm/rendering/Renderer2D.js +334 -0
  353. package/dist/esm/rendering/Renderer2D.js.map +1 -0
  354. package/dist/esm/runtime3d/Runtime3D.js +371 -0
  355. package/dist/esm/runtime3d/Runtime3D.js.map +1 -0
  356. package/dist/esm/runtime3d/SceneEditor3D.js +299 -0
  357. package/dist/esm/runtime3d/SceneEditor3D.js.map +1 -0
  358. package/dist/esm/scene/SceneManager.js +184 -0
  359. package/dist/esm/scene/SceneManager.js.map +1 -0
  360. package/dist/esm/scripting/NodeGraph.js +568 -0
  361. package/dist/esm/scripting/NodeGraph.js.map +1 -0
  362. package/dist/esm/social/Social.js +85 -0
  363. package/dist/esm/social/Social.js.map +1 -0
  364. package/dist/esm/templates/ActionTemplates.js +217 -0
  365. package/dist/esm/templates/ActionTemplates.js.map +1 -0
  366. package/dist/esm/templates/PartyTemplates.js +204 -0
  367. package/dist/esm/templates/PartyTemplates.js.map +1 -0
  368. package/dist/esm/templates/PuzzleTemplates.js +267 -0
  369. package/dist/esm/templates/PuzzleTemplates.js.map +1 -0
  370. package/dist/esm/templates/RPGTemplates.js +196 -0
  371. package/dist/esm/templates/RPGTemplates.js.map +1 -0
  372. package/dist/esm/templates/SportsTemplates.js +257 -0
  373. package/dist/esm/templates/SportsTemplates.js.map +1 -0
  374. package/dist/esm/templates/StrategyTemplates.js +157 -0
  375. package/dist/esm/templates/StrategyTemplates.js.map +1 -0
  376. package/dist/esm/templates/WaveDefense.js +467 -0
  377. package/dist/esm/templates/WaveDefense.js.map +1 -0
  378. package/dist/esm/tilemap/Tilemap.js +205 -0
  379. package/dist/esm/tilemap/Tilemap.js.map +1 -0
  380. package/dist/esm/tutorials/TutorialBranching.js +388 -0
  381. package/dist/esm/tutorials/TutorialBranching.js.map +1 -0
  382. package/dist/esm/tutorials/TutorialEngine.js +897 -0
  383. package/dist/esm/tutorials/TutorialEngine.js.map +1 -0
  384. package/dist/esm/tutorials/TutorialOverlay.js +600 -0
  385. package/dist/esm/tutorials/TutorialOverlay.js.map +1 -0
  386. package/dist/esm/tutorials/content/Tutorials_T05_T08.js +810 -0
  387. package/dist/esm/tutorials/content/Tutorials_T05_T08.js.map +1 -0
  388. package/dist/esm/tutorials/content/Tutorials_T09_T11.js +736 -0
  389. package/dist/esm/tutorials/content/Tutorials_T09_T11.js.map +1 -0
  390. package/dist/esm/tutorials/content/Tutorials_T12_T15.js +780 -0
  391. package/dist/esm/tutorials/content/Tutorials_T12_T15.js.map +1 -0
  392. package/dist/esm/ui/GameUI.js +310 -0
  393. package/dist/esm/ui/GameUI.js.map +1 -0
  394. package/dist/esm/xr/ARVR.js +182 -0
  395. package/dist/esm/xr/ARVR.js.map +1 -0
  396. package/dist/types/__tests__/setup.d.ts +1 -0
  397. package/dist/types/accessibility/Accessibility.d.ts +82 -0
  398. package/dist/types/accessibility/index.d.ts +1 -0
  399. package/dist/types/ai/AI.d.ts +140 -0
  400. package/dist/types/ai/index.d.ts +1 -0
  401. package/dist/types/animation/Animation.d.ts +90 -0
  402. package/dist/types/animation/index.d.ts +1 -0
  403. package/dist/types/audio/AudioAdvanced.d.ts +190 -0
  404. package/dist/types/audio/AudioManager.d.ts +55 -0
  405. package/dist/types/audio/index.d.ts +1 -0
  406. package/dist/types/community/Community.d.ts +112 -0
  407. package/dist/types/community/index.d.ts +1 -0
  408. package/dist/types/core/EventBus.d.ts +16 -0
  409. package/dist/types/core/GameClock.d.ts +29 -0
  410. package/dist/types/core/GameConfig.d.ts +20 -0
  411. package/dist/types/core/GameLoop.d.ts +32 -0
  412. package/dist/types/core/ServiceLocator.d.ts +36 -0
  413. package/dist/types/core/TypeSafety.d.ts +190 -0
  414. package/dist/types/core/Validation.d.ts +24 -0
  415. package/dist/types/core/index.d.ts +7 -0
  416. package/dist/types/core/math.d.ts +32 -0
  417. package/dist/types/core/types.d.ts +130 -0
  418. package/dist/types/devtools/AssetStore.d.ts +133 -0
  419. package/dist/types/devtools/DevTools.d.ts +217 -0
  420. package/dist/types/devtools/DeveloperExperience.d.ts +123 -0
  421. package/dist/types/devtools/index.d.ts +3 -0
  422. package/dist/types/docs/APIPlayground.d.ts +26 -0
  423. package/dist/types/docs/Cookbook.d.ts +18 -0
  424. package/dist/types/docs/DocGenerator.d.ts +83 -0
  425. package/dist/types/docs/Guides.d.ts +18 -0
  426. package/dist/types/docs/index.d.ts +4 -0
  427. package/dist/types/ecs/World.d.ts +219 -0
  428. package/dist/types/ecs/index.d.ts +1 -0
  429. package/dist/types/editor/AdvancedEditor.d.ts +267 -0
  430. package/dist/types/editor/AssetManager.d.ts +45 -0
  431. package/dist/types/editor/DebugTools.d.ts +74 -0
  432. package/dist/types/editor/NiceGameEditor.d.ts +115 -0
  433. package/dist/types/editor/SceneEditor.d.ts +37 -0
  434. package/dist/types/editor/index.d.ts +8 -0
  435. package/dist/types/engine/NiceGameEngine.d.ts +53 -0
  436. package/dist/types/engine/index.d.ts +2 -0
  437. package/dist/types/enterprise/Enterprise.d.ts +217 -0
  438. package/dist/types/enterprise/index.d.ts +1 -0
  439. package/dist/types/epic/index.d.ts +10 -0
  440. package/dist/types/i18n/I18n.d.ts +107 -0
  441. package/dist/types/i18n/index.d.ts +2 -0
  442. package/dist/types/i18n/useTranslation.d.ts +74 -0
  443. package/dist/types/index.d.ts +127 -0
  444. package/dist/types/input/GamepadNavigation.d.ts +34 -0
  445. package/dist/types/input/InputManager.d.ts +77 -0
  446. package/dist/types/input/index.d.ts +3 -0
  447. package/dist/types/input/useGamepads.d.ts +39 -0
  448. package/dist/types/kids/KidMode.d.ts +207 -0
  449. package/dist/types/kids/KidTools.d.ts +135 -0
  450. package/dist/types/kids/index.d.ts +2 -0
  451. package/dist/types/legendary/index.d.ts +57 -0
  452. package/dist/types/monetization/Monetization.d.ts +224 -0
  453. package/dist/types/monetization/index.d.ts +1 -0
  454. package/dist/types/multiplayer/LocalMultiplayer.d.ts +61 -0
  455. package/dist/types/multiplayer/MiniGameTypes.d.ts +70 -0
  456. package/dist/types/multiplayer/index.d.ts +3 -0
  457. package/dist/types/network/MultiplayerTransport.d.ts +71 -0
  458. package/dist/types/network/Networking.d.ts +199 -0
  459. package/dist/types/network/index.d.ts +2 -0
  460. package/dist/types/pathfinding/Pathfinding.d.ts +42 -0
  461. package/dist/types/pathfinding/index.d.ts +1 -0
  462. package/dist/types/performance/AssetCompression.d.ts +137 -0
  463. package/dist/types/performance/BenchmarkSuite.d.ts +99 -0
  464. package/dist/types/performance/Performance.d.ts +87 -0
  465. package/dist/types/performance/PerformanceAdvanced.d.ts +220 -0
  466. package/dist/types/performance/WASMModules.d.ts +65 -0
  467. package/dist/types/performance/WebGPUCompute.d.ts +164 -0
  468. package/dist/types/performance/index.d.ts +1 -0
  469. package/dist/types/physics/PhysicsAdvanced.d.ts +148 -0
  470. package/dist/types/physics/PhysicsEngine2D.d.ts +66 -0
  471. package/dist/types/physics/index.d.ts +1 -0
  472. package/dist/types/plugins/PluginSDK.d.ts +134 -0
  473. package/dist/types/plugins/PluginTestKit.d.ts +107 -0
  474. package/dist/types/plugins/index.d.ts +2 -0
  475. package/dist/types/procedural/Procedural.d.ts +90 -0
  476. package/dist/types/procedural/WorldBuilding.d.ts +200 -0
  477. package/dist/types/procedural/index.d.ts +2 -0
  478. package/dist/types/release/MobileExport.d.ts +218 -0
  479. package/dist/types/release/Release.d.ts +81 -0
  480. package/dist/types/release/index.d.ts +1 -0
  481. package/dist/types/rendering/Camera2D.d.ts +39 -0
  482. package/dist/types/rendering/Renderer2D.d.ts +41 -0
  483. package/dist/types/rendering/index.d.ts +2 -0
  484. package/dist/types/runtime3d/Runtime3D.d.ts +259 -0
  485. package/dist/types/runtime3d/SceneEditor3D.d.ts +186 -0
  486. package/dist/types/runtime3d/index.d.ts +2 -0
  487. package/dist/types/scene/SceneManager.d.ts +59 -0
  488. package/dist/types/scene/index.d.ts +2 -0
  489. package/dist/types/scripting/NodeGraph.d.ts +84 -0
  490. package/dist/types/scripting/index.d.ts +2 -0
  491. package/dist/types/social/Social.d.ts +245 -0
  492. package/dist/types/social/index.d.ts +1 -0
  493. package/dist/types/templates/ActionTemplates.d.ts +173 -0
  494. package/dist/types/templates/PartyTemplates.d.ts +195 -0
  495. package/dist/types/templates/PuzzleTemplates.d.ts +127 -0
  496. package/dist/types/templates/RPGTemplates.d.ts +210 -0
  497. package/dist/types/templates/SportsTemplates.d.ts +162 -0
  498. package/dist/types/templates/StrategyTemplates.d.ts +264 -0
  499. package/dist/types/templates/WaveDefense.d.ts +92 -0
  500. package/dist/types/templates/index.d.ts +2 -0
  501. package/dist/types/tilemap/Tilemap.d.ts +66 -0
  502. package/dist/types/tilemap/index.d.ts +1 -0
  503. package/dist/types/tutorials/TutorialBranching.d.ts +132 -0
  504. package/dist/types/tutorials/TutorialEditor.d.ts +43 -0
  505. package/dist/types/tutorials/TutorialEngine.d.ts +237 -0
  506. package/dist/types/tutorials/TutorialOverlay.d.ts +79 -0
  507. package/dist/types/tutorials/VoiceNarration.d.ts +75 -0
  508. package/dist/types/tutorials/content/Tutorials_T04.d.ts +3 -0
  509. package/dist/types/tutorials/content/Tutorials_T05_T08.d.ts +6 -0
  510. package/dist/types/tutorials/content/Tutorials_T09_T11.d.ts +5 -0
  511. package/dist/types/tutorials/content/Tutorials_T12_T15.d.ts +6 -0
  512. package/dist/types/tutorials/content/UITutorials.d.ts +14 -0
  513. package/dist/types/tutorials/content/index.d.ts +5 -0
  514. package/dist/types/tutorials/index.d.ts +6 -0
  515. package/dist/types/ui/GameUI.d.ts +97 -0
  516. package/dist/types/ui/index.d.ts +2 -0
  517. package/dist/types/xr/ARVR.d.ts +252 -0
  518. package/dist/types/xr/index.d.ts +1 -0
  519. package/package.json +88 -0
@@ -0,0 +1,897 @@
1
+ import { EventBus } from '../core/EventBus.js';
2
+
3
+ /* ────────────────────────────────────────────────────────────────
4
+ TutorialEngine — LEGENDARY interactive tutorial system
5
+
6
+ Features:
7
+ • Step-by-step tutorials with progress tracking
8
+ • Multiple step types: text, code, highlight, interactive, quiz
9
+ • Multi-language support via I18nManager
10
+ • Overlay UI with arrows, spotlights, tooltips
11
+ • Progress persistence (localStorage)
12
+ • Tutorial packs as JSON
13
+ • Code sandboxes with live validation
14
+ • Kid-friendly mode with simplified language
15
+ ──────────────────────────────────────────────────────────────── */
16
+ /* ── TutorialEngine ───────────────────────────────────────────── */
17
+ class TutorialEngine {
18
+ constructor(i18n, persistProgress = true) {
19
+ this.i18n = i18n;
20
+ this.persistProgress = persistProgress;
21
+ this.tutorials = new Map();
22
+ this.progress = new Map();
23
+ this.validators = new Map();
24
+ this.activeTutorialId = null;
25
+ this.storagePrefix = 'nice2dev_tutorial_';
26
+ this.events = new EventBus();
27
+ if (this.persistProgress) {
28
+ this.loadAllProgress();
29
+ }
30
+ }
31
+ /* ── Tutorial Registration ──────────────────────────────────── */
32
+ /** Register a tutorial definition */
33
+ registerTutorial(definition) {
34
+ this.tutorials.set(definition.id, definition);
35
+ }
36
+ /** Register multiple tutorials at once */
37
+ registerTutorials(definitions) {
38
+ for (const def of definitions) {
39
+ this.registerTutorial(def);
40
+ }
41
+ }
42
+ /** Register a custom code validator */
43
+ registerValidator(name, fn) {
44
+ this.validators.set(name, fn);
45
+ }
46
+ /** Get all registered tutorials */
47
+ getAllTutorials() {
48
+ return Array.from(this.tutorials.values());
49
+ }
50
+ /** Get tutorials filtered by category */
51
+ getTutorialsByCategory(category) {
52
+ return this.getAllTutorials().filter(t => t.category === category);
53
+ }
54
+ /** Get tutorials filtered by difficulty */
55
+ getTutorialsByDifficulty(difficulty) {
56
+ return this.getAllTutorials().filter(t => t.difficulty === difficulty);
57
+ }
58
+ /** Get tutorials suitable for kids */
59
+ getKidFriendlyTutorials() {
60
+ return this.getAllTutorials().filter(t => t.kidFriendly === true);
61
+ }
62
+ /** Search tutorials by tag or title */
63
+ searchTutorials(query) {
64
+ const lowerQuery = query.toLowerCase();
65
+ const locale = this.i18n.getLocale();
66
+ return this.getAllTutorials().filter(t => {
67
+ var _a, _b, _c, _d, _e;
68
+ const title = ((_b = (_a = t.title[locale]) !== null && _a !== void 0 ? _a : t.title['en']) !== null && _b !== void 0 ? _b : '').toLowerCase();
69
+ const desc = ((_d = (_c = t.description[locale]) !== null && _c !== void 0 ? _c : t.description['en']) !== null && _d !== void 0 ? _d : '').toLowerCase();
70
+ const tagMatch = (_e = t.tags) === null || _e === void 0 ? void 0 : _e.some(tag => tag.toLowerCase().includes(lowerQuery));
71
+ return title.includes(lowerQuery) || desc.includes(lowerQuery) || tagMatch;
72
+ });
73
+ }
74
+ /* ── Tutorial Execution ─────────────────────────────────────── */
75
+ /** Start a tutorial */
76
+ startTutorial(tutorialId) {
77
+ const tutorial = this.tutorials.get(tutorialId);
78
+ if (!tutorial || tutorial.steps.length === 0)
79
+ return null;
80
+ // Check prerequisites
81
+ if (tutorial.prerequisites) {
82
+ for (const preReqId of tutorial.prerequisites) {
83
+ const preReqProgress = this.progress.get(preReqId);
84
+ if (!(preReqProgress === null || preReqProgress === void 0 ? void 0 : preReqProgress.completed)) {
85
+ return null; // Prerequisite not met
86
+ }
87
+ }
88
+ }
89
+ // Get or create progress
90
+ let prog = this.progress.get(tutorialId);
91
+ if (!prog || prog.completed) {
92
+ prog = {
93
+ tutorialId,
94
+ currentStepIndex: 0,
95
+ completedSteps: [],
96
+ startedAt: Date.now(),
97
+ lastAccessedAt: Date.now(),
98
+ completed: false,
99
+ quizScores: {},
100
+ codeSubmissions: {},
101
+ };
102
+ this.progress.set(tutorialId, prog);
103
+ }
104
+ this.activeTutorialId = tutorialId;
105
+ this.events.emit('tutorial:started', { tutorialId });
106
+ const step = tutorial.steps[prog.currentStepIndex];
107
+ this.events.emit('tutorial:step:entered', {
108
+ tutorialId,
109
+ stepId: step.id,
110
+ stepIndex: prog.currentStepIndex,
111
+ });
112
+ this.saveProgress(tutorialId);
113
+ return step;
114
+ }
115
+ /** Get the current step of the active tutorial */
116
+ getCurrentStep() {
117
+ var _a;
118
+ if (!this.activeTutorialId)
119
+ return null;
120
+ const tutorial = this.tutorials.get(this.activeTutorialId);
121
+ const prog = this.progress.get(this.activeTutorialId);
122
+ if (!tutorial || !prog)
123
+ return null;
124
+ return (_a = tutorial.steps[prog.currentStepIndex]) !== null && _a !== void 0 ? _a : null;
125
+ }
126
+ /** Advance to the next step */
127
+ nextStep() {
128
+ if (!this.activeTutorialId)
129
+ return null;
130
+ const tutorial = this.tutorials.get(this.activeTutorialId);
131
+ const prog = this.progress.get(this.activeTutorialId);
132
+ if (!tutorial || !prog)
133
+ return null;
134
+ // Mark current step completed
135
+ const currentStep = tutorial.steps[prog.currentStepIndex];
136
+ if (currentStep && !prog.completedSteps.includes(currentStep.id)) {
137
+ prog.completedSteps.push(currentStep.id);
138
+ this.events.emit('tutorial:step:completed', {
139
+ tutorialId: this.activeTutorialId,
140
+ stepId: currentStep.id,
141
+ });
142
+ }
143
+ // Advance
144
+ prog.currentStepIndex++;
145
+ prog.lastAccessedAt = Date.now();
146
+ // Check if tutorial is completed
147
+ if (prog.currentStepIndex >= tutorial.steps.length) {
148
+ prog.completed = true;
149
+ prog.completedAt = Date.now();
150
+ this.events.emit('tutorial:completed', {
151
+ tutorialId: this.activeTutorialId,
152
+ durationMs: prog.completedAt - prog.startedAt,
153
+ });
154
+ this.saveProgress(this.activeTutorialId);
155
+ this.activeTutorialId = null;
156
+ return null;
157
+ }
158
+ const nextStep = tutorial.steps[prog.currentStepIndex];
159
+ this.events.emit('tutorial:step:entered', {
160
+ tutorialId: this.activeTutorialId,
161
+ stepId: nextStep.id,
162
+ stepIndex: prog.currentStepIndex,
163
+ });
164
+ this.saveProgress(this.activeTutorialId);
165
+ return nextStep;
166
+ }
167
+ /** Go to a previous step */
168
+ previousStep() {
169
+ if (!this.activeTutorialId)
170
+ return null;
171
+ const tutorial = this.tutorials.get(this.activeTutorialId);
172
+ const prog = this.progress.get(this.activeTutorialId);
173
+ if (!tutorial || !prog || prog.currentStepIndex <= 0)
174
+ return null;
175
+ prog.currentStepIndex--;
176
+ prog.lastAccessedAt = Date.now();
177
+ const step = tutorial.steps[prog.currentStepIndex];
178
+ this.events.emit('tutorial:step:entered', {
179
+ tutorialId: this.activeTutorialId,
180
+ stepId: step.id,
181
+ stepIndex: prog.currentStepIndex,
182
+ });
183
+ this.saveProgress(this.activeTutorialId);
184
+ return step;
185
+ }
186
+ /** Jump to a specific step by index */
187
+ goToStep(index) {
188
+ if (!this.activeTutorialId)
189
+ return null;
190
+ const tutorial = this.tutorials.get(this.activeTutorialId);
191
+ const prog = this.progress.get(this.activeTutorialId);
192
+ if (!tutorial || !prog)
193
+ return null;
194
+ if (index < 0 || index >= tutorial.steps.length)
195
+ return null;
196
+ prog.currentStepIndex = index;
197
+ prog.lastAccessedAt = Date.now();
198
+ const step = tutorial.steps[index];
199
+ this.events.emit('tutorial:step:entered', {
200
+ tutorialId: this.activeTutorialId,
201
+ stepId: step.id,
202
+ stepIndex: index,
203
+ });
204
+ this.saveProgress(this.activeTutorialId);
205
+ return step;
206
+ }
207
+ /** Stop the current tutorial */
208
+ stopTutorial() {
209
+ if (this.activeTutorialId) {
210
+ this.saveProgress(this.activeTutorialId);
211
+ this.activeTutorialId = null;
212
+ }
213
+ }
214
+ /* ── Step Interaction ───────────────────────────────────────── */
215
+ /** Submit a quiz answer */
216
+ submitQuizAnswer(answerId) {
217
+ if (!this.activeTutorialId)
218
+ return false;
219
+ const step = this.getCurrentStep();
220
+ const prog = this.progress.get(this.activeTutorialId);
221
+ if (!step || !prog || step.type !== 'quiz')
222
+ return false;
223
+ const correct = answerId === step.quizCorrectId;
224
+ prog.quizScores[step.id] = correct;
225
+ this.events.emit('tutorial:quiz:answered', {
226
+ tutorialId: this.activeTutorialId,
227
+ stepId: step.id,
228
+ correct,
229
+ });
230
+ this.saveProgress(this.activeTutorialId);
231
+ return correct;
232
+ }
233
+ /** Submit code for validation */
234
+ validateCode(code) {
235
+ if (!this.activeTutorialId)
236
+ return { valid: false, message: 'No active tutorial' };
237
+ const step = this.getCurrentStep();
238
+ const prog = this.progress.get(this.activeTutorialId);
239
+ if (!step || !prog || step.type !== 'code')
240
+ return { valid: false, message: 'Not a code step' };
241
+ // Store submission
242
+ prog.codeSubmissions[step.id] = code;
243
+ const validation = step.codeValidation;
244
+ if (!validation) {
245
+ // No validation rules = always valid
246
+ this.events.emit('tutorial:code:validated', {
247
+ tutorialId: this.activeTutorialId,
248
+ stepId: step.id,
249
+ valid: true,
250
+ });
251
+ return { valid: true };
252
+ }
253
+ // Pattern match
254
+ if (validation.pattern) {
255
+ const regex = new RegExp(validation.pattern);
256
+ if (!regex.test(code)) {
257
+ this.events.emit('tutorial:code:validated', {
258
+ tutorialId: this.activeTutorialId,
259
+ stepId: step.id,
260
+ valid: false,
261
+ });
262
+ return { valid: false, message: 'Code does not match the expected pattern' };
263
+ }
264
+ }
265
+ // Contains all
266
+ if (validation.containsAll) {
267
+ for (const s of validation.containsAll) {
268
+ if (!code.includes(s)) {
269
+ this.events.emit('tutorial:code:validated', {
270
+ tutorialId: this.activeTutorialId,
271
+ stepId: step.id,
272
+ valid: false,
273
+ });
274
+ return { valid: false, message: `Missing required code: "${s}"` };
275
+ }
276
+ }
277
+ }
278
+ // Contains any
279
+ if (validation.containsAny) {
280
+ const found = validation.containsAny.some(s => code.includes(s));
281
+ if (!found) {
282
+ this.events.emit('tutorial:code:validated', {
283
+ tutorialId: this.activeTutorialId,
284
+ stepId: step.id,
285
+ valid: false,
286
+ });
287
+ return { valid: false, message: 'Code is missing a required element' };
288
+ }
289
+ }
290
+ // Max lines
291
+ if (validation.maxLines) {
292
+ const lineCount = code.split('\n').length;
293
+ if (lineCount > validation.maxLines) {
294
+ this.events.emit('tutorial:code:validated', {
295
+ tutorialId: this.activeTutorialId,
296
+ stepId: step.id,
297
+ valid: false,
298
+ });
299
+ return { valid: false, message: `Code exceeds ${validation.maxLines} lines` };
300
+ }
301
+ }
302
+ // Custom validator
303
+ if (validation.customValidator) {
304
+ const validatorFn = this.validators.get(validation.customValidator);
305
+ if (validatorFn) {
306
+ const result = validatorFn(code);
307
+ this.events.emit('tutorial:code:validated', {
308
+ tutorialId: this.activeTutorialId,
309
+ stepId: step.id,
310
+ valid: result.valid,
311
+ });
312
+ return result;
313
+ }
314
+ }
315
+ this.events.emit('tutorial:code:validated', {
316
+ tutorialId: this.activeTutorialId,
317
+ stepId: step.id,
318
+ valid: true,
319
+ });
320
+ return { valid: true };
321
+ }
322
+ /** Request a hint for the current step */
323
+ getHint() {
324
+ var _a, _b;
325
+ if (!this.activeTutorialId)
326
+ return null;
327
+ const step = this.getCurrentStep();
328
+ if (!(step === null || step === void 0 ? void 0 : step.hint))
329
+ return null;
330
+ this.events.emit('tutorial:hint:shown', {
331
+ tutorialId: this.activeTutorialId,
332
+ stepId: step.id,
333
+ });
334
+ const locale = this.i18n.getLocale();
335
+ return (_b = (_a = step.hint[locale]) !== null && _a !== void 0 ? _a : step.hint['en']) !== null && _b !== void 0 ? _b : null;
336
+ }
337
+ /** Get localized content for current step */
338
+ getStepContent(step) {
339
+ var _a, _b, _c, _d;
340
+ const locale = this.i18n.getLocale();
341
+ return {
342
+ title: (_b = (_a = step.title[locale]) !== null && _a !== void 0 ? _a : step.title['en']) !== null && _b !== void 0 ? _b : step.id,
343
+ content: (_d = (_c = step.content[locale]) !== null && _c !== void 0 ? _c : step.content['en']) !== null && _d !== void 0 ? _d : '',
344
+ };
345
+ }
346
+ /* ── Progress Management ────────────────────────────────────── */
347
+ /** Get progress for a tutorial */
348
+ getProgress(tutorialId) {
349
+ return this.progress.get(tutorialId);
350
+ }
351
+ /** Get progress percentage (0 to 1) */
352
+ getProgressPercent(tutorialId) {
353
+ const tutorial = this.tutorials.get(tutorialId);
354
+ const prog = this.progress.get(tutorialId);
355
+ if (!tutorial || !prog || tutorial.steps.length === 0)
356
+ return 0;
357
+ if (prog.completed)
358
+ return 1;
359
+ return prog.completedSteps.length / tutorial.steps.length;
360
+ }
361
+ /** Check if a tutorial is completed */
362
+ isCompleted(tutorialId) {
363
+ var _a;
364
+ return ((_a = this.progress.get(tutorialId)) === null || _a === void 0 ? void 0 : _a.completed) === true;
365
+ }
366
+ /** Get quiz score summary for a completed tutorial */
367
+ getQuizScore(tutorialId) {
368
+ const prog = this.progress.get(tutorialId);
369
+ if (!prog)
370
+ return { correct: 0, total: 0, percentage: 0 };
371
+ const entries = Object.values(prog.quizScores);
372
+ const total = entries.length;
373
+ const correct = entries.filter(Boolean).length;
374
+ return {
375
+ correct,
376
+ total,
377
+ percentage: total > 0 ? (correct / total) * 100 : 0,
378
+ };
379
+ }
380
+ /** Get all tutorials with their completion status */
381
+ getAllProgress() {
382
+ return this.getAllTutorials().map(tutorial => ({
383
+ tutorial,
384
+ progress: this.progress.get(tutorial.id),
385
+ percent: this.getProgressPercent(tutorial.id),
386
+ }));
387
+ }
388
+ /** Reset progress for a tutorial */
389
+ resetProgress(tutorialId) {
390
+ this.progress.delete(tutorialId);
391
+ if (this.persistProgress) {
392
+ this.removeStoredProgress(tutorialId);
393
+ }
394
+ }
395
+ /** Reset all progress */
396
+ resetAllProgress() {
397
+ const ids = Array.from(this.progress.keys());
398
+ this.progress.clear();
399
+ if (this.persistProgress) {
400
+ for (const id of ids) {
401
+ this.removeStoredProgress(id);
402
+ }
403
+ }
404
+ }
405
+ /* ── Persistence ────────────────────────────────────────────── */
406
+ saveProgress(tutorialId) {
407
+ if (!this.persistProgress)
408
+ return;
409
+ const prog = this.progress.get(tutorialId);
410
+ if (!prog)
411
+ return;
412
+ try {
413
+ if (typeof localStorage !== 'undefined') {
414
+ localStorage.setItem(`${this.storagePrefix}${tutorialId}`, JSON.stringify(prog));
415
+ this.events.emit('tutorial:progress:saved', { tutorialId });
416
+ }
417
+ }
418
+ catch (_a) {
419
+ // localStorage might not be available or quota exceeded
420
+ }
421
+ }
422
+ loadAllProgress() {
423
+ try {
424
+ if (typeof localStorage === 'undefined')
425
+ return;
426
+ for (let i = 0; i < localStorage.length; i++) {
427
+ const key = localStorage.key(i);
428
+ if (!(key === null || key === void 0 ? void 0 : key.startsWith(this.storagePrefix)))
429
+ continue;
430
+ const raw = localStorage.getItem(key);
431
+ if (!raw)
432
+ continue;
433
+ const parsed = JSON.parse(raw);
434
+ if (isProgressData(parsed)) {
435
+ this.progress.set(parsed.tutorialId, parsed);
436
+ }
437
+ }
438
+ }
439
+ catch (_a) {
440
+ // Ignore parse/access errors
441
+ }
442
+ }
443
+ removeStoredProgress(tutorialId) {
444
+ try {
445
+ if (typeof localStorage !== 'undefined') {
446
+ localStorage.removeItem(`${this.storagePrefix}${tutorialId}`);
447
+ }
448
+ }
449
+ catch (_a) {
450
+ // Ignore
451
+ }
452
+ }
453
+ /* ── State ──────────────────────────────────────────────────── */
454
+ getActiveTutorialId() {
455
+ return this.activeTutorialId;
456
+ }
457
+ getActiveTutorial() {
458
+ var _a;
459
+ if (!this.activeTutorialId)
460
+ return null;
461
+ return (_a = this.tutorials.get(this.activeTutorialId)) !== null && _a !== void 0 ? _a : null;
462
+ }
463
+ getTotalSteps() {
464
+ var _a;
465
+ if (!this.activeTutorialId)
466
+ return 0;
467
+ const tutorial = this.tutorials.get(this.activeTutorialId);
468
+ return (_a = tutorial === null || tutorial === void 0 ? void 0 : tutorial.steps.length) !== null && _a !== void 0 ? _a : 0;
469
+ }
470
+ getCurrentStepIndex() {
471
+ var _a;
472
+ if (!this.activeTutorialId)
473
+ return -1;
474
+ const prog = this.progress.get(this.activeTutorialId);
475
+ return (_a = prog === null || prog === void 0 ? void 0 : prog.currentStepIndex) !== null && _a !== void 0 ? _a : -1;
476
+ }
477
+ dispose() {
478
+ this.stopTutorial();
479
+ this.tutorials.clear();
480
+ this.progress.clear();
481
+ this.validators.clear();
482
+ }
483
+ }
484
+ /* ── Type guard for loaded progress ──────────────────────────── */
485
+ function isProgressData(v) {
486
+ if (typeof v !== 'object' || v === null)
487
+ return false;
488
+ const obj = v;
489
+ return (typeof obj.tutorialId === 'string' &&
490
+ typeof obj.currentStepIndex === 'number' &&
491
+ Array.isArray(obj.completedSteps) &&
492
+ typeof obj.startedAt === 'number');
493
+ }
494
+ /* ── Built-in Tutorials ──────────────────────────────────────── */
495
+ /** Tutorial: First Game — Bouncing Ball */
496
+ const TUTORIAL_FIRST_GAME = {
497
+ id: 'first-game-bouncing-ball',
498
+ title: {
499
+ en: 'Your First Game: Bouncing Ball',
500
+ pl: 'Twoja pierwsza gra: Odbijająca się piłka',
501
+ de: 'Dein erstes Spiel: Hüpfender Ball',
502
+ },
503
+ description: {
504
+ en: 'Learn to create a simple bouncing ball game. Perfect for beginners!',
505
+ pl: 'Naucz się tworzyć prostą grę z odbijającą się piłką. Idealne na początek!',
506
+ de: 'Lerne, ein einfaches Hüpfball-Spiel zu erstellen. Perfekt für Anfänger!',
507
+ },
508
+ category: 'game-basics',
509
+ difficulty: 'beginner',
510
+ estimatedMinutes: 15,
511
+ kidFriendly: true,
512
+ ageRange: { min: 8, max: 99 },
513
+ tags: ['ball', 'physics', 'beginner', 'first-game'],
514
+ steps: [
515
+ {
516
+ id: 'welcome',
517
+ type: 'text',
518
+ title: {
519
+ en: 'Welcome!',
520
+ pl: 'Witaj!',
521
+ de: 'Willkommen!',
522
+ },
523
+ content: {
524
+ en: 'In this tutorial, you will create a bouncing ball game! 🎮\n\nYou will learn:\n• How to create entities\n• How to add physics\n• How to handle collisions\n\nLet\'s get started!',
525
+ pl: 'W tym samouczku stworzysz grę z odbijającą się piłką! 🎮\n\nNauczysz się:\n• Jak tworzyć obiekty\n• Jak dodawać fizykę\n• Jak obsługiwać kolizje\n\nZaczynajmy!',
526
+ de: 'In diesem Tutorial erstellst du ein Hüpfball-Spiel! 🎮\n\nDu lernst:\n• Wie man Entities erstellt\n• Wie man Physik hinzufügt\n• Wie man Kollisionen behandelt\n\nLos geht\'s!',
527
+ },
528
+ skippable: true,
529
+ tooltipPosition: 'center',
530
+ },
531
+ {
532
+ id: 'create-engine',
533
+ type: 'code',
534
+ title: {
535
+ en: 'Create the Game Engine',
536
+ pl: 'Utwórz silnik gry',
537
+ de: 'Erstelle die Game-Engine',
538
+ },
539
+ content: {
540
+ en: 'First, let\'s create a game engine instance and set up the canvas.\n\nType the code below to initialize your game:',
541
+ pl: 'Najpierw utwórzmy instancję silnika gry i skonfigurujmy canvas.\n\nWpisz poniższy kod, aby zainicjować grę:',
542
+ de: 'Zuerst erstellen wir eine Game-Engine-Instanz und richten das Canvas ein.\n\nGib den folgenden Code ein, um dein Spiel zu initialisieren:',
543
+ },
544
+ codeTemplate: '// Create a game engine\nconst engine = ',
545
+ codeSolution: 'const engine = new Engine({\n canvas: document.getElementById("game"),\n width: 800,\n height: 600,\n});',
546
+ codeValidation: {
547
+ containsAll: ['new Engine', 'canvas'],
548
+ },
549
+ hint: {
550
+ en: 'Use: new Engine({ canvas: ..., width: 800, height: 600 })',
551
+ pl: 'Użyj: new Engine({ canvas: ..., width: 800, height: 600 })',
552
+ de: 'Verwende: new Engine({ canvas: ..., width: 800, height: 600 })',
553
+ },
554
+ },
555
+ {
556
+ id: 'create-ball',
557
+ type: 'code',
558
+ title: {
559
+ en: 'Create the Ball',
560
+ pl: 'Utwórz piłkę',
561
+ de: 'Erstelle den Ball',
562
+ },
563
+ content: {
564
+ en: 'Now let\'s create a ball entity with a transform and a circle shape!',
565
+ pl: 'Teraz stwórzmy obiekt piłki z transformacją i kształtem koła!',
566
+ de: 'Jetzt erstellen wir eine Ball-Entity mit Transform und Kreisform!',
567
+ },
568
+ codeTemplate: '// Create a ball entity\nconst ball = engine.world.createEntity();\n// Add components here...',
569
+ codeSolution: 'const ball = engine.world.createEntity();\nengine.world.addComponent(ball, "Transform", { x: 400, y: 100 });\nengine.world.addComponent(ball, "Sprite", { shape: "circle", radius: 20, color: "red" });',
570
+ codeValidation: {
571
+ containsAll: ['createEntity', 'Transform', 'addComponent'],
572
+ },
573
+ hint: {
574
+ en: 'Create an entity, then add Transform and Sprite components.',
575
+ pl: 'Utwórz obiekt, a następnie dodaj komponenty Transform i Sprite.',
576
+ de: 'Erstelle eine Entity und füge Transform- und Sprite-Komponenten hinzu.',
577
+ },
578
+ },
579
+ {
580
+ id: 'add-physics',
581
+ type: 'code',
582
+ title: {
583
+ en: 'Add Physics!',
584
+ pl: 'Dodaj fizykę!',
585
+ de: 'Füge Physik hinzu!',
586
+ },
587
+ content: {
588
+ en: 'Let\'s make the ball fall and bounce! Add a RigidBody and a Collider.',
589
+ pl: 'Sprawmy, żeby piłka spadała i odbijała się! Dodaj RigidBody i Collider.',
590
+ de: 'Lass den Ball fallen und abprallen! Füge einen RigidBody und einen Collider hinzu.',
591
+ },
592
+ codeTemplate: '// Add physics to the ball\n',
593
+ codeSolution: 'engine.world.addComponent(ball, "RigidBody2D", { type: "dynamic", gravityScale: 1 });\nengine.world.addComponent(ball, "Collider2D", { shape: "circle", radius: 20, restitution: 0.8 });',
594
+ codeValidation: {
595
+ containsAll: ['RigidBody2D', 'Collider2D', 'restitution'],
596
+ },
597
+ hint: {
598
+ en: 'RigidBody2D makes it move, Collider2D detects hits. Set restitution > 0 for bounce!',
599
+ pl: 'RigidBody2D porusza obiekt, Collider2D wykrywa zderzenia. Ustaw restitution > 0 dla odbicia!',
600
+ de: 'RigidBody2D bewegt es, Collider2D erkennt Treffer. Setze restitution > 0 für Abprallen!',
601
+ },
602
+ },
603
+ {
604
+ id: 'quiz-physics',
605
+ type: 'quiz',
606
+ title: {
607
+ en: 'Quick Quiz! 🧠',
608
+ pl: 'Szybki quiz! 🧠',
609
+ de: 'Schnelles Quiz! 🧠',
610
+ },
611
+ content: {
612
+ en: 'What does the "restitution" value control?',
613
+ pl: 'Co kontroluje wartość "restitution"?',
614
+ de: 'Was steuert der "restitution"-Wert?',
615
+ },
616
+ quizOptions: [
617
+ { id: 'a', text: { en: 'The ball\'s color', pl: 'Kolor piłki', de: 'Die Farbe des Balls' } },
618
+ { id: 'b', text: { en: 'How bouncy the ball is', pl: 'Jak bardzo piłka się odbija', de: 'Wie stark der Ball abprallt' } },
619
+ { id: 'c', text: { en: 'The ball\'s speed', pl: 'Prędkość piłki', de: 'Die Geschwindigkeit des Balls' } },
620
+ { id: 'd', text: { en: 'The ball\'s size', pl: 'Rozmiar piłki', de: 'Die Größe des Balls' } },
621
+ ],
622
+ quizCorrectId: 'b',
623
+ },
624
+ {
625
+ id: 'create-floor',
626
+ type: 'code',
627
+ title: {
628
+ en: 'Create the Floor',
629
+ pl: 'Utwórz podłogę',
630
+ de: 'Erstelle den Boden',
631
+ },
632
+ content: {
633
+ en: 'The ball needs something to bounce off! Create a static floor at the bottom.',
634
+ pl: 'Piłka potrzebuje czegoś, od czego się odbije! Utwórz statyczną podłogę na dole.',
635
+ de: 'Der Ball braucht etwas zum Abprallen! Erstelle einen statischen Boden unten.',
636
+ },
637
+ codeTemplate: '// Create a floor\nconst floor = engine.world.createEntity();\n',
638
+ codeSolution: 'const floor = engine.world.createEntity();\nengine.world.addComponent(floor, "Transform", { x: 400, y: 580 });\nengine.world.addComponent(floor, "Collider2D", { shape: "box", width: 800, height: 20 });\nengine.world.addComponent(floor, "RigidBody2D", { type: "static" });',
639
+ codeValidation: {
640
+ containsAll: ['createEntity', 'static', 'Collider2D'],
641
+ },
642
+ hint: {
643
+ en: 'Use RigidBody2D type: "static" — the floor shouldn\'t move!',
644
+ pl: 'Użyj RigidBody2D type: "static" — podłoga nie powinna się ruszać!',
645
+ de: 'Verwende RigidBody2D type: "static" — der Boden soll sich nicht bewegen!',
646
+ },
647
+ },
648
+ {
649
+ id: 'start-game',
650
+ type: 'code',
651
+ title: {
652
+ en: 'Start the Game! 🚀',
653
+ pl: 'Uruchom grę! 🚀',
654
+ de: 'Starte das Spiel! 🚀',
655
+ },
656
+ content: {
657
+ en: 'Everything is ready! Start the game loop to see your bouncing ball in action!',
658
+ pl: 'Wszystko gotowe! Uruchom pętlę gry, aby zobaczyć swoją odbijającą się piłkę w akcji!',
659
+ de: 'Alles bereit! Starte die Game-Loop, um deinen hüpfenden Ball in Aktion zu sehen!',
660
+ },
661
+ codeTemplate: '// Start the game\n',
662
+ codeSolution: 'engine.start();',
663
+ codeValidation: {
664
+ containsAll: ['engine.start'],
665
+ },
666
+ },
667
+ {
668
+ id: 'congratulations',
669
+ type: 'text',
670
+ title: {
671
+ en: 'Congratulations! 🎉',
672
+ pl: 'Gratulacje! 🎉',
673
+ de: 'Herzlichen Glückwunsch! 🎉',
674
+ },
675
+ content: {
676
+ en: 'You just created your first game with Nice2Dev Game Engine!\n\n🏆 You learned:\n• Creating entities\n• Adding components (Transform, Sprite, RigidBody2D, Collider2D)\n• Physics simulation with restitution\n• Starting the game loop\n\nNext up: Try the "Space Shooter" tutorial! 🚀',
677
+ pl: 'Właśnie stworzyłeś swoją pierwszą grę z Nice2Dev Game Engine!\n\n🏆 Nauczyłeś się:\n• Tworzenia obiektów\n• Dodawania komponentów (Transform, Sprite, RigidBody2D, Collider2D)\n• Symulacji fizyki z restitution\n• Uruchamiania pętli gry\n\nNastępnie: Spróbuj samouczka "Kosmiczny Strzelec"! 🚀',
678
+ de: 'Du hast gerade dein erstes Spiel mit Nice2Dev Game Engine erstellt!\n\n🏆 Du hast gelernt:\n• Entities erstellen\n• Komponenten hinzufügen (Transform, Sprite, RigidBody2D, Collider2D)\n• Physiksimulation mit Restitution\n• Game-Loop starten\n\nAls nächstes: Probiere das "Space Shooter"-Tutorial! 🚀',
679
+ },
680
+ tooltipPosition: 'center',
681
+ },
682
+ ],
683
+ };
684
+ /** Tutorial: Space Shooter */
685
+ const TUTORIAL_SPACE_SHOOTER = {
686
+ id: 'space-shooter',
687
+ title: {
688
+ en: 'Space Shooter 🚀',
689
+ pl: 'Kosmiczny Strzelec 🚀',
690
+ de: 'Weltraum-Shooter 🚀',
691
+ },
692
+ description: {
693
+ en: 'Build a classic space shooter! Learn input handling, spawning enemies, and scoring.',
694
+ pl: 'Zbuduj klasyczną kosmiczną strzelankę! Naucz się obsługi sterowania, tworzenia wrogów i punktacji.',
695
+ de: 'Baue einen klassischen Weltraum-Shooter! Lerne Eingabeverarbeitung, Gegner-Spawning und Punktestand.',
696
+ },
697
+ category: 'game-basics',
698
+ difficulty: 'beginner',
699
+ estimatedMinutes: 25,
700
+ kidFriendly: true,
701
+ ageRange: { min: 10, max: 99 },
702
+ tags: ['shooter', 'space', 'input', 'spawning', 'scoring'],
703
+ prerequisites: ['first-game-bouncing-ball'],
704
+ steps: [
705
+ {
706
+ id: 'intro',
707
+ type: 'text',
708
+ title: { en: 'Space Shooter', pl: 'Kosmiczny Strzelec', de: 'Weltraum-Shooter' },
709
+ content: {
710
+ en: 'Welcome to the Space Shooter tutorial! 🚀\n\nYou will learn:\n• Keyboard input handling\n• Spawning entities dynamically\n• Collision-based scoring\n• Game over logic\n\nPrerequisite: "Your First Game: Bouncing Ball"',
711
+ pl: 'Witaj w samouczku Kosmiczny Strzelec! 🚀\n\nNauczysz się:\n• Obsługi sterowania z klawiatury\n• Dynamicznego tworzenia obiektów\n• Punktacji na podstawie kolizji\n• Logiki końca gry\n\nWymagany: "Twoja pierwsza gra: Odbijająca się piłka"',
712
+ de: 'Willkommen beim Weltraum-Shooter Tutorial! 🚀\n\nDu lernst:\n• Tastatureingabe-Verarbeitung\n• Dynamisches Entity-Spawning\n• Kollisionsbasiertes Scoring\n• Game-Over-Logik\n\nVoraussetzung: "Dein erstes Spiel: Hüpfender Ball"',
713
+ },
714
+ tooltipPosition: 'center',
715
+ },
716
+ {
717
+ id: 'setup-scene',
718
+ type: 'code',
719
+ title: { en: 'Setup the Scene', pl: 'Przygotuj scenę', de: 'Szene einrichten' },
720
+ content: {
721
+ en: 'Create the engine and a spaceship entity. The ship should be at the bottom center of the screen.',
722
+ pl: 'Utwórz silnik i obiekt statku kosmicznego. Statek powinien być na dole, pośrodku ekranu.',
723
+ de: 'Erstelle die Engine und eine Raumschiff-Entity. Das Schiff soll unten in der Mitte des Bildschirms sein.',
724
+ },
725
+ codeTemplate: '// Setup engine and player ship\nconst engine = new Engine({ canvas: document.getElementById("game"), width: 800, height: 600 });\n\n// Create player ship\n',
726
+ codeSolution: 'const ship = engine.world.createEntity();\nengine.world.addComponent(ship, "Transform", { x: 400, y: 550 });\nengine.world.addComponent(ship, "Sprite", { shape: "triangle", width: 30, height: 40, color: "cyan" });',
727
+ codeValidation: { containsAll: ['createEntity', 'Transform', 'Sprite'] },
728
+ },
729
+ {
730
+ id: 'add-input',
731
+ type: 'code',
732
+ title: { en: 'Add Controls', pl: 'Dodaj sterowanie', de: 'Steuerung hinzufügen' },
733
+ content: {
734
+ en: 'Let\'s make the ship move with arrow keys! Create a system that reads keyboard input.',
735
+ pl: 'Sprawmy, żeby statek poruszał się strzałkami! Stwórz system odczytujący klawiaturę.',
736
+ de: 'Lass das Schiff mit Pfeiltasten bewegen! Erstelle ein System, das Tastatureingaben liest.',
737
+ },
738
+ codeTemplate: '// Movement system\nengine.world.addSystem("ShipMovement", (world) => {\n // Your code here\n});\n',
739
+ codeSolution: 'engine.world.addSystem("ShipMovement", (world) => {\n const input = engine.input;\n const transform = world.getComponent(ship, "Transform");\n const speed = 5;\n if (input.isKeyDown("ArrowLeft")) transform.x -= speed;\n if (input.isKeyDown("ArrowRight")) transform.x += speed;\n});',
740
+ codeValidation: { containsAll: ['isKeyDown', 'ArrowLeft', 'ArrowRight'] },
741
+ hint: {
742
+ en: 'Use engine.input.isKeyDown("ArrowLeft/ArrowRight") to check keys.',
743
+ pl: 'Użyj engine.input.isKeyDown("ArrowLeft/ArrowRight") do sprawdzenia klawiszy.',
744
+ de: 'Verwende engine.input.isKeyDown("ArrowLeft/ArrowRight") um Tasten zu prüfen.',
745
+ },
746
+ },
747
+ {
748
+ id: 'quiz-input',
749
+ type: 'quiz',
750
+ title: { en: 'Input Quiz 🧠', pl: 'Quiz o sterowaniu 🧠', de: 'Eingabe-Quiz 🧠' },
751
+ content: {
752
+ en: 'What is the difference between isKeyDown and isKeyPressed?',
753
+ pl: 'Jaka jest różnica między isKeyDown i isKeyPressed?',
754
+ de: 'Was ist der Unterschied zwischen isKeyDown und isKeyPressed?',
755
+ },
756
+ quizOptions: [
757
+ { id: 'a', text: { en: 'They are the same thing', pl: 'To to samo', de: 'Sie sind dasselbe' } },
758
+ { id: 'b', text: { en: 'isKeyDown is continuous, isKeyPressed is single-frame', pl: 'isKeyDown jest ciągły, isKeyPressed jednoklatkowo', de: 'isKeyDown ist kontinuierlich, isKeyPressed einmalig' } },
759
+ { id: 'c', text: { en: 'isKeyDown works only with arrows', pl: 'isKeyDown działa tylko ze strzałkami', de: 'isKeyDown funktioniert nur mit Pfeiltasten' } },
760
+ ],
761
+ quizCorrectId: 'b',
762
+ },
763
+ {
764
+ id: 'shooting',
765
+ type: 'code',
766
+ title: { en: 'Shoot Bullets! 🔫', pl: 'Strzelaj pociskami! 🔫', de: 'Schieße Kugeln! 🔫' },
767
+ content: {
768
+ en: 'Add shooting! When Space is pressed, create a bullet entity that moves upward.',
769
+ pl: 'Dodaj strzelanie! Po naciśnięciu Spacji utwórz pocisk, który leci w górę.',
770
+ de: 'Füge Schießen hinzu! Bei Leertaste einen Kugel-Entity erstellen, der nach oben fliegt.',
771
+ },
772
+ codeTemplate: '// Shooting system\nengine.world.addSystem("Shooting", (world) => {\n const input = engine.input;\n // Your shooting code here\n});\n',
773
+ codeSolution: 'if (input.isKeyPressed("Space")) {\n const bullet = world.createEntity();\n const shipPos = world.getComponent(ship, "Transform");\n world.addComponent(bullet, "Transform", { x: shipPos.x, y: shipPos.y - 20 });\n world.addComponent(bullet, "Velocity", { x: 0, y: -10 });\n world.addComponent(bullet, "Sprite", { shape: "rect", width: 4, height: 10, color: "yellow" });\n}',
774
+ codeValidation: { containsAll: ['isKeyPressed', 'Space', 'createEntity', 'bullet'] },
775
+ hint: {
776
+ en: 'Use isKeyPressed (not isKeyDown!) for single-shot per press.',
777
+ pl: 'Użyj isKeyPressed (nie isKeyDown!) dla jednego strzału na naciśnięcie.',
778
+ de: 'Verwende isKeyPressed (nicht isKeyDown!) für einen Schuss pro Tastendruck.',
779
+ },
780
+ },
781
+ {
782
+ id: 'checkpoint-halfway',
783
+ type: 'checkpoint',
784
+ title: { en: 'Halfway There! 🎯', pl: 'Połowa drogi! 🎯', de: 'Halb geschafft! 🎯' },
785
+ content: {
786
+ en: 'Great progress! You have a moving ship that can shoot. Let\'s add enemies next!',
787
+ pl: 'Świetne postępy! Masz poruszający się statek, który potrafi strzelać. Dodajmy teraz wrogów!',
788
+ de: 'Toller Fortschritt! Du hast ein bewegliches Schiff, das schießen kann. Fügen wir als nächstes Gegner hinzu!',
789
+ },
790
+ },
791
+ {
792
+ id: 'complete',
793
+ type: 'text',
794
+ title: { en: 'Mission Complete! 🏆', pl: 'Misja zakończona! 🏆', de: 'Mission abgeschlossen! 🏆' },
795
+ content: {
796
+ en: 'You built a Space Shooter! 🚀\n\nSkills mastered:\n• Input handling (keyboard)\n• Dynamic entity spawning\n• Entity removal\n• Systems architecture\n\nChallenge: Add a scoring system and display it on screen!',
797
+ pl: 'Zbudowałeś Kosmicznego Strzelca! 🚀\n\nOpanowane umiejętności:\n• Obsługa sterowania (klawiatura)\n• Dynamiczne tworzenie obiektów\n• Usuwanie obiektów\n• Architektura systemów\n\nWyzwanie: Dodaj system punktacji i wyświetl go na ekranie!',
798
+ de: 'Du hast einen Weltraum-Shooter gebaut! 🚀\n\nGelernte Fähigkeiten:\n• Eingabeverarbeitung (Tastatur)\n• Dynamisches Entity-Spawning\n• Entity-Entfernung\n• System-Architektur\n\nHerausforderung: Füge ein Punktesystem hinzu und zeige es auf dem Bildschirm an!',
799
+ },
800
+ tooltipPosition: 'center',
801
+ },
802
+ ],
803
+ };
804
+ /** Tutorial: NiceDataGrid basics (for nice2dev-ui) */
805
+ const TUTORIAL_DATAGRID_BASICS = {
806
+ id: 'ui-datagrid-basics',
807
+ title: {
808
+ en: 'NiceDataGrid: Master the Grid',
809
+ pl: 'NiceDataGrid: Opanuj siatkę',
810
+ de: 'NiceDataGrid: Das Grid meistern',
811
+ },
812
+ description: {
813
+ en: 'Learn to use NiceDataGrid for sorting, filtering, grouping, and editing data.',
814
+ pl: 'Naucz się używać NiceDataGrid do sortowania, filtrowania, grupowania i edycji danych.',
815
+ de: 'Lerne NiceDataGrid für Sortieren, Filtern, Gruppieren und Bearbeiten von Daten.',
816
+ },
817
+ category: 'ui-controls',
818
+ difficulty: 'beginner',
819
+ estimatedMinutes: 20,
820
+ kidFriendly: false,
821
+ tags: ['grid', 'data', 'filtering', 'sorting', 'nice2dev-ui'],
822
+ steps: [
823
+ {
824
+ id: 'intro',
825
+ type: 'text',
826
+ title: { en: 'Welcome to NiceDataGrid', pl: 'Witaj w NiceDataGrid', de: 'Willkommen bei NiceDataGrid' },
827
+ content: {
828
+ en: 'NiceDataGrid is a powerful data table component.\n\nYou will learn:\n• Creating a basic grid\n• Adding columns\n• Sorting & filtering\n• Grouping data\n• Cell editing',
829
+ pl: 'NiceDataGrid to potężny komponent tabeli danych.\n\nNauczysz się:\n• Tworzenia podstawowej siatki\n• Dodawania kolumn\n• Sortowania i filtrowania\n• Grupowania danych\n• Edycji komórek',
830
+ de: 'NiceDataGrid ist eine leistungsstarke Datentabellen-Komponente.\n\nDu lernst:\n• Ein einfaches Grid erstellen\n• Spalten hinzufügen\n• Sortieren & Filtern\n• Daten gruppieren\n• Zellenbearbeitung',
831
+ },
832
+ },
833
+ {
834
+ id: 'basic-grid',
835
+ type: 'code',
836
+ title: { en: 'Create a Grid', pl: 'Utwórz siatkę', de: 'Grid erstellen' },
837
+ content: {
838
+ en: 'Create a basic NiceDataGrid with a data source and columns.',
839
+ pl: 'Utwórz podstawową NiceDataGrid ze źródłem danych i kolumnami.',
840
+ de: 'Erstelle ein einfaches NiceDataGrid mit Datenquelle und Spalten.',
841
+ },
842
+ codeTemplate: 'import { NiceDataGrid } from "@nice2dev/ui";\n\n// Create your grid\n',
843
+ codeSolution: '<NiceDataGrid\n dataSource={employees}\n columns={[\n { dataField: "name", caption: "Name" },\n { dataField: "department", caption: "Department" },\n { dataField: "salary", caption: "Salary", dataType: "number" },\n ]}\n sorting={{ enabled: true }}\n filtering={{ enabled: true }}\n/>',
844
+ codeValidation: { containsAll: ['NiceDataGrid', 'dataSource', 'columns'] },
845
+ },
846
+ {
847
+ id: 'filtering',
848
+ type: 'code',
849
+ title: { en: 'Add Filtering', pl: 'Dodaj filtrowanie', de: 'Filter hinzufügen' },
850
+ content: {
851
+ en: 'Enable header filter and filter row for your grid.',
852
+ pl: 'Włącz filtr nagłówka i wiersz filtrowania w siatce.',
853
+ de: 'Aktiviere Header-Filter und Filter-Zeile für dein Grid.',
854
+ },
855
+ codeTemplate: '// Add filtering props to your grid\n',
856
+ codeSolution: '<NiceDataGrid\n dataSource={employees}\n columns={columns}\n filtering={{ enabled: true, filterRow: true, headerFilter: true }}\n/>',
857
+ codeValidation: { containsAll: ['filtering', 'enabled', 'true'] },
858
+ },
859
+ {
860
+ id: 'quiz-filtering',
861
+ type: 'quiz',
862
+ title: { en: 'Filtering Quiz 🧠', pl: 'Quiz o filtrowaniu 🧠', de: 'Filter-Quiz 🧠' },
863
+ content: {
864
+ en: 'What is the difference between headerFilter and filterRow?',
865
+ pl: 'Jaka jest różnica między headerFilter a filterRow?',
866
+ de: 'Was ist der Unterschied zwischen headerFilter und filterRow?',
867
+ },
868
+ quizOptions: [
869
+ { id: 'a', text: { en: 'headerFilter shows a dropdown, filterRow shows a text input', pl: 'headerFilter pokazuje dropdown, filterRow pokazuje pole tekstowe', de: 'headerFilter zeigt Dropdown, filterRow zeigt Texteingabe' } },
870
+ { id: 'b', text: { en: 'They are the same', pl: 'Są identyczne', de: 'Sie sind gleich' } },
871
+ { id: 'c', text: { en: 'filterRow is faster', pl: 'filterRow jest szybszy', de: 'filterRow ist schneller' } },
872
+ ],
873
+ quizCorrectId: 'a',
874
+ },
875
+ {
876
+ id: 'complete',
877
+ type: 'text',
878
+ title: { en: 'Grid Master! 🏆', pl: 'Mistrz Siatki! 🏆', de: 'Grid-Meister! 🏆' },
879
+ content: {
880
+ en: 'You now know the basics of NiceDataGrid!\n\n🏆 Skills:\n• Data binding\n• Column configuration\n• Sorting & filtering\n\nNext: Try grouping, editing, and custom cell templates!',
881
+ pl: 'Znasz już podstawy NiceDataGrid!\n\n🏆 Umiejętności:\n• Wiązanie danych\n• Konfiguracja kolumn\n• Sortowanie i filtrowanie\n\nDalej: Spróbuj grupowania, edycji i własnych szablonów komórek!',
882
+ de: 'Du kennst jetzt die Grundlagen von NiceDataGrid!\n\n🏆 Fähigkeiten:\n• Datenbindung\n• Spaltenkonfiguration\n• Sortieren & Filtern\n\nWeiter: Probiere Gruppieren, Bearbeiten und benutzerdefinierte Zellenvorlagen!',
883
+ },
884
+ },
885
+ ],
886
+ };
887
+ /** Get all built-in tutorials */
888
+ function getBuiltInTutorials() {
889
+ return [
890
+ TUTORIAL_FIRST_GAME,
891
+ TUTORIAL_SPACE_SHOOTER,
892
+ TUTORIAL_DATAGRID_BASICS,
893
+ ];
894
+ }
895
+
896
+ export { TUTORIAL_DATAGRID_BASICS, TUTORIAL_FIRST_GAME, TUTORIAL_SPACE_SHOOTER, TutorialEngine, getBuiltInTutorials };
897
+ //# sourceMappingURL=TutorialEngine.js.map