summaryrefslogtreecommitdiffstats
path: root/src/client/core.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-10-29 22:55:49 +0100
committersalmonik <salmonik@tuta.io>2026-10-29 22:55:49 +0100
commit49df948de25d28601469e9ca993f33530989ebd0 (patch)
tree291aae0f57d0d7d12a27eb28038e43f942d6b991 /src/client/core.rs
parentv2.4.0: key stored credentials by certificate fingerprint (diff)
downloadzagan-bet-49df948de25d28601469e9ca993f33530989ebd0.tar.gz
zagan-bet-49df948de25d28601469e9ca993f33530989ebd0.zip
v3.0.0: cursor-driven roulette felt with splits and corners; drop schema migrations; require 80x24
Diffstat (limited to 'src/client/core.rs')
-rw-r--r--src/client/core.rs102
1 files changed, 24 insertions, 78 deletions
diff --git a/src/client/core.rs b/src/client/core.rs
index 06d9c42..8411d47 100644
--- a/src/client/core.rs
+++ b/src/client/core.rs
@@ -7,7 +7,8 @@ use crate::client::ui::{
7 record_history, 7 record_history,
8}; 8};
9use crate::crash::{multiplier_at, CrashState}; 9use crate::crash::{multiplier_at, CrashState};
10use crate::roulette::{Bets, NumberBet}; 10use crate::client::games::roulette::Direction;
11use crate::roulette::Bets;
11use std::time::{Duration, Instant}; 12use std::time::{Duration, Instant};
12 13
13#[derive(Debug, Clone, Copy, PartialEq, Eq)] 14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -17,6 +18,8 @@ pub enum Key {
17 Backspace, 18 Backspace,
18 Up, 19 Up,
19 Down, 20 Down,
21 Left,
22 Right,
20 Tab, 23 Tab,
21 Esc, 24 Esc,
22 CtrlC, 25 CtrlC,
@@ -76,14 +79,6 @@ enum Pending {
76 Info, 79 Info,
77} 80}
78 81
79#[derive(Debug, Clone, Copy)]
80enum RouletteSide {
81 Red,
82 Black,
83 Even,
84 Odd,
85}
86
87pub struct ClientCore { 82pub struct ClientCore {
88 input: String, 83 input: String,
89 history: Vec<String>, 84 history: Vec<String>,
@@ -171,6 +166,7 @@ impl ClientCore {
171 } 166 }
172 Key::Up => self.history_previous(), 167 Key::Up => self.history_previous(),
173 Key::Down => self.history_next(), 168 Key::Down => self.history_next(),
169 Key::Left | Key::Right => Vec::new(),
174 Key::Tab => self.complete(), 170 Key::Tab => self.complete(),
175 Key::Esc => Vec::new(), 171 Key::Esc => Vec::new(),
176 } 172 }
@@ -355,6 +351,19 @@ impl ClientCore {
355 } 351 }
356 352
357 fn handle_roulette_key(&mut self, key: Key) -> Vec<Effect> { 353 fn handle_roulette_key(&mut self, key: Key) -> Vec<Effect> {
354 let direction = match key {
355 Key::Up => Some(Direction::Up),
356 Key::Down => Some(Direction::Down),
357 Key::Left => Some(Direction::Left),
358 Key::Right => Some(Direction::Right),
359 _ => None,
360 };
361 if let Some(direction) = direction {
362 let cursor = self.game.roulette_cursor().moved(direction);
363 self.game.set_roulette_cursor(&cursor);
364 return self.board_effects();
365 }
366
358 match key { 367 match key {
359 Key::CtrlC => vec![Effect::Quit], 368 Key::CtrlC => vec![Effect::Quit],
360 Key::Char('q') => { 369 Key::Char('q') => {
@@ -364,18 +373,9 @@ impl ClientCore {
364 Effect::Print(vec!["Game exited.".to_string()]), 373 Effect::Print(vec!["Game exited.".to_string()]),
365 ] 374 ]
366 } 375 }
367 Key::Esc => {
368 self.game.set_roulette_number_input("");
369 self.board_effects()
370 }
371 Key::Char(' ') => self.spin_roulette(), 376 Key::Char(' ') => self.spin_roulette(),
372 Key::Char('r') => self.add_roulette_side(RouletteSide::Red),
373 Key::Char('b') => self.add_roulette_side(RouletteSide::Black),
374 Key::Char('e') => self.add_roulette_side(RouletteSide::Even),
375 Key::Char('o') => self.add_roulette_side(RouletteSide::Odd),
376 Key::Char('c') => { 377 Key::Char('c') => {
377 self.game.set_roulette_bets(&Bets::default()); 378 self.game.set_roulette_bets(&Bets::default());
378 self.game.set_roulette_number_input("");
379 self.game.set_roulette_status("place"); 379 self.game.set_roulette_status("place");
380 self.board_effects() 380 self.board_effects()
381 } 381 }
@@ -389,63 +389,17 @@ impl ClientCore {
389 self.game.set_roulette_chip(chip); 389 self.game.set_roulette_chip(chip);
390 self.board_effects() 390 self.board_effects()
391 } 391 }
392 Key::Char(c) if c.is_ascii_digit() => { 392 Key::Enter => self.place_roulette_chip(),
393 let mut input = self.roulette_input();
394 if input.len() < 2 {
395 input.push(c);
396 self.game.set_roulette_number_input(&input);
397 }
398 self.board_effects()
399 }
400 Key::Backspace => {
401 let mut input = self.roulette_input();
402 input.pop();
403 self.game.set_roulette_number_input(&input);
404 self.board_effects()
405 }
406 Key::Enter => {
407 let input = self.roulette_input();
408 if !input.is_empty() {
409 match input.parse::<u8>() {
410 Ok(number) if number <= 36 => {
411 self.add_roulette_number(number);
412 self.game.set_roulette_number_input("");
413 }
414 _ => {
415 self.game.set_roulette_number_input("");
416 self.game.set_error("Number must be 0-36");
417 }
418 }
419 }
420 self.board_effects()
421 }
422 _ => Vec::new(), 393 _ => Vec::new(),
423 } 394 }
424 } 395 }
425 396
426 fn add_roulette_side(&mut self, side: RouletteSide) -> Vec<Effect> { 397 fn place_roulette_chip(&mut self) -> Vec<Effect> {
427 let chip = self.game.roulette_chip(); 398 let Some(target) = self.game.roulette_cursor().target() else {
428 let mut bets = self.game.roulette_bets(); 399 return Vec::new();
429 match side { 400 };
430 RouletteSide::Red => bets.red = bets.red.saturating_add(chip),
431 RouletteSide::Black => bets.black = bets.black.saturating_add(chip),
432 RouletteSide::Even => bets.even = bets.even.saturating_add(chip),
433 RouletteSide::Odd => bets.odd = bets.odd.saturating_add(chip),
434 }
435 self.place_roulette_bets(bets)
436 }
437
438 fn add_roulette_number(&mut self, number: u8) -> Vec<Effect> {
439 let chip = self.game.roulette_chip();
440 let mut bets = self.game.roulette_bets(); 401 let mut bets = self.game.roulette_bets();
441 if let Some(existing) = bets.numbers.iter_mut().find(|bet| bet.number == number) { 402 bets.add(target, self.game.roulette_chip());
442 existing.amount = existing.amount.saturating_add(chip);
443 } else {
444 bets.numbers.push(NumberBet {
445 number,
446 amount: chip,
447 });
448 }
449 self.place_roulette_bets(bets) 403 self.place_roulette_bets(bets)
450 } 404 }
451 405
@@ -487,14 +441,6 @@ impl ClientCore {
487 effects 441 effects
488 } 442 }
489 443
490 fn roulette_input(&self) -> String {
491 self.game
492 .get_current_state()
493 .and_then(|state| state.data.get("number_input"))
494 .cloned()
495 .unwrap_or_default()
496 }
497
498 fn handle_blackjack_key(&mut self, key: Key) -> Vec<Effect> { 444 fn handle_blackjack_key(&mut self, key: Key) -> Vec<Effect> {
499 let status = self 445 let status = self
500 .game 446 .game