mirror of
https://github.com/doukutsu-rs/doukutsu-rs
synced 2025-03-23 18:39:20 +00:00
fix menu controller swap issues and handle jump/shoot rebind edge case
This commit is contained in:
parent
8a4201f381
commit
c68fedaa50
|
@ -388,12 +388,12 @@ impl ControlsMenu {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_key_occupied(&self, scan_code: ScanCode) -> bool {
|
fn is_key_occupied(&self, scan_code: ScanCode) -> bool {
|
||||||
let keymap = match self.selected_player {
|
let other_player_keymap = match self.selected_player {
|
||||||
Player::Player1 => &self.player2_key_map,
|
Player::Player1 => &self.player2_key_map,
|
||||||
Player::Player2 => &self.player1_key_map,
|
Player::Player2 => &self.player1_key_map,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (_, v) in keymap.iter() {
|
for (_, v) in other_player_keymap.iter() {
|
||||||
if *v == scan_code {
|
if *v == scan_code {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -407,6 +407,8 @@ impl ControlsMenu {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut jump_shoot_swapped = false;
|
||||||
|
|
||||||
match self.selected_control.unwrap() {
|
match self.selected_control.unwrap() {
|
||||||
ControlEntry::Left => match self.selected_player {
|
ControlEntry::Left => match self.selected_player {
|
||||||
Player::Player1 => state.settings.player1_key_map.left = scan_code,
|
Player::Player1 => state.settings.player1_key_map.left = scan_code,
|
||||||
|
@ -433,12 +435,38 @@ impl ControlsMenu {
|
||||||
Player::Player2 => state.settings.player2_key_map.next_weapon = scan_code,
|
Player::Player2 => state.settings.player2_key_map.next_weapon = scan_code,
|
||||||
},
|
},
|
||||||
ControlEntry::Jump => match self.selected_player {
|
ControlEntry::Jump => match self.selected_player {
|
||||||
Player::Player1 => state.settings.player1_key_map.jump = scan_code,
|
Player::Player1 => {
|
||||||
Player::Player2 => state.settings.player2_key_map.jump = scan_code,
|
if state.settings.player1_key_map.shoot == scan_code {
|
||||||
|
state.settings.player1_key_map.shoot = state.settings.player1_key_map.jump;
|
||||||
|
jump_shoot_swapped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.settings.player1_key_map.jump = scan_code;
|
||||||
|
}
|
||||||
|
Player::Player2 => {
|
||||||
|
if state.settings.player2_key_map.shoot == scan_code {
|
||||||
|
state.settings.player2_key_map.shoot = state.settings.player2_key_map.jump;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.settings.player2_key_map.jump = scan_code;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
ControlEntry::Shoot => match self.selected_player {
|
ControlEntry::Shoot => match self.selected_player {
|
||||||
Player::Player1 => state.settings.player1_key_map.shoot = scan_code,
|
Player::Player1 => {
|
||||||
Player::Player2 => state.settings.player2_key_map.shoot = scan_code,
|
if state.settings.player1_key_map.jump == scan_code {
|
||||||
|
state.settings.player1_key_map.jump = state.settings.player1_key_map.shoot;
|
||||||
|
jump_shoot_swapped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.settings.player1_key_map.jump = scan_code;
|
||||||
|
}
|
||||||
|
Player::Player2 => {
|
||||||
|
if state.settings.player2_key_map.jump == scan_code {
|
||||||
|
state.settings.player2_key_map.jump = state.settings.player2_key_map.shoot;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.settings.player2_key_map.shoot = scan_code;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
ControlEntry::Skip => match self.selected_player {
|
ControlEntry::Skip => match self.selected_player {
|
||||||
Player::Player1 => state.settings.player1_key_map.skip = scan_code,
|
Player::Player1 => state.settings.player1_key_map.skip = scan_code,
|
||||||
|
@ -469,6 +497,19 @@ impl ControlsMenu {
|
||||||
if *entry == self.selected_control.unwrap() {
|
if *entry == self.selected_control.unwrap() {
|
||||||
*value = scan_code;
|
*value = scan_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if jump_shoot_swapped {
|
||||||
|
let map = match self.selected_player {
|
||||||
|
Player::Player1 => &state.settings.player1_key_map,
|
||||||
|
Player::Player2 => &state.settings.player2_key_map,
|
||||||
|
};
|
||||||
|
|
||||||
|
if *entry == ControlEntry::Jump {
|
||||||
|
*value = map.jump;
|
||||||
|
} else if *entry == ControlEntry::Shoot {
|
||||||
|
*value = map.shoot;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -484,6 +525,8 @@ impl ControlsMenu {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut jump_shoot_swapped = false;
|
||||||
|
|
||||||
match self.selected_control.unwrap() {
|
match self.selected_control.unwrap() {
|
||||||
ControlEntry::Left => match self.selected_player {
|
ControlEntry::Left => match self.selected_player {
|
||||||
Player::Player1 => state.settings.player1_controller_button_map.left = input_type,
|
Player::Player1 => state.settings.player1_controller_button_map.left = input_type,
|
||||||
|
@ -510,12 +553,44 @@ impl ControlsMenu {
|
||||||
Player::Player2 => state.settings.player2_controller_button_map.next_weapon = input_type,
|
Player::Player2 => state.settings.player2_controller_button_map.next_weapon = input_type,
|
||||||
},
|
},
|
||||||
ControlEntry::Jump => match self.selected_player {
|
ControlEntry::Jump => match self.selected_player {
|
||||||
Player::Player1 => state.settings.player1_controller_button_map.jump = input_type,
|
Player::Player1 => {
|
||||||
Player::Player2 => state.settings.player2_controller_button_map.jump = input_type,
|
if state.settings.player1_controller_button_map.shoot == input_type {
|
||||||
|
state.settings.player1_controller_button_map.shoot =
|
||||||
|
state.settings.player1_controller_button_map.jump;
|
||||||
|
jump_shoot_swapped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.settings.player1_controller_button_map.jump = input_type;
|
||||||
|
}
|
||||||
|
Player::Player2 => {
|
||||||
|
if state.settings.player2_controller_button_map.shoot == input_type {
|
||||||
|
state.settings.player2_controller_button_map.shoot =
|
||||||
|
state.settings.player2_controller_button_map.jump;
|
||||||
|
jump_shoot_swapped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.settings.player2_controller_button_map.jump = input_type;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
ControlEntry::Shoot => match self.selected_player {
|
ControlEntry::Shoot => match self.selected_player {
|
||||||
Player::Player1 => state.settings.player1_controller_button_map.shoot = input_type,
|
Player::Player1 => {
|
||||||
Player::Player2 => state.settings.player2_controller_button_map.shoot = input_type,
|
if state.settings.player1_controller_button_map.jump == input_type {
|
||||||
|
state.settings.player1_controller_button_map.jump =
|
||||||
|
state.settings.player1_controller_button_map.shoot;
|
||||||
|
jump_shoot_swapped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.settings.player1_controller_button_map.jump = input_type;
|
||||||
|
}
|
||||||
|
Player::Player2 => {
|
||||||
|
if state.settings.player2_controller_button_map.jump == input_type {
|
||||||
|
state.settings.player2_controller_button_map.jump =
|
||||||
|
state.settings.player2_controller_button_map.shoot;
|
||||||
|
jump_shoot_swapped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.settings.player2_controller_button_map.shoot = input_type;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
ControlEntry::Skip => match self.selected_player {
|
ControlEntry::Skip => match self.selected_player {
|
||||||
Player::Player1 => state.settings.player1_controller_button_map.skip = input_type,
|
Player::Player1 => state.settings.player1_controller_button_map.skip = input_type,
|
||||||
|
@ -546,6 +621,19 @@ impl ControlsMenu {
|
||||||
if *entry == self.selected_control.unwrap() {
|
if *entry == self.selected_control.unwrap() {
|
||||||
*value = input_type;
|
*value = input_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if jump_shoot_swapped {
|
||||||
|
let map = match self.selected_player {
|
||||||
|
Player::Player1 => &state.settings.player1_controller_button_map,
|
||||||
|
Player::Player2 => &state.settings.player2_controller_button_map,
|
||||||
|
};
|
||||||
|
|
||||||
|
if *entry == ControlEntry::Jump {
|
||||||
|
*value = map.jump;
|
||||||
|
} else if *entry == ControlEntry::Shoot {
|
||||||
|
*value = map.shoot;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -651,6 +739,7 @@ impl ControlsMenu {
|
||||||
new_menu_controller.add(state.settings.create_player1_controller());
|
new_menu_controller.add(state.settings.create_player1_controller());
|
||||||
new_menu_controller.add(state.settings.create_player2_controller());
|
new_menu_controller.add(state.settings.create_player2_controller());
|
||||||
self.input_busy = true;
|
self.input_busy = true;
|
||||||
|
self.controller.non_interactive = true;
|
||||||
*controller = new_menu_controller;
|
*controller = new_menu_controller;
|
||||||
|
|
||||||
self.update_rebind_menu(state, ctx);
|
self.update_rebind_menu(state, ctx);
|
||||||
|
@ -687,6 +776,7 @@ impl ControlsMenu {
|
||||||
new_menu_controller.add(state.settings.create_player1_controller());
|
new_menu_controller.add(state.settings.create_player1_controller());
|
||||||
new_menu_controller.add(state.settings.create_player2_controller());
|
new_menu_controller.add(state.settings.create_player2_controller());
|
||||||
self.input_busy = true;
|
self.input_busy = true;
|
||||||
|
self.controller.non_interactive = true;
|
||||||
*controller = new_menu_controller;
|
*controller = new_menu_controller;
|
||||||
|
|
||||||
self.update_rebind_menu(state, ctx);
|
self.update_rebind_menu(state, ctx);
|
||||||
|
@ -732,6 +822,7 @@ impl ControlsMenu {
|
||||||
if pressed_keys.len() == 1 {
|
if pressed_keys.len() == 1 {
|
||||||
if !self.input_busy {
|
if !self.input_busy {
|
||||||
self.input_busy = true;
|
self.input_busy = true;
|
||||||
|
self.rebind.non_interactive = true;
|
||||||
|
|
||||||
let key = **pressed_keys.first().unwrap();
|
let key = **pressed_keys.first().unwrap();
|
||||||
|
|
||||||
|
@ -757,6 +848,7 @@ impl ControlsMenu {
|
||||||
if pressed_gamepad_buttons.len() == 1 {
|
if pressed_gamepad_buttons.len() == 1 {
|
||||||
if !self.input_busy {
|
if !self.input_busy {
|
||||||
self.input_busy = true;
|
self.input_busy = true;
|
||||||
|
self.rebind.non_interactive = true;
|
||||||
|
|
||||||
if self.selected_player.controller_type(state) != self.selected_controller {
|
if self.selected_player.controller_type(state) != self.selected_controller {
|
||||||
state.sound_manager.play_sfx(12);
|
state.sound_manager.play_sfx(12);
|
||||||
|
@ -779,6 +871,7 @@ impl ControlsMenu {
|
||||||
if active_axes.len() == 1 {
|
if active_axes.len() == 1 {
|
||||||
if !self.input_busy {
|
if !self.input_busy {
|
||||||
self.input_busy = true;
|
self.input_busy = true;
|
||||||
|
self.rebind.non_interactive = true;
|
||||||
|
|
||||||
if self.selected_player.controller_type(state) != self.selected_controller {
|
if self.selected_player.controller_type(state) != self.selected_controller {
|
||||||
state.sound_manager.play_sfx(12);
|
state.sound_manager.play_sfx(12);
|
||||||
|
@ -820,6 +913,11 @@ impl ControlsMenu {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.input_busy = input_busy;
|
self.input_busy = input_busy;
|
||||||
|
|
||||||
|
if !self.input_busy {
|
||||||
|
self.controller.non_interactive = false;
|
||||||
|
self.rebind.non_interactive = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -668,6 +668,16 @@ impl<T: std::cmp::PartialEq + std::default::Default + Copy> Menu<T> {
|
||||||
controller: &mut CombinedMenuController,
|
controller: &mut CombinedMenuController,
|
||||||
state: &mut SharedGameState,
|
state: &mut SharedGameState,
|
||||||
) -> MenuSelectionResult<T> {
|
) -> MenuSelectionResult<T> {
|
||||||
|
self.anim_wait += 1;
|
||||||
|
if self.anim_wait > 8 {
|
||||||
|
self.anim_wait = 0;
|
||||||
|
|
||||||
|
self.anim_num += 1;
|
||||||
|
if self.anim_num >= 4 as u16 {
|
||||||
|
self.anim_num = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if self.non_interactive {
|
if self.non_interactive {
|
||||||
return MenuSelectionResult::None;
|
return MenuSelectionResult::None;
|
||||||
}
|
}
|
||||||
|
@ -772,16 +782,6 @@ impl<T: std::cmp::PartialEq + std::default::Default + Copy> Menu<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.anim_wait += 1;
|
|
||||||
if self.anim_wait > 8 {
|
|
||||||
self.anim_wait = 0;
|
|
||||||
|
|
||||||
self.anim_num += 1;
|
|
||||||
if self.anim_num >= 4 as u16 {
|
|
||||||
self.anim_num = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuSelectionResult::None
|
MenuSelectionResult::None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue