Ways to win (243 / 1024 / 4096)

TL;DR

Альтернатива paylines: вместо фиксированных линий выигрыш считается за N подряд reels с одинаковыми символами в любых row-позициях. Число «ways» для конкретного символа = произведение counts на каждом reel-е, до num_rows ^ num_columns максимум. Популярная замена paylines — больше частоты выигрышей, проще для игрока «понять».

Как работает

Конфиг

То же paytable = {(kind, sym): payout} как в paylines, но kind означает число reels подряд слева, а не позиций на линии.

paylines не нужен — ways не зависит от row-позиций.

Алгоритм evaluate

для каждого base_sym из paytable:
  count_per_reel = []
  for reel in 0..num_reels:
    n = число вхождений (base_sym или wild) на этом reel
    if n == 0: break
    count_per_reel.append(n)
  kind = len(count_per_reel)  # число reels подряд слева
  if kind < min_kind или (kind, base_sym) не в paytable: continue
  base_payout = paytable[(kind, base_sym)]
  ways = product(count_per_reel)
  multiplier = product(wild_multipliers активных wild-ов на этих reels)
  win = base_payout * ways * multiplier

Возвращает winData с meta.ways (от 1 до num_rows ^ num_columns).

Total ways

Максимум для 5×3 поля: 3⁵ = 243. Отсюда «243 ways» (Microgaming брэндинг с 2009 года).

ПолеTotal ways
5×3243
5×41024
6×44096
Megaways (динамический row)до 117 649

Мат-эффект

  • Hit frequency выше, чем у 20-paylines games — много больше «зачтённых» выигрышей, но на меньшие суммы.
  • Volatility обычно ниже при том же RTP. Часто комбинируют с tumbling и multiplier-механиками для добавления volatility.
  • Combinatorics: state space тот же, что paylines (reelstrip_len ^ num_reels), но evaluate-функция сложнее — нужно посчитать counts per reel.

Multiplier — мультипликативный

В отличие от lines, на ways multiplier на wild умножается, не складывается:

ways(H1) = (count_R1) × (count_R2) × (count_R3) × (count_R4) × (count_R5)

Если на R3 есть Wild с multiplier=3, то общий multiplier ways становится 3× (или 6× если два таких wild и они тоже множатся между собой). Это очень быстро надувает win:

L5 H1 L4 L4 L4
L1 H4 L3 H2 L4
H1 H1 H1 L3 H3

Для H1: (2) × (2) × (1) × (0) × (0) = 0 ways. Прерываемся на R4.

Для L3: (0) × (1) × (1) × (1) × (1) = 0 ways на R1.

Если на R3 есть W×3 и на R4 W×2 → ways множится на 3 × 2 = 6.

Wild на reel 1

Конвенция: wild не появляется на первом reel. Иначе ways для всех paying symbols взлетают (wild считается ко всем), что ломает балансировку.

Stake math-sdk в WaysWins это не учитывает явно — должно быть запрещено в reelstrip-е (BR0/FR0 не содержат W в первом столбце). Тестим property: for all sims: count("W", reel=0) === 0.

Варианты и подвиды

  • 243 ways (5×3) — стандарт.
  • 1024 ways (5×4) — больше hit frequency.
  • 4096 ways (6×4) — премиум.
  • Megaways (динамические row 2..7 на reel) — до 117K ways. Лицензировано BTG; остальные провайдеры платят royalty.
  • Both-ways pays — счёт ways слева и справа.
  • Adjacent ways vs all-ways — стандарт adjacent (только подряд reels слева).

Реализационные заметки

Бэк (TS)

function evaluateWays(
  board: SymbolName[][],
  paytable: Map<string, number>,
  wildSyms: SymbolName[],
  payingSyms: SymbolName[],
): WinData {
  const wins: WinDetail[] = [];
  for (const sym of payingSyms) {
    const counts: number[] = [];
    const wildMults: number[] = [];
    for (let reel = 0; reel < board.length; reel++) {
      const n = board[reel].filter(s => s === sym || wildSyms.includes(s)).length;
      if (n === 0) break;
      counts.push(n);
      const wildOnReel = collectWildMults(board[reel], wildSyms);
      if (wildOnReel.length) wildMults.push(...wildOnReel);
    }
    const kind = counts.length;
    if (kind < MIN_KIND) continue;
    const key = `${kind}:${sym}`;
    const basePay = paytable.get(key);
    if (!basePay) continue;
    const ways = counts.reduce((a, b) => a * b, 1);
    const wildMult = wildMults.reduce((a, b) => a * b, 1);
    wins.push({symbol: sym, kind, win: basePay * ways * wildMult, ...});
  }
  return {totalWin: sum(wins, w => w.win), wins};
}

Edge cases

  • Wild на reel 1 → property-test ловит.
  • Все символы wild → kind = num_reels для каждого paying sym; берём max payout.
  • Multiplier overflow для big-win-cap → проверка runningBetWin >= maxWin после каждого win.

Фронт

Эмитится winInfo с meta.ways числом ways. Фронт обычно показывает «X ways» текстом + highlight всех позиций символа на «победивших» reels (в отличие от lines, где highlight только конкретной линии).

Compliance / cert

  • Help / paytable должен раскрывать формулу payout × ways × multiplier.
  • Wild-on-reel-1 запрет должен быть документирован, если оно так в нашей игре.
  • LDW особенно частый на ways — много low-payout ways за раунд. Disclosures как для paylines.

Примеры реализаций

  • Microgaming Thunderstruck 2 (243 ways).
  • Microgaming Mega Moolah (243 ways + jackpot).
  • NetEnt Gonzo’s Quest (in some versions ways, in others lines).

Связанные