summaryrefslogtreecommitdiff
path: root/src/snake_controller.rs
blob: 0c48175e864dc213f313e0d48f43cccbfc9cf45f (plain)
use tortuise_script::{
    input::{KeyCode, Position as MousePosition},
    ScriptContext, TortuiseScript,
};

use crate::{Position, DIRECTION};

fn is_inside_box(mouse: Option<MousePosition>, button: MousePosition, size: u16) -> bool {
    mouse.is_some_and(|mouse| {
        (mouse.x >= button.x && mouse.x < button.x + size * 2)
            && (mouse.y >= button.y && mouse.y < button.y + size)
    })
}

pub const SNAKE_CONTROLLER: TortuiseScript = TortuiseScript {
    update: |context: ScriptContext| {
        let mut direction = DIRECTION.get_mut(&context);
        let mouse_location = context.mouse_location();
        if is_inside_box(mouse_location, MousePosition { x: 4, y: 4 }, 3) {
            *direction = Position { x: -1, y: 0 };
        } else if is_inside_box(mouse_location, MousePosition { x: 16, y: 4 }, 3) {
            *direction = Position { x: 1, y: 0 };
        } else if is_inside_box(mouse_location, MousePosition { x: 10, y: 1 }, 3) {
            *direction = Position { x: 0, y: -1 };
        } else if is_inside_box(mouse_location, MousePosition { x: 10, y: 7 }, 3) {
            *direction = Position { x: 0, y: 1 };
        } else if context.is_key_pressed_this_frame(KeyCode::Up) {
            *direction = Position { x: 0, y: -1 };
        } else if context.is_key_pressed_this_frame(KeyCode::Right) {
            *direction = Position { x: 1, y: 0 };
        } else if context.is_key_pressed_this_frame(KeyCode::Left) {
            *direction = Position { x: -1, y: 0 };
        } else if context.is_key_pressed_this_frame(KeyCode::Down) {
            *direction = Position { x: 0, y: 1 };
        }
    },
    ..TortuiseScript::empty()
};