use flatland_client_ui::{HudViewMode, InputAction, MapTargetState, PlayHud};
pub struct PlayHudInput<'a> {
pub movement_label: &'a str,
pub sprint_mode: bool,
pub map_target: &'a MapTargetState,
pub auto_nav_goal: Option<(f32, f32)>,
pub mouse_hover: Option<(f32, f32)>,
pub view_mode: HudViewMode,
}
pub fn build_play_hud(input: PlayHudInput<'_>) -> PlayHud<'_> {
PlayHud {
movement: input.movement_label,
sprint_mode: input.sprint_mode,
map_target: if input.map_target.active {
Some((input.map_target.cursor_x, input.map_target.cursor_y))
} else {
None
},
auto_nav_goal: input.auto_nav_goal,
mouse_hover: input.mouse_hover,
view_mode: input.view_mode,
}
}
pub fn should_dispatch_to_net(action: InputAction) -> bool {
!matches!(
action,
InputAction::None
| InputAction::Quit
| InputAction::ToggleHelp
| InputAction::CycleHudView
| InputAction::ToggleSprintMode
| InputAction::ToggleMapTarget
| InputAction::ConfirmMapTarget
| InputAction::CancelMapTarget
| InputAction::MapTargetNudge { .. }
| InputAction::CancelAutoNav
| InputAction::StopMovement
| InputAction::StartChat { .. }
| InputAction::SubmitChat
| InputAction::CancelChat
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn movement_and_combat_dispatch_to_net() {
assert!(should_dispatch_to_net(InputAction::Interact));
assert!(should_dispatch_to_net(InputAction::Interact));
assert!(!should_dispatch_to_net(InputAction::ToggleHelp));
assert!(!should_dispatch_to_net(InputAction::StartChat { whisper: false }));
}
#[test]
fn play_hud_includes_map_target() {
let mut target = MapTargetState::default();
target.active = true;
target.cursor_x = 10.0;
target.cursor_y = 20.0;
let hud = build_play_hud(PlayHudInput {
movement_label: "N",
sprint_mode: false,
map_target: &target,
auto_nav_goal: None,
mouse_hover: None,
view_mode: HudViewMode::default(),
});
assert_eq!(hud.map_target, Some((10.0, 20.0)));
}
}