2022-06-22 22:08:36 +00:00
|
|
|
use crate::framework::context::Context;
|
|
|
|
use crate::framework::error::GameResult;
|
|
|
|
use crate::input::combined_menu_controller::CombinedMenuController;
|
|
|
|
use crate::menu::MenuEntry;
|
|
|
|
use crate::menu::{Menu, MenuSelectionResult};
|
|
|
|
use crate::shared_game_state::{PlayerCount, SharedGameState};
|
|
|
|
|
|
|
|
pub enum CurrentMenu {
|
|
|
|
CoopMenu,
|
|
|
|
PlayerSkin,
|
|
|
|
}
|
|
|
|
|
2022-07-24 14:52:51 +00:00
|
|
|
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
|
|
|
|
pub enum CoopMenuEntry {
|
|
|
|
Title,
|
|
|
|
One,
|
|
|
|
Two,
|
|
|
|
Back,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for CoopMenuEntry {
|
|
|
|
fn default() -> Self {
|
|
|
|
CoopMenuEntry::One
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
|
|
|
|
pub enum SkinMenuEntry {
|
|
|
|
Title,
|
|
|
|
Skin,
|
|
|
|
Start,
|
2022-08-28 12:00:53 +00:00
|
|
|
Add,
|
2022-07-24 14:52:51 +00:00
|
|
|
Back,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for SkinMenuEntry {
|
|
|
|
fn default() -> Self {
|
|
|
|
SkinMenuEntry::Skin
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-22 22:08:36 +00:00
|
|
|
pub struct PlayerCountMenu {
|
|
|
|
current_menu: CurrentMenu,
|
2022-07-24 14:52:51 +00:00
|
|
|
coop_menu: Menu<CoopMenuEntry>,
|
|
|
|
skin_menu: Menu<SkinMenuEntry>,
|
2022-08-28 12:00:53 +00:00
|
|
|
pub on_title: bool,
|
2022-06-22 22:08:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl PlayerCountMenu {
|
|
|
|
pub fn new() -> PlayerCountMenu {
|
|
|
|
PlayerCountMenu {
|
|
|
|
coop_menu: Menu::new(0, 0, 130, 0),
|
|
|
|
skin_menu: Menu::new(0, 0, 130, 0),
|
|
|
|
current_menu: CurrentMenu::CoopMenu,
|
2022-08-28 12:00:53 +00:00
|
|
|
on_title: false,
|
2022-06-22 22:08:36 +00:00
|
|
|
}
|
|
|
|
}
|
2022-06-30 15:39:56 +00:00
|
|
|
pub fn init(&mut self, state: &mut SharedGameState) -> GameResult {
|
2022-06-22 22:08:36 +00:00
|
|
|
self.coop_menu = Menu::new(0, 0, 130, 0);
|
|
|
|
self.skin_menu = Menu::new(0, 0, 130, 0);
|
|
|
|
|
2022-07-24 14:52:51 +00:00
|
|
|
self.coop_menu.push_entry(CoopMenuEntry::Title, MenuEntry::Disabled(state.t("menus.coop_menu.title")));
|
|
|
|
self.coop_menu.push_entry(CoopMenuEntry::One, MenuEntry::Active(state.t("menus.coop_menu.one")));
|
|
|
|
self.coop_menu.push_entry(CoopMenuEntry::Two, MenuEntry::Active(state.t("menus.coop_menu.two")));
|
|
|
|
self.coop_menu.push_entry(CoopMenuEntry::Back, MenuEntry::Active(state.t("common.back")));
|
|
|
|
|
|
|
|
self.coop_menu.selected = CoopMenuEntry::One;
|
2022-06-30 15:39:56 +00:00
|
|
|
|
2022-07-24 14:52:51 +00:00
|
|
|
self.skin_menu.push_entry(SkinMenuEntry::Title, MenuEntry::Disabled(state.t("menus.skin_menu.title")));
|
|
|
|
self.skin_menu.push_entry(SkinMenuEntry::Skin, MenuEntry::PlayerSkin);
|
2022-08-28 12:00:53 +00:00
|
|
|
|
|
|
|
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")));
|
|
|
|
}
|
|
|
|
|
2022-07-24 14:52:51 +00:00
|
|
|
self.skin_menu.push_entry(SkinMenuEntry::Back, MenuEntry::Active(state.t("common.back")));
|
2022-06-30 15:39:56 +00:00
|
|
|
|
2022-07-24 14:52:51 +00:00
|
|
|
self.skin_menu.selected = SkinMenuEntry::Skin;
|
2022-06-22 22:08:36 +00:00
|
|
|
|
2022-10-15 12:13:04 +00:00
|
|
|
if !self.on_title && !state.constants.crime_mode && state.constants.is_cs_plus {
|
2022-08-28 12:00:53 +00:00
|
|
|
self.current_menu = CurrentMenu::PlayerSkin;
|
|
|
|
}
|
|
|
|
|
2022-06-22 22:08:36 +00:00
|
|
|
self.update_sizes(state);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn update_sizes(&mut self, state: &SharedGameState) {
|
|
|
|
self.coop_menu.update_width(state);
|
|
|
|
self.coop_menu.update_height();
|
2022-08-14 11:19:46 +00:00
|
|
|
self.coop_menu.x = ((state.canvas_size.0 - self.coop_menu.width as f32) / 2.0).floor() as isize;
|
2022-06-30 15:39:56 +00:00
|
|
|
self.coop_menu.y = 30 + ((state.canvas_size.1 - self.coop_menu.height as f32) / 2.0).floor() as isize;
|
2022-06-22 22:08:36 +00:00
|
|
|
|
|
|
|
self.skin_menu.update_width(state);
|
|
|
|
self.skin_menu.update_height();
|
2022-08-14 11:19:46 +00:00
|
|
|
self.skin_menu.x = ((state.canvas_size.0 - self.coop_menu.width as f32) / 2.0).floor() as isize;
|
2022-06-30 15:39:56 +00:00
|
|
|
self.skin_menu.y = 30 + ((state.canvas_size.1 - self.coop_menu.height as f32) / 2.0).floor() as isize;
|
2022-06-22 22:08:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn tick(
|
|
|
|
&mut self,
|
|
|
|
exit_action: &mut dyn FnMut(),
|
|
|
|
controller: &mut CombinedMenuController,
|
|
|
|
state: &mut SharedGameState,
|
|
|
|
ctx: &mut Context,
|
|
|
|
) -> GameResult {
|
|
|
|
self.update_sizes(state);
|
|
|
|
match self.current_menu {
|
|
|
|
CurrentMenu::CoopMenu => match self.coop_menu.tick(controller, state) {
|
2022-07-24 14:52:51 +00:00
|
|
|
MenuSelectionResult::Selected(CoopMenuEntry::Back, _) | MenuSelectionResult::Canceled => exit_action(),
|
|
|
|
MenuSelectionResult::Selected(CoopMenuEntry::One, _) => {
|
2022-06-22 22:08:36 +00:00
|
|
|
state.player_count = PlayerCount::One;
|
|
|
|
state.reload_resources(ctx)?;
|
2022-06-30 15:39:56 +00:00
|
|
|
state.load_or_start_game(ctx)?;
|
|
|
|
}
|
2022-07-24 14:52:51 +00:00
|
|
|
MenuSelectionResult::Selected(CoopMenuEntry::Two, _) => {
|
2022-06-22 22:08:36 +00:00
|
|
|
if state.constants.is_cs_plus {
|
|
|
|
self.current_menu = CurrentMenu::PlayerSkin;
|
|
|
|
} else {
|
|
|
|
state.player_count = PlayerCount::Two;
|
|
|
|
state.reload_resources(ctx)?;
|
2022-06-30 15:39:56 +00:00
|
|
|
state.load_or_start_game(ctx)?;
|
2022-06-22 22:08:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
_ => (),
|
|
|
|
},
|
|
|
|
CurrentMenu::PlayerSkin => match self.skin_menu.tick(controller, state) {
|
2022-07-24 14:52:51 +00:00
|
|
|
MenuSelectionResult::Selected(SkinMenuEntry::Back, _) | MenuSelectionResult::Canceled => {
|
2022-08-28 12:00:53 +00:00
|
|
|
if self.on_title {
|
|
|
|
self.current_menu = CurrentMenu::CoopMenu;
|
|
|
|
} else {
|
|
|
|
exit_action();
|
|
|
|
}
|
2022-06-22 22:08:36 +00:00
|
|
|
}
|
2022-07-24 14:52:51 +00:00
|
|
|
MenuSelectionResult::Selected(SkinMenuEntry::Skin, _) => {
|
2022-06-22 22:08:36 +00:00
|
|
|
state.player2_skin += 2;
|
|
|
|
}
|
2022-07-24 14:52:51 +00:00
|
|
|
MenuSelectionResult::Selected(SkinMenuEntry::Start, _) => {
|
2022-06-22 22:08:36 +00:00
|
|
|
state.player_count = PlayerCount::Two;
|
|
|
|
state.reload_resources(ctx)?;
|
|
|
|
state.load_or_start_game(ctx)?;
|
|
|
|
}
|
2022-08-28 12:00:53 +00:00
|
|
|
MenuSelectionResult::Selected(SkinMenuEntry::Add, _) => {
|
|
|
|
state.player_count = PlayerCount::Two;
|
|
|
|
state.player_count_modified_in_game = true;
|
|
|
|
exit_action();
|
|
|
|
}
|
2022-06-22 22:08:36 +00:00
|
|
|
_ => (),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
pub fn draw(&self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
|
|
|
|
match self.current_menu {
|
|
|
|
CurrentMenu::CoopMenu => {
|
|
|
|
self.coop_menu.draw(state, ctx)?;
|
|
|
|
}
|
|
|
|
CurrentMenu::PlayerSkin => {
|
|
|
|
self.skin_menu.draw(state, ctx)?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
2022-06-30 15:39:56 +00:00
|
|
|
}
|