@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.
- package/.github/agents/boundary-mapper.agent.md +31 -0
- package/.github/agents/docs-scout.agent.md +29 -0
- package/.github/agents/plan-scout.agent.md +31 -0
- package/.github/agents/solid-split.agent.md +143 -0
- package/.github/copilot-instructions.md +119 -0
- package/.github/skills/solid-split-playbook/SKILL.md +220 -0
- package/.github/skills/solid-split-playbook/assets/docs-checklist.md +34 -0
- package/.github/skills/solid-split-playbook/assets/split-plan-template.md +48 -0
- package/.github/skills/solid-split-playbook/assets/split-workflow-checklist.md +51 -0
- package/.github/skills/trace-analyzer-extension/SKILL.md +63 -0
- package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +24 -0
- package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +101 -0
- package/.github/skills/trace-audit-reporting/SKILL.md +96 -0
- package/.github/skills/trace-audit-reporting/assets/performance-report-template.md +123 -0
- package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +132 -0
- package/package.json +7 -3
- package/plans/ES2023 migration +13 -8
- package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
- package/plans/Flappy_Bird_Folder_Documentation_Pass.md +53 -0
- package/plans/Flappy_Evolution_Worker_Documentation_Pass.md +58 -0
- package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
- package/plans/Memory_Optimization.md +3 -3
- package/plans/README.md +63 -0
- package/plans/Roadmap.md +15 -3
- package/plans/asciiMaze_SOLID_split.done.md +130 -0
- package/plans/flappy_bird_SOLID_split.done.md +67 -0
- package/scripts/analyze-trace.ts +590 -0
- package/scripts/assets/theme.css +221 -34
- package/scripts/copy-examples.mjs +9 -5
- package/scripts/export-onnx.mjs +3 -3
- package/scripts/generate-bench-tables.mjs +10 -10
- package/scripts/generate-bench-tables.ts +10 -10
- package/scripts/generate-docs.ts +1415 -449
- package/scripts/render-docs-html.ts +15 -8
- package/src/README.md +127 -222
- package/src/architecture/README.md +117 -184
- package/src/architecture/architect.ts +6 -0
- package/src/architecture/layer/README.md +38 -38
- package/src/architecture/network/README.md +49 -31
- package/src/architecture/network/activate/README.md +77 -77
- package/src/architecture/network/connect/README.md +15 -13
- package/src/architecture/network/deterministic/README.md +7 -7
- package/src/architecture/network/evolve/README.md +44 -44
- package/src/architecture/network/gating/README.md +20 -20
- package/src/architecture/network/genetic/README.md +51 -51
- package/src/architecture/network/mutate/README.md +97 -97
- package/src/architecture/network/network.types.ts +39 -0
- package/src/architecture/network/onnx/README.md +264 -264
- package/src/architecture/network/prune/README.md +39 -39
- package/src/architecture/network/remove/README.md +26 -26
- package/src/architecture/network/serialize/README.md +56 -56
- package/src/architecture/network/serialize/network.serialize.json.utils.ts +1 -0
- package/src/architecture/network/serialize/network.serialize.utils.ts +6 -1
- package/src/architecture/network/serialize/network.serialize.utils.types.ts +1 -1
- package/src/architecture/network/slab/README.md +61 -61
- package/src/architecture/network/standalone/README.md +24 -24
- package/src/architecture/network/stats/README.md +9 -9
- package/src/architecture/network/topology/README.md +46 -46
- package/src/architecture/network/training/README.md +21 -21
- package/src/architecture/network.ts +114 -10
- package/src/methods/README.md +9 -87
- package/src/multithreading/README.md +8 -77
- package/src/multithreading/workers/README.md +2 -2
- package/src/multithreading/workers/browser/README.md +0 -6
- package/src/multithreading/workers/node/README.md +0 -3
- package/src/neat/README.md +623 -568
- package/src/neat/neat.evolve.population.utils.ts +29 -5
- package/src/neat/neat.helpers.ts +16 -0
- package/src/neat/neat.topology-intent.utils.ts +160 -0
- package/src/utils/README.md +18 -18
- package/test/examples/asciiMaze/README.md +59 -59
- package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
- package/test/examples/asciiMaze/browser-entry/README.md +196 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
- package/test/examples/asciiMaze/browser-entry.ts +10 -576
- package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
- package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
- package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
- package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
- package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
- package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
- package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
- package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
- package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
- package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
- package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
- package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
- package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
- package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
- package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
- package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
- package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
- package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
- package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
- package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
- package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
- package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
- package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
- package/test/examples/asciiMaze/fitness.ts +2 -2
- package/test/examples/asciiMaze/fitness.types.ts +65 -0
- package/test/examples/asciiMaze/interfaces.ts +64 -1352
- package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
- package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
- package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
- package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
- package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
- package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
- package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
- package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
- package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
- package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
- package/test/examples/flappy_bird/README.md +193 -88
- package/test/examples/flappy_bird/browser-entry/README.md +1441 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
- package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +9 -396
- package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +6 -714
- package/test/examples/flappy_bird/browser-entry/browser-entry.render.types.ts +26 -3
- package/test/examples/flappy_bird/browser-entry/browser-entry.runtime.types.ts +16 -1
- package/test/examples/flappy_bird/browser-entry/browser-entry.simulation.types.ts +39 -5
- package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
- package/test/examples/flappy_bird/browser-entry/browser-entry.stats.types.ts +32 -4
- package/test/examples/flappy_bird/browser-entry/browser-entry.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.types.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.types.ts +50 -7
- package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +21 -893
- package/test/examples/flappy_bird/browser-entry/browser-entry.worker.types.ts +91 -10
- package/test/examples/flappy_bird/browser-entry/host/README.md +318 -0
- package/test/examples/flappy_bird/browser-entry/host/host.canvas.service.ts +16 -0
- package/test/examples/flappy_bird/browser-entry/host/host.constants.ts +20 -0
- package/test/examples/flappy_bird/browser-entry/host/host.dom.service.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
- package/test/examples/flappy_bird/browser-entry/host/host.stats.service.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/host/host.ts +592 -6
- package/test/examples/flappy_bird/browser-entry/host/host.types.ts +13 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/README.md +309 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +47 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +392 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +132 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +92 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +272 -0
- package/test/examples/flappy_bird/browser-entry/network-view/README.md +389 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.draw.service.ts +13 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.labels.utils.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.layout.utils.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +267 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +823 -7
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.types.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/playback/README.md +845 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/README.md +355 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +1068 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.batch.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +207 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +197 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.batch.utils.ts +114 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.test.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.ts +204 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.services.ts +49 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +313 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.layer.services.ts +81 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.test.ts +33 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +201 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts +171 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.timing.utils.ts +124 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.test.ts +279 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +132 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.scene.services.ts +26 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +65 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +342 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +127 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.draw.services.ts +184 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.scene.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +6 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +105 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +541 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.bird.utils.ts +180 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.canvas.services.ts +77 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.entity.services.ts +167 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.scene.services.ts +57 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.test.ts +176 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +113 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +35 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.trail.utils.ts +248 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +103 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
- package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.iteration.services.ts +192 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.loop.service.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.orchestration.types.ts +78 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.render.pipe-outline.service.ts +128 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.render.service.ts +1 -116
- package/test/examples/flappy_bird/browser-entry/playback/playback.session.services.ts +184 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.test.ts +121 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.layer.services.ts +36 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +11 -128
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +268 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +91 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
- package/test/examples/flappy_bird/browser-entry/playback/playback.trail.utils.ts +9 -86
- package/test/examples/flappy_bird/browser-entry/playback/playback.ts +75 -7
- package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +12 -9
- package/test/examples/flappy_bird/browser-entry/playback/playback.worker-channel.utils.ts +11 -123
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +55 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.services.ts +103 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.test.ts +45 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.ts +28 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +95 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.test.ts +35 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.test.ts +37 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.ts +74 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +71 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.request.services.ts +45 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.summary.services.ts +74 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.types.ts +53 -0
- package/test/examples/flappy_bird/browser-entry/runtime/README.md +304 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.browser-globals.service.ts +15 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.errors.ts +17 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +56 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-loop.service.ts +19 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +92 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.telemetry.service.ts +24 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +65 -0
- package/test/examples/flappy_bird/browser-entry/visualization/README.md +568 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.colors.utils.ts +26 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +979 -19
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +157 -3
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +13 -27
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +7 -20
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.types.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +238 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.errors.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.generation.service.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.test.ts +143 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.ts +140 -14
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.request.service.ts +27 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.types.ts +23 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.url.service.ts +5 -0
- package/test/examples/flappy_bird/constants/README.md +1163 -0
- package/test/examples/flappy_bird/constants/constants.birds.ts +16 -38
- package/test/examples/flappy_bird/constants/constants.difficulty.ts +21 -0
- package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
- package/test/examples/flappy_bird/constants/constants.network.ts +1 -1
- package/test/examples/flappy_bird/constants/constants.observation.ts +7 -0
- package/test/examples/flappy_bird/constants/constants.palette.ts +9 -2
- package/test/examples/flappy_bird/constants/constants.physics.ts +9 -0
- package/test/examples/flappy_bird/constants/constants.pipe-render.ts +3 -0
- package/test/examples/flappy_bird/constants/constants.pipes.ts +22 -3
- package/test/examples/flappy_bird/constants/constants.runtime.ts +28 -4
- package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
- package/test/examples/flappy_bird/constants/constants.ts +6 -0
- package/test/examples/flappy_bird/environment/README.md +182 -0
- package/test/examples/flappy_bird/environment/environment.collision.utils.ts +7 -0
- package/test/examples/flappy_bird/environment/environment.constants.ts +16 -3
- package/test/examples/flappy_bird/environment/environment.observation.utils.ts +12 -19
- package/test/examples/flappy_bird/environment/environment.state.service.ts +10 -0
- package/test/examples/flappy_bird/environment/environment.step.service.ts +15 -66
- package/test/examples/flappy_bird/environment/environment.types.ts +14 -0
- package/test/examples/flappy_bird/evaluation/README.md +155 -0
- package/test/examples/flappy_bird/evaluation/evaluation.constants.ts +23 -4
- package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +16 -1
- package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +7 -374
- package/test/examples/flappy_bird/evaluation/evaluation.seed.utils.ts +4 -0
- package/test/examples/flappy_bird/evaluation/evaluation.types.ts +18 -2
- package/test/examples/flappy_bird/evaluation/rollout/README.md +355 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +38 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +71 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +338 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +69 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +399 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/README.md +845 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.constants.ts +49 -7
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.errors.ts +34 -3
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.evolution.service.ts +22 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +62 -26
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.protocol.service.ts +27 -1
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.runtime.service.ts +23 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +378 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +22 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +20 -203
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.test.ts +94 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.ts +78 -13
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +235 -344
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.types.ts +170 -22
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +314 -0
- package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +17 -0
- package/test/examples/flappy_bird/flappyEnvironment.ts +21 -0
- package/test/examples/flappy_bird/flappyEvaluation.ts +12 -0
- package/test/examples/flappy_bird/flappyEvolution.worker.ts +7 -0
- package/test/examples/flappy_bird/index.ts +8 -2
- package/test/examples/flappy_bird/rng.ts +10 -0
- package/test/examples/flappy_bird/simulation-shared/README.md +518 -0
- package/test/examples/flappy_bird/simulation-shared/observation/README.md +255 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +339 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +19 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +81 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.constants.ts +3 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.control.utils.ts +6 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.difficulty.utils.ts +9 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.errors.ts +10 -1
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.memory.utils.ts +18 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +7 -402
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +36 -6
- package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +30 -9
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.types.ts +38 -5
- package/test/examples/flappy_bird/trainFlappyBird.ts +13 -0
- package/test/examples/flappy_bird/trainer/README.md +676 -0
- package/test/examples/flappy_bird/trainer/evaluation/README.md +253 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +15 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +86 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +187 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +32 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +182 -0
- package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
- package/test/examples/flappy_bird/trainer/trainer.fitness.service.ts +23 -1
- package/test/examples/flappy_bird/trainer/trainer.loop.service.ts +17 -1
- package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
- package/test/examples/flappy_bird/trainer/trainer.report.service.ts +136 -0
- package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
- package/test/examples/flappy_bird/trainer/trainer.setup.service.ts +22 -0
- package/test/examples/flappy_bird/trainer/trainer.signals.service.ts +8 -0
- package/test/examples/flappy_bird/trainer/trainer.ts +38 -553
- package/test/examples/flappy_bird/trainer/trainer.types.ts +44 -7
- package/test/neat/neat.topology-intent.test.ts +129 -0
- package/test/network/network.topology-intent.test.ts +44 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
- package/test/examples/flappy_bird/environment/environment.ts +0 -7
- package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
- package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FLAPPY_GROUND_GRID_DEPTH_CURVE_EXPONENT,
|
|
3
|
+
FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT,
|
|
4
|
+
FLAPPY_GROUND_GRID_MAX_ALPHA,
|
|
5
|
+
FLAPPY_GROUND_GRID_MAX_BLUR_PX,
|
|
6
|
+
FLAPPY_GROUND_GRID_MAX_THICKNESS_PX,
|
|
7
|
+
FLAPPY_GROUND_GRID_MIN_ALPHA,
|
|
8
|
+
FLAPPY_GROUND_GRID_MIN_BLUR_PX,
|
|
9
|
+
FLAPPY_GROUND_GRID_MIN_THICKNESS_PX,
|
|
10
|
+
FLAPPY_GROUND_GRID_PIPE_CONNECTION_LINE_OFFSET_FROM_BOTTOM,
|
|
11
|
+
FLAPPY_GROUND_GRID_SCROLL_RATIO,
|
|
12
|
+
} from './playback.background.ground-grid.constants';
|
|
13
|
+
import { resolvePlaybackBackgroundLayout } from '../playback.background.utils';
|
|
14
|
+
|
|
15
|
+
const cachedPipeConnectionProfileByHeight = new Map<
|
|
16
|
+
number,
|
|
17
|
+
PlaybackGroundGridPipeConnectionProfile
|
|
18
|
+
>();
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Small point value used when interpolating positions along one grid ray.
|
|
22
|
+
*/
|
|
23
|
+
export type PlaybackGroundGridPoint = {
|
|
24
|
+
xPx: number;
|
|
25
|
+
yPx: number;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Shared pipe-floor projection resolved from the lower ground-grid geometry.
|
|
30
|
+
*/
|
|
31
|
+
export type PlaybackGroundGridPipeConnectionProfile = {
|
|
32
|
+
pipeFloorYPx: number;
|
|
33
|
+
matchedRayScrollRatio: number;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Maps a normalized depth ratio into a stronger synthwave spacing curve.
|
|
38
|
+
*
|
|
39
|
+
* @param depthRatio - Normalized 0..1 depth where 0 is far and 1 is near.
|
|
40
|
+
* @returns Curved depth ratio used for line placement and styling.
|
|
41
|
+
*/
|
|
42
|
+
export function resolvePlaybackGroundGridDepthCurve(
|
|
43
|
+
depthRatio: number,
|
|
44
|
+
): number {
|
|
45
|
+
return Math.pow(depthRatio, FLAPPY_GROUND_GRID_DEPTH_CURVE_EXPONENT);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Resolves neon alpha for one line based on its normalized depth.
|
|
50
|
+
*
|
|
51
|
+
* @param depthRatio - Normalized 0..1 depth where 0 is far and 1 is near.
|
|
52
|
+
* @returns Opacity for the rendered line.
|
|
53
|
+
*/
|
|
54
|
+
export function resolvePlaybackGroundGridLineAlpha(depthRatio: number): number {
|
|
55
|
+
return (
|
|
56
|
+
FLAPPY_GROUND_GRID_MIN_ALPHA +
|
|
57
|
+
(FLAPPY_GROUND_GRID_MAX_ALPHA - FLAPPY_GROUND_GRID_MIN_ALPHA) * depthRatio
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Resolves glow blur for one line based on its normalized depth.
|
|
63
|
+
*
|
|
64
|
+
* @param depthRatio - Normalized 0..1 depth where 0 is far and 1 is near.
|
|
65
|
+
* @returns Blur radius for the rendered line.
|
|
66
|
+
*/
|
|
67
|
+
export function resolvePlaybackGroundGridLineBlur(depthRatio: number): number {
|
|
68
|
+
return (
|
|
69
|
+
FLAPPY_GROUND_GRID_MAX_BLUR_PX -
|
|
70
|
+
(FLAPPY_GROUND_GRID_MAX_BLUR_PX - FLAPPY_GROUND_GRID_MIN_BLUR_PX) *
|
|
71
|
+
depthRatio
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Resolves stroke thickness for one line based on its normalized depth.
|
|
77
|
+
*
|
|
78
|
+
* @param depthRatio - Normalized 0..1 depth where 0 is far and 1 is near.
|
|
79
|
+
* @returns Stroke width in pixels.
|
|
80
|
+
*/
|
|
81
|
+
export function resolvePlaybackGroundGridLineThickness(
|
|
82
|
+
depthRatio: number,
|
|
83
|
+
): number {
|
|
84
|
+
return (
|
|
85
|
+
FLAPPY_GROUND_GRID_MIN_THICKNESS_PX +
|
|
86
|
+
(FLAPPY_GROUND_GRID_MAX_THICKNESS_PX -
|
|
87
|
+
FLAPPY_GROUND_GRID_MIN_THICKNESS_PX) *
|
|
88
|
+
depthRatio
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Resolves normalized depth from a vertical distance away from the horizon.
|
|
94
|
+
*
|
|
95
|
+
* @param distanceToHorizonPx - Vertical distance from the vanishing horizon.
|
|
96
|
+
* @param maximumDistanceToHorizonPx - Largest visible vertical horizon distance.
|
|
97
|
+
* @returns Normalized 0..1 depth where 0 is at the horizon and 1 is nearest.
|
|
98
|
+
*/
|
|
99
|
+
export function resolvePlaybackGroundGridDepthFromHorizonDistance(
|
|
100
|
+
distanceToHorizonPx: number,
|
|
101
|
+
maximumDistanceToHorizonPx: number,
|
|
102
|
+
): number {
|
|
103
|
+
if (maximumDistanceToHorizonPx <= 0) {
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return Math.min(
|
|
108
|
+
1,
|
|
109
|
+
Math.max(0, distanceToHorizonPx / maximumDistanceToHorizonPx),
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Resolves the shared lower-pipe floor and matched grid-ray scroll ratio.
|
|
115
|
+
*
|
|
116
|
+
* The lower pipe is visually clipped to the first usable horizontal grid band
|
|
117
|
+
* above the bottom edge. The returned scroll ratio then speeds up the moving
|
|
118
|
+
* perspective rays so their lateral motion matches the pipe speed exactly at
|
|
119
|
+
* that same projected height.
|
|
120
|
+
*
|
|
121
|
+
* @param visibleWorldHeightPx - Current visible world height in pixels.
|
|
122
|
+
* @returns Pipe-floor y-position plus the matching vertical-ray scroll ratio.
|
|
123
|
+
*/
|
|
124
|
+
export function resolvePlaybackGroundGridPipeConnectionProfile(
|
|
125
|
+
visibleWorldHeightPx: number,
|
|
126
|
+
): PlaybackGroundGridPipeConnectionProfile {
|
|
127
|
+
const cachedProfile =
|
|
128
|
+
cachedPipeConnectionProfileByHeight.get(visibleWorldHeightPx);
|
|
129
|
+
if (cachedProfile) {
|
|
130
|
+
return cachedProfile;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Step 1: Resolve the lower-band layout used by both the grid and pipe illusion.
|
|
134
|
+
const backgroundLayout =
|
|
135
|
+
resolvePlaybackBackgroundLayout(visibleWorldHeightPx);
|
|
136
|
+
const connectionLineIndex = Math.max(
|
|
137
|
+
0,
|
|
138
|
+
FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT -
|
|
139
|
+
FLAPPY_GROUND_GRID_PIPE_CONNECTION_LINE_OFFSET_FROM_BOTTOM -
|
|
140
|
+
1,
|
|
141
|
+
);
|
|
142
|
+
const depthRatio =
|
|
143
|
+
(connectionLineIndex + 1) / FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT;
|
|
144
|
+
const curvedDepthRatio = resolvePlaybackGroundGridDepthCurve(depthRatio);
|
|
145
|
+
const pipeFloorYPx =
|
|
146
|
+
backgroundLayout.lowerBandTopYPx +
|
|
147
|
+
curvedDepthRatio * backgroundLayout.lowerBandHeightPx;
|
|
148
|
+
|
|
149
|
+
// Step 2: Resolve how much anchor motion survives at the projected floor height.
|
|
150
|
+
const vanishingPointYPx = Math.max(0, visibleWorldHeightPx * 0.5);
|
|
151
|
+
const verticalTravelPx =
|
|
152
|
+
vanishingPointYPx - backgroundLayout.lowerBandBottomYPx;
|
|
153
|
+
const interpolationRatio =
|
|
154
|
+
Math.abs(verticalTravelPx) < Number.EPSILON
|
|
155
|
+
? 0
|
|
156
|
+
: (pipeFloorYPx - backgroundLayout.lowerBandBottomYPx) / verticalTravelPx;
|
|
157
|
+
const clampedInterpolationRatio = Math.min(
|
|
158
|
+
0.999,
|
|
159
|
+
Math.max(0, interpolationRatio),
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
// Step 3: Return the floor height and the ray-scroll multiplier needed there.
|
|
163
|
+
const pipeConnectionProfile = {
|
|
164
|
+
pipeFloorYPx,
|
|
165
|
+
matchedRayScrollRatio:
|
|
166
|
+
1 /
|
|
167
|
+
Math.max(
|
|
168
|
+
Number.EPSILON,
|
|
169
|
+
FLAPPY_GROUND_GRID_SCROLL_RATIO * (1 - clampedInterpolationRatio),
|
|
170
|
+
),
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
cachedPipeConnectionProfileByHeight.set(
|
|
174
|
+
visibleWorldHeightPx,
|
|
175
|
+
pipeConnectionProfile,
|
|
176
|
+
);
|
|
177
|
+
return pipeConnectionProfile;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Interpolates one point along a perspective ray.
|
|
182
|
+
*
|
|
183
|
+
* @param startXPx - Bottom anchor x-position.
|
|
184
|
+
* @param startYPx - Bottom anchor y-position.
|
|
185
|
+
* @param endXPx - Vanishing-point x-position.
|
|
186
|
+
* @param endYPx - Vanishing-point y-position.
|
|
187
|
+
* @param interpolationRatio - Normalized 0..1 position along the ray.
|
|
188
|
+
* @returns Interpolated point on the perspective ray.
|
|
189
|
+
*/
|
|
190
|
+
export function interpolatePlaybackGroundGridPoint(
|
|
191
|
+
startXPx: number,
|
|
192
|
+
startYPx: number,
|
|
193
|
+
endXPx: number,
|
|
194
|
+
endYPx: number,
|
|
195
|
+
interpolationRatio: number,
|
|
196
|
+
): PlaybackGroundGridPoint {
|
|
197
|
+
return {
|
|
198
|
+
xPx: startXPx + (endXPx - startXPx) * interpolationRatio,
|
|
199
|
+
yPx: startYPx + (endYPx - startYPx) * interpolationRatio,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT } from './playback.background.ground-grid.constants';
|
|
2
|
+
import { interpolatePlaybackGroundGridPoint } from './playback.background.ground-grid.math.utils';
|
|
3
|
+
import type {
|
|
4
|
+
PlaybackGroundGridPulsePath,
|
|
5
|
+
PlaybackGroundGridVerticalPulseContinuationState,
|
|
6
|
+
} from './playback.background.ground-grid.types';
|
|
7
|
+
|
|
8
|
+
const cachedVerticalPulseContinuationBySlot = new Map<
|
|
9
|
+
number,
|
|
10
|
+
PlaybackGroundGridVerticalPulseContinuationState
|
|
11
|
+
>();
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Resolves the current vertical pulse path while preserving per-slot continuity.
|
|
15
|
+
*
|
|
16
|
+
* A vertical pulse should stay attached to one moving ray for its whole
|
|
17
|
+
* lifetime, even though the frame-local ray array is rebuilt as scroll wraps.
|
|
18
|
+
* This helper first prefers the nearest continuation of the previous frame's
|
|
19
|
+
* pulse position, then falls back to deterministic slot-based selection.
|
|
20
|
+
*
|
|
21
|
+
* @param verticalPulsePaths - Full vertical ray paths for the current frame.
|
|
22
|
+
* @param visibleVerticalPulsePaths - Visible subset preferred for on-screen pulses.
|
|
23
|
+
* @param pulseSlotIndex - Zero-based pulse slot index.
|
|
24
|
+
* @param frameIndex - Current deterministic frame index.
|
|
25
|
+
* @param travelProgressRatio - Current travel ratio along the chosen line.
|
|
26
|
+
* @param resolveUnitHash - Deterministic unit-hash helper used for fallback picks.
|
|
27
|
+
* @returns Vertical pulse path, or null when none are available.
|
|
28
|
+
*/
|
|
29
|
+
export function resolvePlaybackGroundGridVerticalPulseSelection(input: {
|
|
30
|
+
verticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
31
|
+
visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
32
|
+
pulseSlotIndex: number;
|
|
33
|
+
frameIndex: number;
|
|
34
|
+
travelProgressRatio: number;
|
|
35
|
+
resolveUnitHash: (seed: number, salt: number) => number;
|
|
36
|
+
}): PlaybackGroundGridPulsePath | null {
|
|
37
|
+
if (input.verticalPulsePaths.length === 0) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
trimCachedVerticalPulseContinuationState(input.pulseSlotIndex);
|
|
42
|
+
|
|
43
|
+
const candidatePulsePaths = resolveStableVerticalPulsePathCandidates(
|
|
44
|
+
input.verticalPulsePaths,
|
|
45
|
+
input.visibleVerticalPulsePaths,
|
|
46
|
+
);
|
|
47
|
+
const continuedPulsePath = resolveContinuedVerticalPulsePath({
|
|
48
|
+
candidatePulsePaths,
|
|
49
|
+
pulseSlotIndex: input.pulseSlotIndex,
|
|
50
|
+
frameIndex: input.frameIndex,
|
|
51
|
+
travelProgressRatio: input.travelProgressRatio,
|
|
52
|
+
});
|
|
53
|
+
if (continuedPulsePath) {
|
|
54
|
+
return continuedPulsePath;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const selectedPathIndex = Math.min(
|
|
58
|
+
candidatePulsePaths.length - 1,
|
|
59
|
+
Math.floor(
|
|
60
|
+
input.resolveUnitHash(input.pulseSlotIndex, 23) *
|
|
61
|
+
candidatePulsePaths.length,
|
|
62
|
+
),
|
|
63
|
+
);
|
|
64
|
+
return candidatePulsePaths[selectedPathIndex];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Stores the resolved pulse center for continuation on the next frame.
|
|
69
|
+
*
|
|
70
|
+
* @param pulseSlotIndex - Zero-based pulse slot index.
|
|
71
|
+
* @param continuationState - Latest visible pulse position for the slot.
|
|
72
|
+
* @returns Nothing.
|
|
73
|
+
*/
|
|
74
|
+
export function rememberPlaybackGroundGridVerticalPulseSelection(
|
|
75
|
+
pulseSlotIndex: number,
|
|
76
|
+
continuationState: PlaybackGroundGridVerticalPulseContinuationState,
|
|
77
|
+
): void {
|
|
78
|
+
cachedVerticalPulseContinuationBySlot.set(pulseSlotIndex, continuationState);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Resolves the nearest continued vertical pulse path for an active slot.
|
|
83
|
+
*
|
|
84
|
+
* @param input - Continuation input for the current frame.
|
|
85
|
+
* @returns Continued pulse path when one can be matched, otherwise null.
|
|
86
|
+
*/
|
|
87
|
+
function resolveContinuedVerticalPulsePath(input: {
|
|
88
|
+
candidatePulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
89
|
+
pulseSlotIndex: number;
|
|
90
|
+
frameIndex: number;
|
|
91
|
+
travelProgressRatio: number;
|
|
92
|
+
}): PlaybackGroundGridPulsePath | null {
|
|
93
|
+
const cachedContinuationState = cachedVerticalPulseContinuationBySlot.get(
|
|
94
|
+
input.pulseSlotIndex,
|
|
95
|
+
);
|
|
96
|
+
if (!cachedContinuationState) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (input.frameIndex <= cachedContinuationState.frameIndex) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let closestPulsePath: PlaybackGroundGridPulsePath | null = null;
|
|
105
|
+
let closestDistanceSquared = Number.POSITIVE_INFINITY;
|
|
106
|
+
|
|
107
|
+
for (const candidatePulsePath of input.candidatePulsePaths) {
|
|
108
|
+
const candidateCenter = interpolatePlaybackGroundGridPoint(
|
|
109
|
+
candidatePulsePath.startXPx,
|
|
110
|
+
candidatePulsePath.startYPx,
|
|
111
|
+
candidatePulsePath.endXPx,
|
|
112
|
+
candidatePulsePath.endYPx,
|
|
113
|
+
input.travelProgressRatio,
|
|
114
|
+
);
|
|
115
|
+
const deltaXPx = candidateCenter.xPx - cachedContinuationState.centerXPx;
|
|
116
|
+
const deltaYPx = candidateCenter.yPx - cachedContinuationState.centerYPx;
|
|
117
|
+
const distanceSquared = deltaXPx * deltaXPx + deltaYPx * deltaYPx;
|
|
118
|
+
|
|
119
|
+
if (distanceSquared < closestDistanceSquared) {
|
|
120
|
+
closestDistanceSquared = distanceSquared;
|
|
121
|
+
closestPulsePath = candidatePulsePath;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return closestPulsePath;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Trims cached continuation state so only the current or previous pulse slots remain.
|
|
130
|
+
*
|
|
131
|
+
* @param currentPulseSlotIndex - Pulse slot currently being resolved.
|
|
132
|
+
* @returns Nothing.
|
|
133
|
+
*/
|
|
134
|
+
function trimCachedVerticalPulseContinuationState(
|
|
135
|
+
currentPulseSlotIndex: number,
|
|
136
|
+
): void {
|
|
137
|
+
for (const cachedPulseSlotIndex of cachedVerticalPulseContinuationBySlot.keys()) {
|
|
138
|
+
if (cachedPulseSlotIndex < currentPulseSlotIndex - 1) {
|
|
139
|
+
cachedVerticalPulseContinuationBySlot.delete(cachedPulseSlotIndex);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Resolves a stable vertical pulse-candidate set for one frame.
|
|
146
|
+
*
|
|
147
|
+
* @param verticalPulsePaths - Full vertical ray paths for the current frame.
|
|
148
|
+
* @param visibleVerticalPulsePaths - Midpoint-visible subset used as fallback.
|
|
149
|
+
* @returns Stable candidate set for deterministic vertical pulse selection.
|
|
150
|
+
*/
|
|
151
|
+
function resolveStableVerticalPulsePathCandidates(
|
|
152
|
+
verticalPulsePaths: readonly PlaybackGroundGridPulsePath[],
|
|
153
|
+
visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[],
|
|
154
|
+
): readonly PlaybackGroundGridPulsePath[] {
|
|
155
|
+
const stableCandidatePaths = verticalPulsePaths.slice(
|
|
156
|
+
FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT,
|
|
157
|
+
Math.max(
|
|
158
|
+
FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT,
|
|
159
|
+
verticalPulsePaths.length - FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT,
|
|
160
|
+
),
|
|
161
|
+
);
|
|
162
|
+
if (stableCandidatePaths.length > 0) {
|
|
163
|
+
return stableCandidatePaths;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (visibleVerticalPulsePaths.length > 0) {
|
|
167
|
+
return visibleVerticalPulsePaths;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return verticalPulsePaths;
|
|
171
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FLAPPY_GROUND_GRID_APPROX_FRAME_DURATION_MS,
|
|
3
|
+
FLAPPY_GROUND_GRID_PULSE_INTERVAL_MS,
|
|
4
|
+
FLAPPY_GROUND_GRID_PULSE_LIFETIME_MS,
|
|
5
|
+
FLAPPY_GROUND_GRID_UNSIGNED_NORMALIZATION_DIVISOR,
|
|
6
|
+
FLAPPY_GROUND_GRID_VERTICAL_PULSE_END_RATIO,
|
|
7
|
+
FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO,
|
|
8
|
+
} from './playback.background.ground-grid.constants';
|
|
9
|
+
import type {
|
|
10
|
+
PlaybackGroundGridPulseOrientation,
|
|
11
|
+
PlaybackGroundGridPulsePath,
|
|
12
|
+
PlaybackGroundGridPulseTimingState,
|
|
13
|
+
PlaybackGroundGridPulseTravelRatioInput,
|
|
14
|
+
} from './playback.background.ground-grid.types';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Resolves timing state for the currently active deterministic pulse slot.
|
|
18
|
+
*
|
|
19
|
+
* @param frameIndex - Current deterministic playback frame index.
|
|
20
|
+
* @returns Pulse timing state, or null when no pulse is active in this frame.
|
|
21
|
+
*/
|
|
22
|
+
export function resolvePlaybackGroundGridPulseTiming(
|
|
23
|
+
frameIndex: number,
|
|
24
|
+
): PlaybackGroundGridPulseTimingState | null {
|
|
25
|
+
const currentTimeMs =
|
|
26
|
+
frameIndex * FLAPPY_GROUND_GRID_APPROX_FRAME_DURATION_MS;
|
|
27
|
+
const pulseSlotIndex = Math.floor(
|
|
28
|
+
currentTimeMs / FLAPPY_GROUND_GRID_PULSE_INTERVAL_MS,
|
|
29
|
+
);
|
|
30
|
+
const pulseElapsedMs =
|
|
31
|
+
currentTimeMs - pulseSlotIndex * FLAPPY_GROUND_GRID_PULSE_INTERVAL_MS;
|
|
32
|
+
if (pulseElapsedMs > FLAPPY_GROUND_GRID_PULSE_LIFETIME_MS) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
pulseSlotIndex,
|
|
38
|
+
pulseElapsedMs,
|
|
39
|
+
lifetimeProgressRatio:
|
|
40
|
+
pulseElapsedMs / FLAPPY_GROUND_GRID_PULSE_LIFETIME_MS,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Resolves pulse orientation for one deterministic pulse slot.
|
|
46
|
+
*
|
|
47
|
+
* @param pulseSlotIndex - Zero-based pulse slot index.
|
|
48
|
+
* @returns Horizontal or vertical pulse travel orientation.
|
|
49
|
+
*/
|
|
50
|
+
export function resolvePlaybackGroundGridPulseOrientation(
|
|
51
|
+
pulseSlotIndex: number,
|
|
52
|
+
): PlaybackGroundGridPulseOrientation {
|
|
53
|
+
return resolvePlaybackGroundGridUnitHash(pulseSlotIndex, 11) >= 0.5
|
|
54
|
+
? 'horizontal'
|
|
55
|
+
: 'vertical';
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Selects one thick-enough horizontal band for the current pulse slot.
|
|
60
|
+
*
|
|
61
|
+
* @param horizontalPulsePaths - Cached horizontal pulse paths eligible for travel.
|
|
62
|
+
* @param pulseSlotIndex - Zero-based pulse slot index.
|
|
63
|
+
* @returns Horizontal pulse path, or null when none are suitable.
|
|
64
|
+
*/
|
|
65
|
+
export function resolvePlaybackGroundGridHorizontalPulsePath(
|
|
66
|
+
horizontalPulsePaths: readonly PlaybackGroundGridPulsePath[],
|
|
67
|
+
pulseSlotIndex: number,
|
|
68
|
+
): PlaybackGroundGridPulsePath | null {
|
|
69
|
+
if (horizontalPulsePaths.length === 0) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const selectedLineIndex = Math.min(
|
|
74
|
+
horizontalPulsePaths.length - 1,
|
|
75
|
+
Math.floor(
|
|
76
|
+
resolvePlaybackGroundGridUnitHash(pulseSlotIndex, 17) *
|
|
77
|
+
horizontalPulsePaths.length,
|
|
78
|
+
),
|
|
79
|
+
);
|
|
80
|
+
return horizontalPulsePaths[selectedLineIndex];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Resolves the pulse travel ratio along its chosen line.
|
|
85
|
+
*
|
|
86
|
+
* @param input - Pulse timing direction and orientation.
|
|
87
|
+
* @returns Normalized 0..1 travel ratio along the chosen line.
|
|
88
|
+
*/
|
|
89
|
+
export function resolvePlaybackGroundGridPulseTravelRatio(
|
|
90
|
+
input: PlaybackGroundGridPulseTravelRatioInput,
|
|
91
|
+
): number {
|
|
92
|
+
const baseTravelProgressRatio = input.directionIsForward
|
|
93
|
+
? input.lifetimeProgressRatio
|
|
94
|
+
: 1 - input.lifetimeProgressRatio;
|
|
95
|
+
if (input.orientation === 'horizontal') {
|
|
96
|
+
return baseTravelProgressRatio;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO +
|
|
101
|
+
(FLAPPY_GROUND_GRID_VERTICAL_PULSE_END_RATIO -
|
|
102
|
+
FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO) *
|
|
103
|
+
baseTravelProgressRatio
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Resolves a deterministic unit-interval hash from a slot index and salt.
|
|
109
|
+
*
|
|
110
|
+
* @param seed - Slot-local seed value.
|
|
111
|
+
* @param salt - Small integer salt used to pick a stable random stream.
|
|
112
|
+
* @returns Stable random value in the range 0..1.
|
|
113
|
+
*/
|
|
114
|
+
export function resolvePlaybackGroundGridUnitHash(
|
|
115
|
+
seed: number,
|
|
116
|
+
salt: number,
|
|
117
|
+
): number {
|
|
118
|
+
let hashedValue = (seed + 1) ^ Math.imul(salt + 1, 374_761_393);
|
|
119
|
+
hashedValue = Math.imul(hashedValue ^ (hashedValue >>> 13), 1_274_126_177);
|
|
120
|
+
hashedValue ^= hashedValue >>> 16;
|
|
121
|
+
return (
|
|
122
|
+
(hashedValue >>> 0) / FLAPPY_GROUND_GRID_UNSIGNED_NORMALIZATION_DIVISOR
|
|
123
|
+
);
|
|
124
|
+
}
|