@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 { FLAPPY_NEON_PALETTE } from '../../../constants/constants';
2
+ import { resolveStarfieldTiles } from '../playback.starfield.service';
3
+ import type { StarTileImage } from '../playback.starfield.types';
4
+ import { positiveModulo } from '../playback.starfield.utils';
5
+ import { resolveCachedPlaybackTileCoverageCount } from './playback.background.cache.services';
6
+ import {
7
+ FLAPPY_BACKGROUND_COMPOSITE_SOURCE_OVER,
8
+ FLAPPY_BACKGROUND_TILE_ROW_BUFFER_COUNT,
9
+ FLAPPY_BACKGROUND_TILE_ROW_START_INDEX,
10
+ FLAPPY_BACKGROUND_TRANSPARENT_SHADOW_COLOR,
11
+ } from './playback.background.constants';
12
+ import type {
13
+ PlaybackBackgroundRequest,
14
+ PlaybackBackgroundSceneContext,
15
+ PlaybackHorizonLineRequest,
16
+ } from './playback.background.types';
17
+
18
+ /**
19
+ * Paints the base background fill for the currently visible viewport.
20
+ *
21
+ * @param context - Canvas 2D drawing context.
22
+ * @param sceneContext - Derived scene geometry and style contract.
23
+ * @returns Nothing.
24
+ */
25
+ export function paintPlaybackBackgroundBase(
26
+ context: CanvasRenderingContext2D,
27
+ sceneContext: PlaybackBackgroundSceneContext,
28
+ ): void {
29
+ // Step 1: Reset canvas paint state to a predictable base pass.
30
+ context.globalAlpha = 1;
31
+ context.globalCompositeOperation = FLAPPY_BACKGROUND_COMPOSITE_SOURCE_OVER;
32
+ context.shadowBlur = 0;
33
+ context.shadowColor = FLAPPY_BACKGROUND_TRANSPARENT_SHADOW_COLOR;
34
+ context.fillStyle = FLAPPY_NEON_PALETTE.background;
35
+
36
+ // Step 2: Fill only the currently visible world-space viewport.
37
+ context.fillRect(
38
+ sceneContext.viewportLeftXPx,
39
+ 0,
40
+ sceneContext.visibleWorldWidthPx,
41
+ sceneContext.visibleWorldHeightPx,
42
+ );
43
+ }
44
+
45
+ /**
46
+ * Draws the starfield parallax clipped to the upper sky band.
47
+ *
48
+ * @param context - Canvas 2D drawing context.
49
+ * @param sceneContext - Derived scene geometry and style contract.
50
+ * @param request - Narrow render input required for background composition.
51
+ * @returns Nothing.
52
+ */
53
+ export function drawPlaybackBackgroundSky(
54
+ context: CanvasRenderingContext2D,
55
+ sceneContext: PlaybackBackgroundSceneContext,
56
+ request: PlaybackBackgroundRequest,
57
+ ): void {
58
+ // Step 1: Constrain star drawing to the sky band above the horizon.
59
+ context.save();
60
+ context.beginPath();
61
+ context.rect(
62
+ sceneContext.viewportLeftXPx,
63
+ 0,
64
+ sceneContext.visibleWorldWidthPx,
65
+ sceneContext.skyHeightPx,
66
+ );
67
+ context.clip();
68
+ context.globalCompositeOperation = FLAPPY_BACKGROUND_COMPOSITE_SOURCE_OVER;
69
+
70
+ // Step 2: Draw each cached starfield layer with its own parallax offset.
71
+ const starfieldTiles = resolveStarfieldTiles(sceneContext.skyHeightPx);
72
+ for (const starfieldTile of starfieldTiles) {
73
+ const scrollOffsetPx = request.scrollBasePx * starfieldTile.scrollRatio;
74
+ drawPlaybackTiledImageRow(
75
+ context,
76
+ sceneContext.viewportLeftXPx,
77
+ starfieldTile.image,
78
+ starfieldTile.tileWidthPx,
79
+ sceneContext.visibleWorldWidthPx,
80
+ scrollOffsetPx,
81
+ );
82
+ }
83
+
84
+ // Step 3: Restore the caller's unclipped canvas state.
85
+ context.restore();
86
+ }
87
+
88
+ /**
89
+ * Draws the glowing horizon divider across the visible viewport.
90
+ *
91
+ * @param context - Canvas 2D drawing context.
92
+ * @param sceneContext - Derived scene geometry and style contract.
93
+ * @returns Nothing.
94
+ */
95
+ export function drawPlaybackBackgroundHorizon(
96
+ context: CanvasRenderingContext2D,
97
+ sceneContext: PlaybackBackgroundSceneContext,
98
+ ): void {
99
+ // Step 1: Delegate the divider rendering to the dedicated horizon helper.
100
+ drawPlaybackHorizonLine(context, {
101
+ viewportLeftXPx: sceneContext.viewportLeftXPx,
102
+ visibleWorldWidthPx: sceneContext.visibleWorldWidthPx,
103
+ alignedHorizonYPx: sceneContext.alignedHorizonYPx,
104
+ horizonStyle: sceneContext.horizonStyle,
105
+ });
106
+ }
107
+
108
+ /**
109
+ * Draws a horizontally tiled image strip across the visible width.
110
+ *
111
+ * @param context - Canvas 2D drawing context.
112
+ * @param startXPx - Leftmost visible world x-position for the tiled strip.
113
+ * @param tile - Pre-rendered tile image reused across the sky band.
114
+ * @param tileWidthPx - Width of one repeated tile in pixels.
115
+ * @param visibleWidthPx - Current visible width that must be fully covered.
116
+ * @param offsetPx - Parallax scroll offset used to wrap tile placement.
117
+ * @returns Nothing.
118
+ */
119
+ function drawPlaybackTiledImageRow(
120
+ context: CanvasRenderingContext2D,
121
+ startXPx: number,
122
+ tile: StarTileImage,
123
+ tileWidthPx: number,
124
+ visibleWidthPx: number,
125
+ offsetPx: number,
126
+ ): void {
127
+ // Step 1: Normalize the scroll offset so tile placement stays bounded.
128
+ const normalizedOffsetPx = positiveModulo(offsetPx, tileWidthPx);
129
+ const maximumTileIndex = resolveCachedPlaybackTileCoverageCount(
130
+ tileWidthPx,
131
+ () =>
132
+ Math.ceil(visibleWidthPx / tileWidthPx) +
133
+ FLAPPY_BACKGROUND_TILE_ROW_BUFFER_COUNT,
134
+ );
135
+
136
+ // Step 2: Draw enough repeated tiles to cover the visible strip.
137
+ for (
138
+ let tileIndex = FLAPPY_BACKGROUND_TILE_ROW_START_INDEX;
139
+ tileIndex <= maximumTileIndex;
140
+ tileIndex += 1
141
+ ) {
142
+ const tileLeftPx = startXPx + tileIndex * tileWidthPx - normalizedOffsetPx;
143
+ context.drawImage(tile as unknown as CanvasImageSource, tileLeftPx, 0);
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Draws the glowing horizon divider using the provided neon style.
149
+ *
150
+ * @param context - Canvas 2D drawing context.
151
+ * @param request - Width, aligned y-position, and style for the divider.
152
+ * @returns Nothing.
153
+ */
154
+ function drawPlaybackHorizonLine(
155
+ context: CanvasRenderingContext2D,
156
+ request: PlaybackHorizonLineRequest,
157
+ ): void {
158
+ // Step 1: Draw the outer glow pass to establish the neon bloom.
159
+ context.globalCompositeOperation = FLAPPY_BACKGROUND_COMPOSITE_SOURCE_OVER;
160
+ context.strokeStyle = request.horizonStyle.lineColor;
161
+ context.lineWidth = request.horizonStyle.lineThicknessPx;
162
+ context.shadowColor = request.horizonStyle.glowColor;
163
+ context.shadowBlur = request.horizonStyle.glowBlurPx;
164
+ context.globalAlpha = request.horizonStyle.glowAlpha;
165
+ context.beginPath();
166
+ context.moveTo(request.viewportLeftXPx, request.alignedHorizonYPx);
167
+ context.lineTo(
168
+ request.viewportLeftXPx + request.visibleWorldWidthPx,
169
+ request.alignedHorizonYPx,
170
+ );
171
+ context.stroke();
172
+
173
+ // Step 2: Restore a crisp core line after the glow pass.
174
+ context.shadowBlur = 0;
175
+ context.shadowColor = FLAPPY_BACKGROUND_TRANSPARENT_SHADOW_COLOR;
176
+ context.globalAlpha = 1;
177
+ context.beginPath();
178
+ context.moveTo(request.viewportLeftXPx, request.alignedHorizonYPx);
179
+ context.lineTo(
180
+ request.viewportLeftXPx + request.visibleWorldWidthPx,
181
+ request.alignedHorizonYPx,
182
+ );
183
+ context.stroke();
184
+ }
@@ -0,0 +1,64 @@
1
+ import {
2
+ ensurePlaybackBackgroundViewportCacheValidity,
3
+ resolveCachedPlaybackBackgroundLayout,
4
+ } from './playback.background.cache.services';
5
+ import type {
6
+ PlaybackBackgroundRequest,
7
+ PlaybackBackgroundSceneContext,
8
+ } from './playback.background.types';
9
+ import {
10
+ resolveAlignedHorizonYPx,
11
+ resolvePlaybackBackgroundLayout,
12
+ resolvePlaybackHorizonStyle,
13
+ resolveSafeBackgroundDimension,
14
+ } from './playback.background.utils';
15
+
16
+ /**
17
+ * Resolves the derived scene contract required by the background passes.
18
+ *
19
+ * @param request - Narrow render input required for background composition.
20
+ * @returns Immutable scene context shared by the private render helpers.
21
+ */
22
+ export function resolvePlaybackBackgroundSceneContext(
23
+ request: PlaybackBackgroundRequest,
24
+ ): PlaybackBackgroundSceneContext {
25
+ // Step 1: Clamp viewport dimensions into render-safe pixel values.
26
+ const visibleWorldWidthPx = resolveSafeBackgroundDimension(
27
+ request.visibleWorldWidthPx,
28
+ );
29
+ const visibleWorldHeightPx = resolveSafeBackgroundDimension(
30
+ request.visibleWorldHeightPx,
31
+ );
32
+ ensurePlaybackBackgroundViewportCacheValidity(
33
+ visibleWorldWidthPx,
34
+ visibleWorldHeightPx,
35
+ );
36
+
37
+ // Step 2: Resolve the vertical sky-ground split and horizon style.
38
+ const backgroundLayout = resolveCachedPlaybackBackgroundLayout(
39
+ visibleWorldHeightPx,
40
+ () => resolvePlaybackBackgroundLayout(visibleWorldHeightPx),
41
+ );
42
+ const horizonStyle = resolvePlaybackHorizonStyle();
43
+ const alignedHorizonYPx = resolveAlignedHorizonYPx(
44
+ backgroundLayout.horizonYPx,
45
+ horizonStyle.lineThicknessPx,
46
+ );
47
+ const vanishingPointXPx = request.viewportLeftXPx + visibleWorldWidthPx * 0.5;
48
+ const vanishingPointYPx = visibleWorldHeightPx * 0.5;
49
+
50
+ // Step 3: Return a compact context object for the remaining passes.
51
+ return {
52
+ viewportLeftXPx: request.viewportLeftXPx,
53
+ visibleWorldWidthPx,
54
+ visibleWorldHeightPx,
55
+ skyHeightPx: backgroundLayout.skyHeightPx,
56
+ lowerBandTopYPx: backgroundLayout.lowerBandTopYPx,
57
+ lowerBandHeightPx: backgroundLayout.lowerBandHeightPx,
58
+ lowerBandBottomYPx: backgroundLayout.lowerBandBottomYPx,
59
+ alignedHorizonYPx,
60
+ vanishingPointXPx,
61
+ vanishingPointYPx,
62
+ horizonStyle,
63
+ };
64
+ }
@@ -0,0 +1,6 @@
1
+ export {
2
+ drawPlaybackBackgroundHorizon,
3
+ drawPlaybackBackgroundSky,
4
+ paintPlaybackBackgroundBase,
5
+ } from './playback.background.draw.services';
6
+ export { resolvePlaybackBackgroundSceneContext } from './playback.background.scene.services';
@@ -0,0 +1,53 @@
1
+ import { renderPlaybackBackgroundGroundGrid } from './ground-grid/playback.background.ground-grid';
2
+ import {
3
+ drawPlaybackBackgroundHorizon,
4
+ drawPlaybackBackgroundSky,
5
+ paintPlaybackBackgroundBase,
6
+ resolvePlaybackBackgroundSceneContext,
7
+ } from './playback.background.services';
8
+ import type { PlaybackBackgroundRequest } from './playback.background.types';
9
+
10
+ /**
11
+ * Draws the layered playback background.
12
+ *
13
+ * The composition keeps the top two-thirds for the neon starfield, fills the
14
+ * lower band with a TRON-like perspective ground grid, and separates both
15
+ * regions with a glowing horizon divider.
16
+ *
17
+ * @param context - Canvas 2D drawing context.
18
+ * @param request - Narrow render input required for background composition.
19
+ * @returns Nothing.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * renderPlaybackBackground(context, {
24
+ * viewportLeftXPx: cameraLeftPx,
25
+ * visibleWorldWidthPx: 288,
26
+ * visibleWorldHeightPx: 512,
27
+ * frameIndex,
28
+ * scrollBasePx: frameIndex * pipeSpeedPxPerFrame,
29
+ * });
30
+ * ```
31
+ */
32
+ export function renderPlaybackBackground(
33
+ context: CanvasRenderingContext2D,
34
+ request: PlaybackBackgroundRequest,
35
+ ): void {
36
+ // Step 1: Resolve the scene contracts needed by the background passes.
37
+ const backgroundSceneContext = resolvePlaybackBackgroundSceneContext(request);
38
+
39
+ // Step 2: Paint the shared base fill behind all background layers.
40
+ paintPlaybackBackgroundBase(context, backgroundSceneContext);
41
+
42
+ // Step 3: Render the sky-only starfield inside the horizon clip band.
43
+ drawPlaybackBackgroundSky(context, backgroundSceneContext, request);
44
+
45
+ // Step 4: Render the lower-band neon grid beneath the horizon seam.
46
+ renderPlaybackBackgroundGroundGrid(context, backgroundSceneContext, {
47
+ frameIndex: request.frameIndex,
48
+ scrollBasePx: request.scrollBasePx,
49
+ });
50
+
51
+ // Step 5: Draw the horizon divider above the sky and ground layers.
52
+ drawPlaybackBackgroundHorizon(context, backgroundSceneContext);
53
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Minimal render input required to draw the playback background.
3
+ *
4
+ * The background is intentionally treated as a deterministic camera effect
5
+ * rather than a gameplay-aware renderer. By restricting the contract to
6
+ * viewport geometry, frame index, and scroll position, the module can create a
7
+ * stable neon sky-ground composition without coupling itself to bird state,
8
+ * pipe arrays, or trail caches.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const request: PlaybackBackgroundRequest = {
13
+ * viewportLeftXPx: cameraLeftPx,
14
+ * visibleWorldWidthPx: 288,
15
+ * visibleWorldHeightPx: 512,
16
+ * frameIndex,
17
+ * scrollBasePx: frameIndex * pipeSpeedPxPerFrame,
18
+ * };
19
+ * ```
20
+ */
21
+ export type PlaybackBackgroundRequest = {
22
+ viewportLeftXPx: number;
23
+ visibleWorldWidthPx: number;
24
+ visibleWorldHeightPx: number;
25
+ frameIndex: number;
26
+ scrollBasePx: number;
27
+ };
28
+
29
+ /**
30
+ * Derived scene contract shared by the playback background render passes.
31
+ *
32
+ * This is the background module's precomputed staging area. The scene service
33
+ * resolves the sky/lower-band split, vanishing point, and horizon styling once
34
+ * so the draw passes can stay orchestration-first and avoid repeating geometry
35
+ * math every frame.
36
+ */
37
+ export type PlaybackBackgroundSceneContext = {
38
+ viewportLeftXPx: number;
39
+ visibleWorldWidthPx: number;
40
+ visibleWorldHeightPx: number;
41
+ skyHeightPx: number;
42
+ lowerBandTopYPx: number;
43
+ lowerBandHeightPx: number;
44
+ lowerBandBottomYPx: number;
45
+ alignedHorizonYPx: number;
46
+ vanishingPointXPx: number;
47
+ vanishingPointYPx: number;
48
+ horizonStyle: PlaybackHorizonStyle;
49
+ };
50
+
51
+ /**
52
+ * Resolved vertical scene split used by playback background composition.
53
+ *
54
+ * The layout fixes the classic synthwave composition used by this demo: a tall
55
+ * sky band for layered starfield parallax and a compressed lower strip for the
56
+ * perspective grid. Caching this structure by viewport size keeps redraws cheap
57
+ * when the scene is otherwise stable.
58
+ */
59
+ export type PlaybackBackgroundLayout = {
60
+ skyHeightPx: number;
61
+ lowerBandTopYPx: number;
62
+ lowerBandHeightPx: number;
63
+ lowerBandBottomYPx: number;
64
+ horizonYPx: number;
65
+ horizonThicknessPx: number;
66
+ };
67
+
68
+ /**
69
+ * Zero-argument builder used to lazily construct one cached background layout.
70
+ *
71
+ * The cache service accepts a factory instead of raw data so callers can defer
72
+ * the slightly more expensive layout computation until a viewport-size cache
73
+ * miss actually occurs.
74
+ */
75
+ export type PlaybackBackgroundLayoutFactory = () => PlaybackBackgroundLayout;
76
+
77
+ /**
78
+ * Neon styling contract for the horizon divider line.
79
+ *
80
+ * The horizon is rendered as both a crisp divider and a glow source, much like
81
+ * the luminous skyline separator common in synthwave and TRON-inspired poster
82
+ * art. Keeping those paint properties bundled makes it easier to reason about
83
+ * the horizon as one semantic effect instead of a pile of canvas state.
84
+ */
85
+ export type PlaybackHorizonStyle = {
86
+ lineColor: string;
87
+ glowColor: string;
88
+ glowAlpha: number;
89
+ glowBlurPx: number;
90
+ lineThicknessPx: number;
91
+ };
92
+
93
+ /**
94
+ * Draw request for the horizon divider line.
95
+ *
96
+ * This narrow contract is the final handoff from layout math to the canvas
97
+ * stroke helper: world-space x extents, the pixel-snapped y position, and the
98
+ * resolved glow style needed for both line passes.
99
+ */
100
+ export type PlaybackHorizonLineRequest = {
101
+ viewportLeftXPx: number;
102
+ visibleWorldWidthPx: number;
103
+ alignedHorizonYPx: number;
104
+ horizonStyle: PlaybackHorizonStyle;
105
+ };
@@ -0,0 +1,100 @@
1
+ import {
2
+ FLAPPY_BACKGROUND_HORIZON_STYLE,
3
+ FLAPPY_BACKGROUND_HORIZON_HALF_THICKNESS_MULTIPLIER,
4
+ FLAPPY_BACKGROUND_HORIZON_LINE_THICKNESS_PX,
5
+ FLAPPY_BACKGROUND_MIN_VIEWPORT_DIMENSION_PX,
6
+ FLAPPY_BACKGROUND_ODD_STROKE_ALIGNMENT_OFFSET_PX,
7
+ FLAPPY_BACKGROUND_ODD_STROKE_DIVISOR,
8
+ FLAPPY_BACKGROUND_SKY_HEIGHT_RATIO,
9
+ } from './playback.background.constants';
10
+ import type {
11
+ PlaybackBackgroundLayout,
12
+ PlaybackHorizonStyle,
13
+ } from './playback.background.types';
14
+
15
+ /**
16
+ * Resolves the vertical split between the starfield sky and the future ground.
17
+ *
18
+ * @param visibleWorldHeightPx - Current visible world height in pixels.
19
+ * @returns Stable scene layout for the current frame.
20
+ */
21
+ export function resolvePlaybackBackgroundLayout(
22
+ visibleWorldHeightPx: number,
23
+ ): PlaybackBackgroundLayout {
24
+ // Step 1: Clamp the viewport height so follow-up math stays render-safe.
25
+ const safeVisibleWorldHeightPx =
26
+ resolveSafeBackgroundDimension(visibleWorldHeightPx);
27
+
28
+ // Step 2: Reserve the top segment for the current starfield parallax.
29
+ const skyHeightPx = Math.max(
30
+ FLAPPY_BACKGROUND_MIN_VIEWPORT_DIMENSION_PX,
31
+ Math.round(safeVisibleWorldHeightPx * FLAPPY_BACKGROUND_SKY_HEIGHT_RATIO),
32
+ );
33
+ const horizonThicknessPx = FLAPPY_BACKGROUND_HORIZON_LINE_THICKNESS_PX;
34
+ const lowerBandTopYPx = skyHeightPx;
35
+ const lowerBandBottomYPx = safeVisibleWorldHeightPx;
36
+ const lowerBandHeightPx = Math.max(
37
+ FLAPPY_BACKGROUND_MIN_VIEWPORT_DIMENSION_PX,
38
+ lowerBandBottomYPx - lowerBandTopYPx,
39
+ );
40
+ const horizonYPx = Math.max(
41
+ 0,
42
+ lowerBandTopYPx -
43
+ horizonThicknessPx * FLAPPY_BACKGROUND_HORIZON_HALF_THICKNESS_MULTIPLIER,
44
+ );
45
+
46
+ // Step 3: Return an explicit layout object so render code stays declarative.
47
+ return {
48
+ skyHeightPx,
49
+ lowerBandTopYPx,
50
+ lowerBandHeightPx,
51
+ lowerBandBottomYPx,
52
+ horizonYPx,
53
+ horizonThicknessPx,
54
+ };
55
+ }
56
+
57
+ /**
58
+ * Resolves the neon paint settings for the horizon divider.
59
+ *
60
+ * @returns Reusable draw style for both the glow and crisp line passes.
61
+ */
62
+ export function resolvePlaybackHorizonStyle(): PlaybackHorizonStyle {
63
+ // Step 1: Reuse one frozen style object so horizon drawing stays allocation-free.
64
+ return FLAPPY_BACKGROUND_HORIZON_STYLE;
65
+ }
66
+
67
+ /**
68
+ * Resolves pixel-snapped horizon positioning for crisp canvas strokes.
69
+ *
70
+ * @param horizonYPx - Logical horizon centerline in pixels.
71
+ * @param lineThicknessPx - Stroke thickness in pixels.
72
+ * @returns Pixel-snapped y-position for the stroke.
73
+ */
74
+ export function resolveAlignedHorizonYPx(
75
+ horizonYPx: number,
76
+ lineThicknessPx: number,
77
+ ): number {
78
+ // Step 1: Offset odd-width strokes onto half pixels for crisp rasterization.
79
+ const oddStrokeAlignmentOffsetPx =
80
+ lineThicknessPx % FLAPPY_BACKGROUND_ODD_STROKE_DIVISOR === 1
81
+ ? FLAPPY_BACKGROUND_ODD_STROKE_ALIGNMENT_OFFSET_PX
82
+ : 0;
83
+
84
+ // Step 2: Return the aligned horizon position.
85
+ return horizonYPx + oddStrokeAlignmentOffsetPx;
86
+ }
87
+
88
+ /**
89
+ * Clamps a background dimension into a render-safe positive integer.
90
+ *
91
+ * @param dimensionPx - Candidate viewport dimension in pixels.
92
+ * @returns Positive integer dimension suitable for canvas math.
93
+ */
94
+ export function resolveSafeBackgroundDimension(dimensionPx: number): number {
95
+ // Step 1: Round sub-pixel measurements and enforce a positive floor.
96
+ return Math.max(
97
+ FLAPPY_BACKGROUND_MIN_VIEWPORT_DIMENSION_PX,
98
+ Math.round(dimensionPx),
99
+ );
100
+ }