From 63e5b15ac97b4b41c43a566754c5cf7a1c3cf415 Mon Sep 17 00:00:00 2001 From: Oxore Date: Fri, 4 Aug 2023 00:25:08 +0300 Subject: Begin implementing main menu (WIP) --- src/main.rs | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 66044bc..0ebd6ae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -264,7 +264,35 @@ impl Default for Bag { } } +enum Parameter { + Bool(bool), + Int(i32), +} + +enum MenuAction { + Run, + Quit, +} + +enum MenuContent { + Menu(Vec), + Action(MenuAction), + Parameter(Parameter), +} + +struct Menu { + name: &'static str, + content: MenuContent, +} + +enum GameState { + Menu, + InGame, +} + struct Game { + state: GameState, + menu: Vec, field: Field, figure: Figure, x: isize, @@ -279,6 +307,16 @@ struct Game { impl Default for Game { #[inline] fn default() -> Self { + let menu = vec![ + Menu{ + name: "Play", + content: MenuContent::Action(MenuAction::Run), + }, + Menu{ + name: "Quit", + content: MenuContent::Action(MenuAction::Quit), + }, + ]; let mut bag = Bag::default(); let figure_on_hold = Figure::from_kind(bag.next()); let figure = Figure::from_kind(bag.next()); @@ -289,6 +327,8 @@ impl Default for Game { Figure::from_kind(bag.next()), ]; Self { + state: GameState::Menu, + menu, field: Field::default(), figure, x: 3, @@ -318,6 +358,7 @@ impl Game { } self.stop_place_timeout(); } + fn hold_figure(&mut self) { (self.figure_on_hold, self.figure) = ( Figure::from_kind(self.figure.kind.clone()), @@ -325,22 +366,27 @@ impl Game { ); (self.x, self.y) = (3, 17); } + fn reset_fall_timeout(&mut self) { self.fall_timeout = Timeout::from_duration(std::time::Duration::from_millis(500)); } + fn start_place_timeout(&mut self) { self.place_timeout = Some(Timeout::from_duration(std::time::Duration::from_millis( 500, ))); } + fn stop_place_timeout(&mut self) { self.place_timeout = None } + fn reset_place_timeout(&mut self) { if self.place_timeout.is_some() { self.start_place_timeout(); } } + fn handle_input(&mut self, c: char) -> Option { match c { 'q' => return Some(StepResult::Quit), @@ -386,6 +432,7 @@ impl Game { self.reset_place_timeout(); Some(StepResult::StateChanged) } + fn advance_figure(&mut self) { if self.field.has_collision(&self.figure, self.x, self.y - 1) { self.place_figure(); @@ -399,7 +446,8 @@ impl Game { } self.reset_fall_timeout(); } - fn step(&mut self, c_optional: Option) -> Option { + + fn step_game(&mut self, c_optional: Option) -> Option { let handle_input_result = if let Some(c) = c_optional { self.handle_input(c) } else { @@ -424,6 +472,19 @@ impl Game { handle_input_result } } + + fn step_menu(&mut self, c_optional: Option) -> Option { + // TODO + self.state = GameState::InGame; + None + } + + fn step(&mut self, c_optional: Option) -> Option { + match self.state { + GameState::Menu => self.step_menu(c_optional), + GameState::InGame => self.step_game(c_optional), + } + } } struct Tui { @@ -492,7 +553,7 @@ impl Tui { print!("|"); } - fn display_game(&self, game: &Game) { + fn display_game_ingame(&self, game: &Game) { self.cursor_to_home(); let mut field = game.field.clone(); let mut ghost = game.figure.clone(); @@ -519,6 +580,17 @@ impl Tui { } } + fn display_game_menu(&self, game: &Game) { + // TODO + } + + fn display_game(&self, game: &Game) { + match game.state { + GameState::Menu => self.display_game_menu(game), + GameState::InGame => self.display_game_ingame(game), + } + } + fn clear_screen(&self) { print!("\x1B[2J"); } @@ -560,6 +632,7 @@ impl Default for Tui { impl Drop for Tui { fn drop(&mut self) { self.show_cursor(); + self.cursor_to_home(); termios::tcsetattr(0, termios::TCSADRAIN, &self.state).unwrap(); } } -- cgit v1.2.3