diff --git a/assets/game.yaml b/assets/game.yaml index 04b4e485e..cb3a6dc0d 100644 --- a/assets/game.yaml +++ b/assets/game.yaml @@ -45,6 +45,7 @@ default_settings: shoot: !Button West slide: !Button North pause: !Button Start + ragdoll: !Button RightTrigger menu_back: !Button East menu_start: !Button Start menu_confirm: !Button South @@ -60,6 +61,7 @@ default_settings: grab: !Keyboard V shoot: !Keyboard C slide: !Keyboard B + ragdoll: !Keyboard F pause: !Keyboard Escape menu_back: !Keyboard Escape menu_start: !Keyboard Return @@ -76,6 +78,7 @@ default_settings: grab: !Keyboard ShiftRight shoot: !Keyboard Period slide: !Keyboard Slash + ragdoll: !Keyboard M menu_confirm: !Keyboard Comma menu_back: !Keyboard ShiftRight diff --git a/assets/locales/en-US/controls.ftl b/assets/locales/en-US/controls.ftl index e6e02ce4c..21aec11ca 100644 --- a/assets/locales/en-US/controls.ftl +++ b/assets/locales/en-US/controls.ftl @@ -6,6 +6,7 @@ jump = Jump grab-drop = Grab / Drop shoot = Shoot slide = Slide +ragdoll = Ragdoll menu-confirm = Menu Confirm menu-back = Menu Back menu-start = Menu Start diff --git a/src/input.rs b/src/input.rs index 069882678..c41153b24 100644 --- a/src/input.rs +++ b/src/input.rs @@ -173,6 +173,9 @@ pub struct PlayerControl { pub slide_pressed: bool, pub slide_just_pressed: bool, + + pub ragdoll_pressed: bool, + pub ragdoll_just_pressed: bool, } #[derive(HasSchema, Clone)] @@ -246,6 +249,11 @@ impl<'a> current.slide_pressed, last.slide_pressed, ), + ( + &mut current.ragdoll_just_pressed, + current.ragdoll_pressed, + last.ragdoll_pressed, + ), ( &mut current.menu_back_just_pressed, current.menu_back_pressed, @@ -349,6 +357,7 @@ impl<'a> (&mut control.grab_pressed, &mapping.grab), (&mut control.shoot_pressed, &mapping.shoot), (&mut control.slide_pressed, &mapping.slide), + (&mut control.ragdoll_pressed, &mapping.ragdoll), (&mut control.menu_back_pressed, &mapping.menu_back), (&mut control.menu_confirm_pressed, &mapping.menu_confirm), (&mut control.menu_start_pressed, &mapping.menu_start), @@ -399,6 +408,7 @@ impl NetworkPlayerControl for PlayerControl { dense_control.set_grab_pressed(self.grab_pressed); dense_control.set_slide_pressed(self.slide_pressed); dense_control.set_shoot_pressed(self.shoot_pressed); + dense_control.set_ragdoll_pressed(self.ragdoll_pressed); dense_control.set_move_direction(proto::DenseMoveDirection(self.move_direction)); dense_control } @@ -416,6 +426,10 @@ impl NetworkPlayerControl for PlayerControl { self.shoot_just_pressed = shoot_pressed && !self.shoot_pressed; self.shoot_pressed = shoot_pressed; + let ragdoll_pressed = new_control.ragdoll_pressed(); + self.ragdoll_just_pressed = ragdoll_pressed && !self.ragdoll_pressed; + self.ragdoll_pressed = ragdoll_pressed; + let was_moving = self.move_direction.length_squared() > f32::MIN_POSITIVE; self.move_direction = new_control.move_direction().0; let is_moving = self.move_direction.length_squared() > f32::MIN_POSITIVE; @@ -425,18 +439,19 @@ impl NetworkPlayerControl for PlayerControl { #[cfg(not(target_arch = "wasm32"))] bitfield::bitfield! { - /// A player's controller inputs densely packed into a single u16. + /// A player's controller inputs densely packed into a single u32. /// /// This is used when sending player inputs across the network. #[derive(bytemuck::Pod, bytemuck::Zeroable, Copy, Clone, PartialEq, Eq)]//, Reflect)] #[repr(transparent)] - pub struct DensePlayerControl(u16); + pub struct DensePlayerControl(u32); impl Debug; pub jump_pressed, set_jump_pressed: 0; pub shoot_pressed, set_shoot_pressed: 1; pub grab_pressed, set_grab_pressed: 2; pub slide_pressed, set_slide_pressed: 3; - pub from into DenseMoveDirection, move_direction, set_move_direction: 15, 4; + pub ragdoll_pressed, set_ragdoll_pressed: 4; + pub from into DenseMoveDirection, move_direction, set_move_direction: 16, 5; } #[cfg(not(target_arch = "wasm32"))] diff --git a/src/settings.rs b/src/settings.rs index d160d6675..7158aa772 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -88,6 +88,7 @@ pub struct PlayerControlSetting { pub grab: InputKind, pub shoot: InputKind, pub slide: InputKind, + pub ragdoll: InputKind, pub menu_back: InputKind, pub menu_start: InputKind, pub menu_confirm: InputKind, diff --git a/src/ui/main_menu/settings/controls.rs b/src/ui/main_menu/settings/controls.rs index b16aab449..00e3cb944 100644 --- a/src/ui/main_menu/settings/controls.rs +++ b/src/ui/main_menu/settings/controls.rs @@ -103,6 +103,14 @@ pub(super) fn widget( &mut mapping.gamepad.slide, ], ), + ( + localization.get("ragdoll"), + [ + &mut mapping.keyboard1.ragdoll, + &mut mapping.keyboard2.ragdoll, + &mut mapping.gamepad.ragdoll, + ], + ), ( localization.get("pause"), [