flatland-play-loop 0.2.24

Engine-agnostic Flatland3 play session frame logic (gfx client)
Documentation
//! Which `InputAction`s stay local vs go to the server.

use flatland_client_ui::{HudViewMode, InputAction, MapTargetState, PlayHud};

/// Local HUD inputs for building `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,
    }
}

/// Actions handled entirely on the client — not sent as game intents.
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::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::StartChat {
            whisper: false
        }));
        assert!(!should_dispatch_to_net(InputAction::ToggleHelp));
    }

    #[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)));
    }
}