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,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Crash's maths, as a ladder with cash-out: 64 levels from 1.01× to about
|
|
3
|
+
// 1,000× (every 0.05× up to 2×, then about 15% a level). Level k is
|
|
4
|
+
// survived with weight m(k−1) against m(k) − m(k−1) (the first: 0.99
|
|
5
|
+
// against what is left), so cashing out at any level returns exactly 99%.
|
|
6
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { dirname, join } from 'node:path';
|
|
8
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
|
|
11
|
+
const DIR = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const project = join(DIR, '..', 'hbengine.json');
|
|
13
|
+
const GAME = process.argv[2] || (existsSync(project) ? JSON.parse(readFileSync(project, 'utf8')).slug : 'crash');
|
|
14
|
+
const RTP = 9900;
|
|
15
|
+
|
|
16
|
+
// The levels, in basis points, whole hundredths of ×.
|
|
17
|
+
const levels = [10100];
|
|
18
|
+
for (let x = 10500; x <= 20000; x += 500) levels.push(x);
|
|
19
|
+
const rest = 64 - levels.length, ratio = (1000 / 2) ** (1 / rest);
|
|
20
|
+
for (let i = 1; i <= rest; i++) levels.push(Math.max(levels.at(-1) + 100, Math.round(20000 * ratio ** i / 100) * 100));
|
|
21
|
+
|
|
22
|
+
mkdirSync(DIR, { recursive: true });
|
|
23
|
+
const steps = levels.map((m, k) => {
|
|
24
|
+
const table = `${GAME}-${String(k + 1).padStart(2, '0')}.tsv`;
|
|
25
|
+
const [live, bust] = k === 0 ? [RTP, m - RTP] : [levels[k - 1], m - levels[k - 1]];
|
|
26
|
+
writeFileSync(join(DIR, table), `${live}\t{"ok":1}\n${bust}\t{"ok":0}\n`);
|
|
27
|
+
return { table };
|
|
28
|
+
});
|
|
29
|
+
const manifest = { format: 'house-engine-math/1', game: GAME, rtpBp: RTP, modes: [{ id: 'crash', label: 'Crash', kind: 'ladder', steps, cashout: true, ladderBp: levels, bets: [{ id: 'play', label: 'Play', survive: [[0, 0]] }] }] };
|
|
30
|
+
writeFileSync(join(DIR, 'manifest.json'), JSON.stringify(manifest) + '\n');
|
|
31
|
+
console.log(`${levels.length} levels: ${levels.slice(0, 4).map((m) => m / 10000).join(', ')} … ${levels.at(-1) / 10000}×; 99% at every cash-out`);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"format":"house-engine-math/1","game":"crash","rtpBp":9900,"modes":[{"id":"crash","label":"Crash","kind":"ladder","steps":[{"table":"crash-01.tsv"},{"table":"crash-02.tsv"},{"table":"crash-03.tsv"},{"table":"crash-04.tsv"},{"table":"crash-05.tsv"},{"table":"crash-06.tsv"},{"table":"crash-07.tsv"},{"table":"crash-08.tsv"},{"table":"crash-09.tsv"},{"table":"crash-10.tsv"},{"table":"crash-11.tsv"},{"table":"crash-12.tsv"},{"table":"crash-13.tsv"},{"table":"crash-14.tsv"},{"table":"crash-15.tsv"},{"table":"crash-16.tsv"},{"table":"crash-17.tsv"},{"table":"crash-18.tsv"},{"table":"crash-19.tsv"},{"table":"crash-20.tsv"},{"table":"crash-21.tsv"},{"table":"crash-22.tsv"},{"table":"crash-23.tsv"},{"table":"crash-24.tsv"},{"table":"crash-25.tsv"},{"table":"crash-26.tsv"},{"table":"crash-27.tsv"},{"table":"crash-28.tsv"},{"table":"crash-29.tsv"},{"table":"crash-30.tsv"},{"table":"crash-31.tsv"},{"table":"crash-32.tsv"},{"table":"crash-33.tsv"},{"table":"crash-34.tsv"},{"table":"crash-35.tsv"},{"table":"crash-36.tsv"},{"table":"crash-37.tsv"},{"table":"crash-38.tsv"},{"table":"crash-39.tsv"},{"table":"crash-40.tsv"},{"table":"crash-41.tsv"},{"table":"crash-42.tsv"},{"table":"crash-43.tsv"},{"table":"crash-44.tsv"},{"table":"crash-45.tsv"},{"table":"crash-46.tsv"},{"table":"crash-47.tsv"},{"table":"crash-48.tsv"},{"table":"crash-49.tsv"},{"table":"crash-50.tsv"},{"table":"crash-51.tsv"},{"table":"crash-52.tsv"},{"table":"crash-53.tsv"},{"table":"crash-54.tsv"},{"table":"crash-55.tsv"},{"table":"crash-56.tsv"},{"table":"crash-57.tsv"},{"table":"crash-58.tsv"},{"table":"crash-59.tsv"},{"table":"crash-60.tsv"},{"table":"crash-61.tsv"},{"table":"crash-62.tsv"},{"table":"crash-63.tsv"},{"table":"crash-64.tsv"}],"cashout":true,"ladderBp":[10100,10500,11000,11500,12000,12500,13000,13500,14000,14500,15000,15500,16000,16500,17000,17500,18000,18500,19000,19500,20000,23100,26700,30900,35700,41200,47600,55000,63600,73400,84900,98100,113300,130900,151300,174800,202000,233400,269700,311600,360100,416000,480700,555500,641800,741600,857000,990200,1144200,1322100,1527700,1765200,2039700,2356900,2723300,3146800,3636100,4201500,4854700,5609600,6481900,7489700,8654300,10000000],"bets":[{"id":"play","label":"Play","survive":[[0,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,25 @@
|
|
|
1
|
+
# Dice — a target bet on a 0–99 roll
|
|
2
|
+
|
|
3
|
+
One table of 100 outcomes, two bet families on it: `under-N` (roll < N)
|
|
4
|
+
and `over-N` (roll > N) for N in 2..98. The zone picks the bet by
|
|
5
|
+
setting `game.bet`; `/engine-sdk/ui.js` draws the panel around it.
|
|
6
|
+
|
|
7
|
+
## Multipliers and RTP (exact, integer arithmetic)
|
|
8
|
+
|
|
9
|
+
For a bet with W winning rows out of 100:
|
|
10
|
+
|
|
11
|
+
multBp = floor(99 * 10000 / W)
|
|
12
|
+
rtpBp = W * multBp / 100
|
|
13
|
+
|
|
14
|
+
- `under-N`: W = N, N in 2..98
|
|
15
|
+
- `over-N`: W = 99 - N, N in 2..98
|
|
16
|
+
|
|
17
|
+
Every bet pays. 67 of the 194 bets land on exactly 99.00% (every W that
|
|
18
|
+
divides 990000); the rest lose at most 0.86 bp to the floor. The worst
|
|
19
|
+
is `under-94` / `over-5` (W = 94): mult = 1.0531×, RTP = 98.9914%.
|
|
20
|
+
|
|
21
|
+
The mode's `rtpBp` cap is 9900, so the engine's own check verifies this
|
|
22
|
+
on every pack load (`report.rtp` per bet; see `curl /engine/v1/math/dice`).
|
|
23
|
+
|
|
24
|
+
npx hbengine verify . exact RTP per bet, the mathHash
|
|
25
|
+
npx hbengine init my-dice --template dice --slug my-dice # make it yours, then: verify, dev, upload
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "groups": { "boot": { "files": ["index.html", "game.js", "game.css"] } } }
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
body { margin: 0; background: #08141a; color: #F9F9FB; font: 500 14px/1.4 'Figtree', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
|
|
2
|
+
.dice { width: 100%; max-width: 560px; box-sizing: border-box; padding: 20px; display: grid; gap: 20px; }
|
|
3
|
+
.facts { display: flex; flex-wrap: wrap; gap: 16px; justify-content: space-between; font-size: 13px; color: #8F96A8; font-variant-numeric: tabular-nums; }
|
|
4
|
+
.facts b { color: #F9F9FB; font-weight: 700; font-size: 15px; }
|
|
5
|
+
.track { position: relative; height: 48px; background: #0b1f28; border: 1px solid #0D2A38; border-radius: 24px; }
|
|
6
|
+
.win { position: absolute; top: 0; bottom: 0; background: rgba(40, 243, 243, 0.22); border-left: 1px solid #28F3F3; border-right: 1px solid #28F3F3; border-radius: inherit; }
|
|
7
|
+
.scale { position: absolute; inset: 100% 12px auto 12px; padding-top: 6px; display: flex; justify-content: space-between; color: #8F96A8; font-size: 11px; font-variant-numeric: tabular-nums; }
|
|
8
|
+
.marker { position: absolute; top: 50%; left: 22px; transform: translate(-50%, -50%); min-width: 44px; height: 36px; padding: 0 10px; display: grid; place-items: center; border-radius: 18px; background: #28F3F3; color: #041015; font-weight: 700; font-size: 15px; font-variant-numeric: tabular-nums; box-shadow: 0 6px 20px rgba(0,0,0,.4); transition: left 620ms cubic-bezier(.2,.8,.2,1); }
|
|
9
|
+
.marker.win { background: #58e879; }
|
|
10
|
+
.marker.lose { background: #FA2E5D; color: #F9F9FB; }
|
|
11
|
+
.pick { display: grid; gap: 12px; }
|
|
12
|
+
.side { display: inline-flex; padding: 3px; gap: 3px; background: rgba(9,102,125,0.15); border-radius: 8px; justify-self: start; }
|
|
13
|
+
.side button { height: 32px; padding: 0 14px; border: 0; border-radius: 6px; background: transparent; color: #8F96A8; font: inherit; font-weight: 600; cursor: pointer; }
|
|
14
|
+
.side button[aria-pressed="true"] { background: #0D2A38; color: #F9F9FB; }
|
|
15
|
+
.target { display: grid; grid-template-columns: 1fr auto; gap: 12px; align-items: center; }
|
|
16
|
+
.target input[type="range"] { width: 100%; accent-color: #28F3F3; }
|
|
17
|
+
.target output { color: #F9F9FB; font-weight: 700; font-variant-numeric: tabular-nums; min-width: 28px; text-align: right; }
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Dice: roll under or over N on 0–99. The zone picks the bet by setting
|
|
2
|
+
// game.bet; /engine-sdk/ui.js draws the panel around it.
|
|
3
|
+
import { mount } from '/engine-sdk/ui.js';
|
|
4
|
+
|
|
5
|
+
const el = document.getElementById('game');
|
|
6
|
+
const marker = document.getElementById('marker');
|
|
7
|
+
const winBand = document.getElementById('win');
|
|
8
|
+
const mult = document.getElementById('mult');
|
|
9
|
+
const chance = document.getElementById('chance');
|
|
10
|
+
const maxwin = document.getElementById('maxwin');
|
|
11
|
+
const target = document.getElementById('target');
|
|
12
|
+
const val = document.getElementById('val');
|
|
13
|
+
const sides = el.querySelectorAll('[data-side]');
|
|
14
|
+
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
15
|
+
const pct = (x) => (x / 99 * 100) + '%';
|
|
16
|
+
|
|
17
|
+
let side = 'under';
|
|
18
|
+
let n = 50;
|
|
19
|
+
|
|
20
|
+
const game = await mount(el, {
|
|
21
|
+
async reveal(round) {
|
|
22
|
+
const roll = round.data[0].roll;
|
|
23
|
+
marker.classList.remove('win', 'lose');
|
|
24
|
+
marker.textContent = '?';
|
|
25
|
+
marker.style.transition = 'none';
|
|
26
|
+
marker.style.left = '22px';
|
|
27
|
+
void marker.offsetWidth;
|
|
28
|
+
marker.style.transition = '';
|
|
29
|
+
await wait(40);
|
|
30
|
+
marker.style.left = `clamp(22px, ${pct(roll)}, calc(100% - 22px))`; // the marker stays on the track at 0 and 99
|
|
31
|
+
await wait(620);
|
|
32
|
+
marker.textContent = String(roll);
|
|
33
|
+
marker.classList.add(round.payout > 0 ? 'win' : 'lose');
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const { engine, field } = game;
|
|
37
|
+
const money = engine.money;
|
|
38
|
+
const bets = new Map(engine.config.modes[0].bets.map((b) => [b.id, b]));
|
|
39
|
+
const range = () => (side === 'under' ? [0, n - 1] : [n + 1, 99]);
|
|
40
|
+
|
|
41
|
+
function paint() {
|
|
42
|
+
val.textContent = String(n);
|
|
43
|
+
const [lo, hi] = range();
|
|
44
|
+
winBand.style.left = pct(lo);
|
|
45
|
+
winBand.style.width = pct(hi - lo);
|
|
46
|
+
chance.textContent = String(hi - lo + 1);
|
|
47
|
+
const bet = bets.get(`${side}-${n}`);
|
|
48
|
+
const m = bet.maxMultBp / 10000;
|
|
49
|
+
mult.textContent = m.toFixed(2) + '×';
|
|
50
|
+
maxwin.textContent = money.sign + money.format(money.payout(field.amount, m)) + (money.sign ? '' : ' ' + money.unit);
|
|
51
|
+
game.bet = bet.id;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
for (const s of sides) s.addEventListener('click', () => {
|
|
55
|
+
side = s.dataset.side;
|
|
56
|
+
for (const o of sides) o.setAttribute('aria-pressed', String(o === s));
|
|
57
|
+
paint();
|
|
58
|
+
});
|
|
59
|
+
target.addEventListener('input', () => { n = +target.value; paint(); });
|
|
60
|
+
field.addEventListener('change', paint);
|
|
61
|
+
paint();
|
|
@@ -0,0 +1,34 @@
|
|
|
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>Dice</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="dice" aria-live="polite">
|
|
14
|
+
<div class="facts">
|
|
15
|
+
<span>Payout <b id="mult">2.00×</b></span>
|
|
16
|
+
<span>Chance <b id="chance">50</b>%</span>
|
|
17
|
+
<span>Max win <b id="maxwin">—</b></span>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="track" id="track">
|
|
20
|
+
<div class="win" id="win"></div>
|
|
21
|
+
<div class="scale"><span>0</span><span>25</span><span>50</span><span>75</span><span>99</span></div>
|
|
22
|
+
<div class="marker" id="marker">?</div>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="pick">
|
|
25
|
+
<div class="side" role="tablist">
|
|
26
|
+
<button type="button" data-side="under" aria-pressed="true">Under</button>
|
|
27
|
+
<button type="button" data-side="over">Over</button>
|
|
28
|
+
</div>
|
|
29
|
+
<label class="target"><input id="target" type="range" min="2" max="98" step="1" value="50" aria-label="target"><output id="val">50</output></label>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</hb-game>
|
|
33
|
+
</body>
|
|
34
|
+
</html>
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
1 {"roll":0}
|
|
2
|
+
1 {"roll":1}
|
|
3
|
+
1 {"roll":2}
|
|
4
|
+
1 {"roll":3}
|
|
5
|
+
1 {"roll":4}
|
|
6
|
+
1 {"roll":5}
|
|
7
|
+
1 {"roll":6}
|
|
8
|
+
1 {"roll":7}
|
|
9
|
+
1 {"roll":8}
|
|
10
|
+
1 {"roll":9}
|
|
11
|
+
1 {"roll":10}
|
|
12
|
+
1 {"roll":11}
|
|
13
|
+
1 {"roll":12}
|
|
14
|
+
1 {"roll":13}
|
|
15
|
+
1 {"roll":14}
|
|
16
|
+
1 {"roll":15}
|
|
17
|
+
1 {"roll":16}
|
|
18
|
+
1 {"roll":17}
|
|
19
|
+
1 {"roll":18}
|
|
20
|
+
1 {"roll":19}
|
|
21
|
+
1 {"roll":20}
|
|
22
|
+
1 {"roll":21}
|
|
23
|
+
1 {"roll":22}
|
|
24
|
+
1 {"roll":23}
|
|
25
|
+
1 {"roll":24}
|
|
26
|
+
1 {"roll":25}
|
|
27
|
+
1 {"roll":26}
|
|
28
|
+
1 {"roll":27}
|
|
29
|
+
1 {"roll":28}
|
|
30
|
+
1 {"roll":29}
|
|
31
|
+
1 {"roll":30}
|
|
32
|
+
1 {"roll":31}
|
|
33
|
+
1 {"roll":32}
|
|
34
|
+
1 {"roll":33}
|
|
35
|
+
1 {"roll":34}
|
|
36
|
+
1 {"roll":35}
|
|
37
|
+
1 {"roll":36}
|
|
38
|
+
1 {"roll":37}
|
|
39
|
+
1 {"roll":38}
|
|
40
|
+
1 {"roll":39}
|
|
41
|
+
1 {"roll":40}
|
|
42
|
+
1 {"roll":41}
|
|
43
|
+
1 {"roll":42}
|
|
44
|
+
1 {"roll":43}
|
|
45
|
+
1 {"roll":44}
|
|
46
|
+
1 {"roll":45}
|
|
47
|
+
1 {"roll":46}
|
|
48
|
+
1 {"roll":47}
|
|
49
|
+
1 {"roll":48}
|
|
50
|
+
1 {"roll":49}
|
|
51
|
+
1 {"roll":50}
|
|
52
|
+
1 {"roll":51}
|
|
53
|
+
1 {"roll":52}
|
|
54
|
+
1 {"roll":53}
|
|
55
|
+
1 {"roll":54}
|
|
56
|
+
1 {"roll":55}
|
|
57
|
+
1 {"roll":56}
|
|
58
|
+
1 {"roll":57}
|
|
59
|
+
1 {"roll":58}
|
|
60
|
+
1 {"roll":59}
|
|
61
|
+
1 {"roll":60}
|
|
62
|
+
1 {"roll":61}
|
|
63
|
+
1 {"roll":62}
|
|
64
|
+
1 {"roll":63}
|
|
65
|
+
1 {"roll":64}
|
|
66
|
+
1 {"roll":65}
|
|
67
|
+
1 {"roll":66}
|
|
68
|
+
1 {"roll":67}
|
|
69
|
+
1 {"roll":68}
|
|
70
|
+
1 {"roll":69}
|
|
71
|
+
1 {"roll":70}
|
|
72
|
+
1 {"roll":71}
|
|
73
|
+
1 {"roll":72}
|
|
74
|
+
1 {"roll":73}
|
|
75
|
+
1 {"roll":74}
|
|
76
|
+
1 {"roll":75}
|
|
77
|
+
1 {"roll":76}
|
|
78
|
+
1 {"roll":77}
|
|
79
|
+
1 {"roll":78}
|
|
80
|
+
1 {"roll":79}
|
|
81
|
+
1 {"roll":80}
|
|
82
|
+
1 {"roll":81}
|
|
83
|
+
1 {"roll":82}
|
|
84
|
+
1 {"roll":83}
|
|
85
|
+
1 {"roll":84}
|
|
86
|
+
1 {"roll":85}
|
|
87
|
+
1 {"roll":86}
|
|
88
|
+
1 {"roll":87}
|
|
89
|
+
1 {"roll":88}
|
|
90
|
+
1 {"roll":89}
|
|
91
|
+
1 {"roll":90}
|
|
92
|
+
1 {"roll":91}
|
|
93
|
+
1 {"roll":92}
|
|
94
|
+
1 {"roll":93}
|
|
95
|
+
1 {"roll":94}
|
|
96
|
+
1 {"roll":95}
|
|
97
|
+
1 {"roll":96}
|
|
98
|
+
1 {"roll":97}
|
|
99
|
+
1 {"roll":98}
|
|
100
|
+
1 {"roll":99}
|