doukutsu-rs/src/menu/pause_menu.rs

202 lines
7.4 KiB
Rust
Raw Normal View History

2022-01-21 02:14:12 +00:00
use crate::framework::context::Context;
use crate::framework::error::GameResult;
2022-01-25 03:34:21 +00:00
use crate::framework::graphics;
2022-01-21 03:30:25 +00:00
use crate::framework::keyboard::ScanCode;
2022-01-21 02:14:12 +00:00
use crate::input::combined_menu_controller::CombinedMenuController;
use crate::menu::MenuEntry;
use crate::menu::{Menu, MenuSelectionResult};
use crate::scene::title_scene::TitleScene;
use crate::shared_game_state::{MenuCharacter, SharedGameState};
2022-01-21 02:14:12 +00:00
use super::settings_menu::SettingsMenu;
#[derive(PartialEq, Eq, Copy, Clone)]
#[repr(u8)]
#[allow(unused)]
enum CurrentMenu {
PauseMenu,
OptionsMenu,
2022-01-25 03:34:21 +00:00
ConfirmMenu,
2022-01-21 02:14:12 +00:00
}
pub struct PauseMenu {
is_paused: bool,
current_menu: CurrentMenu,
2022-02-10 06:15:28 +00:00
settings_menu: SettingsMenu,
2022-01-21 02:14:12 +00:00
controller: CombinedMenuController,
pause_menu: Menu,
2022-01-25 03:34:21 +00:00
confirm_menu: Menu,
2022-01-21 02:14:12 +00:00
tick: u32,
}
impl PauseMenu {
pub fn new() -> PauseMenu {
let main = Menu::new(0, 0, 75, 0);
PauseMenu {
is_paused: false,
current_menu: CurrentMenu::PauseMenu,
2022-02-10 06:15:28 +00:00
settings_menu: SettingsMenu::new(),
2022-01-21 02:14:12 +00:00
controller: CombinedMenuController::new(),
pause_menu: main,
2022-01-25 03:34:21 +00:00
confirm_menu: Menu::new(0, 0, 75, 0),
2022-01-21 02:14:12 +00:00
tick: 0,
}
}
pub fn init(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
self.controller.add(state.settings.create_player1_controller());
self.controller.add(state.settings.create_player2_controller());
self.pause_menu.push_entry(MenuEntry::Active("Resume".to_owned()));
self.pause_menu.push_entry(MenuEntry::Active("Retry".to_owned()));
self.pause_menu.push_entry(MenuEntry::Active("Options".to_owned()));
2022-01-25 03:34:21 +00:00
self.pause_menu.push_entry(MenuEntry::Active("Title".to_owned()));
2022-01-21 02:14:12 +00:00
self.pause_menu.push_entry(MenuEntry::Active("Quit".to_owned()));
2022-01-25 03:34:21 +00:00
self.confirm_menu.push_entry(MenuEntry::Disabled("".to_owned()));
self.confirm_menu.push_entry(MenuEntry::Active("Yes".to_owned()));
self.confirm_menu.push_entry(MenuEntry::Active("No".to_owned()));
self.confirm_menu.selected = 1;
2022-01-21 02:14:12 +00:00
self.update_sizes(state);
2022-02-10 06:15:28 +00:00
self.settings_menu.init(state, ctx)?;
2022-01-21 02:14:12 +00:00
self.controller.update(state, ctx)?;
self.controller.update_trigger();
state.menu_character = MenuCharacter::Quote;
2022-01-21 02:14:12 +00:00
Ok(())
}
fn update_sizes(&mut self, state: &SharedGameState) {
self.pause_menu.update_height();
self.pause_menu.x = ((state.canvas_size.0 - self.pause_menu.width as f32) / 2.0).floor() as isize;
self.pause_menu.y = ((state.canvas_size.1 - self.pause_menu.height as f32) / 2.0).floor() as isize;
2022-01-25 03:34:21 +00:00
self.confirm_menu.update_height();
self.confirm_menu.x = ((state.canvas_size.0 - self.confirm_menu.width as f32) / 2.0).floor() as isize;
self.confirm_menu.y = ((state.canvas_size.1 - self.confirm_menu.height as f32) / 2.0).floor() as isize;
2022-01-21 02:14:12 +00:00
}
2022-01-25 03:34:21 +00:00
pub fn pause(&mut self, state: &mut SharedGameState) {
2022-01-21 02:14:12 +00:00
self.is_paused = true;
2022-01-25 03:34:21 +00:00
state.sound_manager.play_sfx(5);
2022-01-21 02:14:12 +00:00
}
pub fn is_paused(&mut self) -> bool {
self.is_paused
}
pub fn tick(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
self.update_sizes(state);
self.controller.update(state, ctx)?;
self.controller.update_trigger();
2022-01-26 00:35:41 +00:00
// Shortcut for quick restart
2022-01-21 03:30:25 +00:00
if ctx.keyboard_context.is_key_pressed(ScanCode::F2) {
2022-01-26 00:35:41 +00:00
state.sound_manager.stop_sfx(40);
state.sound_manager.stop_sfx(41);
state.sound_manager.stop_sfx(58);
state.sound_manager.play_song(0, &state.constants, &state.settings, ctx)?;
2022-01-21 03:30:25 +00:00
state.load_or_start_game(ctx)?;
}
2022-01-21 02:14:12 +00:00
match self.current_menu {
CurrentMenu::PauseMenu => match self.pause_menu.tick(&mut self.controller, state) {
MenuSelectionResult::Selected(0, _) | MenuSelectionResult::Canceled => {
// double tap prevention
if self.tick >= 3 {
self.tick = 0;
self.is_paused = false;
}
}
MenuSelectionResult::Selected(1, _) => {
2022-01-26 00:35:41 +00:00
state.sound_manager.stop_sfx(40);
state.sound_manager.stop_sfx(41);
state.sound_manager.stop_sfx(58);
state.sound_manager.play_song(0, &state.constants, &state.settings, ctx)?;
2022-01-21 02:14:12 +00:00
state.load_or_start_game(ctx)?;
}
MenuSelectionResult::Selected(2, _) => {
self.current_menu = CurrentMenu::OptionsMenu;
}
MenuSelectionResult::Selected(3, _) => {
2022-01-25 03:34:21 +00:00
self.confirm_menu.entries[0] = MenuEntry::Disabled("Title?".to_owned());
self.current_menu = CurrentMenu::ConfirmMenu;
2022-01-21 02:14:12 +00:00
}
2022-01-25 03:34:21 +00:00
MenuSelectionResult::Selected(4, _) => {
self.confirm_menu.entries[0] = MenuEntry::Disabled("Quit?".to_owned());
self.current_menu = CurrentMenu::ConfirmMenu;
2022-01-21 02:14:12 +00:00
}
_ => (),
},
CurrentMenu::OptionsMenu => {
let cm = &mut self.current_menu;
2022-02-10 06:15:28 +00:00
self.settings_menu.tick(
2022-01-21 02:14:12 +00:00
&mut || {
*cm = CurrentMenu::PauseMenu;
},
&mut self.controller,
state,
ctx,
)?;
}
2022-01-25 03:34:21 +00:00
CurrentMenu::ConfirmMenu => match self.confirm_menu.tick(&mut self.controller, state) {
MenuSelectionResult::Selected(1, _) => match self.pause_menu.selected {
3 => {
state.textscript_vm.flags.set_cutscene_skip(false);
state.next_scene = Some(Box::new(TitleScene::new()));
}
4 => {
state.shutdown();
}
_ => (),
},
MenuSelectionResult::Selected(2, _) | MenuSelectionResult::Canceled => {
self.current_menu = CurrentMenu::PauseMenu;
}
_ => (),
},
2022-01-21 02:14:12 +00:00
}
self.tick += 1;
Ok(())
}
pub fn draw(&self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
if self.is_paused {
2022-01-25 03:34:21 +00:00
let clip_y = ((self.tick as f32 + state.frame_time as f32 - 2.0) * state.scale * 10.0)
.clamp(0.0, state.screen_size.1) as isize;
let clip_rect = crate::common::Rect::new_size(
0,
(state.screen_size.1 / 2.0) as isize - clip_y,
2022-01-25 05:13:51 +00:00
state.screen_size.0 as isize,
2022-01-25 03:34:21 +00:00
clip_y * 2,
);
2022-01-21 02:14:12 +00:00
match self.current_menu {
CurrentMenu::PauseMenu => {
2022-01-25 03:34:21 +00:00
graphics::set_clip_rect(ctx, Some(clip_rect))?;
2022-01-21 02:14:12 +00:00
self.pause_menu.draw(state, ctx)?;
2022-01-25 03:34:21 +00:00
graphics::set_clip_rect(ctx, None)?;
2022-01-21 02:14:12 +00:00
}
CurrentMenu::OptionsMenu => {
2022-02-10 06:15:28 +00:00
self.settings_menu.draw(state, ctx)?;
2022-01-21 02:14:12 +00:00
}
2022-01-25 03:34:21 +00:00
CurrentMenu::ConfirmMenu => {
graphics::set_clip_rect(ctx, Some(clip_rect))?;
self.confirm_menu.draw(state, ctx)?;
graphics::set_clip_rect(ctx, None)?;
}
2022-01-21 02:14:12 +00:00
}
}
Ok(())
}
}