aboutsummaryrefslogtreecommitdiff
path: root/src/statistics
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2018-10-10 17:52:46 +0200
committerDaniel Schadt <kingdread@gmx.de>2018-10-10 17:52:46 +0200
commit786f375dd7cdcc6a92e3c7f4b027826629cd9baf (patch)
treeb67cf0618e43d34685cccade48c5830e895d820d /src/statistics
parent0ebd3889b1cb62cfabbe01b6e953bfc02c8e6575 (diff)
downloadevtclib-786f375dd7cdcc6a92e3c7f4b027826629cd9baf.tar.gz
evtclib-786f375dd7cdcc6a92e3c7f4b027826629cd9baf.tar.bz2
evtclib-786f375dd7cdcc6a92e3c7f4b027826629cd9baf.zip
update to latest arcdps
This comes with several changes: First, the revision header field is now properly parsed and saved, instead of just being hardcoded to zero. This is the first step in allowing newer log files to be parsed. To accommodate this, the Header struct has been extended with the "revision: u8" field. To be able to parse both formats, the CbtEvent struct has been changed. It is now the unification of both the new struct and the old struct, as the changes are pretty minor and mostly concern the parsing itself. The data types have been adjusted, and two fields have been added. Moving fields around does not concern CbtEvent at all. If the struct diverges more from this in the future, some splitting might be introduced, but for now, the change is pretty transparent to other code. During this process, the structs have lost their [repr(C]) property. It was never used, as the structs were not directly involved in C FFI. It has been a relic of the past from earlier iterations. Finally, the parsing function has been changed from parse_event to parse_event_rev0, with the addition of a parse_event_rev1. parse_events now takes the event parsing function as an additional parameter, and parse_file correctly choses the implementation based on the revision number.
Diffstat (limited to 'src/statistics')
-rw-r--r--src/statistics/boon.rs16
-rw-r--r--src/statistics/damage.rs4
-rw-r--r--src/statistics/gamedata.rs16
-rw-r--r--src/statistics/trackers.rs4
4 files changed, 24 insertions, 16 deletions
diff --git a/src/statistics/boon.rs b/src/statistics/boon.rs
index 0aa5ab2..196bd1d 100644
--- a/src/statistics/boon.rs
+++ b/src/statistics/boon.rs
@@ -161,6 +161,14 @@ impl BoonQueue {
self.backlog = 0;
}
+ /// Cleanse a single stack
+ pub fn drop_single(&mut self) {
+ if self.is_empty() {
+ return;
+ }
+ self.queue.pop();
+ }
+
/// Checks if any stacks are left.
pub fn is_empty(&self) -> bool {
self.queue.is_empty()
@@ -247,7 +255,7 @@ impl Mul<u64> for Stacks {
#[derive(Clone, Default)]
pub struct BoonLog {
// Keep a separate RecordFunc for each boon.
- inner: FnvHashMap<u16, RecordFunc<u64, (), Stacks>>,
+ inner: FnvHashMap<u32, RecordFunc<u64, (), Stacks>>,
}
impl BoonLog {
@@ -257,7 +265,7 @@ impl BoonLog {
}
/// Add an event to the boon log.
- pub fn log(&mut self, time: u64, boon_id: u16, stacks: u32) {
+ pub fn log(&mut self, time: u64, boon_id: u32, stacks: u32) {
let func = self.inner.entry(boon_id).or_insert_with(Default::default);
let current = func.tally();
if current.0 == stacks as i32 {
@@ -272,7 +280,7 @@ impl BoonLog {
/// * `a` - Start time point.
/// * `b` - End time point.
/// * `boon_id` - ID of the boon that you want to get the average for.
- pub fn average_stacks(&self, a: u64, b: u64, boon_id: u16) -> f32 {
+ pub fn average_stacks(&self, a: u64, b: u64, boon_id: u32) -> f32 {
assert!(b >= a, "timespan is negative?!");
let func = if let Some(f) = self.inner.get(&boon_id) {
f
@@ -287,7 +295,7 @@ impl BoonLog {
///
/// * `x` - Time point.
/// * `boon_id` - ID of the boon that you want to get.
- pub fn stacks_at(&self, x: u64, boon_id: u16) -> u32 {
+ pub fn stacks_at(&self, x: u64, boon_id: u32) -> u32 {
self.inner
.get(&boon_id)
.map(|f| f.get(&x))
diff --git a/src/statistics/damage.rs b/src/statistics/damage.rs
index 0fcbf9b..0c26a9b 100644
--- a/src/statistics/damage.rs
+++ b/src/statistics/damage.rs
@@ -14,7 +14,7 @@ pub struct Meta {
pub source: u64,
pub target: u64,
pub kind: DamageType,
- pub skill: u16,
+ pub skill: u32,
}
/// A small wrapper that wraps a damage number.
@@ -54,7 +54,7 @@ impl DamageLog {
source: u64,
target: u64,
kind: DamageType,
- skill: u16,
+ skill: u32,
value: u64,
) {
self.inner.insert(
diff --git a/src/statistics/gamedata.rs b/src/statistics/gamedata.rs
index 6f370d0..faa8cb3 100644
--- a/src/statistics/gamedata.rs
+++ b/src/statistics/gamedata.rs
@@ -35,7 +35,7 @@ pub const XERA_PHASE2_ID: u16 = 0x3F9E;
/// * 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);
+pub struct Boon(pub u32, pub &'static str, pub u32, pub BoonType);
impl Boon {
pub fn create_queue(&self) -> BoonQueue {
@@ -83,7 +83,7 @@ pub static BOONS: &[Boon] = &[
Boon(738, "Vulnerability", 25, BoonType::Intensity),
];
-pub fn get_boon(boon_id: u16) -> Option<&'static Boon> {
+pub fn get_boon(boon_id: u32) -> Option<&'static Boon> {
BOONS.iter().find(|b| b.0 == boon_id)
}
@@ -91,19 +91,19 @@ pub fn get_boon(boon_id: u16) -> Option<&'static Boon> {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Trigger {
/// Triggers when the given boon is applied to the player.
- BoonPlayer(u16),
+ BoonPlayer(u32),
/// Triggers when the given boon is applied to the boss.
- BoonBoss(u16),
+ BoonBoss(u32),
/// Triggers when the given skill is used by a player.
- SkillByPlayer(u16),
+ SkillByPlayer(u32),
/// Triggers when the given skill is used on a player.
- SkillOnPlayer(u16),
+ SkillOnPlayer(u32),
/// Triggers when the given boon is stripped from an enemy.
- BoonStripped(u16),
+ BoonStripped(u32),
/// Triggers when the given entity spawned.
Spawn(u16),
/// Triggers when the boss finishes channeling the given skill.
- ChannelComplete(u16),
+ ChannelComplete(u32),
}
/// Struct describing a boss mechanic.
diff --git a/src/statistics/trackers.rs b/src/statistics/trackers.rs
index 66a7bf8..98915d2 100644
--- a/src/statistics/trackers.rs
+++ b/src/statistics/trackers.rs
@@ -230,7 +230,7 @@ impl Tracker for CombatTimeTracker {
/// boons defined in `evtclib::statistics::gamedata::BOONS`.
pub struct BoonTracker {
boon_logs: FnvHashMap<u64, BoonLog>,
- boon_queues: FnvHashMap<u64, FnvHashMap<u16, BoonQueue>>,
+ boon_queues: FnvHashMap<u64, FnvHashMap<u32, BoonQueue>>,
last_time: u64,
}
@@ -284,7 +284,7 @@ impl BoonTracker {
///
/// * `agent_addr` - The address of the agent.
/// * `buff_id` - The buff (or condition) id.
- fn get_queue(&mut self, agent_addr: u64, buff_id: u16) -> Option<&mut BoonQueue> {
+ fn get_queue(&mut self, agent_addr: u64, buff_id: u32) -> Option<&mut BoonQueue> {
use std::collections::hash_map::Entry;
let entry = self
.boon_queues