@nice2dev/game-engine 1.0.4 → 1.0.10

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