Skip to main content

gizmo_scripting/
api_vehicle.rs

1//! Vehicle API — Lua'ya sunulan araç kontrol fonksiyonları
2//!
3//! Lua scriptlerinden VehicleController bileşenine gaz, fren ve direksiyon komutları yolları sağlar.
4
5use crate::commands::{CommandQueue, ScriptCommand};
6use mlua::prelude::*;
7use std::sync::Arc;
8
9/// Vehicle API fonksiyonlarını Lua'ya kaydeder
10pub fn register_vehicle_api(lua: &Lua, command_queue: Arc<CommandQueue>) -> Result<(), LuaError> {
11    crate::api_table::register_protected(lua, "vehicle", |vehicle_table| {
12
13    // === ENGINE FORCE (GAZ) ===
14    {
15        let cq = command_queue.clone();
16        vehicle_table.set(
17            "set_engine_force",
18            lua.create_function(move |_, (id, force): (u32, f32)| {
19                cq.push(ScriptCommand::SetVehicleEngineForce(id, force));
20                Ok(())
21            })?,
22        )?;
23    }
24
25    // === STEERING (DİREKSİYON) ===
26    {
27        let cq = command_queue.clone();
28        vehicle_table.set(
29            "set_steering",
30            lua.create_function(move |_, (id, angle): (u32, f32)| {
31                cq.push(ScriptCommand::SetVehicleSteering(id, angle));
32                Ok(())
33            })?,
34        )?;
35    }
36
37    // === BRAKE (FREN) ===
38    {
39        let cq = command_queue.clone();
40        vehicle_table.set(
41            "set_brake",
42            lua.create_function(move |_, (id, force): (u32, f32)| {
43                cq.push(ScriptCommand::SetVehicleBrake(id, force));
44                Ok(())
45            })?,
46        )?;
47    }
48
49        Ok(())
50    })
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56    use mlua::Lua;
57
58    /// vehicle.set_engine_force / set_steering / set_brake doğru komutları,
59    /// negatif değerleri (geri vites / sola direksiyon) koruyarak kuyruğa yazmalı.
60    #[test]
61    fn vehicle_calls_push_expected_commands() {
62        let lua = Lua::new();
63        let cq = Arc::new(CommandQueue::new());
64        register_vehicle_api(&lua, cq.clone()).unwrap();
65
66        lua.load(
67            r#"
68            vehicle.set_engine_force(3, 1500.0)
69            vehicle.set_steering(3, -0.35)
70            vehicle.set_brake(3, 800.0)
71            "#,
72        )
73        .exec()
74        .unwrap();
75
76        let cmds = cq.drain();
77        assert_eq!(cmds.len(), 3);
78        match cmds[0] {
79            ScriptCommand::SetVehicleEngineForce(id, f) => {
80                assert_eq!(id, 3);
81                assert!((f - 1500.0).abs() < 1e-3);
82            }
83            ref other => panic!("beklenen SetVehicleEngineForce, gelen {other:?}"),
84        }
85        match cmds[1] {
86            ScriptCommand::SetVehicleSteering(id, a) => {
87                assert_eq!(id, 3);
88                assert!((a - (-0.35)).abs() < 1e-6, "negatif direksiyon korunmalı");
89            }
90            ref other => panic!("beklenen SetVehicleSteering, gelen {other:?}"),
91        }
92        match cmds[2] {
93            ScriptCommand::SetVehicleBrake(id, f) => {
94                assert_eq!(id, 3);
95                assert!((f - 800.0).abs() < 1e-3);
96            }
97            ref other => panic!("beklenen SetVehicleBrake, gelen {other:?}"),
98        }
99    }
100}