evtc\effect/
agent.rs
1use crate::extract::transmute_field;
2use crate::AgentId;
3use crate::{extract::Extract, Event, StateChange, TryExtract};
4
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct AgentEffect {
12 pub time: u64,
14
15 pub source: AgentId,
17
18 pub target: AgentId,
20
21 pub effect_id: u32,
25
26 pub duration: u32,
28
29 pub tracking_id: u32,
31}
32
33impl Extract for AgentEffect {
34 #[inline]
35 unsafe fn extract(event: &Event) -> Self {
36 let effect_id = event.skill_id;
37 let duration = transmute_field!(event.affinity as u32);
38
39 Self {
40 time: event.time,
41 source: AgentId::from_src(event),
42 target: AgentId::from_dst(event),
43 effect_id,
44 duration,
45 tracking_id: event.get_pad_id(),
46 }
47 }
48}
49
50impl TryExtract for AgentEffect {
51 #[inline]
52 fn can_extract(event: &Event) -> bool {
53 event.get_statechange() == StateChange::EffectAgentCreate
54 }
55}
56
57#[derive(Debug, Clone)]
59#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
60pub struct AgentEffectRemove {
61 pub time: u64,
63
64 pub agent: AgentId,
66
67 pub tracking_id: u32,
69}
70
71impl Extract for AgentEffectRemove {
72 #[inline]
73 unsafe fn extract(event: &Event) -> Self {
74 Self {
75 time: event.time,
76 agent: AgentId::from_src(event),
77 tracking_id: event.get_pad_id(),
78 }
79 }
80}
81
82impl TryExtract for AgentEffectRemove {
83 #[inline]
84 fn can_extract(event: &Event) -> bool {
85 event.get_statechange() == StateChange::EffectAgentRemove
86 }
87}