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()