spring_ai_rs/ai_interface/callback/unit_def/
transport.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 UnitTransport {
9    pub ai_id: i32,
10    pub def_id: i32,
11}
12
13#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
14pub enum TransportMethod {
15    LandUnload,
16    FlyOverDrop,
17    LandFlood,
18}
19
20impl From<i32> for TransportMethod {
21    fn from(i: i32) -> Self {
22        match i {
23            0 => TransportMethod::LandUnload,
24            1 => TransportMethod::FlyOverDrop,
25            _ => TransportMethod::LandFlood,
26        }
27    }
28}
29
30#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
31pub struct UnitTransportAll {
32    pub loading_radius: f32,
33    pub unload_spread: f32,
34    pub transport_capacity: i32,
35    pub transport_size: i32,
36    pub min_transport_size: i32,
37    pub air_base: bool,
38    pub fire_platform: bool,
39    pub transport_mass: f32,
40    pub min_transport_mass: f32,
41    pub hold_steady: bool,
42    pub release_held: bool,
43    pub not_transportable: bool,
44    pub transport_by_enemy: bool,
45    pub transport_unload_method: TransportMethod,
46    pub fall_speed: f32,
47    pub unit_fall_speed: f32,
48}
49
50impl UnitTransport {
51    pub fn loading_radius(&self) -> Result<f32, Box<dyn Error>> {
52        let get_loading_radius_func = get_callback!(self.ai_id, UnitDef_getLoadingRadius)?;
53        Ok(unsafe { get_loading_radius_func(self.ai_id, self.def_id) })
54    }
55
56    pub fn unload_spread(&self) -> Result<f32, Box<dyn Error>> {
57        let get_unload_spread_func = get_callback!(self.ai_id, UnitDef_getUnloadSpread)?;
58        Ok(unsafe { get_unload_spread_func(self.ai_id, self.def_id) })
59    }
60
61    pub fn transport_capacity(&self) -> Result<i32, Box<dyn Error>> {
62        let get_transport_capacity_func = get_callback!(self.ai_id, UnitDef_getTransportCapacity)?;
63        Ok(unsafe { get_transport_capacity_func(self.ai_id, self.def_id) })
64    }
65
66    pub fn transport_size(&self) -> Result<i32, Box<dyn Error>> {
67        let get_transport_size_func = get_callback!(self.ai_id, UnitDef_getTransportSize)?;
68        Ok(unsafe { get_transport_size_func(self.ai_id, self.def_id) })
69    }
70
71    pub fn min_transport_size(&self) -> Result<i32, Box<dyn Error>> {
72        let get_min_transport_size_func = get_callback!(self.ai_id, UnitDef_getMinTransportSize)?;
73        Ok(unsafe { get_min_transport_size_func(self.ai_id, self.def_id) })
74    }
75
76    pub fn air_base(&self) -> Result<bool, Box<dyn Error>> {
77        let get_air_base_func = get_callback!(self.ai_id, UnitDef_isAirBase)?;
78        Ok(unsafe { get_air_base_func(self.ai_id, self.def_id) })
79    }
80
81    pub fn fire_platform(&self) -> Result<bool, Box<dyn Error>> {
82        let get_fire_platform_func = get_callback!(self.ai_id, UnitDef_isFirePlatform)?;
83        Ok(unsafe { get_fire_platform_func(self.ai_id, self.def_id) })
84    }
85
86    pub fn transport_mass(&self) -> Result<f32, Box<dyn Error>> {
87        let get_transport_mass_func = get_callback!(self.ai_id, UnitDef_getTransportMass)?;
88        Ok(unsafe { get_transport_mass_func(self.ai_id, self.def_id) })
89    }
90
91    pub fn min_transport_mass(&self) -> Result<f32, Box<dyn Error>> {
92        let get_min_transport_mass_func = get_callback!(self.ai_id, UnitDef_getMinTransportMass)?;
93        Ok(unsafe { get_min_transport_mass_func(self.ai_id, self.def_id) })
94    }
95
96    pub fn hold_steady(&self) -> Result<bool, Box<dyn Error>> {
97        let get_hold_steady_func = get_callback!(self.ai_id, UnitDef_isHoldSteady)?;
98        Ok(unsafe { get_hold_steady_func(self.ai_id, self.def_id) })
99    }
100
101    pub fn release_held(&self) -> Result<bool, Box<dyn Error>> {
102        let get_release_held_func = get_callback!(self.ai_id, UnitDef_isReleaseHeld)?;
103        Ok(unsafe { get_release_held_func(self.ai_id, self.def_id) })
104    }
105
106    pub fn not_transportable(&self) -> Result<bool, Box<dyn Error>> {
107        let get_not_transportable_func = get_callback!(self.ai_id, UnitDef_isNotTransportable)?;
108        Ok(unsafe { get_not_transportable_func(self.ai_id, self.def_id) })
109    }
110
111    pub fn transport_by_enemy(&self) -> Result<bool, Box<dyn Error>> {
112        let get_transport_by_enemy_func = get_callback!(self.ai_id, UnitDef_isTransportByEnemy)?;
113        Ok(unsafe { get_transport_by_enemy_func(self.ai_id, self.def_id) })
114    }
115
116    pub fn transport_unload_method(&self) -> Result<TransportMethod, Box<dyn Error>> {
117        let get_transport_unload_method_func =
118            get_callback!(self.ai_id, UnitDef_getTransportUnloadMethod)?;
119        Ok(TransportMethod::from(unsafe {
120            get_transport_unload_method_func(self.ai_id, self.def_id)
121        }))
122    }
123
124    pub fn fall_speed(&self) -> Result<f32, Box<dyn Error>> {
125        let get_fall_speed_func = get_callback!(self.ai_id, UnitDef_getFallSpeed)?;
126        Ok(unsafe { get_fall_speed_func(self.ai_id, self.def_id) })
127    }
128
129    pub fn unit_fall_speed(&self) -> Result<f32, Box<dyn Error>> {
130        let get_unit_fall_speed_func = get_callback!(self.ai_id, UnitDef_getUnitFallSpeed)?;
131        Ok(unsafe { get_unit_fall_speed_func(self.ai_id, self.def_id) })
132    }
133
134    pub fn all(&self) -> Result<UnitTransportAll, Box<dyn Error>> {
135        Ok(UnitTransportAll {
136            loading_radius: self.loading_radius()?,
137            unload_spread: self.unload_spread()?,
138            transport_capacity: self.transport_capacity()?,
139            transport_size: self.transport_size()?,
140            min_transport_size: self.min_transport_size()?,
141            air_base: self.air_base()?,
142            fire_platform: self.fire_platform()?,
143            transport_mass: self.transport_mass()?,
144            min_transport_mass: self.min_transport_mass()?,
145            hold_steady: self.hold_steady()?,
146            release_held: self.release_held()?,
147            not_transportable: self.not_transportable()?,
148            transport_by_enemy: self.transport_by_enemy()?,
149            transport_unload_method: self.transport_unload_method()?,
150            fall_speed: self.fall_speed()?,
151            unit_fall_speed: self.unit_fall_speed()?,
152        })
153    }
154}