diff options
Diffstat (limited to 'src/raw')
| -rw-r--r-- | src/raw/parser.rs | 6 | ||||
| -rw-r--r-- | src/raw/types.rs | 157 | 
2 files changed, 132 insertions, 31 deletions
| diff --git a/src/raw/parser.rs b/src/raw/parser.rs index eaf8e6b..dcc7f2f 100644 --- a/src/raw/parser.rs +++ b/src/raw/parser.rs @@ -76,7 +76,7 @@ use thiserror::Error;  use super::*;  /// EVTC file header. -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)]  pub struct Header {      /// arcpds build date, as `yyyymmdd` string.      pub arcdps_build: String, @@ -92,7 +92,7 @@ pub struct Header {  ///  /// Note that this struct does not yet do any preprocessing of the events. It is simply a  /// representation of the input file as a structured object. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)]  pub struct Evtc {      /// The file header values.      pub header: Header, @@ -110,7 +110,7 @@ pub struct Evtc {  ///  /// This can speed up parsing for applications which can work with the header, as the event stream  /// is the largest chunk of data that has to be parsed. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)]  pub struct PartialEvtc {      /// The file header values.      pub header: Header, diff --git a/src/raw/types.rs b/src/raw/types.rs index 2e1958c..339b831 100644 --- a/src/raw/types.rs +++ b/src/raw/types.rs @@ -4,8 +4,10 @@  use num_derive::FromPrimitive;  use std::{self, fmt}; +use std::hash::{Hash, Hasher}; +  /// The "friend or foe" enum. -#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]  pub enum IFF {      /// Green vs green, red vs red.      Friend, @@ -17,8 +19,14 @@ pub enum IFF {      None,  } +impl Default for IFF { +    fn default() -> Self { +        IFF::None +    } +} +  /// Combat result (physical) -#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]  pub enum CbtResult {      /// Good physical hit      Normal, @@ -44,8 +52,14 @@ pub enum CbtResult {      None,  } +impl Default for CbtResult { +    fn default() -> Self { +        CbtResult::None +    } +} +  /// Combat activation -#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]  pub enum CbtActivation {      /// Field is not used in this kind of event.      None, @@ -61,11 +75,17 @@ pub enum CbtActivation {      Reset,  } +impl Default for CbtActivation { +    fn default() -> Self { +        CbtActivation::None +    } +} +  /// Combat state change  ///  /// The referenced fields are of the [`CbtEvent`](struct.CbtEvent.html)  /// struct. -#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]  pub enum CbtStateChange {      /// Field is not used in this kind of event.      None, @@ -177,8 +197,14 @@ pub enum CbtStateChange {      SkillTiming,  } +impl Default for CbtStateChange { +    fn default() -> Self { +        CbtStateChange::None +    } +} +  /// Combat buff remove type -#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]  pub enum CbtBuffRemove {      /// Field is not used in this kind of event.      None, @@ -194,8 +220,14 @@ pub enum CbtBuffRemove {      Manual,  } +impl Default for CbtBuffRemove { +    fn default() -> Self { +        CbtBuffRemove::None +    } +} +  /// Custom skill ids -#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]  pub enum CbtCustomSkill {      /// Not custom but important and unnamed.      Resurrect = 1066, @@ -206,7 +238,7 @@ pub enum CbtCustomSkill {  }  /// Language -#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]  pub enum Language {      /// English.      Eng = 0, @@ -218,6 +250,12 @@ pub enum Language {      Spa = 4,  } +impl Default for Language { +    fn default() -> Self { +        Language::Eng +    } +} +  /// A combat event.  ///  /// This event combines both the old structure and the new structure. Fields not @@ -225,7 +263,7 @@ pub enum Language {  /// to check the header.revision tag.  ///  /// For conflicting data types, the bigger one is chosen (e.g. u32 over u16). -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)]  pub struct CbtEvent {      /// System time since Windows was started, in milliseconds.      pub time: u64, @@ -314,22 +352,63 @@ impl Agent {      }  } +// We need to implement this manually, as our array is bigger than 32. +  impl fmt::Debug for Agent {      fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -        write!( -            f, -            "Agent {{ addr: {}, \ -             prof: {}, is_elite: {}, toughness: {}, concentration: {}, \ -             healing: {}, condition: {}, name: {} }}", -            self.addr, -            self.prof, -            self.is_elite, -            self.toughness, -            self.concentration, -            self.healing, -            self.condition, -            String::from_utf8_lossy(&self.name) -        ) +        f.debug_struct("Agent") +            .field("addr", &self.addr) +            .field("prof", &self.prof) +            .field("is_elite", &self.is_elite) +            .field("toughness", &self.toughness) +            .field("concentration", &self.concentration) +            .field("healing", &self.healing) +            .field("condition", &self.condition) +            .field("name", &(&self.name as &[u8])) +            .finish() +    } +} + +impl PartialEq for Agent { +    fn eq(&self, other: &Self) -> bool { +        self.addr == other.addr && +            self.prof == other.prof && +            self.is_elite == other.is_elite && +            self.toughness == other.toughness && +            self.concentration == other.concentration && +            self.healing == other.healing && +            self.condition == other.condition && +            &self.name as &[u8] == &other.name as &[u8] +    } +} + +impl Eq for Agent {} + +impl Hash for Agent { +    fn hash<H: Hasher>(&self, state: &mut H) { +        self.addr.hash(state); +        self.prof.hash(state); +        self.is_elite.hash(state); +        self.toughness.hash(state); +        self.concentration.hash(state); +        self.healing.hash(state); +        self.condition.hash(state); +        self.name.hash(state); +    } +} + +impl Default for Agent { +    fn default() -> Self { +        Self { +            addr: Default::default(), +            prof: Default::default(), +            is_elite: Default::default(), +            toughness: Default::default(), +            concentration: Default::default(), +            healing: Default::default(), +            condition: Default::default(), +            name: [0; 64], +        }      }  } @@ -359,11 +438,33 @@ impl Skill {  impl fmt::Debug for Skill {      fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -        write!( -            f, -            "Skill {{ id: {}, name: {:?} }}", -            self.id, -            self.name_string() -        ) +        f.debug_struct("Skill") +            .field("id", &self.id) +            .field("name", &(&self.name as &[u8])) +            .finish() +    } +} + +impl PartialEq for Skill { +    fn eq(&self, other: &Self) -> bool { +        self.id == other.id && &self.name as &[u8] == &other.name as &[u8] +    } +} + +impl Eq for Skill {} + +impl Hash for Skill { +    fn hash<H: Hasher>(&self, state: &mut H) { +        self.id.hash(state); +        self.name.hash(state); +    } +} + +impl Default for Skill { +    fn default() -> Self { +        Self { +            id: Default::default(), +            name: [0; 64], +        }      }  } | 
