diff options
Diffstat (limited to '')
| -rw-r--r-- | src/client/core.rs | 102 |
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 | }; |
| 9 | use crate::crash::{multiplier_at, CrashState}; | 9 | use crate::crash::{multiplier_at, CrashState}; |
| 10 | use crate::roulette::{Bets, NumberBet}; | 10 | use crate::client::games::roulette::Direction; |
| 11 | use crate::roulette::Bets; | ||
| 11 | use std::time::{Duration, Instant}; | 12 | use 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)] | ||
| 80 | enum RouletteSide { | ||
| 81 | Red, | ||
| 82 | Black, | ||
| 83 | Even, | ||
| 84 | Odd, | ||
| 85 | } | ||
| 86 | |||
| 87 | pub struct ClientCore { | 82 | pub 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 |
