use ::rltk::prelude::*; 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 mut draw_batch = DrawBatch::new(); 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); draw_batch.draw_double_box( Rect::with_size(24, 18, 31, 10), ColorPair::new(colors::WHEAT, colors::BLACK), ); draw_batch.print_color_centered( 20, "Rust Roguelike", ColorPair::new(colors::YELLOW, colors::BLACK), ); draw_batch.print_color_centered( 21, "by Timothy J. Warren", ColorPair::new(colors::CYAN, colors::BLACK), ); draw_batch.print_color_centered( 22, "Use Up/Down Arrows and Enter", ColorPair::new(colors::GRAY, colors::BLACK), ); let mut y = 24; if let RunState::MainMenu { menu_selection: selection, } = *runstate { if selection == MainMenuSelection::NewGame { draw_batch.print_color_centered( y, "Begin New Game", ColorPair::new(colors::MAGENTA, colors::BLACK), ); } else { draw_batch.print_color_centered( y, "Begin New Game", ColorPair::new(colors::WHITE, colors::BLACK), ); } y += 1; if save_exists { if selection == MainMenuSelection::LoadGame { draw_batch.print_color_centered( y, "Load Game", ColorPair::new(colors::MAGENTA, colors::BLACK), ); } else { draw_batch.print_color_centered( y, "Load Game", ColorPair::new(colors::WHITE, colors::BLACK), ); } y += 1; } if selection == MainMenuSelection::Quit { draw_batch.print_color_centered( y, "Quit", ColorPair::new(colors::MAGENTA, colors::BLACK), ); } else { draw_batch.print_color_centered( y, "Quit", ColorPair::new(colors::WHITE, colors::BLACK), ); } draw_batch.submit(6000).expect("Failed to render main menu"); 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, } }