evtc\agent/
breakbar.rs

1use crate::{extract::Extract, AgentId, Event, StateChange, TryExtract};
2use num_enum::{FromPrimitive, IntoPrimitive};
3
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6
7#[cfg(feature = "strum")]
8use strum::{Display, EnumCount, EnumIter, IntoStaticStr, VariantNames};
9
10/// Breakbar state change.
11#[derive(Debug, Clone)]
12#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
13pub struct BreakbarStateEvent {
14    /// Time of registering the breakbar state change.
15    pub time: u64,
16
17    /// Agent changing breakbar state.
18    pub agent: AgentId,
19
20    /// New breakbar state.
21    pub state: BreakbarState,
22}
23
24impl Extract for BreakbarStateEvent {
25    #[inline]
26    unsafe fn extract(event: &Event) -> Self {
27        Self {
28            time: event.time,
29            agent: AgentId::from_src(event),
30            state: (event.value as u16).into(),
31        }
32    }
33}
34
35impl TryExtract for BreakbarStateEvent {
36    #[inline]
37    fn can_extract(event: &Event) -> bool {
38        event.get_statechange() == StateChange::BreakbarState
39    }
40}
41
42/// Breakbar percent change.
43#[derive(Debug, Clone)]
44#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
45pub struct BreakbarPercentEvent {
46    /// Time of registering the breakbar health change.
47    pub time: u64,
48
49    /// Agent that had their breakbar health changed.
50    pub agent: AgentId,
51
52    /// New breakbar health in percent.
53    pub health: f32,
54}
55
56impl Extract for BreakbarPercentEvent {
57    #[inline]
58    unsafe fn extract(event: &Event) -> Self {
59        let health = f32::from_ne_bytes(event.value.to_ne_bytes());
60
61        Self {
62            time: event.time,
63            agent: AgentId::from_src(event),
64            health,
65        }
66    }
67}
68
69impl TryExtract for BreakbarPercentEvent {
70    #[inline]
71    fn can_extract(event: &Event) -> bool {
72        event.get_statechange() == StateChange::BreakbarPercent
73    }
74}
75
76/// Breakbar (defiance bar) states.
77///
78/// Occurs in [`StateChange::BreakbarState`](crate::StateChange::BreakbarState) events.
79#[derive(
80    Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, IntoPrimitive, FromPrimitive,
81)]
82#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
83#[cfg_attr(
84    feature = "strum",
85    derive(Display, EnumCount, EnumIter, IntoStaticStr, VariantNames)
86)]
87#[repr(u16)]
88pub enum BreakbarState {
89    /// Defiance bar active.
90    Active = 0,
91
92    /// Defiance bar recovering.
93    Recover = 1,
94
95    /// Defiance bar immune.
96    Immune = 2,
97
98    /// No defiance.
99    None = 3,
100
101    /// Unknown state.
102    #[num_enum(catch_all)]
103    Unknown(u16),
104}