spring_ai_rs/ai_interface/callback/unit/
weapon.rs

1use std::error::Error;
2
3use crate::{ai_interface::callback::weapon_def::WeaponDef, get_callback};
4
5#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
6pub struct UnitWeapon {
7    pub ai_id: i32,
8    pub unit_id: i32,
9    pub weapon_id: i32,
10}
11
12#[derive(Debug, Clone)]
13pub struct UnitWeaponInterface {
14    pub ai_id: i32,
15}
16
17#[derive(Debug, Clone)]
18pub struct UnitWeaponAll {
19    weapon_def_id: WeaponDef,
20    reload_frame: i32,
21    reload_time: i32,
22    range: f32,
23    shield_enabled: bool,
24    shield_power: f32,
25}
26
27const MAX_WEAPON_DEFS: usize = 128;
28
29impl UnitWeapon {
30    pub fn weapon_def(&self) -> Result<WeaponDef, Box<dyn Error>> {
31        let get_weapon_def = get_callback!(self.ai_id, Unit_Weapon_getReloadFrame)?;
32        let weapon_def_id = unsafe { get_weapon_def(self.ai_id, self.unit_id, self.weapon_id) };
33        Ok(WeaponDef {
34            ai_id: self.ai_id,
35            weapon_def_id,
36        })
37    }
38
39    pub fn reload_frame(&self) -> Result<i32, Box<dyn Error>> {
40        let get_reload_frame = get_callback!(self.ai_id, Unit_Weapon_getReloadFrame)?;
41        Ok(unsafe { get_reload_frame(self.ai_id, self.unit_id, self.weapon_id) })
42    }
43
44    pub fn reload_time(&self) -> Result<i32, Box<dyn Error>> {
45        let get_reload_time = get_callback!(self.ai_id, Unit_Weapon_getReloadTime)?;
46        Ok(unsafe { get_reload_time(self.ai_id, self.unit_id, self.weapon_id) })
47    }
48
49    pub fn range(&self) -> Result<f32, Box<dyn Error>> {
50        let get_reload_range = get_callback!(self.ai_id, Unit_Weapon_getRange)?;
51        Ok(unsafe { get_reload_range(self.ai_id, self.unit_id, self.weapon_id) })
52    }
53
54    pub fn shield_enabled(&self) -> Result<bool, Box<dyn Error>> {
55        let get_shield_enabled = get_callback!(self.ai_id, Unit_Weapon_isShieldEnabled)?;
56        Ok(unsafe { get_shield_enabled(self.ai_id, self.unit_id, self.weapon_id) })
57    }
58
59    pub fn shield_power(&self) -> Result<f32, Box<dyn Error>> {
60        let get_shield_power = get_callback!(self.ai_id, Unit_Weapon_getShieldPower)?;
61        Ok(unsafe { get_shield_power(self.ai_id, self.unit_id, self.weapon_id) })
62    }
63
64    pub fn all(&self) -> Result<UnitWeaponAll, Box<dyn Error>> {
65        Ok(UnitWeaponAll {
66            weapon_def_id: self.weapon_def()?,
67            reload_frame: self.reload_frame()?,
68            reload_time: self.reload_time()?,
69            range: self.range()?,
70            shield_enabled: self.shield_enabled()?,
71            shield_power: self.shield_power()?,
72        })
73    }
74}