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