gizmo_scripting/
api_ai.rs1use crate::commands::{CommandQueue, ScriptCommand};
6use gizmo_math::Vec3;
7use mlua::prelude::*;
8use std::sync::Arc;
9
10pub fn register_ai_api(lua: &Lua, command_queue: Arc<CommandQueue>) -> Result<(), LuaError> {
12 crate::api_table::register_protected(lua, "ai", |ai_table| {
13
14 {
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 {
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 {
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 #[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}