@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,192 @@
1
+ import {
2
+ resolveAliveBirdCount,
3
+ resolveLeaderPipesPassed,
4
+ } from '../browser-entry.observation.utils';
5
+ import { requestWorkerPlaybackStep } from '../worker-channel/worker-channel';
6
+ import { FLAPPY_EMULATION_SPEED_MULTIPLIER } from '../../constants/constants';
7
+ import {
8
+ renderPopulationFrame,
9
+ updateTrailState,
10
+ } from './frame-render/playback.frame-render.service';
11
+ import { nextAnimationFrame } from './playback.loop.service';
12
+ import {
13
+ applyPlaybackSnapshot,
14
+ resolveLeaderFramesSurvived,
15
+ } from './playback.snapshot.utils';
16
+ import type {
17
+ PlaybackIterationContext,
18
+ PlaybackLoopState,
19
+ PlaybackSessionContext,
20
+ } from './playback.orchestration.types';
21
+ import { syncPlaybackViewportDimensions } from './playback.session.services';
22
+ import {
23
+ resolvePlaybackCompletionSummary,
24
+ resolvePlaybackFrameStats,
25
+ resolvePlaybackStepRequest,
26
+ } from './playback.worker-channel.utils';
27
+
28
+ /**
29
+ * Runs playback iterations until the worker reports that the episode is done.
30
+ *
31
+ * @param iterationContext - Shared loop dependencies and mutable playback state.
32
+ * @returns Nothing.
33
+ */
34
+ export async function runPlaybackLoop(
35
+ iterationContext: PlaybackIterationContext,
36
+ ): Promise<void> {
37
+ // Step 1: Continue iterating until the mutable loop state reports completion.
38
+ while (!iterationContext.sessionContext.loopState.finished) {
39
+ await runPlaybackIteration(iterationContext);
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Executes one playback iteration from viewport sync through render pacing.
45
+ *
46
+ * @param iterationContext - Shared loop dependencies and mutable playback state.
47
+ * @returns Nothing.
48
+ */
49
+ export async function runPlaybackIteration(
50
+ iterationContext: PlaybackIterationContext,
51
+ ): Promise<void> {
52
+ // Step 1: Sync viewport size and request the next worker playback step.
53
+ syncPlaybackViewportDimensions(
54
+ iterationContext.canvas,
55
+ iterationContext.sessionContext.renderState,
56
+ );
57
+ const playbackStepPayload =
58
+ await requestPlaybackStepPayload(iterationContext);
59
+
60
+ // Step 2: Fold the worker snapshot into local render and trail state.
61
+ applyPlaybackStepSnapshot(
62
+ iterationContext.sessionContext,
63
+ playbackStepPayload.snapshot,
64
+ );
65
+
66
+ // Step 3: Resolve telemetry metrics and emit the frame stats callback.
67
+ emitPlaybackFrameStats(iterationContext, playbackStepPayload);
68
+
69
+ // Step 4: Update loop completion state when the worker marks playback done.
70
+ updatePlaybackLoopCompletion(
71
+ iterationContext.sessionContext.loopState,
72
+ playbackStepPayload,
73
+ );
74
+
75
+ // Step 5: Render the frame and yield to the browser when playback continues.
76
+ renderPopulationFrame(
77
+ iterationContext.context,
78
+ iterationContext.sessionContext.renderState,
79
+ iterationContext.sessionContext.trailState,
80
+ );
81
+ if (!iterationContext.sessionContext.loopState.finished) {
82
+ await nextAnimationFrame();
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Requests one playback step batch from the evolution worker.
88
+ *
89
+ * @param iterationContext - Shared loop dependencies and mutable playback state.
90
+ * @returns Worker playback step payload for the current iteration.
91
+ */
92
+ export async function requestPlaybackStepPayload(
93
+ iterationContext: PlaybackIterationContext,
94
+ ): Promise<Awaited<ReturnType<typeof requestWorkerPlaybackStep>>> {
95
+ // Step 1: Resolve the worker request from the current loop budget and viewport.
96
+ const { renderState, loopState } = iterationContext.sessionContext;
97
+ const { simulationFrameBudgetRemainder, playbackStepRequest } =
98
+ resolvePlaybackStepRequest({
99
+ simulationFrameBudget: loopState.simulationFrameBudget,
100
+ visibleWorldWidthPx: renderState.visibleWorldWidthPx,
101
+ visibleWorldHeightPx: renderState.visibleWorldHeightPx,
102
+ emulationSpeedMultiplier: FLAPPY_EMULATION_SPEED_MULTIPLIER,
103
+ });
104
+ loopState.simulationFrameBudget = simulationFrameBudgetRemainder;
105
+
106
+ // Step 2: Request the next playback step from the worker.
107
+ return requestWorkerPlaybackStep(
108
+ iterationContext.evolutionWorker,
109
+ playbackStepRequest,
110
+ );
111
+ }
112
+
113
+ /**
114
+ * Applies the latest worker snapshot to render state and trail caches.
115
+ *
116
+ * @param sessionContext - Shared mutable playback session state.
117
+ * @param snapshot - Worker snapshot for the current playback batch.
118
+ * @returns Nothing.
119
+ */
120
+ export function applyPlaybackStepSnapshot(
121
+ sessionContext: PlaybackSessionContext,
122
+ snapshot: Parameters<typeof applyPlaybackSnapshot>[1],
123
+ ): void {
124
+ // Step 1: Fold the worker snapshot into the mutable render state.
125
+ applyPlaybackSnapshot(sessionContext.renderState, snapshot);
126
+
127
+ // Step 2: Refresh the bird trail cache from the updated render state.
128
+ updateTrailState(sessionContext.trailState, sessionContext.renderState);
129
+ }
130
+
131
+ /**
132
+ * Resolves leader telemetry and emits the public frame-stats callback.
133
+ *
134
+ * @param iterationContext - Shared loop dependencies and mutable playback state.
135
+ * @param playbackStepPayload - Worker playback result for the current iteration.
136
+ * @returns Nothing.
137
+ */
138
+ export function emitPlaybackFrameStats(
139
+ iterationContext: PlaybackIterationContext,
140
+ playbackStepPayload: Awaited<ReturnType<typeof requestWorkerPlaybackStep>>,
141
+ ): void {
142
+ // Step 1: Resolve leader metrics from the updated render state.
143
+ const { renderState, loopState } = iterationContext.sessionContext;
144
+ const leaderPipesPassed = resolveLeaderPipesPassed(renderState.birds);
145
+ const leaderFramesSurvived = resolveLeaderFramesSurvived(renderState);
146
+ loopState.summary.latestLeaderPipesPassed = leaderPipesPassed;
147
+ loopState.summary.latestLeaderFramesSurvived = leaderFramesSurvived;
148
+
149
+ // Step 2: Emit frame telemetry for HUD and runtime consumers.
150
+ iterationContext.onFrameStats(
151
+ resolvePlaybackFrameStats(
152
+ playbackStepPayload,
153
+ renderState.frameIndex,
154
+ resolveAliveBirdCount(renderState.birds),
155
+ leaderPipesPassed,
156
+ leaderFramesSurvived,
157
+ ),
158
+ );
159
+ }
160
+
161
+ /**
162
+ * Updates the loop summary when the worker reports playback completion.
163
+ *
164
+ * @param loopState - Mutable playback loop state.
165
+ * @param playbackStepPayload - Worker playback result for the current iteration.
166
+ * @returns Nothing.
167
+ */
168
+ export function updatePlaybackLoopCompletion(
169
+ loopState: PlaybackLoopState,
170
+ playbackStepPayload: Awaited<ReturnType<typeof requestWorkerPlaybackStep>>,
171
+ ): void {
172
+ // Step 1: Skip summary folding until the worker marks playback complete.
173
+ if (!playbackStepPayload.done) {
174
+ return;
175
+ }
176
+
177
+ // Step 2: Fold the final aggregate summary into the mutable loop state.
178
+ const playbackCompletionSummary = resolvePlaybackCompletionSummary(
179
+ playbackStepPayload,
180
+ loopState.summary.latestLeaderPipesPassed,
181
+ loopState.summary.latestLeaderFramesSurvived,
182
+ );
183
+ loopState.finished = true;
184
+ loopState.summary.averagePipesPassed =
185
+ playbackCompletionSummary.averagePipesPassed;
186
+ loopState.summary.p90FramesSurvived =
187
+ playbackCompletionSummary.p90FramesSurvived;
188
+ loopState.summary.winnerPipesPassed =
189
+ playbackCompletionSummary.winnerPipesPassed;
190
+ loopState.summary.winnerFramesSurvived =
191
+ playbackCompletionSummary.winnerFramesSurvived;
192
+ }
@@ -1,8 +1,20 @@
1
1
  import { PlaybackAnimationFrameUnavailableError } from './playback.errors';
2
2
 
3
+ /**
4
+ * Browser frame-pacing helpers for playback animation.
5
+ *
6
+ * The playback loop advances worker simulation in batches but still presents
7
+ * frames at browser animation cadence. This module isolates the
8
+ * `requestAnimationFrame` dependency so playback orchestration can read more
9
+ * clearly and fail with a targeted error when RAF is unavailable.
10
+ */
11
+
3
12
  /**
4
13
  * Yields until the next browser animation frame.
5
14
  *
15
+ * In browser rendering terms, this is the pacing boundary between simulation
16
+ * work and visible painting.
17
+ *
6
18
  * @returns Promise resolved on next animation frame.
7
19
  */
8
20
  export function nextAnimationFrame(): Promise<void> {
@@ -0,0 +1,78 @@
1
+ import type {
2
+ PlaybackFrameStats,
3
+ PopulationRenderState,
4
+ TrailState,
5
+ } from '../browser-entry.types';
6
+
7
+ /**
8
+ * Playback orchestration contracts for the Flappy Bird browser demo.
9
+ *
10
+ * These types describe the moving pieces of one playback episode: the public
11
+ * summary returned at the end, the mutable loop bookkeeping used while frames
12
+ * are streaming, and the session context mirrored locally in the browser.
13
+ */
14
+
15
+ /**
16
+ * Public aggregate playback summary returned after one episode completes.
17
+ *
18
+ * The summary captures the headline outcomes of the just-finished population
19
+ * run without exposing all internal frame-by-frame details.
20
+ */
21
+ export type PlaybackEpisodeSummary = {
22
+ averagePipesPassed: number;
23
+ p90FramesSurvived: number;
24
+ winnerPipesPassed: number;
25
+ winnerFramesSurvived: number;
26
+ };
27
+
28
+ /**
29
+ * Mutable playback summary extended with latest leader telemetry fallbacks.
30
+ *
31
+ * During playback the browser may need temporary "latest known" values before
32
+ * the worker emits final aggregate statistics, so the mutable form carries both
33
+ * final fields and rolling fallbacks.
34
+ */
35
+ export type PlaybackMutableSummary = PlaybackEpisodeSummary & {
36
+ latestLeaderPipesPassed: number;
37
+ latestLeaderFramesSurvived: number;
38
+ };
39
+
40
+ /**
41
+ * Mutable loop bookkeeping shared across playback iterations.
42
+ *
43
+ * This is the browser-side state machine for the playback loop: how much
44
+ * simulation budget is being requested, whether the episode has finished, and
45
+ * what aggregate summary has been observed so far.
46
+ */
47
+ export type PlaybackLoopState = {
48
+ simulationFrameBudget: number;
49
+ finished: boolean;
50
+ summary: PlaybackMutableSummary;
51
+ };
52
+
53
+ /**
54
+ * Shared mutable playback state mirrored locally while worker playback runs.
55
+ *
56
+ * The worker remains the source of truth for simulation, but the browser keeps
57
+ * lightweight mirrored state for rendering, trail accumulation, and loop
58
+ * orchestration.
59
+ */
60
+ export type PlaybackSessionContext = {
61
+ renderState: PopulationRenderState;
62
+ trailState: TrailState;
63
+ loopState: PlaybackLoopState;
64
+ };
65
+
66
+ /**
67
+ * Shared dependencies and mutable state used by one playback iteration.
68
+ *
69
+ * Grouping these fields into one context object keeps the iteration services
70
+ * declarative and avoids long parameter lists across the playback loop.
71
+ */
72
+ export type PlaybackIterationContext = {
73
+ canvas: HTMLCanvasElement;
74
+ context: CanvasRenderingContext2D;
75
+ evolutionWorker: Worker;
76
+ onFrameStats: (stats: PlaybackFrameStats) => void;
77
+ sessionContext: PlaybackSessionContext;
78
+ };
@@ -0,0 +1,128 @@
1
+ import {
2
+ FLAPPY_PIPE_ENTRY_RIM_INSET_PX,
3
+ FLAPPY_NEON_PALETTE,
4
+ FLAPPY_PIPE_OUTLINE_CYAN_GLOW_BLUR_PX,
5
+ FLAPPY_PIPE_OUTLINE_CYAN_GLOW_COLOR,
6
+ FLAPPY_PIPE_OUTLINE_GLOW_ALPHA,
7
+ FLAPPY_PIPE_OUTLINE_GLOW_STROKE_WIDTH_PX,
8
+ FLAPPY_PIPE_OUTLINE_STROKE_WIDTH_PX,
9
+ } from '../../constants/constants';
10
+
11
+ /**
12
+ * Draws a simplified neon outline around a pipe rectangle.
13
+ *
14
+ * @param context - Canvas 2D context.
15
+ * @param rectangleLeftPx - Rectangle left position.
16
+ * @param rectangleTopPx - Rectangle top position.
17
+ * @param rectangleWidthPx - Rectangle width.
18
+ * @param rectangleHeightPx - Rectangle height.
19
+ * @returns Nothing.
20
+ */
21
+ export function drawPipeNeonOutline(
22
+ context: CanvasRenderingContext2D,
23
+ rectangleLeftPx: number,
24
+ rectangleTopPx: number,
25
+ rectangleWidthPx: number,
26
+ rectangleHeightPx: number,
27
+ ): void {
28
+ context.save();
29
+ if (rectangleWidthPx <= 0 || rectangleHeightPx <= 0) {
30
+ context.restore();
31
+ return;
32
+ }
33
+
34
+ const alignedRectangle = resolveAlignedPipeOutlineRectangle({
35
+ rectangleLeftPx,
36
+ rectangleTopPx,
37
+ rectangleWidthPx,
38
+ rectangleHeightPx,
39
+ });
40
+ const pipeOutlinePath = resolvePipeOutlinePath(alignedRectangle);
41
+
42
+ const previousCompositeOperation = context.globalCompositeOperation;
43
+ context.globalCompositeOperation = 'lighter';
44
+ context.strokeStyle = FLAPPY_NEON_PALETTE.pipeFill;
45
+
46
+ context.globalAlpha = FLAPPY_PIPE_OUTLINE_GLOW_ALPHA;
47
+ context.shadowColor = FLAPPY_PIPE_OUTLINE_CYAN_GLOW_COLOR;
48
+ context.shadowBlur = FLAPPY_PIPE_OUTLINE_CYAN_GLOW_BLUR_PX;
49
+ context.shadowOffsetX = 0;
50
+ context.shadowOffsetY = 0;
51
+ context.lineWidth = FLAPPY_PIPE_OUTLINE_GLOW_STROKE_WIDTH_PX;
52
+ context.stroke(pipeOutlinePath);
53
+
54
+ context.globalAlpha = 1;
55
+ context.shadowBlur = 0;
56
+ context.shadowColor = 'transparent';
57
+ context.lineWidth = FLAPPY_PIPE_OUTLINE_STROKE_WIDTH_PX;
58
+ context.stroke(pipeOutlinePath);
59
+
60
+ context.globalCompositeOperation = previousCompositeOperation;
61
+ context.restore();
62
+ }
63
+
64
+ /**
65
+ * Resolves a pixel-aligned rectangle used by the pipe outline renderer.
66
+ *
67
+ * @param input - Raw pipe rectangle values.
68
+ * @returns Aligned rectangle ready for outline rendering.
69
+ */
70
+ function resolveAlignedPipeOutlineRectangle(input: {
71
+ rectangleLeftPx: number;
72
+ rectangleTopPx: number;
73
+ rectangleWidthPx: number;
74
+ rectangleHeightPx: number;
75
+ }): {
76
+ alignedLeftPx: number;
77
+ alignedTopPx: number;
78
+ alignedWidthPx: number;
79
+ alignedHeightPx: number;
80
+ } {
81
+ return {
82
+ alignedLeftPx: Math.round(input.rectangleLeftPx),
83
+ alignedTopPx: Math.round(input.rectangleTopPx),
84
+ alignedWidthPx: Math.max(1, Math.round(input.rectangleWidthPx)),
85
+ alignedHeightPx: Math.max(1, Math.round(input.rectangleHeightPx)),
86
+ };
87
+ }
88
+
89
+ /**
90
+ * Resolves the reusable outline path for one pipe body and its entrance rim.
91
+ *
92
+ * @param alignedRectangle - Pixel-aligned rectangle used by the outline renderer.
93
+ * @returns Path containing the outer pipe outline and optional entrance rim.
94
+ */
95
+ function resolvePipeOutlinePath(alignedRectangle: {
96
+ alignedLeftPx: number;
97
+ alignedTopPx: number;
98
+ alignedWidthPx: number;
99
+ alignedHeightPx: number;
100
+ }): Path2D {
101
+ const isTopPipeSegment = alignedRectangle.alignedTopPx === 0;
102
+ const entranceLineYPx = isTopPipeSegment
103
+ ? alignedRectangle.alignedTopPx +
104
+ alignedRectangle.alignedHeightPx -
105
+ FLAPPY_PIPE_ENTRY_RIM_INSET_PX
106
+ : alignedRectangle.alignedTopPx + FLAPPY_PIPE_ENTRY_RIM_INSET_PX;
107
+ const pipeOutlinePath = new Path2D();
108
+
109
+ pipeOutlinePath.rect(
110
+ alignedRectangle.alignedLeftPx,
111
+ alignedRectangle.alignedTopPx,
112
+ alignedRectangle.alignedWidthPx,
113
+ alignedRectangle.alignedHeightPx,
114
+ );
115
+ if (
116
+ entranceLineYPx > alignedRectangle.alignedTopPx &&
117
+ entranceLineYPx <
118
+ alignedRectangle.alignedTopPx + alignedRectangle.alignedHeightPx
119
+ ) {
120
+ pipeOutlinePath.moveTo(alignedRectangle.alignedLeftPx, entranceLineYPx);
121
+ pipeOutlinePath.lineTo(
122
+ alignedRectangle.alignedLeftPx + alignedRectangle.alignedWidthPx,
123
+ entranceLineYPx,
124
+ );
125
+ }
126
+
127
+ return pipeOutlinePath;
128
+ }
@@ -1,116 +1 @@
1
- import {
2
- FLAPPY_NEON_PALETTE,
3
- FLAPPY_PIPE_OUTLINE_CYAN_GLOW_BLUR_PX,
4
- FLAPPY_PIPE_OUTLINE_CYAN_GLOW_COLOR,
5
- FLAPPY_PIPE_OUTLINE_ENTRANCE_GAP_PX,
6
- FLAPPY_PIPE_OUTLINE_GLOW_ALPHA,
7
- FLAPPY_PIPE_OUTLINE_GLOW_STROKE_WIDTH_PX,
8
- FLAPPY_PIPE_OUTLINE_SIDE_GAP_PX,
9
- FLAPPY_PIPE_OUTLINE_STROKE_WIDTH_PX,
10
- } from '../../constants/constants';
11
-
12
- /**
13
- * Draws a simplified neon outline around a pipe rectangle.
14
- *
15
- * @param context - Canvas 2D context.
16
- * @param rectangleLeftPx - Rectangle left position.
17
- * @param rectangleTopPx - Rectangle top position.
18
- * @param rectangleWidthPx - Rectangle width.
19
- * @param rectangleHeightPx - Rectangle height.
20
- * @returns Nothing.
21
- */
22
- export function drawPipeNeonOutline(
23
- context: CanvasRenderingContext2D,
24
- rectangleLeftPx: number,
25
- rectangleTopPx: number,
26
- rectangleWidthPx: number,
27
- rectangleHeightPx: number,
28
- ): void {
29
- context.save();
30
- // Step 1: Guard degenerate rectangles.
31
- if (rectangleWidthPx <= 0 || rectangleHeightPx <= 0) {
32
- context.restore();
33
- return;
34
- }
35
-
36
- const alignedLeftPx = Math.round(rectangleLeftPx);
37
- const alignedTopPx = Math.round(rectangleTopPx);
38
- const alignedWidthPx = Math.max(1, Math.round(rectangleWidthPx));
39
- const alignedHeightPx = Math.max(1, Math.round(rectangleHeightPx));
40
-
41
- // Step 2: Compute outline geometry.
42
- // We want a small side gap and a larger "entrance" gap (top for bottom pipe,
43
- // bottom for top pipe) to suggest a pipe rim.
44
- const outlineStrokeWidthPx = FLAPPY_PIPE_OUTLINE_STROKE_WIDTH_PX;
45
- const outlineStrokeHalfPx = outlineStrokeWidthPx / 2;
46
- const sideExpandPx = Math.round(
47
- FLAPPY_PIPE_OUTLINE_SIDE_GAP_PX + outlineStrokeHalfPx,
48
- );
49
- const entranceExpandPx = Math.round(
50
- FLAPPY_PIPE_OUTLINE_ENTRANCE_GAP_PX + outlineStrokeHalfPx,
51
- );
52
-
53
- const isTopPipeSegment = alignedTopPx === 0;
54
- const outlineTopExpandPx = isTopPipeSegment ? sideExpandPx : entranceExpandPx;
55
- const outlineBottomExpandPx = isTopPipeSegment
56
- ? entranceExpandPx
57
- : sideExpandPx;
58
-
59
- const outlineLeftPx = alignedLeftPx - sideExpandPx;
60
- const outlineTopPx = alignedTopPx - outlineTopExpandPx;
61
- const outlineWidthPx = alignedWidthPx + sideExpandPx * 2;
62
- const outlineHeightPx =
63
- alignedHeightPx + outlineTopExpandPx + outlineBottomExpandPx;
64
-
65
- // Step 3: Define pixel-aligned stroke helper to avoid blurry edges.
66
- const strokeAlignedRect = (
67
- leftPx: number,
68
- topPx: number,
69
- widthPx: number,
70
- heightPx: number,
71
- lineWidthPx: number,
72
- ): void => {
73
- const oddLineAlignmentOffsetPx = lineWidthPx % 2 === 1 ? 0.5 : 0;
74
- context.lineWidth = lineWidthPx;
75
- context.strokeRect(
76
- Math.round(leftPx) + oddLineAlignmentOffsetPx,
77
- Math.round(topPx) + oddLineAlignmentOffsetPx,
78
- Math.max(1, Math.round(widthPx)),
79
- Math.max(1, Math.round(heightPx)),
80
- );
81
- };
82
-
83
- // Step 4: Draw neon-green outline with cyan neon glow.
84
- const previousCompositeOperation = context.globalCompositeOperation;
85
- context.globalCompositeOperation = 'lighter';
86
- context.strokeStyle = FLAPPY_NEON_PALETTE.pipeFill;
87
-
88
- // Step 4.1: Soft glow pass (thicker stroke + cyan shadow).
89
- context.globalAlpha = FLAPPY_PIPE_OUTLINE_GLOW_ALPHA;
90
- context.shadowColor = FLAPPY_PIPE_OUTLINE_CYAN_GLOW_COLOR;
91
- context.shadowBlur = FLAPPY_PIPE_OUTLINE_CYAN_GLOW_BLUR_PX;
92
- context.shadowOffsetX = 0;
93
- context.shadowOffsetY = 0;
94
- strokeAlignedRect(
95
- outlineLeftPx,
96
- outlineTopPx,
97
- outlineWidthPx,
98
- outlineHeightPx,
99
- FLAPPY_PIPE_OUTLINE_GLOW_STROKE_WIDTH_PX,
100
- );
101
-
102
- // Step 4.2: Crisp outline pass (no shadow).
103
- context.globalAlpha = 1;
104
- context.shadowBlur = 0;
105
- context.shadowColor = 'transparent';
106
- strokeAlignedRect(
107
- outlineLeftPx,
108
- outlineTopPx,
109
- outlineWidthPx,
110
- outlineHeightPx,
111
- outlineStrokeWidthPx,
112
- );
113
-
114
- context.globalCompositeOperation = previousCompositeOperation;
115
- context.restore();
116
- }
1
+ export { drawPipeNeonOutline } from './playback.render.pipe-outline.service';