Skip to main content

flatland_play_loop/
dispatch.rs

1//! Which `InputAction`s stay local vs go to the server.
2
3use flatland_client_ui::{HudViewMode, InputAction, MapTargetState, PlayHud};
4
5/// Local HUD inputs for building `PlayHud`.
6pub 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
36/// Actions handled entirely on the client — not sent as game intents.
37pub 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}