spring_ai_rs/ai_interface/callback/unit_def/
aircraft.rs1use 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}