@auraindustry/aurajs 0.0.7 → 0.1.0

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 (334) hide show
  1. package/README.md +98 -2
  2. package/benchmarks/perf-thresholds.json +54 -0
  3. package/package.json +4 -7
  4. package/src/asset-pack.mjs +5 -1
  5. package/src/authored-project.mjs +1449 -0
  6. package/src/authored-runtime.mjs +2016 -0
  7. package/src/authoring/avatar-animation-graph.mjs +648 -0
  8. package/src/bin-integrity.mjs +272 -0
  9. package/src/build-contract/assets.mjs +130 -0
  10. package/src/build-contract/capabilities.mjs +116 -0
  11. package/src/build-contract/constants.mjs +6 -0
  12. package/src/build-contract/helpers.mjs +44 -0
  13. package/src/build-contract/web-templates.mjs +5993 -0
  14. package/src/build-contract.mjs +27 -2910
  15. package/src/bundler.mjs +188 -55
  16. package/src/cli.mjs +4825 -1512
  17. package/src/commands/project-authoring.mjs +434 -0
  18. package/src/config.mjs +27 -0
  19. package/src/conformance/cases/app-and-ui-runtime-cases.mjs +3309 -0
  20. package/src/conformance/cases/core-runtime-cases.mjs +1431 -0
  21. package/src/conformance/cases/index.mjs +11 -0
  22. package/src/conformance/cases/scene3d-and-media-cases.mjs +2094 -0
  23. package/src/conformance/cases/systems-and-gameplay-cases.mjs +1776 -0
  24. package/src/conformance/shared.mjs +27 -0
  25. package/src/conformance-runner.mjs +25 -13
  26. package/src/conformance.mjs +619 -4020
  27. package/src/cutscene.mjs +362 -5
  28. package/src/dev-cli-action.mjs +249 -0
  29. package/src/dev-cli-inspect.mjs +92 -0
  30. package/src/dev-cli-state.mjs +80 -0
  31. package/src/external-asset-cache.mjs +587 -0
  32. package/src/external-asset-policy.mjs +217 -0
  33. package/src/external-package-surface.mjs +206 -0
  34. package/src/game-action-runtime.mjs +869 -0
  35. package/src/game-state-runtime.mjs +206 -6
  36. package/src/headless-action.mjs +186 -0
  37. package/src/headless-test/runtime-animation.mjs +1173 -0
  38. package/src/headless-test/runtime-coordinator.mjs +1514 -0
  39. package/src/headless-test/runtime-primitives.mjs +320 -0
  40. package/src/headless-test/runtime-world.mjs +2253 -0
  41. package/src/headless-test.mjs +392 -4298
  42. package/src/host-binary.mjs +342 -14
  43. package/src/icon-discovery.mjs +64 -0
  44. package/src/make-catalog.mjs +109 -0
  45. package/src/make.mjs +197 -0
  46. package/src/package-integrity.mjs +586 -0
  47. package/src/perf-benchmark.mjs +353 -0
  48. package/src/postinstall.mjs +5 -5
  49. package/src/prefabs/index.mjs +34 -0
  50. package/src/prefabs/scene-serialization.mjs +184 -0
  51. package/src/project-importer.mjs +620 -0
  52. package/src/project-registry.mjs +24 -0
  53. package/src/publish-command.mjs +195 -0
  54. package/src/publish-env-example.mjs +83 -0
  55. package/src/publish-validation.mjs +708 -0
  56. package/src/retro/assets/compile.mjs +232 -0
  57. package/src/retro/backend-gba/authoring.mjs +1029 -0
  58. package/src/retro/backend-gba/rom.mjs +363 -0
  59. package/src/retro/backend-gbc/rom.mjs +85 -0
  60. package/src/retro/build.mjs +278 -0
  61. package/src/retro/cli/commands.mjs +292 -0
  62. package/src/retro/cli/templates.mjs +84 -0
  63. package/src/retro/diagnostics/catalog.mjs +110 -0
  64. package/src/retro/diagnostics/emit.mjs +72 -0
  65. package/src/retro/emulator/case-overlay.mjs +64 -0
  66. package/src/retro/emulator/discovery.mjs +158 -0
  67. package/src/retro/emulator/macos-case-overlay.swift +220 -0
  68. package/src/retro/emulator/profiles.mjs +146 -0
  69. package/src/retro/emulator/runner.mjs +289 -0
  70. package/src/retro/frontend/load-project.mjs +98 -0
  71. package/src/retro/index.mjs +30 -0
  72. package/src/retro/ir/build-ir.mjs +108 -0
  73. package/src/retro/runtime-gba/contract.mjs +151 -0
  74. package/src/retro/runtime-gbc/contract.mjs +117 -0
  75. package/src/retro/shared/span.mjs +26 -0
  76. package/src/retro/shared/targets.mjs +64 -0
  77. package/src/retro/validator/check-project.mjs +114 -0
  78. package/src/runtime-hotspot-audit.mjs +707 -0
  79. package/src/scaffold/config.mjs +1000 -0
  80. package/src/scaffold/fs.mjs +56 -0
  81. package/src/scaffold/layout.mjs +318 -0
  82. package/src/scaffold/project-docs.mjs +438 -0
  83. package/src/scaffold.mjs +93 -596
  84. package/src/scene-composition/index.mjs +326 -0
  85. package/src/scene-composition/runtime.mjs +751 -0
  86. package/src/self-hosted-assets.mjs +604 -0
  87. package/src/session-client.mjs +750 -0
  88. package/src/session-native-launcher.mjs +74 -0
  89. package/src/session-protocol.mjs +75 -0
  90. package/src/session-runtime.mjs +321 -0
  91. package/src/session-server.mjs +360 -0
  92. package/src/shader-kits/index.mjs +773 -0
  93. package/src/starter-content-registry.mjs +292 -0
  94. package/src/state-artifacts.mjs +662 -24
  95. package/src/state-dev-reload.mjs +99 -2
  96. package/src/terminal-ui.mjs +245 -0
  97. package/src/web-conformance.mjs +219 -0
  98. package/templates/create/2d/config/gameplay/shooter.config.js +26 -0
  99. package/templates/create/2d/content/gameplay/waves.json +26 -0
  100. package/templates/create/2d/content/registries/.gitkeep +1 -0
  101. package/templates/create/2d/docs/design/.gitkeep +1 -0
  102. package/templates/create/2d/docs/design/loop.md +5 -0
  103. package/templates/create/2d/prefabs/enemies.prefab.js +90 -0
  104. package/templates/create/2d/prefabs/enemy-basic.prefab.js +18 -0
  105. package/templates/create/2d/prefabs/player.prefab.js +36 -0
  106. package/templates/create/2d/prefabs/projectiles.prefab.js +35 -0
  107. package/templates/create/2d/scenes/boot.scene.js +12 -0
  108. package/templates/create/2d/scenes/gameplay.scene.js +230 -0
  109. package/templates/create/2d/scenes/menu.scene.js +9 -0
  110. package/templates/create/2d/src/main.js +6 -185
  111. package/templates/create/2d/src/runtime/app.js +49 -0
  112. package/templates/create/2d/src/runtime/capabilities.js +35 -0
  113. package/templates/create/2d/ui/hud.screen.js +40 -0
  114. package/templates/create/2d/ui/pause.screen.js +149 -0
  115. package/templates/create/2d/ui/settings.screen.js +347 -0
  116. package/templates/create/2d/ui/title.screen.js +13 -0
  117. package/templates/create/2d-adventure/aura.config.json +28 -0
  118. package/templates/create/2d-adventure/config/gameplay/adventure.config.js +14 -0
  119. package/templates/create/2d-adventure/content/gameplay/world.js +46 -0
  120. package/templates/create/2d-adventure/content/registries/.gitkeep +1 -0
  121. package/templates/create/2d-adventure/docs/design/loop.md +5 -0
  122. package/templates/create/2d-adventure/prefabs/player.prefab.js +54 -0
  123. package/templates/create/2d-adventure/prefabs/relic.prefab.js +38 -0
  124. package/templates/create/2d-adventure/prefabs/world.prefab.js +125 -0
  125. package/templates/create/2d-adventure/scenes/gameplay.scene.js +256 -0
  126. package/templates/create/2d-adventure/src/runtime/capabilities.js +34 -0
  127. package/templates/create/2d-adventure/ui/hud.screen.js +60 -0
  128. package/templates/create/2d-survivor/config/gameplay/survivor.config.js +33 -0
  129. package/templates/create/2d-survivor/content/gameplay/spawn-zones.json +29 -0
  130. package/templates/create/2d-survivor/content/registries/.gitkeep +1 -0
  131. package/templates/create/2d-survivor/docs/design/.gitkeep +1 -0
  132. package/templates/create/2d-survivor/docs/design/loop.md +5 -0
  133. package/templates/create/2d-survivor/prefabs/enemies.prefab.js +178 -0
  134. package/templates/create/2d-survivor/prefabs/enemy-swarm.prefab.js +18 -0
  135. package/templates/create/2d-survivor/prefabs/player.prefab.js +42 -0
  136. package/templates/create/2d-survivor/prefabs/projectiles.prefab.js +56 -0
  137. package/templates/create/2d-survivor/scenes/boot.scene.js +12 -0
  138. package/templates/create/2d-survivor/scenes/gameplay.scene.js +314 -0
  139. package/templates/create/2d-survivor/scenes/menu.scene.js +9 -0
  140. package/templates/create/2d-survivor/src/main.js +5 -332
  141. package/templates/create/2d-survivor/src/runtime/app.js +49 -0
  142. package/templates/create/2d-survivor/src/runtime/capabilities.js +35 -0
  143. package/templates/create/2d-survivor/ui/hud.screen.js +45 -0
  144. package/templates/create/2d-survivor/ui/title.screen.js +13 -0
  145. package/templates/create/3d/assets/models/starter-avatar.gltf +184 -0
  146. package/templates/create/3d/config/gameplay/.gitkeep +1 -0
  147. package/templates/create/3d/content/gameplay/checkpoints.json +33 -0
  148. package/templates/create/3d/content/gameplay/course.js +40 -0
  149. package/templates/create/3d/content/registries/.gitkeep +1 -0
  150. package/templates/create/3d/docs/design/.gitkeep +1 -0
  151. package/templates/create/3d/docs/design/loop.md +5 -0
  152. package/templates/create/3d/prefabs/checkpoint.prefab.js +15 -0
  153. package/templates/create/3d/prefabs/player.prefab.js +204 -0
  154. package/templates/create/3d/prefabs/world.prefab.js +112 -0
  155. package/templates/create/3d/scenes/boot.scene.js +12 -0
  156. package/templates/create/3d/scenes/checkpoint.scene.js +9 -0
  157. package/templates/create/3d/scenes/gameplay.scene.js +292 -0
  158. package/templates/create/3d/src/main.js +6 -295
  159. package/templates/create/3d/src/runtime/app.js +49 -0
  160. package/templates/create/3d/src/runtime/capabilities.js +53 -0
  161. package/templates/create/3d/src/runtime/materials.js +34 -0
  162. package/templates/create/3d/src/runtime/state.js +39 -0
  163. package/templates/create/3d/ui/hud.screen.js +75 -0
  164. package/templates/create/3d/ui/pause.screen.js +166 -0
  165. package/templates/create/3d/ui/settings.screen.js +387 -0
  166. package/templates/create/3d-adventure/assets/models/starter-avatar.gltf +184 -0
  167. package/templates/create/3d-adventure/aura.config.json +28 -0
  168. package/templates/create/3d-adventure/config/gameplay/adventure.config.js +9 -0
  169. package/templates/create/3d-adventure/content/gameplay/course.js +62 -0
  170. package/templates/create/3d-adventure/content/registries/.gitkeep +1 -0
  171. package/templates/create/3d-adventure/docs/design/loop.md +5 -0
  172. package/templates/create/3d-adventure/prefabs/player.prefab.js +168 -0
  173. package/templates/create/3d-adventure/prefabs/relic.prefab.js +35 -0
  174. package/templates/create/3d-adventure/prefabs/world.prefab.js +119 -0
  175. package/templates/create/3d-adventure/scenes/gameplay.scene.js +358 -0
  176. package/templates/create/3d-adventure/src/runtime/capabilities.js +56 -0
  177. package/templates/create/3d-adventure/src/runtime/materials.js +39 -0
  178. package/templates/create/3d-adventure/src/runtime/state.js +31 -0
  179. package/templates/create/3d-adventure/ui/hud.screen.js +70 -0
  180. package/templates/create/3d-adventure/ui/pause.screen.js +437 -0
  181. package/templates/create/3d-collectathon/assets/models/starter-avatar.gltf +184 -0
  182. package/templates/create/3d-collectathon/config/gameplay/.gitkeep +1 -0
  183. package/templates/create/3d-collectathon/content/gameplay/collectibles.json +26 -0
  184. package/templates/create/3d-collectathon/content/gameplay/course.js +46 -0
  185. package/templates/create/3d-collectathon/content/registries/.gitkeep +1 -0
  186. package/templates/create/3d-collectathon/docs/design/.gitkeep +1 -0
  187. package/templates/create/3d-collectathon/docs/design/loop.md +5 -0
  188. package/templates/create/3d-collectathon/prefabs/collectible.prefab.js +15 -0
  189. package/templates/create/3d-collectathon/prefabs/player.prefab.js +207 -0
  190. package/templates/create/3d-collectathon/prefabs/world.prefab.js +112 -0
  191. package/templates/create/3d-collectathon/scenes/boot.scene.js +12 -0
  192. package/templates/create/3d-collectathon/scenes/checkpoint.scene.js +9 -0
  193. package/templates/create/3d-collectathon/scenes/gameplay.scene.js +200 -0
  194. package/templates/create/3d-collectathon/src/main.js +5 -355
  195. package/templates/create/3d-collectathon/src/runtime/app.js +49 -0
  196. package/templates/create/3d-collectathon/src/runtime/capabilities.js +53 -0
  197. package/templates/create/3d-collectathon/src/runtime/materials.js +34 -0
  198. package/templates/create/3d-collectathon/src/runtime/state.js +27 -0
  199. package/templates/create/3d-collectathon/ui/hud.screen.js +66 -0
  200. package/templates/create/3d-collectathon/ui/pause.screen.js +13 -0
  201. package/templates/create/blank/config/gameplay/.gitkeep +1 -0
  202. package/templates/create/blank/content/gameplay/.gitkeep +1 -0
  203. package/templates/create/blank/content/registries/.gitkeep +1 -0
  204. package/templates/create/blank/docs/design/.gitkeep +1 -0
  205. package/templates/create/blank/docs/design/loop.md +5 -0
  206. package/templates/create/blank/prefabs/.gitkeep +1 -0
  207. package/templates/create/blank/scenes/.gitkeep +1 -0
  208. package/templates/create/blank/src/runtime/.gitkeep +1 -0
  209. package/templates/create/blank/ui/.gitkeep +1 -0
  210. package/templates/create/deckbuilder-2d/assets/audio/.gitkeep +1 -0
  211. package/templates/create/deckbuilder-2d/assets/fonts/.gitkeep +1 -0
  212. package/templates/create/deckbuilder-2d/assets/sprites/.gitkeep +1 -0
  213. package/templates/create/deckbuilder-2d/assets/starter/README.md +11 -0
  214. package/templates/create/deckbuilder-2d/assets/ui/.gitkeep +1 -0
  215. package/templates/create/deckbuilder-2d/aura.config.json +28 -0
  216. package/templates/create/deckbuilder-2d/config/gameplay/deckbuilder.config.js +26 -0
  217. package/templates/create/deckbuilder-2d/content/cards/guard.card.js +19 -0
  218. package/templates/create/deckbuilder-2d/content/cards/spark.card.js +20 -0
  219. package/templates/create/deckbuilder-2d/content/cards/starter.deck.js +69 -0
  220. package/templates/create/deckbuilder-2d/content/cards/strike.card.js +19 -0
  221. package/templates/create/deckbuilder-2d/content/cards/survey.card.js +20 -0
  222. package/templates/create/deckbuilder-2d/content/encounters/training-battle.encounter.js +14 -0
  223. package/templates/create/deckbuilder-2d/content/encounters/training-battle.js +65 -0
  224. package/templates/create/deckbuilder-2d/content/enemies/training-automaton.enemy.js +48 -0
  225. package/templates/create/deckbuilder-2d/content/gameplay/.gitkeep +1 -0
  226. package/templates/create/deckbuilder-2d/content/registries/cards.registry.js +26 -0
  227. package/templates/create/deckbuilder-2d/content/registries/encounters.registry.js +20 -0
  228. package/templates/create/deckbuilder-2d/content/registries/enemies.registry.js +20 -0
  229. package/templates/create/deckbuilder-2d/content/registries/relics.registry.js +20 -0
  230. package/templates/create/deckbuilder-2d/content/relics/ember-charm.relic.js +18 -0
  231. package/templates/create/deckbuilder-2d/docs/design/loop.md +12 -0
  232. package/templates/create/deckbuilder-2d/prefabs/.gitkeep +1 -0
  233. package/templates/create/deckbuilder-2d/scenes/boot.scene.js +84 -0
  234. package/templates/create/deckbuilder-2d/scenes/gameplay.scene.js +641 -0
  235. package/templates/create/deckbuilder-2d/src/components/.gitkeep +1 -0
  236. package/templates/create/deckbuilder-2d/src/main.js +17 -0
  237. package/templates/create/deckbuilder-2d/src/runtime/capabilities.js +22 -0
  238. package/templates/create/deckbuilder-2d/src/shared/.gitkeep +1 -0
  239. package/templates/create/deckbuilder-2d/src/systems/.gitkeep +1 -0
  240. package/templates/create/deckbuilder-2d/tests/smoke/.gitkeep +1 -0
  241. package/templates/create/deckbuilder-2d/ui/hud.screen.js +80 -0
  242. package/templates/create/deckbuilder-2d/ui/pause.screen.js +146 -0
  243. package/templates/create/deckbuilder-2d/ui/settings.screen.js +342 -0
  244. package/templates/create/local-multiplayer/aura.config.json +40 -0
  245. package/templates/create/local-multiplayer/config/gameplay/local-multiplayer.config.js +26 -0
  246. package/templates/create/local-multiplayer/content/gameplay/room-layout.js +13 -0
  247. package/templates/create/local-multiplayer/content/registries/.gitkeep +1 -0
  248. package/templates/create/local-multiplayer/docs/design/loop.md +14 -0
  249. package/templates/create/local-multiplayer/prefabs/player.prefab.js +99 -0
  250. package/templates/create/local-multiplayer/scenes/boot.scene.js +12 -0
  251. package/templates/create/local-multiplayer/scenes/gameplay.scene.js +443 -0
  252. package/templates/create/local-multiplayer/src/main.js +17 -0
  253. package/templates/create/local-multiplayer/src/runtime/capabilities.js +28 -0
  254. package/templates/create/local-multiplayer/ui/hud.screen.js +60 -0
  255. package/templates/create/shared/src/runtime/project-inspector.js +105 -0
  256. package/templates/create/shared/src/runtime/scene-flow.js +290 -0
  257. package/templates/create/shared/src/runtime/screen-shell.js +222 -0
  258. package/templates/create/shared/src/runtime/ui-forms.js +209 -0
  259. package/templates/create/shared/src/runtime/ui-settings.js +237 -0
  260. package/templates/create/shared/src/runtime/ui-theme.js +352 -0
  261. package/templates/create/shared/src/starter-utils/adventure-objectives.js +102 -0
  262. package/templates/create/shared/src/starter-utils/animation-2d.js +337 -0
  263. package/templates/create/shared/src/starter-utils/avatar-3d.js +404 -0
  264. package/templates/create/shared/src/starter-utils/combat-feedback-2d.js +320 -0
  265. package/templates/create/shared/src/starter-utils/core.js +39 -3
  266. package/templates/create/shared/src/starter-utils/index.js +8 -2
  267. package/templates/create/shared/src/starter-utils/platformer-3d.js +34 -3
  268. package/templates/create/shared/src/starter-utils/triggers.js +662 -0
  269. package/templates/create/shared/src/starter-utils/tween-2d.js +615 -0
  270. package/templates/create/video-cutscene/assets/video/.gitkeep +0 -0
  271. package/templates/create/video-cutscene/aura.config.json +28 -0
  272. package/templates/create/video-cutscene/config/gameplay/.gitkeep +0 -0
  273. package/templates/create/video-cutscene/content/gameplay/.gitkeep +0 -0
  274. package/templates/create/video-cutscene/content/registries/.gitkeep +0 -0
  275. package/templates/create/video-cutscene/docs/design/loop.md +22 -0
  276. package/templates/create/video-cutscene/prefabs/.gitkeep +0 -0
  277. package/templates/create/video-cutscene/scenes/boot.scene.js +11 -0
  278. package/templates/create/video-cutscene/scenes/cutscene.scene.js +113 -0
  279. package/templates/create/video-cutscene/scenes/gameplay.scene.js +50 -0
  280. package/templates/create/video-cutscene/src/main.js +17 -0
  281. package/templates/create/video-cutscene/src/runtime/app.js +52 -0
  282. package/templates/create/video-cutscene/src/runtime/capabilities.js +35 -0
  283. package/templates/create/video-cutscene/src/runtime/state.js +13 -0
  284. package/templates/create/video-cutscene/ui/.gitkeep +0 -0
  285. package/templates/create-bin/play.js +1187 -0
  286. package/templates/make/README.md +46 -0
  287. package/templates/make/catalog.json +51 -0
  288. package/templates/make/component/files/{{MAKE_NAME}}.component.js +20 -0
  289. package/templates/make/component/manifest.json +9 -0
  290. package/templates/make/data/files/{{MAKE_NAME}}.json +14 -0
  291. package/templates/make/data/manifest.json +9 -0
  292. package/templates/make/material/files/{{MAKE_NAME}}.material.json +17 -0
  293. package/templates/make/material/manifest.json +9 -0
  294. package/templates/make/prefab/files/{{MAKE_NAME}}.prefab.js +20 -0
  295. package/templates/make/prefab/manifest.json +9 -0
  296. package/templates/make/scene/files/{{MAKE_NAME}}.scene.js +31 -0
  297. package/templates/make/scene/manifest.json +9 -0
  298. package/templates/make/shader/files/{{MAKE_NAME}}.shader.js +23 -0
  299. package/templates/make/shader/manifest.json +9 -0
  300. package/templates/make/system/files/{{MAKE_NAME}}.system.js +15 -0
  301. package/templates/make/system/manifest.json +9 -0
  302. package/templates/make/ui-screen/files/{{MAKE_NAME}}.screen.js +16 -0
  303. package/templates/make/ui-screen/files/{{MAKE_NAME}}.screen.json +23 -0
  304. package/templates/make/ui-screen/manifest.json +10 -0
  305. package/templates/make-starters/deckbuilder-2d/card/files/{{MAKE_NAME}}.card.js +22 -0
  306. package/templates/make-starters/deckbuilder-2d/card/manifest.json +9 -0
  307. package/templates/make-starters/deckbuilder-2d/catalog.json +34 -0
  308. package/templates/make-starters/deckbuilder-2d/encounter/files/{{MAKE_NAME}}.encounter.js +18 -0
  309. package/templates/make-starters/deckbuilder-2d/encounter/manifest.json +9 -0
  310. package/templates/make-starters/deckbuilder-2d/enemy/files/{{MAKE_NAME}}.enemy.js +28 -0
  311. package/templates/make-starters/deckbuilder-2d/enemy/manifest.json +9 -0
  312. package/templates/make-starters/deckbuilder-2d/relic/files/{{MAKE_NAME}}.relic.js +23 -0
  313. package/templates/make-starters/deckbuilder-2d/relic/manifest.json +9 -0
  314. package/templates/retro/platformer/README.md +10 -0
  315. package/templates/retro/platformer/assets/retro/assets.json +91 -0
  316. package/templates/retro/platformer/aura.config.json +7 -0
  317. package/templates/retro/platformer/package.json +5 -0
  318. package/templates/retro/platformer/src/main.js +40 -0
  319. package/templates/retro/puzzle-grid/README.md +10 -0
  320. package/templates/retro/puzzle-grid/assets/retro/assets.json +90 -0
  321. package/templates/retro/puzzle-grid/aura.config.json +7 -0
  322. package/templates/retro/puzzle-grid/package.json +5 -0
  323. package/templates/retro/puzzle-grid/src/main.js +29 -0
  324. package/templates/retro/tactics-grid/README.md +10 -0
  325. package/templates/retro/tactics-grid/assets/retro/assets.json +90 -0
  326. package/templates/retro/tactics-grid/aura.config.json +7 -0
  327. package/templates/retro/tactics-grid/package.json +5 -0
  328. package/templates/retro/tactics-grid/src/main.js +35 -0
  329. package/templates/retro/topdown-adventure/README.md +10 -0
  330. package/templates/retro/topdown-adventure/assets/retro/assets.json +95 -0
  331. package/templates/retro/topdown-adventure/aura.config.json +7 -0
  332. package/templates/retro/topdown-adventure/package.json +5 -0
  333. package/templates/retro/topdown-adventure/src/main.js +29 -0
  334. package/templates/skills/aurajs/SKILL.md +61 -5
@@ -0,0 +1,363 @@
1
+ import { existsSync, writeFileSync, readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { buildAuthoringBackedGbaRuntimeSource } from './authoring.mjs';
5
+
6
+ const MIN_ROM_SIZE_BYTES = 32 * 1024;
7
+ const LINK_ROM_SIZE_BYTES = 4 * 1024 * 1024;
8
+ const MAX_ROM_SIZE_BYTES = 32 * 1024 * 1024;
9
+ const ROM_ENTRY_OFFSET = 0x0000;
10
+ const HEADER_LOGO_OFFSET = 0x0004;
11
+ const HEADER_TITLE_OFFSET = 0x00A0;
12
+ const HEADER_TITLE_END = 0x00AB;
13
+ const HEADER_GAME_CODE_OFFSET = 0x00AC;
14
+ const HEADER_GAME_CODE_END = 0x00AF;
15
+ const HEADER_MAKER_CODE_OFFSET = 0x00B0;
16
+ const HEADER_MAKER_CODE_END = 0x00B1;
17
+ const HEADER_FIXED_VALUE_OFFSET = 0x00B2;
18
+ const HEADER_MAIN_UNIT_CODE_OFFSET = 0x00B3;
19
+ const HEADER_DEVICE_TYPE_OFFSET = 0x00B4;
20
+ const HEADER_SOFTWARE_VERSION_OFFSET = 0x00BC;
21
+ const HEADER_COMPLEMENT_CHECK_OFFSET = 0x00BD;
22
+ const ROM_CODE_OFFSET = 0x00C0;
23
+
24
+ const NINTENDO_LOGO = Uint8Array.from([
25
+ 0x24, 0xFF, 0xAE, 0x51, 0x69, 0x9A, 0xA2, 0x21,
26
+ 0x3D, 0x84, 0x82, 0x0A, 0x84, 0xE4, 0x09, 0xAD,
27
+ 0x11, 0x24, 0x8B, 0x98, 0xC0, 0x81, 0x7F, 0x21,
28
+ 0xA3, 0x52, 0xBE, 0x19, 0x93, 0x09, 0xCE, 0x20,
29
+ 0x10, 0x46, 0x4A, 0x4A, 0xF8, 0x27, 0x31, 0xEC,
30
+ 0x58, 0xC7, 0xE8, 0x33, 0x82, 0xE3, 0xCE, 0xBF,
31
+ 0x85, 0xF4, 0xDF, 0x94, 0xCE, 0x4B, 0x09, 0xC1,
32
+ 0x94, 0x56, 0x8A, 0xC0, 0x13, 0x72, 0xA7, 0xFC,
33
+ 0x9F, 0x84, 0x4D, 0x73, 0xA3, 0xCA, 0x9A, 0x61,
34
+ 0x58, 0x97, 0xA3, 0x27, 0xFC, 0x03, 0x98, 0x76,
35
+ 0x23, 0x1D, 0xC7, 0x61, 0x03, 0x04, 0xAE, 0x56,
36
+ 0xBF, 0x38, 0x84, 0x00, 0x40, 0xA7, 0x0E, 0xFD,
37
+ 0xFF, 0x52, 0xFE, 0x03, 0x6F, 0x95, 0x30, 0xF1,
38
+ 0x97, 0xFB, 0xC0, 0x85, 0x60, 0xD6, 0x80, 0x25,
39
+ 0xA9, 0x63, 0xBE, 0x03, 0x01, 0x4E, 0x38, 0xE2,
40
+ 0xF9, 0xA2, 0x34, 0xFF, 0xBB, 0x3E, 0x03, 0x44,
41
+ 0x78, 0x00, 0x90, 0xCB, 0x88, 0x11, 0x3A, 0x94,
42
+ 0x65, 0xC0, 0x7C, 0x63, 0x87, 0xF0, 0x3C, 0xAF,
43
+ 0xD6, 0x25, 0xE4, 0x8B, 0x38, 0x0A, 0xAC, 0x72,
44
+ 0x21, 0xD4, 0xF8, 0x07,
45
+ ]);
46
+
47
+ function normalizeTitle(identity) {
48
+ const raw = String(identity?.name || identity?.executableBaseName || 'AURA RETRO')
49
+ .toUpperCase()
50
+ .replace(/[^A-Z0-9 _.-]/g, ' ')
51
+ .replace(/\s+/g, ' ')
52
+ .trim();
53
+ return raw.slice(0, HEADER_TITLE_END - HEADER_TITLE_OFFSET + 1);
54
+ }
55
+
56
+ function normalizeGameCode(identity) {
57
+ const stem = String(identity?.executableBaseName || identity?.name || 'AURA')
58
+ .toUpperCase()
59
+ .replace(/[^A-Z0-9]/g, '');
60
+ const middle = stem.slice(0, 2).padEnd(2, 'A');
61
+ return `A${middle}E`.slice(0, HEADER_GAME_CODE_END - HEADER_GAME_CODE_OFFSET + 1);
62
+ }
63
+
64
+ function writeAsciiField(rom, offset, endOffset, value) {
65
+ const bytes = Buffer.from(String(value || ''), 'ascii');
66
+ bytes.copy(rom, offset, 0, Math.min(bytes.length, endOffset - offset + 1));
67
+ }
68
+
69
+ function encodeArmBranch(sourceOffset, targetOffset) {
70
+ const delta = targetOffset - (sourceOffset + 8);
71
+ const word = (0xEA000000 | ((delta >> 2) & 0x00FFFFFF)) >>> 0;
72
+ return word;
73
+ }
74
+
75
+ function writeArmBranch(rom, sourceOffset, targetOffset) {
76
+ rom.writeUInt32LE(encodeArmBranch(sourceOffset, targetOffset), sourceOffset);
77
+ }
78
+
79
+ function createPlayableGbaRuntimeSource({ identity }) {
80
+ return [
81
+ 'typedef unsigned int u32;',
82
+ 'typedef unsigned short u16;',
83
+ '#define REG_DISPCNT (*(volatile u32*)0x04000000)',
84
+ '#define REG_VCOUNT (*(volatile u16*)0x04000006)',
85
+ '#define REG_KEYINPUT (*(volatile u16*)0x04000130)',
86
+ '#define VRAM ((volatile u16*)0x06000000)',
87
+ '#define MODE3 0x0003',
88
+ '#define BG2_ENABLE 0x0400',
89
+ '#define KEY_RIGHT 0x0010',
90
+ '#define KEY_LEFT 0x0020',
91
+ '#define KEY_UP 0x0040',
92
+ '#define KEY_DOWN 0x0080',
93
+ '#define RGB15(r,g,b) ((u16)((r) | ((g) << 5) | ((b) << 10)))',
94
+ '',
95
+ `/* Aura Retro GBA toy runtime for ${String(identity?.name || 'Aura Retro').replace(/\*\//g, '')}. */`,
96
+ '',
97
+ 'static inline void wait_vblank(void) {',
98
+ ' while (REG_VCOUNT >= 160) {}',
99
+ ' while (REG_VCOUNT < 160) {}',
100
+ '}',
101
+ '',
102
+ 'static inline int clamp_i(int value, int lo, int hi) {',
103
+ ' if (value < lo) return lo;',
104
+ ' if (value > hi) return hi;',
105
+ ' return value;',
106
+ '}',
107
+ '',
108
+ 'static void fill_screen(u16 color) {',
109
+ ' for (int index = 0; index < 240 * 160; index += 1) {',
110
+ ' VRAM[index] = color;',
111
+ ' }',
112
+ '}',
113
+ '',
114
+ 'static void draw_rect(int x, int y, int w, int h, u16 color) {',
115
+ ' int x0 = clamp_i(x, 0, 239);',
116
+ ' int y0 = clamp_i(y, 0, 159);',
117
+ ' int x1 = clamp_i(x + w, 0, 240);',
118
+ ' int y1 = clamp_i(y + h, 0, 160);',
119
+ ' for (int row = y0; row < y1; row += 1) {',
120
+ ' int offset = row * 240;',
121
+ ' for (int col = x0; col < x1; col += 1) {',
122
+ ' VRAM[offset + col] = color;',
123
+ ' }',
124
+ ' }',
125
+ '}',
126
+ '',
127
+ 'static int overlaps(int ax, int ay, int aw, int ah, int bx, int by, int bw, int bh) {',
128
+ ' return ax < (bx + bw) && (ax + aw) > bx && ay < (by + bh) && (ay + ah) > by;',
129
+ '}',
130
+ '',
131
+ 'void game_main(void) {',
132
+ ' int px = 24;',
133
+ ' int py = 24;',
134
+ ' int gx = 176;',
135
+ ' int gy = 104;',
136
+ ' int score = 0;',
137
+ ' int flash = 0;',
138
+ ' REG_DISPCNT = MODE3 | BG2_ENABLE;',
139
+ ' for (;;) {',
140
+ ' wait_vblank();',
141
+ ' u16 keys = (u16)(~REG_KEYINPUT) & 0x03FF;',
142
+ ' if (keys & KEY_LEFT) px -= 2;',
143
+ ' if (keys & KEY_RIGHT) px += 2;',
144
+ ' if (keys & KEY_UP) py -= 2;',
145
+ ' if (keys & KEY_DOWN) py += 2;',
146
+ ' px = clamp_i(px, 8, 220);',
147
+ ' py = clamp_i(py, 16, 140);',
148
+ ' if (overlaps(px, py, 12, 12, gx, gy, 12, 12)) {',
149
+ ' score += 1;',
150
+ ' flash = 10;',
151
+ ' gx += 37;',
152
+ ' gy += 23;',
153
+ ' if (gx > 208) gx = 24;',
154
+ ' if (gy > 136) gy = 24;',
155
+ ' }',
156
+ ' u16 bg = flash > 0 ? RGB15(2, 2, 8) : RGB15(0, 0, 0);',
157
+ ' if (flash > 0) flash -= 1;',
158
+ ' fill_screen(bg);',
159
+ ' draw_rect(6, 6, 12 + ((score & 15) * 8), 6, RGB15(31, 24, 0));',
160
+ ' draw_rect(gx, gy, 12, 12, RGB15(0, 31, 0));',
161
+ ' draw_rect(px, py, 12, 12, RGB15(31, 0, 0));',
162
+ ' }',
163
+ '}',
164
+ '',
165
+ '__attribute__((naked, section(".start"))) void _start(void) {',
166
+ ' __asm__ volatile(',
167
+ ' "ldr sp, =0x03007f00\\n"',
168
+ ' "bl game_main\\n"',
169
+ ' "b .\\n"',
170
+ ' );',
171
+ '}',
172
+ '',
173
+ ].join('\n');
174
+ }
175
+
176
+ function createGbaLinkerScript() {
177
+ return [
178
+ 'ENTRY(_start)',
179
+ 'MEMORY {',
180
+ ` rom (rx) : ORIGIN = 0x080000C0, LENGTH = ${LINK_ROM_SIZE_BYTES} - 0x0C0`,
181
+ ' iwram (rwx) : ORIGIN = 0x03000000, LENGTH = 32K',
182
+ '}',
183
+ 'SECTIONS {',
184
+ ' .text : { KEEP(*(.start)) *(.text*) *(.rodata*) } > rom',
185
+ ' .bss (NOLOAD) : { *(.bss*) *(COMMON) } > iwram',
186
+ ' /DISCARD/ : { *(.ARM.exidx*) *(.comment*) *(.note*) *(.eh_frame*) *(.ARM.attributes) *(.data*) }',
187
+ '}',
188
+ '',
189
+ ].join('\n');
190
+ }
191
+
192
+ function resolveToolBinary(candidates = []) {
193
+ for (const candidate of candidates) {
194
+ if (candidate && existsSync(candidate)) {
195
+ return candidate;
196
+ }
197
+ }
198
+ return null;
199
+ }
200
+
201
+ export function resolveGameBoyAdvanceCompileToolchain() {
202
+ const clangPath = resolveToolBinary([
203
+ process.env.AURA_RETRO_GBA_CLANG,
204
+ '/opt/homebrew/opt/llvm/bin/clang',
205
+ ]);
206
+ const lldPath = resolveToolBinary([
207
+ process.env.AURA_RETRO_GBA_LLD,
208
+ '/opt/homebrew/opt/lld/bin/ld.lld',
209
+ ]);
210
+ const objcopyPath = resolveToolBinary([
211
+ process.env.AURA_RETRO_GBA_OBJCOPY,
212
+ '/opt/homebrew/opt/llvm/bin/llvm-objcopy',
213
+ ]);
214
+ const available = Boolean(clangPath && lldPath && objcopyPath);
215
+ return {
216
+ available,
217
+ clangPath,
218
+ lldPath,
219
+ objcopyPath,
220
+ };
221
+ }
222
+
223
+ function runToolchainStep(command, args) {
224
+ const result = spawnSync(command, args, {
225
+ encoding: 'utf8',
226
+ });
227
+ if (result.status !== 0) {
228
+ const detail = [result.stdout, result.stderr].filter(Boolean).join('\n').trim();
229
+ throw new Error(detail || `${command} failed with exit code ${result.status}`);
230
+ }
231
+ }
232
+
233
+ export function buildPlayableGameBoyAdvancePayload({
234
+ identity,
235
+ generatedDir,
236
+ entryFile,
237
+ ir,
238
+ assets,
239
+ logOutput = false,
240
+ }) {
241
+ const toolchain = resolveGameBoyAdvanceCompileToolchain();
242
+ if (!toolchain.available) {
243
+ return {
244
+ ok: false,
245
+ mode: 'header-stub',
246
+ toolchain,
247
+ };
248
+ }
249
+
250
+ const runtimeSourcePath = resolve(generatedDir, 'cartridge-runtime-gba.c');
251
+ const linkerScriptPath = resolve(generatedDir, 'cartridge-runtime-gba.ld');
252
+ const objectPath = resolve(generatedDir, 'cartridge-runtime-gba.o');
253
+ const elfPath = resolve(generatedDir, 'cartridge-runtime-gba.elf');
254
+ const binaryPath = resolve(generatedDir, 'cartridge-runtime-gba.bin');
255
+ const runtimeSource = buildAuthoringBackedGbaRuntimeSource({
256
+ entryFile,
257
+ identity,
258
+ ir,
259
+ assets,
260
+ });
261
+
262
+ writeFileSync(runtimeSourcePath, runtimeSource, 'utf8');
263
+ writeFileSync(linkerScriptPath, createGbaLinkerScript(), 'utf8');
264
+
265
+ if (logOutput) {
266
+ console.log(' aura build: compiling GBA runtime source...');
267
+ }
268
+ runToolchainStep(toolchain.clangPath, [
269
+ '-target', 'armv4t-none-eabi',
270
+ '-mcpu=arm7tdmi',
271
+ '-marm',
272
+ '-ffreestanding',
273
+ '-fno-builtin',
274
+ '-fomit-frame-pointer',
275
+ '-fno-unwind-tables',
276
+ '-fno-asynchronous-unwind-tables',
277
+ '-fno-stack-protector',
278
+ '-Os',
279
+ '-nostdlib',
280
+ '-c',
281
+ runtimeSourcePath,
282
+ '-o',
283
+ objectPath,
284
+ ]);
285
+ if (logOutput) {
286
+ console.log(' aura build: linking GBA runtime...');
287
+ }
288
+ runToolchainStep(toolchain.lldPath, [
289
+ '-T',
290
+ linkerScriptPath,
291
+ objectPath,
292
+ '-o',
293
+ elfPath,
294
+ ]);
295
+ if (logOutput) {
296
+ console.log(' aura build: extracting GBA cartridge payload...');
297
+ }
298
+ runToolchainStep(toolchain.objcopyPath, [
299
+ '-O',
300
+ 'binary',
301
+ elfPath,
302
+ binaryPath,
303
+ ]);
304
+
305
+ return {
306
+ ok: true,
307
+ mode: 'toolchain-compiled-authored-runtime',
308
+ toolchain,
309
+ runtimeSourcePath,
310
+ linkerScriptPath,
311
+ objectPath,
312
+ elfPath,
313
+ binaryPath,
314
+ payload: readFileSync(binaryPath),
315
+ };
316
+ }
317
+
318
+ export function computeGbaHeaderComplementCheck(rom) {
319
+ let checksum = 0;
320
+ for (let address = HEADER_TITLE_OFFSET; address <= HEADER_SOFTWARE_VERSION_OFFSET; address += 1) {
321
+ checksum = (checksum - rom[address]) & 0xFF;
322
+ }
323
+ return (checksum - 0x19) & 0xFF;
324
+ }
325
+
326
+ function roundUpToPowerOfTwo(value) {
327
+ let size = MIN_ROM_SIZE_BYTES;
328
+ while (size < value && size < MAX_ROM_SIZE_BYTES) {
329
+ size <<= 1;
330
+ }
331
+ return Math.min(size, MAX_ROM_SIZE_BYTES);
332
+ }
333
+
334
+ export function buildGameBoyAdvanceRom({ identity, targetProfile, ir, payload = null }) {
335
+ const normalizedPayload = Buffer.isBuffer(payload) ? payload : null;
336
+ const romSize = normalizedPayload && normalizedPayload.length > 0
337
+ ? roundUpToPowerOfTwo(ROM_CODE_OFFSET + normalizedPayload.length)
338
+ : MIN_ROM_SIZE_BYTES;
339
+ const rom = Buffer.alloc(romSize, 0x00);
340
+
341
+ writeArmBranch(rom, ROM_ENTRY_OFFSET, ROM_CODE_OFFSET);
342
+ Buffer.from(NINTENDO_LOGO).copy(rom, HEADER_LOGO_OFFSET);
343
+ writeAsciiField(rom, HEADER_TITLE_OFFSET, HEADER_TITLE_END, normalizeTitle(identity));
344
+ writeAsciiField(rom, HEADER_GAME_CODE_OFFSET, HEADER_GAME_CODE_END, normalizeGameCode(identity));
345
+ writeAsciiField(rom, HEADER_MAKER_CODE_OFFSET, HEADER_MAKER_CODE_END, 'HB');
346
+ rom[HEADER_FIXED_VALUE_OFFSET] = 0x96;
347
+ rom[HEADER_MAIN_UNIT_CODE_OFFSET] = 0x00;
348
+ rom[HEADER_DEVICE_TYPE_OFFSET] = 0x00;
349
+ rom[HEADER_SOFTWARE_VERSION_OFFSET] = 0x00;
350
+ rom[HEADER_COMPLEMENT_CHECK_OFFSET] = computeGbaHeaderComplementCheck(rom);
351
+
352
+ if (normalizedPayload && normalizedPayload.length > 0) {
353
+ normalizedPayload.copy(rom, ROM_CODE_OFFSET, 0, Math.min(normalizedPayload.length, rom.length - ROM_CODE_OFFSET));
354
+ } else {
355
+ writeArmBranch(rom, ROM_CODE_OFFSET, ROM_CODE_OFFSET);
356
+ const trace = Buffer.from(
357
+ `AURA:${targetProfile.target}:${ir.moduleCount}:${ir.runtimeOwnership.handles.join(',')}`,
358
+ 'ascii',
359
+ );
360
+ trace.copy(rom, ROM_CODE_OFFSET + 4, 0, Math.min(trace.length, 160));
361
+ }
362
+ return rom;
363
+ }
@@ -0,0 +1,85 @@
1
+ const ROM_SIZE_BYTES = 32 * 1024;
2
+ const ENTRY_POINT_OFFSET = 0x0100;
3
+ const ROM_BODY_OFFSET = 0x0150;
4
+ const HEADER_TITLE_START = 0x0134;
5
+ const HEADER_TITLE_END = 0x0142;
6
+ const HEADER_CGB_FLAG = 0x0143;
7
+ const HEADER_CHECKSUM_OFFSET = 0x014D;
8
+ const GLOBAL_CHECKSUM_OFFSET = 0x014E;
9
+
10
+ const NINTENDO_LOGO = Uint8Array.from([
11
+ 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B,
12
+ 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D,
13
+ 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,
14
+ 0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99,
15
+ 0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC,
16
+ 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E,
17
+ ]);
18
+
19
+ export function computeHeaderChecksum(rom) {
20
+ let checksum = 0;
21
+ for (let address = 0x0134; address <= 0x014C; address += 1) {
22
+ checksum = (checksum - rom[address] - 1) & 0xFF;
23
+ }
24
+ return checksum;
25
+ }
26
+
27
+ export function computeGlobalChecksum(rom) {
28
+ let checksum = 0;
29
+ for (let index = 0; index < rom.length; index += 1) {
30
+ if (index === GLOBAL_CHECKSUM_OFFSET || index === (GLOBAL_CHECKSUM_OFFSET + 1)) {
31
+ continue;
32
+ }
33
+ checksum = (checksum + rom[index]) & 0xFFFF;
34
+ }
35
+ return checksum;
36
+ }
37
+
38
+ function normalizeTitle(identity) {
39
+ const raw = String(identity?.name || identity?.executableBaseName || 'AURA RETRO')
40
+ .toUpperCase()
41
+ .replace(/[^A-Z0-9 _.-]/g, ' ')
42
+ .replace(/\s+/g, ' ')
43
+ .trim();
44
+ return raw.slice(0, HEADER_TITLE_END - HEADER_TITLE_START + 1);
45
+ }
46
+
47
+ export function buildGameBoyRom({ identity, targetProfile, ir }) {
48
+ const rom = Buffer.alloc(ROM_SIZE_BYTES, 0x00);
49
+ rom[ENTRY_POINT_OFFSET + 0] = 0x00; // nop
50
+ rom[ENTRY_POINT_OFFSET + 1] = 0xC3; // jp $0150
51
+ rom[ENTRY_POINT_OFFSET + 2] = 0x50;
52
+ rom[ENTRY_POINT_OFFSET + 3] = 0x01;
53
+
54
+ Buffer.from(NINTENDO_LOGO).copy(rom, 0x0104);
55
+
56
+ const title = Buffer.from(normalizeTitle(identity), 'ascii');
57
+ title.copy(rom, HEADER_TITLE_START, 0, Math.min(title.length, HEADER_TITLE_END - HEADER_TITLE_START + 1));
58
+ rom[HEADER_CGB_FLAG] = targetProfile.target === 'gbc' ? 0x80 : 0x00;
59
+ rom[0x0144] = 0x00;
60
+ rom[0x0145] = 0x00;
61
+ rom[0x0146] = 0x00; // no SGB features
62
+ rom[0x0147] = 0x00; // ROM only
63
+ rom[0x0148] = 0x00; // 32 KiB
64
+ rom[0x0149] = 0x00; // no RAM
65
+ rom[0x014A] = 0x01; // overseas
66
+ rom[0x014B] = 0x00; // no old licensee
67
+ rom[0x014C] = 0x00; // version
68
+
69
+ // Minimal loop body. Future lowering can replace this with generated code.
70
+ rom[ROM_BODY_OFFSET + 0] = 0x18; // jr -2
71
+ rom[ROM_BODY_OFFSET + 1] = 0xFE;
72
+
73
+ // Encode a tiny trace of the validated build in an unused ROM region after the loop.
74
+ const trace = Buffer.from(
75
+ `AURA:${targetProfile.target}:${ir.moduleCount}:${ir.runtimeOwnership.handles.join(',')}`,
76
+ 'ascii',
77
+ );
78
+ trace.copy(rom, ROM_BODY_OFFSET + 2, 0, Math.min(trace.length, 96));
79
+
80
+ rom[HEADER_CHECKSUM_OFFSET] = computeHeaderChecksum(rom);
81
+ const globalChecksum = computeGlobalChecksum(rom);
82
+ rom[GLOBAL_CHECKSUM_OFFSET] = (globalChecksum >> 8) & 0xFF;
83
+ rom[GLOBAL_CHECKSUM_OFFSET + 1] = globalChecksum & 0xFF;
84
+ return rom;
85
+ }