58 lines
1.3 KiB
Python
58 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from decimal import Decimal
|
|
from typing import Dict, List, Tuple
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Bomb:
|
|
bomb_id: str
|
|
value: int
|
|
position: int | None = None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Elimination:
|
|
symbol: str
|
|
count: int
|
|
positions: Tuple[int, ...]
|
|
payout_multiplier: Decimal
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class CascadeResult:
|
|
cascade_index: int
|
|
eliminations: Tuple[Elimination, ...]
|
|
bombs: Tuple[Bomb, ...]
|
|
base_win: Decimal
|
|
accumulated_symbols: Dict[str, int]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class SpinResult:
|
|
spin_index: int
|
|
cascades: Tuple[CascadeResult, ...]
|
|
base_win: Decimal
|
|
multiplier_before: int
|
|
bombs_added: int
|
|
multiplier_after: int
|
|
effective_multiplier: int
|
|
total_win: Decimal
|
|
accumulated_symbols: Dict[str, int]
|
|
win_capped: bool = False # 本回合赢奖因 1000x 封顶被截断
|
|
|
|
|
|
@dataclass
|
|
class SessionState:
|
|
next_spin_index: int = 1
|
|
accumulated_multiplier: int = 0
|
|
total_win: Decimal = Decimal("0")
|
|
spins: List[SpinResult] = field(default_factory=list)
|
|
|
|
def reset(self) -> None:
|
|
self.next_spin_index = 1
|
|
self.accumulated_multiplier = 0
|
|
self.total_win = Decimal("0")
|
|
self.spins.clear()
|