aboutsummaryrefslogtreecommitdiff
path: root/src/analyzers/raids/w4.rs
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2020-06-28 17:22:43 +0200
committerDaniel Schadt <kingdread@gmx.de>2020-06-28 17:22:43 +0200
commit0978345648cf9cdad6222f583dd21497b409d07e (patch)
tree9470f87a879e36c68104ef067c6657eb94cd98e5 /src/analyzers/raids/w4.rs
parentacdc4d977e573d54c73530f77ba210efd2184cf0 (diff)
downloadevtclib-0978345648cf9cdad6222f583dd21497b409d07e.tar.gz
evtclib-0978345648cf9cdad6222f583dd21497b409d07e.tar.bz2
evtclib-0978345648cf9cdad6222f583dd21497b409d07e.zip
start implementing analyzers
It turns out that the different encounters do require quite some encounter-specific logic, not only to determine whether the CM was activated, but also to determine whether the fight was successful, the duration of the fight, later the phases, ... Wrapping all of this in pre-defined "triggers" (like CmTrigger) feels like it will be a bit unfitting, so with this patch we have introduced the evtclib::Analyzer, which can be used to analyze the fights. Currently, the whole CM detection logic has been moved to this new interface, and soon we also want the success-detection logic in there. The tests pass and the interface of Log::is_cm is unchanged.
Diffstat (limited to 'src/analyzers/raids/w4.rs')
-rw-r--r--src/analyzers/raids/w4.rs116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/analyzers/raids/w4.rs b/src/analyzers/raids/w4.rs
new file mode 100644
index 0000000..efdab8f
--- /dev/null
+++ b/src/analyzers/raids/w4.rs
@@ -0,0 +1,116 @@
+//! Boss fight analyzers for Wing 4 (Bastion of the Penitent).
+use crate::{
+ analyzers::{helpers, Analyzer},
+ Log,
+};
+
+pub const CAIRN_CM_BUFF: u32 = 38_098;
+
+/// Analyzer for the first fight of Wing 4, Cairn.
+///
+/// The CM is detected by the presence of the buff representing the countdown before which you have
+/// to use your special action skill.
+#[derive(Debug, Clone, Copy)]
+pub struct Cairn<'log> {
+ log: &'log Log,
+}
+
+impl<'log> Cairn<'log> {
+ pub fn new(log: &'log Log) -> Self {
+ Cairn { log }
+ }
+}
+
+impl<'log> Analyzer for Cairn<'log> {
+ fn log(&self) -> &Log {
+ self.log
+ }
+
+ fn is_cm(&self) -> bool {
+ helpers::buff_present(self.log, CAIRN_CM_BUFF)
+ }
+}
+
+pub const MO_CM_HEALTH: u64 = 30_000_000;
+
+/// Analyzer for the second fight of Wing 4, Mursaat Overseer.
+///
+/// The CM is detected by the boss's health, which is higher in the challenge mote.
+#[derive(Debug, Clone, Copy)]
+pub struct MursaatOverseer<'log> {
+ log: &'log Log,
+}
+
+impl<'log> MursaatOverseer<'log> {
+ pub fn new(log: &'log Log) -> Self {
+ MursaatOverseer { log }
+ }
+}
+
+impl<'log> Analyzer for MursaatOverseer<'log> {
+ fn log(&self) -> &Log {
+ self.log
+ }
+
+ fn is_cm(&self) -> bool {
+ helpers::boss_health(self.log)
+ .map(|h| h >= MO_CM_HEALTH)
+ .unwrap_or(false)
+ }
+}
+
+pub const SAMAROG_CM_HEALTH: u64 = 40_000_000;
+
+/// Analyzer for the third fight of Wing 4, Samarog.
+///
+/// The CM is detected by the boss's health, which is higher in the challenge mote.
+#[derive(Debug, Clone, Copy)]
+pub struct Samarog<'log> {
+ log: &'log Log,
+}
+
+impl<'log> Samarog<'log> {
+ pub fn new(log: &'log Log) -> Self {
+ Samarog { log }
+ }
+}
+
+impl<'log> Analyzer for Samarog<'log> {
+ fn log(&self) -> &Log {
+ self.log
+ }
+
+ fn is_cm(&self) -> bool {
+ helpers::boss_health(self.log)
+ .map(|h| h >= SAMAROG_CM_HEALTH)
+ .unwrap_or(false)
+ }
+}
+
+pub const DEIMOS_CM_HEALTH: u64 = 42_000_000;
+
+/// Analyzer for the fourth fight of Wing 4, Deimos.
+///
+/// The CM is detected by the boss's health, which is higher in the challenge mote.
+#[derive(Debug, Clone, Copy)]
+pub struct Deimos<'log> {
+ log: &'log Log,
+}
+
+impl<'log> Deimos<'log> {
+ pub fn new(log: &'log Log) -> Self {
+ Deimos { log }
+ }
+}
+
+impl<'log> Analyzer for Deimos<'log> {
+ fn log(&self) -> &Log {
+ self.log
+ }
+
+ fn is_cm(&self) -> bool {
+ helpers::boss_health(self.log)
+ .map(|h| h >= DEIMOS_CM_HEALTH)
+ .unwrap_or(false)
+ }
+}