spring_ai_rs/ai_interface/callback/unit/
weapon.rs1use 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}