Skip to main content

gizmo_scripting/
api_ai.rs

1//! AI API — Lua'ya sunulan Yapay Zeka navigasyon fonksiyonları
2//!
3//! Lua scriptlerinden NPC ve ajanlara gitmeleri gereken hedefleri ayarlamayı sağlar.
4
5use crate::commands::{CommandQueue, ScriptCommand};
6use gizmo_math::Vec3;
7use mlua::prelude::*;
8use std::sync::Arc;
9
10/// AI API fonksiyonlarını Lua'ya kaydeder
11pub fn register_ai_api(lua: &Lua, command_queue: Arc<CommandQueue>) -> Result<(), LuaError> {
12    crate::api_table::register_protected(lua, "ai", |ai_table| {
13
14    // === SET TARGET ===
15    {
16        let cq = command_queue.clone();
17        ai_table.set(
18            "set_target",
19            lua.create_function(move |_, (id, x, y, z): (u32, f32, f32, f32)| {
20                cq.push(ScriptCommand::SetAiTarget(id, Vec3::new(x, y, z)));
21                Ok(())
22            })?,
23        )?;
24    }
25
26    // === CLEAR TARGET ===
27    {
28        let cq = command_queue.clone();
29        ai_table.set(
30            "clear_target",
31            lua.create_function(move |_, id: u32| {
32                cq.push(ScriptCommand::ClearAiTarget(id));
33                Ok(())
34            })?,
35        )?;
36    }
37
38    // === ADD AGENT ===
39    {
40        let cq = command_queue.clone();
41        ai_table.set(
42            "add_agent",
43            lua.create_function(move |_, id: u32| {
44                cq.push(ScriptCommand::AddNavAgent(id));
45                Ok(())
46            })?,
47        )?;
48    }
49
50        Ok(())
51    })
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57    use mlua::Lua;
58
59    /// ai.add_agent / set_target / clear_target doğru komutları kuyruğa yazmalı.
60    #[test]
61    fn ai_calls_push_expected_commands() {
62        let lua = Lua::new();
63        let cq = Arc::new(CommandQueue::new());
64        register_ai_api(&lua, cq.clone()).unwrap();
65
66        lua.load(
67            r#"
68            ai.add_agent(5)
69            ai.set_target(5, 10.0, 0.0, -4.0)
70            ai.clear_target(5)
71            "#,
72        )
73        .exec()
74        .unwrap();
75
76        let cmds = cq.drain();
77        assert_eq!(cmds.len(), 3);
78        assert!(matches!(cmds[0], ScriptCommand::AddNavAgent(5)));
79        match &cmds[1] {
80            ScriptCommand::SetAiTarget(id, target) => {
81                assert_eq!(*id, 5);
82                assert_eq!(*target, Vec3::new(10.0, 0.0, -4.0));
83            }
84            other => panic!("beklenen SetAiTarget, gelen {other:?}"),
85        }
86        assert!(matches!(cmds[2], ScriptCommand::ClearAiTarget(5)));
87    }
88}