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 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
34/// Actions handled entirely on the client — not sent as game intents.
35pub 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}