spring_ai_rs/ai_interface/callback/unit_def/
vision.rs

1use std::error::Error;
2
3use serde::{Deserialize, Serialize};
4
5use crate::get_callback;
6
7#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
8pub struct UnitVision {
9    pub ai_id: i32,
10    pub def_id: i32,
11}
12
13#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
14pub struct UnitVisionAll {
15    pub los_radius: f32,
16    pub air_los_radius: f32,
17    pub los_height: f32,
18    pub radar_radius: i32,
19    pub sonar_radius: i32,
20}
21
22impl UnitVision {
23    pub fn los_radius(&self) -> Result<f32, Box<dyn Error>> {
24        let get_los_radius_func = get_callback!(self.ai_id, UnitDef_getLosRadius)?;
25        Ok(unsafe { get_los_radius_func(self.ai_id, self.def_id) })
26    }
27
28    pub fn air_los_radius(&self) -> Result<f32, Box<dyn Error>> {
29        let get_air_los_radius_func = get_callback!(self.ai_id, UnitDef_getAirLosRadius)?;
30        Ok(unsafe { get_air_los_radius_func(self.ai_id, self.def_id) })
31    }
32
33    pub fn los_height(&self) -> Result<f32, Box<dyn Error>> {
34        let get_los_height_func = get_callback!(self.ai_id, UnitDef_getLosHeight)?;
35        Ok(unsafe { get_los_height_func(self.ai_id, self.def_id) })
36    }
37
38    pub fn radar_radius(&self) -> Result<i32, Box<dyn Error>> {
39        let get_radar_radius_func = get_callback!(self.ai_id, UnitDef_getRadarRadius)?;
40        Ok(unsafe { get_radar_radius_func(self.ai_id, self.def_id) })
41    }
42
43    pub fn sonar_radius(&self) -> Result<i32, Box<dyn Error>> {
44        let get_sonar_radius_func = get_callback!(self.ai_id, UnitDef_getSonarRadius)?;
45        Ok(unsafe { get_sonar_radius_func(self.ai_id, self.def_id) })
46    }
47
48    pub fn all(&self) -> Result<UnitVisionAll, Box<dyn Error>> {
49        Ok(UnitVisionAll {
50            los_radius: self.los_radius()?,
51            air_los_radius: self.air_los_radius()?,
52            los_height: self.los_height()?,
53            radar_radius: self.radar_radius()?,
54            sonar_radius: self.sonar_radius()?,
55        })
56    }
57}