@nice2dev/game-engine 1.1.6 → 1.1.9

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 (496) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/dist/cjs/core/GameConfig.js +21 -7
  3. package/dist/cjs/devtools/DeveloperExperience.js +5 -5
  4. package/dist/cjs/dialogue/DialogueSystem.js +1 -1
  5. package/dist/cjs/editor/AssetBrowser.js +26 -25
  6. package/dist/cjs/editor/NiceGameEditor.js +66 -49
  7. package/dist/cjs/godot-integration/components/GodotProjectBrowser.js +33 -32
  8. package/dist/cjs/i18n/I18n.js +305 -0
  9. package/dist/cjs/kids/KidMode.js +36 -36
  10. package/dist/cjs/kids/KidTools.js +31 -31
  11. package/dist/cjs/native-engine/InputSystem.js +9 -2
  12. package/dist/cjs/package.json +3 -0
  13. package/dist/cjs/plugins/PluginSDK.js +1 -1
  14. package/dist/cjs/plugins/PluginTestKit.js +1 -1
  15. package/dist/cjs/quest/QuestSystem.js +5 -1
  16. package/dist/cjs/release/MobileExport.js +45 -12
  17. package/dist/cjs/tutorials/TutorialBranching.js +12 -12
  18. package/dist/cjs/tutorials/TutorialEngine.js +35 -35
  19. package/dist/cjs/tutorials/content/Tutorials_T05_T08.js +106 -89
  20. package/dist/cjs/tutorials/content/Tutorials_T09_T11.js +103 -55
  21. package/dist/cjs/tutorials/content/Tutorials_T12_T15.js +79 -56
  22. package/dist/cjs/unity-integration/components/UnityAssetStoreBrowser.js +25 -24
  23. package/dist/cjs/unity-integration/components/UnityProjectBrowser.js +28 -27
  24. package/dist/cjs/unreal-integration/components/UnrealProjectBrowser.js +31 -30
  25. package/dist/esm/core/GameConfig.js +21 -7
  26. package/dist/esm/devtools/DeveloperExperience.js +5 -5
  27. package/dist/esm/dialogue/DialogueSystem.js +1 -1
  28. package/dist/esm/editor/AssetBrowser.js +26 -25
  29. package/dist/esm/editor/NiceGameEditor.js +67 -50
  30. package/dist/esm/godot-integration/components/GodotProjectBrowser.js +33 -32
  31. package/dist/esm/i18n/I18n.js +305 -0
  32. package/dist/esm/kids/KidMode.js +36 -36
  33. package/dist/esm/kids/KidTools.js +31 -31
  34. package/dist/esm/native-engine/InputSystem.js +9 -2
  35. package/dist/esm/plugins/PluginSDK.js +1 -1
  36. package/dist/esm/plugins/PluginTestKit.js +1 -1
  37. package/dist/esm/quest/QuestSystem.js +5 -1
  38. package/dist/esm/release/MobileExport.js +45 -12
  39. package/dist/esm/tutorials/TutorialBranching.js +12 -12
  40. package/dist/esm/tutorials/TutorialEngine.js +35 -35
  41. package/dist/esm/tutorials/content/Tutorials_T05_T08.js +106 -89
  42. package/dist/esm/tutorials/content/Tutorials_T09_T11.js +103 -55
  43. package/dist/esm/tutorials/content/Tutorials_T12_T15.js +79 -56
  44. package/dist/esm/unity-integration/components/UnityAssetStoreBrowser.js +25 -24
  45. package/dist/esm/unity-integration/components/UnityProjectBrowser.js +28 -27
  46. package/dist/esm/unreal-integration/components/UnrealProjectBrowser.js +31 -30
  47. package/dist/types/core/index.d.ts +1 -1
  48. package/dist/types/editor/AssetBrowser.d.ts +1 -0
  49. package/dist/types/editor/behavior-tree/BTEditorNode.d.ts +2 -1
  50. package/dist/types/editor/behavior-tree/BTEditorToolbar.d.ts +1 -0
  51. package/dist/types/input/index.d.ts +1 -1
  52. package/dist/types/kids/KidMode.d.ts +4 -2
  53. package/dist/types/kids/KidTools.d.ts +1 -1
  54. package/dist/types/legendary/index.d.ts +7 -7
  55. package/dist/types/procedural/index.d.ts +1 -1
  56. package/dist/types/tutorials/TutorialBranching.d.ts +1 -1
  57. package/package.json +3 -2
  58. package/dist/cjs/accessibility/Accessibility.js.map +0 -1
  59. package/dist/cjs/ai/AI.js.map +0 -1
  60. package/dist/cjs/ai/BehaviorTree.js.map +0 -1
  61. package/dist/cjs/ai/StateMachine.js.map +0 -1
  62. package/dist/cjs/animation/Animation.js.map +0 -1
  63. package/dist/cjs/audio/AudioAdvanced.js.map +0 -1
  64. package/dist/cjs/audio/AudioBridge.js.map +0 -1
  65. package/dist/cjs/audio/AudioManager.js.map +0 -1
  66. package/dist/cjs/build-cloud/BuildOrchestration.js.map +0 -1
  67. package/dist/cjs/build-cloud/GodotBuildCloud.js.map +0 -1
  68. package/dist/cjs/build-cloud/UnityBuildCloud.js.map +0 -1
  69. package/dist/cjs/build-cloud/UnrealBuildCloud.js.map +0 -1
  70. package/dist/cjs/core/EventBus.js.map +0 -1
  71. package/dist/cjs/core/GameClock.js.map +0 -1
  72. package/dist/cjs/core/GameConfig.js.map +0 -1
  73. package/dist/cjs/core/GameLoop.js.map +0 -1
  74. package/dist/cjs/core/ServiceLocator.js.map +0 -1
  75. package/dist/cjs/core/Validation.js.map +0 -1
  76. package/dist/cjs/core/math.js.map +0 -1
  77. package/dist/cjs/devtools/DevTools.js.map +0 -1
  78. package/dist/cjs/devtools/DeveloperExperience.js.map +0 -1
  79. package/dist/cjs/devtools/GameplayAnalytics.js.map +0 -1
  80. package/dist/cjs/dialogue/DialogueSystem.js.map +0 -1
  81. package/dist/cjs/docs/DocGenerator.js.map +0 -1
  82. package/dist/cjs/ecs/World.js.map +0 -1
  83. package/dist/cjs/editor/AchievementEditor.js.map +0 -1
  84. package/dist/cjs/editor/AdvancedEditor.js.map +0 -1
  85. package/dist/cjs/editor/AnimationRetargeting.js.map +0 -1
  86. package/dist/cjs/editor/AssetBrowser.js.map +0 -1
  87. package/dist/cjs/editor/AssetManager.js.map +0 -1
  88. package/dist/cjs/editor/ConsolePro.js.map +0 -1
  89. package/dist/cjs/editor/CraftingEditor.js.map +0 -1
  90. package/dist/cjs/editor/DebugTools.js.map +0 -1
  91. package/dist/cjs/editor/DialogueSystem.js.map +0 -1
  92. package/dist/cjs/editor/LeaderboardSystem.js.map +0 -1
  93. package/dist/cjs/editor/NiceGameEditor.js.map +0 -1
  94. package/dist/cjs/editor/PrefabSystem.js.map +0 -1
  95. package/dist/cjs/editor/ProfilerPanel.js.map +0 -1
  96. package/dist/cjs/editor/QuestEditor.js.map +0 -1
  97. package/dist/cjs/editor/ReplaySystem.js.map +0 -1
  98. package/dist/cjs/editor/SceneEditor.js.map +0 -1
  99. package/dist/cjs/editor/ScreenshotMode.js.map +0 -1
  100. package/dist/cjs/editor/ShaderGraph.js.map +0 -1
  101. package/dist/cjs/editor/TimelineEditor.js.map +0 -1
  102. package/dist/cjs/editor/UndoRedoPro.js.map +0 -1
  103. package/dist/cjs/editor/VRARMode.js.map +0 -1
  104. package/dist/cjs/engine/NiceGameEngine.js.map +0 -1
  105. package/dist/cjs/engine/SaveSystem.js.map +0 -1
  106. package/dist/cjs/engine/SaveSystemV2.js +0 -530
  107. package/dist/cjs/engine/SaveSystemV2.js.map +0 -1
  108. package/dist/cjs/enterprise/Enterprise.js.map +0 -1
  109. package/dist/cjs/export/BevyExporter.js.map +0 -1
  110. package/dist/cjs/export/CocosExporter.js.map +0 -1
  111. package/dist/cjs/export/Construct3Exporter.js.map +0 -1
  112. package/dist/cjs/export/DefoldExporter.js.map +0 -1
  113. package/dist/cjs/export/GDevelopExporter.js.map +0 -1
  114. package/dist/cjs/export/GameMakerExporter.js.map +0 -1
  115. package/dist/cjs/export/GodotExporter.js.map +0 -1
  116. package/dist/cjs/export/MinecraftBedrockExporter.js.map +0 -1
  117. package/dist/cjs/export/MonoGameExporter.js.map +0 -1
  118. package/dist/cjs/export/Pico8Exporter.js.map +0 -1
  119. package/dist/cjs/export/PlatformExporter.js.map +0 -1
  120. package/dist/cjs/export/RPGMakerExporter.js.map +0 -1
  121. package/dist/cjs/export/RobloxExporter.js.map +0 -1
  122. package/dist/cjs/export/Solar2DExporter.js.map +0 -1
  123. package/dist/cjs/export/ThreeJSExporter.js.map +0 -1
  124. package/dist/cjs/export/Tic80Exporter.js.map +0 -1
  125. package/dist/cjs/export/UnityExporter.js.map +0 -1
  126. package/dist/cjs/export/UnrealExporter.js.map +0 -1
  127. package/dist/cjs/export/WebExporter.js.map +0 -1
  128. package/dist/cjs/export/index.js.map +0 -1
  129. package/dist/cjs/godot-integration/GodotAssetLibrary.js.map +0 -1
  130. package/dist/cjs/godot-integration/GodotImport.js.map +0 -1
  131. package/dist/cjs/godot-integration/GodotLiveLink.js.map +0 -1
  132. package/dist/cjs/godot-integration/components/GodotProjectBrowser.js.map +0 -1
  133. package/dist/cjs/i18n/I18n.js.map +0 -1
  134. package/dist/cjs/i18n/useTranslation.js.map +0 -1
  135. package/dist/cjs/import/AsepriteImporter.js.map +0 -1
  136. package/dist/cjs/import/DragonBonesImporter.js.map +0 -1
  137. package/dist/cjs/import/GameMakerImporter.js.map +0 -1
  138. package/dist/cjs/import/GodotSceneImporter.js.map +0 -1
  139. package/dist/cjs/import/LDtkImporter.js.map +0 -1
  140. package/dist/cjs/import/Live2DImporter.js.map +0 -1
  141. package/dist/cjs/import/NdgFormat.js.map +0 -1
  142. package/dist/cjs/import/OgmoImporter.js.map +0 -1
  143. package/dist/cjs/import/RPGMakerImporter.js.map +0 -1
  144. package/dist/cjs/import/SceneImporter.js.map +0 -1
  145. package/dist/cjs/import/SpineImporter.js.map +0 -1
  146. package/dist/cjs/import/SpriterImporter.js.map +0 -1
  147. package/dist/cjs/import/TiledMapImporter.js.map +0 -1
  148. package/dist/cjs/import/UnitySceneImporter.js.map +0 -1
  149. package/dist/cjs/import/index.js.map +0 -1
  150. package/dist/cjs/index.js.map +0 -1
  151. package/dist/cjs/input/GamepadNavigation.js.map +0 -1
  152. package/dist/cjs/input/InputManager.js.map +0 -1
  153. package/dist/cjs/input/useGamepads.js.map +0 -1
  154. package/dist/cjs/integration/IconSprite.js.map +0 -1
  155. package/dist/cjs/inventory/InventorySystem.js.map +0 -1
  156. package/dist/cjs/kids/KidMode.js.map +0 -1
  157. package/dist/cjs/kids/KidTools.js.map +0 -1
  158. package/dist/cjs/monetization/Monetization.js.map +0 -1
  159. package/dist/cjs/multiplayer/LocalMultiplayer.js.map +0 -1
  160. package/dist/cjs/multiplayer/MiniGameTypes.js.map +0 -1
  161. package/dist/cjs/native-engine/AssetPipeline.js.map +0 -1
  162. package/dist/cjs/native-engine/AudioEngine.js.map +0 -1
  163. package/dist/cjs/native-engine/InputSystem.js.map +0 -1
  164. package/dist/cjs/native-engine/NetworkingSystem.js.map +0 -1
  165. package/dist/cjs/native-engine/PhysicsEngine.js.map +0 -1
  166. package/dist/cjs/native-engine/RenderingEngine.js.map +0 -1
  167. package/dist/cjs/native-engine/SceneGraph.js.map +0 -1
  168. package/dist/cjs/network/MultiplayerTransport.js.map +0 -1
  169. package/dist/cjs/network/Networking.js.map +0 -1
  170. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +0 -1
  171. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +0 -1
  172. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +0 -1
  173. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +0 -1
  174. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +0 -1
  175. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +0 -1
  176. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +0 -1
  177. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +0 -1
  178. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +0 -1
  179. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +0 -1
  180. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +0 -1
  181. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +0 -1
  182. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +0 -1
  183. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +0 -1
  184. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +0 -1
  185. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +0 -1
  186. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +0 -1
  187. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +0 -1
  188. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +0 -1
  189. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +0 -1
  190. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +0 -1
  191. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +0 -1
  192. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +0 -1
  193. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +0 -1
  194. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +0 -1
  195. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/index.js.map +0 -1
  196. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +0 -1
  197. package/dist/cjs/pathfinding/Pathfinding.js.map +0 -1
  198. package/dist/cjs/performance/AssetStreaming.js.map +0 -1
  199. package/dist/cjs/performance/BenchmarkSuite.js.map +0 -1
  200. package/dist/cjs/performance/DeltaCompression.js.map +0 -1
  201. package/dist/cjs/performance/DeterministicPhysics.js.map +0 -1
  202. package/dist/cjs/performance/ECSOptimization.js.map +0 -1
  203. package/dist/cjs/performance/GameSaveSystem.js.map +0 -1
  204. package/dist/cjs/performance/HotReload.js.map +0 -1
  205. package/dist/cjs/performance/InputRecording.js.map +0 -1
  206. package/dist/cjs/performance/InterestManagement.js.map +0 -1
  207. package/dist/cjs/performance/LocalizationRuntime.js.map +0 -1
  208. package/dist/cjs/performance/MemoryManagement.js.map +0 -1
  209. package/dist/cjs/performance/ModSupport.js.map +0 -1
  210. package/dist/cjs/performance/MultiThreadedPhysics.js.map +0 -1
  211. package/dist/cjs/performance/NetworkPrediction.js.map +0 -1
  212. package/dist/cjs/performance/ObjectPooling.js.map +0 -1
  213. package/dist/cjs/performance/Performance.js.map +0 -1
  214. package/dist/cjs/performance/PerformanceAdvanced.js.map +0 -1
  215. package/dist/cjs/performance/SaveSystem.js +0 -574
  216. package/dist/cjs/performance/SaveSystem.js.map +0 -1
  217. package/dist/cjs/performance/WebGPURenderer.js.map +0 -1
  218. package/dist/cjs/physics/PhysicsAdvanced.js.map +0 -1
  219. package/dist/cjs/physics/PhysicsEngine2D.js.map +0 -1
  220. package/dist/cjs/plugins/PluginSDK.js.map +0 -1
  221. package/dist/cjs/plugins/PluginTestKit.js.map +0 -1
  222. package/dist/cjs/procedural/Procedural.js.map +0 -1
  223. package/dist/cjs/procedural/WorldBuilding.js.map +0 -1
  224. package/dist/cjs/quest/QuestSystem.js.map +0 -1
  225. package/dist/cjs/release/MobileExport.js.map +0 -1
  226. package/dist/cjs/release/Release.js.map +0 -1
  227. package/dist/cjs/rendering/Camera2D.js.map +0 -1
  228. package/dist/cjs/rendering/Renderer2D.js.map +0 -1
  229. package/dist/cjs/rendering/WebGPURenderPipeline.js.map +0 -1
  230. package/dist/cjs/runtime3d/Runtime3D.js.map +0 -1
  231. package/dist/cjs/runtime3d/SceneEditor3D.js.map +0 -1
  232. package/dist/cjs/scene/SceneManager.js.map +0 -1
  233. package/dist/cjs/scripting/GraphToAST.js.map +0 -1
  234. package/dist/cjs/scripting/LanguageExporter.js.map +0 -1
  235. package/dist/cjs/scripting/NodeGraph.js.map +0 -1
  236. package/dist/cjs/scripting/ScriptAST.js.map +0 -1
  237. package/dist/cjs/scripting/VisualScripting2.js.map +0 -1
  238. package/dist/cjs/scripting/exporters/CSharpExporter.js.map +0 -1
  239. package/dist/cjs/scripting/exporters/GDScriptExporter.js.map +0 -1
  240. package/dist/cjs/scripting/exporters/LuaExporter.js.map +0 -1
  241. package/dist/cjs/scripting/exporters/PythonExporter.js.map +0 -1
  242. package/dist/cjs/scripting/exporters/RustExporter.js.map +0 -1
  243. package/dist/cjs/scripting/exporters/TypeScriptExporter.js.map +0 -1
  244. package/dist/cjs/social/Social.js.map +0 -1
  245. package/dist/cjs/systems/LightingSystem.js.map +0 -1
  246. package/dist/cjs/systems/ParticleSystem2.js.map +0 -1
  247. package/dist/cjs/systems/PhysicsDebugSystem.js.map +0 -1
  248. package/dist/cjs/systems/TerrainSystem.js.map +0 -1
  249. package/dist/cjs/templates/ActionTemplates.js.map +0 -1
  250. package/dist/cjs/templates/FightingTemplate.js.map +0 -1
  251. package/dist/cjs/templates/MetroidvaniaTemplate.js.map +0 -1
  252. package/dist/cjs/templates/PartyTemplates.js.map +0 -1
  253. package/dist/cjs/templates/PuzzleTemplates.js.map +0 -1
  254. package/dist/cjs/templates/RPGTemplates.js.map +0 -1
  255. package/dist/cjs/templates/SportsTemplates.js.map +0 -1
  256. package/dist/cjs/templates/StrategyTemplates.js.map +0 -1
  257. package/dist/cjs/templates/SurvivalTemplate.js.map +0 -1
  258. package/dist/cjs/templates/WaveDefense.js.map +0 -1
  259. package/dist/cjs/tilemap/Tilemap.js.map +0 -1
  260. package/dist/cjs/tutorials/TutorialBranching.js.map +0 -1
  261. package/dist/cjs/tutorials/TutorialEngine.js.map +0 -1
  262. package/dist/cjs/tutorials/TutorialOverlay.js.map +0 -1
  263. package/dist/cjs/tutorials/content/Tutorials_T05_T08.js.map +0 -1
  264. package/dist/cjs/tutorials/content/Tutorials_T09_T11.js.map +0 -1
  265. package/dist/cjs/tutorials/content/Tutorials_T12_T15.js.map +0 -1
  266. package/dist/cjs/ui/GameUI.js.map +0 -1
  267. package/dist/cjs/unity-integration/UnityAssetStore.js.map +0 -1
  268. package/dist/cjs/unity-integration/UnityImport.js.map +0 -1
  269. package/dist/cjs/unity-integration/UnityLiveLink.js.map +0 -1
  270. package/dist/cjs/unity-integration/components/UnityAssetStoreBrowser.js.map +0 -1
  271. package/dist/cjs/unity-integration/components/UnityProjectBrowser.js.map +0 -1
  272. package/dist/cjs/unreal-integration/UnrealImport.js.map +0 -1
  273. package/dist/cjs/unreal-integration/UnrealLiveLink.js.map +0 -1
  274. package/dist/cjs/unreal-integration/UnrealMarketplace.js.map +0 -1
  275. package/dist/cjs/unreal-integration/components/UnrealProjectBrowser.js.map +0 -1
  276. package/dist/cjs/xr/ARVR.js.map +0 -1
  277. package/dist/esm/accessibility/Accessibility.js.map +0 -1
  278. package/dist/esm/ai/AI.js.map +0 -1
  279. package/dist/esm/ai/BehaviorTree.js.map +0 -1
  280. package/dist/esm/ai/StateMachine.js.map +0 -1
  281. package/dist/esm/animation/Animation.js.map +0 -1
  282. package/dist/esm/audio/AudioAdvanced.js.map +0 -1
  283. package/dist/esm/audio/AudioBridge.js.map +0 -1
  284. package/dist/esm/audio/AudioManager.js.map +0 -1
  285. package/dist/esm/build-cloud/BuildOrchestration.js.map +0 -1
  286. package/dist/esm/build-cloud/GodotBuildCloud.js.map +0 -1
  287. package/dist/esm/build-cloud/UnityBuildCloud.js.map +0 -1
  288. package/dist/esm/build-cloud/UnrealBuildCloud.js.map +0 -1
  289. package/dist/esm/core/EventBus.js.map +0 -1
  290. package/dist/esm/core/GameClock.js.map +0 -1
  291. package/dist/esm/core/GameConfig.js.map +0 -1
  292. package/dist/esm/core/GameLoop.js.map +0 -1
  293. package/dist/esm/core/ServiceLocator.js.map +0 -1
  294. package/dist/esm/core/Validation.js.map +0 -1
  295. package/dist/esm/core/math.js.map +0 -1
  296. package/dist/esm/devtools/DevTools.js.map +0 -1
  297. package/dist/esm/devtools/DeveloperExperience.js.map +0 -1
  298. package/dist/esm/devtools/GameplayAnalytics.js.map +0 -1
  299. package/dist/esm/dialogue/DialogueSystem.js.map +0 -1
  300. package/dist/esm/docs/DocGenerator.js.map +0 -1
  301. package/dist/esm/ecs/World.js.map +0 -1
  302. package/dist/esm/editor/AchievementEditor.js.map +0 -1
  303. package/dist/esm/editor/AdvancedEditor.js.map +0 -1
  304. package/dist/esm/editor/AnimationRetargeting.js.map +0 -1
  305. package/dist/esm/editor/AssetBrowser.js.map +0 -1
  306. package/dist/esm/editor/AssetManager.js.map +0 -1
  307. package/dist/esm/editor/ConsolePro.js.map +0 -1
  308. package/dist/esm/editor/CraftingEditor.js.map +0 -1
  309. package/dist/esm/editor/DebugTools.js.map +0 -1
  310. package/dist/esm/editor/DialogueSystem.js.map +0 -1
  311. package/dist/esm/editor/LeaderboardSystem.js.map +0 -1
  312. package/dist/esm/editor/NiceGameEditor.js.map +0 -1
  313. package/dist/esm/editor/PrefabSystem.js.map +0 -1
  314. package/dist/esm/editor/ProfilerPanel.js.map +0 -1
  315. package/dist/esm/editor/QuestEditor.js.map +0 -1
  316. package/dist/esm/editor/ReplaySystem.js.map +0 -1
  317. package/dist/esm/editor/SceneEditor.js.map +0 -1
  318. package/dist/esm/editor/ScreenshotMode.js.map +0 -1
  319. package/dist/esm/editor/ShaderGraph.js.map +0 -1
  320. package/dist/esm/editor/TimelineEditor.js.map +0 -1
  321. package/dist/esm/editor/UndoRedoPro.js.map +0 -1
  322. package/dist/esm/editor/VRARMode.js.map +0 -1
  323. package/dist/esm/engine/NiceGameEngine.js.map +0 -1
  324. package/dist/esm/engine/SaveSystem.js.map +0 -1
  325. package/dist/esm/engine/SaveSystemV2.js +0 -523
  326. package/dist/esm/engine/SaveSystemV2.js.map +0 -1
  327. package/dist/esm/enterprise/Enterprise.js.map +0 -1
  328. package/dist/esm/export/BevyExporter.js.map +0 -1
  329. package/dist/esm/export/CocosExporter.js.map +0 -1
  330. package/dist/esm/export/Construct3Exporter.js.map +0 -1
  331. package/dist/esm/export/DefoldExporter.js.map +0 -1
  332. package/dist/esm/export/GDevelopExporter.js.map +0 -1
  333. package/dist/esm/export/GameMakerExporter.js.map +0 -1
  334. package/dist/esm/export/GodotExporter.js.map +0 -1
  335. package/dist/esm/export/MinecraftBedrockExporter.js.map +0 -1
  336. package/dist/esm/export/MonoGameExporter.js.map +0 -1
  337. package/dist/esm/export/Pico8Exporter.js.map +0 -1
  338. package/dist/esm/export/PlatformExporter.js.map +0 -1
  339. package/dist/esm/export/RPGMakerExporter.js.map +0 -1
  340. package/dist/esm/export/RobloxExporter.js.map +0 -1
  341. package/dist/esm/export/Solar2DExporter.js.map +0 -1
  342. package/dist/esm/export/ThreeJSExporter.js.map +0 -1
  343. package/dist/esm/export/Tic80Exporter.js.map +0 -1
  344. package/dist/esm/export/UnityExporter.js.map +0 -1
  345. package/dist/esm/export/UnrealExporter.js.map +0 -1
  346. package/dist/esm/export/WebExporter.js.map +0 -1
  347. package/dist/esm/export/index.js.map +0 -1
  348. package/dist/esm/godot-integration/GodotAssetLibrary.js.map +0 -1
  349. package/dist/esm/godot-integration/GodotImport.js.map +0 -1
  350. package/dist/esm/godot-integration/GodotLiveLink.js.map +0 -1
  351. package/dist/esm/godot-integration/components/GodotProjectBrowser.js.map +0 -1
  352. package/dist/esm/i18n/I18n.js.map +0 -1
  353. package/dist/esm/i18n/useTranslation.js.map +0 -1
  354. package/dist/esm/import/AsepriteImporter.js.map +0 -1
  355. package/dist/esm/import/DragonBonesImporter.js.map +0 -1
  356. package/dist/esm/import/GameMakerImporter.js.map +0 -1
  357. package/dist/esm/import/GodotSceneImporter.js.map +0 -1
  358. package/dist/esm/import/LDtkImporter.js.map +0 -1
  359. package/dist/esm/import/Live2DImporter.js.map +0 -1
  360. package/dist/esm/import/NdgFormat.js.map +0 -1
  361. package/dist/esm/import/OgmoImporter.js.map +0 -1
  362. package/dist/esm/import/RPGMakerImporter.js.map +0 -1
  363. package/dist/esm/import/SceneImporter.js.map +0 -1
  364. package/dist/esm/import/SpineImporter.js.map +0 -1
  365. package/dist/esm/import/SpriterImporter.js.map +0 -1
  366. package/dist/esm/import/TiledMapImporter.js.map +0 -1
  367. package/dist/esm/import/UnitySceneImporter.js.map +0 -1
  368. package/dist/esm/import/index.js.map +0 -1
  369. package/dist/esm/index.js.map +0 -1
  370. package/dist/esm/input/GamepadNavigation.js.map +0 -1
  371. package/dist/esm/input/InputManager.js.map +0 -1
  372. package/dist/esm/input/useGamepads.js.map +0 -1
  373. package/dist/esm/integration/IconSprite.js.map +0 -1
  374. package/dist/esm/inventory/InventorySystem.js.map +0 -1
  375. package/dist/esm/kids/KidMode.js.map +0 -1
  376. package/dist/esm/kids/KidTools.js.map +0 -1
  377. package/dist/esm/monetization/Monetization.js.map +0 -1
  378. package/dist/esm/multiplayer/LocalMultiplayer.js.map +0 -1
  379. package/dist/esm/multiplayer/MiniGameTypes.js.map +0 -1
  380. package/dist/esm/native-engine/AssetPipeline.js.map +0 -1
  381. package/dist/esm/native-engine/AudioEngine.js.map +0 -1
  382. package/dist/esm/native-engine/InputSystem.js.map +0 -1
  383. package/dist/esm/native-engine/NetworkingSystem.js.map +0 -1
  384. package/dist/esm/native-engine/PhysicsEngine.js.map +0 -1
  385. package/dist/esm/native-engine/RenderingEngine.js.map +0 -1
  386. package/dist/esm/native-engine/SceneGraph.js.map +0 -1
  387. package/dist/esm/network/MultiplayerTransport.js.map +0 -1
  388. package/dist/esm/network/Networking.js.map +0 -1
  389. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +0 -1
  390. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +0 -1
  391. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +0 -1
  392. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +0 -1
  393. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +0 -1
  394. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +0 -1
  395. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +0 -1
  396. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +0 -1
  397. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +0 -1
  398. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +0 -1
  399. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +0 -1
  400. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +0 -1
  401. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +0 -1
  402. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +0 -1
  403. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +0 -1
  404. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +0 -1
  405. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +0 -1
  406. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +0 -1
  407. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +0 -1
  408. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +0 -1
  409. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +0 -1
  410. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +0 -1
  411. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +0 -1
  412. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +0 -1
  413. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +0 -1
  414. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/index.js.map +0 -1
  415. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +0 -1
  416. package/dist/esm/pathfinding/Pathfinding.js.map +0 -1
  417. package/dist/esm/performance/AssetStreaming.js.map +0 -1
  418. package/dist/esm/performance/BenchmarkSuite.js.map +0 -1
  419. package/dist/esm/performance/DeltaCompression.js.map +0 -1
  420. package/dist/esm/performance/DeterministicPhysics.js.map +0 -1
  421. package/dist/esm/performance/ECSOptimization.js.map +0 -1
  422. package/dist/esm/performance/GameSaveSystem.js.map +0 -1
  423. package/dist/esm/performance/HotReload.js.map +0 -1
  424. package/dist/esm/performance/InputRecording.js.map +0 -1
  425. package/dist/esm/performance/InterestManagement.js.map +0 -1
  426. package/dist/esm/performance/LocalizationRuntime.js.map +0 -1
  427. package/dist/esm/performance/MemoryManagement.js.map +0 -1
  428. package/dist/esm/performance/ModSupport.js.map +0 -1
  429. package/dist/esm/performance/MultiThreadedPhysics.js.map +0 -1
  430. package/dist/esm/performance/NetworkPrediction.js.map +0 -1
  431. package/dist/esm/performance/ObjectPooling.js.map +0 -1
  432. package/dist/esm/performance/Performance.js.map +0 -1
  433. package/dist/esm/performance/PerformanceAdvanced.js.map +0 -1
  434. package/dist/esm/performance/SaveSystem.js +0 -567
  435. package/dist/esm/performance/SaveSystem.js.map +0 -1
  436. package/dist/esm/performance/WebGPURenderer.js.map +0 -1
  437. package/dist/esm/physics/PhysicsAdvanced.js.map +0 -1
  438. package/dist/esm/physics/PhysicsEngine2D.js.map +0 -1
  439. package/dist/esm/plugins/PluginSDK.js.map +0 -1
  440. package/dist/esm/plugins/PluginTestKit.js.map +0 -1
  441. package/dist/esm/procedural/Procedural.js.map +0 -1
  442. package/dist/esm/procedural/WorldBuilding.js.map +0 -1
  443. package/dist/esm/quest/QuestSystem.js.map +0 -1
  444. package/dist/esm/release/MobileExport.js.map +0 -1
  445. package/dist/esm/release/Release.js.map +0 -1
  446. package/dist/esm/rendering/Camera2D.js.map +0 -1
  447. package/dist/esm/rendering/Renderer2D.js.map +0 -1
  448. package/dist/esm/rendering/WebGPURenderPipeline.js.map +0 -1
  449. package/dist/esm/runtime3d/Runtime3D.js.map +0 -1
  450. package/dist/esm/runtime3d/SceneEditor3D.js.map +0 -1
  451. package/dist/esm/scene/SceneManager.js.map +0 -1
  452. package/dist/esm/scripting/GraphToAST.js.map +0 -1
  453. package/dist/esm/scripting/LanguageExporter.js.map +0 -1
  454. package/dist/esm/scripting/NodeGraph.js.map +0 -1
  455. package/dist/esm/scripting/ScriptAST.js.map +0 -1
  456. package/dist/esm/scripting/VisualScripting2.js.map +0 -1
  457. package/dist/esm/scripting/exporters/CSharpExporter.js.map +0 -1
  458. package/dist/esm/scripting/exporters/GDScriptExporter.js.map +0 -1
  459. package/dist/esm/scripting/exporters/LuaExporter.js.map +0 -1
  460. package/dist/esm/scripting/exporters/PythonExporter.js.map +0 -1
  461. package/dist/esm/scripting/exporters/RustExporter.js.map +0 -1
  462. package/dist/esm/scripting/exporters/TypeScriptExporter.js.map +0 -1
  463. package/dist/esm/social/Social.js.map +0 -1
  464. package/dist/esm/systems/LightingSystem.js.map +0 -1
  465. package/dist/esm/systems/ParticleSystem2.js.map +0 -1
  466. package/dist/esm/systems/PhysicsDebugSystem.js.map +0 -1
  467. package/dist/esm/systems/TerrainSystem.js.map +0 -1
  468. package/dist/esm/templates/ActionTemplates.js.map +0 -1
  469. package/dist/esm/templates/FightingTemplate.js.map +0 -1
  470. package/dist/esm/templates/MetroidvaniaTemplate.js.map +0 -1
  471. package/dist/esm/templates/PartyTemplates.js.map +0 -1
  472. package/dist/esm/templates/PuzzleTemplates.js.map +0 -1
  473. package/dist/esm/templates/RPGTemplates.js.map +0 -1
  474. package/dist/esm/templates/SportsTemplates.js.map +0 -1
  475. package/dist/esm/templates/StrategyTemplates.js.map +0 -1
  476. package/dist/esm/templates/SurvivalTemplate.js.map +0 -1
  477. package/dist/esm/templates/WaveDefense.js.map +0 -1
  478. package/dist/esm/tilemap/Tilemap.js.map +0 -1
  479. package/dist/esm/tutorials/TutorialBranching.js.map +0 -1
  480. package/dist/esm/tutorials/TutorialEngine.js.map +0 -1
  481. package/dist/esm/tutorials/TutorialOverlay.js.map +0 -1
  482. package/dist/esm/tutorials/content/Tutorials_T05_T08.js.map +0 -1
  483. package/dist/esm/tutorials/content/Tutorials_T09_T11.js.map +0 -1
  484. package/dist/esm/tutorials/content/Tutorials_T12_T15.js.map +0 -1
  485. package/dist/esm/ui/GameUI.js.map +0 -1
  486. package/dist/esm/unity-integration/UnityAssetStore.js.map +0 -1
  487. package/dist/esm/unity-integration/UnityImport.js.map +0 -1
  488. package/dist/esm/unity-integration/UnityLiveLink.js.map +0 -1
  489. package/dist/esm/unity-integration/components/UnityAssetStoreBrowser.js.map +0 -1
  490. package/dist/esm/unity-integration/components/UnityProjectBrowser.js.map +0 -1
  491. package/dist/esm/unreal-integration/UnrealImport.js.map +0 -1
  492. package/dist/esm/unreal-integration/UnrealLiveLink.js.map +0 -1
  493. package/dist/esm/unreal-integration/UnrealMarketplace.js.map +0 -1
  494. package/dist/esm/unreal-integration/components/UnrealProjectBrowser.js.map +0 -1
  495. package/dist/esm/xr/ARVR.js.map +0 -1
  496. package/dist/types/engine/SaveSystemV2.d.ts +0 -155
@@ -33,9 +33,9 @@ const TUTORIAL_MULTIPLAYER_ONLINE = {
33
33
  id: 'mp-online-intro',
34
34
  type: 'text',
35
35
  title: {
36
- en: 'Online Multiplayer Architecture 🌐',
37
- pl: 'Architektura multiplayera online 🌐',
38
- de: 'Online-Mehrspieler-Architektur 🌐',
36
+ en: 'Online Multiplayer Architecture',
37
+ pl: 'Architektura multiplayera online',
38
+ de: 'Online-Mehrspieler-Architektur',
39
39
  },
40
40
  content: {
41
41
  en: 'In this tutorial you will learn:\n• WebRTC peer-to-peer connections\n• Signaling via WebSocket\n• Creating and joining lobby rooms\n• State synchronization (snapshots)\n• Client-side prediction and reconciliation\n\nYour game will run in real-time across the internet!',
@@ -160,7 +160,7 @@ const TUTORIAL_MULTIPLAYER_ONLINE = {
160
160
  de: 'Verwende `SnapshotBuffer` zum Speichern von Spielzustand-Snapshots für Interpolation. Der Host sendet Snapshots, Clients interpolieren dazwischen.',
161
161
  },
162
162
  codeTemplate: '// Create snapshot buffer\nconst snapshots = ',
163
- codeSolution: "const snapshots = new SnapshotBuffer(60);\n\n// Host creates and broadcasts snapshots\nconst snapshot = {\n tick: net.tick,\n timestamp: performance.now(),\n states: new Map(),\n};\nsnapshots.push(snapshot);\n\n// Client interpolates\nconst pair = snapshots.getInterpolationPair(serverTime);\nif (pair) {\n const [a, b] = pair;\n const t = (serverTime - a.timestamp) / (b.timestamp - a.timestamp);\n // interpolateState(stateA, stateB, t)\n}",
163
+ codeSolution: 'const snapshots = new SnapshotBuffer(60);\n\n// Host creates and broadcasts snapshots\nconst snapshot = {\n tick: net.tick,\n timestamp: performance.now(),\n states: new Map(),\n};\nsnapshots.push(snapshot);\n\n// Client interpolates\nconst pair = snapshots.getInterpolationPair(serverTime);\nif (pair) {\n const [a, b] = pair;\n const t = (serverTime - a.timestamp) / (b.timestamp - a.timestamp);\n // interpolateState(stateA, stateB, t)\n}',
164
164
  codeValidation: {
165
165
  containsAll: ['SnapshotBuffer', 'push', 'getInterpolationPair'],
166
166
  },
@@ -185,7 +185,7 @@ const TUTORIAL_MULTIPLAYER_ONLINE = {
185
185
  de: 'Verwende `ClientPrediction` zum Speichern lokaler Eingaben und Abgleich nach Server-Bestätigung. Dies eliminiert Input-Lag für den lokalen Spieler.',
186
186
  },
187
187
  codeTemplate: '// Set up prediction\nconst prediction = ',
188
- codeSolution: "const prediction = new ClientPrediction();\n\n// Every frame: record local input + simulated result\nprediction.addInput({\n tick: net.tick,\n inputActions: { moveRight: true, jump: false },\n resultPosition: { x: player.x + 5, y: player.y },\n});\n\n// When server confirms a tick:\nprediction.acknowledge(serverTick);\n\n// Replay unconfirmed inputs after correction\nconst pending = prediction.getPendingInputs();",
188
+ codeSolution: 'const prediction = new ClientPrediction();\n\n// Every frame: record local input + simulated result\nprediction.addInput({\n tick: net.tick,\n inputActions: { moveRight: true, jump: false },\n resultPosition: { x: player.x + 5, y: player.y },\n});\n\n// When server confirms a tick:\nprediction.acknowledge(serverTick);\n\n// Replay unconfirmed inputs after correction\nconst pending = prediction.getPendingInputs();',
189
189
  codeValidation: {
190
190
  containsAll: ['ClientPrediction', 'addInput', 'acknowledge'],
191
191
  },
@@ -200,9 +200,9 @@ const TUTORIAL_MULTIPLAYER_ONLINE = {
200
200
  id: 'mp-online-quiz',
201
201
  type: 'quiz',
202
202
  title: {
203
- en: 'Multiplayer Quiz 🧠',
204
- pl: 'Quiz Multiplayer 🧠',
205
- de: 'Multiplayer-Quiz 🧠',
203
+ en: 'Multiplayer Quiz',
204
+ pl: 'Quiz Multiplayer',
205
+ de: 'Multiplayer-Quiz',
206
206
  },
207
207
  content: {
208
208
  en: 'Why is client-side prediction important in online games?',
@@ -210,10 +210,38 @@ const TUTORIAL_MULTIPLAYER_ONLINE = {
210
210
  de: 'Warum ist clientseitige Vorhersage in Online-Spielen wichtig?',
211
211
  },
212
212
  quizOptions: [
213
- { id: 'a', text: { en: 'To reduce server load', pl: 'Aby zmniejszyć obciążenie serwera', de: 'Um die Serverlast zu reduzieren' } },
214
- { id: 'b', text: { en: 'To eliminate perceived input lag', pl: 'Aby wyeliminować odczuwane opóźnienie inputu', de: 'Um wahrgenommene Eingabeverzögerung zu eliminieren' } },
215
- { id: 'c', text: { en: 'To improve graphics', pl: 'Aby poprawić grafikę', de: 'Um die Grafik zu verbessern' } },
216
- { id: 'd', text: { en: 'To save bandwidth', pl: 'Aby oszczędzić transfer', de: 'Um Bandbreite zu sparen' } },
213
+ {
214
+ id: 'a',
215
+ text: {
216
+ en: 'To reduce server load',
217
+ pl: 'Aby zmniejszyć obciążenie serwera',
218
+ de: 'Um die Serverlast zu reduzieren',
219
+ },
220
+ },
221
+ {
222
+ id: 'b',
223
+ text: {
224
+ en: 'To eliminate perceived input lag',
225
+ pl: 'Aby wyeliminować odczuwane opóźnienie inputu',
226
+ de: 'Um wahrgenommene Eingabeverzögerung zu eliminieren',
227
+ },
228
+ },
229
+ {
230
+ id: 'c',
231
+ text: {
232
+ en: 'To improve graphics',
233
+ pl: 'Aby poprawić grafikę',
234
+ de: 'Um die Grafik zu verbessern',
235
+ },
236
+ },
237
+ {
238
+ id: 'd',
239
+ text: {
240
+ en: 'To save bandwidth',
241
+ pl: 'Aby oszczędzić transfer',
242
+ de: 'Um Bandbreite zu sparen',
243
+ },
244
+ },
217
245
  ],
218
246
  quizCorrectId: 'b',
219
247
  },
@@ -247,12 +275,12 @@ const TUTORIAL_MULTIPLAYER_ONLINE = {
247
275
  id: 'mp-online-complete',
248
276
  type: 'checkpoint',
249
277
  title: {
250
- en: 'Multiplayer Online Complete! 🎉',
251
- pl: 'Multiplayer online gotowy! 🎉',
252
- de: 'Online-Mehrspieler fertig! 🎉',
278
+ en: 'Multiplayer Online Complete!',
279
+ pl: 'Multiplayer online gotowy!',
280
+ de: 'Online-Mehrspieler fertig!',
253
281
  },
254
282
  content: {
255
- en: 'You\'ve learned how to build networked multiplayer games! You can now:\n• Connect peers via WebRTC\n• Create and manage lobby rooms\n• Synchronize game state with snapshots\n• Implement client-side prediction\n• Spawn/destroy entities across the network',
283
+ en: "You've learned how to build networked multiplayer games! You can now:\n• Connect peers via WebRTC\n• Create and manage lobby rooms\n• Synchronize game state with snapshots\n• Implement client-side prediction\n• Spawn/destroy entities across the network",
256
284
  pl: 'Nauczyłeś się budować gry multiplayer online! Teraz potrafisz:\n• Łączyć peerów przez WebRTC\n• Tworzyć i zarządzać pokojami lobby\n• Synchronizować stan gry snapshotami\n• Implementować predykcję po stronie klienta\n• Tworzyć/niszczyć encje w sieci',
257
285
  de: 'Du hast gelernt, vernetzte Multiplayer-Spiele zu bauen! Du kannst jetzt:\n• Peers über WebRTC verbinden\n• Lobby-Räume erstellen und verwalten\n• Spielzustand mit Snapshots synchronisieren\n• Clientseitige Vorhersage implementieren\n• Entities über das Netzwerk spawnen/zerstören',
258
286
  },
@@ -287,13 +315,13 @@ const TUTORIAL_PROCEDURAL_WORLD = {
287
315
  id: 'proc-intro',
288
316
  type: 'text',
289
317
  title: {
290
- en: 'Procedural Generation 🌍',
291
- pl: 'Generowanie proceduralne 🌍',
292
- de: 'Prozedurale Generierung 🌍',
318
+ en: 'Procedural Generation',
319
+ pl: 'Generowanie proceduralne',
320
+ de: 'Prozedurale Generierung',
293
321
  },
294
322
  content: {
295
323
  en: 'Procedural generation creates content using algorithms instead of manual design.\n\nYou will learn:\n• Seeded random numbers (reproducible worlds)\n• Perlin noise (natural-looking terrain)\n• Enemy wave scaling\n• Loot tables with weighted drops\n• Procedural pixel art sprites',
296
- pl: 'Generowanie proceduralne tworzy zawartość za pomocą algorytmów zamiast ręcznego projektowania.\n\nNauczysz się:\n• Losowość z seedem (odtwarzalne światy)\n• Szum Perlina (naturalnie wyglądający teren)\n• Skalowanie fal wrogów\n• Tabele łupów z ważonymi dropami\n• Proceduralne pikselo-artowe sprite\'y',
324
+ pl: "Generowanie proceduralne tworzy zawartość za pomocą algorytmów zamiast ręcznego projektowania.\n\nNauczysz się:\n• Losowość z seedem (odtwarzalne światy)\n• Szum Perlina (naturalnie wyglądający teren)\n• Skalowanie fal wrogów\n• Tabele łupów z ważonymi dropami\n• Proceduralne pikselo-artowe sprite'y",
297
325
  de: 'Prozedurale Generierung erstellt Inhalte mit Algorithmen statt manueller Gestaltung.\n\nDu lernst:\n• Zufallszahlen mit Seed (reproduzierbare Welten)\n• Perlin-Noise (natürlich aussehende Landschaft)\n• Feindwellen-Skalierung\n• Loot-Tabellen mit gewichteten Drops\n• Prozedurale Pixel-Art-Sprites',
298
326
  },
299
327
  skippable: true,
@@ -339,7 +367,7 @@ const TUTORIAL_PROCEDURAL_WORLD = {
339
367
  de: '`PerlinNoise` erzeugt glatte, natürlich aussehende Werte. Verwende `noise2D(x, y)` für Heightmaps und `fbm()` für detaillierte Landschaften.',
340
368
  },
341
369
  codeTemplate: '// Generate a height map\nconst noise = ',
342
- codeSolution: "const noise = new PerlinNoise(42);\n\n// Generate a 64x64 terrain\nfor (let y = 0; y < 64; y++) {\n for (let x = 0; x < 64; x++) {\n // noise2D returns -1 to 1 — scale to 0-1\n const height = (noise.noise2D(x * 0.05, y * 0.05) + 1) * 0.5;\n\n // Use fbm for more detail (4 octaves)\n const detail = noise.fbm(x * 0.1, y * 0.1, 4);\n\n // Map to tile type\n if (height < 0.3) { /* water */ }\n else if (height < 0.6) { /* grass */ }\n else { /* mountain */ }\n }\n}",
370
+ codeSolution: 'const noise = new PerlinNoise(42);\n\n// Generate a 64x64 terrain\nfor (let y = 0; y < 64; y++) {\n for (let x = 0; x < 64; x++) {\n // noise2D returns -1 to 1 — scale to 0-1\n const height = (noise.noise2D(x * 0.05, y * 0.05) + 1) * 0.5;\n\n // Use fbm for more detail (4 octaves)\n const detail = noise.fbm(x * 0.1, y * 0.1, 4);\n\n // Map to tile type\n if (height < 0.3) { /* water */ }\n else if (height < 0.6) { /* grass */ }\n else { /* mountain */ }\n }\n}',
343
371
  codeValidation: {
344
372
  containsAll: ['PerlinNoise', 'noise2D'],
345
373
  },
@@ -405,7 +433,7 @@ const TUTORIAL_PROCEDURAL_WORLD = {
405
433
  type: 'code',
406
434
  title: {
407
435
  en: 'Generate Pixel Art Sprites',
408
- pl: 'Generuj pikselo-artowe sprite\'y',
436
+ pl: "Generuj pikselo-artowe sprite'y",
409
437
  de: 'Pixel-Art-Sprites generieren',
410
438
  },
411
439
  content: {
@@ -414,7 +442,7 @@ const TUTORIAL_PROCEDURAL_WORLD = {
414
442
  de: '`ProceduralSprite` generiert symmetrische Pixel-Art aus einer Palette. Jeder Seed ergibt einen einzigartigen Charakter!',
415
443
  },
416
444
  codeTemplate: '// Generate a procedural sprite\nconst sprite = ',
417
- codeSolution: "const sprite = new ProceduralSprite(8, 8, [\n { r: 0.2, g: 0.5, b: 1, a: 1 }, // blue\n { r: 0.8, g: 0.2, b: 0.3, a: 1 }, // red\n { r: 0.9, g: 0.9, b: 0.1, a: 1 }, // yellow\n]);\n\n// Generate with seed\nconst pixels = sprite.generate(42);\n// Each seed = unique character sprite!",
445
+ codeSolution: 'const sprite = new ProceduralSprite(8, 8, [\n { r: 0.2, g: 0.5, b: 1, a: 1 }, // blue\n { r: 0.8, g: 0.2, b: 0.3, a: 1 }, // red\n { r: 0.9, g: 0.9, b: 0.1, a: 1 }, // yellow\n]);\n\n// Generate with seed\nconst pixels = sprite.generate(42);\n// Each seed = unique character sprite!',
418
446
  codeValidation: {
419
447
  containsAll: ['ProceduralSprite', 'generate'],
420
448
  },
@@ -429,9 +457,9 @@ const TUTORIAL_PROCEDURAL_WORLD = {
429
457
  id: 'proc-quiz',
430
458
  type: 'quiz',
431
459
  title: {
432
- en: 'Procedural Generation Quiz 🎲',
433
- pl: 'Quiz z generowania proceduralnego 🎲',
434
- de: 'Prozedurale Generierung Quiz 🎲',
460
+ en: 'Procedural Generation Quiz',
461
+ pl: 'Quiz z generowania proceduralnego',
462
+ de: 'Prozedurale Generierung Quiz',
435
463
  },
436
464
  content: {
437
465
  en: 'What makes Perlin noise better than purely random values for terrain?',
@@ -439,10 +467,34 @@ const TUTORIAL_PROCEDURAL_WORLD = {
439
467
  de: 'Was macht Perlin-Noise besser als rein zufällige Werte für Terrain?',
440
468
  },
441
469
  quizOptions: [
442
- { id: 'a', text: { en: 'It\'s faster to compute', pl: 'Jest szybszy do obliczenia', de: 'Es ist schneller zu berechnen' } },
443
- { id: 'b', text: { en: 'It produces smooth, continuous gradients', pl: 'Produkuje gładkie, ciągłe gradienty', de: 'Es erzeugt glatte, kontinuierliche Gradienten' } },
444
- { id: 'c', text: { en: 'It uses less memory', pl: 'Zużywa mniej pamięci', de: 'Es verbraucht weniger Speicher' } },
445
- { id: 'd', text: { en: 'It\'s more random', pl: 'Jest bardziej losowy', de: 'Es ist zufälliger' } },
470
+ {
471
+ id: 'a',
472
+ text: {
473
+ en: "It's faster to compute",
474
+ pl: 'Jest szybszy do obliczenia',
475
+ de: 'Es ist schneller zu berechnen',
476
+ },
477
+ },
478
+ {
479
+ id: 'b',
480
+ text: {
481
+ en: 'It produces smooth, continuous gradients',
482
+ pl: 'Produkuje gładkie, ciągłe gradienty',
483
+ de: 'Es erzeugt glatte, kontinuierliche Gradienten',
484
+ },
485
+ },
486
+ {
487
+ id: 'c',
488
+ text: {
489
+ en: 'It uses less memory',
490
+ pl: 'Zużywa mniej pamięci',
491
+ de: 'Es verbraucht weniger Speicher',
492
+ },
493
+ },
494
+ {
495
+ id: 'd',
496
+ text: { en: "It's more random", pl: 'Jest bardziej losowy', de: 'Es ist zufälliger' },
497
+ },
446
498
  ],
447
499
  quizCorrectId: 'b',
448
500
  },
@@ -451,13 +503,13 @@ const TUTORIAL_PROCEDURAL_WORLD = {
451
503
  id: 'proc-complete',
452
504
  type: 'checkpoint',
453
505
  title: {
454
- en: 'Procedural Generation Complete! 🌟',
455
- pl: 'Generowanie proceduralne opanowane! 🌟',
456
- de: 'Prozedurale Generierung fertig! 🌟',
506
+ en: 'Procedural Generation Complete!',
507
+ pl: 'Generowanie proceduralne opanowane!',
508
+ de: 'Prozedurale Generierung fertig!',
457
509
  },
458
510
  content: {
459
511
  en: 'You can now generate infinite, unique games! Skills learned:\n• Seeded random for reproducible worlds\n• Perlin noise for natural terrain\n• Wave scaling for enemy difficulty\n• Loot tables for balanced drops\n• Procedural pixel art sprites',
460
- pl: 'Teraz możesz generować nieskończone, unikalne gry! Umiejętności:\n• Losowość z seedem dla odtwarzalnych światów\n• Szum Perlina dla naturalnego terenu\n• Skalowanie fal dla trudności wrogów\n• Tabele łupów dla zbalansowanych dropów\n• Proceduralne pikselo-artowe sprite\'y',
512
+ pl: "Teraz możesz generować nieskończone, unikalne gry! Umiejętności:\n• Losowość z seedem dla odtwarzalnych światów\n• Szum Perlina dla naturalnego terenu\n• Skalowanie fal dla trudności wrogów\n• Tabele łupów dla zbalansowanych dropów\n• Proceduralne pikselo-artowe sprite'y",
461
513
  de: 'Du kannst jetzt unendliche, einzigartige Spiele generieren! Gelernte Fähigkeiten:\n• Seed-Zufall für reproduzierbare Welten\n• Perlin-Noise für natürliches Terrain\n• Wellen-Skalierung für Feind-Schwierigkeit\n• Loot-Tabellen für ausgewogene Drops\n• Prozedurale Pixel-Art-Sprites',
462
514
  },
463
515
  },
@@ -491,12 +543,12 @@ const TUTORIAL_PLATFORMER = {
491
543
  id: 'plat-intro',
492
544
  type: 'text',
493
545
  title: {
494
- en: 'Build a Platformer! 🏃',
495
- pl: 'Zbuduj platformera! 🏃',
496
- de: 'Baue einen Platformer! 🏃',
546
+ en: 'Build a Platformer!',
547
+ pl: 'Zbuduj platformera!',
548
+ de: 'Baue einen Platformer!',
497
549
  },
498
550
  content: {
499
- en: 'In this tutorial you\'ll build a complete platformer game!\n\n• Player movement & acceleration\n• Jumping with coyote time\n• Double-jump & wall-slide\n• Dash mechanic\n• Enemy AI (patrol + chase)\n• Coins & collectibles\n• Level with tilemap\n\nLet\'s make Mario-like magic!',
551
+ en: "In this tutorial you'll build a complete platformer game!\n\n• Player movement & acceleration\n• Jumping with coyote time\n• Double-jump & wall-slide\n• Dash mechanic\n• Enemy AI (patrol + chase)\n• Coins & collectibles\n• Level with tilemap\n\nLet's make Mario-like magic!",
500
552
  pl: 'W tym tutorialu zbudujesz kompletną grę platformową!\n\n• Ruch gracza i przyspieszenie\n• Skakanie z coyote time\n• Podwójny skok i wall-slide\n• Mechanika dashu\n• AI wrogów (patrol + pościg)\n• Monety i zbieranie\n• Poziom z tilemapy\n\nZróbmy magię jak Mario!',
501
553
  de: 'In diesem Tutorial baust du ein komplettes Plattformspiel!\n\n• Spielerbewegung & Beschleunigung\n• Springen mit Coyote-Time\n• Doppelsprung & Wall-Slide\n• Dash-Mechanik\n• Feind-KI (Patrouille + Verfolgung)\n• Münzen & Sammelobjekte\n• Level mit Tilemap\n\nLass uns Mario-Magie machen!',
502
554
  },
@@ -517,7 +569,7 @@ const TUTORIAL_PLATFORMER = {
517
569
  pl: 'Skonfiguruj encję gracza z komponentami Transform, Sprite, Collider2D i RigidBody2D.',
518
570
  de: 'Erstelle die Spieler-Entity mit Transform, Sprite, Collider2D und RigidBody2D Komponenten.',
519
571
  },
520
- codeTemplate: "// Create the player\nconst player = world.createEntity();\n",
572
+ codeTemplate: '// Create the player\nconst player = world.createEntity();\n',
521
573
  codeSolution: "const player = world.createEntity();\nworld.addComponent(player, 'Transform', { x: 100, y: 300, scaleX: 1, scaleY: 1, rotation: 0 });\nworld.addComponent(player, 'Sprite', { textureId: 'player', width: 32, height: 32 });\nworld.addComponent(player, 'Collider2D', { type: 'aabb', width: 28, height: 30, offsetX: 2, offsetY: 2, isTrigger: false });\nworld.addComponent(player, 'RigidBody2D', {\n velocityX: 0, velocityY: 0,\n mass: 1, gravityScale: 1,\n isKinematic: false, restitution: 0,\n});",
522
574
  codeValidation: {
523
575
  containsAll: ['createEntity', 'Transform', 'Collider2D', 'RigidBody2D'],
@@ -542,7 +594,7 @@ const TUTORIAL_PLATFORMER = {
542
594
  pl: 'Ruch w platformerze używa przyspieszenia i hamowania dla płynnego wrażenia. Sprawdź akcje `moveRight` i `moveLeft` i przyłóż prędkość.',
543
595
  de: 'Platformer-Bewegung nutzt Beschleunigung und Verzögerung für ein flüssiges Gefühl. Prüfe `moveRight` und `moveLeft` Aktionen und wende Geschwindigkeit an.',
544
596
  },
545
- codeTemplate: "// Movement system\nconst MOVE_SPEED = 200;\nconst ACCEL = 800;\nconst FRICTION = 600;\n",
597
+ codeTemplate: '// Movement system\nconst MOVE_SPEED = 200;\nconst ACCEL = 800;\nconst FRICTION = 600;\n',
546
598
  codeSolution: "const MOVE_SPEED = 200;\nconst ACCEL = 800;\nconst FRICTION = 600;\n\nfunction updateMovement(input: InputManager, rb: any, dt: number) {\n let moveDir = 0;\n if (input.getAction('moveRight')) moveDir += 1;\n if (input.getAction('moveLeft')) moveDir -= 1;\n\n if (moveDir !== 0) {\n // Accelerate toward target speed\n rb.velocityX += moveDir * ACCEL * dt;\n // Clamp to max speed\n if (Math.abs(rb.velocityX) > MOVE_SPEED) {\n rb.velocityX = Math.sign(rb.velocityX) * MOVE_SPEED;\n }\n } else {\n // Apply friction\n if (Math.abs(rb.velocityX) > FRICTION * dt) {\n rb.velocityX -= Math.sign(rb.velocityX) * FRICTION * dt;\n } else {\n rb.velocityX = 0;\n }\n }\n}",
547
599
  codeValidation: {
548
600
  containsAll: ['ACCEL', 'FRICTION', 'velocityX', 'getAction'],
@@ -567,7 +619,7 @@ const TUTORIAL_PLATFORMER = {
567
619
  pl: 'Coyote time pozwala graczowi skoczyć chwilę po opuszczeniu platformy — co sprawia, że gra jest bardziej wybaczalna. Śledź czas ostatniego kontaktu z podłożem.',
568
620
  de: 'Coyote-Time erlaubt dem Spieler kurz nach Verlassen einer Plattform zu springen — das Spiel fühlt sich nachsichtiger an. Verfolge die letzte Bodenberührungs-Zeit.',
569
621
  },
570
- codeTemplate: "// Jump system with coyote time\nconst JUMP_FORCE = -350;\nconst COYOTE_TIME = 0.1; // 100ms grace period\n",
622
+ codeTemplate: '// Jump system with coyote time\nconst JUMP_FORCE = -350;\nconst COYOTE_TIME = 0.1; // 100ms grace period\n',
571
623
  codeSolution: "const JUMP_FORCE = -350;\nconst COYOTE_TIME = 0.1; // 100ms grace period\nlet lastGroundedTime = 0;\nlet hasJumped = false;\n\nfunction updateJump(input: InputManager, rb: any, isGrounded: boolean, time: number) {\n if (isGrounded) {\n lastGroundedTime = time;\n hasJumped = false;\n }\n\n const canJump = !hasJumped && (time - lastGroundedTime) < COYOTE_TIME;\n\n if (input.getAction('jump') && canJump) {\n rb.velocityY = JUMP_FORCE;\n hasJumped = true;\n }\n\n // Variable jump height — release early = lower jump\n if (!input.getAction('jump') && rb.velocityY < 0) {\n rb.velocityY *= 0.5;\n }\n}",
572
624
  codeValidation: {
573
625
  containsAll: ['COYOTE_TIME', 'JUMP_FORCE', 'lastGroundedTime', 'canJump'],
@@ -592,7 +644,7 @@ const TUTORIAL_PLATFORMER = {
592
644
  pl: 'Dodaj dodatkowy skok w powietrzu (podwójny skok) i pozwól graczowi powoli zsuwać się po ścianach gdy ich dotyka.',
593
645
  de: 'Füge einen zusätzlichen Sprung in der Luft (Doppelsprung) hinzu und lass den Spieler langsam an Wänden herunterrutschen.',
594
646
  },
595
- codeTemplate: "// Double jump + wall slide\nconst MAX_AIR_JUMPS = 1;\nconst WALL_SLIDE_SPEED = 50;\n",
647
+ codeTemplate: '// Double jump + wall slide\nconst MAX_AIR_JUMPS = 1;\nconst WALL_SLIDE_SPEED = 50;\n',
596
648
  codeSolution: "const MAX_AIR_JUMPS = 1;\nconst WALL_SLIDE_SPEED = 50;\nlet airJumpsLeft = MAX_AIR_JUMPS;\n\nfunction updateAirMoves(input: InputManager, rb: any, isGrounded: boolean, isTouchingWall: boolean) {\n if (isGrounded) {\n airJumpsLeft = MAX_AIR_JUMPS;\n }\n\n // Double jump (only when not grounded)\n if (input.getAction('jump') && !isGrounded && airJumpsLeft > 0) {\n rb.velocityY = JUMP_FORCE;\n airJumpsLeft--;\n }\n\n // Wall slide — slow down fall when touching wall\n if (isTouchingWall && !isGrounded && rb.velocityY > 0) {\n rb.velocityY = Math.min(rb.velocityY, WALL_SLIDE_SPEED);\n }\n}",
597
649
  codeValidation: {
598
650
  containsAll: ['MAX_AIR_JUMPS', 'WALL_SLIDE_SPEED', 'airJumpsLeft'],
@@ -617,7 +669,7 @@ const TUTORIAL_PLATFORMER = {
617
669
  pl: 'Dash daje graczowi nagły przypływ prędkości w aktualnym kierunku. Dodaj cooldown, żeby nie spamować.',
618
670
  de: 'Ein Dash gibt dem Spieler einen Geschwindigkeitsschub in die aktuelle Richtung. Füge einen Cooldown hinzu.',
619
671
  },
620
- codeTemplate: "// Dash system\nconst DASH_SPEED = 500;\nconst DASH_DURATION = 0.15;\nconst DASH_COOLDOWN = 0.5;\n",
672
+ codeTemplate: '// Dash system\nconst DASH_SPEED = 500;\nconst DASH_DURATION = 0.15;\nconst DASH_COOLDOWN = 0.5;\n',
621
673
  codeSolution: "const DASH_SPEED = 500;\nconst DASH_DURATION = 0.15;\nconst DASH_COOLDOWN = 0.5;\nlet dashTimer = 0;\nlet dashCooldown = 0;\nlet dashDir = 1;\n\nfunction updateDash(input: InputManager, rb: any, dt: number, facingRight: boolean) {\n dashCooldown = Math.max(0, dashCooldown - dt);\n\n if (input.getAction('dash') && dashCooldown <= 0 && dashTimer <= 0) {\n dashTimer = DASH_DURATION;\n dashCooldown = DASH_COOLDOWN;\n dashDir = facingRight ? 1 : -1;\n }\n\n if (dashTimer > 0) {\n dashTimer -= dt;\n rb.velocityX = DASH_SPEED * dashDir;\n rb.velocityY = 0; // freeze vertical during dash\n }\n}",
622
674
  codeValidation: {
623
675
  containsAll: ['DASH_SPEED', 'DASH_COOLDOWN', 'dashTimer'],
@@ -642,7 +694,7 @@ const TUTORIAL_PLATFORMER = {
642
694
  pl: 'Utwórz wrogów patrolujących między dwoma punktami. Gdy gracz się zbliży, przechodzą w tryb pościgu!',
643
695
  de: 'Erstelle Feinde, die zwischen zwei Punkten patrouillieren. Wenn der Spieler nah kommt, wechseln sie in den Verfolgungsmodus!',
644
696
  },
645
- codeTemplate: "// Enemy patrol + chase AI\nconst PATROL_SPEED = 60;\nconst CHASE_SPEED = 120;\nconst DETECT_RANGE = 150;\n",
697
+ codeTemplate: '// Enemy patrol + chase AI\nconst PATROL_SPEED = 60;\nconst CHASE_SPEED = 120;\nconst DETECT_RANGE = 150;\n',
646
698
  codeSolution: "const PATROL_SPEED = 60;\nconst CHASE_SPEED = 120;\nconst DETECT_RANGE = 150;\n\nfunction updateEnemy(enemy: any, playerPos: any, dt: number) {\n const dx = playerPos.x - enemy.x;\n const dy = playerPos.y - enemy.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < DETECT_RANGE) {\n // Chase mode — move toward player\n const dir = dx > 0 ? 1 : -1;\n enemy.velocityX = CHASE_SPEED * dir;\n enemy.state = 'chase';\n } else {\n // Patrol mode — walk between patrolLeft and patrolRight\n if (enemy.x <= enemy.patrolLeft) enemy.patrolDir = 1;\n if (enemy.x >= enemy.patrolRight) enemy.patrolDir = -1;\n enemy.velocityX = PATROL_SPEED * enemy.patrolDir;\n enemy.state = 'patrol';\n }\n}",
647
699
  codeValidation: {
648
700
  containsAll: ['PATROL_SPEED', 'CHASE_SPEED', 'DETECT_RANGE'],
@@ -674,7 +726,7 @@ const TUTORIAL_PLATFORMER = {
674
726
  containsAll: ['createEntity', 'isTrigger', 'destroyEntity'],
675
727
  },
676
728
  hint: {
677
- en: 'Set isTrigger: true on coins so they don\'t push the player',
729
+ en: "Set isTrigger: true on coins so they don't push the player",
678
730
  pl: 'Ustaw isTrigger: true na monetach, aby nie odpychały gracza',
679
731
  de: 'Setze isTrigger: true auf Münzen, damit sie den Spieler nicht wegstoßen',
680
732
  },
@@ -693,7 +745,7 @@ const TUTORIAL_PLATFORMER = {
693
745
  pl: 'Użyj `Tilemap` do zbudowania poziomu. Zdefiniuj podłoże, platformy i ściany z kafelków.',
694
746
  de: 'Verwende eine `Tilemap` um das Level zu bauen. Definiere Boden, Plattformen und Wände mit Kacheln.',
695
747
  },
696
- codeTemplate: "// Create the level tilemap\nconst level = new Tilemap(20, 15, 32);\n",
748
+ codeTemplate: '// Create the level tilemap\nconst level = new Tilemap(20, 15, 32);\n',
697
749
  codeSolution: "const level = new Tilemap(20, 15, 32);\n\n// Add a ground layer\nlevel.addLayer('ground', 20, 15);\n\n// Fill the ground row\nlevel.fillRect('ground', 0, 14, 20, 1, 1); // bottom row = solid\n\n// Add some platforms\nlevel.setTile('ground', 5, 10, 1); // floating block\nlevel.setTile('ground', 6, 10, 1);\nlevel.setTile('ground', 7, 10, 1);\n\nlevel.fillRect('ground', 12, 8, 4, 1, 1); // higher platform\n\n// Check collisions with tilemap\nconst isSolid = level.isSolid(5, 14); // true — ground!",
698
750
  codeValidation: {
699
751
  containsAll: ['Tilemap', 'addLayer', 'fillRect'],
@@ -709,12 +761,12 @@ const TUTORIAL_PLATFORMER = {
709
761
  id: 'plat-complete',
710
762
  type: 'checkpoint',
711
763
  title: {
712
- en: 'Platformer Complete! 🎮',
713
- pl: 'Platformer gotowy! 🎮',
714
- de: 'Platformer fertig! 🎮',
764
+ en: 'Platformer Complete!',
765
+ pl: 'Platformer gotowy!',
766
+ de: 'Platformer fertig!',
715
767
  },
716
768
  content: {
717
- en: 'Congratulations! You\'ve built a complete platformer with:\n• Smooth acceleration-based movement\n• Jumping with coyote time\n• Double jump & wall slide\n• Dash mechanic\n• Enemy AI (patrol & chase)\n• Coins with trigger colliders\n• Tilemap level design\n\nChallenge: Add moving platforms and a boss fight!',
769
+ en: "Congratulations! You've built a complete platformer with:\n• Smooth acceleration-based movement\n• Jumping with coyote time\n• Double jump & wall slide\n• Dash mechanic\n• Enemy AI (patrol & chase)\n• Coins with trigger colliders\n• Tilemap level design\n\nChallenge: Add moving platforms and a boss fight!",
718
770
  pl: 'Gratulacje! Zbudowałeś kompletnego platformera z:\n• Płynny ruch z przyspieszeniem\n• Skakanie z coyote time\n• Podwójny skok i wall-slide\n• Mechanika dashu\n• AI wrogów (patrol i pościg)\n• Monety z trigger koliderami\n• Design poziomu z tilemapy\n\nWyzwanie: Dodaj ruchome platformy i walkę z bossem!',
719
771
  de: 'Herzlichen Glückwunsch! Du hast einen kompletten Platformer gebaut mit:\n• Flüssige beschleunigungsbasierte Bewegung\n• Springen mit Coyote-Time\n• Doppelsprung & Wall-Slide\n• Dash-Mechanik\n• Feind-KI (Patrouille & Verfolgung)\n• Münzen mit Trigger-Kollidern\n• Tilemap Level-Design\n\nHerausforderung: Füge bewegliche Plattformen und einen Bosskampf hinzu!',
720
772
  },
@@ -725,11 +777,7 @@ const TUTORIAL_PLATFORMER = {
725
777
  Convenience export
726
778
  ══════════════════════════════════════════════════════════════ */
727
779
  function getTutorials_T09_T11() {
728
- return [
729
- TUTORIAL_MULTIPLAYER_ONLINE,
730
- TUTORIAL_PROCEDURAL_WORLD,
731
- TUTORIAL_PLATFORMER,
732
- ];
780
+ return [TUTORIAL_MULTIPLAYER_ONLINE, TUTORIAL_PROCEDURAL_WORLD, TUTORIAL_PLATFORMER];
733
781
  }
734
782
 
735
783
  export { TUTORIAL_MULTIPLAYER_ONLINE, TUTORIAL_PLATFORMER, TUTORIAL_PROCEDURAL_WORLD, getTutorials_T09_T11 };