@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,761 @@
1
+ 'use strict';
2
+
3
+ var SceneImporter = require('./SceneImporter.js');
4
+
5
+ /**
6
+ * @file AsepriteImporter.ts
7
+ * @description Import Aseprite sprite editor files (.aseprite, .ase)
8
+ * PRO-1.3: Scene Format Interoperability
9
+ *
10
+ * Supports:
11
+ * - Aseprite binary format (.aseprite, .ase)
12
+ * - Aseprite JSON export format
13
+ *
14
+ * Features:
15
+ * - Layers (normal, group, reference)
16
+ * - Frames and animation
17
+ * - Tags (animation clips)
18
+ * - Slices (9-slice, pivot)
19
+ * - Palette
20
+ * - Cel data
21
+ * - Blend modes
22
+ */
23
+ // ============================================================
24
+ // Aseprite Chunk Types
25
+ // ============================================================
26
+ const CHUNK_TYPES = {
27
+ LAYER: 0x2004,
28
+ CEL: 0x2005,
29
+ EXTERNAL_FILES: 0x2008,
30
+ TAGS: 0x2018,
31
+ PALETTE: 0x2019,
32
+ SLICE: 0x2022};
33
+ const BLEND_MODES = [
34
+ 'normal',
35
+ 'multiply',
36
+ 'screen',
37
+ 'overlay',
38
+ 'darken',
39
+ 'lighten',
40
+ 'color-dodge',
41
+ 'color-burn',
42
+ 'hard-light',
43
+ 'soft-light',
44
+ 'difference',
45
+ 'exclusion',
46
+ 'hue',
47
+ 'saturation',
48
+ 'color',
49
+ 'luminosity',
50
+ 'addition',
51
+ 'subtract',
52
+ 'divide',
53
+ ];
54
+ // ============================================================
55
+ // Aseprite Importer
56
+ // ============================================================
57
+ class AsepriteImporter extends SceneImporter.SceneImporter {
58
+ constructor() {
59
+ super('aseprite');
60
+ this.aseFile = null;
61
+ }
62
+ async import(options) {
63
+ const startTime = Date.now();
64
+ this.options = options;
65
+ this.clearMessages();
66
+ this.aseFile = null;
67
+ const errors = await this.validate(options.sourcePath);
68
+ if (errors.some((e) => e.fatal)) {
69
+ return {
70
+ ...this.createEmptyResult(),
71
+ errors: errors,
72
+ };
73
+ }
74
+ const scenes = [];
75
+ const assets = [];
76
+ try {
77
+ const content = await this.readFile(options.sourcePath);
78
+ // Detect format: binary or JSON
79
+ if (typeof content === 'string') {
80
+ // JSON export
81
+ const json = JSON.parse(content);
82
+ const spriteSheet = this.parseJsonExport(json, options.sourcePath);
83
+ assets.push(this.createSpriteSheetAsset(spriteSheet, json.meta.image));
84
+ }
85
+ else {
86
+ // Binary format
87
+ this.aseFile = this.parseBinaryFile(content);
88
+ if (this.aseFile) {
89
+ // Create sprite sheet asset
90
+ const spriteSheet = this.createSpriteSheetFromBinary();
91
+ assets.push(this.createSpriteSheetAsset(spriteSheet, options.sourcePath));
92
+ // Create palette asset if indexed color
93
+ if (this.aseFile.header.colorDepth === 8) {
94
+ assets.push(this.createPaletteAsset());
95
+ }
96
+ }
97
+ }
98
+ // Create a pseudo-scene for the sprite
99
+ if (this.aseFile || assets.length > 0) {
100
+ const scene = this.createSpriteScene(options.sourcePath);
101
+ scenes.push(scene);
102
+ }
103
+ }
104
+ catch (error) {
105
+ this.addError('IMPORT_ERROR', `Failed to import: ${error}`, options.sourcePath, undefined, true);
106
+ }
107
+ return this.createResult(scenes, assets, startTime);
108
+ }
109
+ async parseFile(content, filePath) {
110
+ if (typeof content === 'string') {
111
+ try {
112
+ const json = JSON.parse(content);
113
+ const spriteSheet = this.parseJsonExport(json, filePath);
114
+ return {
115
+ id: this.generateId(),
116
+ name: spriteSheet.name,
117
+ type: 'animation',
118
+ path: json.meta.image,
119
+ metadata: {
120
+ frames: spriteSheet.frames,
121
+ animations: spriteSheet.animations,
122
+ },
123
+ };
124
+ }
125
+ catch (_a) {
126
+ return null;
127
+ }
128
+ }
129
+ // Binary parsing returns scene with sprite entity
130
+ this.aseFile = this.parseBinaryFile(content);
131
+ if (this.aseFile) {
132
+ return this.createSpriteScene(filePath);
133
+ }
134
+ return null;
135
+ }
136
+ async validate(sourcePath) {
137
+ const errors = [];
138
+ if (!this.canHandle(sourcePath)) {
139
+ errors.push({
140
+ code: 'INVALID_FORMAT',
141
+ message: `File ${sourcePath} is not a valid Aseprite file`,
142
+ file: sourcePath,
143
+ fatal: true,
144
+ });
145
+ }
146
+ return errors;
147
+ }
148
+ // ----------------------------------------
149
+ // JSON Export Parsing
150
+ // ----------------------------------------
151
+ parseJsonExport(json, filePath) {
152
+ const frames = [];
153
+ const animations = {};
154
+ // Parse frames (can be object or array)
155
+ const frameEntries = Array.isArray(json.frames)
156
+ ? json.frames.map((f, i) => [`frame_${i}`, f])
157
+ : Object.entries(json.frames);
158
+ for (const [name, frameData] of frameEntries) {
159
+ frames.push({
160
+ name,
161
+ x: frameData.frame.x,
162
+ y: frameData.frame.y,
163
+ width: frameData.frame.w,
164
+ height: frameData.frame.h,
165
+ sourceWidth: frameData.sourceSize.w,
166
+ sourceHeight: frameData.sourceSize.h,
167
+ offsetX: frameData.spriteSourceSize.x,
168
+ offsetY: frameData.spriteSourceSize.y,
169
+ trimmed: frameData.trimmed,
170
+ });
171
+ }
172
+ // Parse frame tags as animations
173
+ if (json.meta.frameTags) {
174
+ for (const tag of json.meta.frameTags) {
175
+ const animFrames = [];
176
+ for (let i = tag.from; i <= tag.to; i++) {
177
+ const frame = frameEntries[i][1];
178
+ animFrames.push({
179
+ index: i,
180
+ duration: frame.duration,
181
+ x: frameEntries[i][1].frame.x,
182
+ y: frameEntries[i][1].frame.y,
183
+ width: frameEntries[i][1].frame.w,
184
+ height: frameEntries[i][1].frame.h,
185
+ });
186
+ }
187
+ animations[tag.name] = {
188
+ name: tag.name,
189
+ frames: animFrames,
190
+ loop: true, // Determine from direction
191
+ };
192
+ }
193
+ }
194
+ // If no tags, create a default animation with all frames
195
+ if (Object.keys(animations).length === 0 && frames.length > 0) {
196
+ const allFrames = frameEntries.map(([_, f], index) => ({
197
+ index,
198
+ duration: f.duration,
199
+ x: f.frame.x,
200
+ y: f.frame.y,
201
+ width: f.frame.w,
202
+ height: f.frame.h,
203
+ }));
204
+ animations['default'] = {
205
+ name: 'default',
206
+ frames: allFrames,
207
+ loop: true,
208
+ };
209
+ }
210
+ return {
211
+ name: filePath.substring(filePath.lastIndexOf('/') + 1).replace(/\.\w+$/, ''),
212
+ imagePath: json.meta.image,
213
+ frames,
214
+ animations,
215
+ };
216
+ }
217
+ // ----------------------------------------
218
+ // Binary Format Parsing
219
+ // ----------------------------------------
220
+ parseBinaryFile(buffer) {
221
+ const view = new DataView(buffer);
222
+ let offset = 0;
223
+ // Read header
224
+ const header = this.readHeader(view, offset);
225
+ offset += 128; // Header is always 128 bytes
226
+ if (header.magicNumber !== 0xa5e0) {
227
+ this.addError('INVALID_MAGIC', 'Invalid Aseprite file magic number');
228
+ return null;
229
+ }
230
+ const file = {
231
+ header,
232
+ frames: [],
233
+ palette: { size: 0, colors: [], firstColorIndex: 0, lastColorIndex: 0 },
234
+ layers: [],
235
+ tags: [],
236
+ slices: [],
237
+ };
238
+ // Read frames
239
+ for (let f = 0; f < header.frames; f++) {
240
+ const frame = this.readFrame(view, offset, file);
241
+ file.frames.push(frame);
242
+ offset += this.getFrameSize(view, offset);
243
+ }
244
+ // Build layer hierarchy
245
+ this.buildLayerHierarchy(file.layers);
246
+ return file;
247
+ }
248
+ readHeader(view, offset) {
249
+ return {
250
+ fileSize: view.getUint32(offset, true),
251
+ magicNumber: view.getUint16(offset + 4, true),
252
+ frames: view.getUint16(offset + 6, true),
253
+ width: view.getUint16(offset + 8, true),
254
+ height: view.getUint16(offset + 10, true),
255
+ colorDepth: view.getUint16(offset + 12, true),
256
+ flags: view.getUint32(offset + 14, true),
257
+ speed: view.getUint16(offset + 18, true),
258
+ transparentIndex: view.getUint8(offset + 28),
259
+ numColors: view.getUint16(offset + 32, true),
260
+ pixelWidth: view.getUint8(offset + 34),
261
+ pixelHeight: view.getUint8(offset + 35),
262
+ gridX: view.getInt16(offset + 36, true),
263
+ gridY: view.getInt16(offset + 38, true),
264
+ gridWidth: view.getUint16(offset + 40, true),
265
+ gridHeight: view.getUint16(offset + 42, true),
266
+ };
267
+ }
268
+ readFrame(view, offset, file) {
269
+ view.getUint32(offset, true);
270
+ const frameMagic = view.getUint16(offset + 4, true);
271
+ if (frameMagic !== 0xf1fa) {
272
+ this.addWarning('INVALID_FRAME_MAGIC', `Invalid frame magic at offset ${offset}`);
273
+ }
274
+ const oldChunks = view.getUint16(offset + 6, true);
275
+ const duration = view.getUint16(offset + 8, true);
276
+ const newChunks = view.getUint32(offset + 12, true);
277
+ const numChunks = newChunks === 0 ? oldChunks : newChunks;
278
+ const frame = {
279
+ duration,
280
+ chunks: [],
281
+ cels: [],
282
+ };
283
+ let chunkOffset = offset + 16;
284
+ for (let c = 0; c < numChunks; c++) {
285
+ const chunkSize = view.getUint32(chunkOffset, true);
286
+ const chunkType = view.getUint16(chunkOffset + 4, true);
287
+ const chunkData = new Uint8Array(view.buffer, chunkOffset + 6, chunkSize - 6);
288
+ this.processChunk(chunkType, chunkData, frame, file);
289
+ frame.chunks.push({
290
+ type: chunkType,
291
+ data: chunkData.buffer,
292
+ });
293
+ chunkOffset += chunkSize;
294
+ }
295
+ return frame;
296
+ }
297
+ getFrameSize(view, offset) {
298
+ return view.getUint32(offset, true);
299
+ }
300
+ processChunk(type, data, frame, file) {
301
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
302
+ switch (type) {
303
+ case CHUNK_TYPES.LAYER:
304
+ file.layers.push(this.readLayerChunk(view));
305
+ break;
306
+ case CHUNK_TYPES.CEL:
307
+ frame.cels.push(this.readCelChunk(view, data, file.header));
308
+ break;
309
+ case CHUNK_TYPES.TAGS:
310
+ file.tags.push(...this.readTagsChunk(view));
311
+ break;
312
+ case CHUNK_TYPES.PALETTE:
313
+ file.palette = this.readPaletteChunk(view);
314
+ break;
315
+ case CHUNK_TYPES.SLICE:
316
+ file.slices.push(this.readSliceChunk(view));
317
+ break;
318
+ case CHUNK_TYPES.EXTERNAL_FILES:
319
+ file.externalFiles = this.readExternalFilesChunk(view);
320
+ break;
321
+ }
322
+ }
323
+ readLayerChunk(view) {
324
+ const flags = view.getUint16(0, true);
325
+ const typeNum = view.getUint16(2, true);
326
+ const childLevel = view.getUint16(4, true);
327
+ // Skip default width/height at 6 and 8
328
+ const blendModeNum = view.getUint16(10, true);
329
+ const opacity = view.getUint8(12);
330
+ // Skip 3 reserved bytes
331
+ const nameLength = view.getUint16(16, true);
332
+ const name = this.readString(view, 18, nameLength);
333
+ let tilesetIndex;
334
+ if (typeNum === 2 && view.byteLength > 18 + nameLength) {
335
+ tilesetIndex = view.getUint32(18 + nameLength, true);
336
+ }
337
+ return {
338
+ flags,
339
+ type: typeNum === 0 ? 'normal' : typeNum === 1 ? 'group' : 'tilemap',
340
+ childLevel,
341
+ blendMode: BLEND_MODES[blendModeNum] || 'normal',
342
+ opacity,
343
+ name,
344
+ tilesetIndex,
345
+ visible: (flags & 0x0001) !== 0,
346
+ editable: (flags & 0x0002) !== 0,
347
+ lockMovement: (flags & 0x0004) !== 0,
348
+ background: (flags & 0x0008) !== 0,
349
+ continuous: (flags & 0x0010) !== 0,
350
+ collapsed: (flags & 0x0020) !== 0,
351
+ reference: (flags & 0x0040) !== 0,
352
+ children: [],
353
+ };
354
+ }
355
+ readCelChunk(view, data, header) {
356
+ const layerIndex = view.getUint16(0, true);
357
+ const x = view.getInt16(2, true);
358
+ const y = view.getInt16(4, true);
359
+ const opacity = view.getUint8(6);
360
+ const celType = view.getUint16(7, true);
361
+ const zIndex = view.getInt16(9, true);
362
+ const cel = {
363
+ layerIndex,
364
+ x,
365
+ y,
366
+ opacity,
367
+ celType: celType === 0
368
+ ? 'raw'
369
+ : celType === 1
370
+ ? 'linked'
371
+ : celType === 2
372
+ ? 'compressed'
373
+ : 'compressed-tilemap',
374
+ zIndex,
375
+ };
376
+ // Skip 5 reserved bytes, then read type-specific data
377
+ let offset = 16;
378
+ if (celType === 1) {
379
+ // Linked cel
380
+ cel.linkedFrame = view.getUint16(offset, true);
381
+ }
382
+ else if (celType === 0 || celType === 2) {
383
+ // Raw or compressed pixel data
384
+ cel.width = view.getUint16(offset, true);
385
+ cel.height = view.getUint16(offset + 2, true);
386
+ if (celType === 0) {
387
+ // Raw pixels
388
+ const bytesPerPixel = header.colorDepth / 8;
389
+ const pixelCount = cel.width * cel.height * bytesPerPixel;
390
+ cel.pixels = new Uint8Array(data.slice(offset + 4, offset + 4 + pixelCount));
391
+ }
392
+ else {
393
+ // Compressed (zlib)
394
+ // Would need zlib decompression here
395
+ // For now, store compressed data reference
396
+ cel.pixels = new Uint8Array(data.slice(offset + 4));
397
+ }
398
+ }
399
+ else if (celType === 3) {
400
+ // Compressed tilemap
401
+ cel.width = view.getUint16(offset, true);
402
+ cel.height = view.getUint16(offset + 2, true);
403
+ cel.tileWidth = view.getUint16(offset + 4, true);
404
+ cel.tileHeight = view.getUint16(offset + 6, true);
405
+ // Tile data follows (compressed)
406
+ }
407
+ return cel;
408
+ }
409
+ readTagsChunk(view) {
410
+ const tags = [];
411
+ const numTags = view.getUint16(0, true);
412
+ // Skip 8 reserved bytes
413
+ let offset = 10;
414
+ for (let i = 0; i < numTags; i++) {
415
+ const fromFrame = view.getUint16(offset, true);
416
+ const toFrame = view.getUint16(offset + 2, true);
417
+ const directionNum = view.getUint8(offset + 4);
418
+ const repeat = view.getUint16(offset + 5, true);
419
+ // Skip 6 reserved bytes
420
+ // Skip deprecated RGB bytes at offset + 13
421
+ // Skip 1 extra byte
422
+ const nameLength = view.getUint16(offset + 17, true);
423
+ const name = this.readString(view, offset + 19, nameLength);
424
+ tags.push({
425
+ fromFrame,
426
+ toFrame,
427
+ direction: directionNum === 0
428
+ ? 'forward'
429
+ : directionNum === 1
430
+ ? 'reverse'
431
+ : directionNum === 2
432
+ ? 'pingpong'
433
+ : 'pingpong-reverse',
434
+ repeat,
435
+ name,
436
+ color: { red: 0, green: 0, blue: 0, alpha: 255 },
437
+ });
438
+ offset += 19 + nameLength;
439
+ }
440
+ return tags;
441
+ }
442
+ readPaletteChunk(view) {
443
+ const size = view.getUint32(0, true);
444
+ const firstColorIndex = view.getUint32(4, true);
445
+ const lastColorIndex = view.getUint32(8, true);
446
+ // Skip 8 reserved bytes
447
+ const colors = [];
448
+ let offset = 20;
449
+ for (let i = firstColorIndex; i <= lastColorIndex; i++) {
450
+ const hasName = view.getUint16(offset, true) & 0x0001;
451
+ const red = view.getUint8(offset + 2);
452
+ const green = view.getUint8(offset + 3);
453
+ const blue = view.getUint8(offset + 4);
454
+ const alpha = view.getUint8(offset + 5);
455
+ let name;
456
+ offset += 6;
457
+ if (hasName) {
458
+ const nameLength = view.getUint16(offset, true);
459
+ name = this.readString(view, offset + 2, nameLength);
460
+ offset += 2 + nameLength;
461
+ }
462
+ colors[i] = { red, green, blue, alpha, name };
463
+ }
464
+ return { size, colors, firstColorIndex, lastColorIndex };
465
+ }
466
+ readSliceChunk(view) {
467
+ const numKeys = view.getUint32(0, true);
468
+ const flags = view.getUint32(4, true);
469
+ // Skip 4 reserved bytes
470
+ const nameLength = view.getUint16(12, true);
471
+ const name = this.readString(view, 14, nameLength);
472
+ const has9Slices = (flags & 0x0001) !== 0;
473
+ const hasPivot = (flags & 0x0002) !== 0;
474
+ const keys = [];
475
+ let offset = 14 + nameLength;
476
+ for (let i = 0; i < numKeys; i++) {
477
+ const frameNumber = view.getUint32(offset, true);
478
+ const x = view.getInt32(offset + 4, true);
479
+ const y = view.getInt32(offset + 8, true);
480
+ const width = view.getUint32(offset + 12, true);
481
+ const height = view.getUint32(offset + 16, true);
482
+ offset += 20;
483
+ const key = { frameNumber, x, y, width, height };
484
+ if (has9Slices) {
485
+ key.centerX = view.getInt32(offset, true);
486
+ key.centerY = view.getInt32(offset + 4, true);
487
+ key.centerWidth = view.getUint32(offset + 8, true);
488
+ key.centerHeight = view.getUint32(offset + 12, true);
489
+ offset += 16;
490
+ }
491
+ if (hasPivot) {
492
+ key.pivotX = view.getInt32(offset, true);
493
+ key.pivotY = view.getInt32(offset + 4, true);
494
+ offset += 8;
495
+ }
496
+ keys.push(key);
497
+ }
498
+ return { name, flags, keys, has9Slices, hasPivot };
499
+ }
500
+ readExternalFilesChunk(view) {
501
+ const files = [];
502
+ const numEntries = view.getUint32(0, true);
503
+ // Skip 8 reserved bytes
504
+ let offset = 12;
505
+ for (let i = 0; i < numEntries; i++) {
506
+ const id = view.getUint32(offset, true);
507
+ const typeNum = view.getUint8(offset + 4);
508
+ // Skip 7 reserved bytes
509
+ const pathLength = view.getUint16(offset + 12, true);
510
+ const path = this.readString(view, offset + 14, pathLength);
511
+ const typeMap = {
512
+ 0: 'external-palette',
513
+ 1: 'external-tileset',
514
+ 2: 'extension',
515
+ 3: 'extension-property',
516
+ };
517
+ files.push({
518
+ id,
519
+ type: typeMap[typeNum] || 'extension',
520
+ path,
521
+ });
522
+ offset += 14 + pathLength;
523
+ }
524
+ return files;
525
+ }
526
+ readString(view, offset, length) {
527
+ const bytes = new Uint8Array(view.buffer, view.byteOffset + offset, length);
528
+ return new TextDecoder('utf-8').decode(bytes);
529
+ }
530
+ buildLayerHierarchy(layers) {
531
+ const stack = [];
532
+ for (let i = 0; i < layers.length; i++) {
533
+ const layer = layers[i];
534
+ // Pop stack until we find the parent level
535
+ while (stack.length > layer.childLevel) {
536
+ stack.pop();
537
+ }
538
+ // Set parent
539
+ if (stack.length > 0) {
540
+ layer.parent = stack[stack.length - 1];
541
+ layers[layer.parent].children.push(i);
542
+ }
543
+ // Push this layer if it's a group
544
+ if (layer.type === 'group') {
545
+ stack.push(i);
546
+ }
547
+ }
548
+ }
549
+ // ----------------------------------------
550
+ // Conversion
551
+ // ----------------------------------------
552
+ createSpriteSheetFromBinary() {
553
+ if (!this.aseFile) {
554
+ return { name: 'unknown', imagePath: '', frames: [] };
555
+ }
556
+ const frames = [];
557
+ const animations = {};
558
+ // Create frames
559
+ for (let i = 0; i < this.aseFile.frames.length; i++) {
560
+ frames.push({
561
+ name: `frame_${i}`,
562
+ x: 0,
563
+ y: i * this.aseFile.header.height,
564
+ width: this.aseFile.header.width,
565
+ height: this.aseFile.header.height,
566
+ });
567
+ }
568
+ // Create animations from tags
569
+ for (const tag of this.aseFile.tags) {
570
+ const animFrames = [];
571
+ for (let i = tag.fromFrame; i <= tag.toFrame; i++) {
572
+ animFrames.push({
573
+ index: i,
574
+ duration: this.aseFile.frames[i].duration,
575
+ x: 0,
576
+ y: i * this.aseFile.header.height,
577
+ width: this.aseFile.header.width,
578
+ height: this.aseFile.header.height,
579
+ });
580
+ }
581
+ animations[tag.name] = {
582
+ name: tag.name,
583
+ frames: animFrames,
584
+ loop: tag.repeat === 0, // 0 means infinite loop
585
+ };
586
+ }
587
+ // Default animation if no tags
588
+ if (Object.keys(animations).length === 0) {
589
+ const allFrames = this.aseFile.frames.map((f, i) => ({
590
+ index: i,
591
+ duration: f.duration,
592
+ x: 0,
593
+ y: i * this.aseFile.header.height,
594
+ width: this.aseFile.header.width,
595
+ height: this.aseFile.header.height,
596
+ }));
597
+ animations['default'] = {
598
+ name: 'default',
599
+ frames: allFrames,
600
+ loop: true,
601
+ };
602
+ }
603
+ return {
604
+ name: 'sprite',
605
+ imagePath: '',
606
+ frames,
607
+ animations,
608
+ };
609
+ }
610
+ createSpriteSheetAsset(spriteSheet, imagePath) {
611
+ var _a, _b, _c, _d, _e;
612
+ return {
613
+ id: this.generateId(),
614
+ name: spriteSheet.name,
615
+ type: 'animation',
616
+ path: imagePath,
617
+ data: {
618
+ frames: spriteSheet.frames,
619
+ animations: spriteSheet.animations,
620
+ width: (_a = this.aseFile) === null || _a === void 0 ? void 0 : _a.header.width,
621
+ height: (_b = this.aseFile) === null || _b === void 0 ? void 0 : _b.header.height,
622
+ colorDepth: (_c = this.aseFile) === null || _c === void 0 ? void 0 : _c.header.colorDepth,
623
+ layers: (_d = this.aseFile) === null || _d === void 0 ? void 0 : _d.layers.map((l) => ({
624
+ name: l.name,
625
+ type: l.type,
626
+ blendMode: l.blendMode,
627
+ opacity: l.opacity,
628
+ visible: l.visible,
629
+ })),
630
+ slices: (_e = this.aseFile) === null || _e === void 0 ? void 0 : _e.slices.map((s) => ({
631
+ name: s.name,
632
+ has9Slices: s.has9Slices,
633
+ hasPivot: s.hasPivot,
634
+ keys: s.keys,
635
+ })),
636
+ },
637
+ };
638
+ }
639
+ createPaletteAsset() {
640
+ var _a;
641
+ return {
642
+ id: this.generateId(),
643
+ name: 'palette',
644
+ type: 'data',
645
+ path: '',
646
+ data: {
647
+ colors: (_a = this.aseFile) === null || _a === void 0 ? void 0 : _a.palette.colors.map((c) => ({
648
+ r: c.red,
649
+ g: c.green,
650
+ b: c.blue,
651
+ a: c.alpha,
652
+ name: c.name,
653
+ })),
654
+ },
655
+ };
656
+ }
657
+ createSpriteScene(filePath) {
658
+ var _a, _b, _c, _d, _e;
659
+ const name = filePath.substring(filePath.lastIndexOf('/') + 1).replace(/\.\w+$/, '');
660
+ const width = ((_a = this.aseFile) === null || _a === void 0 ? void 0 : _a.header.width) || 64;
661
+ const height = ((_b = this.aseFile) === null || _b === void 0 ? void 0 : _b.header.height) || 64;
662
+ const entities = [];
663
+ // Create entity for each layer
664
+ if (this.aseFile) {
665
+ for (let i = 0; i < this.aseFile.layers.length; i++) {
666
+ const layer = this.aseFile.layers[i];
667
+ if (layer.type === 'normal') {
668
+ entities.push({
669
+ id: this.generateId(),
670
+ name: layer.name,
671
+ components: [
672
+ {
673
+ type: 'Transform',
674
+ data: { position: { x: 0, y: 0 }, rotation: 0, scale: { x: 1, y: 1 } },
675
+ },
676
+ {
677
+ type: 'Sprite',
678
+ data: {
679
+ layer: layer.name,
680
+ blendMode: layer.blendMode,
681
+ opacity: layer.opacity / 255,
682
+ },
683
+ },
684
+ ],
685
+ children: [],
686
+ tags: ['layer'],
687
+ active: layer.visible,
688
+ });
689
+ }
690
+ }
691
+ }
692
+ // Add main sprite entity
693
+ entities.unshift({
694
+ id: this.generateId(),
695
+ name: name,
696
+ components: [
697
+ {
698
+ type: 'Transform',
699
+ data: { position: { x: width / 2, y: height / 2 }, rotation: 0, scale: { x: 1, y: 1 } },
700
+ },
701
+ {
702
+ type: 'AnimatedSprite',
703
+ data: {
704
+ spriteSheet: name,
705
+ currentAnimation: ((_d = (_c = this.aseFile) === null || _c === void 0 ? void 0 : _c.tags[0]) === null || _d === void 0 ? void 0 : _d.name) || 'default',
706
+ playing: true,
707
+ loop: true,
708
+ },
709
+ },
710
+ ],
711
+ children: [],
712
+ tags: ['sprite'],
713
+ active: true,
714
+ });
715
+ return {
716
+ id: this.generateId(),
717
+ name,
718
+ entities,
719
+ settings: {
720
+ width,
721
+ height,
722
+ backgroundColor: ((_e = this.aseFile) === null || _e === void 0 ? void 0 : _e.header.colorDepth) === 8
723
+ ? this.paletteColorToHex(this.aseFile.header.transparentIndex)
724
+ : '#00000000',
725
+ },
726
+ };
727
+ }
728
+ paletteColorToHex(index) {
729
+ var _a;
730
+ if (!((_a = this.aseFile) === null || _a === void 0 ? void 0 : _a.palette.colors[index]))
731
+ return '#000000';
732
+ const c = this.aseFile.palette.colors[index];
733
+ return `#${c.red.toString(16).padStart(2, '0')}${c.green.toString(16).padStart(2, '0')}${c.blue.toString(16).padStart(2, '0')}`;
734
+ }
735
+ // ----------------------------------------
736
+ // Helper Methods
737
+ // ----------------------------------------
738
+ async readFile(path) {
739
+ var _a;
740
+ if (typeof globalThis.process !== 'undefined' && ((_a = globalThis.process.versions) === null || _a === void 0 ? void 0 : _a.node)) {
741
+ const fs = await import('fs');
742
+ // Check if it's JSON or binary
743
+ if (path.endsWith('.json')) {
744
+ return fs.readFileSync(path, 'utf-8');
745
+ }
746
+ const buffer = fs.readFileSync(path);
747
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
748
+ }
749
+ else if (typeof fetch !== 'undefined') {
750
+ const response = await fetch(path);
751
+ if (path.endsWith('.json')) {
752
+ return response.text();
753
+ }
754
+ return response.arrayBuffer();
755
+ }
756
+ throw new Error('Unable to read file in current environment');
757
+ }
758
+ }
759
+
760
+ exports.AsepriteImporter = AsepriteImporter;
761
+ //# sourceMappingURL=AsepriteImporter.js.map