spring_ai_rs/ai_interface/callback/weapon_def/
shield.rs

1use std::{collections::HashMap, error::Error};
2
3use crate::{
4    ai_interface::{callback::resource::Resource, AIInterface},
5    get_callback,
6};
7
8#[derive(Debug, Copy, Clone)]
9pub struct WeaponShield {
10    pub ai_id: i32,
11    pub weapon_def_id: i32,
12}
13
14#[derive(Debug, Clone)]
15pub struct WeaponShieldAll {
16    repulser: bool,
17    smart: bool,
18    exterior: bool,
19    resource_use: HashMap<Resource, f32>,
20    radius: f32,
21    force: f32,
22    max_speed: f32,
23    power: f32,
24    power_regen: f32,
25    power_regen_resource: HashMap<Resource, f32>,
26    starting_power: f32,
27    recharge_delay: i32,
28}
29
30impl WeaponShield {
31    pub fn repulser(&self) -> Result<bool, Box<dyn Error>> {
32        let get_shield_repulser = get_callback!(self.ai_id, WeaponDef_isShieldRepulser)?;
33        Ok(unsafe { get_shield_repulser(self.ai_id, self.weapon_def_id) })
34    }
35
36    pub fn smart(&self) -> Result<bool, Box<dyn Error>> {
37        let get_shield_smart = get_callback!(self.ai_id, WeaponDef_isSmartShield)?;
38        Ok(unsafe { get_shield_smart(self.ai_id, self.weapon_def_id) })
39    }
40
41    pub fn exterior(&self) -> Result<bool, Box<dyn Error>> {
42        let get_shield_exterior = get_callback!(self.ai_id, WeaponDef_isExteriorShield)?;
43        Ok(unsafe { get_shield_exterior(self.ai_id, self.weapon_def_id) })
44    }
45
46    pub fn resource_use(&self, resource: Resource) -> Result<f32, Box<dyn Error>> {
47        let get_shield_resource_use = get_callback!(self.ai_id, WeaponDef_Shield_getResourceUse)?;
48        Ok(
49            unsafe {
50                get_shield_resource_use(self.ai_id, self.weapon_def_id, resource.resource_id)
51            },
52        )
53    }
54
55    pub fn radius(&self) -> Result<f32, Box<dyn Error>> {
56        let get_shield_radius = get_callback!(self.ai_id, WeaponDef_Shield_getRadius)?;
57        Ok(unsafe { get_shield_radius(self.ai_id, self.weapon_def_id) })
58    }
59
60    pub fn force(&self) -> Result<f32, Box<dyn Error>> {
61        let get_shield_force = get_callback!(self.ai_id, WeaponDef_Shield_getForce)?;
62        Ok(unsafe { get_shield_force(self.ai_id, self.weapon_def_id) })
63    }
64
65    pub fn max_speed(&self) -> Result<f32, Box<dyn Error>> {
66        let get_shield_max_speed = get_callback!(self.ai_id, WeaponDef_Shield_getMaxSpeed)?;
67        Ok(unsafe { get_shield_max_speed(self.ai_id, self.weapon_def_id) })
68    }
69
70    pub fn power(&self) -> Result<f32, Box<dyn Error>> {
71        let get_shield_power = get_callback!(self.ai_id, WeaponDef_Shield_getPower)?;
72        Ok(unsafe { get_shield_power(self.ai_id, self.weapon_def_id) })
73    }
74
75    pub fn power_regen(&self) -> Result<f32, Box<dyn Error>> {
76        let get_shield_power_regen = get_callback!(self.ai_id, WeaponDef_Shield_getPowerRegen)?;
77        Ok(unsafe { get_shield_power_regen(self.ai_id, self.weapon_def_id) })
78    }
79
80    pub fn power_regen_resource(&self, resource: Resource) -> Result<f32, Box<dyn Error>> {
81        let get_shield_power_regen_resource =
82            get_callback!(self.ai_id, WeaponDef_Shield_getPowerRegenResource)?;
83        Ok(unsafe {
84            get_shield_power_regen_resource(self.ai_id, self.weapon_def_id, resource.resource_id)
85        })
86    }
87
88    pub fn starting_power(&self) -> Result<f32, Box<dyn Error>> {
89        let get_shield_starting_power =
90            get_callback!(self.ai_id, WeaponDef_Shield_getStartingPower)?;
91        Ok(unsafe { get_shield_starting_power(self.ai_id, self.weapon_def_id) })
92    }
93
94    pub fn recharge_delay(&self) -> Result<i32, Box<dyn Error>> {
95        let get_shield_recharge_delay =
96            get_callback!(self.ai_id, WeaponDef_Shield_getRechargeDelay)?;
97        Ok(unsafe { get_shield_recharge_delay(self.ai_id, self.weapon_def_id) })
98    }
99
100    // TODO: InterceptType
101
102    pub fn all(&self) -> Result<WeaponShieldAll, Box<dyn Error>> {
103        Ok(WeaponShieldAll {
104            repulser: self.repulser()?,
105            smart: self.smart()?,
106            exterior: self.exterior()?,
107            resource_use: AIInterface::new(self.ai_id)
108                .resource_interface()
109                .get_resources()?
110                .into_iter()
111                .filter_map(|resource| {
112                    if let Ok(res) = self.resource_use(resource) {
113                        Some((resource, res))
114                    } else {
115                        None
116                    }
117                })
118                .collect(),
119            radius: self.radius()?,
120            force: self.force()?,
121            max_speed: self.max_speed()?,
122            power: self.power()?,
123            power_regen: self.power_regen()?,
124            power_regen_resource: AIInterface::new(self.ai_id)
125                .resource_interface()
126                .get_resources()?
127                .into_iter()
128                .filter_map(|resource| {
129                    if let Ok(res) = self.power_regen_resource(resource) {
130                        Some((resource, res))
131                    } else {
132                        None
133                    }
134                })
135                .collect(),
136            starting_power: self.starting_power()?,
137            recharge_delay: self.recharge_delay()?,
138        })
139    }
140}