Skip to main content

dis_rs/common/detonation/
model.rs

1use crate::BodyRaw;
2use crate::common::detonation::builder::DetonationBuilder;
3use crate::common::model::{
4    EntityId, EventId, ExpendableDescriptor, ExplosionDescriptor, Location, MunitionDescriptor,
5    PduBody, VariableParameter, VectorF32,
6};
7use crate::common::{BodyInfo, Interaction};
8use crate::constants::VARIABLE_PARAMETER_RECORD_LENGTH;
9use crate::enumerations::{DetonationResult, PduType};
10use alloc::vec::Vec;
11#[cfg(feature = "serde")]
12use serde::{Deserialize, Serialize};
13
14const BASE_DETONATION_BODY_LENGTH: u16 = 92;
15
16#[derive(Clone, Debug, Default, PartialEq)]
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18pub struct Detonation {
19    pub source_entity_id: EntityId,
20    pub target_entity_id: EntityId,
21    pub exploding_entity_id: EntityId,
22    pub event_id: EventId,
23    pub velocity: VectorF32,
24    pub location_in_world_coordinates: Location,
25    pub descriptor: DetonationDescriptor,
26    pub location_in_entity_coordinates: VectorF32,
27    pub detonation_result: DetonationResult,
28    pub variable_parameters: Vec<VariableParameter>,
29}
30
31impl BodyRaw for Detonation {
32    type Builder = DetonationBuilder;
33
34    fn builder() -> Self::Builder {
35        Self::Builder::new()
36    }
37
38    fn into_builder(self) -> Self::Builder {
39        Self::Builder::new_from_body(self)
40    }
41
42    fn into_pdu_body(self) -> PduBody {
43        PduBody::Detonation(self)
44    }
45}
46
47impl BodyInfo for Detonation {
48    fn body_length(&self) -> u16 {
49        BASE_DETONATION_BODY_LENGTH
50            + (VARIABLE_PARAMETER_RECORD_LENGTH * (self.variable_parameters.len() as u16))
51    }
52
53    fn body_type(&self) -> PduType {
54        PduType::Detonation
55    }
56}
57
58impl Interaction for Detonation {
59    fn originator(&self) -> Option<&EntityId> {
60        Some(&self.source_entity_id)
61    }
62
63    fn receiver(&self) -> Option<&EntityId> {
64        Some(&self.target_entity_id)
65    }
66}
67
68/// 6.2.19 Detonation Descriptor record
69#[derive(Clone, Debug, PartialEq)]
70#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
71pub enum DetonationDescriptor {
72    #[cfg_attr(feature = "serde", serde(rename = "munition"))]
73    Munition(MunitionDescriptor),
74    #[cfg_attr(feature = "serde", serde(rename = "explosion"))]
75    Explosion(ExplosionDescriptor),
76    #[cfg_attr(feature = "serde", serde(rename = "expendable"))]
77    Expendable(ExpendableDescriptor),
78}
79
80impl Default for DetonationDescriptor {
81    fn default() -> Self {
82        Self::Munition(MunitionDescriptor::default())
83    }
84}
85
86impl From<MunitionDescriptor> for DetonationDescriptor {
87    #[inline]
88    fn from(value: MunitionDescriptor) -> Self {
89        Self::Munition(value)
90    }
91}
92
93impl From<ExplosionDescriptor> for DetonationDescriptor {
94    #[inline]
95    fn from(value: ExplosionDescriptor) -> Self {
96        Self::Explosion(value)
97    }
98}
99
100impl From<ExpendableDescriptor> for DetonationDescriptor {
101    #[inline]
102    fn from(value: ExpendableDescriptor) -> Self {
103        Self::Expendable(value)
104    }
105}