A single-shot payout function. The field is the 0–10000 draw; zone widths are the probabilities; inside a zone the payout ramps from a − r to a + r. Payouts and RTP in, a monotone payout(u) out, exact by summation.
Loading ALGORITHM.md…
The engine is published as an ES module that implements the RGS provider contract and rolls locally with crypto.getRandomValues: open, valid-bets, bet, collect, with the observed balance semantics (bet debits the stake, collect credits the win, integer minor units). No server, every round live, and any round replays from its seed. Bet types: BASE.
import { createGame } from 'https://danvid1009.github.io/gnarone-game-math/single-shot/api/rgs.js';
const g = createGame({ preset: 'classic' }); // presets: classic, steady, spiky, always-pays, ragency
// bet types: BASE
const s = g.open(); // session, balance 100000, chipLevels [100,200,500,1000,2500,5000,10000]
const r = g.bet({ sessionId: s.sessionId, betAmount: 1000, betType: 'BASE' }); // fresh crypto seed; win in r.totalWinAmount
g.collect({ roundId: r.roundId }); // credits the win → { balance }
// Replay any fixture: same seed, same code path, same answer as rounds/007.json
g.bet({ sessionId: s.sessionId, betAmount: 1000, betType: 'BASE', seed: 'fixture-007' });
Presets: classic, steady, spiky, always-pays, ragency (default classic). Each preset is a frozen configuration and its own folder: the config, derived tables and settlement rule in field.json, plus one hundred pre-drawn rounds from seeds fixture-000 … fixture-099 settled for every bet type. The same seed drives every preset, so round 007 uses the same u everywhere, and the live module reproduces any of them when given the seed.
# presets, their parameters, bet types and realised RTP over the 100 rounds
curl -s https://danvid1009.github.io/gnarone-game-math/single-shot/api/index.json
# one preset: parameters, tables (bands / odds / ladder / decks), RN intervals, how to settle
curl -s https://danvid1009.github.io/gnarone-game-math/single-shot/api/classic/field.json
# one round (000–099): seed, full outcome, settlement for every bet type
curl -s https://danvid1009.github.io/gnarone-game-math/single-shot/api/classic/rounds/007.json
# all 100 rounds of a preset (stake and win per bet type)
curl -s https://danvid1009.github.io/gnarone-game-math/single-shot/api/classic/rounds.json
# round 007 played through the real calls: request bodies and every response
curl -s https://danvid1009.github.io/gnarone-game-math/single-shot/api/classic/sample-request.json
curl -s https://danvid1009.github.io/gnarone-game-math/single-shot/api/classic/sample-response.json
Settlement rule is spelled out in each preset's field.json under how_to_settle.

![Inside every band the paid multiple is exactly uniform on [a − r, a + r].](img/bands.png)
git clone https://github.com/Danvid1009/gnarone-game-math.git
cd gnarone-game-math/payout-engine
npm test
node bin/build-payout.js --payouts 0,0.5,1,2,5,20 --rtp 0.95 --js