@nice2dev/game-engine 0.1.0 → 1.0.3

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 (294) hide show
  1. package/CHANGELOG.md +193 -1
  2. package/dist/cjs/ai/BehaviorTree.js +1215 -0
  3. package/dist/cjs/ai/BehaviorTree.js.map +1 -0
  4. package/dist/cjs/ai/StateMachine.js +783 -0
  5. package/dist/cjs/ai/StateMachine.js.map +1 -0
  6. package/dist/cjs/audio/AudioBridge.js +454 -0
  7. package/dist/cjs/audio/AudioBridge.js.map +1 -0
  8. package/dist/cjs/devtools/GameplayAnalytics.js +651 -0
  9. package/dist/cjs/devtools/GameplayAnalytics.js.map +1 -0
  10. package/dist/cjs/dialogue/DialogueSystem.js +1023 -0
  11. package/dist/cjs/dialogue/DialogueSystem.js.map +1 -0
  12. package/dist/cjs/editor/NiceGameEditor.js +569 -71
  13. package/dist/cjs/editor/NiceGameEditor.js.map +1 -1
  14. package/dist/cjs/editor/ShaderGraph.js +1616 -0
  15. package/dist/cjs/editor/ShaderGraph.js.map +1 -0
  16. package/dist/cjs/editor/TimelineEditor.js +819 -0
  17. package/dist/cjs/editor/TimelineEditor.js.map +1 -0
  18. package/dist/cjs/engine/SaveSystemV2.js +494 -0
  19. package/dist/cjs/engine/SaveSystemV2.js.map +1 -0
  20. package/dist/cjs/export/GodotExporter.js +1102 -0
  21. package/dist/cjs/export/GodotExporter.js.map +1 -0
  22. package/dist/cjs/export/PlatformExporter.js +236 -0
  23. package/dist/cjs/export/PlatformExporter.js.map +1 -0
  24. package/dist/cjs/export/ThreeJSExporter.js +1116 -0
  25. package/dist/cjs/export/ThreeJSExporter.js.map +1 -0
  26. package/dist/cjs/export/UnityExporter.js +1193 -0
  27. package/dist/cjs/export/UnityExporter.js.map +1 -0
  28. package/dist/cjs/export/WebExporter.js +1036 -0
  29. package/dist/cjs/export/WebExporter.js.map +1 -0
  30. package/dist/cjs/export/index.js +58 -0
  31. package/dist/cjs/export/index.js.map +1 -0
  32. package/dist/cjs/i18n/useTranslation.js +11 -11
  33. package/dist/cjs/import/AsepriteImporter.js +761 -0
  34. package/dist/cjs/import/AsepriteImporter.js.map +1 -0
  35. package/dist/cjs/import/DragonBonesImporter.js +499 -0
  36. package/dist/cjs/import/DragonBonesImporter.js.map +1 -0
  37. package/dist/cjs/import/GameMakerImporter.js +559 -0
  38. package/dist/cjs/import/GameMakerImporter.js.map +1 -0
  39. package/dist/cjs/import/GodotSceneImporter.js +824 -0
  40. package/dist/cjs/import/GodotSceneImporter.js.map +1 -0
  41. package/dist/cjs/import/LDtkImporter.js +481 -0
  42. package/dist/cjs/import/LDtkImporter.js.map +1 -0
  43. package/dist/cjs/import/Live2DImporter.js +553 -0
  44. package/dist/cjs/import/Live2DImporter.js.map +1 -0
  45. package/dist/cjs/import/NdgFormat.js +499 -0
  46. package/dist/cjs/import/NdgFormat.js.map +1 -0
  47. package/dist/cjs/import/OgmoImporter.js +529 -0
  48. package/dist/cjs/import/OgmoImporter.js.map +1 -0
  49. package/dist/cjs/import/RPGMakerImporter.js +520 -0
  50. package/dist/cjs/import/RPGMakerImporter.js.map +1 -0
  51. package/dist/cjs/import/SceneImporter.js +449 -0
  52. package/dist/cjs/import/SceneImporter.js.map +1 -0
  53. package/dist/cjs/import/SpineImporter.js +583 -0
  54. package/dist/cjs/import/SpineImporter.js.map +1 -0
  55. package/dist/cjs/import/SpriterImporter.js +652 -0
  56. package/dist/cjs/import/SpriterImporter.js.map +1 -0
  57. package/dist/cjs/import/TiledMapImporter.js +859 -0
  58. package/dist/cjs/import/TiledMapImporter.js.map +1 -0
  59. package/dist/cjs/import/UnitySceneImporter.js +732 -0
  60. package/dist/cjs/import/UnitySceneImporter.js.map +1 -0
  61. package/dist/cjs/import/index.js +305 -0
  62. package/dist/cjs/import/index.js.map +1 -0
  63. package/dist/cjs/index.js +291 -1
  64. package/dist/cjs/index.js.map +1 -1
  65. package/dist/cjs/input/GamepadNavigation.js +21 -21
  66. package/dist/cjs/input/useGamepads.js +6 -6
  67. package/dist/cjs/integration/IconSprite.js +281 -0
  68. package/dist/cjs/integration/IconSprite.js.map +1 -0
  69. package/dist/cjs/inventory/InventorySystem.js +930 -0
  70. package/dist/cjs/inventory/InventorySystem.js.map +1 -0
  71. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
  72. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
  73. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
  74. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
  75. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
  76. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
  77. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
  78. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
  79. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
  80. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
  81. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
  82. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
  83. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
  84. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
  85. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
  86. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
  87. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
  88. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
  89. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
  90. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
  91. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
  92. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
  93. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
  94. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
  95. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
  96. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
  97. package/dist/cjs/quest/QuestSystem.js +924 -0
  98. package/dist/cjs/quest/QuestSystem.js.map +1 -0
  99. package/dist/cjs/rendering/WebGPURenderPipeline.js +658 -0
  100. package/dist/cjs/rendering/WebGPURenderPipeline.js.map +1 -0
  101. package/dist/cjs/scripting/GraphToAST.js +567 -0
  102. package/dist/cjs/scripting/GraphToAST.js.map +1 -0
  103. package/dist/cjs/scripting/LanguageExporter.js +321 -0
  104. package/dist/cjs/scripting/LanguageExporter.js.map +1 -0
  105. package/dist/cjs/scripting/ScriptAST.js +67 -0
  106. package/dist/cjs/scripting/ScriptAST.js.map +1 -0
  107. package/dist/cjs/scripting/VisualScripting2.js +1140 -0
  108. package/dist/cjs/scripting/VisualScripting2.js.map +1 -0
  109. package/dist/cjs/scripting/exporters/CSharpExporter.js +503 -0
  110. package/dist/cjs/scripting/exporters/CSharpExporter.js.map +1 -0
  111. package/dist/cjs/scripting/exporters/GDScriptExporter.js +452 -0
  112. package/dist/cjs/scripting/exporters/GDScriptExporter.js.map +1 -0
  113. package/dist/cjs/scripting/exporters/LuaExporter.js +457 -0
  114. package/dist/cjs/scripting/exporters/LuaExporter.js.map +1 -0
  115. package/dist/cjs/scripting/exporters/PythonExporter.js +565 -0
  116. package/dist/cjs/scripting/exporters/PythonExporter.js.map +1 -0
  117. package/dist/cjs/scripting/exporters/RustExporter.js +525 -0
  118. package/dist/cjs/scripting/exporters/RustExporter.js.map +1 -0
  119. package/dist/cjs/scripting/exporters/TypeScriptExporter.js +570 -0
  120. package/dist/cjs/scripting/exporters/TypeScriptExporter.js.map +1 -0
  121. package/dist/cjs/systems/ParticleSystem2.js +1478 -0
  122. package/dist/cjs/systems/ParticleSystem2.js.map +1 -0
  123. package/dist/cjs/xr/ARVR.js.map +1 -1
  124. package/dist/esm/ai/BehaviorTree.js +1186 -0
  125. package/dist/esm/ai/BehaviorTree.js.map +1 -0
  126. package/dist/esm/ai/StateMachine.js +767 -0
  127. package/dist/esm/ai/StateMachine.js.map +1 -0
  128. package/dist/esm/audio/AudioBridge.js +446 -0
  129. package/dist/esm/audio/AudioBridge.js.map +1 -0
  130. package/dist/esm/devtools/GameplayAnalytics.js +639 -0
  131. package/dist/esm/devtools/GameplayAnalytics.js.map +1 -0
  132. package/dist/esm/dialogue/DialogueSystem.js +1008 -0
  133. package/dist/esm/dialogue/DialogueSystem.js.map +1 -0
  134. package/dist/esm/editor/NiceGameEditor.js +556 -58
  135. package/dist/esm/editor/NiceGameEditor.js.map +1 -1
  136. package/dist/esm/editor/ShaderGraph.js +1606 -0
  137. package/dist/esm/editor/ShaderGraph.js.map +1 -0
  138. package/dist/esm/editor/TimelineEditor.js +800 -0
  139. package/dist/esm/editor/TimelineEditor.js.map +1 -0
  140. package/dist/esm/engine/SaveSystemV2.js +487 -0
  141. package/dist/esm/engine/SaveSystemV2.js.map +1 -0
  142. package/dist/esm/export/GodotExporter.js +1100 -0
  143. package/dist/esm/export/GodotExporter.js.map +1 -0
  144. package/dist/esm/export/PlatformExporter.js +230 -0
  145. package/dist/esm/export/PlatformExporter.js.map +1 -0
  146. package/dist/esm/export/ThreeJSExporter.js +1114 -0
  147. package/dist/esm/export/ThreeJSExporter.js.map +1 -0
  148. package/dist/esm/export/UnityExporter.js +1191 -0
  149. package/dist/esm/export/UnityExporter.js.map +1 -0
  150. package/dist/esm/export/WebExporter.js +1033 -0
  151. package/dist/esm/export/WebExporter.js.map +1 -0
  152. package/dist/esm/export/index.js +44 -0
  153. package/dist/esm/export/index.js.map +1 -0
  154. package/dist/esm/import/AsepriteImporter.js +759 -0
  155. package/dist/esm/import/AsepriteImporter.js.map +1 -0
  156. package/dist/esm/import/DragonBonesImporter.js +496 -0
  157. package/dist/esm/import/DragonBonesImporter.js.map +1 -0
  158. package/dist/esm/import/GameMakerImporter.js +556 -0
  159. package/dist/esm/import/GameMakerImporter.js.map +1 -0
  160. package/dist/esm/import/GodotSceneImporter.js +822 -0
  161. package/dist/esm/import/GodotSceneImporter.js.map +1 -0
  162. package/dist/esm/import/LDtkImporter.js +479 -0
  163. package/dist/esm/import/LDtkImporter.js.map +1 -0
  164. package/dist/esm/import/Live2DImporter.js +550 -0
  165. package/dist/esm/import/Live2DImporter.js.map +1 -0
  166. package/dist/esm/import/NdgFormat.js +490 -0
  167. package/dist/esm/import/NdgFormat.js.map +1 -0
  168. package/dist/esm/import/OgmoImporter.js +526 -0
  169. package/dist/esm/import/OgmoImporter.js.map +1 -0
  170. package/dist/esm/import/RPGMakerImporter.js +517 -0
  171. package/dist/esm/import/RPGMakerImporter.js.map +1 -0
  172. package/dist/esm/import/SceneImporter.js +441 -0
  173. package/dist/esm/import/SceneImporter.js.map +1 -0
  174. package/dist/esm/import/SpineImporter.js +580 -0
  175. package/dist/esm/import/SpineImporter.js.map +1 -0
  176. package/dist/esm/import/SpriterImporter.js +649 -0
  177. package/dist/esm/import/SpriterImporter.js.map +1 -0
  178. package/dist/esm/import/TiledMapImporter.js +857 -0
  179. package/dist/esm/import/TiledMapImporter.js.map +1 -0
  180. package/dist/esm/import/UnitySceneImporter.js +730 -0
  181. package/dist/esm/import/UnitySceneImporter.js.map +1 -0
  182. package/dist/esm/import/index.js +279 -0
  183. package/dist/esm/import/index.js.map +1 -0
  184. package/dist/esm/index.js +47 -3
  185. package/dist/esm/index.js.map +1 -1
  186. package/dist/esm/integration/IconSprite.js +266 -0
  187. package/dist/esm/integration/IconSprite.js.map +1 -0
  188. package/dist/esm/inventory/InventorySystem.js +924 -0
  189. package/dist/esm/inventory/InventorySystem.js.map +1 -0
  190. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
  191. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
  192. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
  193. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
  194. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
  195. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
  196. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
  197. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
  198. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
  199. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
  200. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
  201. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
  202. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
  203. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
  204. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
  205. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
  206. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
  207. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
  208. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
  209. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
  210. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
  211. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
  212. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
  213. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
  214. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
  215. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
  216. package/dist/esm/quest/QuestSystem.js +916 -0
  217. package/dist/esm/quest/QuestSystem.js.map +1 -0
  218. package/dist/esm/rendering/WebGPURenderPipeline.js +642 -0
  219. package/dist/esm/rendering/WebGPURenderPipeline.js.map +1 -0
  220. package/dist/esm/scripting/GraphToAST.js +564 -0
  221. package/dist/esm/scripting/GraphToAST.js.map +1 -0
  222. package/dist/esm/scripting/LanguageExporter.js +311 -0
  223. package/dist/esm/scripting/LanguageExporter.js.map +1 -0
  224. package/dist/esm/scripting/ScriptAST.js +52 -0
  225. package/dist/esm/scripting/ScriptAST.js.map +1 -0
  226. package/dist/esm/scripting/VisualScripting2.js +1130 -0
  227. package/dist/esm/scripting/VisualScripting2.js.map +1 -0
  228. package/dist/esm/scripting/exporters/CSharpExporter.js +501 -0
  229. package/dist/esm/scripting/exporters/CSharpExporter.js.map +1 -0
  230. package/dist/esm/scripting/exporters/GDScriptExporter.js +450 -0
  231. package/dist/esm/scripting/exporters/GDScriptExporter.js.map +1 -0
  232. package/dist/esm/scripting/exporters/LuaExporter.js +455 -0
  233. package/dist/esm/scripting/exporters/LuaExporter.js.map +1 -0
  234. package/dist/esm/scripting/exporters/PythonExporter.js +563 -0
  235. package/dist/esm/scripting/exporters/PythonExporter.js.map +1 -0
  236. package/dist/esm/scripting/exporters/RustExporter.js +523 -0
  237. package/dist/esm/scripting/exporters/RustExporter.js.map +1 -0
  238. package/dist/esm/scripting/exporters/TypeScriptExporter.js +568 -0
  239. package/dist/esm/scripting/exporters/TypeScriptExporter.js.map +1 -0
  240. package/dist/esm/systems/ParticleSystem2.js +1471 -0
  241. package/dist/esm/systems/ParticleSystem2.js.map +1 -0
  242. package/dist/esm/xr/ARVR.js.map +1 -1
  243. package/dist/types/__tests__/setup.d.ts +1 -1
  244. package/dist/types/ai/BehaviorTree.d.ts +375 -0
  245. package/dist/types/ai/StateMachine.d.ts +296 -0
  246. package/dist/types/audio/AudioBridge.d.ts +199 -0
  247. package/dist/types/devtools/GameplayAnalytics.d.ts +279 -0
  248. package/dist/types/dialogue/DialogueSystem.d.ts +326 -0
  249. package/dist/types/dialogue/index.d.ts +2 -0
  250. package/dist/types/editor/NiceGameEditor.d.ts +12 -1
  251. package/dist/types/editor/ShaderGraph.d.ts +207 -0
  252. package/dist/types/editor/TimelineEditor.d.ts +393 -0
  253. package/dist/types/engine/SaveSystemV2.d.ts +155 -0
  254. package/dist/types/export/GodotExporter.d.ts +56 -0
  255. package/dist/types/export/PlatformExporter.d.ts +201 -0
  256. package/dist/types/export/ThreeJSExporter.d.ts +40 -0
  257. package/dist/types/export/UnityExporter.d.ts +69 -0
  258. package/dist/types/export/WebExporter.d.ts +58 -0
  259. package/dist/types/export/index.d.ts +19 -0
  260. package/dist/types/import/AsepriteImporter.d.ts +46 -0
  261. package/dist/types/import/DragonBonesImporter.d.ts +331 -0
  262. package/dist/types/import/GameMakerImporter.d.ts +375 -0
  263. package/dist/types/import/GodotSceneImporter.d.ts +34 -0
  264. package/dist/types/import/LDtkImporter.d.ts +177 -0
  265. package/dist/types/import/Live2DImporter.d.ts +237 -0
  266. package/dist/types/import/NdgFormat.d.ts +387 -0
  267. package/dist/types/import/OgmoImporter.d.ts +237 -0
  268. package/dist/types/import/RPGMakerImporter.d.ts +186 -0
  269. package/dist/types/import/SceneImporter.d.ts +276 -0
  270. package/dist/types/import/SpineImporter.d.ts +372 -0
  271. package/dist/types/import/SpriterImporter.d.ts +230 -0
  272. package/dist/types/import/TiledMapImporter.d.ts +57 -0
  273. package/dist/types/import/UnitySceneImporter.d.ts +87 -0
  274. package/dist/types/import/index.d.ts +59 -0
  275. package/dist/types/index.d.ts +46 -18
  276. package/dist/types/integration/IconSprite.d.ts +196 -0
  277. package/dist/types/inventory/InventorySystem.d.ts +336 -0
  278. package/dist/types/performance/WebGPUCompute.d.ts +0 -10
  279. package/dist/types/quest/QuestSystem.d.ts +287 -0
  280. package/dist/types/rendering/WebGPURenderPipeline.d.ts +255 -0
  281. package/dist/types/scripting/GraphToAST.d.ts +55 -0
  282. package/dist/types/scripting/LanguageExporter.d.ts +136 -0
  283. package/dist/types/scripting/ScriptAST.d.ts +312 -0
  284. package/dist/types/scripting/VisualScripting2.d.ts +353 -0
  285. package/dist/types/scripting/exporters/CSharpExporter.d.ts +44 -0
  286. package/dist/types/scripting/exporters/GDScriptExporter.d.ts +46 -0
  287. package/dist/types/scripting/exporters/LuaExporter.d.ts +46 -0
  288. package/dist/types/scripting/exporters/PythonExporter.d.ts +49 -0
  289. package/dist/types/scripting/exporters/RustExporter.d.ts +46 -0
  290. package/dist/types/scripting/exporters/TypeScriptExporter.d.ts +48 -0
  291. package/dist/types/scripting/exporters/index.d.ts +8 -0
  292. package/dist/types/scripting/index.d.ts +11 -0
  293. package/dist/types/systems/ParticleSystem2.d.ts +646 -0
  294. package/package.json +7 -1
@@ -0,0 +1,1100 @@
1
+ import { PlatformExporter } from './PlatformExporter.js';
2
+ import { GDScriptExporter } from '../scripting/exporters/GDScriptExporter.js';
3
+ import { GraphToAST } from '../scripting/GraphToAST.js';
4
+
5
+ /* ────────────────────────────────────────────────────────────────
6
+ Godot Project Exporter
7
+
8
+ Exports Nice2Dev projects to Godot 4.x format.
9
+ Generates .tscn scenes, .tres resources, and .gd scripts.
10
+ ──────────────────────────────────────────────────────────────── */
11
+ /* ── Godot Exporter Class ─────────────────────────────────────── */
12
+ class GodotExporter extends PlatformExporter {
13
+ constructor() {
14
+ super(...arguments);
15
+ this.platformId = 'godot';
16
+ this.platformInfo = {
17
+ id: 'godot',
18
+ name: 'Godot Engine',
19
+ description: 'Free and open source game engine',
20
+ website: 'https://godotengine.org',
21
+ features: [
22
+ '2d-rendering',
23
+ '3d-rendering',
24
+ 'physics-2d',
25
+ 'physics-3d',
26
+ 'audio',
27
+ 'networking',
28
+ 'ui-system',
29
+ 'visual-scripting',
30
+ 'tilemaps',
31
+ 'particles',
32
+ 'animation',
33
+ ],
34
+ supportedAssets: [
35
+ 'sprite',
36
+ 'tileset',
37
+ 'audio',
38
+ 'font',
39
+ 'script',
40
+ 'scene',
41
+ 'prefab',
42
+ 'material',
43
+ 'shader',
44
+ 'animation',
45
+ 'tilemap',
46
+ 'particleSystem',
47
+ ],
48
+ exportFormats: ['.tscn', '.tres', '.gd', '.godot'],
49
+ };
50
+ this.gdscriptExporter = new GDScriptExporter();
51
+ this.graphToAST = new GraphToAST();
52
+ this.resourceIdCounter = 1;
53
+ this.uidCounter = 1;
54
+ }
55
+ async doExport(project, options) {
56
+ const godot = options.platformOptions;
57
+ const projectName = options.projectName || project.name;
58
+ // 1. Generate project.godot
59
+ this.exportProjectFile(project, projectName, godot);
60
+ // 2. Export scripts
61
+ await this.exportScripts(project, options, godot);
62
+ // 3. Export scenes (.tscn)
63
+ await this.exportScenes(project, options);
64
+ // 4. Export prefabs as packed scenes
65
+ await this.exportPrefabs(project, options);
66
+ // 5. Export resources (.tres)
67
+ await this.exportResources(project, options);
68
+ // 6. Export tilemaps and tilesets
69
+ await this.exportTilesets(project, options);
70
+ // 7. Generate autoload singletons
71
+ if ((godot === null || godot === void 0 ? void 0 : godot.includeAutoloads) !== false) {
72
+ this.exportAutoloads(project, projectName);
73
+ }
74
+ // 8. Export default_env.tres
75
+ this.exportEnvironment(project);
76
+ // 9. Generate import files for assets
77
+ this.exportAssetImports(project);
78
+ }
79
+ /* ── Project File ───────────────────────────────────────────── */
80
+ exportProjectFile(project, projectName, godot) {
81
+ var _a, _b, _c, _d, _e, _f;
82
+ const version = (godot === null || godot === void 0 ? void 0 : godot.godotVersion) || '4.2';
83
+ const renderer = (godot === null || godot === void 0 ? void 0 : godot.renderer) || 'forward_plus';
84
+ const content = `; Engine configuration file.
85
+ ; It's best edited using the editor UI and not directly,
86
+ ; since the parameters that go here are not all obvious.
87
+ ;
88
+ ; Format:
89
+ ; [section] ; section goes between []
90
+ ; param=value ; assign values to parameters
91
+
92
+ config_version=5
93
+
94
+ [application]
95
+
96
+ config/name="${project.name}"
97
+ config/description="${project.description || ''}"
98
+ config/version="${project.version}"
99
+ run/main_scene="res://scenes/${this.sanitizeName(((_a = project.scenes[0]) === null || _a === void 0 ? void 0 : _a.name) || 'main')}.tscn"
100
+ config/features=PackedStringArray("${version}", "Forward Plus")
101
+ config/icon="res://icon.svg"
102
+
103
+ [autoload]
104
+
105
+ GameManager="*res://scripts/autoload/GameManager.gd"
106
+ AudioManager="*res://scripts/autoload/AudioManager.gd"
107
+ EventBus="*res://scripts/autoload/EventBus.gd"
108
+
109
+ [display]
110
+
111
+ window/size/viewport_width=${project.settings.resolution.width}
112
+ window/size/viewport_height=${project.settings.resolution.height}
113
+ window/stretch/mode="canvas_items"
114
+ window/stretch/aspect="keep"
115
+
116
+ [input]
117
+
118
+ move_left={
119
+ "deadzone": 0.5,
120
+ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)]
121
+ }
122
+ move_right={
123
+ "deadzone": 0.5,
124
+ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)]
125
+ }
126
+ move_up={
127
+ "deadzone": 0.5,
128
+ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)]
129
+ }
130
+ move_down={
131
+ "deadzone": 0.5,
132
+ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)]
133
+ }
134
+ jump={
135
+ "deadzone": 0.5,
136
+ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null)]
137
+ }
138
+ action={
139
+ "deadzone": 0.5,
140
+ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null)]
141
+ }
142
+
143
+ [layer_names]
144
+
145
+ 2d_physics/layer_1="player"
146
+ 2d_physics/layer_2="enemies"
147
+ 2d_physics/layer_3="world"
148
+ 2d_physics/layer_4="projectiles"
149
+ 2d_physics/layer_5="pickups"
150
+
151
+ [physics]
152
+
153
+ 2d/default_gravity=${(_c = (_b = project.settings.physics) === null || _b === void 0 ? void 0 : _b.gravity.y) !== null && _c !== void 0 ? _c : 980}
154
+ 2d/default_gravity_vector=Vector2(${(_e = (_d = project.settings.physics) === null || _d === void 0 ? void 0 : _d.gravity.x) !== null && _e !== void 0 ? _e : 0}, 1)
155
+
156
+ [rendering]
157
+
158
+ renderer/rendering_method="${renderer}"
159
+ textures/canvas_textures/default_texture_filter=${((_f = project.settings.rendering) === null || _f === void 0 ? void 0 : _f.pixelArt) ? 0 : 1}
160
+ environment/defaults/default_clear_color=Color(${this.hexToGodotColor(project.settings.backgroundColor)})
161
+ `;
162
+ this.addTextFile('project.godot', content);
163
+ }
164
+ /* ── Scripts ────────────────────────────────────────────────── */
165
+ async exportScripts(project, options, godot) {
166
+ for (const script of project.scripts) {
167
+ try {
168
+ const ast = this.graphToAST.convert(script);
169
+ const result = this.gdscriptExporter.export(ast, {
170
+ includeDebugComments: options.debug,
171
+ });
172
+ for (const file of result.files) {
173
+ const path = `scripts/${file.path}`;
174
+ this.addTextFile(path, file.content);
175
+ }
176
+ }
177
+ catch (error) {
178
+ this.addWarning('SCRIPT_EXPORT_ERROR', `Failed to export script "${script.name}": ${error}`, 'Check visual script for errors');
179
+ }
180
+ }
181
+ }
182
+ /* ── Scenes ─────────────────────────────────────────────────── */
183
+ async exportScenes(project, options) {
184
+ for (const scene of project.scenes) {
185
+ const tscn = this.createSceneTSCN(scene, project);
186
+ const path = `scenes/${this.sanitizeName(scene.name)}.tscn`;
187
+ this.addTextFile(path, tscn);
188
+ }
189
+ }
190
+ createSceneTSCN(scene, project) {
191
+ var _a;
192
+ const resources = [];
193
+ const nodes = [];
194
+ // Root node
195
+ const rootNode = {
196
+ name: scene.name,
197
+ type: 'Node2D',
198
+ properties: {},
199
+ children: [],
200
+ };
201
+ // Process entities
202
+ for (const entity of scene.entities) {
203
+ const node = this.createGodotNode(entity, project, resources);
204
+ rootNode.children.push(node);
205
+ }
206
+ // Process tilemaps
207
+ for (const tilemap of (_a = scene.tilemaps) !== null && _a !== void 0 ? _a : []) {
208
+ const tilemapNode = this.createTilemapNode(tilemap, project, resources);
209
+ rootNode.children.push(tilemapNode);
210
+ }
211
+ nodes.push(rootNode);
212
+ return this.serializeTSCN(resources, nodes, scene.name);
213
+ }
214
+ createGodotNode(entity, project, resources) {
215
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
216
+ // Determine node type based on components
217
+ let nodeType = 'Node2D';
218
+ const properties = {};
219
+ // Check for specific node types
220
+ entity.components.some((c) => c.type === 'sprite');
221
+ const hasRigidbody = entity.components.some((c) => c.type === 'rigidbody-2d');
222
+ const hasCharacterBody = entity.components.some((c) => c.type === 'character-body-2d');
223
+ const hasArea = entity.components.some((c) => c.type === 'area-2d');
224
+ const isUI = entity.components.some((c) => c.type.startsWith('ui-'));
225
+ if (hasCharacterBody) {
226
+ nodeType = 'CharacterBody2D';
227
+ }
228
+ else if (hasRigidbody) {
229
+ nodeType = 'RigidBody2D';
230
+ }
231
+ else if (hasArea) {
232
+ nodeType = 'Area2D';
233
+ }
234
+ else if (isUI) {
235
+ nodeType = 'Control';
236
+ }
237
+ // Set transform
238
+ properties.position = `Vector2(${(_b = (_a = entity.position) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : 0}, ${(_d = (_c = entity.position) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 0})`;
239
+ properties.rotation = (_e = entity.rotation) !== null && _e !== void 0 ? _e : 0;
240
+ properties.scale = `Vector2(${(_g = (_f = entity.scale) === null || _f === void 0 ? void 0 : _f.x) !== null && _g !== void 0 ? _g : 1}, ${(_j = (_h = entity.scale) === null || _h === void 0 ? void 0 : _h.y) !== null && _j !== void 0 ? _j : 1})`;
241
+ const node = {
242
+ name: entity.name,
243
+ type: nodeType,
244
+ properties,
245
+ children: [],
246
+ };
247
+ // Add child nodes for components
248
+ for (const component of entity.components) {
249
+ const childNode = this.createComponentNode(component, entity, project, resources);
250
+ if (childNode) {
251
+ node.children.push(childNode);
252
+ }
253
+ }
254
+ // Add script if present
255
+ if (entity.scriptId) {
256
+ const script = project.scripts.find((s) => s.id === entity.scriptId);
257
+ if (script) {
258
+ properties.script = `ExtResource("${this.addScriptResource(script, resources)}")`;
259
+ }
260
+ }
261
+ // Process children entities
262
+ if (entity.children) {
263
+ for (const child of entity.children) {
264
+ const childNode = this.createGodotNode(child, project, resources);
265
+ node.children.push(childNode);
266
+ }
267
+ }
268
+ // Handle prefab instances
269
+ if (entity.prefabId) {
270
+ const prefab = project.prefabs.find((p) => p.id === entity.prefabId);
271
+ if (prefab) {
272
+ return {
273
+ name: entity.name,
274
+ type: 'Node2D',
275
+ instance: `res://prefabs/${this.sanitizeName(prefab.name)}.tscn`,
276
+ properties: {
277
+ position: `Vector2(${(_l = (_k = entity.position) === null || _k === void 0 ? void 0 : _k.x) !== null && _l !== void 0 ? _l : 0}, ${(_o = (_m = entity.position) === null || _m === void 0 ? void 0 : _m.y) !== null && _o !== void 0 ? _o : 0})`,
278
+ },
279
+ };
280
+ }
281
+ }
282
+ return node;
283
+ }
284
+ createComponentNode(component, entity, project, resources) {
285
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5;
286
+ const props = (_a = component.properties) !== null && _a !== void 0 ? _a : {};
287
+ switch (component.type) {
288
+ case 'sprite': {
289
+ const spriteId = props.spriteId;
290
+ const sprite = project.assets.find((a) => a.id === spriteId);
291
+ const textureResId = sprite ? this.addTextureResource(sprite, resources) : null;
292
+ return {
293
+ name: 'Sprite2D',
294
+ type: 'Sprite2D',
295
+ properties: {
296
+ texture: textureResId ? `ExtResource("${textureResId}")` : 'null',
297
+ flip_h: props.flipX || false,
298
+ flip_v: props.flipY || false,
299
+ modulate: props.color
300
+ ? `Color(${this.hexToGodotColor(props.color)})`
301
+ : undefined,
302
+ },
303
+ };
304
+ }
305
+ case 'animated-sprite': {
306
+ return {
307
+ name: 'AnimatedSprite2D',
308
+ type: 'AnimatedSprite2D',
309
+ properties: {
310
+ autoplay: props.autoplay,
311
+ frame: (_b = props.frame) !== null && _b !== void 0 ? _b : 0,
312
+ speed_scale: (_c = props.speedScale) !== null && _c !== void 0 ? _c : 1,
313
+ },
314
+ };
315
+ }
316
+ case 'box-collider-2d': {
317
+ const shapeId = this.nextResourceId();
318
+ resources.push({
319
+ type: 'RectangleShape2D',
320
+ id: shapeId,
321
+ properties: {
322
+ size: `Vector2(${(_d = props.width) !== null && _d !== void 0 ? _d : 32}, ${(_e = props.height) !== null && _e !== void 0 ? _e : 32})`,
323
+ },
324
+ });
325
+ return {
326
+ name: 'CollisionShape2D',
327
+ type: 'CollisionShape2D',
328
+ properties: {
329
+ shape: `SubResource("${shapeId}")`,
330
+ position: `Vector2(${(_f = props.offsetX) !== null && _f !== void 0 ? _f : 0}, ${(_g = props.offsetY) !== null && _g !== void 0 ? _g : 0})`,
331
+ disabled: props.disabled || false,
332
+ },
333
+ };
334
+ }
335
+ case 'circle-collider-2d': {
336
+ const shapeId = this.nextResourceId();
337
+ resources.push({
338
+ type: 'CircleShape2D',
339
+ id: shapeId,
340
+ properties: {
341
+ radius: (_h = props.radius) !== null && _h !== void 0 ? _h : 16,
342
+ },
343
+ });
344
+ return {
345
+ name: 'CollisionShape2D',
346
+ type: 'CollisionShape2D',
347
+ properties: {
348
+ shape: `SubResource("${shapeId}")`,
349
+ position: `Vector2(${(_j = props.offsetX) !== null && _j !== void 0 ? _j : 0}, ${(_k = props.offsetY) !== null && _k !== void 0 ? _k : 0})`,
350
+ },
351
+ };
352
+ }
353
+ case 'capsule-collider-2d': {
354
+ const shapeId = this.nextResourceId();
355
+ resources.push({
356
+ type: 'CapsuleShape2D',
357
+ id: shapeId,
358
+ properties: {
359
+ radius: (_l = props.radius) !== null && _l !== void 0 ? _l : 16,
360
+ height: (_m = props.height) !== null && _m !== void 0 ? _m : 64,
361
+ },
362
+ });
363
+ return {
364
+ name: 'CollisionShape2D',
365
+ type: 'CollisionShape2D',
366
+ properties: {
367
+ shape: `SubResource("${shapeId}")`,
368
+ },
369
+ };
370
+ }
371
+ case 'audio-source': {
372
+ const clipId = props.clipId;
373
+ const clip = project.assets.find((a) => a.id === clipId);
374
+ const audioResId = clip ? this.addAudioResource(clip, resources) : null;
375
+ return {
376
+ name: 'AudioStreamPlayer2D',
377
+ type: props.is3D ? 'AudioStreamPlayer3D' : 'AudioStreamPlayer2D',
378
+ properties: {
379
+ stream: audioResId ? `ExtResource("${audioResId}")` : 'null',
380
+ autoplay: props.playOnAwake || false,
381
+ volume_db: props.volume !== undefined ? this.linearToDb(props.volume) : 0,
382
+ pitch_scale: (_o = props.pitch) !== null && _o !== void 0 ? _o : 1,
383
+ max_distance: (_p = props.maxDistance) !== null && _p !== void 0 ? _p : 2000,
384
+ },
385
+ };
386
+ }
387
+ case 'particle-system': {
388
+ return {
389
+ name: 'GPUParticles2D',
390
+ type: 'GPUParticles2D',
391
+ properties: {
392
+ emitting: props.playOnAwake !== false,
393
+ amount: (_q = props.maxParticles) !== null && _q !== void 0 ? _q : 100,
394
+ lifetime: (_r = props.duration) !== null && _r !== void 0 ? _r : 1,
395
+ one_shot: !props.looping,
396
+ preprocess: props.prewarm ? ((_s = props.duration) !== null && _s !== void 0 ? _s : 1) : 0,
397
+ speed_scale: (_t = props.speedScale) !== null && _t !== void 0 ? _t : 1,
398
+ },
399
+ };
400
+ }
401
+ case 'camera': {
402
+ return {
403
+ name: 'Camera2D',
404
+ type: 'Camera2D',
405
+ properties: {
406
+ current: props.isMain || false,
407
+ zoom: `Vector2(${(_u = props.zoom) !== null && _u !== void 0 ? _u : 1}, ${(_v = props.zoom) !== null && _v !== void 0 ? _v : 1})`,
408
+ position_smoothing_enabled: props.smoothing || false,
409
+ position_smoothing_speed: (_w = props.smoothingSpeed) !== null && _w !== void 0 ? _w : 5,
410
+ drag_horizontal_enabled: props.dragEnabled || false,
411
+ drag_vertical_enabled: props.dragEnabled || false,
412
+ },
413
+ };
414
+ }
415
+ case 'ui-text': {
416
+ return {
417
+ name: 'Label',
418
+ type: 'Label',
419
+ properties: {
420
+ text: (_x = props.text) !== null && _x !== void 0 ? _x : '',
421
+ horizontal_alignment: this.getHorizontalAlignment(props.alignment),
422
+ vertical_alignment: this.getVerticalAlignment(props.alignment),
423
+ },
424
+ };
425
+ }
426
+ case 'ui-button': {
427
+ return {
428
+ name: 'Button',
429
+ type: 'Button',
430
+ properties: {
431
+ text: (_y = props.text) !== null && _y !== void 0 ? _y : 'Button',
432
+ disabled: props.disabled || false,
433
+ },
434
+ };
435
+ }
436
+ case 'ui-image': {
437
+ const spriteId = props.spriteId;
438
+ const sprite = project.assets.find((a) => a.id === spriteId);
439
+ const textureResId = sprite ? this.addTextureResource(sprite, resources) : null;
440
+ return {
441
+ name: 'TextureRect',
442
+ type: 'TextureRect',
443
+ properties: {
444
+ texture: textureResId ? `ExtResource("${textureResId}")` : 'null',
445
+ expand_mode: 1, // ExpandMode.IGNORE_SIZE
446
+ stretch_mode: 5, // StretchMode.KEEP_ASPECT_CENTERED
447
+ },
448
+ };
449
+ }
450
+ case 'raycast': {
451
+ return {
452
+ name: 'RayCast2D',
453
+ type: 'RayCast2D',
454
+ properties: {
455
+ enabled: true,
456
+ target_position: `Vector2(${(_0 = (_z = props.direction) === null || _z === void 0 ? void 0 : _z.x) !== null && _0 !== void 0 ? _0 : 0}, ${(_2 = (_1 = props.direction) === null || _1 === void 0 ? void 0 : _1.y) !== null && _2 !== void 0 ? _2 : 50})`,
457
+ collision_mask: (_3 = props.collisionMask) !== null && _3 !== void 0 ? _3 : 1,
458
+ },
459
+ };
460
+ }
461
+ case 'light-2d': {
462
+ return {
463
+ name: 'PointLight2D',
464
+ type: 'PointLight2D',
465
+ properties: {
466
+ enabled: props.enabled !== false,
467
+ color: props.color
468
+ ? `Color(${this.hexToGodotColor(props.color)})`
469
+ : 'Color(1, 1, 1, 1)',
470
+ energy: (_4 = props.intensity) !== null && _4 !== void 0 ? _4 : 1,
471
+ texture_scale: (_5 = props.range) !== null && _5 !== void 0 ? _5 : 1,
472
+ },
473
+ };
474
+ }
475
+ default:
476
+ // Skip unknown components
477
+ return null;
478
+ }
479
+ }
480
+ /* ── Tilemaps ───────────────────────────────────────────────── */
481
+ createTilemapNode(tilemap, project, resources) {
482
+ const tilesetAsset = project.assets.find((a) => a.id === tilemap.tilesetId);
483
+ const tilesetResId = tilesetAsset
484
+ ? this.addTileSetResource(tilesetAsset, tilemap, resources)
485
+ : null;
486
+ return {
487
+ name: tilemap.name,
488
+ type: 'TileMap',
489
+ properties: {
490
+ tile_set: tilesetResId ? `ExtResource("${tilesetResId}")` : 'null',
491
+ cell_quadrant_size: tilemap.tileSize,
492
+ },
493
+ children: tilemap.layers.map((layer, index) => ({
494
+ name: layer.name,
495
+ type: 'TileMapLayer',
496
+ properties: {
497
+ visible: layer.visible,
498
+ modulate: `Color(1, 1, 1, ${layer.opacity})`,
499
+ z_index: index,
500
+ },
501
+ })),
502
+ };
503
+ }
504
+ /* ── Prefabs ────────────────────────────────────────────────── */
505
+ async exportPrefabs(project, options) {
506
+ for (const prefab of project.prefabs) {
507
+ const tscn = this.createPrefabTSCN(prefab, project);
508
+ const path = `prefabs/${this.sanitizeName(prefab.name)}.tscn`;
509
+ this.addTextFile(path, tscn);
510
+ }
511
+ }
512
+ createPrefabTSCN(prefab, project) {
513
+ const resources = [];
514
+ const rootNode = this.createGodotNode(prefab.entity, project, resources);
515
+ rootNode.name = prefab.name;
516
+ return this.serializeTSCN(resources, [rootNode], prefab.name);
517
+ }
518
+ /* ── Resources ──────────────────────────────────────────────── */
519
+ async exportResources(project, options) {
520
+ // Export materials as ShaderMaterial resources
521
+ const materials = project.assets.filter((a) => a.type === 'material');
522
+ for (const material of materials) {
523
+ const tres = this.createMaterialTRES(material);
524
+ const path = `resources/materials/${this.sanitizeName(material.name)}.tres`;
525
+ this.addTextFile(path, tres);
526
+ }
527
+ // Export animations as AnimationLibrary
528
+ const animations = project.assets.filter((a) => a.type === 'animation');
529
+ if (animations.length > 0) {
530
+ const animLib = this.createAnimationLibrary(animations);
531
+ this.addTextFile('resources/animations/animation_library.tres', animLib);
532
+ }
533
+ }
534
+ createMaterialTRES(material) {
535
+ var _a, _b;
536
+ const color = (_b = (_a = material.metadata) === null || _a === void 0 ? void 0 : _a.color) !== null && _b !== void 0 ? _b : '#ffffff';
537
+ return `[gd_resource type="ShaderMaterial" format=3]
538
+
539
+ [resource]
540
+ shader = null
541
+ shader_parameter/color = Color(${this.hexToGodotColor(color)})
542
+ `;
543
+ }
544
+ createAnimationLibrary(animations) {
545
+ var _a, _b, _c;
546
+ let content = `[gd_resource type="AnimationLibrary" format=3]
547
+
548
+ `;
549
+ for (const anim of animations) {
550
+ const frameRate = (_b = (_a = anim.metadata) === null || _a === void 0 ? void 0 : _a.frameRate) !== null && _b !== void 0 ? _b : 12;
551
+ content += `[sub_resource type="Animation" id="${this.nextResourceId()}"]
552
+ resource_name = "${anim.name}"
553
+ length = ${((_c = anim.metadata) === null || _c === void 0 ? void 0 : _c.length) || 1.0}
554
+ step = ${1 / frameRate}
555
+
556
+ `;
557
+ }
558
+ content += `[resource]
559
+ _data = {
560
+ `;
561
+ for (const anim of animations) {
562
+ content += `"${anim.name}": SubResource("${this.resourceIdCounter - animations.length + animations.indexOf(anim)}"),
563
+ `;
564
+ }
565
+ content += `}`;
566
+ return content;
567
+ }
568
+ /* ── Tilesets ───────────────────────────────────────────────── */
569
+ async exportTilesets(project, options) {
570
+ const tilesets = project.assets.filter((a) => a.type === 'tileset');
571
+ for (const tileset of tilesets) {
572
+ const tres = this.createTileSetTRES(tileset);
573
+ const path = `resources/tilesets/${this.sanitizeName(tileset.name)}.tres`;
574
+ this.addTextFile(path, tres);
575
+ }
576
+ }
577
+ createTileSetTRES(tileset) {
578
+ var _a, _b, _c, _d;
579
+ const tileSize = (_b = (_a = tileset.metadata) === null || _a === void 0 ? void 0 : _a.tileSize) !== null && _b !== void 0 ? _b : 16;
580
+ (_d = (_c = tileset.metadata) === null || _c === void 0 ? void 0 : _c.columns) !== null && _d !== void 0 ? _d : 8;
581
+ return `[gd_resource type="TileSet" load_steps=2 format=3 uid="uid://${this.nextUID()}"]
582
+
583
+ [ext_resource type="Texture2D" path="res://assets/tilesets/${tileset.name}" id="1"]
584
+
585
+ [resource]
586
+ tile_shape = 0
587
+ tile_size = Vector2i(${tileSize}, ${tileSize})
588
+ sources/0/texture = ExtResource("1")
589
+ sources/0/texture_region_size = Vector2i(${tileSize}, ${tileSize})
590
+ `;
591
+ }
592
+ /* ── Autoloads ──────────────────────────────────────────────── */
593
+ exportAutoloads(project, projectName) {
594
+ // GameManager autoload
595
+ const gameManager = `extends Node
596
+ class_name GameManager
597
+
598
+ ## Game Manager singleton for Nice2Dev exported project.
599
+ ## Handles global game state and entity registry.
600
+
601
+ signal game_started
602
+ signal game_paused
603
+ signal game_resumed
604
+ signal game_over
605
+
606
+ var entities: Dictionary = {}
607
+ var is_paused: bool = false
608
+ var score: int = 0
609
+ var level: int = 1
610
+
611
+ func _ready() -> void:
612
+ process_mode = Node.PROCESS_MODE_ALWAYS
613
+
614
+ func register_entity(id: String, entity: Node) -> void:
615
+ entities[id] = entity
616
+
617
+ func unregister_entity(id: String) -> void:
618
+ entities.erase(id)
619
+
620
+ func get_entity(id: String) -> Node:
621
+ return entities.get(id)
622
+
623
+ func pause_game() -> void:
624
+ if not is_paused:
625
+ is_paused = true
626
+ get_tree().paused = true
627
+ game_paused.emit()
628
+
629
+ func resume_game() -> void:
630
+ if is_paused:
631
+ is_paused = false
632
+ get_tree().paused = false
633
+ game_resumed.emit()
634
+
635
+ func toggle_pause() -> void:
636
+ if is_paused:
637
+ resume_game()
638
+ else:
639
+ pause_game()
640
+
641
+ func start_game() -> void:
642
+ score = 0
643
+ level = 1
644
+ is_paused = false
645
+ get_tree().paused = false
646
+ game_started.emit()
647
+
648
+ func end_game() -> void:
649
+ game_over.emit()
650
+
651
+ func add_score(amount: int) -> void:
652
+ score += amount
653
+
654
+ func next_level() -> void:
655
+ level += 1
656
+ `;
657
+ this.addTextFile('scripts/autoload/GameManager.gd', gameManager);
658
+ // AudioManager autoload
659
+ const audioManager = `extends Node
660
+ class_name AudioManager
661
+
662
+ ## Audio Manager singleton for Nice2Dev exported project.
663
+ ## Handles music and sound effect playback.
664
+
665
+ var music_player: AudioStreamPlayer
666
+ var sfx_players: Array[AudioStreamPlayer] = []
667
+ var music_volume: float = 1.0
668
+ var sfx_volume: float = 1.0
669
+ var master_volume: float = 1.0
670
+
671
+ const MAX_SFX_PLAYERS = 8
672
+
673
+ func _ready() -> void:
674
+ music_player = AudioStreamPlayer.new()
675
+ music_player.bus = "Music"
676
+ add_child(music_player)
677
+
678
+ for i in MAX_SFX_PLAYERS:
679
+ var player = AudioStreamPlayer.new()
680
+ player.bus = "SFX"
681
+ add_child(player)
682
+ sfx_players.append(player)
683
+
684
+ func play_music(stream: AudioStream, fade_in: float = 0.5) -> void:
685
+ if music_player.playing:
686
+ var tween = create_tween()
687
+ tween.tween_property(music_player, "volume_db", -80.0, fade_in)
688
+ await tween.finished
689
+
690
+ music_player.stream = stream
691
+ music_player.volume_db = linear_to_db(music_volume * master_volume)
692
+ music_player.play()
693
+
694
+ func stop_music(fade_out: float = 0.5) -> void:
695
+ if music_player.playing:
696
+ var tween = create_tween()
697
+ tween.tween_property(music_player, "volume_db", -80.0, fade_out)
698
+ await tween.finished
699
+ music_player.stop()
700
+
701
+ func play_sfx(stream: AudioStream, volume: float = 1.0, pitch: float = 1.0) -> void:
702
+ var player = _get_available_sfx_player()
703
+ if player:
704
+ player.stream = stream
705
+ player.volume_db = linear_to_db(volume * sfx_volume * master_volume)
706
+ player.pitch_scale = pitch
707
+ player.play()
708
+
709
+ func _get_available_sfx_player() -> AudioStreamPlayer:
710
+ for player in sfx_players:
711
+ if not player.playing:
712
+ return player
713
+ return sfx_players[0] # Fallback to first
714
+
715
+ func set_master_volume(volume: float) -> void:
716
+ master_volume = clamp(volume, 0.0, 1.0)
717
+ _update_volumes()
718
+
719
+ func set_music_volume(volume: float) -> void:
720
+ music_volume = clamp(volume, 0.0, 1.0)
721
+ _update_volumes()
722
+
723
+ func set_sfx_volume(volume: float) -> void:
724
+ sfx_volume = clamp(volume, 0.0, 1.0)
725
+
726
+ func _update_volumes() -> void:
727
+ music_player.volume_db = linear_to_db(music_volume * master_volume)
728
+ `;
729
+ this.addTextFile('scripts/autoload/AudioManager.gd', audioManager);
730
+ // EventBus autoload
731
+ const eventBus = `extends Node
732
+ class_name EventBus
733
+
734
+ ## Event Bus singleton for Nice2Dev exported project.
735
+ ## Provides global event communication between nodes.
736
+
737
+ # Gameplay events
738
+ signal player_spawned(player: Node)
739
+ signal player_died(player: Node)
740
+ signal enemy_spawned(enemy: Node)
741
+ signal enemy_died(enemy: Node)
742
+ signal item_collected(item: Node, collector: Node)
743
+ signal damage_dealt(target: Node, amount: float, source: Node)
744
+
745
+ # UI events
746
+ signal ui_button_pressed(button_id: String)
747
+ signal dialog_started(dialog_id: String)
748
+ signal dialog_ended(dialog_id: String)
749
+
750
+ # Level events
751
+ signal level_started(level_id: String)
752
+ signal level_completed(level_id: String)
753
+ signal checkpoint_reached(checkpoint_id: String)
754
+
755
+ # Custom events dictionary for dynamic events
756
+ var _custom_handlers: Dictionary = {}
757
+
758
+ func emit_custom(event_name: String, data: Variant = null) -> void:
759
+ if _custom_handlers.has(event_name):
760
+ for handler in _custom_handlers[event_name]:
761
+ if is_instance_valid(handler.object):
762
+ handler.object.call(handler.method, data)
763
+
764
+ func subscribe(event_name: String, object: Object, method: String) -> void:
765
+ if not _custom_handlers.has(event_name):
766
+ _custom_handlers[event_name] = []
767
+ _custom_handlers[event_name].append({"object": object, "method": method})
768
+
769
+ func unsubscribe(event_name: String, object: Object, method: String) -> void:
770
+ if _custom_handlers.has(event_name):
771
+ _custom_handlers[event_name] = _custom_handlers[event_name].filter(
772
+ func(h): return h.object != object or h.method != method
773
+ )
774
+ `;
775
+ this.addTextFile('scripts/autoload/EventBus.gd', eventBus);
776
+ }
777
+ /* ── Environment ────────────────────────────────────────────── */
778
+ exportEnvironment(project) {
779
+ const bgColor = this.hexToGodotColor(project.settings.backgroundColor);
780
+ const env = `[gd_resource type="Environment" format=3]
781
+
782
+ [resource]
783
+ background_mode = 1
784
+ background_color = Color(${bgColor})
785
+ `;
786
+ this.addTextFile('resources/default_env.tres', env);
787
+ }
788
+ /* ── Asset Imports ──────────────────────────────────────────── */
789
+ exportAssetImports(project) {
790
+ for (const asset of project.assets) {
791
+ const importFile = this.createImportFile(asset);
792
+ if (importFile) {
793
+ const assetPath = this.getAssetPath(asset);
794
+ this.addTextFile(`${assetPath}.import`, importFile);
795
+ }
796
+ }
797
+ }
798
+ createImportFile(asset) {
799
+ switch (asset.type) {
800
+ case 'sprite':
801
+ return `[remap]
802
+
803
+ importer="texture"
804
+ type="CompressedTexture2D"
805
+ uid="uid://${this.nextUID()}"
806
+ path="res://.godot/imported/${asset.name}.ctex"
807
+
808
+ [deps]
809
+
810
+ source_file="res://assets/sprites/${asset.name}"
811
+ dest_files=["res://.godot/imported/${asset.name}.ctex"]
812
+
813
+ [params]
814
+
815
+ compress/mode=0
816
+ compress/high_quality=false
817
+ compress/lossy_quality=0.7
818
+ compress/hdr_compression=1
819
+ compress/normal_map=0
820
+ compress/channel_pack=0
821
+ mipmaps/generate=false
822
+ mipmaps/limit=-1
823
+ roughness/mode=0
824
+ roughness/src_normal=""
825
+ process/fix_alpha_border=true
826
+ process/premult_alpha=false
827
+ process/normal_map_invert_y=false
828
+ process/hdr_as_srgb=false
829
+ process/hdr_clamp_exposure=false
830
+ process/size_limit=0
831
+ detect_3d/compress_to=1
832
+ `;
833
+ case 'audio':
834
+ return `[remap]
835
+
836
+ importer="wav"
837
+ type="AudioStreamWAV"
838
+ uid="uid://${this.nextUID()}"
839
+ path="res://.godot/imported/${asset.name}.sample"
840
+
841
+ [deps]
842
+
843
+ source_file="res://assets/audio/${asset.name}"
844
+ dest_files=["res://.godot/imported/${asset.name}.sample"]
845
+
846
+ [params]
847
+
848
+ force/8_bit=false
849
+ force/mono=false
850
+ force/max_rate=false
851
+ force/max_rate_hz=44100
852
+ edit/trim=false
853
+ edit/normalize=false
854
+ edit/loop_mode=0
855
+ edit/loop_begin=0
856
+ edit/loop_end=-1
857
+ compress/mode=0
858
+ `;
859
+ case 'font':
860
+ return `[remap]
861
+
862
+ importer="font_data_dynamic"
863
+ type="FontFile"
864
+ uid="uid://${this.nextUID()}"
865
+ path="res://.godot/imported/${asset.name}.fontdata"
866
+
867
+ [deps]
868
+
869
+ source_file="res://assets/fonts/${asset.name}"
870
+ dest_files=["res://.godot/imported/${asset.name}.fontdata"]
871
+
872
+ [params]
873
+
874
+ Rendering=null
875
+ antialiasing=1
876
+ generate_mipmaps=false
877
+ multichannel_signed_distance_field=false
878
+ msdf_pixel_range=8
879
+ msdf_size=48
880
+ allow_system_fallback=true
881
+ force_autohinter=false
882
+ hinting=1
883
+ subpixel_positioning=1
884
+ oversampling=0.0
885
+ Fallbacks=null
886
+ fallbacks=[]
887
+ Compress=null
888
+ compress=true
889
+ preload=[]
890
+ language_support={}
891
+ script_support={}
892
+ opentype_features={}
893
+ `;
894
+ default:
895
+ return null;
896
+ }
897
+ }
898
+ getAssetPath(asset) {
899
+ switch (asset.type) {
900
+ case 'sprite':
901
+ return `assets/sprites/${asset.name}`;
902
+ case 'audio':
903
+ return `assets/audio/${asset.name}`;
904
+ case 'font':
905
+ return `assets/fonts/${asset.name}`;
906
+ case 'tileset':
907
+ return `assets/tilesets/${asset.name}`;
908
+ default:
909
+ return `assets/${asset.name}`;
910
+ }
911
+ }
912
+ /* ── Resource Helpers ───────────────────────────────────────── */
913
+ addScriptResource(script, resources) {
914
+ const id = this.nextResourceId().toString();
915
+ resources.push({
916
+ type: 'GDScript',
917
+ id,
918
+ path: `res://scripts/${this.sanitizeName(script.name)}.gd`,
919
+ properties: {},
920
+ });
921
+ return id;
922
+ }
923
+ addTextureResource(asset, resources) {
924
+ const id = this.nextResourceId().toString();
925
+ resources.push({
926
+ type: 'Texture2D',
927
+ id,
928
+ path: `res://assets/sprites/${asset.name}`,
929
+ properties: {},
930
+ });
931
+ return id;
932
+ }
933
+ addAudioResource(asset, resources) {
934
+ const id = this.nextResourceId().toString();
935
+ resources.push({
936
+ type: 'AudioStream',
937
+ id,
938
+ path: `res://assets/audio/${asset.name}`,
939
+ properties: {},
940
+ });
941
+ return id;
942
+ }
943
+ addTileSetResource(asset, tilemap, resources) {
944
+ const id = this.nextResourceId().toString();
945
+ resources.push({
946
+ type: 'TileSet',
947
+ id,
948
+ path: `res://resources/tilesets/${this.sanitizeName(asset.name)}.tres`,
949
+ properties: {},
950
+ });
951
+ return id;
952
+ }
953
+ /* ── TSCN Serialization ─────────────────────────────────────── */
954
+ serializeTSCN(resources, nodes, sceneName) {
955
+ const extResources = resources.filter((r) => r.path);
956
+ const subResources = resources.filter((r) => !r.path);
957
+ const loadSteps = extResources.length + subResources.length + 1;
958
+ let output = `[gd_scene load_steps=${loadSteps} format=3 uid="uid://${this.nextUID()}"]
959
+
960
+ `;
961
+ // External resources
962
+ for (const res of extResources) {
963
+ output += `[ext_resource type="${res.type}" path="${res.path}" id="${res.id}"]\n`;
964
+ }
965
+ if (extResources.length > 0)
966
+ output += '\n';
967
+ // Sub-resources
968
+ for (const res of subResources) {
969
+ output += `[sub_resource type="${res.type}" id="${res.id}"]\n`;
970
+ for (const [key, value] of Object.entries(res.properties)) {
971
+ if (value !== undefined) {
972
+ output += `${key} = ${this.formatValue(value)}\n`;
973
+ }
974
+ }
975
+ output += '\n';
976
+ }
977
+ // Nodes
978
+ output += this.serializeNodes(nodes);
979
+ return output;
980
+ }
981
+ serializeNodes(nodes, parent) {
982
+ let output = '';
983
+ for (const node of nodes) {
984
+ if (node.instance) {
985
+ // Instance of packed scene
986
+ output += `[node name="${node.name}" parent="${parent || '.'}" instance=ExtResource("${node.instance}")]\n`;
987
+ }
988
+ else if (!parent) {
989
+ // Root node
990
+ output += `[node name="${node.name}" type="${node.type}"]\n`;
991
+ }
992
+ else {
993
+ output += `[node name="${node.name}" type="${node.type}" parent="${parent}"]\n`;
994
+ }
995
+ // Node properties
996
+ for (const [key, value] of Object.entries(node.properties)) {
997
+ if (value !== undefined && key !== 'script') {
998
+ output += `${key} = ${this.formatValue(value)}\n`;
999
+ }
1000
+ }
1001
+ // Script last
1002
+ if (node.properties.script) {
1003
+ output += `script = ${node.properties.script}\n`;
1004
+ }
1005
+ output += '\n';
1006
+ // Children
1007
+ if (node.children && node.children.length > 0) {
1008
+ const nodePath = parent ? `${parent}/${node.name}` : '.';
1009
+ output += this.serializeNodes(node.children, nodePath);
1010
+ }
1011
+ }
1012
+ return output;
1013
+ }
1014
+ /* ── Utility Methods ────────────────────────────────────────── */
1015
+ formatValue(value) {
1016
+ if (typeof value === 'string') {
1017
+ if (value.startsWith('Vector2(') ||
1018
+ value.startsWith('Vector3(') ||
1019
+ value.startsWith('Color(') ||
1020
+ value.startsWith('ExtResource(') ||
1021
+ value.startsWith('SubResource(')) {
1022
+ return value;
1023
+ }
1024
+ return `"${value}"`;
1025
+ }
1026
+ if (typeof value === 'boolean') {
1027
+ return value ? 'true' : 'false';
1028
+ }
1029
+ if (typeof value === 'number') {
1030
+ return value.toString();
1031
+ }
1032
+ if (value === null) {
1033
+ return 'null';
1034
+ }
1035
+ return String(value);
1036
+ }
1037
+ hexToGodotColor(hex) {
1038
+ const clean = hex.replace('#', '');
1039
+ const r = parseInt(clean.slice(0, 2), 16) / 255;
1040
+ const g = parseInt(clean.slice(2, 4), 16) / 255;
1041
+ const b = parseInt(clean.slice(4, 6), 16) / 255;
1042
+ const a = clean.length > 6 ? parseInt(clean.slice(6, 8), 16) / 255 : 1;
1043
+ return `${r.toFixed(3)}, ${g.toFixed(3)}, ${b.toFixed(3)}, ${a.toFixed(3)}`;
1044
+ }
1045
+ linearToDb(linear) {
1046
+ if (linear <= 0)
1047
+ return -80;
1048
+ return 20 * Math.log10(linear);
1049
+ }
1050
+ sanitizeName(name) {
1051
+ return name.replace(/[^a-zA-Z0-9_]/g, '_');
1052
+ }
1053
+ nextResourceId() {
1054
+ return this.resourceIdCounter++;
1055
+ }
1056
+ nextUID() {
1057
+ return (this.uidCounter++).toString().padStart(12, '0');
1058
+ }
1059
+ getHorizontalAlignment(alignment) {
1060
+ switch (alignment) {
1061
+ case 'left':
1062
+ case 'top-left':
1063
+ case 'bottom-left':
1064
+ return 0;
1065
+ case 'center':
1066
+ case 'top-center':
1067
+ case 'bottom-center':
1068
+ return 1;
1069
+ case 'right':
1070
+ case 'top-right':
1071
+ case 'bottom-right':
1072
+ return 2;
1073
+ default:
1074
+ return 0;
1075
+ }
1076
+ }
1077
+ getVerticalAlignment(alignment) {
1078
+ switch (alignment) {
1079
+ case 'top':
1080
+ case 'top-left':
1081
+ case 'top-center':
1082
+ case 'top-right':
1083
+ return 0;
1084
+ case 'center':
1085
+ case 'left':
1086
+ case 'right':
1087
+ return 1;
1088
+ case 'bottom':
1089
+ case 'bottom-left':
1090
+ case 'bottom-center':
1091
+ case 'bottom-right':
1092
+ return 2;
1093
+ default:
1094
+ return 0;
1095
+ }
1096
+ }
1097
+ }
1098
+
1099
+ export { GodotExporter };
1100
+ //# sourceMappingURL=GodotExporter.js.map