mirror of
https://github.com/doukutsu-rs/doukutsu-rs
synced 2025-05-23 07:11:08 +00:00
add/drop player 2 from pause menu
This commit is contained in:
parent
dec913dd65
commit
029d6d52e4
|
@ -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": {
|
||||
|
|
|
@ -27,7 +27,9 @@
|
|||
"title": "メインメニュー",
|
||||
"title_confirm": "メインメニュー?",
|
||||
"quit": "辞める",
|
||||
"quit_confirm": "辞める?"
|
||||
"quit_confirm": "辞める?",
|
||||
"add_player2": "プレーヤー2を追加",
|
||||
"drop_player2": "プレーヤー2を削除"
|
||||
},
|
||||
"save_menu": {
|
||||
"new": "新しいデータ",
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
_ => (),
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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)?;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)?;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue