aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/lib.rs48
-rw-r--r--tests/parsing.rs45
-rw-r--r--tests/wvw.rs1
4 files changed, 93 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 926a979..60d78c1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file.
- `Encounter::EaterOfSouls` (`Boss::EaterOfSouls`)
- `Encounter::StatueOfDarkness` (`Boss::EyeOfJudgment` and `Boss::EyeOfFate`)
- `Log::is_generic` to check whether a log is generic (WvW)
+- `GameMode` and the `Log::game_mode` method
- `FromRawEventError::UnknownLanguage` has been added to deal with an invalid
language byte.
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<GameMode> {
+ // 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.
diff --git a/tests/parsing.rs b/tests/parsing.rs
index 4949805..598bafd 100644
--- a/tests/parsing.rs
+++ b/tests/parsing.rs
@@ -3,10 +3,10 @@
use std::fs::File;
use std::io::BufReader;
-use evtclib::{EliteSpec::*, Encounter, Profession::*};
+use evtclib::{EliteSpec::*, Encounter, GameMode::*, Profession::*};
macro_rules! test {
- (name: $name:ident, log: $log:literal, boss: $boss:expr, players: $players:expr,) => {
+ (name: $name:ident, log: $log:literal, boss: $boss:expr, mode: $mode:expr, players: $players:expr,) => {
#[test]
fn $name() {
let mut file = BufReader::new(File::open(format!("tests/{}", $log)).unwrap());
@@ -14,6 +14,7 @@ macro_rules! test {
let log = evtclib::process(&log).expect("processing log failed");
assert_eq!(log.encounter(), Some($boss));
assert!(!log.is_generic());
+ assert_eq!(log.game_mode(), Some($mode));
let players = $players;
@@ -44,6 +45,7 @@ test! {
name: parse_vale_guardian,
log: "logs/vg-20200421.zevtc",
boss: Encounter::ValeGuardian,
+ mode: Raid,
players: &[
(4, ":AliceWindwalker.6238", "Fafnarin Sunseeker", Warrior, Some(Berserker)),
(4, ":Gellalli.6580", "Germi N", Revenant, Some(Renegade)),
@@ -62,6 +64,7 @@ test! {
name: parse_gorseval,
log: "logs/gorseval-20200421.zevtc",
boss: Encounter::Gorseval,
+ mode: Raid,
players: &[
(4, ":AliceWindwalker.6238", "Fafnarin Sunseeker", Warrior, Some(Berserker)),
(4, ":Gellalli.6580", "Germi N", Revenant, Some(Renegade)),
@@ -80,6 +83,7 @@ test! {
name: parse_sabetha,
log: "logs/sabetha-20200421.zevtc",
boss: Encounter::Sabetha,
+ mode: Raid,
players: &[
(4, ":AliceWindwalker.6238", "Fafnarin Sunseeker", Warrior, Some(Berserker)),
(4, ":Gellalli.6580", "Germi N", Revenant, Some(Renegade)),
@@ -100,6 +104,7 @@ test! {
name: parse_slothasor,
log: "logs/slothasor-20200420.zevtc",
boss: Encounter::Slothasor,
+ mode: Raid,
players: &[
(2, ":Basafrass.4138", "Miss Mary J", Guardian, Some(Dragonhunter)),
(2, ":Gellalli.6580", "Gellalli V", Guardian, Some(Dragonhunter)),
@@ -118,6 +123,7 @@ test! {
name: parse_bandit_trio,
log: "logs/trio-20210501.zevtc",
boss: Encounter::BanditTrio,
+ mode: Raid,
players: &[
(2, ":Dunje.4863", "Pallida Howhite", Warrior, Some(Berserker)),
(2, ":Straimer.1093", "Deepfreeze Myself", Elementalist, Some(Weaver)),
@@ -136,6 +142,7 @@ test! {
name: parse_matthias,
log: "logs/matthias-20200421.zevtc",
boss: Encounter::Matthias,
+ mode: Raid,
players: &[
(2, ":Basafrass.4138", "Miss Mary J", Guardian, Some(Dragonhunter)),
(2, ":Gellalli.6580", "Germi N", Revenant, Some(Renegade)),
@@ -156,6 +163,7 @@ test! {
name: parse_keep_construct,
log: "logs/kc-20200426.zevtc",
boss: Encounter::KeepConstruct,
+ mode: Raid,
players: &[
(3, ":Bomaga.2106", "Krupniczek", Guardian, Some(Dragonhunter)),
(3, ":Buddy Christ.1758", "Block Buddy", Guardian, Some(Dragonhunter)),
@@ -174,6 +182,7 @@ test! {
name: parse_xera,
log: "logs/xera-20200415.zevtc",
boss: Encounter::Xera,
+ mode: Raid,
players: &[
(2, ":Marcoliveira.7526", "Flamed Horns", Guardian, Some(Dragonhunter)),
(2, ":Marvin.4612", "Necro Rp", Necromancer, Some(Reaper)),
@@ -194,6 +203,7 @@ test! {
name: parse_cairn,
log: "logs/cairn-20200426.zevtc",
boss: Encounter::Cairn,
+ mode: Raid,
players: &[
(3, ":Bomaga.2106", "Krupniczek", Guardian, Some(Dragonhunter)),
(3, ":Buddy Christ.1758", "Block Buddy", Guardian, Some(Firebrand)),
@@ -212,6 +222,7 @@ test! {
name: parse_mursaat_overseer,
log: "logs/mo-20200426.zevtc",
boss: Encounter::MursaatOverseer,
+ mode: Raid,
players: &[
(3, ":Bomaga.2106", "Krupniczek", Guardian, Some(Dragonhunter)),
(3, ":Buddy Christ.1758", "Block Buddy", Guardian, Some(Dragonhunter)),
@@ -230,6 +241,7 @@ test! {
name: parse_samarog,
log: "logs/samarog-20200426.zevtc",
boss: Encounter::Samarog,
+ mode: Raid,
players: &[
(3, ":Bomaga.2106", "Krupniczek", Guardian, Some(Dragonhunter)),
(3, ":Buddy Christ.1758", "Block Buddy", Guardian, Some(Dragonhunter)),
@@ -248,6 +260,7 @@ test! {
name: parse_deimos,
log: "logs/deimos-20200428.zevtc",
boss: Encounter::Deimos,
+ mode: Raid,
players: &[
(2, ":CrusaderCody.6935", "Cody Quickfire", Guardian, Some(Firebrand)),
(2, ":Mrperfect.5213", "Hanna Kowalski", Revenant, Some(Renegade)),
@@ -268,6 +281,7 @@ test! {
name: parse_desmina,
log: "logs/desmina-20200425.zevtc",
boss: Encounter::SoullessHorror,
+ mode: Raid,
players: &[
(3, ":AliceWindwalker.6238", "Fafnarin Sunseeker", Warrior, Some(Berserker)),
(3, ":Dunje.4863", "Godric Gobbledygook", Mesmer, Some(Chronomancer)),
@@ -286,6 +300,7 @@ test! {
name: parse_river,
log: "logs/river-20210412.zevtc",
boss: Encounter::RiverOfSouls,
+ mode: Raid,
players: &[
(1, ":Baragos.2384", "Cicadania", Mesmer, Some(Chronomancer)),
(1, ":Jupp.4570", "Aldwor", Guardian, Some(Firebrand)),
@@ -304,6 +319,7 @@ test! {
name: parse_broken_king,
log: "logs/broken-king-20211115.zevtc",
boss: Encounter::BrokenKing,
+ mode: Raid,
players: &[
(1, ":Dunje.4863", "Pallida Howhite", Warrior, Some(Berserker)),
(1, ":Straimer.1093", "I Want Smite Back", Guardian, Some(Dragonhunter)),
@@ -322,6 +338,7 @@ test! {
name: parse_eater,
log: "logs/eater-20211115.zevtc",
boss: Encounter::EaterOfSouls,
+ mode: Raid,
players: &[
(1, ":Dunje.4863", "Pallida Howhite", Warrior, Some(Berserker)),
(1, ":Straimer.1093", "I Want Smite Back", Guardian, Some(Dragonhunter)),
@@ -340,6 +357,7 @@ test! {
name: parse_eyes,
log: "logs/eyes-20211115.zevtc",
boss: Encounter::StatueOfDarkness,
+ mode: Raid,
players: &[
(1, ":Dunje.4863", "Pallida Howhite", Warrior, Some(Berserker)),
(1, ":Straimer.1093", "I Want Smite Back", Guardian, Some(Dragonhunter)),
@@ -358,6 +376,7 @@ test! {
name: parse_dhuum,
log: "logs/dhuum-20200428.zevtc",
boss: Encounter::VoiceInTheVoid,
+ mode: Raid,
players: &[
(1, ":DaZzius.4753", "Amestye Aëther", Mesmer, Some(Chronomancer)),
(1, ":Dunje.4863", "Maho Shiina", Revenant, Some(Renegade)),
@@ -378,6 +397,7 @@ test! {
name: parse_conjured_amalgamate,
log: "logs/ca-20200426.zevtc",
boss: Encounter::ConjuredAmalgamate,
+ mode: Raid,
players: &[
(3, ":Admiral Aka Inu.4962", "Großadmiral Aka Inu", Warrior, Some(Berserker)),
(3, ":Dunje.4863", "Irodo", Elementalist, Some(Weaver)),
@@ -396,6 +416,7 @@ test! {
name: parse_largos_twins,
log: "logs/largos-20200426.zevtc",
boss: Encounter::TwinLargos,
+ mode: Raid,
players: &[
(3, ":Cyen Lazarus.4170", "Cyen Blackarrow", Ranger, Some(Druid)),
(3, ":Dunje.4863", "Godric Gobbledygook", Mesmer, Some(Mirage)),
@@ -414,6 +435,7 @@ test! {
name: parse_qadim,
log: "logs/qadim-20200427.zevtc",
boss: Encounter::Qadim,
+ mode: Raid,
players: &[
(3, ":Cyen Lazarus.4170", "Cyen Blackarrow", Ranger, Some(Druid)),
(3, ":Lopoeo.1594", "Glücklich Und Satt", Mesmer, Some(Chronomancer)),
@@ -434,6 +456,7 @@ test! {
name: parse_adina,
log: "logs/adina-20200427.zevtc",
boss: Encounter::CardinalAdina,
+ mode: Raid,
players: &[
(3, ":Arkady.3768", "Just Pakly", Engineer, Some(Holosmith)),
(3, ":Dunje.4863", "Peter Party", Ranger, Some(Soulbeast)),
@@ -452,6 +475,7 @@ test! {
name: parse_sabir,
log: "logs/sabir-20200427.zevtc",
boss: Encounter::CardinalSabir,
+ mode: Raid,
players: &[
(3, ":Arkady.3768", "Just Pakly", Engineer, Some(Holosmith)),
(3, ":Dunje.4863", "Emma Hydes", Elementalist, Some(Weaver)),
@@ -470,6 +494,7 @@ test! {
name: parse_qadim_the_peerless,
log: "logs/qadimp-20200427.zevtc",
boss: Encounter::QadimThePeerless,
+ mode: Raid,
players: &[
(3, ":AliceWindwalker.6238", "Fafnarin Sunseeker", Warrior, Some(Berserker)),
(3, ":Arkady.3768", "Just Pakly", Engineer, Some(Holosmith)),
@@ -490,6 +515,7 @@ test! {
name: parse_standard_kitty_golem,
log: "logs/standard-golem-20211112.zevtc",
boss: Encounter::StandardKittyGolem,
+ mode: Golem,
players: &[
(1, ":Dunje.4863", "Ai Higashi", Guardian, Some(Dragonhunter)),
],
@@ -499,6 +525,7 @@ test! {
name: parse_medium_kitty_golem,
log: "logs/medium-golem-20211112.zevtc",
boss: Encounter::MediumKittyGolem,
+ mode: Golem,
players: &[
(1, ":Dunje.4863", "Ai Higashi", Guardian, Some(Dragonhunter)),
],
@@ -508,6 +535,7 @@ test! {
name: parse_large_kitty_golem,
log: "logs/large-golem-20211112.zevtc",
boss: Encounter::LargeKittyGolem,
+ mode: Golem,
players: &[
(1, ":Dunje.4863", "Ai Higashi", Guardian, Some(Dragonhunter)),
],
@@ -519,6 +547,7 @@ test! {
name: parse_ai,
log: "logs/ai-20200922.zevtc",
boss: Encounter::Ai,
+ mode: Fractal,
players: &[
(0, ":Dunje.4863", "Padme Amidada", Guardian, Some(Firebrand)),
(0, ":Speeaaakmaan.8974", "Damage Modifiers", Guardian, Some(Firebrand)),
@@ -534,6 +563,7 @@ test! {
name: parse_skorvald,
log: "logs/skorvald-20200427.zevtc",
boss: Encounter::Skorvald,
+ mode: Fractal,
players: &[
(0, ":Dunje.4863", "Jane Whiskerlisp", Revenant, Some(Renegade)),
(0, ":Gellalli.6580", "Germi X", Ranger, Some(Soulbeast)),
@@ -547,6 +577,7 @@ test! {
name: parse_artsariiv,
log: "logs/artsariiv-20200427.zevtc",
boss: Encounter::Artsariiv,
+ mode: Fractal,
players: &[
(0, ":Dunje.4863", "Jane Whiskerlisp", Revenant, Some(Renegade)),
(0, ":Gellalli.6580", "Germi X", Ranger, Some(Soulbeast)),
@@ -560,6 +591,7 @@ test! {
name: parse_arkk,
log: "logs/arkk-20200427.zevtc",
boss: Encounter::Arkk,
+ mode: Fractal,
players: &[
(0, ":Dunje.4863", "Jane Whiskerlisp", Revenant, Some(Renegade)),
(0, ":Gellalli.6580", "Germi X", Ranger, Some(Soulbeast)),
@@ -575,6 +607,7 @@ test! {
name: parse_mama,
log: "logs/mama-20200427.zevtc",
boss: Encounter::MAMA,
+ mode: Fractal,
players: &[
(0, ":Dunje.4863", "Jane Whiskerlisp", Revenant, Some(Renegade)),
(0, ":Gellalli.6580", "Germi X", Ranger, Some(Soulbeast)),
@@ -588,6 +621,7 @@ test! {
name: parse_siax,
log: "logs/siax-20200427.zevtc",
boss: Encounter::Siax,
+ mode: Fractal,
players: &[
(0, ":Dunje.4863", "Jane Whiskerlisp", Revenant, Some(Renegade)),
(0, ":Gellalli.6580", "Germi X", Ranger, Some(Soulbeast)),
@@ -601,6 +635,7 @@ test! {
name: parse_ensolyss,
log: "logs/ensolyss-20200427.zevtc",
boss: Encounter::Ensolyss,
+ mode: Fractal,
players: &[
(0, ":Dunje.4863", "Jane Whiskerlisp", Revenant, Some(Renegade)),
(0, ":Gellalli.6580", "Germi X", Ranger, Some(Soulbeast)),
@@ -616,6 +651,7 @@ test! {
name: parse_icebrood,
log: "logs/icebrood-20200424.zevtc",
boss: Encounter::IcebroodConstruct,
+ mode: Strike,
players: &[
(3, ":Dunje.4863", "Thank You Exorcist", Necromancer, Some(Reaper)),
(3, ":Speeaaakmaan.8974", "Damage Modifiers", Guardian, Some(Firebrand)),
@@ -634,6 +670,7 @@ test! {
name: parse_kodan_brothers,
log: "logs/kodans-20200424.zevtc",
boss: Encounter::SuperKodanBrothers,
+ mode: Strike,
players: &[
(3, ":Gellalli.6580", "Germi J", Necromancer, Some(Scourge)),
(3, ":Speeaaakmaan.8974", "Damage Modifiers", Guardian, Some(Firebrand)),
@@ -652,6 +689,7 @@ test! {
name: parse_fraenir_of_jormag,
log: "logs/fraenir-20200424.zevtc",
boss: Encounter::FraenirOfJormag,
+ mode: Strike,
players: &[
(3, ":Dunje.4863", "Thank You Exorcist", Necromancer, Some(Reaper)),
(3, ":Speeaaakmaan.8974", "Damage Modifiers", Guardian, Some(Firebrand)),
@@ -670,6 +708,7 @@ test! {
name: parse_boneskinner,
log: "logs/boneskinner-20200424.zevtc",
boss: Encounter::Boneskinner,
+ mode: Strike,
players: &[
(3, ":Gellalli.6580", "Germi J", Necromancer, Some(Scourge)),
(3, ":Speeaaakmaan.8974", "Damage Modifiers", Guardian, Some(Firebrand)),
@@ -688,6 +727,7 @@ test! {
name: parse_whisper_of_jormag,
log: "logs/whisper-20200424.zevtc",
boss: Encounter::WhisperOfJormag,
+ mode: Strike,
players: &[
(3, ":Gellalli.6580", "Germi J", Necromancer, Some(Scourge)),
(3, ":Speeaaakmaan.8974", "Damage Modifiers", Guardian, Some(Firebrand)),
@@ -708,6 +748,7 @@ test! {
name: parse_old_cairn_log,
log: "logs/old-cairn-20180321.evtc.zip",
boss: Encounter::Cairn,
+ mode: Raid,
players: &[
(1, ":Medejz.1679", "Nuerha", Guardian, Some(Firebrand)),
(1, ":ONEVA.5860", "Berserkoala", Revenant, Some(Renegade)),
diff --git a/tests/wvw.rs b/tests/wvw.rs
index 5af15c7..6ff35cf 100644
--- a/tests/wvw.rs
+++ b/tests/wvw.rs
@@ -8,4 +8,5 @@ fn test_smoke() {
let log = "./tests/logs/wvw-20211112.zevtc";
let log = evtclib::process_file(log, evtclib::Compression::Zip).unwrap();
assert!(log.is_generic());
+ assert_eq!(log.game_mode(), Some(evtclib::GameMode::WvW));
}