From 63c2e2fc3ea299aee31b66d2bdd6ecd871df223a Mon Sep 17 00:00:00 2001 From: salmonik Date: Wed, 28 Oct 2026 22:44:41 +0100 Subject: v0.3.0: add server core, bcrypt migration and plays audit --- src/server/games/registry.rs | 22 +++++++--------------- src/server/games/session.rs | 8 ++++++++ src/server/games/slots.rs | 23 ++++++++++++++++++++--- 3 files changed, 35 insertions(+), 18 deletions(-) (limited to 'src/server/games') diff --git a/src/server/games/registry.rs b/src/server/games/registry.rs index 3b8c391..b7ed9d3 100644 --- a/src/server/games/registry.rs +++ b/src/server/games/registry.rs @@ -1,5 +1,6 @@ #![allow(dead_code)] +use super::slots::SlotsGame; use super::traits::Game; use std::collections::HashMap; use std::sync::{Arc, Mutex}; @@ -17,6 +18,12 @@ impl GameRegistry { } } + pub fn with_defaults() -> Self { + let registry = Self::new(); + registry.register_game(SlotsGame::new()); + registry + } + pub fn register_game(&self, game: G) { let game_type = game.game_type().to_string(); let mut games = self.games.lock().unwrap(); @@ -38,18 +45,3 @@ impl GameRegistry { games.contains_key(game_type) } } - -// Global registry instance -use super::slots::SlotsGame; -use once_cell::sync::Lazy; - -static GAME_REGISTRY: Lazy = Lazy::new(|| { - let registry = GameRegistry::new(); - // Register games here - registry.register_game(SlotsGame::new()); - registry -}); - -pub fn get_game_registry() -> &'static GameRegistry { - &GAME_REGISTRY -} diff --git a/src/server/games/session.rs b/src/server/games/session.rs index 97ceaf3..a8410a9 100644 --- a/src/server/games/session.rs +++ b/src/server/games/session.rs @@ -74,4 +74,12 @@ impl SessionManager { .cloned() .collect() } + + pub fn len(&self) -> usize { + self.sessions.lock().unwrap().len() + } + + pub fn is_empty(&self) -> bool { + self.len() == 0 + } } diff --git a/src/server/games/slots.rs b/src/server/games/slots.rs index 0a9797d..02595b1 100644 --- a/src/server/games/slots.rs +++ b/src/server/games/slots.rs @@ -5,6 +5,8 @@ use std::collections::HashMap; pub struct SlotsGame { symbols: Vec, payouts: HashMap, + /// Deterministic reels for tests and demos. + fixed_reels: Option>, } impl SlotsGame { @@ -27,10 +29,25 @@ impl SlotsGame { payouts.insert("DD".to_string(), 2); payouts.insert("SS".to_string(), 3); - Self { symbols, payouts } + Self { + symbols, + payouts, + fixed_reels: None, + } + } + + /// Build a slots game that always spins the given three symbols. + pub fn with_reels(reels: &str) -> Self { + let mut game = Self::new(); + game.fixed_reels = Some(reels.chars().take(3).collect()); + game } fn spin_reels(&self) -> Vec { + if let Some(reels) = &self.fixed_reels { + return reels.clone(); + } + let mut rng = rand::thread_rng(); (0..3) .map(|_| self.symbols[rng.gen_range(0..self.symbols.len())]) @@ -41,7 +58,7 @@ impl SlotsGame { let reel_string: String = reels.iter().collect(); if let Some(&multiplier) = self.payouts.get(&reel_string) { - return bet * multiplier; + return bet.saturating_mul(multiplier); } // Check all three pairs including non-adjacent (e.g. [C,D,C]) @@ -51,7 +68,7 @@ impl SlotsGame { if reels[a] == reels[b] { let two_of_kind = format!("{}{}", reels[a], reels[a]); if let Some(&multiplier) = self.payouts.get(&two_of_kind) { - best = best.max(bet * multiplier); + best = best.max(bet.saturating_mul(multiplier)); } } } -- cgit v1.2.3