spring_ai_rs/ai_interface/callback/weapon_def/
shield.rs1use 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 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}