diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/analyzers/raids/w6.rs | 6 | ||||
| -rw-r--r-- | src/gamedata.rs | 151 | ||||
| -rw-r--r-- | src/lib.rs | 12 | 
3 files changed, 112 insertions, 57 deletions
| diff --git a/src/analyzers/raids/w6.rs b/src/analyzers/raids/w6.rs index 11fd02e..97a2094 100644 --- a/src/analyzers/raids/w6.rs +++ b/src/analyzers/raids/w6.rs @@ -1,7 +1,7 @@  //! Boss fight analyzers for Wing 6 (Mythwright Gambit)  use crate::{      analyzers::{helpers, Analyzer, Outcome}, -    gamedata::{KENUT_ID, NIKARE_ID}, +    gamedata::Boss,      EventKind, Log,  }; @@ -100,9 +100,9 @@ impl<'log> Analyzer for TwinLargos<'log> {                      continue;                  }; -                if agent.id() == NIKARE_ID { +                if agent.id() == Boss::Nikare as u16 {                      nikare_dead = true; -                } else if agent.id() == KENUT_ID { +                } else if agent.id() == Boss::Kenut as u16 {                      kenut_dead = true;                  }              } diff --git a/src/gamedata.rs b/src/gamedata.rs index d307802..1f38b0e 100644 --- a/src/gamedata.rs +++ b/src/gamedata.rs @@ -16,59 +16,60 @@ use thiserror::Error;  /// inducing a breaking change.  #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, FromPrimitive)]  #[non_exhaustive] +#[repr(u16)]  pub enum Encounter {      // Wing 1 -    ValeGuardian = 0x3C4E, -    Gorseval = 0x3C45, -    Sabetha = 0x3C0F, +    ValeGuardian = Boss::ValeGuardian as u16, +    Gorseval = Boss::Gorseval as u16, +    Sabetha = Boss::Sabetha as u16,      // Wing 2 -    Slothasor = 0x3EFB, -    Matthias = 0x3EF3, +    Slothasor = Boss::Slothasor as u16, +    Matthias = Boss::Matthias as u16,      // Wing 3 -    KeepConstruct = 0x3F6B, -    Xera = 0x3F76, +    KeepConstruct = Boss::KeepConstruct as u16, +    Xera = Boss::Xera as u16,      // Wing 4 -    Cairn = 0x432A, -    MursaatOverseer = 0x4314, -    Samarog = 0x4324, -    Deimos = 0x4302, +    Cairn = Boss::Cairn as u16, +    MursaatOverseer = Boss::MursaatOverseer as u16, +    Samarog = Boss::Samarog as u16, +    Deimos = Boss::Deimos as u16,      // Wing 5 -    SoullessHorror = 0x4D37, -    VoiceInTheVoid = 0x4BFA, +    SoullessHorror = Boss::SoullessHorror as u16, +    VoiceInTheVoid = Boss::Dhuum as u16,      // Wing 6 -    ConjuredAmalgamate = 0xABC6, -    TwinLargos = 0x5271, -    Qadim = 0x51C6, +    ConjuredAmalgamate = Boss::ConjuredAmalgamate as u16, +    TwinLargos = Boss::Nikare as u16, +    Qadim = Boss::Qadim as u16,      // Wing 7 -    CardinalAdina = 0x55F6, -    CardinalSabir = 0x55CC, -    QadimThePeerless = 0x55F0, +    CardinalAdina = Boss::CardinalAdina as u16, +    CardinalSabir = Boss::CardinalSabir as u16, +    QadimThePeerless = Boss::QadimThePeerless as u16,      // 100 CM (Sunqua Peak) -    Ai = 0x5AD6, +    Ai = Boss::Ai as u16,      // 99 CM (Shattered Observatory) -    Skorvald = 0x44E0, -    Artsariiv = 0x461D, -    Arkk = 0x455F, +    Skorvald = Boss::Skorvald as u16, +    Artsariiv = Boss::Artsariiv as u16, +    Arkk = Boss::Arkk as u16,      // 98 CM (Nightmare) -    MAMA = 0x427D, -    Siax = 0x4284, -    Ensolyss = 0x4234, +    MAMA = Boss::MAMA as u16, +    Siax = Boss::Siax as u16, +    Ensolyss = Boss::Ensolyss as u16,      // Strike missions -    IcebroodConstruct = 0x568A, -    SuperKodanBrothers = 0x5747, -    FraenirOfJormag = 0x57DC, -    Boneskinner = 0x57F9, -    WhisperOfJormag = 0x58B7, +    IcebroodConstruct = Boss::IcebroodConstruct as u16, +    SuperKodanBrothers = Boss::VoiceOfTheFallen as u16, +    FraenirOfJormag = Boss::FraenirOfJormag as u16, +    Boneskinner = Boss::Boneskinner as u16, +    WhisperOfJormag = Boss::WhisperOfJormag as u16,  }  /// Error for when converting a string to an encounter fails. @@ -168,23 +169,79 @@ impl Display for Encounter {      }  } -/// ID for Xera in the second phase. +/// Enum containing all boss IDs. +/// +/// For a high-level event categorization, take a look at the [`Encounter`] enum. The IDs listed +/// here are for a more fine-grained control, i.e. if you need to check a specific boss for +/// something.  /// -/// The original Xera will despawn, and after the tower phase, a separate spawn -/// will take over. This new Xera will have this ID. Care needs to be taken when -/// calculating boss damage on this encounter, as both Xeras have to be taken -/// into account. -pub const XERA_PHASE2_ID: u16 = 0x3F9E; - -/// The ID of Nikare in the Twin Largos fight. -pub const NIKARE_ID: u16 = Encounter::TwinLargos as u16; -/// The ID of Kenut in the Twin Largos fight. -pub const KENUT_ID: u16 = 21089; - -/// The ID of the Voice of the Fallen. -pub const VOICE_OF_THE_FALLEN_ID: u16 = Encounter::SuperKodanBrothers as u16; -/// The ID of the Claw of the Fallen. -pub const CLAW_OF_THE_FALLEN_ID: u16 = 22481; +/// This enum is non-exhaustive to ensure that future added bosses can be added without +/// inducing a breaking change. +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, FromPrimitive)] +#[non_exhaustive] +#[repr(u16)] +pub enum Boss { +    // Wing 1 +    ValeGuardian = 0x3C4E, +    Gorseval = 0x3C45, +    Sabetha = 0x3C0F, + +    // Wing 2 +    Slothasor = 0x3EFB, +    Matthias = 0x3EF3, + +    // Wing 3 +    KeepConstruct = 0x3F6B, +    Xera = 0x3F76, +    /// ID for Xera in the second phase. +    /// +    /// The original Xera will despawn, and after the tower phase, a separate spawn will take over. +    /// This new Xera will have this ID. Care needs to be taken when calculating boss damage on +    /// this encounter, as both Xeras have to be taken into account. +    Xera2 = 0x3F9E, + +    // Wing 4 +    Cairn = 0x432A, +    MursaatOverseer = 0x4314, +    Samarog = 0x4324, +    Deimos = 0x4302, + +    // Wing 5 +    SoullessHorror = 0x4D37, +    Dhuum = 0x4BFA, + +    // Wing 6 +    ConjuredAmalgamate = 0xABC6, +    Nikare = 0x5271, +    Kenut = 0x5261, +    Qadim = 0x51C6, + +    // Wing 7 +    CardinalAdina = 0x55F6, +    CardinalSabir = 0x55CC, +    QadimThePeerless = 0x55F0, + +    // 100 CM (Sunqua Peak) +    Ai = 0x5AD6, + +    // 99 CM (Shattered Observatory) +    Skorvald = 0x44E0, +    Artsariiv = 0x461D, +    Arkk = 0x455F, + +    // 98 CM (Nightmare) +    MAMA = 0x427D, +    Siax = 0x4284, +    Ensolyss = 0x4234, + +    // Strike missions +    IcebroodConstruct = 0x568A, +    VoiceOfTheFallen = 0x5747, +    ClawOfTheFallen = 0x57D1, +    FraenirOfJormag = 0x57DC, +    Boneskinner = 0x57F9, +    WhisperOfJormag = 0x58B7, +}  /// Error for when converting a string to a profession fails.  #[derive(Debug, Clone, PartialEq, Eq, Hash, Error)] @@ -104,6 +104,7 @@ mod processing;  pub use processing::{process, process_file, process_stream, Compression};  pub mod gamedata; +use gamedata::Boss;  pub use gamedata::{EliteSpec, Encounter, Profession};  pub mod analyzers; @@ -759,14 +760,11 @@ impl Log {      /// agents are needed.      pub fn boss_agents(&self) -> Vec<&Agent> {          let boss_ids = if self.boss_id == Encounter::Xera as u16 { -            vec![self.boss_id, gamedata::XERA_PHASE2_ID] +            vec![self.boss_id, Boss::Xera2 as u16]          } else if self.boss_id == Encounter::TwinLargos as u16 { -            vec![gamedata::NIKARE_ID, gamedata::KENUT_ID] +            vec![Boss::Nikare as u16, Boss::Kenut as u16]          } else if self.encounter() == Some(Encounter::SuperKodanBrothers) { -            vec![ -                gamedata::VOICE_OF_THE_FALLEN_ID, -                gamedata::CLAW_OF_THE_FALLEN_ID, -            ] +            vec![Boss::VoiceOfTheFallen as u16, Boss::ClawOfTheFallen as u16]          } else {              vec![self.boss_id]          }; @@ -797,7 +795,7 @@ impl Log {          // Sometimes, encounters of the strike mission "Voice of the Fallen and Claw of the Fallen"          // are saved with the ID of the Claw and sometimes with the Voice. Therefore, we need to          // unify those cases. -        if self.boss_id == gamedata::CLAW_OF_THE_FALLEN_ID { +        if self.boss_id == Boss::ClawOfTheFallen as u16 {              return Some(Encounter::SuperKodanBrothers);          }          Encounter::from_u16(self.boss_id) | 
