diff options
-rw-r--r-- | src/statistics/trackers.rs | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/src/statistics/trackers.rs b/src/statistics/trackers.rs index 751b639..b64e586 100644 --- a/src/statistics/trackers.rs +++ b/src/statistics/trackers.rs @@ -15,7 +15,7 @@ use std::collections::HashMap; use std::error::Error; use super::super::{Event, EventKind, Log}; -use super::boon::{BoonQueue, BoonType}; +use super::boon::BoonQueue; use super::gamedata; use super::DamageStats; @@ -229,6 +229,9 @@ impl Tracker for CombatTimeTracker { /// /// Note that this also tracks conditions, because internally, they're handled /// the same way. +/// +/// This tracker only tracks the boons that are known to evtclib, that is the +/// boons defined in `evtclib::statistics::gamedata::BOONS`. #[derive(Default)] pub struct BoonTracker { boon_areas: HashMap<u64, HashMap<u16, u64>>, @@ -296,20 +299,27 @@ impl BoonTracker { /// /// * `agent` - The agent. /// * `buff_id` - The buff (or condition) id. - fn get_queue(&mut self, agent: u64, buff_id: u16) -> &mut BoonQueue { - // XXX: Properly differentiate between intensity and duration based - // boons, otherwise the results will be off. - self.boon_queues + fn get_queue(&mut self, agent: u64, buff_id: u16) -> Option<&mut BoonQueue> { + use std::collections::hash_map::Entry; + let mut entry = self.boon_queues .entry(agent) .or_insert_with(Default::default) - .entry(buff_id) - .or_insert_with(|| { - gamedata::get_boon(buff_id) - .map(gamedata::Boon::create_queue) - // For unknown boons, default to a duration-based counter - // with 5 stacks. - .unwrap_or_else(|| BoonQueue::new(5, BoonType::Duration)) - }) + .entry(buff_id); + match entry { + // Queue already exists + Entry::Occupied(e) => Some(e.into_mut()), + // Queue needs to be created, but only if we know about that boon. + Entry::Vacant(e) => { + let boon_queue = gamedata::get_boon(buff_id) + .map(gamedata::Boon::create_queue); + if let Some(queue) = boon_queue { + Some(e.insert(queue)) + } else { + None + } + } + + } } } @@ -333,8 +343,9 @@ impl Tracker for BoonTracker { duration, .. } => { - self.get_queue(destination_agent_addr, buff_id) - .add_stack(duration as u64); + if let Some(queue) = self.get_queue(destination_agent_addr, buff_id) { + queue.add_stack(duration as u64); + } self.update_next_update(); } @@ -344,7 +355,9 @@ impl Tracker for BoonTracker { buff_id, .. } => { - self.get_queue(destination_agent_addr, buff_id).clear(); + if let Some(queue) = self.get_queue(destination_agent_addr, buff_id) { + queue.clear(); + } self.update_next_update(); } |