spring_ai_rs/ai_interface/callback/unit_def/
aircraft.rs

1use std::error::Error;
2
3use serde::{Deserialize, Serialize};
4
5use crate::get_callback;
6
7#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
8pub struct UnitAircraft {
9    pub ai_id: i32,
10    pub def_id: i32,
11}
12
13#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
14pub enum HoverFactor {
15    CanLand(u32),
16    HoverDrift(u32),
17}
18
19impl From<i32> for HoverFactor {
20    fn from(i: i32) -> Self {
21        if i < 0 {
22            HoverFactor::CanLand((i * -1) as u32)
23        } else {
24            HoverFactor::HoverDrift(i as u32)
25        }
26    }
27}
28
29#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
30pub struct UnitAircraftAll {
31    pub wing_drag: f32,
32    pub wing_angle: f32,
33    pub front_to_speed: f32,
34    pub speed_to_front: f32,
35    pub gravity: f32,
36    pub max_bank: f32,
37    pub max_pitch: f32,
38    pub turn_radius: f32,
39    pub wanted_height: f32,
40    pub vertical_speed: f32,
41    pub max_acceleration: f32,
42    pub max_deceleration: f32,
43    pub max_aileron: f32,
44    pub max_elevator: f32,
45    pub max_rudder: f32,
46    pub dl_hover_factor: f32,
47}
48
49impl UnitAircraft {
50    pub fn wing_drag(&self) -> Result<f32, Box<dyn Error>> {
51        let get_wing_drag_func = get_callback!(self.ai_id, UnitDef_getWingDrag)?;
52        Ok(unsafe { get_wing_drag_func(self.ai_id, self.def_id) })
53    }
54
55    pub fn wing_angle(&self) -> Result<f32, Box<dyn Error>> {
56        let get_wing_angle_func = get_callback!(self.ai_id, UnitDef_getWingAngle)?;
57        Ok(unsafe { get_wing_angle_func(self.ai_id, self.def_id) })
58    }
59
60    pub fn front_to_speed(&self) -> Result<f32, Box<dyn Error>> {
61        let get_front_to_speed_func = get_callback!(self.ai_id, UnitDef_getFrontToSpeed)?;
62        Ok(unsafe { get_front_to_speed_func(self.ai_id, self.def_id) })
63    }
64
65    pub fn speed_to_front(&self) -> Result<f32, Box<dyn Error>> {
66        let get_speed_to_front_func = get_callback!(self.ai_id, UnitDef_getSpeedToFront)?;
67        Ok(unsafe { get_speed_to_front_func(self.ai_id, self.def_id) })
68    }
69
70    pub fn gravity(&self) -> Result<f32, Box<dyn Error>> {
71        let get_my_gravity_func = get_callback!(self.ai_id, UnitDef_getMyGravity)?;
72        Ok(unsafe { get_my_gravity_func(self.ai_id, self.def_id) })
73    }
74
75    pub fn max_bank(&self) -> Result<f32, Box<dyn Error>> {
76        let get_max_bank_func = get_callback!(self.ai_id, UnitDef_getMaxBank)?;
77        Ok(unsafe { get_max_bank_func(self.ai_id, self.def_id) })
78    }
79
80    pub fn max_pitch(&self) -> Result<f32, Box<dyn Error>> {
81        let get_max_pitch_func = get_callback!(self.ai_id, UnitDef_getMaxPitch)?;
82        Ok(unsafe { get_max_pitch_func(self.ai_id, self.def_id) })
83    }
84
85    pub fn turn_radius(&self) -> Result<f32, Box<dyn Error>> {
86        let get_turn_radius_func = get_callback!(self.ai_id, UnitDef_getTurnRadius)?;
87        Ok(unsafe { get_turn_radius_func(self.ai_id, self.def_id) })
88    }
89
90    pub fn wanted_height(&self) -> Result<f32, Box<dyn Error>> {
91        let get_wanted_height_func = get_callback!(self.ai_id, UnitDef_getWantedHeight)?;
92        Ok(unsafe { get_wanted_height_func(self.ai_id, self.def_id) })
93    }
94
95    pub fn vertical_speed(&self) -> Result<f32, Box<dyn Error>> {
96        let get_vertical_speed_func = get_callback!(self.ai_id, UnitDef_getVerticalSpeed)?;
97        Ok(unsafe { get_vertical_speed_func(self.ai_id, self.def_id) })
98    }
99
100    pub fn max_acceleration(&self) -> Result<f32, Box<dyn Error>> {
101        let get_max_acceleration_func = get_callback!(self.ai_id, UnitDef_getMaxAcceleration)?;
102        Ok(unsafe { get_max_acceleration_func(self.ai_id, self.def_id) })
103    }
104
105    pub fn max_deceleration(&self) -> Result<f32, Box<dyn Error>> {
106        let get_max_deceleration_func = get_callback!(self.ai_id, UnitDef_getMaxDeceleration)?;
107        Ok(unsafe { get_max_deceleration_func(self.ai_id, self.def_id) })
108    }
109
110    pub fn max_aileron(&self) -> Result<f32, Box<dyn Error>> {
111        let get_max_aileron_func = get_callback!(self.ai_id, UnitDef_getMaxAileron)?;
112        Ok(unsafe { get_max_aileron_func(self.ai_id, self.def_id) })
113    }
114
115    pub fn max_elevator(&self) -> Result<f32, Box<dyn Error>> {
116        let get_max_elevator_func = get_callback!(self.ai_id, UnitDef_getMaxElevator)?;
117        Ok(unsafe { get_max_elevator_func(self.ai_id, self.def_id) })
118    }
119
120    pub fn max_rudder(&self) -> Result<f32, Box<dyn Error>> {
121        let get_max_rudderfunc = get_callback!(self.ai_id, UnitDef_getMaxRudder)?;
122        Ok(unsafe { get_max_rudderfunc(self.ai_id, self.def_id) })
123    }
124
125    pub fn dl_hover_factor(&self) -> Result<f32, Box<dyn Error>> {
126        let get_dl_hover_factor_func = get_callback!(self.ai_id, UnitDef_getDlHoverFactor)?;
127        Ok(unsafe { get_dl_hover_factor_func(self.ai_id, self.def_id) })
128    }
129
130    pub fn all(&self) -> Result<UnitAircraftAll, Box<dyn Error>> {
131        Ok(UnitAircraftAll {
132            wing_drag: self.wing_drag()?,
133            wing_angle: self.wing_angle()?,
134            front_to_speed: self.front_to_speed()?,
135            speed_to_front: self.speed_to_front()?,
136            gravity: self.gravity()?,
137            max_bank: self.max_bank()?,
138            max_pitch: self.max_pitch()?,
139            turn_radius: self.turn_radius()?,
140            wanted_height: self.wanted_height()?,
141            vertical_speed: self.vertical_speed()?,
142            max_acceleration: self.max_acceleration()?,
143            max_deceleration: self.max_deceleration()?,
144            max_aileron: self.max_aileron()?,
145            max_elevator: self.max_elevator()?,
146            max_rudder: self.max_rudder()?,
147            dl_hover_factor: self.dl_hover_factor()?,
148        })
149    }
150}