From 2ac9d19ef91545a43dfde2bbdd986090695454d1 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Thu, 2 Aug 2018 01:35:24 +0200 Subject: add more wing 1 mechanics --- src/event.rs | 4 +++- src/raw/types.rs | 4 ++-- src/statistics/gamedata.rs | 18 +++++++++++++++++- src/statistics/trackers.rs | 36 ++++++++++++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/event.rs b/src/event.rs index 0e83660..4d25a9f 100644 --- a/src/event.rs +++ b/src/event.rs @@ -200,7 +200,9 @@ impl Event { reward_type: raw_event.value, }, // XXX: implement proper handling of those events! - CbtStateChange::BuffInitial | CbtStateChange::Position | CbtStateChange::Velocity => return None, + CbtStateChange::BuffInitial | CbtStateChange::Position | CbtStateChange::Velocity => { + return None + } CbtStateChange::None => if let Some(kind) = check_activation(raw_event) { kind diff --git a/src/raw/types.rs b/src/raw/types.rs index f131eb1..2453350 100644 --- a/src/raw/types.rs +++ b/src/raw/types.rs @@ -127,9 +127,9 @@ pub enum CbtStateChange { /// buff==18) BuffInitial, /// src_agent changed, cast float* p = (float*)&dst_agent, access as x/y/z (float[3]) - Position, + Position, /// src_agent changed, cast float* v = (float*)&dst_agent, access as x/y/z (float[3]) - Velocity, + Velocity, } /// Combat buff remove type diff --git a/src/statistics/gamedata.rs b/src/statistics/gamedata.rs index 80f269e..6f370d0 100644 --- a/src/statistics/gamedata.rs +++ b/src/statistics/gamedata.rs @@ -6,6 +6,8 @@ use super::boon::{BoonQueue, BoonType}; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum Boss { ValeGuardian = 0x3C4E, + Gorseval = 0x3C45, + Sabetha = 0x3C0F, /// Xera ID for phase 1. /// @@ -140,9 +142,23 @@ macro_rules! mechanics { /// A slice of all mechanics that we know about. pub static MECHANICS: &[Mechanic] = mechanics! { + // Wing 1 Boss::ValeGuardian => [ - "Unstable Magic Spike" => Trigger::SkillOnPlayer(31860), + // Teleport: + "Unstable Magic Spike" => Trigger::SkillOnPlayer(31392), ], + Boss::Gorseval => [ + // Slam + "Spectral Impact" => Trigger::SkillOnPlayer(31875), + // Egg + "Ghastly Prison" => Trigger::BoonPlayer(31623), + ], + Boss::Sabetha => [ + // Took the launch pad + "Shell-Shocked" => Trigger::BoonPlayer(34108), + ], + + // Wing 4 Boss::Samarog => [ "Prisoner Sweep" => Trigger::SkillOnPlayer(38168), "Shockwave" => Trigger::SkillOnPlayer(37996), diff --git a/src/statistics/trackers.rs b/src/statistics/trackers.rs index d8a9656..66a7bf8 100644 --- a/src/statistics/trackers.rs +++ b/src/statistics/trackers.rs @@ -395,14 +395,42 @@ impl Tracker for MechanicTracker { .. }, Trigger::SkillOnPlayer(trigger_id), - ) if skill_id == trigger_id - && self.is_boss(*source_agent_addr) - && *result != CbtResult::Evade - && *result != CbtResult::Block => + ) + if skill_id == trigger_id + && self.is_boss(*source_agent_addr) + && *result != CbtResult::Evade + && *result != CbtResult::Absorb + && *result != CbtResult::Block => { self.log .increase(event.time, mechanic, *destination_agent_addr); } + + ( + EventKind::BuffApplication { + destination_agent_addr, + buff_id, + .. + }, + Trigger::BoonPlayer(trigger_id), + ) + if buff_id == trigger_id => + { + // Some buff applications are registered multiple times. So + // instead of counting those quick successions separately + // (and thus having a wrong count), we check if this + // mechanic has already been logged "shortly before" (10 millisecons). + if self + .log + .count_between(event.time - 10, event.time + 1, |m, w| { + &m == mechanic && w == *destination_agent_addr + }) + == 0 + { + self.log + .increase(event.time, mechanic, *destination_agent_addr); + } + } _ => (), } } -- cgit v1.2.3