flatland_play_loop/
dispatch.rs1use flatland_client_ui::{HudViewMode, InputAction, MapTargetState, PlayHud};
4
5pub struct PlayHudInput<'a> {
7 pub movement_label: &'a str,
8 pub sprint_mode: bool,
9 pub sneak_mode: bool,
10 pub map_target: &'a MapTargetState,
11 pub auto_nav_goal: Option<(f32, f32)>,
12 pub ground_target: Option<(f32, f32)>,
13 pub ground_blast_radius_m: f32,
14 pub mouse_hover: Option<(f32, f32)>,
15 pub view_mode: HudViewMode,
16}
17
18pub fn build_play_hud(input: PlayHudInput<'_>) -> PlayHud<'_> {
19 PlayHud {
20 movement: input.movement_label,
21 sprint_mode: input.sprint_mode,
22 sneak_mode: input.sneak_mode,
23 map_target: if input.map_target.active {
24 Some((input.map_target.cursor_x, input.map_target.cursor_y))
25 } else {
26 None
27 },
28 auto_nav_goal: input.auto_nav_goal,
29 ground_target: input.ground_target,
30 ground_blast_radius_m: input.ground_blast_radius_m,
31 mouse_hover: input.mouse_hover,
32 view_mode: input.view_mode,
33 }
34}
35
36pub fn should_dispatch_to_net(action: InputAction) -> bool {
38 !matches!(
39 action,
40 InputAction::None
41 | InputAction::Quit
42 | InputAction::ToggleHelp
43 | InputAction::CycleHudView
44 | InputAction::ToggleFloatingPanel(_)
45 | InputAction::ToggleSprintMode
46 | InputAction::ToggleMapTarget
47 | InputAction::ConfirmMapTarget
48 | InputAction::CancelMapTarget
49 | InputAction::MapTargetNudge { .. }
50 | InputAction::CancelAutoNav
51 | InputAction::StopMovement
52 | InputAction::SubmitChat
53 | InputAction::CancelChat
54 )
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn movement_and_combat_dispatch_to_net() {
63 assert!(should_dispatch_to_net(InputAction::Interact));
64 assert!(should_dispatch_to_net(InputAction::Interact));
65 assert!(should_dispatch_to_net(InputAction::StartChat {
66 whisper: false
67 }));
68 assert!(!should_dispatch_to_net(InputAction::ToggleHelp));
69 }
70
71 #[test]
72 fn play_hud_includes_map_target() {
73 let mut target = MapTargetState::default();
74 target.active = true;
75 target.cursor_x = 10.0;
76 target.cursor_y = 20.0;
77 let hud = build_play_hud(PlayHudInput {
78 movement_label: "N",
79 sprint_mode: false,
80 sneak_mode: false,
81 map_target: &target,
82 auto_nav_goal: None,
83 ground_target: None,
84 ground_blast_radius_m: 0.0,
85 mouse_hover: None,
86 view_mode: HudViewMode::default(),
87 });
88 assert_eq!(hud.map_target, Some((10.0, 20.0)));
89 }
90}