hbengine 0.2.3
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/README.md +20 -0
- package/engine-cli/connect.mjs +73 -0
- package/engine-cli/hbengine.mjs +565 -0
- package/engine-cli/package.json +1 -0
- package/engine-cli/templates.mjs +14 -0
- package/engine-conformance/analyse-worker.mjs +12 -0
- package/engine-conformance/analyse.mjs +4458 -0
- package/engine-conformance/bundle.mjs +208 -0
- package/engine-conformance/clock.mjs +294 -0
- package/engine-conformance/csp.go +56 -0
- package/engine-conformance/csp.json +6 -0
- package/engine-conformance/csp.mjs +20 -0
- package/engine-conformance/gzip-sizes.mjs +9 -0
- package/engine-conformance/package.json +1 -0
- package/engine-conformance/picture.mjs +55 -0
- package/engine-conformance/report.go +349 -0
- package/engine-conformance/run.mjs +1217 -0
- package/engine-conformance/scan.mjs +476 -0
- package/engine-conformance/testdata/clock-overlay/bundle/assets.json +1 -0
- package/engine-conformance/testdata/clock-overlay/bundle/game.css +17 -0
- package/engine-conformance/testdata/clock-overlay/bundle/game.js +83 -0
- package/engine-conformance/testdata/clock-overlay/bundle/hbtest.json +4 -0
- package/engine-conformance/testdata/clock-overlay/bundle/index.html +34 -0
- package/engine-conformance/testdata/clock-probe/bundle/assets.json +1 -0
- package/engine-conformance/testdata/clock-probe/bundle/game.css +17 -0
- package/engine-conformance/testdata/clock-probe/bundle/game.js +65 -0
- package/engine-conformance/testdata/clock-probe/bundle/hbtest.json +4 -0
- package/engine-conformance/testdata/clock-probe/bundle/index.html +35 -0
- package/engine-conformance/testdata/clock-probe/bundle/probe-worker.js +46 -0
- package/engine-conformance/testdata/clock-probe/bundle/probe.js +210 -0
- package/engine-conformance/testdata/clock-probe/math/dice.tsv +100 -0
- package/engine-conformance/testdata/clock-probe/math/manifest.json +2925 -0
- package/engine-conformance/testdata/clock-worker/bundle/assets.json +1 -0
- package/engine-conformance/testdata/clock-worker/bundle/clock-worker.js +14 -0
- package/engine-conformance/testdata/clock-worker/bundle/game.css +17 -0
- package/engine-conformance/testdata/clock-worker/bundle/game.js +61 -0
- package/engine-conformance/testdata/clock-worker/bundle/hbtest.json +4 -0
- package/engine-conformance/testdata/clock-worker/bundle/index.html +35 -0
- package/engine-conformance/testdata/clock-worker/math/dice.tsv +100 -0
- package/engine-conformance/testdata/clock-worker/math/manifest.json +2925 -0
- package/engine-conformance/travel.mjs +1209 -0
- package/engine-conformance/vendor/acorn/LICENSE +21 -0
- package/engine-conformance/vendor/acorn/acorn.mjs +6266 -0
- package/engine-conformance/wasm-releases.json +168 -0
- package/engine-examples/README.md +23 -0
- package/engine-examples/coin/AGENTS.md +3 -0
- package/engine-examples/coin/README.md +7 -0
- package/engine-examples/coin/bundle/assets.json +1 -0
- package/engine-examples/coin/bundle/game.css +5 -0
- package/engine-examples/coin/bundle/game.js +19 -0
- package/engine-examples/coin/bundle/hbtest.json +5 -0
- package/engine-examples/coin/bundle/index.html +16 -0
- package/engine-examples/coin/math/coin.tsv +2 -0
- package/engine-examples/coin/math/manifest.json +17 -0
- package/engine-examples/crash/AGENTS.md +3 -0
- package/engine-examples/crash/README.md +14 -0
- package/engine-examples/crash/bundle/assets.json +1 -0
- package/engine-examples/crash/bundle/game.css +8 -0
- package/engine-examples/crash/bundle/game.js +90 -0
- package/engine-examples/crash/bundle/hbtest.json +5 -0
- package/engine-examples/crash/bundle/index.html +20 -0
- package/engine-examples/crash/math/crash-01.tsv +2 -0
- package/engine-examples/crash/math/crash-02.tsv +2 -0
- package/engine-examples/crash/math/crash-03.tsv +2 -0
- package/engine-examples/crash/math/crash-04.tsv +2 -0
- package/engine-examples/crash/math/crash-05.tsv +2 -0
- package/engine-examples/crash/math/crash-06.tsv +2 -0
- package/engine-examples/crash/math/crash-07.tsv +2 -0
- package/engine-examples/crash/math/crash-08.tsv +2 -0
- package/engine-examples/crash/math/crash-09.tsv +2 -0
- package/engine-examples/crash/math/crash-10.tsv +2 -0
- package/engine-examples/crash/math/crash-11.tsv +2 -0
- package/engine-examples/crash/math/crash-12.tsv +2 -0
- package/engine-examples/crash/math/crash-13.tsv +2 -0
- package/engine-examples/crash/math/crash-14.tsv +2 -0
- package/engine-examples/crash/math/crash-15.tsv +2 -0
- package/engine-examples/crash/math/crash-16.tsv +2 -0
- package/engine-examples/crash/math/crash-17.tsv +2 -0
- package/engine-examples/crash/math/crash-18.tsv +2 -0
- package/engine-examples/crash/math/crash-19.tsv +2 -0
- package/engine-examples/crash/math/crash-20.tsv +2 -0
- package/engine-examples/crash/math/crash-21.tsv +2 -0
- package/engine-examples/crash/math/crash-22.tsv +2 -0
- package/engine-examples/crash/math/crash-23.tsv +2 -0
- package/engine-examples/crash/math/crash-24.tsv +2 -0
- package/engine-examples/crash/math/crash-25.tsv +2 -0
- package/engine-examples/crash/math/crash-26.tsv +2 -0
- package/engine-examples/crash/math/crash-27.tsv +2 -0
- package/engine-examples/crash/math/crash-28.tsv +2 -0
- package/engine-examples/crash/math/crash-29.tsv +2 -0
- package/engine-examples/crash/math/crash-30.tsv +2 -0
- package/engine-examples/crash/math/crash-31.tsv +2 -0
- package/engine-examples/crash/math/crash-32.tsv +2 -0
- package/engine-examples/crash/math/crash-33.tsv +2 -0
- package/engine-examples/crash/math/crash-34.tsv +2 -0
- package/engine-examples/crash/math/crash-35.tsv +2 -0
- package/engine-examples/crash/math/crash-36.tsv +2 -0
- package/engine-examples/crash/math/crash-37.tsv +2 -0
- package/engine-examples/crash/math/crash-38.tsv +2 -0
- package/engine-examples/crash/math/crash-39.tsv +2 -0
- package/engine-examples/crash/math/crash-40.tsv +2 -0
- package/engine-examples/crash/math/crash-41.tsv +2 -0
- package/engine-examples/crash/math/crash-42.tsv +2 -0
- package/engine-examples/crash/math/crash-43.tsv +2 -0
- package/engine-examples/crash/math/crash-44.tsv +2 -0
- package/engine-examples/crash/math/crash-45.tsv +2 -0
- package/engine-examples/crash/math/crash-46.tsv +2 -0
- package/engine-examples/crash/math/crash-47.tsv +2 -0
- package/engine-examples/crash/math/crash-48.tsv +2 -0
- package/engine-examples/crash/math/crash-49.tsv +2 -0
- package/engine-examples/crash/math/crash-50.tsv +2 -0
- package/engine-examples/crash/math/crash-51.tsv +2 -0
- package/engine-examples/crash/math/crash-52.tsv +2 -0
- package/engine-examples/crash/math/crash-53.tsv +2 -0
- package/engine-examples/crash/math/crash-54.tsv +2 -0
- package/engine-examples/crash/math/crash-55.tsv +2 -0
- package/engine-examples/crash/math/crash-56.tsv +2 -0
- package/engine-examples/crash/math/crash-57.tsv +2 -0
- package/engine-examples/crash/math/crash-58.tsv +2 -0
- package/engine-examples/crash/math/crash-59.tsv +2 -0
- package/engine-examples/crash/math/crash-60.tsv +2 -0
- package/engine-examples/crash/math/crash-61.tsv +2 -0
- package/engine-examples/crash/math/crash-62.tsv +2 -0
- package/engine-examples/crash/math/crash-63.tsv +2 -0
- package/engine-examples/crash/math/crash-64.tsv +2 -0
- package/engine-examples/crash/math/gen.mjs +31 -0
- package/engine-examples/crash/math/manifest.json +1 -0
- package/engine-examples/dice/AGENTS.md +3 -0
- package/engine-examples/dice/README.md +25 -0
- package/engine-examples/dice/bundle/assets.json +1 -0
- package/engine-examples/dice/bundle/game.css +17 -0
- package/engine-examples/dice/bundle/game.js +61 -0
- package/engine-examples/dice/bundle/hbtest.json +4 -0
- package/engine-examples/dice/bundle/index.html +34 -0
- package/engine-examples/dice/math/dice.tsv +100 -0
- package/engine-examples/dice/math/manifest.json +2925 -0
- package/engine-examples/keno/AGENTS.md +3 -0
- package/engine-examples/keno/README.md +11 -0
- package/engine-examples/keno/bundle/assets.json +1 -0
- package/engine-examples/keno/bundle/game.css +14 -0
- package/engine-examples/keno/bundle/game.js +86 -0
- package/engine-examples/keno/bundle/hbtest.json +4 -0
- package/engine-examples/keno/bundle/i18n.json +342 -0
- package/engine-examples/keno/bundle/index.html +20 -0
- package/engine-examples/keno/bundle/model.json +1 -0
- package/engine-examples/keno/math/gen.mjs +35 -0
- package/engine-examples/keno/math/keno-picks-1.tsv +2 -0
- package/engine-examples/keno/math/keno-picks-10.tsv +11 -0
- package/engine-examples/keno/math/keno-picks-2.tsv +3 -0
- package/engine-examples/keno/math/keno-picks-3.tsv +4 -0
- package/engine-examples/keno/math/keno-picks-4.tsv +5 -0
- package/engine-examples/keno/math/keno-picks-5.tsv +6 -0
- package/engine-examples/keno/math/keno-picks-6.tsv +7 -0
- package/engine-examples/keno/math/keno-picks-7.tsv +8 -0
- package/engine-examples/keno/math/keno-picks-8.tsv +9 -0
- package/engine-examples/keno/math/keno-picks-9.tsv +10 -0
- package/engine-examples/keno/math/manifest.json +1 -0
- package/engine-examples/keno/math-kit/pack.mjs +165 -0
- package/engine-examples/keno/math-kit/package.json +8 -0
- package/engine-examples/keno/math-kit/slot.mjs +94 -0
- package/engine-examples/keno/math-kit/tumble.mjs +94 -0
- package/engine-examples/lines/AGENTS.md +3 -0
- package/engine-examples/lines/README.md +20 -0
- package/engine-examples/lines/bundle/assets.json +1 -0
- package/engine-examples/lines/bundle/game.css +16 -0
- package/engine-examples/lines/bundle/game.js +125 -0
- package/engine-examples/lines/bundle/hbtest.json +4 -0
- package/engine-examples/lines/bundle/i18n.json +242 -0
- package/engine-examples/lines/bundle/index.html +23 -0
- package/engine-examples/lines/bundle/model.json +1 -0
- package/engine-examples/lines/math/gen.mjs +54 -0
- package/engine-examples/lines/math-kit/pack.mjs +165 -0
- package/engine-examples/lines/math-kit/package.json +8 -0
- package/engine-examples/lines/math-kit/slot.mjs +94 -0
- package/engine-examples/lines/math-kit/tumble.mjs +94 -0
- package/engine-examples/mines/AGENTS.md +3 -0
- package/engine-examples/mines/README.md +13 -0
- package/engine-examples/mines/bundle/assets.json +1 -0
- package/engine-examples/mines/bundle/game.css +12 -0
- package/engine-examples/mines/bundle/game.js +58 -0
- package/engine-examples/mines/bundle/hbtest.json +8 -0
- package/engine-examples/mines/bundle/index.html +16 -0
- package/engine-examples/mines/math/gen.mjs +40 -0
- package/engine-examples/mines/math/manifest.json +1 -0
- package/engine-examples/mines/math/mines-1-1.tsv +2 -0
- package/engine-examples/mines/math/mines-1-2.tsv +2 -0
- package/engine-examples/mines/math/mines-1-22.tsv +2 -0
- package/engine-examples/mines/math/mines-1-23.tsv +2 -0
- package/engine-examples/mines/math/mines-1-24.tsv +2 -0
- package/engine-examples/mines/math/mines-1-3.tsv +2 -0
- package/engine-examples/mines/math/mines-10-1.tsv +2 -0
- package/engine-examples/mines/math/mines-10-10.tsv +2 -0
- package/engine-examples/mines/math/mines-10-11.tsv +2 -0
- package/engine-examples/mines/math/mines-10-12.tsv +2 -0
- package/engine-examples/mines/math/mines-10-13.tsv +2 -0
- package/engine-examples/mines/math/mines-10-14.tsv +2 -0
- package/engine-examples/mines/math/mines-10-15.tsv +2 -0
- package/engine-examples/mines/math/mines-10-2.tsv +2 -0
- package/engine-examples/mines/math/mines-10-3.tsv +2 -0
- package/engine-examples/mines/math/mines-10-4.tsv +2 -0
- package/engine-examples/mines/math/mines-10-5.tsv +2 -0
- package/engine-examples/mines/math/mines-10-6.tsv +2 -0
- package/engine-examples/mines/math/mines-10-7.tsv +2 -0
- package/engine-examples/mines/math/mines-10-8.tsv +2 -0
- package/engine-examples/mines/math/mines-10-9.tsv +2 -0
- package/engine-examples/mines/math/mines-11-1.tsv +2 -0
- package/engine-examples/mines/math/mines-11-10.tsv +2 -0
- package/engine-examples/mines/math/mines-11-11.tsv +2 -0
- package/engine-examples/mines/math/mines-11-12.tsv +2 -0
- package/engine-examples/mines/math/mines-11-13.tsv +2 -0
- package/engine-examples/mines/math/mines-11-14.tsv +2 -0
- package/engine-examples/mines/math/mines-11-2.tsv +2 -0
- package/engine-examples/mines/math/mines-11-3.tsv +2 -0
- package/engine-examples/mines/math/mines-11-4.tsv +2 -0
- package/engine-examples/mines/math/mines-11-5.tsv +2 -0
- package/engine-examples/mines/math/mines-11-6.tsv +2 -0
- package/engine-examples/mines/math/mines-11-7.tsv +2 -0
- package/engine-examples/mines/math/mines-11-8.tsv +2 -0
- package/engine-examples/mines/math/mines-11-9.tsv +2 -0
- package/engine-examples/mines/math/mines-12-1.tsv +2 -0
- package/engine-examples/mines/math/mines-12-10.tsv +2 -0
- package/engine-examples/mines/math/mines-12-11.tsv +2 -0
- package/engine-examples/mines/math/mines-12-12.tsv +2 -0
- package/engine-examples/mines/math/mines-12-13.tsv +2 -0
- package/engine-examples/mines/math/mines-12-2.tsv +2 -0
- package/engine-examples/mines/math/mines-12-3.tsv +2 -0
- package/engine-examples/mines/math/mines-12-4.tsv +2 -0
- package/engine-examples/mines/math/mines-12-5.tsv +2 -0
- package/engine-examples/mines/math/mines-12-6.tsv +2 -0
- package/engine-examples/mines/math/mines-12-7.tsv +2 -0
- package/engine-examples/mines/math/mines-12-8.tsv +2 -0
- package/engine-examples/mines/math/mines-12-9.tsv +2 -0
- package/engine-examples/mines/math/mines-13-1.tsv +2 -0
- package/engine-examples/mines/math/mines-13-10.tsv +2 -0
- package/engine-examples/mines/math/mines-13-11.tsv +2 -0
- package/engine-examples/mines/math/mines-13-12.tsv +2 -0
- package/engine-examples/mines/math/mines-13-2.tsv +2 -0
- package/engine-examples/mines/math/mines-13-3.tsv +2 -0
- package/engine-examples/mines/math/mines-13-4.tsv +2 -0
- package/engine-examples/mines/math/mines-13-5.tsv +2 -0
- package/engine-examples/mines/math/mines-13-6.tsv +2 -0
- package/engine-examples/mines/math/mines-13-7.tsv +2 -0
- package/engine-examples/mines/math/mines-13-8.tsv +2 -0
- package/engine-examples/mines/math/mines-13-9.tsv +2 -0
- package/engine-examples/mines/math/mines-14-1.tsv +2 -0
- package/engine-examples/mines/math/mines-14-10.tsv +2 -0
- package/engine-examples/mines/math/mines-14-11.tsv +2 -0
- package/engine-examples/mines/math/mines-14-2.tsv +2 -0
- package/engine-examples/mines/math/mines-14-3.tsv +2 -0
- package/engine-examples/mines/math/mines-14-4.tsv +2 -0
- package/engine-examples/mines/math/mines-14-5.tsv +2 -0
- package/engine-examples/mines/math/mines-14-6.tsv +2 -0
- package/engine-examples/mines/math/mines-14-7.tsv +2 -0
- package/engine-examples/mines/math/mines-14-8.tsv +2 -0
- package/engine-examples/mines/math/mines-14-9.tsv +2 -0
- package/engine-examples/mines/math/mines-15-1.tsv +2 -0
- package/engine-examples/mines/math/mines-15-10.tsv +2 -0
- package/engine-examples/mines/math/mines-15-2.tsv +2 -0
- package/engine-examples/mines/math/mines-15-3.tsv +2 -0
- package/engine-examples/mines/math/mines-15-4.tsv +2 -0
- package/engine-examples/mines/math/mines-15-5.tsv +2 -0
- package/engine-examples/mines/math/mines-15-6.tsv +2 -0
- package/engine-examples/mines/math/mines-15-7.tsv +2 -0
- package/engine-examples/mines/math/mines-15-8.tsv +2 -0
- package/engine-examples/mines/math/mines-15-9.tsv +2 -0
- package/engine-examples/mines/math/mines-16-1.tsv +2 -0
- package/engine-examples/mines/math/mines-16-2.tsv +2 -0
- package/engine-examples/mines/math/mines-16-3.tsv +2 -0
- package/engine-examples/mines/math/mines-16-4.tsv +2 -0
- package/engine-examples/mines/math/mines-16-5.tsv +2 -0
- package/engine-examples/mines/math/mines-16-6.tsv +2 -0
- package/engine-examples/mines/math/mines-16-7.tsv +2 -0
- package/engine-examples/mines/math/mines-16-8.tsv +2 -0
- package/engine-examples/mines/math/mines-16-9.tsv +2 -0
- package/engine-examples/mines/math/mines-17-1.tsv +2 -0
- package/engine-examples/mines/math/mines-17-2.tsv +2 -0
- package/engine-examples/mines/math/mines-17-3.tsv +2 -0
- package/engine-examples/mines/math/mines-17-4.tsv +2 -0
- package/engine-examples/mines/math/mines-17-5.tsv +2 -0
- package/engine-examples/mines/math/mines-17-6.tsv +2 -0
- package/engine-examples/mines/math/mines-17-7.tsv +2 -0
- package/engine-examples/mines/math/mines-17-8.tsv +2 -0
- package/engine-examples/mines/math/mines-18-1.tsv +2 -0
- package/engine-examples/mines/math/mines-18-2.tsv +2 -0
- package/engine-examples/mines/math/mines-18-3.tsv +2 -0
- package/engine-examples/mines/math/mines-18-4.tsv +2 -0
- package/engine-examples/mines/math/mines-18-5.tsv +2 -0
- package/engine-examples/mines/math/mines-18-6.tsv +2 -0
- package/engine-examples/mines/math/mines-18-7.tsv +2 -0
- package/engine-examples/mines/math/mines-19-1.tsv +2 -0
- package/engine-examples/mines/math/mines-19-2.tsv +2 -0
- package/engine-examples/mines/math/mines-19-3.tsv +2 -0
- package/engine-examples/mines/math/mines-19-4.tsv +2 -0
- package/engine-examples/mines/math/mines-19-5.tsv +2 -0
- package/engine-examples/mines/math/mines-19-6.tsv +2 -0
- package/engine-examples/mines/math/mines-2-1.tsv +2 -0
- package/engine-examples/mines/math/mines-2-19.tsv +2 -0
- package/engine-examples/mines/math/mines-2-2.tsv +2 -0
- package/engine-examples/mines/math/mines-2-20.tsv +2 -0
- package/engine-examples/mines/math/mines-2-21.tsv +2 -0
- package/engine-examples/mines/math/mines-2-22.tsv +2 -0
- package/engine-examples/mines/math/mines-2-23.tsv +2 -0
- package/engine-examples/mines/math/mines-2-3.tsv +2 -0
- package/engine-examples/mines/math/mines-2-4.tsv +2 -0
- package/engine-examples/mines/math/mines-2-5.tsv +2 -0
- package/engine-examples/mines/math/mines-20-1.tsv +2 -0
- package/engine-examples/mines/math/mines-20-2.tsv +2 -0
- package/engine-examples/mines/math/mines-20-3.tsv +2 -0
- package/engine-examples/mines/math/mines-20-4.tsv +2 -0
- package/engine-examples/mines/math/mines-20-5.tsv +2 -0
- package/engine-examples/mines/math/mines-21-1.tsv +2 -0
- package/engine-examples/mines/math/mines-21-2.tsv +2 -0
- package/engine-examples/mines/math/mines-21-3.tsv +2 -0
- package/engine-examples/mines/math/mines-21-4.tsv +2 -0
- package/engine-examples/mines/math/mines-22-1.tsv +2 -0
- package/engine-examples/mines/math/mines-22-2.tsv +2 -0
- package/engine-examples/mines/math/mines-22-3.tsv +2 -0
- package/engine-examples/mines/math/mines-23-1.tsv +2 -0
- package/engine-examples/mines/math/mines-23-2.tsv +2 -0
- package/engine-examples/mines/math/mines-24-1.tsv +2 -0
- package/engine-examples/mines/math/mines-3-1.tsv +2 -0
- package/engine-examples/mines/math/mines-3-17.tsv +2 -0
- package/engine-examples/mines/math/mines-3-18.tsv +2 -0
- package/engine-examples/mines/math/mines-3-19.tsv +2 -0
- package/engine-examples/mines/math/mines-3-2.tsv +2 -0
- package/engine-examples/mines/math/mines-3-20.tsv +2 -0
- package/engine-examples/mines/math/mines-3-21.tsv +2 -0
- package/engine-examples/mines/math/mines-3-22.tsv +2 -0
- package/engine-examples/mines/math/mines-3-3.tsv +2 -0
- package/engine-examples/mines/math/mines-3-4.tsv +2 -0
- package/engine-examples/mines/math/mines-3-5.tsv +2 -0
- package/engine-examples/mines/math/mines-3-6.tsv +2 -0
- package/engine-examples/mines/math/mines-4-1.tsv +2 -0
- package/engine-examples/mines/math/mines-4-13.tsv +2 -0
- package/engine-examples/mines/math/mines-4-14.tsv +2 -0
- package/engine-examples/mines/math/mines-4-15.tsv +2 -0
- package/engine-examples/mines/math/mines-4-16.tsv +2 -0
- package/engine-examples/mines/math/mines-4-17.tsv +2 -0
- package/engine-examples/mines/math/mines-4-18.tsv +2 -0
- package/engine-examples/mines/math/mines-4-19.tsv +2 -0
- package/engine-examples/mines/math/mines-4-2.tsv +2 -0
- package/engine-examples/mines/math/mines-4-20.tsv +2 -0
- package/engine-examples/mines/math/mines-4-21.tsv +2 -0
- package/engine-examples/mines/math/mines-4-3.tsv +2 -0
- package/engine-examples/mines/math/mines-4-4.tsv +2 -0
- package/engine-examples/mines/math/mines-4-5.tsv +2 -0
- package/engine-examples/mines/math/mines-4-6.tsv +2 -0
- package/engine-examples/mines/math/mines-4-7.tsv +2 -0
- package/engine-examples/mines/math/mines-4-8.tsv +2 -0
- package/engine-examples/mines/math/mines-4-9.tsv +2 -0
- package/engine-examples/mines/math/mines-5-1.tsv +2 -0
- package/engine-examples/mines/math/mines-5-10.tsv +2 -0
- package/engine-examples/mines/math/mines-5-11.tsv +2 -0
- package/engine-examples/mines/math/mines-5-12.tsv +2 -0
- package/engine-examples/mines/math/mines-5-13.tsv +2 -0
- package/engine-examples/mines/math/mines-5-14.tsv +2 -0
- package/engine-examples/mines/math/mines-5-15.tsv +2 -0
- package/engine-examples/mines/math/mines-5-16.tsv +2 -0
- package/engine-examples/mines/math/mines-5-17.tsv +2 -0
- package/engine-examples/mines/math/mines-5-18.tsv +2 -0
- package/engine-examples/mines/math/mines-5-19.tsv +2 -0
- package/engine-examples/mines/math/mines-5-2.tsv +2 -0
- package/engine-examples/mines/math/mines-5-20.tsv +2 -0
- package/engine-examples/mines/math/mines-5-3.tsv +2 -0
- package/engine-examples/mines/math/mines-5-4.tsv +2 -0
- package/engine-examples/mines/math/mines-5-5.tsv +2 -0
- package/engine-examples/mines/math/mines-5-6.tsv +2 -0
- package/engine-examples/mines/math/mines-5-7.tsv +2 -0
- package/engine-examples/mines/math/mines-5-8.tsv +2 -0
- package/engine-examples/mines/math/mines-5-9.tsv +2 -0
- package/engine-examples/mines/math/mines-6-1.tsv +2 -0
- package/engine-examples/mines/math/mines-6-10.tsv +2 -0
- package/engine-examples/mines/math/mines-6-11.tsv +2 -0
- package/engine-examples/mines/math/mines-6-12.tsv +2 -0
- package/engine-examples/mines/math/mines-6-13.tsv +2 -0
- package/engine-examples/mines/math/mines-6-14.tsv +2 -0
- package/engine-examples/mines/math/mines-6-15.tsv +2 -0
- package/engine-examples/mines/math/mines-6-16.tsv +2 -0
- package/engine-examples/mines/math/mines-6-17.tsv +2 -0
- package/engine-examples/mines/math/mines-6-18.tsv +2 -0
- package/engine-examples/mines/math/mines-6-19.tsv +2 -0
- package/engine-examples/mines/math/mines-6-2.tsv +2 -0
- package/engine-examples/mines/math/mines-6-3.tsv +2 -0
- package/engine-examples/mines/math/mines-6-4.tsv +2 -0
- package/engine-examples/mines/math/mines-6-5.tsv +2 -0
- package/engine-examples/mines/math/mines-6-6.tsv +2 -0
- package/engine-examples/mines/math/mines-6-7.tsv +2 -0
- package/engine-examples/mines/math/mines-6-8.tsv +2 -0
- package/engine-examples/mines/math/mines-6-9.tsv +2 -0
- package/engine-examples/mines/math/mines-7-1.tsv +2 -0
- package/engine-examples/mines/math/mines-7-10.tsv +2 -0
- package/engine-examples/mines/math/mines-7-11.tsv +2 -0
- package/engine-examples/mines/math/mines-7-12.tsv +2 -0
- package/engine-examples/mines/math/mines-7-13.tsv +2 -0
- package/engine-examples/mines/math/mines-7-14.tsv +2 -0
- package/engine-examples/mines/math/mines-7-15.tsv +2 -0
- package/engine-examples/mines/math/mines-7-16.tsv +2 -0
- package/engine-examples/mines/math/mines-7-17.tsv +2 -0
- package/engine-examples/mines/math/mines-7-18.tsv +2 -0
- package/engine-examples/mines/math/mines-7-2.tsv +2 -0
- package/engine-examples/mines/math/mines-7-3.tsv +2 -0
- package/engine-examples/mines/math/mines-7-4.tsv +2 -0
- package/engine-examples/mines/math/mines-7-5.tsv +2 -0
- package/engine-examples/mines/math/mines-7-6.tsv +2 -0
- package/engine-examples/mines/math/mines-7-7.tsv +2 -0
- package/engine-examples/mines/math/mines-7-8.tsv +2 -0
- package/engine-examples/mines/math/mines-7-9.tsv +2 -0
- package/engine-examples/mines/math/mines-8-1.tsv +2 -0
- package/engine-examples/mines/math/mines-8-10.tsv +2 -0
- package/engine-examples/mines/math/mines-8-11.tsv +2 -0
- package/engine-examples/mines/math/mines-8-12.tsv +2 -0
- package/engine-examples/mines/math/mines-8-13.tsv +2 -0
- package/engine-examples/mines/math/mines-8-14.tsv +2 -0
- package/engine-examples/mines/math/mines-8-15.tsv +2 -0
- package/engine-examples/mines/math/mines-8-16.tsv +2 -0
- package/engine-examples/mines/math/mines-8-17.tsv +2 -0
- package/engine-examples/mines/math/mines-8-2.tsv +2 -0
- package/engine-examples/mines/math/mines-8-3.tsv +2 -0
- package/engine-examples/mines/math/mines-8-4.tsv +2 -0
- package/engine-examples/mines/math/mines-8-5.tsv +2 -0
- package/engine-examples/mines/math/mines-8-6.tsv +2 -0
- package/engine-examples/mines/math/mines-8-7.tsv +2 -0
- package/engine-examples/mines/math/mines-8-8.tsv +2 -0
- package/engine-examples/mines/math/mines-8-9.tsv +2 -0
- package/engine-examples/mines/math/mines-9-1.tsv +2 -0
- package/engine-examples/mines/math/mines-9-10.tsv +2 -0
- package/engine-examples/mines/math/mines-9-11.tsv +2 -0
- package/engine-examples/mines/math/mines-9-12.tsv +2 -0
- package/engine-examples/mines/math/mines-9-13.tsv +2 -0
- package/engine-examples/mines/math/mines-9-14.tsv +2 -0
- package/engine-examples/mines/math/mines-9-15.tsv +2 -0
- package/engine-examples/mines/math/mines-9-16.tsv +2 -0
- package/engine-examples/mines/math/mines-9-2.tsv +2 -0
- package/engine-examples/mines/math/mines-9-3.tsv +2 -0
- package/engine-examples/mines/math/mines-9-4.tsv +2 -0
- package/engine-examples/mines/math/mines-9-5.tsv +2 -0
- package/engine-examples/mines/math/mines-9-6.tsv +2 -0
- package/engine-examples/mines/math/mines-9-7.tsv +2 -0
- package/engine-examples/mines/math/mines-9-8.tsv +2 -0
- package/engine-examples/mines/math/mines-9-9.tsv +2 -0
- package/engine-examples/plinko/AGENTS.md +3 -0
- package/engine-examples/plinko/README.md +9 -0
- package/engine-examples/plinko/bundle/assets.json +1 -0
- package/engine-examples/plinko/bundle/game.css +5 -0
- package/engine-examples/plinko/bundle/game.js +92 -0
- package/engine-examples/plinko/bundle/hbtest.json +4 -0
- package/engine-examples/plinko/bundle/index.html +16 -0
- package/engine-examples/plinko/bundle/model.json +1 -0
- package/engine-examples/plinko/math/gen.mjs +40 -0
- package/engine-examples/plinko/math/manifest.json +1 -0
- package/engine-examples/plinko/math/plinko-12-high.tsv +13 -0
- package/engine-examples/plinko/math/plinko-12-low.tsv +13 -0
- package/engine-examples/plinko/math/plinko-12-medium.tsv +13 -0
- package/engine-examples/plinko/math/plinko-16-high.tsv +17 -0
- package/engine-examples/plinko/math/plinko-16-low.tsv +17 -0
- package/engine-examples/plinko/math/plinko-16-medium.tsv +17 -0
- package/engine-examples/plinko/math/plinko-8-high.tsv +9 -0
- package/engine-examples/plinko/math/plinko-8-low.tsv +9 -0
- package/engine-examples/plinko/math/plinko-8-medium.tsv +9 -0
- package/engine-examples/plinko/math-kit/pack.mjs +165 -0
- package/engine-examples/plinko/math-kit/package.json +8 -0
- package/engine-examples/plinko/math-kit/slot.mjs +94 -0
- package/engine-examples/plinko/math-kit/tumble.mjs +94 -0
- package/engine-examples/slot/AGENTS.md +3 -0
- package/engine-examples/slot/README.md +26 -0
- package/engine-examples/slot/bundle/assets.json +1 -0
- package/engine-examples/slot/bundle/game.css +19 -0
- package/engine-examples/slot/bundle/game.js +42 -0
- package/engine-examples/slot/bundle/hbtest.json +4 -0
- package/engine-examples/slot/bundle/index.html +23 -0
- package/engine-examples/slot/math/gen.mjs +79 -0
- package/engine-examples/slot/math/manifest.json +1 -0
- package/engine-examples/slot/math/slot.tsv +110592 -0
- package/engine-examples/tower/AGENTS.md +3 -0
- package/engine-examples/tower/README.md +21 -0
- package/engine-examples/tower/bundle/assets.json +1 -0
- package/engine-examples/tower/bundle/game.css +8 -0
- package/engine-examples/tower/bundle/game.js +37 -0
- package/engine-examples/tower/bundle/hbtest.json +5 -0
- package/engine-examples/tower/bundle/index.html +16 -0
- package/engine-examples/tower/math/floor.tsv +4 -0
- package/engine-examples/tower/math/manifest.json +61 -0
- package/engine-examples/tumble/AGENTS.md +3 -0
- package/engine-examples/tumble/README.md +18 -0
- package/engine-examples/tumble/bundle/assets.json +1 -0
- package/engine-examples/tumble/bundle/game.css +13 -0
- package/engine-examples/tumble/bundle/game.js +119 -0
- package/engine-examples/tumble/bundle/hbtest.json +4 -0
- package/engine-examples/tumble/bundle/i18n.json +122 -0
- package/engine-examples/tumble/bundle/index.html +20 -0
- package/engine-examples/tumble/bundle/model.json +1 -0
- package/engine-examples/tumble/math/gen.mjs +38 -0
- package/engine-examples/tumble/math-kit/pack.mjs +165 -0
- package/engine-examples/tumble/math-kit/package.json +8 -0
- package/engine-examples/tumble/math-kit/slot.mjs +94 -0
- package/engine-examples/tumble/math-kit/tumble.mjs +94 -0
- package/engine-examples/wheel/README.md +14 -0
- package/engine-examples/wheel/bundle/assets.json +1 -0
- package/engine-examples/wheel/bundle/game.css +7 -0
- package/engine-examples/wheel/bundle/game.js +51 -0
- package/engine-examples/wheel/bundle/hbtest.json +4 -0
- package/engine-examples/wheel/bundle/index.html +19 -0
- package/engine-examples/wheel/math/high.tsv +24 -0
- package/engine-examples/wheel/math/low.tsv +24 -0
- package/engine-examples/wheel/math/manifest.json +48 -0
- package/engine-examples/wheel/math/medium.tsv +24 -0
- package/engine-math/pack.mjs +165 -0
- package/engine-math/package.json +1 -0
- package/engine-math/slot.mjs +94 -0
- package/engine-math/tumble.mjs +94 -0
- package/engine-mcp/package.json +1 -0
- package/engine-mcp/server.mjs +151 -0
- package/engine-sdk/GUIDE.md +855 -0
- package/engine-sdk/assets.js +92 -0
- package/engine-sdk/autoplay.js +82 -0
- package/engine-sdk/bet-field.js +391 -0
- package/engine-sdk/kit/fiat-coins.js +51 -0
- package/engine-sdk/kit/numeric-input.js +116 -0
- package/engine-sdk/kit/wallet-format.js +423 -0
- package/engine-sdk/marks.js +22 -0
- package/engine-sdk/messages.js +289 -0
- package/engine-sdk/money.js +89 -0
- package/engine-sdk/package.json +1 -0
- package/engine-sdk/protocol.js +263 -0
- package/engine-sdk/sdk.d.ts +138 -0
- package/engine-sdk/sdk.js +330 -0
- package/engine-sdk/stake.js +68 -0
- package/engine-sdk/ui.d.ts +36 -0
- package/engine-sdk/ui.js +340 -0
- package/engine-shell/core/faults.js +127 -0
- package/engine-shell/core/rgs.js +193 -0
- package/engine-shell/core/router.js +917 -0
- package/engine-shell/host/boot.js +408 -0
- package/engine-shell/host/engine-v1.js +438 -0
- package/engine-shell/host/fair.js +285 -0
- package/engine-shell/host/fonts/SOURCE.json +11 -0
- package/engine-shell/host/fonts/figtree-400.woff2 +0 -0
- package/engine-shell/host/fonts/figtree-500.woff2 +0 -0
- package/engine-shell/host/fonts/figtree-600.woff2 +0 -0
- package/engine-shell/host/fonts/red-hat-display-700.woff2 +0 -0
- package/engine-shell/host/index.html +230 -0
- package/engine-shell/host/page.js +809 -0
- package/engine-shell/host/sandbox-panel.js +681 -0
- package/engine-shell/host/sandbox-scenarios.js +554 -0
- package/engine-shell/host/site-bridge.js +87 -0
- package/engine-shell/host/strings.js +916 -0
- package/engine-shell/package.json +1 -0
- package/engine-shell/verifiers/badcat/coin.tsv +2 -0
- package/engine-shell/verifiers/badcat/dice-2.tsv +11 -0
- package/engine-shell/verifiers/badcat/dice-5.tsv +26 -0
- package/engine-shell/verifiers/badcat/dice-9.tsv +46 -0
- package/engine-shell/verifiers/badcat/manifest.json +3344 -0
- package/engine-shell/verifiers/badcat/rps.tsv +3 -0
- package/engine-shell/verifiers/badcat/triple.tsv +66 -0
- package/engine-shell/verifiers/engine-verify.js +358 -0
- package/engine-shell/verifiers/package.json +5 -0
- package/engine-shell/verifiers/parity/manifest.json +27 -0
- package/engine-shell/verifiers/parity/wide.tsv +5 -0
- package/engine-shell/verifiers/parity-vectors.json +244 -0
- package/engine-shell/verifiers/vectors.json +100 -0
- package/package.json +10 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# For agents
|
|
2
|
+
|
|
3
|
+
This is a House Engine game (Housebets). Read the guide first: `engine_guide` (MCP) or `engine-sdk/GUIDE.md`. Then `hbengine verify`, `hbengine dev`, `hbengine upload` (or the `engine_*` tools). The math is `math/`, the frontend `bundle/`; never compute money or outcomes in the frontend.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Plinko — buckets weighted by the binomial
|
|
2
|
+
|
|
3
|
+
8, 12 or 16 rows, low / medium / high risk: nine modes, one `drop` bet each.
|
|
4
|
+
A ball takes k rights of n; bucket k has weight C(n, k) and pays its
|
|
5
|
+
multiplier. `math/gen.mjs` solves the centre multiplier for 99%, rounded
|
|
6
|
+
down to 0.001× so the board shows exactly what pays (every mode lands
|
|
7
|
+
between 98.97% and 99%), and writes `bundle/model.json` for the board.
|
|
8
|
+
|
|
9
|
+
node math/gen.mjs && npx hbengine verify .
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "groups": { "boot": { "files": ["index.html", "game.js", "game.css", "model.json"] } } }
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
body { margin: 0; background: #08141a; }
|
|
2
|
+
.plinko { position: relative; width: 100%; height: 100%; min-height: 360px; display: grid; place-items: center; padding: 12px; box-sizing: border-box; }
|
|
3
|
+
canvas { display: block; }
|
|
4
|
+
.last { position: absolute; top: 12px; right: 14px; font: 700 15px/20px 'Red Hat Display', 'Figtree', system-ui, sans-serif; color: #8F96A8; font-variant-numeric: tabular-nums; }
|
|
5
|
+
.last.win { color: #FDDC73; }
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Plinko: rows of pegs, buckets weighted by the binomial. The panel is the
|
|
2
|
+
// engine's (engine-sdk/ui.js); the server draws the bucket k, and this file
|
|
3
|
+
// drops a ball that takes k rights (which steps go right is cosmetic, from
|
|
4
|
+
// the round's nonce). model.json is written by math/gen.mjs with the table.
|
|
5
|
+
import { mount } from '/engine-sdk/ui.js';
|
|
6
|
+
|
|
7
|
+
const board = await (await fetch('./model.json')).json();
|
|
8
|
+
const el = document.getElementById('game'), zone = document.getElementById('zone'), last = document.getElementById('last');
|
|
9
|
+
const canvas = document.getElementById('board'), ctx = canvas.getContext('2d');
|
|
10
|
+
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
11
|
+
let mode = Object.keys(board)[0], ball = null, lit = -1, size = { w: 0, h: 0, gap: 0 };
|
|
12
|
+
|
|
13
|
+
// Bucket colours: deep tones by how far from the centre (the big shapes stay muted).
|
|
14
|
+
const tone = (k, n) => { const d = Math.abs(k - n / 2) / (n / 2); return d > 0.85 ? '#7e1f3a' : d > 0.55 ? '#7d5410' : d > 0.25 ? '#0d5f6e' : '#0D2A38'; };
|
|
15
|
+
// Every multiplier is a whole 0.001×: shown exactly, trailing zeros dropped.
|
|
16
|
+
const label = (bp) => String(bp / 10000) + '×';
|
|
17
|
+
|
|
18
|
+
function layout() {
|
|
19
|
+
const n = board[mode].length - 1, dpr = devicePixelRatio || 1;
|
|
20
|
+
const w = Math.min(zone.clientWidth - 24, 640), h = Math.min(zone.clientHeight - 24, w * 0.95);
|
|
21
|
+
const gap = Math.min(w / (n + 2), h / (n + 2.4));
|
|
22
|
+
size = { w: gap * (n + 2), h: gap * (n + 2.4), gap, n };
|
|
23
|
+
canvas.width = size.w * dpr; canvas.height = size.h * dpr;
|
|
24
|
+
canvas.style.width = size.w + 'px'; canvas.style.height = size.h + 'px';
|
|
25
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
26
|
+
draw();
|
|
27
|
+
}
|
|
28
|
+
const peg = (row, i) => ({ x: size.w / 2 + (i - row / 2) * size.gap, y: size.gap * (0.9 + row) });
|
|
29
|
+
|
|
30
|
+
function draw() {
|
|
31
|
+
const { w, h, gap, n } = size, pays = board[mode];
|
|
32
|
+
ctx.clearRect(0, 0, w, h);
|
|
33
|
+
ctx.fillStyle = '#5b6b78';
|
|
34
|
+
for (let r = 1; r <= n; r++) for (let i = 0; i <= r; i++) { const p = peg(r, i); ctx.beginPath(); ctx.arc(p.x, p.y, Math.max(2, gap * 0.09), 0, 7); ctx.fill(); }
|
|
35
|
+
const by = gap * (n + 1.25), bh = gap * 0.85;
|
|
36
|
+
ctx.font = `700 ${Math.max(9, Math.min(13, gap * 0.34))}px 'Red Hat Display', Figtree, system-ui, sans-serif`;
|
|
37
|
+
ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
|
|
38
|
+
pays.forEach((bp, k) => {
|
|
39
|
+
const x = size.w / 2 + (k - n / 2) * gap;
|
|
40
|
+
ctx.fillStyle = tone(k, n);
|
|
41
|
+
ctx.beginPath(); ctx.roundRect(x - gap * 0.46, by, gap * 0.92, bh, 5); ctx.fill();
|
|
42
|
+
if (k === lit) { ctx.strokeStyle = '#FDDC73'; ctx.lineWidth = 2; ctx.stroke(); }
|
|
43
|
+
ctx.fillStyle = '#F9F9FB';
|
|
44
|
+
ctx.fillText(label(bp), x, by + bh / 2);
|
|
45
|
+
});
|
|
46
|
+
if (ball) { ctx.fillStyle = '#F9F9FB'; ctx.beginPath(); ctx.arc(ball.x, ball.y, gap * 0.2, 0, 7); ctx.fill(); }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Which of the n steps go right: k of them, shuffled by the round's nonce.
|
|
50
|
+
function path(n, k, seed) {
|
|
51
|
+
const steps = Array.from({ length: n }, (_, i) => i < k);
|
|
52
|
+
let s = (seed >>> 0) || 1;
|
|
53
|
+
for (let i = n - 1; i > 0; i--) { s ^= s << 13; s ^= s >>> 17; s ^= s << 5; const j = (s >>> 0) % (i + 1); [steps[i], steps[j]] = [steps[j], steps[i]]; }
|
|
54
|
+
return steps;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function fall(steps) {
|
|
58
|
+
const { gap } = size;
|
|
59
|
+
const points = [{ x: size.w / 2, y: gap * 0.1 }];
|
|
60
|
+
let i = 0;
|
|
61
|
+
steps.forEach((right, r) => { if (right) i++; const p = peg(r + 1, i); points.push({ x: p.x + (right ? -0.5 : 0.5) * gap, y: p.y - gap * 0.35 }); });
|
|
62
|
+
const end = size.w / 2 + (i - steps.length / 2) * gap;
|
|
63
|
+
points.push({ x: end, y: gap * (steps.length + 1.6) });
|
|
64
|
+
const per = 90, total = per * (points.length - 1);
|
|
65
|
+
return new Promise((done) => {
|
|
66
|
+
const t0 = performance.now();
|
|
67
|
+
const frame = (t) => {
|
|
68
|
+
const f = Math.min(1, (t - t0) / total), seg = Math.min(points.length - 2, Math.floor(f * (points.length - 1))), u = f * (points.length - 1) - seg;
|
|
69
|
+
const a = points[seg], b = points[seg + 1];
|
|
70
|
+
ball = { x: a.x + (b.x - a.x) * u, y: a.y + (b.y - a.y) * u - Math.sin(u * Math.PI) * gap * 0.25 };
|
|
71
|
+
draw();
|
|
72
|
+
if (f < 1) requestAnimationFrame(frame); else done();
|
|
73
|
+
};
|
|
74
|
+
requestAnimationFrame(frame);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const game = await mount(el, {
|
|
79
|
+
async reveal(round) {
|
|
80
|
+
const k = round.data[0].k, n = size.n;
|
|
81
|
+
lit = -1; last.textContent = ''; last.classList.remove('win');
|
|
82
|
+
await fall(path(n, k, Number(round.nonce) || round.id?.length || 1));
|
|
83
|
+
ball = null; lit = k; draw();
|
|
84
|
+
last.textContent = label(board[mode][k]);
|
|
85
|
+
last.classList.toggle('win', round.payout > 0 && board[mode][k] >= 10000);
|
|
86
|
+
await wait(150);
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
mode = game.mode;
|
|
90
|
+
new ResizeObserver(layout).observe(zone);
|
|
91
|
+
layout();
|
|
92
|
+
el.addEventListener('select', (e) => { if (e.detail.mode !== mode) { mode = e.detail.mode; lit = -1; layout(); } });
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
6
|
+
<title>Plinko</title>
|
|
7
|
+
<link rel="stylesheet" href="./game.css">
|
|
8
|
+
<script type="module" src="/engine-sdk/bet-field.js"></script>
|
|
9
|
+
<script type="module" src="./game.js"></script>
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<hb-game id="game">
|
|
13
|
+
<div slot="zone" class="plinko" id="zone"><canvas id="board" aria-label="Plinko board"></canvas><div class="last" id="last" aria-live="polite"></div></div>
|
|
14
|
+
</hb-game>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"8-low":[55000,21000,11000,10000,5030,10000,11000,21000,55000],"8-medium":[130000,30000,13000,7000,4030,7000,13000,30000,130000],"8-high":[290000,40000,15000,3000,1970,3000,15000,40000,290000],"12-low":[100000,30000,16000,14000,11000,10000,5000,10000,11000,14000,16000,30000,100000],"12-medium":[330000,110000,40000,20000,11000,6000,3000,6000,11000,20000,40000,110000,330000],"12-high":[1700000,240000,81000,20000,7000,2000,1940,2000,7000,20000,81000,240000,1700000],"16-low":[160000,90000,20000,14000,14000,12000,11000,10000,5000,10000,11000,12000,14000,14000,20000,90000,160000],"16-medium":[1100000,410000,100000,50000,30000,15000,10000,5000,3000,5000,10000,15000,30000,50000,100000,410000,1100000],"16-high":[10000000,1300000,260000,90000,40000,20000,2000,2000,2010,2000,2000,20000,40000,90000,260000,1300000,10000000]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Plinko's maths: 8, 12 or 16 rows, three risks. A ball takes k rights of n
|
|
3
|
+
// with weight C(n, k); bucket k pays its multiplier. The centre bucket's
|
|
4
|
+
// multiplier is solved for 99%, then rounded down to 0.001× so the board
|
|
5
|
+
// shows exactly what pays; the RTP lands just under 99% (the verifier
|
|
6
|
+
// reports it to four decimals).
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { dirname, join } from 'node:path';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
import { binomial, writePack } from '../math-kit/pack.mjs';
|
|
11
|
+
|
|
12
|
+
const DIR = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const project = join(DIR, '..', 'hbengine.json');
|
|
14
|
+
const GAME = process.argv[2] || (existsSync(project) ? JSON.parse(readFileSync(project, 'utf8')).slug : 'plinko');
|
|
15
|
+
const RTP = 9900n;
|
|
16
|
+
// Multipliers from the edge to the centre (the centre is solved), × 1.
|
|
17
|
+
const EDGES = {
|
|
18
|
+
8: { low: [5.5, 2.1, 1.1, 1], medium: [13, 3, 1.3, 0.7], high: [29, 4, 1.5, 0.3] },
|
|
19
|
+
12: { low: [10, 3, 1.6, 1.4, 1.1, 1], medium: [33, 11, 4, 2, 1.1, 0.6], high: [170, 24, 8.1, 2, 0.7, 0.2] },
|
|
20
|
+
16: { low: [16, 9, 2, 1.4, 1.4, 1.2, 1.1, 1], medium: [110, 41, 10, 5, 3, 1.5, 1, 0.5], high: [1000, 130, 26, 9, 4, 2, 0.2, 0.2] },
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const modes = [], board = {};
|
|
24
|
+
for (const [n, risks] of Object.entries(EDGES)) for (const [risk, edge] of Object.entries(risks)) {
|
|
25
|
+
const rows = Number(n), c = rows / 2;
|
|
26
|
+
const bp = edge.map((x) => BigInt(Math.round(x * 10000)));
|
|
27
|
+
const pays = [...bp, 0n, ...[...bp].reverse()]; // the centre, k = n/2, to solve
|
|
28
|
+
const total = 1n << BigInt(rows);
|
|
29
|
+
const rest = pays.reduce((s, m, k) => s + binomial(rows, k) * m, 0n);
|
|
30
|
+
const centre = ((RTP * total - rest) / binomial(rows, c) / 10n) * 10n; // down to 0.001×: RTP ≤ 99%
|
|
31
|
+
if (centre <= 0n) throw new Error(`${n}-${risk}: the edges alone pay over 99%`);
|
|
32
|
+
pays[c] = centre;
|
|
33
|
+
board[`${n}-${risk}`] = pays.map(Number); // bucket k's multiplier, bp, for the page
|
|
34
|
+
modes.push({
|
|
35
|
+
id: `${n}-${risk}`, label: `${n} rows · ${risk}`, bets: [{ id: 'drop', label: 'Drop' }],
|
|
36
|
+
rows: pays.map((m, k) => ({ weight: binomial(rows, k), data: { k }, pay: { drop: Number(m) } })),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
writePack(DIR, { game: GAME, rtpBp: Number(RTP), modes });
|
|
40
|
+
writeFileSync(join(DIR, '..', 'bundle', 'model.json'), JSON.stringify(board) + '\n');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"format":"house-engine-math/1","game":"plinko","rtpBp":9900,"modes":[{"id":"8-low","label":"8 rows · low","kind":"table","table":"plinko-8-low.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,0]],"multBp":5030},{"outcomes":[[1,2]],"multBp":10000},{"outcomes":[[3,4]],"multBp":11000},{"outcomes":[[5,6]],"multBp":21000},{"outcomes":[[7,8]],"multBp":55000}]}]},{"id":"8-medium","label":"8 rows · medium","kind":"table","table":"plinko-8-medium.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,0]],"multBp":4030},{"outcomes":[[1,2]],"multBp":7000},{"outcomes":[[3,4]],"multBp":13000},{"outcomes":[[5,6]],"multBp":30000},{"outcomes":[[7,8]],"multBp":130000}]}]},{"id":"8-high","label":"8 rows · high","kind":"table","table":"plinko-8-high.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,0]],"multBp":1970},{"outcomes":[[1,2]],"multBp":3000},{"outcomes":[[3,4]],"multBp":15000},{"outcomes":[[5,6]],"multBp":40000},{"outcomes":[[7,8]],"multBp":290000}]}]},{"id":"12-low","label":"12 rows · low","kind":"table","table":"plinko-12-low.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,0]],"multBp":5000},{"outcomes":[[1,2]],"multBp":10000},{"outcomes":[[3,4]],"multBp":11000},{"outcomes":[[5,6]],"multBp":14000},{"outcomes":[[7,8]],"multBp":16000},{"outcomes":[[9,10]],"multBp":30000},{"outcomes":[[11,12]],"multBp":100000}]}]},{"id":"12-medium","label":"12 rows · medium","kind":"table","table":"plinko-12-medium.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,0]],"multBp":3000},{"outcomes":[[1,2]],"multBp":6000},{"outcomes":[[3,4]],"multBp":11000},{"outcomes":[[5,6]],"multBp":20000},{"outcomes":[[7,8]],"multBp":40000},{"outcomes":[[9,10]],"multBp":110000},{"outcomes":[[11,12]],"multBp":330000}]}]},{"id":"12-high","label":"12 rows · high","kind":"table","table":"plinko-12-high.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,0]],"multBp":1940},{"outcomes":[[1,2]],"multBp":2000},{"outcomes":[[3,4]],"multBp":7000},{"outcomes":[[5,6]],"multBp":20000},{"outcomes":[[7,8]],"multBp":81000},{"outcomes":[[9,10]],"multBp":240000},{"outcomes":[[11,12]],"multBp":1700000}]}]},{"id":"16-low","label":"16 rows · low","kind":"table","table":"plinko-16-low.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,0]],"multBp":5000},{"outcomes":[[1,2]],"multBp":10000},{"outcomes":[[3,4]],"multBp":11000},{"outcomes":[[5,6]],"multBp":12000},{"outcomes":[[7,10]],"multBp":14000},{"outcomes":[[11,12]],"multBp":20000},{"outcomes":[[13,14]],"multBp":90000},{"outcomes":[[15,16]],"multBp":160000}]}]},{"id":"16-medium","label":"16 rows · medium","kind":"table","table":"plinko-16-medium.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,0]],"multBp":3000},{"outcomes":[[1,2]],"multBp":5000},{"outcomes":[[3,4]],"multBp":10000},{"outcomes":[[5,6]],"multBp":15000},{"outcomes":[[7,8]],"multBp":30000},{"outcomes":[[9,10]],"multBp":50000},{"outcomes":[[11,12]],"multBp":100000},{"outcomes":[[13,14]],"multBp":410000},{"outcomes":[[15,16]],"multBp":1100000}]}]},{"id":"16-high","label":"16 rows · high","kind":"table","table":"plinko-16-high.tsv","bets":[{"id":"drop","label":"Drop","tiers":[{"outcomes":[[0,3]],"multBp":2000},{"outcomes":[[4,4]],"multBp":2010},{"outcomes":[[5,6]],"multBp":20000},{"outcomes":[[7,8]],"multBp":40000},{"outcomes":[[9,10]],"multBp":90000},{"outcomes":[[11,12]],"multBp":260000},{"outcomes":[[13,14]],"multBp":1300000},{"outcomes":[[15,16]],"multBp":10000000}]}]}]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
8008 {"k":6}
|
|
2
|
+
11440 {"k":7}
|
|
3
|
+
11440 {"k":9}
|
|
4
|
+
8008 {"k":10}
|
|
5
|
+
12870 {"k":8}
|
|
6
|
+
4368 {"k":5}
|
|
7
|
+
4368 {"k":11}
|
|
8
|
+
1820 {"k":4}
|
|
9
|
+
1820 {"k":12}
|
|
10
|
+
560 {"k":3}
|
|
11
|
+
560 {"k":13}
|
|
12
|
+
120 {"k":2}
|
|
13
|
+
120 {"k":14}
|
|
14
|
+
16 {"k":1}
|
|
15
|
+
16 {"k":15}
|
|
16
|
+
1 {"k":0}
|
|
17
|
+
1 {"k":16}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
12870 {"k":8}
|
|
2
|
+
11440 {"k":7}
|
|
3
|
+
11440 {"k":9}
|
|
4
|
+
8008 {"k":6}
|
|
5
|
+
8008 {"k":10}
|
|
6
|
+
4368 {"k":5}
|
|
7
|
+
4368 {"k":11}
|
|
8
|
+
560 {"k":3}
|
|
9
|
+
1820 {"k":4}
|
|
10
|
+
1820 {"k":12}
|
|
11
|
+
560 {"k":13}
|
|
12
|
+
120 {"k":2}
|
|
13
|
+
120 {"k":14}
|
|
14
|
+
16 {"k":1}
|
|
15
|
+
16 {"k":15}
|
|
16
|
+
1 {"k":0}
|
|
17
|
+
1 {"k":16}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
12870 {"k":8}
|
|
2
|
+
11440 {"k":7}
|
|
3
|
+
11440 {"k":9}
|
|
4
|
+
8008 {"k":6}
|
|
5
|
+
8008 {"k":10}
|
|
6
|
+
4368 {"k":5}
|
|
7
|
+
4368 {"k":11}
|
|
8
|
+
1820 {"k":4}
|
|
9
|
+
1820 {"k":12}
|
|
10
|
+
560 {"k":3}
|
|
11
|
+
560 {"k":13}
|
|
12
|
+
120 {"k":2}
|
|
13
|
+
120 {"k":14}
|
|
14
|
+
16 {"k":1}
|
|
15
|
+
16 {"k":15}
|
|
16
|
+
1 {"k":0}
|
|
17
|
+
1 {"k":16}
|