@nice2dev/game-engine 1.0.5 → 1.0.11

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 (721) hide show
  1. package/dist/cjs/accessibility/Accessibility.js +55 -20
  2. package/dist/cjs/accessibility/Accessibility.js.map +1 -1
  3. package/dist/cjs/ai/AI.js +74 -40
  4. package/dist/cjs/ai/AI.js.map +1 -1
  5. package/dist/cjs/ai/BehaviorTree.js +39 -47
  6. package/dist/cjs/ai/BehaviorTree.js.map +1 -1
  7. package/dist/cjs/ai/StateMachine.js +64 -100
  8. package/dist/cjs/ai/StateMachine.js.map +1 -1
  9. package/dist/cjs/animation/Animation.js +58 -34
  10. package/dist/cjs/animation/Animation.js.map +1 -1
  11. package/dist/cjs/audio/AudioAdvanced.js +71 -37
  12. package/dist/cjs/audio/AudioAdvanced.js.map +1 -1
  13. package/dist/cjs/audio/AudioBridge.js +61 -49
  14. package/dist/cjs/audio/AudioBridge.js.map +1 -1
  15. package/dist/cjs/audio/AudioManager.js +45 -29
  16. package/dist/cjs/audio/AudioManager.js.map +1 -1
  17. package/dist/cjs/build-cloud/BuildOrchestration.js +1142 -0
  18. package/dist/cjs/build-cloud/BuildOrchestration.js.map +1 -0
  19. package/dist/cjs/build-cloud/GodotBuildCloud.js +722 -0
  20. package/dist/cjs/build-cloud/GodotBuildCloud.js.map +1 -0
  21. package/dist/cjs/build-cloud/UnityBuildCloud.js +652 -0
  22. package/dist/cjs/build-cloud/UnityBuildCloud.js.map +1 -0
  23. package/dist/cjs/build-cloud/UnrealBuildCloud.js +674 -0
  24. package/dist/cjs/build-cloud/UnrealBuildCloud.js.map +1 -0
  25. package/dist/cjs/core/EventBus.js +2 -1
  26. package/dist/cjs/core/EventBus.js.map +1 -1
  27. package/dist/cjs/core/GameConfig.js +1 -1
  28. package/dist/cjs/core/GameConfig.js.map +1 -1
  29. package/dist/cjs/core/GameLoop.js +6 -3
  30. package/dist/cjs/core/GameLoop.js.map +1 -1
  31. package/dist/cjs/core/ServiceLocator.js +1 -2
  32. package/dist/cjs/core/ServiceLocator.js.map +1 -1
  33. package/dist/cjs/devtools/DevTools.js +73 -43
  34. package/dist/cjs/devtools/DevTools.js.map +1 -1
  35. package/dist/cjs/devtools/DeveloperExperience.js +84 -42
  36. package/dist/cjs/devtools/DeveloperExperience.js.map +1 -1
  37. package/dist/cjs/devtools/GameplayAnalytics.js +71 -43
  38. package/dist/cjs/devtools/GameplayAnalytics.js.map +1 -1
  39. package/dist/cjs/dialogue/DialogueSystem.js +153 -129
  40. package/dist/cjs/dialogue/DialogueSystem.js.map +1 -1
  41. package/dist/cjs/docs/DocGenerator.js +70 -28
  42. package/dist/cjs/docs/DocGenerator.js.map +1 -1
  43. package/dist/cjs/ecs/World.js +159 -33
  44. package/dist/cjs/ecs/World.js.map +1 -1
  45. package/dist/cjs/editor/AchievementEditor.js +650 -0
  46. package/dist/cjs/editor/AchievementEditor.js.map +1 -0
  47. package/dist/cjs/editor/AdvancedEditor.js +95 -23
  48. package/dist/cjs/editor/AdvancedEditor.js.map +1 -1
  49. package/dist/cjs/editor/AnimationRetargeting.js +742 -0
  50. package/dist/cjs/editor/AnimationRetargeting.js.map +1 -0
  51. package/dist/cjs/editor/AssetBrowser.js +1191 -0
  52. package/dist/cjs/editor/AssetBrowser.js.map +1 -0
  53. package/dist/cjs/editor/AssetManager.js +22 -14
  54. package/dist/cjs/editor/AssetManager.js.map +1 -1
  55. package/dist/cjs/editor/ConsolePro.js +1092 -0
  56. package/dist/cjs/editor/ConsolePro.js.map +1 -0
  57. package/dist/cjs/editor/CraftingEditor.js +749 -0
  58. package/dist/cjs/editor/CraftingEditor.js.map +1 -0
  59. package/dist/cjs/editor/DebugTools.js +46 -23
  60. package/dist/cjs/editor/DebugTools.js.map +1 -1
  61. package/dist/cjs/editor/DialogueSystem.js +924 -0
  62. package/dist/cjs/editor/DialogueSystem.js.map +1 -0
  63. package/dist/cjs/editor/LeaderboardSystem.js +496 -0
  64. package/dist/cjs/editor/LeaderboardSystem.js.map +1 -0
  65. package/dist/cjs/editor/NiceGameEditor.js +532 -142
  66. package/dist/cjs/editor/NiceGameEditor.js.map +1 -1
  67. package/dist/cjs/editor/PrefabSystem.js +864 -0
  68. package/dist/cjs/editor/PrefabSystem.js.map +1 -0
  69. package/dist/cjs/editor/ProfilerPanel.js +716 -0
  70. package/dist/cjs/editor/ProfilerPanel.js.map +1 -0
  71. package/dist/cjs/editor/QuestEditor.js +850 -0
  72. package/dist/cjs/editor/QuestEditor.js.map +1 -0
  73. package/dist/cjs/editor/ReplaySystem.js +655 -0
  74. package/dist/cjs/editor/ReplaySystem.js.map +1 -0
  75. package/dist/cjs/editor/SceneEditor.js +33 -13
  76. package/dist/cjs/editor/SceneEditor.js.map +1 -1
  77. package/dist/cjs/editor/ScreenshotMode.js +710 -0
  78. package/dist/cjs/editor/ScreenshotMode.js.map +1 -0
  79. package/dist/cjs/editor/ShaderGraph.js +7 -6
  80. package/dist/cjs/editor/ShaderGraph.js.map +1 -1
  81. package/dist/cjs/editor/TimelineEditor.js +36 -30
  82. package/dist/cjs/editor/TimelineEditor.js.map +1 -1
  83. package/dist/cjs/editor/UndoRedoPro.js +920 -0
  84. package/dist/cjs/editor/UndoRedoPro.js.map +1 -0
  85. package/dist/cjs/editor/VRARMode.js +658 -0
  86. package/dist/cjs/editor/VRARMode.js.map +1 -0
  87. package/dist/cjs/engine/NiceGameEngine.js +12 -10
  88. package/dist/cjs/engine/NiceGameEngine.js.map +1 -1
  89. package/dist/cjs/engine/SaveSystemV2.js +73 -37
  90. package/dist/cjs/engine/SaveSystemV2.js.map +1 -1
  91. package/dist/cjs/enterprise/Enterprise.js +92 -44
  92. package/dist/cjs/enterprise/Enterprise.js.map +1 -1
  93. package/dist/cjs/export/BevyExporter.js +998 -0
  94. package/dist/cjs/export/BevyExporter.js.map +1 -0
  95. package/dist/cjs/export/CocosExporter.js +706 -0
  96. package/dist/cjs/export/CocosExporter.js.map +1 -0
  97. package/dist/cjs/export/Construct3Exporter.js +832 -0
  98. package/dist/cjs/export/Construct3Exporter.js.map +1 -0
  99. package/dist/cjs/export/DefoldExporter.js +1106 -0
  100. package/dist/cjs/export/DefoldExporter.js.map +1 -0
  101. package/dist/cjs/export/GDevelopExporter.js +748 -0
  102. package/dist/cjs/export/GDevelopExporter.js.map +1 -0
  103. package/dist/cjs/export/GameMakerExporter.js +846 -0
  104. package/dist/cjs/export/GameMakerExporter.js.map +1 -0
  105. package/dist/cjs/export/GodotExporter.js +45 -50
  106. package/dist/cjs/export/GodotExporter.js.map +1 -1
  107. package/dist/cjs/export/MinecraftBedrockExporter.js +606 -0
  108. package/dist/cjs/export/MinecraftBedrockExporter.js.map +1 -0
  109. package/dist/cjs/export/MonoGameExporter.js +1334 -0
  110. package/dist/cjs/export/MonoGameExporter.js.map +1 -0
  111. package/dist/cjs/export/Pico8Exporter.js +846 -0
  112. package/dist/cjs/export/Pico8Exporter.js.map +1 -0
  113. package/dist/cjs/export/PlatformExporter.js +4 -5
  114. package/dist/cjs/export/PlatformExporter.js.map +1 -1
  115. package/dist/cjs/export/RPGMakerExporter.js +906 -0
  116. package/dist/cjs/export/RPGMakerExporter.js.map +1 -0
  117. package/dist/cjs/export/RobloxExporter.js +943 -0
  118. package/dist/cjs/export/RobloxExporter.js.map +1 -0
  119. package/dist/cjs/export/Solar2DExporter.js +1283 -0
  120. package/dist/cjs/export/Solar2DExporter.js.map +1 -0
  121. package/dist/cjs/export/ThreeJSExporter.js +52 -55
  122. package/dist/cjs/export/ThreeJSExporter.js.map +1 -1
  123. package/dist/cjs/export/Tic80Exporter.js +1315 -0
  124. package/dist/cjs/export/Tic80Exporter.js.map +1 -0
  125. package/dist/cjs/export/UnityExporter.js +41 -56
  126. package/dist/cjs/export/UnityExporter.js.map +1 -1
  127. package/dist/cjs/export/UnrealExporter.js +962 -0
  128. package/dist/cjs/export/UnrealExporter.js.map +1 -0
  129. package/dist/cjs/export/WebExporter.js +42 -50
  130. package/dist/cjs/export/WebExporter.js.map +1 -1
  131. package/dist/cjs/export/index.js +50 -2
  132. package/dist/cjs/export/index.js.map +1 -1
  133. package/dist/cjs/godot-integration/GodotAssetLibrary.js +716 -0
  134. package/dist/cjs/godot-integration/GodotAssetLibrary.js.map +1 -0
  135. package/dist/cjs/godot-integration/GodotImport.js +1069 -0
  136. package/dist/cjs/godot-integration/GodotImport.js.map +1 -0
  137. package/dist/cjs/godot-integration/GodotLiveLink.js +962 -0
  138. package/dist/cjs/godot-integration/GodotLiveLink.js.map +1 -0
  139. package/dist/cjs/godot-integration/components/GodotProjectBrowser.js +668 -0
  140. package/dist/cjs/godot-integration/components/GodotProjectBrowser.js.map +1 -0
  141. package/dist/cjs/i18n/I18n.js +56 -30
  142. package/dist/cjs/i18n/I18n.js.map +1 -1
  143. package/dist/cjs/i18n/useTranslation.js +4 -4
  144. package/dist/cjs/i18n/useTranslation.js.map +1 -1
  145. package/dist/cjs/import/AsepriteImporter.js +15 -19
  146. package/dist/cjs/import/AsepriteImporter.js.map +1 -1
  147. package/dist/cjs/import/DragonBonesImporter.js +36 -40
  148. package/dist/cjs/import/DragonBonesImporter.js.map +1 -1
  149. package/dist/cjs/import/GameMakerImporter.js +11 -17
  150. package/dist/cjs/import/GameMakerImporter.js.map +1 -1
  151. package/dist/cjs/import/GodotSceneImporter.js +43 -29
  152. package/dist/cjs/import/GodotSceneImporter.js.map +1 -1
  153. package/dist/cjs/import/LDtkImporter.js +16 -17
  154. package/dist/cjs/import/LDtkImporter.js.map +1 -1
  155. package/dist/cjs/import/Live2DImporter.js +16 -19
  156. package/dist/cjs/import/Live2DImporter.js.map +1 -1
  157. package/dist/cjs/import/NdgFormat.js +28 -35
  158. package/dist/cjs/import/NdgFormat.js.map +1 -1
  159. package/dist/cjs/import/OgmoImporter.js +16 -18
  160. package/dist/cjs/import/OgmoImporter.js.map +1 -1
  161. package/dist/cjs/import/RPGMakerImporter.js +5 -6
  162. package/dist/cjs/import/RPGMakerImporter.js.map +1 -1
  163. package/dist/cjs/import/SceneImporter.js +23 -13
  164. package/dist/cjs/import/SceneImporter.js.map +1 -1
  165. package/dist/cjs/import/SpineImporter.js +20 -20
  166. package/dist/cjs/import/SpineImporter.js.map +1 -1
  167. package/dist/cjs/import/SpriterImporter.js +38 -46
  168. package/dist/cjs/import/SpriterImporter.js.map +1 -1
  169. package/dist/cjs/import/TiledMapImporter.js +20 -24
  170. package/dist/cjs/import/TiledMapImporter.js.map +1 -1
  171. package/dist/cjs/import/UnitySceneImporter.js +15 -15
  172. package/dist/cjs/import/UnitySceneImporter.js.map +1 -1
  173. package/dist/cjs/index.js +516 -4
  174. package/dist/cjs/index.js.map +1 -1
  175. package/dist/cjs/input/GamepadNavigation.js +82 -47
  176. package/dist/cjs/input/GamepadNavigation.js.map +1 -1
  177. package/dist/cjs/input/InputManager.js +107 -52
  178. package/dist/cjs/input/InputManager.js.map +1 -1
  179. package/dist/cjs/input/useGamepads.js +35 -29
  180. package/dist/cjs/input/useGamepads.js.map +1 -1
  181. package/dist/cjs/integration/IconSprite.js +39 -21
  182. package/dist/cjs/integration/IconSprite.js.map +1 -1
  183. package/dist/cjs/inventory/InventorySystem.js +218 -127
  184. package/dist/cjs/inventory/InventorySystem.js.map +1 -1
  185. package/dist/cjs/kids/KidMode.js +491 -78
  186. package/dist/cjs/kids/KidMode.js.map +1 -1
  187. package/dist/cjs/kids/KidTools.js +154 -48
  188. package/dist/cjs/kids/KidTools.js.map +1 -1
  189. package/dist/cjs/monetization/Monetization.js +47 -35
  190. package/dist/cjs/monetization/Monetization.js.map +1 -1
  191. package/dist/cjs/multiplayer/LocalMultiplayer.js +48 -26
  192. package/dist/cjs/multiplayer/LocalMultiplayer.js.map +1 -1
  193. package/dist/cjs/multiplayer/MiniGameTypes.js +23 -10
  194. package/dist/cjs/multiplayer/MiniGameTypes.js.map +1 -1
  195. package/dist/cjs/native-engine/AssetPipeline.js +540 -0
  196. package/dist/cjs/native-engine/AssetPipeline.js.map +1 -0
  197. package/dist/cjs/native-engine/AudioEngine.js +825 -0
  198. package/dist/cjs/native-engine/AudioEngine.js.map +1 -0
  199. package/dist/cjs/native-engine/InputSystem.js +1175 -0
  200. package/dist/cjs/native-engine/InputSystem.js.map +1 -0
  201. package/dist/cjs/native-engine/NetworkingSystem.js +825 -0
  202. package/dist/cjs/native-engine/NetworkingSystem.js.map +1 -0
  203. package/dist/cjs/native-engine/PhysicsEngine.js +622 -0
  204. package/dist/cjs/native-engine/PhysicsEngine.js.map +1 -0
  205. package/dist/cjs/native-engine/RenderingEngine.js +371 -0
  206. package/dist/cjs/native-engine/RenderingEngine.js.map +1 -0
  207. package/dist/cjs/native-engine/SceneGraph.js +862 -0
  208. package/dist/cjs/native-engine/SceneGraph.js.map +1 -0
  209. package/dist/cjs/network/MultiplayerTransport.js +63 -33
  210. package/dist/cjs/network/MultiplayerTransport.js.map +1 -1
  211. package/dist/cjs/network/Networking.js +87 -62
  212. package/dist/cjs/network/Networking.js.map +1 -1
  213. package/dist/cjs/pathfinding/Pathfinding.js +71 -26
  214. package/dist/cjs/pathfinding/Pathfinding.js.map +1 -1
  215. package/dist/cjs/performance/AssetStreaming.js +656 -0
  216. package/dist/cjs/performance/AssetStreaming.js.map +1 -0
  217. package/dist/cjs/performance/BenchmarkSuite.js +37 -24
  218. package/dist/cjs/performance/BenchmarkSuite.js.map +1 -1
  219. package/dist/cjs/performance/DeltaCompression.js +566 -0
  220. package/dist/cjs/performance/DeltaCompression.js.map +1 -0
  221. package/dist/cjs/performance/DeterministicPhysics.js +603 -0
  222. package/dist/cjs/performance/DeterministicPhysics.js.map +1 -0
  223. package/dist/cjs/performance/ECSOptimization.js +726 -0
  224. package/dist/cjs/performance/ECSOptimization.js.map +1 -0
  225. package/dist/cjs/performance/HotReload.js +525 -0
  226. package/dist/cjs/performance/HotReload.js.map +1 -0
  227. package/dist/cjs/performance/InputRecording.js +590 -0
  228. package/dist/cjs/performance/InputRecording.js.map +1 -0
  229. package/dist/cjs/performance/InterestManagement.js +532 -0
  230. package/dist/cjs/performance/InterestManagement.js.map +1 -0
  231. package/dist/cjs/performance/LocalizationRuntime.js +472 -0
  232. package/dist/cjs/performance/LocalizationRuntime.js.map +1 -0
  233. package/dist/cjs/performance/MemoryManagement.js +487 -0
  234. package/dist/cjs/performance/MemoryManagement.js.map +1 -0
  235. package/dist/cjs/performance/ModSupport.js +531 -0
  236. package/dist/cjs/performance/ModSupport.js.map +1 -0
  237. package/dist/cjs/performance/MultiThreadedPhysics.js +500 -0
  238. package/dist/cjs/performance/MultiThreadedPhysics.js.map +1 -0
  239. package/dist/cjs/performance/NetworkPrediction.js +521 -0
  240. package/dist/cjs/performance/NetworkPrediction.js.map +1 -0
  241. package/dist/cjs/performance/ObjectPooling.js +653 -0
  242. package/dist/cjs/performance/ObjectPooling.js.map +1 -0
  243. package/dist/cjs/performance/Performance.js +64 -25
  244. package/dist/cjs/performance/Performance.js.map +1 -1
  245. package/dist/cjs/performance/PerformanceAdvanced.js +83 -49
  246. package/dist/cjs/performance/PerformanceAdvanced.js.map +1 -1
  247. package/dist/cjs/performance/SaveSystem.js +574 -0
  248. package/dist/cjs/performance/SaveSystem.js.map +1 -0
  249. package/dist/cjs/performance/WebGPURenderer.js +702 -0
  250. package/dist/cjs/performance/WebGPURenderer.js.map +1 -0
  251. package/dist/cjs/physics/PhysicsAdvanced.js +32 -20
  252. package/dist/cjs/physics/PhysicsAdvanced.js.map +1 -1
  253. package/dist/cjs/physics/PhysicsEngine2D.js +63 -36
  254. package/dist/cjs/physics/PhysicsEngine2D.js.map +1 -1
  255. package/dist/cjs/plugins/PluginSDK.js +46 -34
  256. package/dist/cjs/plugins/PluginSDK.js.map +1 -1
  257. package/dist/cjs/plugins/PluginTestKit.js +28 -29
  258. package/dist/cjs/plugins/PluginTestKit.js.map +1 -1
  259. package/dist/cjs/procedural/Procedural.js +24 -17
  260. package/dist/cjs/procedural/Procedural.js.map +1 -1
  261. package/dist/cjs/procedural/WorldBuilding.js +187 -55
  262. package/dist/cjs/procedural/WorldBuilding.js.map +1 -1
  263. package/dist/cjs/quest/QuestSystem.js +145 -111
  264. package/dist/cjs/quest/QuestSystem.js.map +1 -1
  265. package/dist/cjs/release/Release.js +142 -31
  266. package/dist/cjs/release/Release.js.map +1 -1
  267. package/dist/cjs/rendering/Camera2D.js +12 -7
  268. package/dist/cjs/rendering/Camera2D.js.map +1 -1
  269. package/dist/cjs/rendering/Renderer2D.js +62 -26
  270. package/dist/cjs/rendering/Renderer2D.js.map +1 -1
  271. package/dist/cjs/rendering/WebGPURenderPipeline.js +60 -31
  272. package/dist/cjs/rendering/WebGPURenderPipeline.js.map +1 -1
  273. package/dist/cjs/runtime3d/Runtime3D.js +80 -55
  274. package/dist/cjs/runtime3d/Runtime3D.js.map +1 -1
  275. package/dist/cjs/runtime3d/SceneEditor3D.js +20 -11
  276. package/dist/cjs/runtime3d/SceneEditor3D.js.map +1 -1
  277. package/dist/cjs/scene/SceneManager.js +26 -12
  278. package/dist/cjs/scene/SceneManager.js.map +1 -1
  279. package/dist/cjs/scripting/GraphToAST.js +36 -24
  280. package/dist/cjs/scripting/GraphToAST.js.map +1 -1
  281. package/dist/cjs/scripting/LanguageExporter.js +2 -3
  282. package/dist/cjs/scripting/LanguageExporter.js.map +1 -1
  283. package/dist/cjs/scripting/NodeGraph.js +49 -32
  284. package/dist/cjs/scripting/NodeGraph.js.map +1 -1
  285. package/dist/cjs/scripting/ScriptAST.js +19 -6
  286. package/dist/cjs/scripting/ScriptAST.js.map +1 -1
  287. package/dist/cjs/scripting/VisualScripting2.js +13 -12
  288. package/dist/cjs/scripting/VisualScripting2.js.map +1 -1
  289. package/dist/cjs/scripting/exporters/CSharpExporter.js +16 -16
  290. package/dist/cjs/scripting/exporters/CSharpExporter.js.map +1 -1
  291. package/dist/cjs/scripting/exporters/GDScriptExporter.js +3 -6
  292. package/dist/cjs/scripting/exporters/GDScriptExporter.js.map +1 -1
  293. package/dist/cjs/scripting/exporters/LuaExporter.js +5 -9
  294. package/dist/cjs/scripting/exporters/LuaExporter.js.map +1 -1
  295. package/dist/cjs/scripting/exporters/PythonExporter.js +7 -13
  296. package/dist/cjs/scripting/exporters/PythonExporter.js.map +1 -1
  297. package/dist/cjs/scripting/exporters/RustExporter.js +7 -14
  298. package/dist/cjs/scripting/exporters/RustExporter.js.map +1 -1
  299. package/dist/cjs/scripting/exporters/TypeScriptExporter.js +28 -29
  300. package/dist/cjs/scripting/exporters/TypeScriptExporter.js.map +1 -1
  301. package/dist/cjs/social/Social.js +27 -20
  302. package/dist/cjs/social/Social.js.map +1 -1
  303. package/dist/cjs/systems/LightingSystem.js +980 -0
  304. package/dist/cjs/systems/LightingSystem.js.map +1 -0
  305. package/dist/cjs/systems/ParticleSystem2.js +34 -17
  306. package/dist/cjs/systems/ParticleSystem2.js.map +1 -1
  307. package/dist/cjs/systems/PhysicsDebugSystem.js +1228 -0
  308. package/dist/cjs/systems/PhysicsDebugSystem.js.map +1 -0
  309. package/dist/cjs/systems/TerrainSystem.js +1137 -0
  310. package/dist/cjs/systems/TerrainSystem.js.map +1 -0
  311. package/dist/cjs/templates/ActionTemplates.js +144 -24
  312. package/dist/cjs/templates/ActionTemplates.js.map +1 -1
  313. package/dist/cjs/templates/FightingTemplate.js +536 -0
  314. package/dist/cjs/templates/FightingTemplate.js.map +1 -0
  315. package/dist/cjs/templates/MetroidvaniaTemplate.js +523 -0
  316. package/dist/cjs/templates/MetroidvaniaTemplate.js.map +1 -0
  317. package/dist/cjs/templates/PartyTemplates.js +60 -28
  318. package/dist/cjs/templates/PartyTemplates.js.map +1 -1
  319. package/dist/cjs/templates/PuzzleTemplates.js +63 -22
  320. package/dist/cjs/templates/PuzzleTemplates.js.map +1 -1
  321. package/dist/cjs/templates/RPGTemplates.js +29 -15
  322. package/dist/cjs/templates/RPGTemplates.js.map +1 -1
  323. package/dist/cjs/templates/SportsTemplates.js +41 -17
  324. package/dist/cjs/templates/SportsTemplates.js.map +1 -1
  325. package/dist/cjs/templates/StrategyTemplates.js +45 -18
  326. package/dist/cjs/templates/StrategyTemplates.js.map +1 -1
  327. package/dist/cjs/templates/SurvivalTemplate.js +479 -0
  328. package/dist/cjs/templates/SurvivalTemplate.js.map +1 -0
  329. package/dist/cjs/templates/WaveDefense.js +139 -52
  330. package/dist/cjs/templates/WaveDefense.js.map +1 -1
  331. package/dist/cjs/tilemap/Tilemap.js +48 -32
  332. package/dist/cjs/tilemap/Tilemap.js.map +1 -1
  333. package/dist/cjs/tutorials/TutorialBranching.js +111 -42
  334. package/dist/cjs/tutorials/TutorialBranching.js.map +1 -1
  335. package/dist/cjs/tutorials/TutorialEngine.js +152 -80
  336. package/dist/cjs/tutorials/TutorialEngine.js.map +1 -1
  337. package/dist/cjs/tutorials/TutorialOverlay.js +117 -40
  338. package/dist/cjs/tutorials/TutorialOverlay.js.map +1 -1
  339. package/dist/cjs/ui/GameUI.js +69 -42
  340. package/dist/cjs/ui/GameUI.js.map +1 -1
  341. package/dist/cjs/unity-integration/UnityAssetStore.js +754 -0
  342. package/dist/cjs/unity-integration/UnityAssetStore.js.map +1 -0
  343. package/dist/cjs/unity-integration/UnityImport.js +1252 -0
  344. package/dist/cjs/unity-integration/UnityImport.js.map +1 -0
  345. package/dist/cjs/unity-integration/UnityLiveLink.js +1022 -0
  346. package/dist/cjs/unity-integration/UnityLiveLink.js.map +1 -0
  347. package/dist/cjs/unity-integration/components/UnityAssetStoreBrowser.js +796 -0
  348. package/dist/cjs/unity-integration/components/UnityAssetStoreBrowser.js.map +1 -0
  349. package/dist/cjs/unity-integration/components/UnityProjectBrowser.js +833 -0
  350. package/dist/cjs/unity-integration/components/UnityProjectBrowser.js.map +1 -0
  351. package/dist/cjs/unreal-integration/UnrealImport.js +442 -0
  352. package/dist/cjs/unreal-integration/UnrealImport.js.map +1 -0
  353. package/dist/cjs/unreal-integration/UnrealLiveLink.js +1186 -0
  354. package/dist/cjs/unreal-integration/UnrealLiveLink.js.map +1 -0
  355. package/dist/cjs/unreal-integration/UnrealMarketplace.js +497 -0
  356. package/dist/cjs/unreal-integration/UnrealMarketplace.js.map +1 -0
  357. package/dist/cjs/unreal-integration/components/UnrealProjectBrowser.js +835 -0
  358. package/dist/cjs/unreal-integration/components/UnrealProjectBrowser.js.map +1 -0
  359. package/dist/cjs/xr/ARVR.js +32 -9
  360. package/dist/cjs/xr/ARVR.js.map +1 -1
  361. package/dist/esm/accessibility/Accessibility.js +55 -20
  362. package/dist/esm/accessibility/Accessibility.js.map +1 -1
  363. package/dist/esm/ai/AI.js +74 -40
  364. package/dist/esm/ai/AI.js.map +1 -1
  365. package/dist/esm/ai/BehaviorTree.js +39 -47
  366. package/dist/esm/ai/BehaviorTree.js.map +1 -1
  367. package/dist/esm/ai/StateMachine.js +65 -99
  368. package/dist/esm/ai/StateMachine.js.map +1 -1
  369. package/dist/esm/animation/Animation.js +58 -34
  370. package/dist/esm/animation/Animation.js.map +1 -1
  371. package/dist/esm/audio/AudioAdvanced.js +71 -37
  372. package/dist/esm/audio/AudioAdvanced.js.map +1 -1
  373. package/dist/esm/audio/AudioBridge.js +61 -49
  374. package/dist/esm/audio/AudioBridge.js.map +1 -1
  375. package/dist/esm/audio/AudioManager.js +45 -29
  376. package/dist/esm/audio/AudioManager.js.map +1 -1
  377. package/dist/esm/build-cloud/BuildOrchestration.js +1129 -0
  378. package/dist/esm/build-cloud/BuildOrchestration.js.map +1 -0
  379. package/dist/esm/build-cloud/GodotBuildCloud.js +715 -0
  380. package/dist/esm/build-cloud/GodotBuildCloud.js.map +1 -0
  381. package/dist/esm/build-cloud/UnityBuildCloud.js +643 -0
  382. package/dist/esm/build-cloud/UnityBuildCloud.js.map +1 -0
  383. package/dist/esm/build-cloud/UnrealBuildCloud.js +668 -0
  384. package/dist/esm/build-cloud/UnrealBuildCloud.js.map +1 -0
  385. package/dist/esm/core/EventBus.js +2 -1
  386. package/dist/esm/core/EventBus.js.map +1 -1
  387. package/dist/esm/core/GameConfig.js +1 -1
  388. package/dist/esm/core/GameConfig.js.map +1 -1
  389. package/dist/esm/core/GameLoop.js +6 -3
  390. package/dist/esm/core/GameLoop.js.map +1 -1
  391. package/dist/esm/core/ServiceLocator.js +1 -2
  392. package/dist/esm/core/ServiceLocator.js.map +1 -1
  393. package/dist/esm/devtools/DevTools.js +73 -43
  394. package/dist/esm/devtools/DevTools.js.map +1 -1
  395. package/dist/esm/devtools/DeveloperExperience.js +84 -42
  396. package/dist/esm/devtools/DeveloperExperience.js.map +1 -1
  397. package/dist/esm/devtools/GameplayAnalytics.js +71 -43
  398. package/dist/esm/devtools/GameplayAnalytics.js.map +1 -1
  399. package/dist/esm/dialogue/DialogueSystem.js +153 -129
  400. package/dist/esm/dialogue/DialogueSystem.js.map +1 -1
  401. package/dist/esm/docs/DocGenerator.js +70 -28
  402. package/dist/esm/docs/DocGenerator.js.map +1 -1
  403. package/dist/esm/ecs/World.js +159 -33
  404. package/dist/esm/ecs/World.js.map +1 -1
  405. package/dist/esm/editor/AchievementEditor.js +645 -0
  406. package/dist/esm/editor/AchievementEditor.js.map +1 -0
  407. package/dist/esm/editor/AdvancedEditor.js +95 -23
  408. package/dist/esm/editor/AdvancedEditor.js.map +1 -1
  409. package/dist/esm/editor/AnimationRetargeting.js +738 -0
  410. package/dist/esm/editor/AnimationRetargeting.js.map +1 -0
  411. package/dist/esm/editor/AssetBrowser.js +1184 -0
  412. package/dist/esm/editor/AssetBrowser.js.map +1 -0
  413. package/dist/esm/editor/AssetManager.js +22 -14
  414. package/dist/esm/editor/AssetManager.js.map +1 -1
  415. package/dist/esm/editor/ConsolePro.js +1085 -0
  416. package/dist/esm/editor/ConsolePro.js.map +1 -0
  417. package/dist/esm/editor/CraftingEditor.js +744 -0
  418. package/dist/esm/editor/CraftingEditor.js.map +1 -0
  419. package/dist/esm/editor/DebugTools.js +46 -23
  420. package/dist/esm/editor/DebugTools.js.map +1 -1
  421. package/dist/esm/editor/DialogueSystem.js +918 -0
  422. package/dist/esm/editor/DialogueSystem.js.map +1 -0
  423. package/dist/esm/editor/LeaderboardSystem.js +491 -0
  424. package/dist/esm/editor/LeaderboardSystem.js.map +1 -0
  425. package/dist/esm/editor/NiceGameEditor.js +532 -142
  426. package/dist/esm/editor/NiceGameEditor.js.map +1 -1
  427. package/dist/esm/editor/PrefabSystem.js +858 -0
  428. package/dist/esm/editor/PrefabSystem.js.map +1 -0
  429. package/dist/esm/editor/ProfilerPanel.js +710 -0
  430. package/dist/esm/editor/ProfilerPanel.js.map +1 -0
  431. package/dist/esm/editor/QuestEditor.js +846 -0
  432. package/dist/esm/editor/QuestEditor.js.map +1 -0
  433. package/dist/esm/editor/ReplaySystem.js +648 -0
  434. package/dist/esm/editor/ReplaySystem.js.map +1 -0
  435. package/dist/esm/editor/SceneEditor.js +33 -13
  436. package/dist/esm/editor/SceneEditor.js.map +1 -1
  437. package/dist/esm/editor/ScreenshotMode.js +702 -0
  438. package/dist/esm/editor/ScreenshotMode.js.map +1 -0
  439. package/dist/esm/editor/ShaderGraph.js +7 -6
  440. package/dist/esm/editor/ShaderGraph.js.map +1 -1
  441. package/dist/esm/editor/TimelineEditor.js +37 -30
  442. package/dist/esm/editor/TimelineEditor.js.map +1 -1
  443. package/dist/esm/editor/UndoRedoPro.js +914 -0
  444. package/dist/esm/editor/UndoRedoPro.js.map +1 -0
  445. package/dist/esm/editor/VRARMode.js +653 -0
  446. package/dist/esm/editor/VRARMode.js.map +1 -0
  447. package/dist/esm/engine/NiceGameEngine.js +12 -10
  448. package/dist/esm/engine/NiceGameEngine.js.map +1 -1
  449. package/dist/esm/engine/SaveSystemV2.js +73 -37
  450. package/dist/esm/engine/SaveSystemV2.js.map +1 -1
  451. package/dist/esm/enterprise/Enterprise.js +92 -44
  452. package/dist/esm/enterprise/Enterprise.js.map +1 -1
  453. package/dist/esm/export/BevyExporter.js +995 -0
  454. package/dist/esm/export/BevyExporter.js.map +1 -0
  455. package/dist/esm/export/CocosExporter.js +703 -0
  456. package/dist/esm/export/CocosExporter.js.map +1 -0
  457. package/dist/esm/export/Construct3Exporter.js +829 -0
  458. package/dist/esm/export/Construct3Exporter.js.map +1 -0
  459. package/dist/esm/export/DefoldExporter.js +1103 -0
  460. package/dist/esm/export/DefoldExporter.js.map +1 -0
  461. package/dist/esm/export/GDevelopExporter.js +745 -0
  462. package/dist/esm/export/GDevelopExporter.js.map +1 -0
  463. package/dist/esm/export/GameMakerExporter.js +843 -0
  464. package/dist/esm/export/GameMakerExporter.js.map +1 -0
  465. package/dist/esm/export/GodotExporter.js +45 -50
  466. package/dist/esm/export/GodotExporter.js.map +1 -1
  467. package/dist/esm/export/MinecraftBedrockExporter.js +603 -0
  468. package/dist/esm/export/MinecraftBedrockExporter.js.map +1 -0
  469. package/dist/esm/export/MonoGameExporter.js +1331 -0
  470. package/dist/esm/export/MonoGameExporter.js.map +1 -0
  471. package/dist/esm/export/Pico8Exporter.js +843 -0
  472. package/dist/esm/export/Pico8Exporter.js.map +1 -0
  473. package/dist/esm/export/PlatformExporter.js +4 -5
  474. package/dist/esm/export/PlatformExporter.js.map +1 -1
  475. package/dist/esm/export/RPGMakerExporter.js +903 -0
  476. package/dist/esm/export/RPGMakerExporter.js.map +1 -0
  477. package/dist/esm/export/RobloxExporter.js +940 -0
  478. package/dist/esm/export/RobloxExporter.js.map +1 -0
  479. package/dist/esm/export/Solar2DExporter.js +1280 -0
  480. package/dist/esm/export/Solar2DExporter.js.map +1 -0
  481. package/dist/esm/export/ThreeJSExporter.js +52 -55
  482. package/dist/esm/export/ThreeJSExporter.js.map +1 -1
  483. package/dist/esm/export/Tic80Exporter.js +1312 -0
  484. package/dist/esm/export/Tic80Exporter.js.map +1 -0
  485. package/dist/esm/export/UnityExporter.js +41 -56
  486. package/dist/esm/export/UnityExporter.js.map +1 -1
  487. package/dist/esm/export/UnrealExporter.js +959 -0
  488. package/dist/esm/export/UnrealExporter.js.map +1 -0
  489. package/dist/esm/export/WebExporter.js +42 -50
  490. package/dist/esm/export/WebExporter.js.map +1 -1
  491. package/dist/esm/export/index.js +38 -2
  492. package/dist/esm/export/index.js.map +1 -1
  493. package/dist/esm/godot-integration/GodotAssetLibrary.js +711 -0
  494. package/dist/esm/godot-integration/GodotAssetLibrary.js.map +1 -0
  495. package/dist/esm/godot-integration/GodotImport.js +1062 -0
  496. package/dist/esm/godot-integration/GodotImport.js.map +1 -0
  497. package/dist/esm/godot-integration/GodotLiveLink.js +958 -0
  498. package/dist/esm/godot-integration/GodotLiveLink.js.map +1 -0
  499. package/dist/esm/godot-integration/components/GodotProjectBrowser.js +666 -0
  500. package/dist/esm/godot-integration/components/GodotProjectBrowser.js.map +1 -0
  501. package/dist/esm/i18n/I18n.js +56 -30
  502. package/dist/esm/i18n/I18n.js.map +1 -1
  503. package/dist/esm/i18n/useTranslation.js +4 -4
  504. package/dist/esm/i18n/useTranslation.js.map +1 -1
  505. package/dist/esm/import/AsepriteImporter.js +15 -19
  506. package/dist/esm/import/AsepriteImporter.js.map +1 -1
  507. package/dist/esm/import/DragonBonesImporter.js +36 -40
  508. package/dist/esm/import/DragonBonesImporter.js.map +1 -1
  509. package/dist/esm/import/GameMakerImporter.js +11 -17
  510. package/dist/esm/import/GameMakerImporter.js.map +1 -1
  511. package/dist/esm/import/GodotSceneImporter.js +43 -29
  512. package/dist/esm/import/GodotSceneImporter.js.map +1 -1
  513. package/dist/esm/import/LDtkImporter.js +16 -17
  514. package/dist/esm/import/LDtkImporter.js.map +1 -1
  515. package/dist/esm/import/Live2DImporter.js +16 -19
  516. package/dist/esm/import/Live2DImporter.js.map +1 -1
  517. package/dist/esm/import/NdgFormat.js +28 -35
  518. package/dist/esm/import/NdgFormat.js.map +1 -1
  519. package/dist/esm/import/OgmoImporter.js +16 -18
  520. package/dist/esm/import/OgmoImporter.js.map +1 -1
  521. package/dist/esm/import/RPGMakerImporter.js +5 -6
  522. package/dist/esm/import/RPGMakerImporter.js.map +1 -1
  523. package/dist/esm/import/SceneImporter.js +23 -13
  524. package/dist/esm/import/SceneImporter.js.map +1 -1
  525. package/dist/esm/import/SpineImporter.js +20 -20
  526. package/dist/esm/import/SpineImporter.js.map +1 -1
  527. package/dist/esm/import/SpriterImporter.js +38 -46
  528. package/dist/esm/import/SpriterImporter.js.map +1 -1
  529. package/dist/esm/import/TiledMapImporter.js +20 -24
  530. package/dist/esm/import/TiledMapImporter.js.map +1 -1
  531. package/dist/esm/import/UnitySceneImporter.js +15 -15
  532. package/dist/esm/import/UnitySceneImporter.js.map +1 -1
  533. package/dist/esm/index.js +76 -3
  534. package/dist/esm/index.js.map +1 -1
  535. package/dist/esm/input/GamepadNavigation.js +82 -47
  536. package/dist/esm/input/GamepadNavigation.js.map +1 -1
  537. package/dist/esm/input/InputManager.js +107 -52
  538. package/dist/esm/input/InputManager.js.map +1 -1
  539. package/dist/esm/input/useGamepads.js +35 -29
  540. package/dist/esm/input/useGamepads.js.map +1 -1
  541. package/dist/esm/integration/IconSprite.js +39 -21
  542. package/dist/esm/integration/IconSprite.js.map +1 -1
  543. package/dist/esm/inventory/InventorySystem.js +218 -127
  544. package/dist/esm/inventory/InventorySystem.js.map +1 -1
  545. package/dist/esm/kids/KidMode.js +491 -78
  546. package/dist/esm/kids/KidMode.js.map +1 -1
  547. package/dist/esm/kids/KidTools.js +154 -48
  548. package/dist/esm/kids/KidTools.js.map +1 -1
  549. package/dist/esm/monetization/Monetization.js +47 -35
  550. package/dist/esm/monetization/Monetization.js.map +1 -1
  551. package/dist/esm/multiplayer/LocalMultiplayer.js +48 -26
  552. package/dist/esm/multiplayer/LocalMultiplayer.js.map +1 -1
  553. package/dist/esm/multiplayer/MiniGameTypes.js +23 -10
  554. package/dist/esm/multiplayer/MiniGameTypes.js.map +1 -1
  555. package/dist/esm/native-engine/AssetPipeline.js +537 -0
  556. package/dist/esm/native-engine/AssetPipeline.js.map +1 -0
  557. package/dist/esm/native-engine/AudioEngine.js +822 -0
  558. package/dist/esm/native-engine/AudioEngine.js.map +1 -0
  559. package/dist/esm/native-engine/InputSystem.js +1170 -0
  560. package/dist/esm/native-engine/InputSystem.js.map +1 -0
  561. package/dist/esm/native-engine/NetworkingSystem.js +817 -0
  562. package/dist/esm/native-engine/NetworkingSystem.js.map +1 -0
  563. package/dist/esm/native-engine/PhysicsEngine.js +619 -0
  564. package/dist/esm/native-engine/PhysicsEngine.js.map +1 -0
  565. package/dist/esm/native-engine/RenderingEngine.js +368 -0
  566. package/dist/esm/native-engine/RenderingEngine.js.map +1 -0
  567. package/dist/esm/native-engine/SceneGraph.js +857 -0
  568. package/dist/esm/native-engine/SceneGraph.js.map +1 -0
  569. package/dist/esm/network/MultiplayerTransport.js +63 -33
  570. package/dist/esm/network/MultiplayerTransport.js.map +1 -1
  571. package/dist/esm/network/Networking.js +87 -62
  572. package/dist/esm/network/Networking.js.map +1 -1
  573. package/dist/esm/pathfinding/Pathfinding.js +71 -26
  574. package/dist/esm/pathfinding/Pathfinding.js.map +1 -1
  575. package/dist/esm/performance/AssetStreaming.js +649 -0
  576. package/dist/esm/performance/AssetStreaming.js.map +1 -0
  577. package/dist/esm/performance/BenchmarkSuite.js +37 -24
  578. package/dist/esm/performance/BenchmarkSuite.js.map +1 -1
  579. package/dist/esm/performance/DeltaCompression.js +554 -0
  580. package/dist/esm/performance/DeltaCompression.js.map +1 -0
  581. package/dist/esm/performance/DeterministicPhysics.js +573 -0
  582. package/dist/esm/performance/DeterministicPhysics.js.map +1 -0
  583. package/dist/esm/performance/ECSOptimization.js +716 -0
  584. package/dist/esm/performance/ECSOptimization.js.map +1 -0
  585. package/dist/esm/performance/HotReload.js +517 -0
  586. package/dist/esm/performance/HotReload.js.map +1 -0
  587. package/dist/esm/performance/InputRecording.js +580 -0
  588. package/dist/esm/performance/InputRecording.js.map +1 -0
  589. package/dist/esm/performance/InterestManagement.js +524 -0
  590. package/dist/esm/performance/InterestManagement.js.map +1 -0
  591. package/dist/esm/performance/LocalizationRuntime.js +465 -0
  592. package/dist/esm/performance/LocalizationRuntime.js.map +1 -0
  593. package/dist/esm/performance/MemoryManagement.js +481 -0
  594. package/dist/esm/performance/MemoryManagement.js.map +1 -0
  595. package/dist/esm/performance/ModSupport.js +520 -0
  596. package/dist/esm/performance/ModSupport.js.map +1 -0
  597. package/dist/esm/performance/MultiThreadedPhysics.js +491 -0
  598. package/dist/esm/performance/MultiThreadedPhysics.js.map +1 -0
  599. package/dist/esm/performance/NetworkPrediction.js +508 -0
  600. package/dist/esm/performance/NetworkPrediction.js.map +1 -0
  601. package/dist/esm/performance/ObjectPooling.js +639 -0
  602. package/dist/esm/performance/ObjectPooling.js.map +1 -0
  603. package/dist/esm/performance/Performance.js +64 -25
  604. package/dist/esm/performance/Performance.js.map +1 -1
  605. package/dist/esm/performance/PerformanceAdvanced.js +83 -49
  606. package/dist/esm/performance/PerformanceAdvanced.js.map +1 -1
  607. package/dist/esm/performance/SaveSystem.js +567 -0
  608. package/dist/esm/performance/SaveSystem.js.map +1 -0
  609. package/dist/esm/performance/WebGPURenderer.js +697 -0
  610. package/dist/esm/performance/WebGPURenderer.js.map +1 -0
  611. package/dist/esm/physics/PhysicsAdvanced.js +32 -20
  612. package/dist/esm/physics/PhysicsAdvanced.js.map +1 -1
  613. package/dist/esm/physics/PhysicsEngine2D.js +63 -36
  614. package/dist/esm/physics/PhysicsEngine2D.js.map +1 -1
  615. package/dist/esm/plugins/PluginSDK.js +46 -34
  616. package/dist/esm/plugins/PluginSDK.js.map +1 -1
  617. package/dist/esm/plugins/PluginTestKit.js +28 -29
  618. package/dist/esm/plugins/PluginTestKit.js.map +1 -1
  619. package/dist/esm/procedural/Procedural.js +24 -17
  620. package/dist/esm/procedural/Procedural.js.map +1 -1
  621. package/dist/esm/procedural/WorldBuilding.js +188 -55
  622. package/dist/esm/procedural/WorldBuilding.js.map +1 -1
  623. package/dist/esm/quest/QuestSystem.js +145 -111
  624. package/dist/esm/quest/QuestSystem.js.map +1 -1
  625. package/dist/esm/release/Release.js +142 -31
  626. package/dist/esm/release/Release.js.map +1 -1
  627. package/dist/esm/rendering/Camera2D.js +12 -7
  628. package/dist/esm/rendering/Camera2D.js.map +1 -1
  629. package/dist/esm/rendering/Renderer2D.js +62 -26
  630. package/dist/esm/rendering/Renderer2D.js.map +1 -1
  631. package/dist/esm/rendering/WebGPURenderPipeline.js +60 -31
  632. package/dist/esm/rendering/WebGPURenderPipeline.js.map +1 -1
  633. package/dist/esm/runtime3d/Runtime3D.js +80 -55
  634. package/dist/esm/runtime3d/Runtime3D.js.map +1 -1
  635. package/dist/esm/runtime3d/SceneEditor3D.js +20 -11
  636. package/dist/esm/runtime3d/SceneEditor3D.js.map +1 -1
  637. package/dist/esm/scene/SceneManager.js +26 -12
  638. package/dist/esm/scene/SceneManager.js.map +1 -1
  639. package/dist/esm/scripting/GraphToAST.js +36 -24
  640. package/dist/esm/scripting/GraphToAST.js.map +1 -1
  641. package/dist/esm/scripting/LanguageExporter.js +2 -3
  642. package/dist/esm/scripting/LanguageExporter.js.map +1 -1
  643. package/dist/esm/scripting/NodeGraph.js +49 -32
  644. package/dist/esm/scripting/NodeGraph.js.map +1 -1
  645. package/dist/esm/scripting/ScriptAST.js +19 -6
  646. package/dist/esm/scripting/ScriptAST.js.map +1 -1
  647. package/dist/esm/scripting/VisualScripting2.js +13 -12
  648. package/dist/esm/scripting/VisualScripting2.js.map +1 -1
  649. package/dist/esm/scripting/exporters/CSharpExporter.js +16 -16
  650. package/dist/esm/scripting/exporters/CSharpExporter.js.map +1 -1
  651. package/dist/esm/scripting/exporters/GDScriptExporter.js +3 -6
  652. package/dist/esm/scripting/exporters/GDScriptExporter.js.map +1 -1
  653. package/dist/esm/scripting/exporters/LuaExporter.js +5 -9
  654. package/dist/esm/scripting/exporters/LuaExporter.js.map +1 -1
  655. package/dist/esm/scripting/exporters/PythonExporter.js +7 -13
  656. package/dist/esm/scripting/exporters/PythonExporter.js.map +1 -1
  657. package/dist/esm/scripting/exporters/RustExporter.js +7 -14
  658. package/dist/esm/scripting/exporters/RustExporter.js.map +1 -1
  659. package/dist/esm/scripting/exporters/TypeScriptExporter.js +28 -29
  660. package/dist/esm/scripting/exporters/TypeScriptExporter.js.map +1 -1
  661. package/dist/esm/social/Social.js +27 -20
  662. package/dist/esm/social/Social.js.map +1 -1
  663. package/dist/esm/systems/LightingSystem.js +968 -0
  664. package/dist/esm/systems/LightingSystem.js.map +1 -0
  665. package/dist/esm/systems/ParticleSystem2.js +34 -17
  666. package/dist/esm/systems/ParticleSystem2.js.map +1 -1
  667. package/dist/esm/systems/PhysicsDebugSystem.js +1219 -0
  668. package/dist/esm/systems/PhysicsDebugSystem.js.map +1 -0
  669. package/dist/esm/systems/TerrainSystem.js +1125 -0
  670. package/dist/esm/systems/TerrainSystem.js.map +1 -0
  671. package/dist/esm/templates/ActionTemplates.js +144 -24
  672. package/dist/esm/templates/ActionTemplates.js.map +1 -1
  673. package/dist/esm/templates/FightingTemplate.js +513 -0
  674. package/dist/esm/templates/FightingTemplate.js.map +1 -0
  675. package/dist/esm/templates/MetroidvaniaTemplate.js +484 -0
  676. package/dist/esm/templates/MetroidvaniaTemplate.js.map +1 -0
  677. package/dist/esm/templates/PartyTemplates.js +60 -28
  678. package/dist/esm/templates/PartyTemplates.js.map +1 -1
  679. package/dist/esm/templates/PuzzleTemplates.js +63 -22
  680. package/dist/esm/templates/PuzzleTemplates.js.map +1 -1
  681. package/dist/esm/templates/RPGTemplates.js +29 -15
  682. package/dist/esm/templates/RPGTemplates.js.map +1 -1
  683. package/dist/esm/templates/SportsTemplates.js +41 -17
  684. package/dist/esm/templates/SportsTemplates.js.map +1 -1
  685. package/dist/esm/templates/StrategyTemplates.js +45 -18
  686. package/dist/esm/templates/StrategyTemplates.js.map +1 -1
  687. package/dist/esm/templates/SurvivalTemplate.js +447 -0
  688. package/dist/esm/templates/SurvivalTemplate.js.map +1 -0
  689. package/dist/esm/templates/WaveDefense.js +139 -52
  690. package/dist/esm/templates/WaveDefense.js.map +1 -1
  691. package/dist/esm/tilemap/Tilemap.js +48 -32
  692. package/dist/esm/tilemap/Tilemap.js.map +1 -1
  693. package/dist/esm/tutorials/TutorialBranching.js +111 -42
  694. package/dist/esm/tutorials/TutorialBranching.js.map +1 -1
  695. package/dist/esm/tutorials/TutorialEngine.js +152 -80
  696. package/dist/esm/tutorials/TutorialEngine.js.map +1 -1
  697. package/dist/esm/tutorials/TutorialOverlay.js +117 -40
  698. package/dist/esm/tutorials/TutorialOverlay.js.map +1 -1
  699. package/dist/esm/ui/GameUI.js +69 -42
  700. package/dist/esm/ui/GameUI.js.map +1 -1
  701. package/dist/esm/unity-integration/UnityAssetStore.js +749 -0
  702. package/dist/esm/unity-integration/UnityAssetStore.js.map +1 -0
  703. package/dist/esm/unity-integration/UnityImport.js +1246 -0
  704. package/dist/esm/unity-integration/UnityImport.js.map +1 -0
  705. package/dist/esm/unity-integration/UnityLiveLink.js +1017 -0
  706. package/dist/esm/unity-integration/UnityLiveLink.js.map +1 -0
  707. package/dist/esm/unity-integration/components/UnityAssetStoreBrowser.js +794 -0
  708. package/dist/esm/unity-integration/components/UnityAssetStoreBrowser.js.map +1 -0
  709. package/dist/esm/unity-integration/components/UnityProjectBrowser.js +831 -0
  710. package/dist/esm/unity-integration/components/UnityProjectBrowser.js.map +1 -0
  711. package/dist/esm/unreal-integration/UnrealImport.js +437 -0
  712. package/dist/esm/unreal-integration/UnrealImport.js.map +1 -0
  713. package/dist/esm/unreal-integration/UnrealLiveLink.js +1182 -0
  714. package/dist/esm/unreal-integration/UnrealLiveLink.js.map +1 -0
  715. package/dist/esm/unreal-integration/UnrealMarketplace.js +490 -0
  716. package/dist/esm/unreal-integration/UnrealMarketplace.js.map +1 -0
  717. package/dist/esm/unreal-integration/components/UnrealProjectBrowser.js +833 -0
  718. package/dist/esm/unreal-integration/components/UnrealProjectBrowser.js.map +1 -0
  719. package/dist/esm/xr/ARVR.js +32 -9
  720. package/dist/esm/xr/ARVR.js.map +1 -1
  721. package/package.json +7 -6
@@ -0,0 +1,1315 @@
1
+ 'use strict';
2
+
3
+ var PlatformExporter = require('./PlatformExporter.js');
4
+
5
+ /* ────────────────────────────────────────────────────────────────
6
+ TIC-80 Exporter — Fantasy Computer Export
7
+
8
+ Exports Nice2Dev projects to TIC-80 format:
9
+ - TIC cartridge file format (.tic)
10
+ - Support for Lua, JavaScript, and Moonscript
11
+ - Sprites, map, sound, music
12
+
13
+ Specs:
14
+ - 240x136 pixels
15
+ - 16 colors palette
16
+ - 256 8x8 sprites
17
+ - Free and open source
18
+ ──────────────────────────────────────────────────────────────── */
19
+ /* ── TIC-80 Constants ─────────────────────────────────────────── */
20
+ const TIC80_PALETTE = [
21
+ '#1a1c2c', // 0 - dark purple
22
+ '#5d275d', // 1 - magenta
23
+ '#b13e53', // 2 - red
24
+ '#ef7d57', // 3 - orange
25
+ '#ffcd75', // 4 - yellow
26
+ '#a7f070', // 5 - lime
27
+ '#38b764', // 6 - green
28
+ '#257179', // 7 - teal
29
+ '#29366f', // 8 - dark blue
30
+ '#3b5dc9', // 9 - blue
31
+ '#41a6f6', // 10 - sky blue
32
+ '#73eff7', // 11 - cyan
33
+ '#f4f4f4', // 12 - white
34
+ '#94b0c2', // 13 - light gray
35
+ '#566c86', // 14 - gray
36
+ '#333c57', // 15 - dark gray
37
+ ];
38
+ const TIC80_WIDTH = 240;
39
+ const TIC80_HEIGHT = 136;
40
+ /* ── Exporter Implementation ──────────────────────────────────── */
41
+ class Tic80Exporter extends PlatformExporter.PlatformExporter {
42
+ constructor() {
43
+ super(...arguments);
44
+ this.platformId = 'tic80';
45
+ this.platformInfo = {
46
+ id: 'tic80',
47
+ name: 'TIC-80',
48
+ description: 'TIC-80 tiny computer - Free and open-source fantasy console',
49
+ website: 'https://tic80.com/',
50
+ features: ['2d-rendering', 'pixel-graphics', 'audio', 'music', 'retro', 'multi-language'],
51
+ supportedAssets: ['sprite', 'tilemap', 'audio', 'music'],
52
+ exportFormats: ['.tic', '.lua', '.js', '.moon'],
53
+ };
54
+ }
55
+ async doExport(project, options) {
56
+ const platformOpts = options.platformOptions ?? {};
57
+ const language = platformOpts.language ?? 'lua';
58
+ // Generate code based on language
59
+ let code;
60
+ let extension;
61
+ switch (language) {
62
+ case 'javascript':
63
+ code = this.generateJavaScriptCode(project, options);
64
+ extension = 'js';
65
+ break;
66
+ case 'moonscript':
67
+ code = this.generateMoonscriptCode(project, options);
68
+ extension = 'moon';
69
+ break;
70
+ case 'wren':
71
+ code = this.generateWrenCode(project, options);
72
+ extension = 'wren';
73
+ break;
74
+ case 'lua':
75
+ default:
76
+ code = this.generateLuaCode(project, options);
77
+ extension = 'lua';
78
+ break;
79
+ }
80
+ // Generate TIC file (text format - can be loaded in TIC-80)
81
+ await this.generateTicFile(project, code, language, options);
82
+ // Generate standalone source file
83
+ const safeName = (options.projectName ?? project.name)
84
+ .toLowerCase()
85
+ .replace(/[^a-z0-9_]/g, '_');
86
+ this.addTextFile(`${safeName}.${extension}`, code);
87
+ // Generate README
88
+ await this.generateReadme(project, options);
89
+ }
90
+ /* ── TIC File Generation ────────────────────────────────────── */
91
+ async generateTicFile(project, code, language, options) {
92
+ const safeName = (options.projectName ?? project.name)
93
+ .toLowerCase()
94
+ .replace(/[^a-z0-9_]/g, '_');
95
+ const platformOpts = options.platformOptions ?? {};
96
+ // TIC-80 uses a specific text format for .tic files
97
+ let ticContent = '';
98
+ // Metadata
99
+ ticContent += `-- title: ${project.name}\n`;
100
+ ticContent += `-- author: Nice2Dev Export\n`;
101
+ ticContent += `-- desc: Generated from Nice2Dev v${project.version}\n`;
102
+ ticContent += `-- site: https://nice2dev.com\n`;
103
+ ticContent += `-- license: MIT\n`;
104
+ ticContent += `-- version: ${project.version}\n`;
105
+ ticContent += `-- script: ${language}\n`;
106
+ ticContent += '\n';
107
+ // Code section
108
+ ticContent += code;
109
+ ticContent += '\n';
110
+ // Sprites section (placeholder)
111
+ ticContent += this.generateSpritesSection(project);
112
+ ticContent += '\n';
113
+ // Map section
114
+ ticContent += this.generateMapSection(project);
115
+ ticContent += '\n';
116
+ // Waves section (sound waveforms)
117
+ ticContent += this.generateWavesSection(project, options);
118
+ ticContent += '\n';
119
+ // SFX section
120
+ if (platformOpts.sfxPlaceholders) {
121
+ ticContent += this.generateSfxSection(project);
122
+ ticContent += '\n';
123
+ }
124
+ // Music patterns
125
+ if (platformOpts.musicPatterns) {
126
+ ticContent += this.generateMusicSection(project);
127
+ ticContent += '\n';
128
+ }
129
+ // Palette section
130
+ ticContent += this.generatePaletteSection();
131
+ this.addTextFile(`${safeName}.tic`, ticContent);
132
+ }
133
+ /* ── Lua Code Generation ────────────────────────────────────── */
134
+ generateLuaCode(project, options) {
135
+ const platformOpts = options.platformOptions ?? {};
136
+ const lines = [];
137
+ // Game state
138
+ lines.push('-- Game State');
139
+ lines.push('local game = {');
140
+ lines.push(' t = 0,');
141
+ lines.push(' state = "play",');
142
+ lines.push(' cam = {x = 0, y = 0},');
143
+ lines.push(' entities = {},');
144
+ lines.push(` debug = ${platformOpts.includeDebug ?? false}`);
145
+ lines.push('}');
146
+ lines.push('');
147
+ // Constants
148
+ lines.push('-- Constants');
149
+ lines.push(`local SCREEN_W = ${TIC80_WIDTH}`);
150
+ lines.push(`local SCREEN_H = ${TIC80_HEIGHT}`);
151
+ lines.push('');
152
+ // Core functions
153
+ lines.push(this.generateLuaCoreFunctions(project, options));
154
+ // Entity system
155
+ lines.push(this.generateLuaEntitySystem());
156
+ // Entity definitions
157
+ lines.push(this.generateLuaEntityDefinitions(project));
158
+ // Scene management
159
+ lines.push(this.generateLuaSceneManagement(project));
160
+ // Utilities
161
+ lines.push(this.generateLuaUtilities(platformOpts.includeDebug ?? false));
162
+ return lines.join('\n');
163
+ }
164
+ generateLuaCoreFunctions(project, options) {
165
+ const bgColor = this.getClosestTic80Color(project.scenes[0]?.background ?? '#1a1c2c');
166
+ return `
167
+ -- Boot (called once)
168
+ function BOOT()
169
+ -- Initialize
170
+ trace("${project.name} v${project.version}")
171
+ load_scene(1)
172
+ end
173
+
174
+ -- TIC (main loop, 60fps)
175
+ function TIC()
176
+ game.t = game.t + 1
177
+
178
+ if game.state == "play" then
179
+ -- Update
180
+ update_entities()
181
+ check_collisions()
182
+ cleanup_dead()
183
+
184
+ -- Draw
185
+ cls(${bgColor})
186
+ draw_map()
187
+ draw_entities()
188
+ draw_ui()
189
+
190
+ if game.debug then
191
+ draw_debug()
192
+ end
193
+ end
194
+ end
195
+
196
+ -- Called when scanline is drawn (for effects)
197
+ function scanline(row)
198
+ -- Scanline effects here
199
+ end
200
+
201
+ -- Called before each line is drawn
202
+ function BDR(row)
203
+ -- Border effects
204
+ end
205
+
206
+ -- Override palette (called on startup)
207
+ function OVR()
208
+ -- Overlay/palette effects
209
+ end
210
+
211
+ -- Boot message
212
+ function MENU(index)
213
+ if index == 0 then
214
+ trace("Restart")
215
+ BOOT()
216
+ end
217
+ end
218
+ `;
219
+ }
220
+ generateLuaEntitySystem() {
221
+ return `
222
+ -- Entity System
223
+ local entity_mt = {}
224
+ entity_mt.__index = entity_mt
225
+
226
+ function make_entity(type_name, x, y, props)
227
+ local e = setmetatable({
228
+ type = type_name,
229
+ x = x or 0,
230
+ y = y or 0,
231
+ dx = 0,
232
+ dy = 0,
233
+ w = 8,
234
+ h = 8,
235
+ spr = 0,
236
+ flip = 0,
237
+ scale = 1,
238
+ anim = {frames = {0}, speed = 0.1, t = 0, i = 1},
239
+ dead = false,
240
+ solid = false,
241
+ tags = {},
242
+ }, entity_mt)
243
+
244
+ -- Apply custom properties
245
+ if props then
246
+ for k, v in pairs(props) do
247
+ e[k] = v
248
+ end
249
+ end
250
+
251
+ -- Apply type defaults
252
+ if entity_types[type_name] then
253
+ local def = entity_types[type_name]
254
+ for k, v in pairs(def) do
255
+ if type(v) ~= "function" then
256
+ e[k] = v
257
+ end
258
+ end
259
+ if def.init then
260
+ def.init(e)
261
+ end
262
+ end
263
+
264
+ table.insert(game.entities, e)
265
+ return e
266
+ end
267
+
268
+ function entity_mt:update()
269
+ -- Movement
270
+ self.x = self.x + self.dx
271
+ self.y = self.y + self.dy
272
+
273
+ -- Friction
274
+ self.dx = self.dx * 0.9
275
+ self.dy = self.dy * 0.9
276
+
277
+ -- Animation
278
+ if self.anim.speed > 0 then
279
+ self.anim.t = self.anim.t + self.anim.speed
280
+ if self.anim.t >= 1 then
281
+ self.anim.t = 0
282
+ self.anim.i = self.anim.i + 1
283
+ if self.anim.i > #self.anim.frames then
284
+ self.anim.i = 1
285
+ end
286
+ self.spr = self.anim.frames[self.anim.i]
287
+ end
288
+ end
289
+ end
290
+
291
+ function entity_mt:draw()
292
+ spr(self.spr, self.x - game.cam.x, self.y - game.cam.y, 0, self.scale, self.flip)
293
+ end
294
+
295
+ function entity_mt:has_tag(tag)
296
+ for _, t in ipairs(self.tags) do
297
+ if t == tag then return true end
298
+ end
299
+ return false
300
+ end
301
+
302
+ function entity_mt:kill()
303
+ self.dead = true
304
+ end
305
+
306
+ function update_entities()
307
+ for _, e in ipairs(game.entities) do
308
+ if not e.dead then
309
+ -- Call type-specific update
310
+ if entity_types[e.type] and entity_types[e.type].update then
311
+ entity_types[e.type].update(e)
312
+ else
313
+ e:update()
314
+ end
315
+ end
316
+ end
317
+ end
318
+
319
+ function draw_entities()
320
+ -- Sort by Y for proper layering
321
+ table.sort(game.entities, function(a, b) return a.y < b.y end)
322
+
323
+ for _, e in ipairs(game.entities) do
324
+ if not e.dead then
325
+ -- Call type-specific draw
326
+ if entity_types[e.type] and entity_types[e.type].draw then
327
+ entity_types[e.type].draw(e)
328
+ else
329
+ e:draw()
330
+ end
331
+ end
332
+ end
333
+ end
334
+
335
+ function cleanup_dead()
336
+ for i = #game.entities, 1, -1 do
337
+ if game.entities[i].dead then
338
+ table.remove(game.entities, i)
339
+ end
340
+ end
341
+ end
342
+
343
+ function check_collisions()
344
+ for i = 1, #game.entities do
345
+ local a = game.entities[i]
346
+ if not a.dead and a.solid then
347
+ for j = i + 1, #game.entities do
348
+ local b = game.entities[j]
349
+ if not b.dead and b.solid then
350
+ if collides(a, b) then
351
+ if entity_types[a.type] and entity_types[a.type].on_collision then
352
+ entity_types[a.type].on_collision(a, b)
353
+ end
354
+ if entity_types[b.type] and entity_types[b.type].on_collision then
355
+ entity_types[b.type].on_collision(b, a)
356
+ end
357
+ end
358
+ end
359
+ end
360
+ end
361
+ end
362
+ end
363
+
364
+ function collides(a, b)
365
+ return a.x < b.x + b.w and
366
+ a.x + a.w > b.x and
367
+ a.y < b.y + b.h and
368
+ a.y + a.h > b.y
369
+ end
370
+ `;
371
+ }
372
+ generateLuaEntityDefinitions(project) {
373
+ const lines = [];
374
+ lines.push('');
375
+ lines.push('-- Entity Type Definitions');
376
+ lines.push('entity_types = {}');
377
+ lines.push('');
378
+ // Gather all entity types
379
+ const entityTypes = new Map();
380
+ for (const prefab of project.prefabs) {
381
+ entityTypes.set(prefab.name.toLowerCase().replace(/[^a-z0-9_]/g, '_'), prefab.entity);
382
+ }
383
+ for (const scene of project.scenes) {
384
+ for (const entity of scene.entities) {
385
+ const typeName = (entity.name ?? entity.id).toLowerCase().replace(/[^a-z0-9_]/g, '_');
386
+ if (!entityTypes.has(typeName)) {
387
+ entityTypes.set(typeName, entity);
388
+ }
389
+ }
390
+ }
391
+ for (const [typeName, entity] of entityTypes) {
392
+ lines.push(this.entityTypeToLuaDef(typeName, entity));
393
+ }
394
+ return lines.join('\n');
395
+ }
396
+ entityTypeToLuaDef(typeName, entity) {
397
+ const tags = entity.tags ?? [];
398
+ const hasPhysics = entity.components.some((c) => c.type === 'rigidbody');
399
+ const sprIndex = this.getEntitySpriteIndex(entity);
400
+ const speed = this.getComponentProperty(entity, 'movement', 'speed', 50) / 50;
401
+ return `entity_types["${typeName}"] = {
402
+ spr = ${sprIndex},
403
+ w = 8,
404
+ h = 8,
405
+ solid = ${hasPhysics},
406
+ tags = {${tags.map((t) => `"${t}"`).join(', ')}},
407
+ speed = ${speed},
408
+ hp = ${this.getComponentProperty(entity, 'health', 'max', 3)},
409
+
410
+ init = function(self)
411
+ -- Custom initialization
412
+ end,
413
+
414
+ update = function(self)
415
+ -- Custom update logic
416
+ self:update()
417
+ end,
418
+
419
+ draw = function(self)
420
+ self:draw()
421
+ end,
422
+
423
+ on_collision = function(self, other)
424
+ -- Collision handling
425
+ end,
426
+ }
427
+
428
+ `;
429
+ }
430
+ getEntitySpriteIndex(entity) {
431
+ const name = (entity.name ?? 'entity').toLowerCase();
432
+ if (name.includes('player')) {
433
+ return 1;
434
+ }
435
+ if (name.includes('enemy')) {
436
+ return 17;
437
+ }
438
+ if (name.includes('item')) {
439
+ return 33;
440
+ }
441
+ if (name.includes('bullet')) {
442
+ return 49;
443
+ }
444
+ return 0;
445
+ }
446
+ getComponentProperty(entity, componentType, property, defaultValue) {
447
+ const comp = entity.components.find((c) => c.type === componentType);
448
+ if (comp && comp.properties && property in comp.properties) {
449
+ return comp.properties[property];
450
+ }
451
+ return defaultValue;
452
+ }
453
+ generateLuaSceneManagement(project) {
454
+ const lines = [];
455
+ lines.push('');
456
+ lines.push('-- Scenes');
457
+ lines.push('local scenes = {}');
458
+ lines.push('');
459
+ for (let i = 0; i < project.scenes.length; i++) {
460
+ const scene = project.scenes[i];
461
+ const sceneName = scene.name.toLowerCase().replace(/[^a-z0-9_]/g, '_');
462
+ lines.push(`scenes[${i + 1}] = {`);
463
+ lines.push(` name = "${sceneName}",`);
464
+ lines.push(` entities = {`);
465
+ for (const entity of scene.entities) {
466
+ const typeName = (entity.name ?? entity.id).toLowerCase().replace(/[^a-z0-9_]/g, '_');
467
+ const pos = entity.position ?? { x: 0, y: 0 };
468
+ // Scale position for TIC-80 (240x136)
469
+ const x = Math.floor((pos.x / project.settings.resolution.width) * TIC80_WIDTH);
470
+ const y = Math.floor((pos.y / project.settings.resolution.height) * TIC80_HEIGHT);
471
+ lines.push(` {type = "${typeName}", x = ${x}, y = ${y}},`);
472
+ }
473
+ lines.push(` }`);
474
+ lines.push(`}`);
475
+ lines.push('');
476
+ }
477
+ lines.push(`function load_scene(index)
478
+ game.entities = {}
479
+ local scene = scenes[index]
480
+ if scene then
481
+ for _, e in ipairs(scene.entities) do
482
+ make_entity(e.type, e.x, e.y)
483
+ end
484
+ trace("Loaded scene: " .. scene.name)
485
+ end
486
+ end
487
+ `);
488
+ return lines.join('\n');
489
+ }
490
+ generateLuaUtilities(includeDebug) {
491
+ let code = `
492
+ -- Utilities
493
+ function lerp(a, b, t)
494
+ return a + (b - a) * math.max(0, math.min(1, t))
495
+ end
496
+
497
+ function dist(x1, y1, x2, y2)
498
+ local dx = x2 - x1
499
+ local dy = y2 - y1
500
+ return math.sqrt(dx * dx + dy * dy)
501
+ end
502
+
503
+ function clamp(v, min, max)
504
+ return math.max(min, math.min(max, v))
505
+ end
506
+
507
+ function sign(v)
508
+ return v > 0 and 1 or v < 0 and -1 or 0
509
+ end
510
+
511
+ function draw_map()
512
+ map(0, 0, 30, 17, 0, 0, 0)
513
+ end
514
+
515
+ function draw_ui()
516
+ -- HUD
517
+ print("Nice2Dev", 2, 2, 12)
518
+ end
519
+
520
+ function spawn_particle(x, y, color)
521
+ make_entity("particle", x, y, {
522
+ spr = -1,
523
+ dx = math.random() * 2 - 1,
524
+ dy = math.random() * 2 - 1,
525
+ c = color,
526
+ life = 15 + math.random(10),
527
+ draw = function(self)
528
+ pix(self.x, self.y, self.c)
529
+ end,
530
+ update = function(self)
531
+ self.x = self.x + self.dx
532
+ self.y = self.y + self.dy
533
+ self.dy = self.dy + 0.1
534
+ self.life = self.life - 1
535
+ if self.life <= 0 then
536
+ self.dead = true
537
+ end
538
+ end,
539
+ })
540
+ end
541
+
542
+ -- Particle pseudo-type
543
+ entity_types["particle"] = {
544
+ spr = -1,
545
+ solid = false,
546
+ }
547
+ `;
548
+ if (includeDebug) {
549
+ code += `
550
+ function draw_debug()
551
+ local mem = pmem(0) or 0
552
+ local fps = 60
553
+
554
+ rect(0, 0, 80, 16, 0)
555
+ print("fps:" .. fps, 2, 2, 12)
556
+ print("ent:" .. #game.entities, 2, 9, 12)
557
+
558
+ -- Draw hitboxes
559
+ for _, e in ipairs(game.entities) do
560
+ if e.solid then
561
+ rectb(e.x - game.cam.x, e.y - game.cam.y, e.w, e.h, 2)
562
+ end
563
+ end
564
+ end
565
+ `;
566
+ }
567
+ else {
568
+ code += `
569
+ function draw_debug()
570
+ -- Debug disabled
571
+ end
572
+ `;
573
+ }
574
+ return code;
575
+ }
576
+ /* ── JavaScript Code Generation ─────────────────────────────── */
577
+ generateJavaScriptCode(project, options) {
578
+ const lines = [];
579
+ lines.push(`// ${project.name} - TIC-80 JavaScript`);
580
+ lines.push('// Generated from Nice2Dev');
581
+ lines.push('');
582
+ // Game state
583
+ lines.push('// Game State');
584
+ lines.push('var game = {');
585
+ lines.push(' t: 0,');
586
+ lines.push(' state: "play",');
587
+ lines.push(' cam: {x: 0, y: 0},');
588
+ lines.push(' entities: [],');
589
+ lines.push(` debug: ${options.platformOptions?.includeDebug ?? false}`);
590
+ lines.push('};');
591
+ lines.push('');
592
+ // Core functions
593
+ lines.push(`
594
+ // Boot
595
+ function BOOT() {
596
+ trace("${project.name} v${project.version}");
597
+ loadScene(1);
598
+ }
599
+
600
+ // Main loop
601
+ function TIC() {
602
+ game.t++;
603
+
604
+ if (game.state === "play") {
605
+ updateEntities();
606
+ checkCollisions();
607
+ cleanupDead();
608
+
609
+ cls(0);
610
+ drawMap();
611
+ drawEntities();
612
+ drawUI();
613
+
614
+ if (game.debug) {
615
+ drawDebug();
616
+ }
617
+ }
618
+ }
619
+
620
+ // Entity functions
621
+ function makeEntity(typeName, x, y, props) {
622
+ var e = {
623
+ type: typeName,
624
+ x: x || 0,
625
+ y: y || 0,
626
+ dx: 0,
627
+ dy: 0,
628
+ w: 8,
629
+ h: 8,
630
+ spr: 0,
631
+ flip: 0,
632
+ dead: false,
633
+ solid: false,
634
+ tags: []
635
+ };
636
+
637
+ // Apply type defaults
638
+ var def = entityTypes[typeName];
639
+ if (def) {
640
+ for (var k in def) {
641
+ if (typeof def[k] !== 'function') {
642
+ e[k] = def[k];
643
+ }
644
+ }
645
+ if (def.init) def.init(e);
646
+ }
647
+
648
+ // Apply custom props
649
+ if (props) {
650
+ for (var k in props) {
651
+ e[k] = props[k];
652
+ }
653
+ }
654
+
655
+ game.entities.push(e);
656
+ return e;
657
+ }
658
+
659
+ function updateEntities() {
660
+ game.entities.forEach(function(e) {
661
+ if (!e.dead) {
662
+ var def = entityTypes[e.type];
663
+ if (def && def.update) {
664
+ def.update(e);
665
+ } else {
666
+ // Default update
667
+ e.x += e.dx;
668
+ e.y += e.dy;
669
+ e.dx *= 0.9;
670
+ e.dy *= 0.9;
671
+ }
672
+ }
673
+ });
674
+ }
675
+
676
+ function drawEntities() {
677
+ // Sort by Y
678
+ game.entities.sort(function(a, b) { return a.y - b.y; });
679
+
680
+ game.entities.forEach(function(e) {
681
+ if (!e.dead) {
682
+ var def = entityTypes[e.type];
683
+ if (def && def.draw) {
684
+ def.draw(e);
685
+ } else {
686
+ spr(e.spr, e.x - game.cam.x, e.y - game.cam.y, 0, 1, e.flip);
687
+ }
688
+ }
689
+ });
690
+ }
691
+
692
+ function cleanupDead() {
693
+ game.entities = game.entities.filter(function(e) { return !e.dead; });
694
+ }
695
+
696
+ function checkCollisions() {
697
+ for (var i = 0; i < game.entities.length; i++) {
698
+ var a = game.entities[i];
699
+ if (!a.dead && a.solid) {
700
+ for (var j = i + 1; j < game.entities.length; j++) {
701
+ var b = game.entities[j];
702
+ if (!b.dead && b.solid && collides(a, b)) {
703
+ var defA = entityTypes[a.type];
704
+ var defB = entityTypes[b.type];
705
+ if (defA && defA.onCollision) defA.onCollision(a, b);
706
+ if (defB && defB.onCollision) defB.onCollision(b, a);
707
+ }
708
+ }
709
+ }
710
+ }
711
+ }
712
+
713
+ function collides(a, b) {
714
+ return a.x < b.x + b.w &&
715
+ a.x + a.w > b.x &&
716
+ a.y < b.y + b.h &&
717
+ a.y + a.h > b.y;
718
+ }
719
+
720
+ function drawMap() {
721
+ map(0, 0, 30, 17, 0, 0, 0);
722
+ }
723
+
724
+ function drawUI() {
725
+ print("Nice2Dev", 2, 2, 12);
726
+ }
727
+
728
+ function drawDebug() {
729
+ rect(0, 0, 80, 16, 0);
730
+ print("ent:" + game.entities.length, 2, 2, 12);
731
+ }
732
+ `);
733
+ // Entity types
734
+ lines.push('// Entity Types');
735
+ lines.push('var entityTypes = {};');
736
+ lines.push('');
737
+ // Scenes
738
+ lines.push('// Scenes');
739
+ lines.push('var scenes = [');
740
+ for (const scene of project.scenes) {
741
+ const sceneName = scene.name.toLowerCase().replace(/[^a-z0-9_]/g, '_');
742
+ lines.push(` {`);
743
+ lines.push(` name: "${sceneName}",`);
744
+ lines.push(` entities: [`);
745
+ for (const entity of scene.entities) {
746
+ const typeName = (entity.name ?? entity.id).toLowerCase().replace(/[^a-z0-9_]/g, '_');
747
+ const pos = entity.position ?? { x: 0, y: 0 };
748
+ const x = Math.floor((pos.x / project.settings.resolution.width) * TIC80_WIDTH);
749
+ const y = Math.floor((pos.y / project.settings.resolution.height) * TIC80_HEIGHT);
750
+ lines.push(` {type: "${typeName}", x: ${x}, y: ${y}},`);
751
+ }
752
+ lines.push(` ]`);
753
+ lines.push(` },`);
754
+ }
755
+ lines.push('];');
756
+ lines.push('');
757
+ lines.push(`
758
+ function loadScene(index) {
759
+ game.entities = [];
760
+ var scene = scenes[index - 1];
761
+ if (scene) {
762
+ scene.entities.forEach(function(e) {
763
+ makeEntity(e.type, e.x, e.y);
764
+ });
765
+ trace("Loaded scene: " + scene.name);
766
+ }
767
+ }
768
+ `);
769
+ return lines.join('\n');
770
+ }
771
+ /* ── Moonscript Code Generation ─────────────────────────────── */
772
+ generateMoonscriptCode(project, options) {
773
+ const lines = [];
774
+ lines.push(`-- ${project.name} - TIC-80 Moonscript`);
775
+ lines.push('-- Generated from Nice2Dev');
776
+ lines.push('');
777
+ lines.push(`
778
+ -- Game State
779
+ export game = {
780
+ t: 0
781
+ state: "play"
782
+ cam: {x: 0, y: 0}
783
+ entities: {}
784
+ debug: ${options.platformOptions?.includeDebug ?? false}
785
+ }
786
+
787
+ -- Constants
788
+ SCREEN_W = ${TIC80_WIDTH}
789
+ SCREEN_H = ${TIC80_HEIGHT}
790
+
791
+ -- Boot
792
+ export BOOT = ->
793
+ trace "${project.name} v${project.version}"
794
+ load_scene 1
795
+
796
+ -- Main Loop
797
+ export TIC = ->
798
+ game.t += 1
799
+
800
+ if game.state == "play"
801
+ update_entities!
802
+ check_collisions!
803
+ cleanup_dead!
804
+
805
+ cls 0
806
+ draw_map!
807
+ draw_entities!
808
+ draw_ui!
809
+
810
+ draw_debug! if game.debug
811
+
812
+ -- Entity System
813
+ entity_types = {}
814
+
815
+ make_entity = (type_name, x, y, props) ->
816
+ e = {
817
+ type: type_name
818
+ x: x or 0
819
+ y: y or 0
820
+ dx: 0
821
+ dy: 0
822
+ w: 8
823
+ h: 8
824
+ spr: 0
825
+ flip: 0
826
+ dead: false
827
+ solid: false
828
+ tags: {}
829
+ }
830
+
831
+ -- Apply type defaults
832
+ if entity_types[type_name]
833
+ def = entity_types[type_name]
834
+ for k, v in pairs def
835
+ e[k] = v if type(v) != "function"
836
+ def.init(e) if def.init
837
+
838
+ -- Apply props
839
+ if props
840
+ for k, v in pairs props
841
+ e[k] = v
842
+
843
+ table.insert game.entities, e
844
+ e
845
+
846
+ update_entities = ->
847
+ for e in *game.entities
848
+ unless e.dead
849
+ def = entity_types[e.type]
850
+ if def and def.update
851
+ def.update e
852
+ else
853
+ e.x += e.dx
854
+ e.y += e.dy
855
+ e.dx *= 0.9
856
+ e.dy *= 0.9
857
+
858
+ draw_entities = ->
859
+ table.sort game.entities, (a, b) -> a.y < b.y
860
+ for e in *game.entities
861
+ unless e.dead
862
+ def = entity_types[e.type]
863
+ if def and def.draw
864
+ def.draw e
865
+ else
866
+ spr e.spr, e.x - game.cam.x, e.y - game.cam.y, 0, 1, e.flip
867
+
868
+ cleanup_dead = ->
869
+ for i = #game.entities, 1, -1
870
+ table.remove game.entities, i if game.entities[i].dead
871
+
872
+ check_collisions = ->
873
+ for i = 1, #game.entities
874
+ a = game.entities[i]
875
+ if not a.dead and a.solid
876
+ for j = i + 1, #game.entities
877
+ b = game.entities[j]
878
+ if not b.dead and b.solid and collides(a, b)
879
+ def_a = entity_types[a.type]
880
+ def_b = entity_types[b.type]
881
+ def_a.on_collision(a, b) if def_a and def_a.on_collision
882
+ def_b.on_collision(b, a) if def_b and def_b.on_collision
883
+
884
+ collides = (a, b) ->
885
+ a.x < b.x + b.w and
886
+ a.x + a.w > b.x and
887
+ a.y < b.y + b.h and
888
+ a.y + a.h > b.y
889
+
890
+ -- Scenes
891
+ scenes = {
892
+ ${project.scenes
893
+ .map((scene, i) => {
894
+ const sceneName = scene.name.toLowerCase().replace(/[^a-z0-9_]/g, '_');
895
+ return ` {
896
+ name: "${sceneName}"
897
+ entities: {
898
+ ${scene.entities
899
+ .map((entity) => {
900
+ const typeName = (entity.name ?? entity.id).toLowerCase().replace(/[^a-z0-9_]/g, '_');
901
+ const pos = entity.position ?? { x: 0, y: 0 };
902
+ const x = Math.floor((pos.x / project.settings.resolution.width) * TIC80_WIDTH);
903
+ const y = Math.floor((pos.y / project.settings.resolution.height) * TIC80_HEIGHT);
904
+ return ` {type: "${typeName}", x: ${x}, y: ${y}}`;
905
+ })
906
+ .join('\n')}
907
+ }
908
+ }`;
909
+ })
910
+ .join('\n')}
911
+ }
912
+
913
+ load_scene = (index) ->
914
+ game.entities = {}
915
+ scene = scenes[index]
916
+ if scene
917
+ for e in *scene.entities
918
+ make_entity e.type, e.x, e.y
919
+ trace "Loaded scene: " .. scene.name
920
+
921
+ -- Utilities
922
+ draw_map = -> map 0, 0, 30, 17, 0, 0, 0
923
+ draw_ui = -> print "Nice2Dev", 2, 2, 12
924
+ draw_debug = ->
925
+ rect 0, 0, 80, 16, 0
926
+ print "ent:" .. #game.entities, 2, 2, 12
927
+ `);
928
+ return lines.join('\n');
929
+ }
930
+ /* ── Wren Code Generation ───────────────────────────────────── */
931
+ generateWrenCode(project, options) {
932
+ return `// ${project.name} - TIC-80 Wren
933
+ // Generated from Nice2Dev
934
+
935
+ class Game {
936
+ static t { __t }
937
+ static t=(v) { __t = v }
938
+ static state { __state }
939
+ static state=(v) { __state = v }
940
+ static entities { __entities }
941
+ static entities=(v) { __entities = v }
942
+
943
+ static init() {
944
+ __t = 0
945
+ __state = "play"
946
+ __entities = []
947
+ }
948
+ }
949
+
950
+ class TIC {
951
+ static BOOT() {
952
+ TIC.trace("${project.name} v${project.version}")
953
+ Game.init()
954
+ SceneManager.loadScene(1)
955
+ }
956
+
957
+ static TIC() {
958
+ Game.t = Game.t + 1
959
+
960
+ if (Game.state == "play") {
961
+ EntityManager.update()
962
+ EntityManager.draw()
963
+ UI.draw()
964
+ }
965
+ }
966
+ }
967
+
968
+ class EntityManager {
969
+ static update() {
970
+ for (entity in Game.entities) {
971
+ if (!entity.dead) {
972
+ entity.update()
973
+ }
974
+ }
975
+ // Cleanup dead
976
+ Game.entities = Game.entities.where { |e| !e.dead }.toList
977
+ }
978
+
979
+ static draw() {
980
+ Game.entities.sort { |a, b| a.y < b.y }
981
+ for (entity in Game.entities) {
982
+ if (!entity.dead) {
983
+ entity.draw()
984
+ }
985
+ }
986
+ }
987
+ }
988
+
989
+ class Entity {
990
+ x { _x }
991
+ x=(v) { _x = v }
992
+ y { _y }
993
+ y=(v) { _y = v }
994
+ dead { _dead }
995
+ dead=(v) { _dead = v }
996
+ spr { _spr }
997
+
998
+ construct new(x, y, spr) {
999
+ _x = x
1000
+ _y = y
1001
+ _spr = spr
1002
+ _dead = false
1003
+ }
1004
+
1005
+ update() {
1006
+ // Override in subclass
1007
+ }
1008
+
1009
+ draw() {
1010
+ TIC.spr(_spr, _x, _y)
1011
+ }
1012
+
1013
+ kill() {
1014
+ _dead = true
1015
+ }
1016
+ }
1017
+
1018
+ class SceneManager {
1019
+ static scenes { [
1020
+ ${project.scenes
1021
+ .map((scene) => {
1022
+ const sceneName = scene.name.toLowerCase().replace(/[^a-z0-9_]/g, '_');
1023
+ return ` Scene.new("${sceneName}", [
1024
+ ${scene.entities
1025
+ .map((entity) => {
1026
+ const pos = entity.position ?? { x: 0, y: 0 };
1027
+ const x = Math.floor((pos.x / project.settings.resolution.width) * TIC80_WIDTH);
1028
+ const y = Math.floor((pos.y / project.settings.resolution.height) * TIC80_HEIGHT);
1029
+ return ` [${x}, ${y}, 1]`;
1030
+ })
1031
+ .join(',\n')}
1032
+ ])`;
1033
+ })
1034
+ .join(',\n')}
1035
+ ] }
1036
+
1037
+ static loadScene(index) {
1038
+ Game.entities = []
1039
+ var scene = scenes[index - 1]
1040
+ if (scene != null) {
1041
+ for (data in scene.entities) {
1042
+ Game.entities.add(Entity.new(data[0], data[1], data[2]))
1043
+ }
1044
+ TIC.trace("Loaded: %(scene.name)")
1045
+ }
1046
+ }
1047
+ }
1048
+
1049
+ class Scene {
1050
+ name { _name }
1051
+ entities { _entities }
1052
+
1053
+ construct new(name, entities) {
1054
+ _name = name
1055
+ _entities = entities
1056
+ }
1057
+ }
1058
+
1059
+ class UI {
1060
+ static draw() {
1061
+ TIC.print("Nice2Dev", 2, 2, 12)
1062
+ }
1063
+ }
1064
+ `;
1065
+ }
1066
+ /* ── Data Sections ──────────────────────────────────────────── */
1067
+ generateSpritesSection(project) {
1068
+ // TIC-80 sprites: each line represents 8 pixels (1 byte = 2 pixels)
1069
+ // 256 sprites in 16x16 grid = 128x128 pixels
1070
+ const lines = [];
1071
+ lines.push('-- <TILES>');
1072
+ // Generate basic placeholder sprites
1073
+ for (let sprRow = 0; sprRow < 16; sprRow++) {
1074
+ for (let py = 0; py < 8; py++) {
1075
+ let line = '-- ';
1076
+ for (let sprCol = 0; sprCol < 16; sprCol++) {
1077
+ const sprIndex = sprRow * 16 + sprCol;
1078
+ for (let px = 0; px < 8; px++) {
1079
+ let pixel = 0;
1080
+ // Sprite 1: Player
1081
+ if (sprIndex === 1) {
1082
+ if (py >= 1 && py <= 6 && px >= 1 && px <= 6) {
1083
+ pixel =
1084
+ py === 2 && (px === 2 || px === 5)
1085
+ ? 9 // eyes
1086
+ : py === 4 && px >= 2 && px <= 5
1087
+ ? 2 // mouth
1088
+ : 4; // body
1089
+ }
1090
+ }
1091
+ // Sprite 17: Enemy
1092
+ else if (sprIndex === 17) {
1093
+ if (py >= 1 && py <= 6 && px >= 1 && px <= 6) {
1094
+ pixel = 2; // red
1095
+ if (py === 2 && (px === 2 || px === 5)) {
1096
+ pixel = 12;
1097
+ } // eyes
1098
+ }
1099
+ }
1100
+ // Sprite 33: Item
1101
+ else if (sprIndex === 33) {
1102
+ if (px >= 2 && px <= 5 && py >= 1 && py <= 6) {
1103
+ pixel = 4;
1104
+ } // yellow
1105
+ if (py >= 2 && py <= 5 && (px === 1 || px === 6)) {
1106
+ pixel = 4;
1107
+ }
1108
+ if (px >= 3 && px <= 4 && py >= 3 && py <= 4) {
1109
+ pixel = 3;
1110
+ } // orange center
1111
+ }
1112
+ line += pixel.toString(16);
1113
+ }
1114
+ }
1115
+ lines.push(line);
1116
+ }
1117
+ }
1118
+ lines.push('-- </TILES>');
1119
+ return lines.join('\n');
1120
+ }
1121
+ generateMapSection(project) {
1122
+ const lines = [];
1123
+ lines.push('-- <MAP>');
1124
+ // 240x136 / 8 = 30x17 tiles
1125
+ for (let y = 0; y < 136; y++) {
1126
+ let line = '-- ';
1127
+ for (let x = 0; x < 240; x++) {
1128
+ line += '0';
1129
+ }
1130
+ lines.push(line);
1131
+ }
1132
+ lines.push('-- </MAP>');
1133
+ return lines.join('\n');
1134
+ }
1135
+ generateWavesSection(project, options) {
1136
+ return `-- <WAVES>
1137
+ -- 000:00000000ffffffff00000000ffffffff
1138
+ -- 001:0123456789abcdeffedcba9876543210
1139
+ -- 002:0123456789abcdef0123456789abcdef
1140
+ -- 003:fedcba9876543210fedcba9876543210
1141
+ -- </WAVES>`;
1142
+ }
1143
+ generateSfxSection(project) {
1144
+ return `-- <SFX>
1145
+ -- 000:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000304000000000
1146
+ -- </SFX>`;
1147
+ }
1148
+ generateMusicSection(project) {
1149
+ return `-- <PATTERNS>
1150
+ -- 000:400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1151
+ -- </PATTERNS>
1152
+
1153
+ -- <TRACKS>
1154
+ -- 000:180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1155
+ -- </TRACKS>`;
1156
+ }
1157
+ generatePaletteSection() {
1158
+ return `-- <PALETTE>
1159
+ -- 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b764257179293 66f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57
1160
+ -- </PALETTE>`;
1161
+ }
1162
+ /* ── Color Utility ──────────────────────────────────────────── */
1163
+ getClosestTic80Color(hex) {
1164
+ const cleanHex = hex.replace('#', '').toLowerCase();
1165
+ const r = parseInt(cleanHex.substring(0, 2), 16);
1166
+ const g = parseInt(cleanHex.substring(2, 4), 16);
1167
+ const b = parseInt(cleanHex.substring(4, 6), 16);
1168
+ let closestIndex = 0;
1169
+ let closestDist = Infinity;
1170
+ for (let i = 0; i < TIC80_PALETTE.length; i++) {
1171
+ const palHex = TIC80_PALETTE[i].replace('#', '');
1172
+ const pr = parseInt(palHex.substring(0, 2), 16);
1173
+ const pg = parseInt(palHex.substring(2, 4), 16);
1174
+ const pb = parseInt(palHex.substring(4, 6), 16);
1175
+ const dist = Math.sqrt(Math.pow(r - pr, 2) + Math.pow(g - pg, 2) + Math.pow(b - pb, 2));
1176
+ if (dist < closestDist) {
1177
+ closestDist = dist;
1178
+ closestIndex = i;
1179
+ }
1180
+ }
1181
+ return closestIndex;
1182
+ }
1183
+ /* ── README ─────────────────────────────────────────────────── */
1184
+ async generateReadme(project, options) {
1185
+ const platformOpts = options.platformOptions ?? {};
1186
+ const language = platformOpts.language ?? 'lua';
1187
+ const safeName = (options.projectName ?? project.name)
1188
+ .toLowerCase()
1189
+ .replace(/[^a-z0-9_]/g, '_');
1190
+ const readme = `# ${project.name} - TIC-80 Export
1191
+
1192
+ Generated from Nice2Dev project v${project.version}
1193
+
1194
+ ## Requirements
1195
+
1196
+ - TIC-80 (Free: https://tic80.com/)
1197
+
1198
+ ## Installation
1199
+
1200
+ ### Method 1: Load TIC file
1201
+ 1. Open TIC-80
1202
+ 2. Type: \`load ${safeName}\`
1203
+ 3. Press F5 or type \`run\`
1204
+
1205
+ ### Method 2: Copy source
1206
+ 1. Open TIC-80
1207
+ 2. Press Escape to open code editor
1208
+ 3. Copy contents of \`${safeName}.${language === 'javascript' ? 'js' : language === 'moonscript' ? 'moon' : language === 'wren' ? 'wren' : 'lua'}\`
1209
+ 4. Paste into editor
1210
+ 5. Press F5 to run
1211
+
1212
+ ## Files
1213
+
1214
+ - \`${safeName}.tic\` - TIC-80 cartridge (includes sprites, map, sfx)
1215
+ - \`${safeName}.${language === 'javascript' ? 'js' : language === 'moonscript' ? 'moon' : language === 'wren' ? 'wren' : 'lua'}\` - Source code
1216
+
1217
+ ## TIC-80 Specs
1218
+
1219
+ - **Display**: 240x136 pixels
1220
+ - **Colors**: 16 color palette
1221
+ - **Sprites**: 256 8x8 sprites
1222
+ - **Map**: 240x136 tile map
1223
+ - **Sound**: 4 channels, 64 SFX
1224
+ - **Music**: 8 tracks, 64 patterns
1225
+ - **Languages**: Lua, Moonscript, JavaScript, Wren, Fennel, Squirrel
1226
+
1227
+ ## Controls
1228
+
1229
+ - Arrow Keys: D-Pad
1230
+ - Z / A / J: A button
1231
+ - X / S / K: B button
1232
+ - Enter: Start
1233
+ - Escape: Menu
1234
+
1235
+ ## Code Structure (${language})
1236
+
1237
+ ${language === 'lua'
1238
+ ? `\`\`\`lua
1239
+ function BOOT() -- Called once at startup
1240
+ function TIC() -- Called every frame (60 FPS)
1241
+ function BDR() -- Called before each scanline
1242
+ function OVR() -- Called after frame for overlays
1243
+ \`\`\`
1244
+ `
1245
+ : language === 'javascript'
1246
+ ? `\`\`\`javascript
1247
+ function BOOT() { } // Called once at startup
1248
+ function TIC() { } // Called every frame (60 FPS)
1249
+ function BDR() { } // Called before each scanline
1250
+ \`\`\`
1251
+ `
1252
+ : language === 'moonscript'
1253
+ ? `\`\`\`moonscript
1254
+ export BOOT = -> -- Called once at startup
1255
+ export TIC = -> -- Called every frame (60 FPS)
1256
+ export BDR = -> -- Called before each scanline
1257
+ \`\`\`
1258
+ `
1259
+ : `\`\`\`wren
1260
+ class TIC {
1261
+ static BOOT() { } // Called once at startup
1262
+ static TIC() { } // Called every frame (60 FPS)
1263
+ }
1264
+ \`\`\`
1265
+ `}
1266
+
1267
+ ## Scenes
1268
+
1269
+ ${project.scenes.map((s, i) => `- Scene ${i + 1}: ${s.name} (${s.entities.length} entities)`).join('\n')}
1270
+
1271
+ Load scene: \`load_scene(1)\`
1272
+
1273
+ ## Useful TIC-80 Functions
1274
+
1275
+ \`\`\`
1276
+ cls(color) - Clear screen
1277
+ spr(id, x, y) - Draw sprite
1278
+ map(x, y, w, h) - Draw map
1279
+ print(text, x, y, c) - Print text
1280
+ btn(id) - Check button
1281
+ sfx(id) - Play sound
1282
+ music(track) - Play music
1283
+ pix(x, y, c) - Draw pixel
1284
+ rect(x, y, w, h, c) - Draw rectangle
1285
+ trace(msg) - Debug print
1286
+ \`\`\`
1287
+
1288
+ ## Debug Mode
1289
+
1290
+ ${platformOpts.includeDebug ? 'Debug mode is enabled. Shows entity count and hitboxes.' : 'Debug mode is disabled. Set `game.debug = true` to enable.'}
1291
+
1292
+ ## Resources
1293
+
1294
+ - TIC-80 Wiki: https://github.com/nesbox/TIC-80/wiki
1295
+ - TIC-80 API: https://github.com/nesbox/TIC-80/wiki/API
1296
+ - TIC-80 Community: https://tic80.com/play
1297
+
1298
+ ## Export Formats
1299
+
1300
+ TIC-80 can export to:
1301
+ - HTML (Web)
1302
+ - Native executables
1303
+ - .tic cartridge
1304
+ `;
1305
+ this.addTextFile('README.md', readme);
1306
+ }
1307
+ }
1308
+ /* ── Factory ──────────────────────────────────────────────────── */
1309
+ function createTic80Exporter() {
1310
+ return new Tic80Exporter();
1311
+ }
1312
+
1313
+ exports.Tic80Exporter = Tic80Exporter;
1314
+ exports.createTic80Exporter = createTic80Exporter;
1315
+ //# sourceMappingURL=Tic80Exporter.js.map