@reicek/neataptic-ts 0.1.21 → 0.1.23

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 (361) hide show
  1. package/.github/agents/boundary-mapper.agent.md +31 -0
  2. package/.github/agents/docs-scout.agent.md +29 -0
  3. package/.github/agents/plan-scout.agent.md +31 -0
  4. package/.github/agents/solid-split.agent.md +143 -0
  5. package/.github/copilot-instructions.md +119 -0
  6. package/.github/skills/solid-split-playbook/SKILL.md +220 -0
  7. package/.github/skills/solid-split-playbook/assets/docs-checklist.md +34 -0
  8. package/.github/skills/solid-split-playbook/assets/split-plan-template.md +48 -0
  9. package/.github/skills/solid-split-playbook/assets/split-workflow-checklist.md +51 -0
  10. package/.github/skills/trace-analyzer-extension/SKILL.md +63 -0
  11. package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +24 -0
  12. package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +101 -0
  13. package/.github/skills/trace-audit-reporting/SKILL.md +96 -0
  14. package/.github/skills/trace-audit-reporting/assets/performance-report-template.md +123 -0
  15. package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +132 -0
  16. package/package.json +7 -3
  17. package/plans/ES2023 migration +13 -8
  18. package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
  19. package/plans/Flappy_Bird_Folder_Documentation_Pass.md +53 -0
  20. package/plans/Flappy_Evolution_Worker_Documentation_Pass.md +58 -0
  21. package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
  22. package/plans/Memory_Optimization.md +3 -3
  23. package/plans/README.md +63 -0
  24. package/plans/Roadmap.md +15 -3
  25. package/plans/asciiMaze_SOLID_split.done.md +130 -0
  26. package/plans/flappy_bird_SOLID_split.done.md +67 -0
  27. package/scripts/analyze-trace.ts +590 -0
  28. package/scripts/assets/theme.css +221 -34
  29. package/scripts/copy-examples.mjs +9 -5
  30. package/scripts/export-onnx.mjs +3 -3
  31. package/scripts/generate-bench-tables.mjs +10 -10
  32. package/scripts/generate-bench-tables.ts +10 -10
  33. package/scripts/generate-docs.ts +1415 -449
  34. package/scripts/render-docs-html.ts +15 -8
  35. package/src/README.md +127 -222
  36. package/src/architecture/README.md +117 -184
  37. package/src/architecture/architect.ts +6 -0
  38. package/src/architecture/layer/README.md +38 -38
  39. package/src/architecture/network/README.md +49 -31
  40. package/src/architecture/network/activate/README.md +77 -77
  41. package/src/architecture/network/connect/README.md +15 -13
  42. package/src/architecture/network/deterministic/README.md +7 -7
  43. package/src/architecture/network/evolve/README.md +44 -44
  44. package/src/architecture/network/gating/README.md +20 -20
  45. package/src/architecture/network/genetic/README.md +51 -51
  46. package/src/architecture/network/mutate/README.md +97 -97
  47. package/src/architecture/network/network.types.ts +39 -0
  48. package/src/architecture/network/onnx/README.md +264 -264
  49. package/src/architecture/network/prune/README.md +39 -39
  50. package/src/architecture/network/remove/README.md +26 -26
  51. package/src/architecture/network/serialize/README.md +56 -56
  52. package/src/architecture/network/serialize/network.serialize.json.utils.ts +1 -0
  53. package/src/architecture/network/serialize/network.serialize.utils.ts +6 -1
  54. package/src/architecture/network/serialize/network.serialize.utils.types.ts +1 -1
  55. package/src/architecture/network/slab/README.md +61 -61
  56. package/src/architecture/network/standalone/README.md +24 -24
  57. package/src/architecture/network/stats/README.md +9 -9
  58. package/src/architecture/network/topology/README.md +46 -46
  59. package/src/architecture/network/training/README.md +21 -21
  60. package/src/architecture/network.ts +114 -10
  61. package/src/methods/README.md +9 -87
  62. package/src/multithreading/README.md +8 -77
  63. package/src/multithreading/workers/README.md +2 -2
  64. package/src/multithreading/workers/browser/README.md +0 -6
  65. package/src/multithreading/workers/node/README.md +0 -3
  66. package/src/neat/README.md +623 -568
  67. package/src/neat/neat.evolve.population.utils.ts +29 -5
  68. package/src/neat/neat.helpers.ts +16 -0
  69. package/src/neat/neat.topology-intent.utils.ts +160 -0
  70. package/src/utils/README.md +18 -18
  71. package/test/examples/asciiMaze/README.md +59 -59
  72. package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
  73. package/test/examples/asciiMaze/browser-entry/README.md +196 -0
  74. package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
  75. package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
  76. package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
  77. package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
  78. package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
  79. package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
  80. package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
  81. package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
  82. package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
  83. package/test/examples/asciiMaze/browser-entry.ts +10 -576
  84. package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
  85. package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
  86. package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
  87. package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
  88. package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
  89. package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
  90. package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
  91. package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
  92. package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
  93. package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
  94. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
  95. package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
  96. package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
  97. package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
  98. package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
  99. package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
  100. package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
  101. package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
  102. package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
  103. package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
  104. package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
  105. package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
  106. package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
  107. package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
  108. package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
  109. package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
  110. package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
  111. package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
  112. package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
  113. package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
  114. package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
  115. package/test/examples/asciiMaze/fitness.ts +2 -2
  116. package/test/examples/asciiMaze/fitness.types.ts +65 -0
  117. package/test/examples/asciiMaze/interfaces.ts +64 -1352
  118. package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
  119. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
  120. package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
  121. package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
  122. package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
  123. package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
  124. package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
  125. package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
  126. package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
  127. package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
  128. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
  129. package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
  130. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
  131. package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
  132. package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
  133. package/test/examples/flappy_bird/README.md +193 -88
  134. package/test/examples/flappy_bird/browser-entry/README.md +1441 -0
  135. package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
  136. package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +9 -396
  137. package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +6 -714
  138. package/test/examples/flappy_bird/browser-entry/browser-entry.render.types.ts +26 -3
  139. package/test/examples/flappy_bird/browser-entry/browser-entry.runtime.types.ts +16 -1
  140. package/test/examples/flappy_bird/browser-entry/browser-entry.simulation.types.ts +39 -5
  141. package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
  142. package/test/examples/flappy_bird/browser-entry/browser-entry.stats.types.ts +32 -4
  143. package/test/examples/flappy_bird/browser-entry/browser-entry.ts +11 -0
  144. package/test/examples/flappy_bird/browser-entry/browser-entry.types.ts +8 -0
  145. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.types.ts +50 -7
  146. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +21 -893
  147. package/test/examples/flappy_bird/browser-entry/browser-entry.worker.types.ts +91 -10
  148. package/test/examples/flappy_bird/browser-entry/host/README.md +318 -0
  149. package/test/examples/flappy_bird/browser-entry/host/host.canvas.service.ts +16 -0
  150. package/test/examples/flappy_bird/browser-entry/host/host.constants.ts +20 -0
  151. package/test/examples/flappy_bird/browser-entry/host/host.dom.service.ts +10 -0
  152. package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
  153. package/test/examples/flappy_bird/browser-entry/host/host.stats.service.ts +14 -0
  154. package/test/examples/flappy_bird/browser-entry/host/host.ts +592 -6
  155. package/test/examples/flappy_bird/browser-entry/host/host.types.ts +13 -0
  156. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +309 -0
  157. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +47 -0
  158. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +392 -0
  159. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +132 -0
  160. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +92 -0
  161. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +272 -0
  162. package/test/examples/flappy_bird/browser-entry/network-view/README.md +389 -0
  163. package/test/examples/flappy_bird/browser-entry/network-view/network-view.draw.service.ts +13 -0
  164. package/test/examples/flappy_bird/browser-entry/network-view/network-view.labels.utils.ts +12 -0
  165. package/test/examples/flappy_bird/browser-entry/network-view/network-view.layout.utils.ts +14 -0
  166. package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +267 -0
  167. package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +823 -7
  168. package/test/examples/flappy_bird/browser-entry/network-view/network-view.types.ts +11 -0
  169. package/test/examples/flappy_bird/browser-entry/playback/README.md +845 -0
  170. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +355 -0
  171. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +1068 -0
  172. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.batch.services.ts +64 -0
  173. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +207 -0
  174. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +197 -0
  175. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.batch.utils.ts +114 -0
  176. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.test.ts +96 -0
  177. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.ts +204 -0
  178. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.services.ts +49 -0
  179. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +313 -0
  180. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.layer.services.ts +81 -0
  181. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.test.ts +33 -0
  182. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +201 -0
  183. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts +171 -0
  184. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.timing.utils.ts +124 -0
  185. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.test.ts +279 -0
  186. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +132 -0
  187. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.scene.services.ts +26 -0
  188. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +65 -0
  189. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
  190. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +342 -0
  191. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +10 -0
  192. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
  193. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +127 -0
  194. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.draw.services.ts +184 -0
  195. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.scene.services.ts +64 -0
  196. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +6 -0
  197. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
  198. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +105 -0
  199. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
  200. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +541 -0
  201. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.bird.utils.ts +180 -0
  202. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.canvas.services.ts +77 -0
  203. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.entity.services.ts +167 -0
  204. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.scene.services.ts +57 -0
  205. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.test.ts +176 -0
  206. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +113 -0
  207. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +35 -0
  208. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.trail.utils.ts +248 -0
  209. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +103 -0
  210. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +11 -0
  211. package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
  212. package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +10 -0
  213. package/test/examples/flappy_bird/browser-entry/playback/playback.iteration.services.ts +192 -0
  214. package/test/examples/flappy_bird/browser-entry/playback/playback.loop.service.ts +12 -0
  215. package/test/examples/flappy_bird/browser-entry/playback/playback.orchestration.types.ts +78 -0
  216. package/test/examples/flappy_bird/browser-entry/playback/playback.render.pipe-outline.service.ts +128 -0
  217. package/test/examples/flappy_bird/browser-entry/playback/playback.render.service.ts +1 -116
  218. package/test/examples/flappy_bird/browser-entry/playback/playback.session.services.ts +184 -0
  219. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.test.ts +121 -0
  220. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +8 -0
  221. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.layer.services.ts +36 -0
  222. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +11 -128
  223. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +268 -0
  224. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +91 -0
  225. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
  226. package/test/examples/flappy_bird/browser-entry/playback/playback.trail.utils.ts +9 -86
  227. package/test/examples/flappy_bird/browser-entry/playback/playback.ts +75 -7
  228. package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +12 -9
  229. package/test/examples/flappy_bird/browser-entry/playback/playback.worker-channel.utils.ts +11 -123
  230. package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +55 -0
  231. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.services.ts +103 -0
  232. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.test.ts +45 -0
  233. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.ts +28 -0
  234. package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +95 -0
  235. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.test.ts +35 -0
  236. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.ts +64 -0
  237. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.test.ts +37 -0
  238. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.ts +74 -0
  239. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +71 -0
  240. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.request.services.ts +45 -0
  241. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.summary.services.ts +74 -0
  242. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.types.ts +53 -0
  243. package/test/examples/flappy_bird/browser-entry/runtime/README.md +304 -0
  244. package/test/examples/flappy_bird/browser-entry/runtime/runtime.browser-globals.service.ts +15 -0
  245. package/test/examples/flappy_bird/browser-entry/runtime/runtime.errors.ts +17 -0
  246. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +56 -0
  247. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-loop.service.ts +19 -0
  248. package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +96 -0
  249. package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +92 -0
  250. package/test/examples/flappy_bird/browser-entry/runtime/runtime.telemetry.service.ts +24 -0
  251. package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
  252. package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +65 -0
  253. package/test/examples/flappy_bird/browser-entry/visualization/README.md +568 -0
  254. package/test/examples/flappy_bird/browser-entry/visualization/visualization.colors.utils.ts +26 -0
  255. package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
  256. package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +979 -19
  257. package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +157 -3
  258. package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +13 -27
  259. package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +7 -20
  260. package/test/examples/flappy_bird/browser-entry/visualization/visualization.types.ts +14 -0
  261. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +238 -0
  262. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.errors.ts +11 -0
  263. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.generation.service.ts +12 -0
  264. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.test.ts +143 -0
  265. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.ts +140 -14
  266. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.request.service.ts +27 -0
  267. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.ts +8 -0
  268. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.types.ts +23 -0
  269. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.url.service.ts +5 -0
  270. package/test/examples/flappy_bird/constants/README.md +1163 -0
  271. package/test/examples/flappy_bird/constants/constants.birds.ts +16 -38
  272. package/test/examples/flappy_bird/constants/constants.difficulty.ts +21 -0
  273. package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
  274. package/test/examples/flappy_bird/constants/constants.network.ts +1 -1
  275. package/test/examples/flappy_bird/constants/constants.observation.ts +7 -0
  276. package/test/examples/flappy_bird/constants/constants.palette.ts +9 -2
  277. package/test/examples/flappy_bird/constants/constants.physics.ts +9 -0
  278. package/test/examples/flappy_bird/constants/constants.pipe-render.ts +3 -0
  279. package/test/examples/flappy_bird/constants/constants.pipes.ts +22 -3
  280. package/test/examples/flappy_bird/constants/constants.runtime.ts +28 -4
  281. package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
  282. package/test/examples/flappy_bird/constants/constants.ts +6 -0
  283. package/test/examples/flappy_bird/environment/README.md +182 -0
  284. package/test/examples/flappy_bird/environment/environment.collision.utils.ts +7 -0
  285. package/test/examples/flappy_bird/environment/environment.constants.ts +16 -3
  286. package/test/examples/flappy_bird/environment/environment.observation.utils.ts +12 -19
  287. package/test/examples/flappy_bird/environment/environment.state.service.ts +10 -0
  288. package/test/examples/flappy_bird/environment/environment.step.service.ts +15 -66
  289. package/test/examples/flappy_bird/environment/environment.types.ts +14 -0
  290. package/test/examples/flappy_bird/evaluation/README.md +155 -0
  291. package/test/examples/flappy_bird/evaluation/evaluation.constants.ts +23 -4
  292. package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +16 -1
  293. package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +7 -374
  294. package/test/examples/flappy_bird/evaluation/evaluation.seed.utils.ts +4 -0
  295. package/test/examples/flappy_bird/evaluation/evaluation.types.ts +18 -2
  296. package/test/examples/flappy_bird/evaluation/rollout/README.md +355 -0
  297. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +38 -0
  298. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +71 -0
  299. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +338 -0
  300. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +69 -0
  301. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +399 -0
  302. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +845 -0
  303. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.constants.ts +49 -7
  304. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.errors.ts +34 -3
  305. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.evolution.service.ts +22 -0
  306. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +62 -26
  307. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.protocol.service.ts +27 -1
  308. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.runtime.service.ts +23 -0
  309. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +378 -0
  310. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +22 -0
  311. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +20 -203
  312. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.test.ts +94 -0
  313. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.ts +78 -13
  314. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +235 -344
  315. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.types.ts +170 -22
  316. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +314 -0
  317. package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +17 -0
  318. package/test/examples/flappy_bird/flappyEnvironment.ts +21 -0
  319. package/test/examples/flappy_bird/flappyEvaluation.ts +12 -0
  320. package/test/examples/flappy_bird/flappyEvolution.worker.ts +7 -0
  321. package/test/examples/flappy_bird/index.ts +8 -2
  322. package/test/examples/flappy_bird/rng.ts +10 -0
  323. package/test/examples/flappy_bird/simulation-shared/README.md +518 -0
  324. package/test/examples/flappy_bird/simulation-shared/observation/README.md +255 -0
  325. package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +339 -0
  326. package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +19 -0
  327. package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +81 -0
  328. package/test/examples/flappy_bird/simulation-shared/simulation-shared.constants.ts +3 -0
  329. package/test/examples/flappy_bird/simulation-shared/simulation-shared.control.utils.ts +6 -0
  330. package/test/examples/flappy_bird/simulation-shared/simulation-shared.difficulty.utils.ts +9 -0
  331. package/test/examples/flappy_bird/simulation-shared/simulation-shared.errors.ts +10 -1
  332. package/test/examples/flappy_bird/simulation-shared/simulation-shared.memory.utils.ts +18 -0
  333. package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +7 -402
  334. package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +36 -6
  335. package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +30 -9
  336. package/test/examples/flappy_bird/simulation-shared/simulation-shared.types.ts +38 -5
  337. package/test/examples/flappy_bird/trainFlappyBird.ts +13 -0
  338. package/test/examples/flappy_bird/trainer/README.md +676 -0
  339. package/test/examples/flappy_bird/trainer/evaluation/README.md +253 -0
  340. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +15 -0
  341. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +86 -0
  342. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +187 -0
  343. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +32 -0
  344. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +182 -0
  345. package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
  346. package/test/examples/flappy_bird/trainer/trainer.fitness.service.ts +23 -1
  347. package/test/examples/flappy_bird/trainer/trainer.loop.service.ts +17 -1
  348. package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
  349. package/test/examples/flappy_bird/trainer/trainer.report.service.ts +136 -0
  350. package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
  351. package/test/examples/flappy_bird/trainer/trainer.setup.service.ts +22 -0
  352. package/test/examples/flappy_bird/trainer/trainer.signals.service.ts +8 -0
  353. package/test/examples/flappy_bird/trainer/trainer.ts +38 -553
  354. package/test/examples/flappy_bird/trainer/trainer.types.ts +44 -7
  355. package/test/neat/neat.topology-intent.test.ts +129 -0
  356. package/test/network/network.topology-intent.test.ts +44 -0
  357. package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
  358. package/test/examples/flappy_bird/environment/environment.ts +0 -7
  359. package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
  360. package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
  361. package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
@@ -0,0 +1,184 @@
1
+ import type { PopulationRenderState, TrailState } from '../browser-entry.types';
2
+ import {
3
+ resolveVisibleWorldHeightPx,
4
+ resolveVisibleWorldWidthPx,
5
+ } from '../browser-entry.viewport.utils';
6
+ import type {
7
+ PlaybackEpisodeSummary,
8
+ PlaybackLoopState,
9
+ PlaybackMutableSummary,
10
+ PlaybackSessionContext,
11
+ } from './playback.orchestration.types';
12
+
13
+ /**
14
+ * Session initialization and summary-folding helpers for playback.
15
+ *
16
+ * These services answer three orchestration questions:
17
+ * 1. What viewport is the browser currently showing?
18
+ * 2. What local mirror state should exist before the first worker snapshot?
19
+ * 3. How should mutable loop state be folded back into a public summary?
20
+ */
21
+
22
+ /**
23
+ * Resolves the current visible playback viewport dimensions from the canvas.
24
+ *
25
+ * Playback sizing is derived from the live canvas rather than a hard-coded
26
+ * constant so resizing can flow into the worker/session boundary cleanly.
27
+ *
28
+ * @param canvas - Target playback canvas.
29
+ * @returns Visible world width and height in pixels.
30
+ */
31
+ export function resolvePlaybackViewportDimensions(canvas: HTMLCanvasElement): {
32
+ visibleWorldWidthPx: number;
33
+ visibleWorldHeightPx: number;
34
+ } {
35
+ // Step 1: Read the current world-space viewport dimensions.
36
+ return {
37
+ visibleWorldWidthPx: resolveVisibleWorldWidthPx(canvas),
38
+ visibleWorldHeightPx: resolveVisibleWorldHeightPx(canvas),
39
+ };
40
+ }
41
+
42
+ /**
43
+ * Creates the initial render state used before the first worker snapshot.
44
+ *
45
+ * The browser starts from an empty-but-shaped render state so rendering helpers
46
+ * can assume the object graph exists even before the worker has emitted any
47
+ * population geometry.
48
+ *
49
+ * @param viewportDimensions - Current visible world dimensions.
50
+ * @returns Initialized population render state.
51
+ */
52
+ export function createInitialRenderState(viewportDimensions: {
53
+ visibleWorldWidthPx: number;
54
+ visibleWorldHeightPx: number;
55
+ }): PopulationRenderState {
56
+ // Step 1: Seed render fields with viewport dimensions and empty entities.
57
+ return {
58
+ frameIndex: 0,
59
+ cumulativePipeTravelPx: 0,
60
+ visibleWorldWidthPx: viewportDimensions.visibleWorldWidthPx,
61
+ visibleWorldHeightPx: viewportDimensions.visibleWorldHeightPx,
62
+ nextPipeId: 0,
63
+ lastSpawnedPipeGapPx: 0,
64
+ lastSpawnedPipeGapCenterYPx: 0,
65
+ lastSpawnedPipeSpawnIntervalFrames: 0,
66
+ framesUntilNextPipeSpawn: 0,
67
+ pipes: [],
68
+ birds: [],
69
+ };
70
+ }
71
+
72
+ /**
73
+ * Creates the initial trail state used before any snapshots have been applied.
74
+ *
75
+ * Trails are purely visual history, so they begin empty and accumulate only as
76
+ * playback frames are observed.
77
+ *
78
+ * @returns Empty trail state for all birds.
79
+ */
80
+ export function createInitialTrailState(): TrailState {
81
+ // Step 1: Initialize the trail cache as empty arrays.
82
+ return {
83
+ birdTrailsY: [],
84
+ };
85
+ }
86
+
87
+ /**
88
+ * Creates the mutable loop state used while processing playback steps.
89
+ *
90
+ * This is the browser's running notebook for one episode: budget, completion
91
+ * flag, and the latest known aggregate outcome metrics.
92
+ *
93
+ * @returns Initialized loop state and aggregate summary values.
94
+ */
95
+ export function createInitialPlaybackLoopState(): PlaybackLoopState {
96
+ // Step 1: Initialize frame-budget and completion tracking.
97
+ return {
98
+ simulationFrameBudget: 0,
99
+ finished: false,
100
+ summary: {
101
+ averagePipesPassed: 0,
102
+ p90FramesSurvived: 0,
103
+ winnerPipesPassed: 0,
104
+ winnerFramesSurvived: 0,
105
+ latestLeaderPipesPassed: 0,
106
+ latestLeaderFramesSurvived: 0,
107
+ },
108
+ };
109
+ }
110
+
111
+ /**
112
+ * Initializes worker playback and local state mirrors for one episode.
113
+ *
114
+ * This is the point where the browser and worker agree on a fresh episode. The
115
+ * browser sends the initial viewport dimensions to the worker, then builds the
116
+ * local render and summary mirrors that will be updated as snapshots arrive.
117
+ *
118
+ * @param canvas - Target playback canvas.
119
+ * @param evolutionWorker - Worker owning playback simulation state.
120
+ * @returns Session context shared across the playback loop.
121
+ */
122
+ export function initializePlaybackSessionContext(
123
+ canvas: HTMLCanvasElement,
124
+ evolutionWorker: Worker,
125
+ ): PlaybackSessionContext {
126
+ // Step 1: Resolve the current viewport dimensions.
127
+ const viewportDimensions = resolvePlaybackViewportDimensions(canvas);
128
+
129
+ // Step 2: Start playback in the worker using the current viewport.
130
+ evolutionWorker.postMessage({
131
+ type: 'start-playback',
132
+ payload: viewportDimensions,
133
+ });
134
+
135
+ // Step 3: Build local render, trail, and loop state mirrors.
136
+ return {
137
+ renderState: createInitialRenderState(viewportDimensions),
138
+ trailState: createInitialTrailState(),
139
+ loopState: createInitialPlaybackLoopState(),
140
+ };
141
+ }
142
+
143
+ /**
144
+ * Synchronizes the render state viewport fields with the current canvas size.
145
+ *
146
+ * Playback can continue while the canvas size changes, so the browser refreshes
147
+ * its local viewport mirror rather than assuming dimensions stay fixed.
148
+ *
149
+ * @param canvas - Target playback canvas.
150
+ * @param renderState - Mutable render state updated in place.
151
+ * @returns Nothing.
152
+ */
153
+ export function syncPlaybackViewportDimensions(
154
+ canvas: HTMLCanvasElement,
155
+ renderState: PopulationRenderState,
156
+ ): void {
157
+ // Step 1: Resolve current viewport dimensions from the canvas.
158
+ const viewportDimensions = resolvePlaybackViewportDimensions(canvas);
159
+
160
+ // Step 2: Store the current viewport dimensions on the mutable render state.
161
+ renderState.visibleWorldWidthPx = viewportDimensions.visibleWorldWidthPx;
162
+ renderState.visibleWorldHeightPx = viewportDimensions.visibleWorldHeightPx;
163
+ }
164
+
165
+ /**
166
+ * Folds the mutable loop summary into the public playback summary shape.
167
+ *
168
+ * The public summary is intentionally smaller than the internal loop state. It
169
+ * exposes the outcome, not the browser's intermediate bookkeeping.
170
+ *
171
+ * @param summary - Mutable loop summary accumulated during playback.
172
+ * @returns Public playback episode summary.
173
+ */
174
+ export function resolvePlaybackEpisodeSummary(
175
+ summary: PlaybackMutableSummary,
176
+ ): PlaybackEpisodeSummary {
177
+ // Step 1: Return only the public aggregate fields.
178
+ return {
179
+ averagePipesPassed: summary.averagePipesPassed,
180
+ p90FramesSurvived: summary.p90FramesSurvived,
181
+ winnerPipesPassed: summary.winnerPipesPassed,
182
+ winnerFramesSurvived: summary.winnerFramesSurvived,
183
+ };
184
+ }
@@ -0,0 +1,121 @@
1
+ import type {
2
+ EvolutionPlaybackStepSnapshot,
3
+ PopulationRenderState,
4
+ } from '../browser-entry.types';
5
+ import { applyPlaybackSnapshot } from './playback.snapshot.utils';
6
+
7
+ describe('applyPlaybackSnapshot', () => {
8
+ it('reuses the existing bird objects while decoding the packed snapshot', () => {
9
+ const snapshot = createSnapshot();
10
+ const renderState = createRenderStateWithOneBirdAndOnePipe();
11
+ const originalBirdReference = renderState.birds[0];
12
+
13
+ applyPlaybackSnapshot(renderState, snapshot);
14
+
15
+ expect(renderState.birds[0]).toBe(originalBirdReference);
16
+ });
17
+
18
+ it('decodes packed bird and pipe scalars into the reusable render state', () => {
19
+ const snapshot = createSnapshot();
20
+ const renderState = createRenderState();
21
+
22
+ applyPlaybackSnapshot(renderState, snapshot);
23
+
24
+ expect(renderState).toEqual({
25
+ frameIndex: 21,
26
+ cumulativePipeTravelPx: 84,
27
+ visibleWorldWidthPx: 640,
28
+ visibleWorldHeightPx: 480,
29
+ nextPipeId: 0,
30
+ lastSpawnedPipeGapPx: 0,
31
+ lastSpawnedPipeGapCenterYPx: 0,
32
+ lastSpawnedPipeSpawnIntervalFrames: 0,
33
+ framesUntilNextPipeSpawn: 0,
34
+ pipes: [
35
+ {
36
+ id: 0,
37
+ xPx: 250,
38
+ gapCenterYPx: 200,
39
+ gapSizePx: 110,
40
+ },
41
+ ],
42
+ birds: [
43
+ {
44
+ yPx: 150,
45
+ pipesPassed: 2,
46
+ framesSurvived: 17,
47
+ done: false,
48
+ },
49
+ ],
50
+ });
51
+ });
52
+ });
53
+
54
+ function createSnapshot(): EvolutionPlaybackStepSnapshot {
55
+ return {
56
+ format: 'packed-v1',
57
+ frameIndex: 21,
58
+ cumulativePipeTravelPx: 84,
59
+ visibleWorldWidthPx: 640,
60
+ visibleWorldHeightPx: 480,
61
+ pipeCount: 1,
62
+ birdCount: 1,
63
+ pipes: {
64
+ xPositionsPx: new Float32Array([250]),
65
+ gapCenterYPositionsPx: new Float32Array([200]),
66
+ gapSizesPx: new Float32Array([110]),
67
+ },
68
+ birds: {
69
+ yPositionsPx: new Float32Array([150]),
70
+ pipesPassed: new Uint32Array([2]),
71
+ framesSurvived: new Uint32Array([17]),
72
+ doneFlags: new Uint8Array([0]),
73
+ },
74
+ };
75
+ }
76
+
77
+ function createRenderStateWithOneBirdAndOnePipe(): PopulationRenderState {
78
+ return {
79
+ frameIndex: 0,
80
+ cumulativePipeTravelPx: 0,
81
+ visibleWorldWidthPx: 1,
82
+ visibleWorldHeightPx: 1,
83
+ nextPipeId: 0,
84
+ lastSpawnedPipeGapPx: 0,
85
+ lastSpawnedPipeGapCenterYPx: 0,
86
+ lastSpawnedPipeSpawnIntervalFrames: 0,
87
+ framesUntilNextPipeSpawn: 0,
88
+ pipes: [
89
+ {
90
+ id: 0,
91
+ xPx: 1,
92
+ gapCenterYPx: 2,
93
+ gapSizePx: 3,
94
+ },
95
+ ],
96
+ birds: [
97
+ {
98
+ yPx: 1,
99
+ pipesPassed: 2,
100
+ framesSurvived: 3,
101
+ done: true,
102
+ },
103
+ ],
104
+ };
105
+ }
106
+
107
+ function createRenderState(): PopulationRenderState {
108
+ return {
109
+ frameIndex: 0,
110
+ cumulativePipeTravelPx: 0,
111
+ visibleWorldWidthPx: 1,
112
+ visibleWorldHeightPx: 1,
113
+ nextPipeId: 0,
114
+ lastSpawnedPipeGapPx: 0,
115
+ lastSpawnedPipeGapCenterYPx: 0,
116
+ lastSpawnedPipeSpawnIntervalFrames: 0,
117
+ framesUntilNextPipeSpawn: 0,
118
+ pipes: [],
119
+ birds: [],
120
+ };
121
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Compatibility facade for playback snapshot helpers.
3
+ *
4
+ * Legacy imports still reach snapshot synchronization through this file while
5
+ * the implementation now lives in the dedicated snapshot folder.
6
+ */
7
+ export { applyPlaybackSnapshot } from './snapshot/playback.snapshot.services';
8
+ export { resolveLeaderFramesSurvived } from './snapshot/playback.snapshot.summary.utils';
@@ -0,0 +1,36 @@
1
+ import { FLAPPY_STARFIELD_TILE_WIDTH_PX } from '../../constants/constants';
2
+ import { createStarTileCanvas } from './playback.starfield.services';
3
+ import type {
4
+ PlaybackStarfieldLayerSpec,
5
+ StarTile,
6
+ } from './playback.starfield.types';
7
+
8
+ /**
9
+ * Creates one cached tile layer from a declarative layer specification.
10
+ *
11
+ * @param layerSpec - Density and motion contract for a starfield layer.
12
+ * @param tileHeightPx - Height of the visible sky band in pixels.
13
+ * @returns Cached tile metadata for parallax drawing.
14
+ */
15
+ export function createStarTile(
16
+ layerSpec: PlaybackStarfieldLayerSpec,
17
+ tileHeightPx: number,
18
+ ): StarTile {
19
+ // Step 1: Pre-render one deterministic tile for the requested layer.
20
+ return {
21
+ image: createStarTileCanvas({
22
+ seed: layerSpec.seed,
23
+ tileWidthPx: FLAPPY_STARFIELD_TILE_WIDTH_PX,
24
+ tileHeightPx,
25
+ starCount: layerSpec.starCount,
26
+ minSizePx: layerSpec.minSizePx,
27
+ maxSizePx: layerSpec.maxSizePx,
28
+ minAlpha: layerSpec.minAlpha,
29
+ maxAlpha: layerSpec.maxAlpha,
30
+ blurPx: layerSpec.blurPx,
31
+ }),
32
+ tileWidthPx: FLAPPY_STARFIELD_TILE_WIDTH_PX,
33
+ tileHeightPx,
34
+ scrollRatio: layerSpec.scrollRatio,
35
+ };
36
+ }
@@ -1,13 +1,10 @@
1
1
  import {
2
- FLAPPY_STARFIELD_CYAN_FILL_STYLE,
3
- FLAPPY_STARFIELD_FAR_SCROLL_RATIO,
4
- FLAPPY_STARFIELD_MID_SCROLL_RATIO,
5
- FLAPPY_STARFIELD_NEAR_SCROLL_RATIO,
6
- FLAPPY_STARFIELD_TILE_WIDTH_PX,
2
+ FLAPPY_STARFIELD_LAYER_SPECS,
3
+ FLAPPY_STARFIELD_MIN_DIMENSION_PX,
7
4
  } from '../../constants/constants';
8
5
  import { cachedStarfieldTilesByHeight } from './playback.constants';
9
- import { createSeededRandom } from './playback.starfield.utils';
10
- import type { StarTile } from './playback.types';
6
+ import { createStarTile } from './playback.starfield.layer.services';
7
+ import type { StarTile } from './playback.starfield.types';
11
8
 
12
9
  /**
13
10
  * Resolves (and lazily creates) cached starfield tile layers for the viewport.
@@ -18,132 +15,18 @@ import type { StarTile } from './playback.types';
18
15
  export function resolveStarfieldTiles(
19
16
  visibleWorldHeightPx: number,
20
17
  ): readonly StarTile[] {
21
- const tileHeightPx = Math.max(1, Math.round(visibleWorldHeightPx));
18
+ const tileHeightPx = Math.max(
19
+ FLAPPY_STARFIELD_MIN_DIMENSION_PX,
20
+ Math.round(visibleWorldHeightPx),
21
+ );
22
22
  const cachedTilesForHeight = cachedStarfieldTilesByHeight.get(tileHeightPx);
23
23
  if (cachedTilesForHeight) {
24
24
  return cachedTilesForHeight;
25
25
  }
26
26
 
27
- const farTile: StarTile = {
28
- image: createStarTileCanvas({
29
- seed: 1_337,
30
- tileWidthPx: FLAPPY_STARFIELD_TILE_WIDTH_PX,
31
- tileHeightPx,
32
- starCount: 35,
33
- minSizePx: 1,
34
- maxSizePx: 2,
35
- minAlpha: 0.08,
36
- maxAlpha: 0.22,
37
- blurPx: 4,
38
- }),
39
- tileWidthPx: FLAPPY_STARFIELD_TILE_WIDTH_PX,
40
- tileHeightPx,
41
- scrollRatio: FLAPPY_STARFIELD_FAR_SCROLL_RATIO,
42
- };
43
- const midTile: StarTile = {
44
- image: createStarTileCanvas({
45
- seed: 2_777,
46
- tileWidthPx: FLAPPY_STARFIELD_TILE_WIDTH_PX,
47
- tileHeightPx,
48
- starCount: 28,
49
- minSizePx: 1,
50
- maxSizePx: 3,
51
- minAlpha: 0.1,
52
- maxAlpha: 0.28,
53
- blurPx: 6,
54
- }),
55
- tileWidthPx: FLAPPY_STARFIELD_TILE_WIDTH_PX,
56
- tileHeightPx,
57
- scrollRatio: FLAPPY_STARFIELD_MID_SCROLL_RATIO,
58
- };
59
- const nearTile: StarTile = {
60
- image: createStarTileCanvas({
61
- seed: 4_242,
62
- tileWidthPx: FLAPPY_STARFIELD_TILE_WIDTH_PX,
63
- tileHeightPx,
64
- starCount: 23,
65
- minSizePx: 2,
66
- maxSizePx: 4,
67
- minAlpha: 0.12,
68
- maxAlpha: 0.34,
69
- blurPx: 8,
70
- }),
71
- tileWidthPx: FLAPPY_STARFIELD_TILE_WIDTH_PX,
72
- tileHeightPx,
73
- scrollRatio: FLAPPY_STARFIELD_NEAR_SCROLL_RATIO,
74
- };
75
-
76
- const resolvedTiles = [farTile, midTile, nearTile] as const;
27
+ const resolvedTiles = FLAPPY_STARFIELD_LAYER_SPECS.map((layerSpec) =>
28
+ createStarTile(layerSpec, tileHeightPx),
29
+ );
77
30
  cachedStarfieldTilesByHeight.set(tileHeightPx, resolvedTiles);
78
31
  return resolvedTiles;
79
32
  }
80
-
81
- function createStarTileCanvas(options: {
82
- seed: number;
83
- tileWidthPx: number;
84
- tileHeightPx: number;
85
- starCount: number;
86
- minSizePx: number;
87
- maxSizePx: number;
88
- minAlpha: number;
89
- maxAlpha: number;
90
- blurPx: number;
91
- }): CanvasImageSource {
92
- const canvas = createCompatibleCanvas(
93
- options.tileWidthPx,
94
- options.tileHeightPx,
95
- );
96
- const tileContext = canvas.getContext('2d');
97
- if (!tileContext) {
98
- return canvas;
99
- }
100
-
101
- const seededRandom = createSeededRandom(options.seed);
102
-
103
- tileContext.clearRect(0, 0, canvas.width, canvas.height);
104
- tileContext.globalCompositeOperation = 'source-over';
105
- tileContext.shadowColor = FLAPPY_STARFIELD_CYAN_FILL_STYLE;
106
- tileContext.shadowBlur = options.blurPx;
107
-
108
- for (let starIndex = 0; starIndex < options.starCount; starIndex += 1) {
109
- const xPx = Math.floor(seededRandom() * options.tileWidthPx);
110
- const yPx = Math.floor(seededRandom() * options.tileHeightPx);
111
- const sizePx =
112
- options.minSizePx +
113
- Math.floor(seededRandom() * (options.maxSizePx - options.minSizePx + 1));
114
- const alpha =
115
- options.minAlpha + seededRandom() * (options.maxAlpha - options.minAlpha);
116
-
117
- tileContext.globalAlpha = alpha;
118
- tileContext.fillStyle = FLAPPY_STARFIELD_CYAN_FILL_STYLE;
119
- tileContext.fillRect(xPx, yPx, sizePx, sizePx);
120
- }
121
-
122
- tileContext.shadowBlur = 0;
123
- tileContext.shadowColor = 'transparent';
124
- tileContext.globalAlpha = 1;
125
- return canvas;
126
- }
127
-
128
- function createCompatibleCanvas(
129
- widthPx: number,
130
- heightPx: number,
131
- ): HTMLCanvasElement | OffscreenCanvas {
132
- const width = Math.max(1, Math.round(widthPx));
133
- const height = Math.max(1, Math.round(heightPx));
134
-
135
- if (typeof OffscreenCanvas !== 'undefined') {
136
- return new OffscreenCanvas(width, height);
137
- }
138
-
139
- if (typeof document !== 'undefined') {
140
- const canvas = document.createElement('canvas');
141
- canvas.width = width;
142
- canvas.height = height;
143
- return canvas;
144
- }
145
-
146
- // Fallback: non-browser environments won't render, but should not crash.
147
- const canvas = { width, height } as unknown as HTMLCanvasElement;
148
- return canvas;
149
- }