SPB Git forge

spb/spinza

Public
8commits 1branches 0releases
1.6 MBsize
maindefault branch
16 days agolast push
TypeScript 97.6% SQL 1.4% JavaScript 0.5%
4.0 KB · 184 lines typescript
Raw Blame History
1import type { GameLifecycle, TransactionType, WinClassId } from "./constants";23export type Volatility = "low" | "medium" | "high" | "extreme";45export interface PublicUser {6  id: string;7  username: string;8  level: number;9  xp: number;10  xpIntoLevel: number;11  xpForNext: number;12  createdAt: string;13  lastLoginAt: string | null;14  isNew?: boolean;15}1617export interface WalletView {18  balance: number;19  lifetimeWagered: number;20  lifetimeWon: number;21  updatedAt: string;22}2324export interface UserSettings {25  soundEnabled: boolean;26  musicVolume: number;27  effectsVolume: number;28  masterVolume: number;29  reduceMotion: boolean;30  animationIntensity: "low" | "medium" | "high";31  sessionReminderMinutes: number;32  breakReminder: boolean;33  leaderboardOptIn: boolean;34}3536export interface GameCard {37  slug: string;38  name: string;39  tagline: string;40  theme: string;41  volatility: Volatility;42  version: string;43  grid: { reels: number; rows: number };44  minBet: number;45  maxBet: number;46  maxMultiplier: number;47  features: string[];48  tags: string[];49  palette: { primary: string; secondary: string; glow: string; bg: string; surface?: string };50  /** Renderer presentation hints (frame, backdrop, particles, ambience). */51  presentation?: { frame: string; backdrop: string; particles: string; ambience: string };52  lifecycle: GameLifecycle;53  kind: "slot" | "crash" | "arcade";54  category: "slots" | "risk" | "originals";55  isNew: boolean;56  isFeatured: boolean;57  isJackpot: boolean;58  popularity: number;59  favorite?: boolean;60  lastPlayedAt?: string | null;61}6263export interface GameInfo extends GameCard {64  rtp: number;65  hitFrequency: number | null;66  description: string;67  rules: string[];68  paytable: { symbol: string; label: string; pays: Record<string, number> }[];69  certification: CertificationSummary | null;70}7172export interface CertificationSummary {73  spins: number;74  configuredRtp: number;75  observedRtp: number;76  deviation: number;77  hitRate: number;78  bonusRate: number;79  maxWinMultiplier: number;80  status: "PASS" | "FAIL";81  certifiedAt: string;82  version: string;83}8485export interface SpinResponse {86  roundId: string;87  game: string;88  version: string;89  bet: number;90  win: number;91  multiplier: number;92  winClass: WinClassId;93  balance: number;94  xp: { gained: number; total: number; level: number; leveledUp: boolean; levelReward: number };95  result: unknown;96  unlocked: { achievements: string[]; missions: string[] };97  replayed?: boolean;98}99100export interface LedgerEntry {101  id: string;102  type: TransactionType;103  amount: number;104  balanceAfter: number;105  reference: string | null;106  createdAt: string;107}108109export interface RoundHistoryEntry {110  roundId: string;111  game: string;112  gameName: string;113  bet: number;114  win: number;115  multiplier: number;116  balanceAfter: number;117  createdAt: string;118}119120export interface DailyRewardStatus {121  available: boolean;122  streakDay: number;123  nextAmount: number;124  nextAvailableAt: string | null;125  schedule: readonly number[];126  claimedToday: boolean;127}128129export interface RescueStatus {130  eligible: boolean;131  amount: number;132  balance: number;133  nextAvailableAt: string | null;134}135136export interface AchievementView {137  key: string;138  name: string;139  description: string;140  rewardCredits: number;141  rewardXp: number;142  icon: string;143  unlockedAt: string | null;144  progress: number;145  target: number;146}147148export interface MissionView {149  key: string;150  name: string;151  description: string;152  period: "daily" | "weekly";153  target: number;154  progress: number;155  rewardCredits: number;156  rewardXp: number;157  completedAt: string | null;158  claimedAt: string | null;159  expiresAt: string;160}161162export interface LeaderboardEntry {163  rank: number;164  username: string;165  level: number;166  value: number;167  game?: string | null;168  isYou?: boolean;169}170171export interface LeaderboardView {172  category: string;173  label: string;174  entries: LeaderboardEntry[];175  you: LeaderboardEntry | null;176  updatedAt: string;177}178179export interface ApiError {180  error: string;181  message: string;182  details?: unknown;183}184