add/drop player 2 from pause menu

This commit is contained in:
Sallai József 2022-08-28 15:00:53 +03:00
parent dec913dd65
commit 029d6d52e4
8 changed files with 113 additions and 5 deletions

View File

@ -29,7 +29,9 @@
"title": "Title",
"title_confirm": "Title?",
"quit": "Quit",
"quit_confirm": "Quit?"
"quit_confirm": "Quit?",
"add_player2": "Add Player 2",
"drop_player2": "Drop Player 2"
},
"save_menu": {

View File

@ -27,7 +27,9 @@
"title": "メインメニュー",
"title_confirm": "メインメニュー?",
"quit": "辞める",
"quit_confirm": "辞める?"
"quit_confirm": "辞める?",
"add_player2": "プレーヤー2を追加",
"drop_player2": "プレーヤー2を削除"
},
"save_menu": {
"new": "新しいデータ",

View File

@ -29,6 +29,7 @@ pub enum SkinMenuEntry {
Title,
Skin,
Start,
Add,
Back,
}
@ -42,6 +43,7 @@ pub struct PlayerCountMenu {
current_menu: CurrentMenu,
coop_menu: Menu<CoopMenuEntry>,
skin_menu: Menu<SkinMenuEntry>,
pub on_title: bool,
}
impl PlayerCountMenu {
@ -50,6 +52,7 @@ impl PlayerCountMenu {
coop_menu: Menu::new(0, 0, 130, 0),
skin_menu: Menu::new(0, 0, 130, 0),
current_menu: CurrentMenu::CoopMenu,
on_title: false,
}
}
pub fn init(&mut self, state: &mut SharedGameState) -> GameResult {
@ -65,11 +68,21 @@ impl PlayerCountMenu {
self.skin_menu.push_entry(SkinMenuEntry::Title, MenuEntry::Disabled(state.t("menus.skin_menu.title")));
self.skin_menu.push_entry(SkinMenuEntry::Skin, MenuEntry::PlayerSkin);
self.skin_menu.push_entry(SkinMenuEntry::Start, MenuEntry::Active(state.t("menus.main_menu.start")));
if self.on_title {
self.skin_menu.push_entry(SkinMenuEntry::Start, MenuEntry::Active(state.t("menus.main_menu.start")));
} else {
self.skin_menu.push_entry(SkinMenuEntry::Add, MenuEntry::Active(state.t("menus.pause_menu.add_player2")));
}
self.skin_menu.push_entry(SkinMenuEntry::Back, MenuEntry::Active(state.t("common.back")));
self.skin_menu.selected = SkinMenuEntry::Skin;
if !self.on_title && state.constants.is_cs_plus {
self.current_menu = CurrentMenu::PlayerSkin;
}
self.update_sizes(state);
Ok(())
@ -116,7 +129,11 @@ impl PlayerCountMenu {
},
CurrentMenu::PlayerSkin => match self.skin_menu.tick(controller, state) {
MenuSelectionResult::Selected(SkinMenuEntry::Back, _) | MenuSelectionResult::Canceled => {
self.current_menu = CurrentMenu::CoopMenu;
if self.on_title {
self.current_menu = CurrentMenu::CoopMenu;
} else {
exit_action();
}
}
MenuSelectionResult::Selected(SkinMenuEntry::Skin, _) => {
state.player2_skin += 2;
@ -126,6 +143,11 @@ impl PlayerCountMenu {
state.reload_resources(ctx)?;
state.load_or_start_game(ctx)?;
}
MenuSelectionResult::Selected(SkinMenuEntry::Add, _) => {
state.player_count = PlayerCount::Two;
state.player_count_modified_in_game = true;
exit_action();
}
_ => (),
},
}

View File

@ -6,8 +6,9 @@ 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};
use crate::shared_game_state::{MenuCharacter, PlayerCount, SharedGameState};
use super::coop_menu::PlayerCountMenu;
use super::settings_menu::SettingsMenu;
#[derive(PartialEq, Eq, Copy, Clone)]
@ -15,6 +16,7 @@ use super::settings_menu::SettingsMenu;
#[allow(unused)]
enum CurrentMenu {
PauseMenu,
CoopMenu,
SettingsMenu,
ConfirmMenu,
}
@ -23,6 +25,8 @@ enum CurrentMenu {
enum PauseMenuEntry {
Resume,
Retry,
AddPlayer2,
DropPlayer2,
Settings,
Title,
Quit,
@ -51,10 +55,12 @@ pub struct PauseMenu {
is_paused: bool,
current_menu: CurrentMenu,
settings_menu: SettingsMenu,
coop_menu: PlayerCountMenu,
controller: CombinedMenuController,
pause_menu: Menu<PauseMenuEntry>,
confirm_menu: Menu<ConfirmMenuEntry>,
tick: u32,
should_update_coop_menu: bool,
}
impl PauseMenu {
@ -65,10 +71,12 @@ impl PauseMenu {
is_paused: false,
current_menu: CurrentMenu::PauseMenu,
settings_menu: SettingsMenu::new(),
coop_menu: PlayerCountMenu::new(),
controller: CombinedMenuController::new(),
pause_menu: main,
confirm_menu: Menu::new(0, 0, 75, 0),
tick: 0,
should_update_coop_menu: false,
}
}
@ -78,6 +86,8 @@ impl PauseMenu {
self.pause_menu.push_entry(PauseMenuEntry::Resume, MenuEntry::Active(state.t("menus.pause_menu.resume")));
self.pause_menu.push_entry(PauseMenuEntry::Retry, MenuEntry::Active(state.t("menus.pause_menu.retry")));
self.pause_menu.push_entry(PauseMenuEntry::AddPlayer2, MenuEntry::Hidden);
self.pause_menu.push_entry(PauseMenuEntry::DropPlayer2, MenuEntry::Hidden);
self.pause_menu.push_entry(PauseMenuEntry::Settings, MenuEntry::Active(state.t("menus.pause_menu.options")));
self.pause_menu.push_entry(PauseMenuEntry::Title, MenuEntry::Active(state.t("menus.pause_menu.title")));
self.pause_menu.push_entry(PauseMenuEntry::Quit, MenuEntry::Active(state.t("menus.pause_menu.quit")));
@ -91,12 +101,15 @@ impl PauseMenu {
self.update_sizes(state);
self.settings_menu.init(state, ctx)?;
self.coop_menu.init(state)?;
self.controller.update(state, ctx)?;
self.controller.update_trigger();
state.menu_character = MenuCharacter::Quote;
self.update_coop_menu_items(state);
Ok(())
}
@ -112,6 +125,25 @@ impl PauseMenu {
self.confirm_menu.y = ((state.canvas_size.1 - self.confirm_menu.height as f32) / 2.0).floor() as isize;
}
fn update_coop_menu_items(&mut self, state: &SharedGameState) {
match state.player_count {
PlayerCount::One => {
self.pause_menu
.set_entry(PauseMenuEntry::AddPlayer2, MenuEntry::Active(state.t("menus.pause_menu.add_player2")));
self.pause_menu.set_entry(PauseMenuEntry::DropPlayer2, MenuEntry::Hidden);
self.pause_menu.selected = PauseMenuEntry::AddPlayer2;
}
PlayerCount::Two => {
self.pause_menu.set_entry(PauseMenuEntry::AddPlayer2, MenuEntry::Hidden);
self.pause_menu.set_entry(
PauseMenuEntry::DropPlayer2,
MenuEntry::Active(state.t("menus.pause_menu.drop_player2")),
);
self.pause_menu.selected = PauseMenuEntry::DropPlayer2;
}
}
}
pub fn pause(&mut self, state: &mut SharedGameState) {
self.is_paused = true;
state.sound_manager.play_sfx(5);
@ -134,6 +166,11 @@ impl PauseMenu {
state.load_or_start_game(ctx)?;
}
if self.should_update_coop_menu {
self.update_coop_menu_items(state);
self.should_update_coop_menu = false;
}
match self.current_menu {
CurrentMenu::PauseMenu => match self.pause_menu.tick(&mut self.controller, state) {
MenuSelectionResult::Selected(PauseMenuEntry::Resume, _) | MenuSelectionResult::Canceled => {
@ -148,6 +185,20 @@ impl PauseMenu {
state.sound_manager.play_song(0, &state.constants, &state.settings, ctx)?;
state.load_or_start_game(ctx)?;
}
MenuSelectionResult::Selected(PauseMenuEntry::AddPlayer2, _) => {
if !state.constants.is_cs_plus {
state.player_count = PlayerCount::Two;
state.player_count_modified_in_game = true;
self.should_update_coop_menu = true;
} else {
self.current_menu = CurrentMenu::CoopMenu;
}
}
MenuSelectionResult::Selected(PauseMenuEntry::DropPlayer2, _) => {
state.player_count = PlayerCount::One;
state.player_count_modified_in_game = true;
self.should_update_coop_menu = true;
}
MenuSelectionResult::Selected(PauseMenuEntry::Settings, _) => {
self.current_menu = CurrentMenu::SettingsMenu;
}
@ -167,6 +218,20 @@ impl PauseMenu {
}
_ => (),
},
CurrentMenu::CoopMenu => {
let cm = &mut self.current_menu;
let should_update = &mut self.should_update_coop_menu;
self.coop_menu.tick(
&mut || {
*cm = CurrentMenu::PauseMenu;
*should_update = true;
},
&mut self.controller,
state,
ctx,
)?;
}
CurrentMenu::SettingsMenu => {
let cm = &mut self.current_menu;
self.settings_menu.tick(
@ -219,6 +284,9 @@ impl PauseMenu {
self.pause_menu.draw(state, ctx)?;
graphics::set_clip_rect(ctx, None)?;
}
CurrentMenu::CoopMenu => {
self.coop_menu.draw(state, ctx)?;
}
CurrentMenu::SettingsMenu => {
self.settings_menu.draw(state, ctx)?;
}

View File

@ -116,6 +116,7 @@ impl SaveSelectMenu {
pub fn init(&mut self, state: &mut SharedGameState, ctx: &Context) -> GameResult {
self.save_menu = Menu::new(0, 0, 230, 0);
self.save_detailed = Menu::new(0, 0, 230, 0);
self.coop_menu.on_title = true;
self.coop_menu.init(state)?;
self.difficulty_menu = Menu::new(0, 0, 130, 0);
self.delete_confirm = Menu::new(0, 0, 75, 0);

View File

@ -1737,6 +1737,16 @@ impl Scene for GameScene {
}
}
if state.player_count_modified_in_game {
if state.player_count == PlayerCount::Two {
self.add_player2(state);
} else {
self.drop_player2();
}
state.player_count_modified_in_game = false;
}
self.player1.controller.update(state, ctx)?;
self.player1.controller.update_trigger();
self.player2.controller.update(state, ctx)?;

View File

@ -220,6 +220,7 @@ impl Scene for TitleScene {
self.save_select_menu.init(state, ctx)?;
self.coop_menu.on_title = true;
self.coop_menu.init(state)?;
let mut selected = ChallengesMenuEntry::Back;

View File

@ -303,6 +303,7 @@ pub struct SharedGameState {
pub save_slot: usize,
pub difficulty: GameDifficulty,
pub player_count: PlayerCount,
pub player_count_modified_in_game: bool,
pub player2_skin: u16,
pub replay_state: ReplayState,
pub mod_requirements: ModRequirements,
@ -460,6 +461,7 @@ impl SharedGameState {
save_slot: 1,
difficulty: GameDifficulty::Normal,
player_count: PlayerCount::One,
player_count_modified_in_game: false,
player2_skin: 0,
replay_state: ReplayState::None,
mod_requirements,