From b962896e0d31667162b0a844e3f2186707b641ad Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Tue, 16 Nov 2021 23:44:14 +0100 Subject: Add GameMode and Log::game_mode For a lot of applications, it can be useful to distinguish between logs made in raids, fractals, ... Note that we probably don't want further categorization (as for example done in ezau). --- src/lib.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 823cd71..32af64c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -134,6 +134,27 @@ pub enum EvtcError { Utf8Error(#[from] std::str::Utf8Error), } +/// The game mode in which a log was produced. +/// +/// Note that the distinction made here is relatively arbitrary, but hopefully still useful. In +/// Guild Wars 2 terms, there is no clear definition of what a "game mode" is. +/// +/// The game mode of a [`Log`] is obtained through [`Log::game_mode()`]. +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] +pub enum GameMode { + /// The log is from a raid encounter. + Raid, + /// The log is from a fractal fight. + Fractal, + /// The log is from a strike mission. + Strike, + /// The log is from a training golem. + Golem, + /// The log is from a world-versus-world fight. + WvW, +} + /// A fully processed log file. #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[derive(Debug, Clone)] @@ -274,6 +295,33 @@ impl Log { pub fn is_generic(&self) -> bool { self.boss_id == 1 } + + /// Returns the game mode that the log was made in. + /// + /// Note that if the game mode cannot be determined or is unknown to `evtclib`, `None` is + /// returned. + pub fn game_mode(&self) -> Option { + // Here we assume that any generic log is a WvW log, I'm not aware of other generic logs + // being produced at the moment. + if self.is_generic() { + return Some(GameMode::WvW); + } + use Encounter::*; + match self.encounter()? { + MAMA | Siax | Ensolyss | Skorvald | Artsariiv | Arkk | Ai => Some(GameMode::Fractal), + + ValeGuardian | Gorseval | Sabetha | Slothasor | BanditTrio | Matthias + | KeepConstruct | Xera | Cairn | MursaatOverseer | Samarog | Deimos + | SoullessHorror | RiverOfSouls | BrokenKing | EaterOfSouls | StatueOfDarkness + | VoiceInTheVoid | ConjuredAmalgamate | TwinLargos | Qadim | CardinalAdina + | CardinalSabir | QadimThePeerless => Some(GameMode::Raid), + + IcebroodConstruct | Boneskinner | SuperKodanBrothers | FraenirOfJormag + | WhisperOfJormag => Some(GameMode::Strike), + + StandardKittyGolem | MediumKittyGolem | LargeKittyGolem => Some(GameMode::Golem), + } + } } /// Convenience data accessing funtions for [`Log`][Log]s. -- cgit v1.2.3