aboutsummaryrefslogtreecommitdiff
path: root/src/statistics.rs
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2018-04-25 13:32:11 +0200
committerDaniel Schadt <kingdread@gmx.de>2018-04-25 13:32:11 +0200
commit7d35d1a4ecf4d7fe6689c83defd9163b7a66f915 (patch)
tree433250fe3db638068d3190a17ef2d3f31ddf7293 /src/statistics.rs
parent4ea20d5a7d75c77a36bd4baf768226e3089b48ae (diff)
downloadevtclib-7d35d1a4ecf4d7fe6689c83defd9163b7a66f915.tar.gz
evtclib-7d35d1a4ecf4d7fe6689c83defd9163b7a66f915.tar.bz2
evtclib-7d35d1a4ecf4d7fe6689c83defd9163b7a66f915.zip
add basic boon queue support
This is already pretty good to calculate the overall boon uptime/average stacks.
Diffstat (limited to 'src/statistics.rs')
-rw-r--r--src/statistics.rs170
1 files changed, 0 insertions, 170 deletions
diff --git a/src/statistics.rs b/src/statistics.rs
deleted file mode 100644
index af208ce..0000000
--- a/src/statistics.rs
+++ /dev/null
@@ -1,170 +0,0 @@
-//! This module aids in the creation of actual boss statistics.
-use super::*;
-use std::collections::HashMap;
-
-pub type StatResult<T> = Result<T, StatError>;
-
-quick_error! {
- #[derive(Clone, Debug)]
- pub enum StatError {
- }
-}
-
-/// A struct containing the calculated statistics for the log.
-#[derive(Clone, Debug)]
-pub struct Statistics {
- /// A map mapping agent addresses to their stats.
- pub agent_stats: HashMap<u64, AgentStats>,
-}
-
-/// A struct describing the agent statistics.
-#[derive(Clone, Debug, Default)]
-pub struct AgentStats {
- /// Damage done per target during the fight.
- ///
- /// Maps from target address to the damage done to this target.
- pub per_target_damage: HashMap<u64, DamageStats>,
- /// Total damage dealt during the fight.
- pub total_damage: DamageStats,
- /// Damage directed to the boss.
- pub boss_damage: DamageStats,
- /// Time when the agent has entered combat (millseconds since log start).
- pub enter_combat: u64,
- /// Time when the agent has left combat (millseconds since log start).
- pub exit_combat: u64,
-}
-
-impl AgentStats {
- /// Returns the combat time of this agent in milliseconds.
- pub fn combat_time(&self) -> u64 {
- self.exit_combat - self.enter_combat
- }
-}
-
-/// Damage statistics for a given target.
-#[derive(Debug, Clone, Copy, Default)]
-pub struct DamageStats {
- /// The total damage of the player, including all minions/pets/...
- pub total_damage: u64,
- /// The condition damage that the player dealt.
- pub condition_damage: u64,
- /// The power damage that the player dealt.
- pub power_damage: u64,
- /// The damage that was done by minions/pets/...
- pub add_damage: u64,
-}
-
-// A support macro to introduce a new block.
-//
-// Doesn't really require a macro, but it's nicer to look at
-// with! { foo = bar }
-// rather than
-// { let foo = bar; ... }
-macro_rules! with {
- ($name:ident = $expr:expr => $bl:block) => {{
- let $name = $expr;
- $bl
- }};
-}
-
-/// Calculate the statistics for the given log.
-pub fn calculate(log: &Log) -> StatResult<Statistics> {
- use super::EventKind::*;
-
- let mut agent_stats = HashMap::<u64, AgentStats>::new();
- let mut log_start_time = 0;
-
- fn get_stats(map: &mut HashMap<u64, AgentStats>, source: u64, target: u64) -> &mut DamageStats {
- map.entry(source)
- .or_insert_with(Default::default)
- .per_target_damage
- .entry(target)
- .or_insert_with(Default::default)
- }
-
- for event in log.events() {
- match event.kind {
- LogStart { .. } => {
- log_start_time = event.time;
- }
-
- EnterCombat { agent_addr, .. } => {
- agent_stats
- .entry(agent_addr)
- .or_insert_with(Default::default)
- .enter_combat = event.time - log_start_time;
- }
-
- ExitCombat { agent_addr } => {
- agent_stats
- .entry(agent_addr)
- .or_insert_with(Default::default)
- .exit_combat = event.time - log_start_time;
- }
-
- Physical {
- source_agent_addr,
- destination_agent_addr,
- damage,
- ..
- } => {
- with! { stats = get_stats(&mut agent_stats, source_agent_addr, destination_agent_addr) => {
- stats.total_damage += damage as u64;
- stats.power_damage += damage as u64;
- }}
-
- if let Some(master) = log.master_agent(source_agent_addr) {
- let master_stats =
- get_stats(&mut agent_stats, master.addr, destination_agent_addr);
- master_stats.total_damage += damage as u64;
- master_stats.add_damage += damage as u64;
- }
- }
-
- ConditionTick {
- source_agent_addr,
- destination_agent_addr,
- damage,
- ..
- } => {
- with! { stats = get_stats(&mut agent_stats, source_agent_addr, destination_agent_addr) => {
- stats.total_damage += damage as u64;
- stats.condition_damage += damage as u64;
- }}
-
- if let Some(master) = log.master_agent(source_agent_addr) {
- let master_stats =
- get_stats(&mut agent_stats, master.addr, destination_agent_addr);
- master_stats.total_damage += damage as u64;
- master_stats.add_damage += damage as u64;
- }
- }
-
- _ => (),
- }
- }
-
- let boss = log.boss();
-
- for agent_stat in agent_stats.values_mut() {
- tally_damage(agent_stat);
- agent_stat.boss_damage = agent_stat
- .per_target_damage
- .get(&boss.addr)
- .cloned()
- .unwrap_or_else(Default::default);
- }
-
- Ok(Statistics { agent_stats })
-}
-
-/// Takes the per target damage stats and tallies them up into the total damage
-/// stats.
-fn tally_damage(stats: &mut AgentStats) {
- for damage in stats.per_target_damage.values() {
- stats.total_damage.total_damage += damage.total_damage;
- stats.total_damage.power_damage += damage.power_damage;
- stats.total_damage.condition_damage += damage.condition_damage;
- stats.total_damage.add_damage += damage.add_damage;
- }
-}