Add the ability to respawn and improve controller port mapping (#72)
CI / build-and-test (push) Successful in 2m2s
CI / production-build (push) Successful in 12m18s

Reviewed-on: #72
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #72.
This commit is contained in:
2026-09-27 11:54:08 +00:00
committed by EIREXE
parent bb238d2cbc
commit 6f1d8a7706
15 changed files with 438 additions and 85 deletions
+17 -10
View File
@@ -28,7 +28,7 @@ pub enum LocalInputSource {
Gamepad(Entity),
}
/// Maps an input source to a player index
/// Persistent mapping from physical/menu controller slots to input sources.
#[derive(Resource, Clone, Debug, Default, Deref, DerefMut)]
pub struct LocalInputAssignments(pub Vec<(usize, LocalInputSource)>);
@@ -50,6 +50,16 @@ impl LocalInputAssignments {
}
}
/// Match-local mapping from dense GGRS handles to physical input sources.
#[derive(Resource, Clone, Debug, Default, Deref, DerefMut)]
pub struct MatchInputAssignments(pub Vec<Option<LocalInputSource>>);
impl MatchInputAssignments {
pub fn get_for_handle(&self, handle: usize) -> Option<LocalInputSource> {
self.0.get(handle).copied().flatten()
}
}
use crate::game_settings::GameSettings;
use crate::math::int::FGi32;
use crate::netcode::GGRSCfg;
@@ -244,20 +254,17 @@ fn read_local_inputs(
input_map: Res<BaseInputMap>,
gc_ports: Res<gamecube::GcPorts>,
gamepads: Query<&Gamepad>,
assignments: Res<LocalInputAssignments>,
assignments: Res<MatchInputAssignments>,
local_players: Res<LocalPlayers>,
game_settings: Res<GameSettings>,
) {
let mut local_inputs = HashMap::new();
for handle in &local_players.0 {
let assigned = assignments
.0
.iter()
.find(|(player_handle, _)| player_handle == handle);
let assigned = assignments.get_for_handle(*handle);
let gamepad = match assigned {
Some((_, LocalInputSource::Gamepad(entity))) => gamepads.get(*entity).ok(),
Some((_, LocalInputSource::Keyboard)) => None,
Some(LocalInputSource::Gamepad(entity)) => gamepads.get(entity).ok(),
Some(LocalInputSource::Keyboard) => None,
None => gc_ports
.entities
.get(*handle)
@@ -267,8 +274,8 @@ fn read_local_inputs(
};
let mut input_frame = match assigned {
Some((_, LocalInputSource::Keyboard)) => keyboard::sample_keyboard(&key, &input_map),
Some((_, LocalInputSource::Gamepad(_))) => gamepad
Some(LocalInputSource::Keyboard) => keyboard::sample_keyboard(&key, &input_map),
Some(LocalInputSource::Gamepad(_)) => gamepad
.map(|pad| gamepad::sample_gamepad(pad, &input_map))
.unwrap_or_default(),
None => FighterInputFrame::default(),