Skip to content

Rules and slot presentation

The frontend explains the game and displays server outcomes. It must not calculate a replacement outcome or infer unpublished odds.

Rules supplied to the player

Make the rules accessible before play and during an idle or decision state. Show these items for the actual deployed configuration:

  • Game objective, controls, and the meaning of each symbol.
  • Stake unit, available stakes, and total cost of an action.
  • Pay direction, paylines, ways, clusters, scatter pays, and wild behavior.
  • Conditions for each bonus, retrigger, random entry, and player choice.
  • Freeplay terms, fixed ticket stake, and distinctions from awarded feature spins.
  • Purchase price, feature RTP, and maximum possible win where applicable.
  • Gamble rules, odds, collection, protected money, and end conditions.
  • Return-to-player (RTP), maximum win, payout caps, and required win odds.
  • What happens after disconnection, reload, inactivity, or an unfinished round.
  • Operator history, exit, and responsible-gambling controls.

Use the certified rules and deployed configuration as the source. A slot-shaped graphic does not define a legal product classification. UK rules must explain the game and likelihood of winning before commitment. UKGC RTS 3.

Slot configuration from the creator

The creator's browser exporter supplies this presentation structure through loadConfig:

FieldShape and use
grid{ base: { rows, columns }, [feature]: { rows, columns } }. Select dimensions for the current feature.
symbols{ base: [...], [feature]: [...] }. Entries contain names and appearance information such as reels, spacing, and stacks.
winlines{ base: number[][], [feature]: number[][] }. Each line contains a row index for each reel.
awards{ base: [...], [feature]: [...] }. Each award contains a trigger and results.
featuresNames of configured slot features. These are not all purchasable.
featureConfigsFeature-specific settings, including wheel and Hold and Win configuration. Common fields listed above are separated out.
symbolMap, scenarioSchemaScenario compression metadata. Pass the complete config to placeBet.
buyFeaturesRuntime purchase options. Use the returned id, price, initial spins, and RTP.

For each map, read the current feature key when present. Otherwise use base. Resolve win.winlineIndex against that effective feature's winlines.

An award trigger contains symbol names, count, mode, and optional maximum count, adjacency, wild-scatter, or override behavior. Results can be one result or weighted alternatives. Do not present a variable award as a guaranteed fixed payment.

The CLI slot export can contain only symbolMap in its presentation configuration. Imported games can have custom data. Validate required presentation fields at load. Supply a versioned rules and asset manifest when the archive lacks them.

Symbol names are not texture URLs. Maintain an explicit name-to-asset map. Include assets for every feature and transformed symbol. Do not replace an unknown winning symbol with another symbol.

RTP and maximum wins

Show config.rtp as a percentage. Use showExactRTP for supplied precision. Use buyFeatures[].featureRTP for each purchase. Do not substitute the base RTP for every purchase.

Display maxWin and maxPayout in the units required by the rules. Convert with the base stake for currency displays. Apply calculatedMaxExposure or the configured exposure cap where appropriate.

Some configurations omit these figures. Absence does not mean zero. Blackjack, Crash, and Bingo do not have the same entry-derived metrics as slots.

Current maxPayoutOdds duplicates maxWinOdds. It does not independently describe an accumulated maximum payout. maxWinOdds can also be absent when the top prize exists only in a buy pool. Obtain approved odds before enabling a market that requires a missing or unreliable figure. Do not fabricate it.

Render a slot result

Use the SDK IResult type for the slot scenario. Validate unknown data before rendering. Read the full field guide.

MechanicResult fieldsRendering requirement
Fixed or variable reelsboard, reelRowsRead board[column][row]. Allow different row counts per reel.
Lines, ways, scatter, cluster, unconditional winswins, positions, mode, winlineIndexHighlight the returned positions and effective payline.
Overrides and multipayoverrideWins, multipayCount, multipayResultsShow the breakdown without adding it again to the reported win.
Expanding wilds, substitutions, duplicationboardStates, symbolSubstitutions, duplicatingSymbolDataAnimate recorded transformations. Finish on the returned board.
Cascades or tumblescascadeData.steps, inputBoard, cascadeMultiplierAnimate every supplied step inside this response. Do not request a bet for each array entry.
Sticky and changing sticky symbolsstuckSymbols, boardStatesReplace state from the latest result. Do not retain symbols after the feature resets.
Book expansionbookSpinChosenSymbol, bookSpinWinShow the chosen symbol and the recorded expansion.
Static, random, and event multipliersfeatureMultiplier, eventMultiplier, spinMultiplierTotalDisplay applied values. They already affect the outcome.
Multiplier collectionmultiplierCollectionData, collectedSpinMultiplierDataDistinguish accumulated and applied values.
Collectors and levelscollectorTargetData, wins[].collectedSymbols, collectorLevelDataDisplay assigned values and returned level progress.
Hold and WinholdAndWinDataRestore coin values, symbols, lives, locks, pending modifiers, boosters, and collector sweeps.
WheelwheelWins[].selectedSegment, featureAwardLand on the returned segment. Process awarded feature state.
Random feature entryrandomFeatureEntryShow the transition described by the result.
Freespins and respinsspinInfo, featureName, nextFeature, featureRoundIdSupport both scenario and engine carriers. Remaining spins equal count - used.
Player choicesengineData.playerChoiceRender cash and feature options. Preserve original indexes.
Persistent progressionengineData.progressionCounters, progressionEventsReplace values. Animate deltas once. Respect stakeSpecific.
Within-round jackpotssingleGameRoundProgressionDataUse the scenario state. Reset at the next round, not the next response.
Card and ladder gamblesscenario.suit, scenario.rank, engineData.ladderStateSwitch to the gamble renderer. A card result has no slot board.

Avoid double counting

The server's totalWin determines the outcome. Slot winAmount and component wins explain its presentation. They do not authorize additional credits.

Consolidated rounds deliver one stored scenario step per placeBet. Intermediate steps can return totalWin: 0. Show their local animation amounts without treating zero as a loss or final settlement.

A cascade's nested steps differ from separate scenario continuations. Render the nested array locally. Then inspect engineData for the next permitted request.

Feature state

Prefer scenario spinInfo, featureName, and nextFeature when present. Otherwise use the engine equivalents. The unified accessor covers both forms.

count is the total awarded. used is the amount consumed. Retriggers increase count. Re-entry into the same feature can change featureRoundId. Do not reset every counter because one feature starts again.

A full meter does not promise a pending win unless the result specifies one. Do not add progression awards to totalWin a second time.

Complete the presentation

Await board animation, local cascade steps, mandatory messages, feature transitions, and the required result display. Keep controls locked during these steps.

A low return still needs a readable result. Suppress celebratory effects when required; do not suppress the amount or imply that the stake returned in full.

Use performanceMode to simplify effects on weak devices. Preserve board order, selected outcomes, amounts, and timing. A reduced-animation mode must remain a complete explanation of the result.