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