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,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A tumbling, scatter-pays slot for the maths kit: a cols × rows grid, every
|
|
3
|
+
* cell drawn by symbol weight; a symbol pays when enough of it is anywhere
|
|
4
|
+
* on the grid; winners vanish, the rest fall, new symbols drop in, until
|
|
5
|
+
* nothing pays. Scatters start free spins, where multiplier symbols land
|
|
6
|
+
* and multiply the spin's win. Like slot.mjs, it plays whole rounds into
|
|
7
|
+
* rows; fit() then makes the RTP exact.
|
|
8
|
+
*
|
|
9
|
+
* Symbols are single characters. Pays are basis points of the stake by
|
|
10
|
+
* count: { A: [[8, 2000], [10, 5000], [12, 10000]] } pays the highest band
|
|
11
|
+
* the count reaches.
|
|
12
|
+
*
|
|
13
|
+
* A row's data, for the page:
|
|
14
|
+
* { b: spin, f: [spin…] } spin = [grid, [tumble…], multipliers?]
|
|
15
|
+
* grid the first grid, column by column, top to bottom ("ABCDE…")
|
|
16
|
+
* tumble [winners, winBp, fill0, fill1, …]: the symbols that paid, what
|
|
17
|
+
* they paid, and per column the new symbols that drop in (top first)
|
|
18
|
+
* multipliers free spins only: the values of the multiplier symbols on the
|
|
19
|
+
* last grid, summed onto the spin's win when it won
|
|
20
|
+
*/
|
|
21
|
+
export function tumble(cfg) {
|
|
22
|
+
const { cols, rows, weights, freeWeights = weights, pays, scatter, bomb, maxWinBp } = cfg;
|
|
23
|
+
const pick = (w, next) => {
|
|
24
|
+
const total = w.reduce((s, [, n]) => s + n, 0);
|
|
25
|
+
let x = next() * total;
|
|
26
|
+
for (const [s, n] of w) if ((x -= n) < 0) return s;
|
|
27
|
+
return w[w.length - 1][0];
|
|
28
|
+
};
|
|
29
|
+
const table = (o) => Object.entries(o);
|
|
30
|
+
const base = table(weights), free = table(freeWeights);
|
|
31
|
+
const counts = Object.keys(scatter.spins).map(Number), least = Math.min(...counts), most = Math.max(...counts);
|
|
32
|
+
|
|
33
|
+
// One spin: the grid, its tumbles, and (free spins) its multipliers.
|
|
34
|
+
function spin(next, inFree) {
|
|
35
|
+
const w = inFree ? free : base;
|
|
36
|
+
const draw = () => {
|
|
37
|
+
const s = pick(w, next);
|
|
38
|
+
return s === bomb?.symbol && !inFree ? pick(base.filter(([x]) => x !== bomb.symbol), next) : s;
|
|
39
|
+
};
|
|
40
|
+
let grid = Array.from({ length: cols }, () => Array.from({ length: rows }, draw));
|
|
41
|
+
const first = grid.map((c) => c.join('')).join('');
|
|
42
|
+
const tumbles = [];
|
|
43
|
+
let win = 0;
|
|
44
|
+
for (;;) {
|
|
45
|
+
const counts = {};
|
|
46
|
+
for (const c of grid) for (const s of c) counts[s] = (counts[s] || 0) + 1;
|
|
47
|
+
let paid = '', bp = 0;
|
|
48
|
+
for (const [s, bands] of Object.entries(pays)) {
|
|
49
|
+
const band = bands.filter(([n]) => counts[s] >= n).at(-1);
|
|
50
|
+
if (band) { paid += s; bp += band[1]; }
|
|
51
|
+
}
|
|
52
|
+
if (!paid) break;
|
|
53
|
+
win += bp;
|
|
54
|
+
const fills = grid.map((c) => {
|
|
55
|
+
const kept = c.filter((s) => !paid.includes(s));
|
|
56
|
+
const add = Array.from({ length: rows - kept.length }, draw);
|
|
57
|
+
c.splice(0, rows, ...add, ...kept); // new symbols on top
|
|
58
|
+
return add.join('');
|
|
59
|
+
});
|
|
60
|
+
tumbles.push([paid, bp, ...fills]);
|
|
61
|
+
}
|
|
62
|
+
const out = [first, tumbles];
|
|
63
|
+
const scatters = grid.flat().filter((s) => s === scatter.symbol).length; // on the last grid
|
|
64
|
+
let total = win;
|
|
65
|
+
if (inFree && bomb) {
|
|
66
|
+
const bombs = grid.flat().filter((s) => s === bomb.symbol).map(() => pick(bomb.values, next));
|
|
67
|
+
if (bombs.length) out.push(bombs);
|
|
68
|
+
if (win && bombs.length) total = win * bombs.reduce((a, b) => a + b, 0);
|
|
69
|
+
}
|
|
70
|
+
return { out, total, scatters };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** One whole round: the row's data and what it pays (bp of the stake). */
|
|
74
|
+
function round(next) {
|
|
75
|
+
const b = spin(next, false);
|
|
76
|
+
const data = { b: b.out };
|
|
77
|
+
let total = b.total + (scatter.pays[Math.min(b.scatters, most)] || 0);
|
|
78
|
+
let left = b.scatters >= least ? scatter.spins[Math.min(b.scatters, most)] : 0;
|
|
79
|
+
if (left) {
|
|
80
|
+
data.f = [];
|
|
81
|
+
while (left > 0 && data.f.length < scatter.cap) {
|
|
82
|
+
left--;
|
|
83
|
+
const f = spin(next, true);
|
|
84
|
+
data.f.push(f.out);
|
|
85
|
+
total += f.total;
|
|
86
|
+
if (f.scatters >= scatter.retrigger.count) left += scatter.retrigger.spins;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (total > maxWinBp) { total = maxWinBp; data.cap = 1; }
|
|
90
|
+
return { data, pay: total };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return { round };
|
|
94
|
+
}
|
|
@@ -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,13 @@
|
|
|
1
|
+
# Mines — a ladder of reveals
|
|
2
|
+
|
|
3
|
+
A 5 × 5 grid with 1 to 24 mines: one mode per count (the panel's select).
|
|
4
|
+
Each tile revealed is a ladder step: with m mines and j tiles revealed, the
|
|
5
|
+
next is safe with weight (25 − m − j) against m — exact. After k safe
|
|
6
|
+
reveals the payout is 0.99 ÷ P(k safe), rounded down to 0.01× so the page
|
|
7
|
+
shows what pays; every cash-out returns 98.3%–99.0% (the verifier lists
|
|
8
|
+
each stop). The ladder stops before 10,000×, so a mode keeps a playable
|
|
9
|
+
max stake under the coin's max win. The tile picked is the next step; survival is the server's,
|
|
10
|
+
drawn at the bet. Where the other mines lie is shown after the round,
|
|
11
|
+
cosmetic, from the nonce — the rules say so.
|
|
12
|
+
|
|
13
|
+
node math/gen.mjs && npx hbengine verify .
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "groups": { "boot": { "files": ["index.html", "game.js", "game.css"] } } }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
body { margin: 0; background: #08141a; }
|
|
2
|
+
.mines { container-type: inline-size; display: grid; place-items: center; align-content: center; gap: 12px; width: 100%; padding: 16px; box-sizing: border-box; }
|
|
3
|
+
.grid { --c: min(88px, (100cqi - 32px - 4 * 8px) / 5); display: grid; grid-template-columns: repeat(5, var(--c)); gap: 8px; }
|
|
4
|
+
.grid button { height: var(--c); border: 0; border-radius: 10px; background: #0D2A38; cursor: pointer; display: grid; place-items: center; transition: transform 120ms, background 160ms; }
|
|
5
|
+
.grid button:disabled { cursor: default; }
|
|
6
|
+
.grid button.live:hover { background: #12394b; transform: translateY(-2px); }
|
|
7
|
+
.grid button.gem { background: #0b3b2a; }
|
|
8
|
+
.grid button.mine { background: #3b0f14; }
|
|
9
|
+
.grid button.mine.hit { background: #7e1f3a; }
|
|
10
|
+
.grid button.shown { opacity: .55; }
|
|
11
|
+
.grid svg { width: 54%; height: 54%; }
|
|
12
|
+
.next { height: 20px; color: #8F96A8; font: 600 14px/20px 'Figtree', system-ui, sans-serif; font-variant-numeric: tabular-nums; }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Mines: 5 × 5 tiles, 1 to 24 mines. The panel is the engine's (no Next
|
|
2
|
+
// button, Cash out stays); a tile the player picks is the next ladder step
|
|
3
|
+
// (game.advance()). Survival is the server's, drawn at the bet with exact
|
|
4
|
+
// weights; where the other mines lie is shown after the round, cosmetic.
|
|
5
|
+
import { mount } from '/engine-sdk/ui.js';
|
|
6
|
+
|
|
7
|
+
const grid = document.getElementById('grid'), next = document.getElementById('next');
|
|
8
|
+
const GEM = '<svg viewBox="0 0 40 40"><path d="M8 15l6-7h12l6 7-12 17z" fill="#0d5f6e" stroke="#5cf6f6" stroke-width="2.2" stroke-linejoin="round"/></svg>';
|
|
9
|
+
const MINE = '<svg viewBox="0 0 40 40"><circle cx="20" cy="21" r="11" fill="#7e1f3a" stroke="#ff6b81" stroke-width="2.2"/><path d="M20 4v6M33 8l-4 4M7 8l4 4" stroke="#ff6b81" stroke-width="2.2" stroke-linecap="round"/></svg>';
|
|
10
|
+
let picked = [], game;
|
|
11
|
+
const x = (bp) => (bp / 10000).toFixed(2) + '×';
|
|
12
|
+
|
|
13
|
+
const tiles = Array.from({ length: 25 }, (_, i) => {
|
|
14
|
+
const b = document.createElement('button');
|
|
15
|
+
b.type = 'button';
|
|
16
|
+
b.disabled = true;
|
|
17
|
+
b.onclick = () => {
|
|
18
|
+
if (!game.open || picked.includes(i)) return;
|
|
19
|
+
picked.push(i);
|
|
20
|
+
for (const t of tiles) t.disabled = true;
|
|
21
|
+
game.advance();
|
|
22
|
+
};
|
|
23
|
+
grid.append(b);
|
|
24
|
+
return b;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const minesOf = (mode) => Number(mode.split('-')[1]);
|
|
28
|
+
|
|
29
|
+
function show(round) {
|
|
30
|
+
const mines = minesOf(round.mode), m = game.engine.config.modes.find((x) => x.id === round.mode);
|
|
31
|
+
if (round.step === 0 && round.state === 'open') picked = [];
|
|
32
|
+
tiles.forEach((t, i) => { t.className = ''; t.innerHTML = ''; });
|
|
33
|
+
// The steps played (a closed round shows its whole drawn path; only the steps taken are the player's).
|
|
34
|
+
round.data.slice(0, round.step).forEach((d, j) => { const t = tiles[picked[j]]; if (t) { t.className = d.safe ? 'gem' : 'mine hit'; t.innerHTML = d.safe ? GEM : MINE; } });
|
|
35
|
+
if (round.state === 'open') {
|
|
36
|
+
tiles.forEach((t, i) => { const free = !picked.includes(i); t.disabled = !free; if (free) t.classList.add('live'); });
|
|
37
|
+
next.textContent = round.step < m.ladderBp.length ? `Next tile ${x(m.ladderBp[round.step])}` : '';
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Over: the other mines, where they are shown to have been (cosmetic, from the nonce).
|
|
41
|
+
let s = (Number(round.nonce) >>> 0) || 1;
|
|
42
|
+
const rnd = (n) => { s ^= s << 13; s ^= s >>> 17; s ^= s << 5; return (s >>> 0) % n; };
|
|
43
|
+
const others = tiles.map((_, i) => i).filter((i) => !picked.includes(i));
|
|
44
|
+
const bust = round.state === 'busted' ? 1 : 0; // round.busted is the drawn path's, also after a cash-out
|
|
45
|
+
for (let k = 0; k < mines - bust && others.length; k++) {
|
|
46
|
+
const i = others.splice(rnd(others.length), 1)[0];
|
|
47
|
+
tiles[i].className = 'mine shown'; tiles[i].innerHTML = MINE;
|
|
48
|
+
}
|
|
49
|
+
tiles.forEach((t) => { t.disabled = true; });
|
|
50
|
+
next.textContent = bust ? 'A mine' : `Cashed out at ${x(m.ladderBp[round.step - 1])}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
game = await mount(document.getElementById('game'), {
|
|
54
|
+
next: false,
|
|
55
|
+
labels: { en: Object.fromEntries(Array.from({ length: 24 }, (_, i) => [`mines-${i + 1}`, `${i + 1} mine${i ? 's' : ''}`])) },
|
|
56
|
+
step: show,
|
|
57
|
+
});
|
|
58
|
+
game.mode = 'mines-3';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"stake": { "page": "index.html", "selector": "hb-game hb-bet-amount input", "value": "1.00" },
|
|
3
|
+
"bet": { "page": "index.html", "selector": "hb-game [data-main]" },
|
|
4
|
+
"then": [
|
|
5
|
+
{ "page": "index.html", "selector": "#grid button.live" },
|
|
6
|
+
{ "page": "index.html", "selector": "hb-game [data-cashout]" }
|
|
7
|
+
]
|
|
8
|
+
}
|
|
@@ -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>Mines</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="mines"><div class="grid" id="grid" role="grid" aria-label="Reveal a tile"></div><div class="next" id="next" aria-live="polite"></div></div>
|
|
14
|
+
</hb-game>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Mines' maths: a 5 × 5 grid, 1 to 24 mines, one mode per count. Each
|
|
3
|
+
// reveal is a ladder step: with m mines and j tiles revealed, the next is
|
|
4
|
+
// safe with weight (25 − m − j) against m — exact. After k safe reveals the
|
|
5
|
+
// payout is 0.99 ÷ P(k safe), rounded down to 0.01× (shown as paid), so
|
|
6
|
+
// every cash-out returns just under 99%. The ladder stops before 10,000×:
|
|
7
|
+
// the engine refuses a stake whose largest win could pass the coin's max
|
|
8
|
+
// win, so a mode worth millions × would only take stakes of cents.
|
|
9
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { dirname, join } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
|
|
13
|
+
const DIR = dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const project = join(DIR, '..', 'hbengine.json');
|
|
15
|
+
const GAME = process.argv[2] || (existsSync(project) ? JSON.parse(readFileSync(project, 'utf8')).slug : 'mines');
|
|
16
|
+
const TILES = 25, RTP = 9900n, CAP = 10000 * 10000; // 10,000× in bp
|
|
17
|
+
|
|
18
|
+
mkdirSync(DIR, { recursive: true });
|
|
19
|
+
const tables = new Map(); // one table per (safe, mines) pair, shared by modes
|
|
20
|
+
const modes = [];
|
|
21
|
+
for (let m = 1; m <= 24; m++) {
|
|
22
|
+
const steps = [], ladderBp = [];
|
|
23
|
+
let num = 1n, den = 1n; // P(k safe) = num / den
|
|
24
|
+
for (let j = 0; j < TILES - m; j++) {
|
|
25
|
+
const safe = TILES - m - j, left = TILES - j;
|
|
26
|
+
num *= BigInt(safe); den *= BigInt(left);
|
|
27
|
+
const bp = Number((RTP * den) / num / 100n) * 100; // bp, down to 0.01×
|
|
28
|
+
// A payout must climb, and stays under the cap: the step before is the last.
|
|
29
|
+
if (j > 0 && (bp <= ladderBp.at(-1) || bp > CAP)) break;
|
|
30
|
+
const name = `${GAME}-${safe}-${m}.tsv`;
|
|
31
|
+
tables.set(name, `${safe}\t{"safe":1}\n${m}\t{"safe":0}\n`);
|
|
32
|
+
steps.push({ table: name });
|
|
33
|
+
ladderBp.push(bp);
|
|
34
|
+
}
|
|
35
|
+
modes.push({ id: `mines-${m}`, label: `${m} mine${m > 1 ? 's' : ''}`, kind: 'ladder', steps, cashout: true, ladderBp, bets: [{ id: 'play', label: 'Play', survive: [[0, 0]] }] });
|
|
36
|
+
}
|
|
37
|
+
for (const f of readdirSync(DIR)) if (f.endsWith('.tsv')) unlinkSync(join(DIR, f));
|
|
38
|
+
for (const [name, rows] of tables) writeFileSync(join(DIR, name), rows);
|
|
39
|
+
writeFileSync(join(DIR, 'manifest.json'), JSON.stringify({ format: 'house-engine-math/1', game: GAME, rtpBp: Number(RTP), modes }) + '\n');
|
|
40
|
+
console.log(`${modes.length} modes, ${tables.size} tables; 3 mines: ${modes[2].ladderBp.slice(0, 5).map((b) => b / 10000).join(', ')} …`);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"format":"house-engine-math/1","game":"mines","rtpBp":9900,"modes":[{"id":"mines-1","label":"1 mine","kind":"ladder","steps":[{"table":"mines-24-1.tsv"},{"table":"mines-23-1.tsv"},{"table":"mines-22-1.tsv"},{"table":"mines-21-1.tsv"},{"table":"mines-20-1.tsv"},{"table":"mines-19-1.tsv"},{"table":"mines-18-1.tsv"},{"table":"mines-17-1.tsv"},{"table":"mines-16-1.tsv"},{"table":"mines-15-1.tsv"},{"table":"mines-14-1.tsv"},{"table":"mines-13-1.tsv"},{"table":"mines-12-1.tsv"},{"table":"mines-11-1.tsv"},{"table":"mines-10-1.tsv"},{"table":"mines-9-1.tsv"},{"table":"mines-8-1.tsv"},{"table":"mines-7-1.tsv"},{"table":"mines-6-1.tsv"},{"table":"mines-5-1.tsv"},{"table":"mines-4-1.tsv"},{"table":"mines-3-1.tsv"},{"table":"mines-2-1.tsv"},{"table":"mines-1-1.tsv"}],"cashout":true,"ladderBp":[10300,10700,11200,11700,12300,13000,13700,14500,15400,16500,17600,19000,20600,22500,24700,27500,30900,35300,41200,49500,61800,82500,123700,247500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-2","label":"2 mines","kind":"ladder","steps":[{"table":"mines-23-2.tsv"},{"table":"mines-22-2.tsv"},{"table":"mines-21-2.tsv"},{"table":"mines-20-2.tsv"},{"table":"mines-19-2.tsv"},{"table":"mines-18-2.tsv"},{"table":"mines-17-2.tsv"},{"table":"mines-16-2.tsv"},{"table":"mines-15-2.tsv"},{"table":"mines-14-2.tsv"},{"table":"mines-13-2.tsv"},{"table":"mines-12-2.tsv"},{"table":"mines-11-2.tsv"},{"table":"mines-10-2.tsv"},{"table":"mines-9-2.tsv"},{"table":"mines-8-2.tsv"},{"table":"mines-7-2.tsv"},{"table":"mines-6-2.tsv"},{"table":"mines-5-2.tsv"},{"table":"mines-4-2.tsv"},{"table":"mines-3-2.tsv"},{"table":"mines-2-2.tsv"},{"table":"mines-1-2.tsv"}],"cashout":true,"ladderBp":[10700,11700,12800,14100,15600,17300,19400,21800,24700,28200,32600,38000,45000,54000,66000,82500,106000,141400,198000,297000,495000,990000,2970000],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-3","label":"3 mines","kind":"ladder","steps":[{"table":"mines-22-3.tsv"},{"table":"mines-21-3.tsv"},{"table":"mines-20-3.tsv"},{"table":"mines-19-3.tsv"},{"table":"mines-18-3.tsv"},{"table":"mines-17-3.tsv"},{"table":"mines-16-3.tsv"},{"table":"mines-15-3.tsv"},{"table":"mines-14-3.tsv"},{"table":"mines-13-3.tsv"},{"table":"mines-12-3.tsv"},{"table":"mines-11-3.tsv"},{"table":"mines-10-3.tsv"},{"table":"mines-9-3.tsv"},{"table":"mines-8-3.tsv"},{"table":"mines-7-3.tsv"},{"table":"mines-6-3.tsv"},{"table":"mines-5-3.tsv"},{"table":"mines-4-3.tsv"},{"table":"mines-3-3.tsv"},{"table":"mines-2-3.tsv"},{"table":"mines-1-3.tsv"}],"cashout":true,"ladderBp":[11200,12800,14700,17100,19900,23400,27900,33400,40600,50000,62500,79600,103500,138000,189700,271000,406600,650500,1138500,2277000,5692500,22770000],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-4","label":"4 mines","kind":"ladder","steps":[{"table":"mines-21-4.tsv"},{"table":"mines-20-4.tsv"},{"table":"mines-19-4.tsv"},{"table":"mines-18-4.tsv"},{"table":"mines-17-4.tsv"},{"table":"mines-16-4.tsv"},{"table":"mines-15-4.tsv"},{"table":"mines-14-4.tsv"},{"table":"mines-13-4.tsv"},{"table":"mines-12-4.tsv"},{"table":"mines-11-4.tsv"},{"table":"mines-10-4.tsv"},{"table":"mines-9-4.tsv"},{"table":"mines-8-4.tsv"},{"table":"mines-7-4.tsv"},{"table":"mines-6-4.tsv"},{"table":"mines-5-4.tsv"},{"table":"mines-4-4.tsv"},{"table":"mines-3-4.tsv"},{"table":"mines-2-4.tsv"}],"cashout":true,"ladderBp":[11700,14100,17100,20900,25800,32300,40900,52600,68800,91700,125100,175100,253000,379500,596300,993900,1789000,3578100,8349000,25047000],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-5","label":"5 mines","kind":"ladder","steps":[{"table":"mines-20-5.tsv"},{"table":"mines-19-5.tsv"},{"table":"mines-18-5.tsv"},{"table":"mines-17-5.tsv"},{"table":"mines-16-5.tsv"},{"table":"mines-15-5.tsv"},{"table":"mines-14-5.tsv"},{"table":"mines-13-5.tsv"},{"table":"mines-12-5.tsv"},{"table":"mines-11-5.tsv"},{"table":"mines-10-5.tsv"},{"table":"mines-9-5.tsv"},{"table":"mines-8-5.tsv"},{"table":"mines-7-5.tsv"},{"table":"mines-6-5.tsv"},{"table":"mines-5-5.tsv"},{"table":"mines-4-5.tsv"},{"table":"mines-3-5.tsv"},{"table":"mines-2-5.tsv"}],"cashout":true,"ladderBp":[12300,15600,19900,25800,33900,45200,61300,85000,120400,175100,262700,408600,664100,1138500,2087200,4174500,9392600,25047000,87664500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-6","label":"6 mines","kind":"ladder","steps":[{"table":"mines-19-6.tsv"},{"table":"mines-18-6.tsv"},{"table":"mines-17-6.tsv"},{"table":"mines-16-6.tsv"},{"table":"mines-15-6.tsv"},{"table":"mines-14-6.tsv"},{"table":"mines-13-6.tsv"},{"table":"mines-12-6.tsv"},{"table":"mines-11-6.tsv"},{"table":"mines-10-6.tsv"},{"table":"mines-9-6.tsv"},{"table":"mines-8-6.tsv"},{"table":"mines-7-6.tsv"},{"table":"mines-6-6.tsv"},{"table":"mines-5-6.tsv"},{"table":"mines-4-6.tsv"},{"table":"mines-3-6.tsv"}],"cashout":true,"ladderBp":[13000,17300,23400,32300,45200,64600,94400,141600,218900,350300,583800,1021700,1897500,3795000,8349000,20872500,62617500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-7","label":"7 mines","kind":"ladder","steps":[{"table":"mines-18-7.tsv"},{"table":"mines-17-7.tsv"},{"table":"mines-16-7.tsv"},{"table":"mines-15-7.tsv"},{"table":"mines-14-7.tsv"},{"table":"mines-13-7.tsv"},{"table":"mines-12-7.tsv"},{"table":"mines-11-7.tsv"},{"table":"mines-10-7.tsv"},{"table":"mines-9-7.tsv"},{"table":"mines-8-7.tsv"},{"table":"mines-7-7.tsv"},{"table":"mines-6-7.tsv"},{"table":"mines-5-7.tsv"},{"table":"mines-4-7.tsv"}],"cashout":true,"ladderBp":[13700,19400,27900,40900,61300,94400,149500,244700,415900,739500,1386600,2773200,6008700,14421000,39657700],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-8","label":"8 mines","kind":"ladder","steps":[{"table":"mines-17-8.tsv"},{"table":"mines-16-8.tsv"},{"table":"mines-15-8.tsv"},{"table":"mines-14-8.tsv"},{"table":"mines-13-8.tsv"},{"table":"mines-12-8.tsv"},{"table":"mines-11-8.tsv"},{"table":"mines-10-8.tsv"},{"table":"mines-9-8.tsv"},{"table":"mines-8-8.tsv"},{"table":"mines-7-8.tsv"},{"table":"mines-6-8.tsv"},{"table":"mines-5-8.tsv"},{"table":"mines-4-8.tsv"}],"cashout":true,"ladderBp":[14500,21800,33400,52600,85000,141600,244700,440400,831900,1663900,3565600,8319800,21631500,64894500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-9","label":"9 mines","kind":"ladder","steps":[{"table":"mines-16-9.tsv"},{"table":"mines-15-9.tsv"},{"table":"mines-14-9.tsv"},{"table":"mines-13-9.tsv"},{"table":"mines-12-9.tsv"},{"table":"mines-11-9.tsv"},{"table":"mines-10-9.tsv"},{"table":"mines-9-9.tsv"},{"table":"mines-8-9.tsv"},{"table":"mines-7-9.tsv"},{"table":"mines-6-9.tsv"},{"table":"mines-5-9.tsv"},{"table":"mines-4-9.tsv"}],"cashout":true,"ladderBp":[15400,24700,40600,68800,120400,218900,415900,831900,1767900,4041000,10102600,28287300,91933800],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-10","label":"10 mines","kind":"ladder","steps":[{"table":"mines-15-10.tsv"},{"table":"mines-14-10.tsv"},{"table":"mines-13-10.tsv"},{"table":"mines-12-10.tsv"},{"table":"mines-11-10.tsv"},{"table":"mines-10-10.tsv"},{"table":"mines-9-10.tsv"},{"table":"mines-8-10.tsv"},{"table":"mines-7-10.tsv"},{"table":"mines-6-10.tsv"},{"table":"mines-5-10.tsv"}],"cashout":true,"ladderBp":[16500,28200,50000,91700,175100,350300,739500,1663900,4041000,10776100,32328300],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-11","label":"11 mines","kind":"ladder","steps":[{"table":"mines-14-11.tsv"},{"table":"mines-13-11.tsv"},{"table":"mines-12-11.tsv"},{"table":"mines-11-11.tsv"},{"table":"mines-10-11.tsv"},{"table":"mines-9-11.tsv"},{"table":"mines-8-11.tsv"},{"table":"mines-7-11.tsv"},{"table":"mines-6-11.tsv"},{"table":"mines-5-11.tsv"}],"cashout":true,"ladderBp":[17600,32600,62500,125100,262700,583800,1386600,3565600,10102600,32328300],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-12","label":"12 mines","kind":"ladder","steps":[{"table":"mines-13-12.tsv"},{"table":"mines-12-12.tsv"},{"table":"mines-11-12.tsv"},{"table":"mines-10-12.tsv"},{"table":"mines-9-12.tsv"},{"table":"mines-8-12.tsv"},{"table":"mines-7-12.tsv"},{"table":"mines-6-12.tsv"},{"table":"mines-5-12.tsv"}],"cashout":true,"ladderBp":[19000,38000,79600,175100,408600,1021700,2773200,8319800,28287300],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-13","label":"13 mines","kind":"ladder","steps":[{"table":"mines-12-13.tsv"},{"table":"mines-11-13.tsv"},{"table":"mines-10-13.tsv"},{"table":"mines-9-13.tsv"},{"table":"mines-8-13.tsv"},{"table":"mines-7-13.tsv"},{"table":"mines-6-13.tsv"},{"table":"mines-5-13.tsv"},{"table":"mines-4-13.tsv"}],"cashout":true,"ladderBp":[20600,45000,103500,253000,664100,1897500,6008700,21631500,91933800],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-14","label":"14 mines","kind":"ladder","steps":[{"table":"mines-11-14.tsv"},{"table":"mines-10-14.tsv"},{"table":"mines-9-14.tsv"},{"table":"mines-8-14.tsv"},{"table":"mines-7-14.tsv"},{"table":"mines-6-14.tsv"},{"table":"mines-5-14.tsv"},{"table":"mines-4-14.tsv"}],"cashout":true,"ladderBp":[22500,54000,138000,379500,1138500,3795000,14421000,64894500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-15","label":"15 mines","kind":"ladder","steps":[{"table":"mines-10-15.tsv"},{"table":"mines-9-15.tsv"},{"table":"mines-8-15.tsv"},{"table":"mines-7-15.tsv"},{"table":"mines-6-15.tsv"},{"table":"mines-5-15.tsv"},{"table":"mines-4-15.tsv"}],"cashout":true,"ladderBp":[24700,66000,189700,596300,2087200,8349000,39657700],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-16","label":"16 mines","kind":"ladder","steps":[{"table":"mines-9-16.tsv"},{"table":"mines-8-16.tsv"},{"table":"mines-7-16.tsv"},{"table":"mines-6-16.tsv"},{"table":"mines-5-16.tsv"},{"table":"mines-4-16.tsv"}],"cashout":true,"ladderBp":[27500,82500,271000,993900,4174500,20872500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-17","label":"17 mines","kind":"ladder","steps":[{"table":"mines-8-17.tsv"},{"table":"mines-7-17.tsv"},{"table":"mines-6-17.tsv"},{"table":"mines-5-17.tsv"},{"table":"mines-4-17.tsv"},{"table":"mines-3-17.tsv"}],"cashout":true,"ladderBp":[30900,106000,406600,1789000,9392600,62617500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-18","label":"18 mines","kind":"ladder","steps":[{"table":"mines-7-18.tsv"},{"table":"mines-6-18.tsv"},{"table":"mines-5-18.tsv"},{"table":"mines-4-18.tsv"},{"table":"mines-3-18.tsv"}],"cashout":true,"ladderBp":[35300,141400,650500,3578100,25047000],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-19","label":"19 mines","kind":"ladder","steps":[{"table":"mines-6-19.tsv"},{"table":"mines-5-19.tsv"},{"table":"mines-4-19.tsv"},{"table":"mines-3-19.tsv"},{"table":"mines-2-19.tsv"}],"cashout":true,"ladderBp":[41200,198000,1138500,8349000,87664500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-20","label":"20 mines","kind":"ladder","steps":[{"table":"mines-5-20.tsv"},{"table":"mines-4-20.tsv"},{"table":"mines-3-20.tsv"},{"table":"mines-2-20.tsv"}],"cashout":true,"ladderBp":[49500,297000,2277000,25047000],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-21","label":"21 mines","kind":"ladder","steps":[{"table":"mines-4-21.tsv"},{"table":"mines-3-21.tsv"},{"table":"mines-2-21.tsv"}],"cashout":true,"ladderBp":[61800,495000,5692500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-22","label":"22 mines","kind":"ladder","steps":[{"table":"mines-3-22.tsv"},{"table":"mines-2-22.tsv"},{"table":"mines-1-22.tsv"}],"cashout":true,"ladderBp":[82500,990000,22770000],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-23","label":"23 mines","kind":"ladder","steps":[{"table":"mines-2-23.tsv"},{"table":"mines-1-23.tsv"}],"cashout":true,"ladderBp":[123700,2970000],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]},{"id":"mines-24","label":"24 mines","kind":"ladder","steps":[{"table":"mines-1-24.tsv"}],"cashout":true,"ladderBp":[247500],"bets":[{"id":"play","label":"Play","survive":[[0,0]]}]}]}
|