use ::rltk::{Rltk, VirtualKeyCode}; use crate::rex_assets::RexAssets; use crate::{colors, RunState, State}; #[derive(PartialEq, Copy, Clone)] pub enum MainMenuSelection { NewGame, LoadGame, Quit, } #[derive(PartialEq, Copy, Clone)] pub enum MainMenuResult { NoSelection { selected: MainMenuSelection }, Selected { selected: MainMenuSelection }, } pub fn main_menu(gs: &mut State, ctx: &mut Rltk) -> MainMenuResult { let save_exists = crate::saveload_system::does_save_exist(); let runstate = gs.ecs.fetch::(); let assets = gs.ecs.fetch::(); ctx.render_xp_sprite(&assets.menu, 0, 0); ctx.draw_box_double(24, 18, 31, 10, colors::WHEAT, colors::BLACK); ctx.print_color_centered(20, colors::YELLOW, colors::BLACK, "Rust Roguelike"); ctx.print_color_centered(21, colors::CYAN, colors::BLACK, "by Timothy J. Warren"); ctx.print_color_centered( 22, colors::GRAY, colors::BLACK, "Use Up/Down Arrows and Enter", ); let mut y = 24; if let RunState::MainMenu { menu_selection: selection, } = *runstate { if selection == MainMenuSelection::NewGame { ctx.print_color_centered(y, colors::MAGENTA, colors::BLACK, "Begin New Game"); } else { ctx.print_color_centered(y, colors::WHITE, colors::BLACK, "Begin New Game"); } y += 1; if save_exists { if selection == MainMenuSelection::LoadGame { ctx.print_color_centered(y, colors::MAGENTA, colors::BLACK, "Load Game"); } else { ctx.print_color_centered(y, colors::WHITE, colors::BLACK, "Load Game"); } y += 1; } if selection == MainMenuSelection::Quit { ctx.print_color_centered(y, colors::MAGENTA, colors::BLACK, "Quit"); } else { ctx.print_color_centered(y, colors::WHITE, colors::BLACK, "Quit"); } return match ctx.key { None => MainMenuResult::NoSelection { selected: selection, }, Some(key) => match key { VirtualKeyCode::Escape => MainMenuResult::NoSelection { selected: MainMenuSelection::Quit, }, VirtualKeyCode::Up => MainMenuResult::NoSelection { selected: match selection { MainMenuSelection::NewGame => MainMenuSelection::Quit, MainMenuSelection::LoadGame => MainMenuSelection::NewGame, MainMenuSelection::Quit => { if save_exists { MainMenuSelection::LoadGame } else { MainMenuSelection::NewGame } } }, }, VirtualKeyCode::Down => MainMenuResult::NoSelection { selected: match selection { MainMenuSelection::NewGame => { if save_exists { MainMenuSelection::LoadGame } else { MainMenuSelection::Quit } } MainMenuSelection::LoadGame => MainMenuSelection::Quit, MainMenuSelection::Quit => MainMenuSelection::NewGame, }, }, VirtualKeyCode::Return => MainMenuResult::Selected { selected: selection, }, _ => MainMenuResult::NoSelection { selected: selection, }, }, }; } MainMenuResult::NoSelection { selected: MainMenuSelection::NewGame, } }