LIVE FIGHT

Two fighters, a biased damage walk, a health bar each. Each tick one of them lands a hit (probability from the power gap) for a continuous amount of damage; first to zero loses, and if both stand at the bell a biased coin decides on the health share. The win probability at every state is exact by backward induction on the health grid, so the opening bet is priced at RTP ÷ P and every live bet during the fight is a fair bet at 1 ÷ P.

exact win-probability gridopening bet at RTP, live bets fairlinked bets on a running round
open full screen ↗

The math

Loading ALGORITHM.md…

Live API (browser module)

The engine is published as an ES module that implements the RGS provider contract and rolls locally with crypto.getRandomValues: open, valid-bets, bet, next-action, 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: A, B.

import { createGame } from 'https://danvid1009.github.io/gnarone-game-math/fight/api/rgs.js';

const g = createGame({ preset: 'even' });                    // presets: even, favourite, glass-cannon, slugfest
                                                       // bet types: A, B
const s = g.open();                                    // session, balance 100000, chipLevels [100,200,500,1000,2500,5000,10000]
let r = g.bet({ sessionId: s.sessionId, betAmount: 1000, betType: 'B' });   // fresh crypto seed → nextAction ['CONTINUE']
r = g.nextAction({ roundId: r.roundId, actionCode: 'CONTINUE' });          // step: ['CONTINUE','CASH_OUT'] or the round ends
r = g.nextAction({ roundId: r.roundId, actionCode: 'CASH_OUT' });          // → totalWinAmount, nextAction ['COLLECT']
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: 'B', seed: 'fixture-007' });

Presets and static fixtures

Presets: even, favourite, glass-cannon, slugfest (default even). 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/fight/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/fight/api/even/field.json

# one round (000–099): seed, full outcome, settlement for every bet type
curl -s https://danvid1009.github.io/gnarone-game-math/fight/api/even/rounds/007.json

# all 100 rounds of a preset (stake and win per bet type)
curl -s https://danvid1009.github.io/gnarone-game-math/fight/api/even/rounds.json

# round 007 played through the real calls: request bodies and every response
curl -s https://danvid1009.github.io/gnarone-game-math/fight/api/even/sample-request.json
curl -s https://danvid1009.github.io/gnarone-game-math/fight/api/even/sample-response.json

Settlement rule is spelled out in each preset's field.json under how_to_settle.

Figures

P(A wins) at the bell against the power gap and the HP gap: the single rating that folds both together.
P(A wins) at the bell against the power gap and the HP gap: the single rating that folds both together.
Three fights from three seeds: healths tick by tick and the live price of A along the way.
Three fights from three seeds: healths tick by tick and the live price of A along the way.
Exact grid against 100,000 simulated fights per preset, and the return of live bets placed at a fixed tick.
Exact grid against 100,000 simulated fights per preset, and the return of live bets placed at a fixed tick.

Build it yourself

git clone https://github.com/Danvid1009/gnarone-game-math.git
cd gnarone-game-math/fight-engine
npm test
node bin/build-fight.js --a 1700,100 --b 1550,100