Slot Engine is in Beta - Expect bugs!
Slot EngineSlot Engine
Configuration Options

Reel Sets

How to define your reel sets


Introduction

A reel set is a list of reel strips, where each reel strip defines the symbols that can land on the board for that specific reel.

Having a well-designed and balanced reel set is crucial for achieving the desired gameplay experience and feel of your slot game. For example, the last reel could hold less valuable symbols to make it even more exciting if you do hit a full line.

Designing a balanced reel set can be hard without mathematical background knowledge and is usually done by professional mathematicians.

Automatic Generation of Reel Sets

Slot Engine simplifies reel set creation by providing a GeneratedReelSet class that builds a CSV file containing a reel set. Developers simply need to define weights for the symbols that should appear on the reels, and the generator will randomly distribute symbols according to those weights.

This is not a replacement for professional mathematicians and should be considered a starting point. You will need to playtest your game to evaluate the gameplay experience and adjust your reel generator configuration accordingly or edit the generated reels manually.

Add one or more reel sets to your game mode configuration. Each game mode must specify at least one reel set.

import { defineGameModes, GameMode, GeneratedReelSet } from "@slot-engine/core"

export const gameModes = defineGameModes({
  base: new GameMode({
    /* the rest of your configuration */
    reelSets: [
      new GeneratedReelSet({
        id: "base",
        overrideExisting: false,
        symbolWeights: {},
      }),
    ],
  }),
})

GeneratedReelSet Options

General Options

PropertyTypeDescriptionRequired
idstringThe unique identifier of the reel set / generator.yes
symbolWeightsRecord<string, number>Mapping of symbol ID's to weights.yes
overrideExistingbooleanIf true, existing reels CSV files will be overwritten.
rowsAmountnumberThe number of rows in the reelset.
Default: 250
seednumberSeed to change the RNG.

Advanced Options

All advanced options are optional.

spaceBetweenSameSymbols

number | Record<string, number>

Prevent the same symbol from appearing directly above or below itself.
This can be a single number to affect all symbols, or a mapping of symbol IDs to their respective spacing values.

Must be 1 or higher, if set.

new GeneratedReelSet({
  id: "example",
  symbolWeights: {},
  spaceBetweenSameSymbols: 4,
  // or
  spaceBetweenSameSymbols: {
    S: 5,
    W: 3,
  },
})

spaceBetweenSymbols

Record<string, Record<string, number>>

Prevents specific symbols from appearing within a certain distance of each other.

new GeneratedReelSet({
  id: "example",
  symbolWeights: {},
  spaceBetweenSymbols: {
    S: { SS: 3, W: 1 },
    // ^ Scatter is at least 3 away from super scatter and 1 away from wild
  },
})

preferStackedSymbols

number

A percentage value 0-100 that indicates the likelihood of a symbol being stacked. A value of 0 means no stacked symbols, while 100 means all symbols are stacked. This is only a preference. Symbols may still not be stacked if other restrictions (like spaceBetweenSameSymbols) prevent it.

This setting is overridden by symbolStacks.

new GeneratedReelSet({
  id: "example",
  symbolWeights: {},
  preferStackedSymbols: 50,
})

symbolStacks

Record<
  string,
  {
    chance: number | Record<string, number>
    min?: number | Record<string, number>
    max?: number | Record<string, number>
  }
>

A mapping of symbols to their respective advanced stacking configuration.

new GeneratedReelSet({
  id: "example",
  symbolWeights: {},
  symbolStacks: {
    W: {
      chance: { "1": 20, "2": 20, "3": 20, "4": 20 }, // 20% chance to be stacked on reels 2-5
      min: 2, // At least 2 wilds in a stack
      max: 4, // At most 4 wilds in a stack
    },
  },
})

limitSymbolsToReels

Record<string, number[]>

Configures symbols to only appear on specific reels.

new GeneratedReelSet({
  id: "example",
  symbolWeights: {},
  limitSymbolsToReels: {
    S: [0, 2, 4], // Scatter only on reels 1, 3, 5.
  },
})

symbolQuotas

Record<string, number | Record<string, number>>

Defines minimum symbol quotas on reels. The quota (1-100%) defines how often a symbol should appear in the reelset, or in a specific reel. This is particularly useful for controlling the frequency of special symbols like scatters or wilds.

Reels not provided for a symbol will use the weights from symbolWeights. Any small quota will ensure that the symbol appears at least once on the reel.

new GeneratedReelSet({
  id: "example",
  symbolWeights: {},
  symbolQuotas: {
    S: 3, // 3% of symbols on each reel will be scatters
    W: { "1": 10, "2": 5, "3": 3, "4": 1 }, // Wilds will appear with different quotas on selected reels
  },
})

Manual Reel Set Creation

You can define reel sets manually using the StaticReelSet class, where the reels are defined either via a JSON array or via a CSV file.

CSV File Reel Sets

For a game mode with 5 reels, the content of a CSV reel set file must have a structure like below.

L4,L5,L1,L5,L4
L2,L4,L4,L3,L3
L4,H2,W,L4,L1
L3,L3,H4,H4,H1
H1,H4,H1,L5,H2
L5,L4,L3,S,S
...

Then add your reel set to a game mode like so:

import { defineGameModes, GameMode, StaticReelSet } from "@slot-engine/core"
import path from "path"

export const gameModes = defineGameModes({
  base: new GameMode({
    /* the rest of your configuration */
    reelSets: [
      new StaticReelSet({
        id: "base",
        csvPath: path.join(__dirname, "path-to-your", "reelset.csv"),
      }),
    ],
  }),
})

JSON Reel Sets

You can also define your reel strips as a JSON array of symbol ID's like below. Note that this configuration is read from left to right, top to bottom, and not top to bottom, left to right like in CSV reels.

import { defineGameModes, GameMode, StaticReelSet } from "@slot-engine/core"

export const gameModes = defineGameModes({
  base: new GameMode({
    /* the rest of your configuration */
    reelSets: [
      new StaticReelSet({
        id: "base",
        reels: [
          ["L4", "L2", "L4", "L3", "H1", "L5"],
          ["L5", "L4", "H2", "L3", "H4", "L4"],
          ["L1", "L4", "W", "H4", "H1", "L3"],
          ["L5", "L3", "L4", "H4", "L5", "S"],
          ["L4", "L3", "L1", "H1", "H2", "S"],
        ]
      }),
    ],
  }),
})

Use of AI on this page: All texts were initially written by hand and many were later revised by AI for improved flow. All AI generated revisions were carefully reviewed and edited as needed.

On this page