aboutsummaryrefslogtreecommitdiff
path: root/src/statistics
diff options
context:
space:
mode:
Diffstat (limited to 'src/statistics')
-rw-r--r--src/statistics/gamedata.rs38
-rw-r--r--src/statistics/mod.rs1
-rw-r--r--src/statistics/trackers.rs21
3 files changed, 57 insertions, 3 deletions
diff --git a/src/statistics/gamedata.rs b/src/statistics/gamedata.rs
new file mode 100644
index 0000000..d7f0e0e
--- /dev/null
+++ b/src/statistics/gamedata.rs
@@ -0,0 +1,38 @@
+//! This module contains some game data that is necessary to correctly calculate
+//! some statistics.
+use super::boon::{BoonQueue, BoonType};
+
+/// Contains a boon.
+///
+/// Fields:
+/// * boon id
+/// * name (english) (just for easier debugging)
+/// * maximum number of stacks
+/// * boon type (intensity or duration)
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct Boon(pub u16, pub &'static str, pub u32, pub BoonType);
+
+impl Boon {
+ pub fn create_queue(&self) -> BoonQueue {
+ BoonQueue::new(self.2, self.3)
+ }
+}
+
+/// A list of all boons (and conditions)
+pub static BOONS: &[Boon] = &[
+ // Standard boons.
+ // Queue size for duration based boons are wonky, more or less guess work.
+ Boon(717, "Protection", 5, BoonType::Duration),
+ Boon(718, "Regeneration", 5, BoonType::Duration),
+ Boon(719, "Swiftness", 5, BoonType::Duration),
+ Boon(725, "Fury", 5, BoonType::Duration),
+ Boon(726, "Vigor", 5, BoonType::Duration),
+ Boon(740, "Might", 25, BoonType::Intensity),
+ Boon(743, "Aegis", 5, BoonType::Duration),
+ Boon(1187, "Quickness", 5, BoonType::Duration),
+ Boon(30328, "Alacrity", 9, BoonType::Duration),
+];
+
+pub fn get_boon(boon_id: u16) -> Option<&'static Boon> {
+ BOONS.iter().find(|b| b.0 == boon_id)
+}
diff --git a/src/statistics/mod.rs b/src/statistics/mod.rs
index 0a524ea..7f465ae 100644
--- a/src/statistics/mod.rs
+++ b/src/statistics/mod.rs
@@ -4,6 +4,7 @@ use std::collections::HashMap;
use std::error::Error;
pub mod boon;
+pub mod gamedata;
pub mod trackers;
use self::trackers::{RunnableTracker, Tracker};
diff --git a/src/statistics/trackers.rs b/src/statistics/trackers.rs
index 9b8d633..751b639 100644
--- a/src/statistics/trackers.rs
+++ b/src/statistics/trackers.rs
@@ -16,6 +16,7 @@ use std::error::Error;
use super::super::{Event, EventKind, Log};
use super::boon::{BoonQueue, BoonType};
+use super::gamedata;
use super::DamageStats;
// A support macro to introduce a new block.
@@ -237,8 +238,6 @@ pub struct BoonTracker {
}
impl BoonTracker {
- const MAX_STACKS: u32 = 25;
-
/// Creates a new boon tracker.
pub fn new() -> BoonTracker {
Default::default()
@@ -304,7 +303,13 @@ impl BoonTracker {
.entry(agent)
.or_insert_with(Default::default)
.entry(buff_id)
- .or_insert_with(|| BoonQueue::new(Self::MAX_STACKS, BoonType::Intensity))
+ .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))
+ })
}
}
@@ -333,6 +338,16 @@ impl Tracker for BoonTracker {
self.update_next_update();
}
+ // XXX: Properly handle SINGLE and MANUAL removal types
+ EventKind::BuffRemove {
+ destination_agent_addr,
+ buff_id,
+ ..
+ } => {
+ self.get_queue(destination_agent_addr, buff_id).clear();
+ self.update_next_update();
+ }
+
_ => (),
}