From 5d2f03dd750db86f1b705bb860102131b6b90127 Mon Sep 17 00:00:00 2001 From: Crystal Date: Tue, 13 Jun 2023 15:20:47 -0700 Subject: [PATCH 01/10] wip --- src/weapons/stat_calc.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/weapons/stat_calc.rs b/src/weapons/stat_calc.rs index b1d2d6c0..76213764 100644 --- a/src/weapons/stat_calc.rs +++ b/src/weapons/stat_calc.rs @@ -6,11 +6,11 @@ use crate::{ perks::{ get_dmg_modifier, get_explosion_data, get_firing_modifier, get_flinch_modifier, get_handling_modifier, get_magazine_modifier, get_range_modifier, get_reload_modifier, - get_reserve_modifier, get_velocity_modifier, + get_reserve_modifier, get_velocity_modifier, get_extra_damage, lib::{ CalculationInput, DamageModifierResponse, FiringModifierResponse, HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, - RangeModifierResponse, ReloadModifierResponse, + RangeModifierResponse, ReloadModifierResponse, ExtraDamageResponse, }, Perks, }, @@ -374,11 +374,12 @@ impl Weapon { } impl Weapon { - pub fn get_damage_profile(&self) -> (f64, f64, f64, f64) { + pub fn get_damage_profile(&self) -> (f64, f64, f64, f64, f64) { let impact; let mut explosion = 0.0_f64; let mut crit = 1.0_f64; let delay; + let mut tick = self.get_extra_damage.extra_damage; let epr = get_explosion_data(self.list_perks(), &self.static_calc_input(), false); if epr.percent <= 0.0 { @@ -393,7 +394,7 @@ impl Weapon { } delay = epr.delyed; } - (impact, explosion, crit, delay) + (impact, explosion, crit, delay, tick) } } From 363d829c7cf915284bcad5bd7dd0cb21c6b2593b Mon Sep 17 00:00:00 2001 From: Crystal Date: Sat, 17 Jun 2023 21:21:54 -0700 Subject: [PATCH 02/10] add: EDR to stat_calc --- src/types/rs_types.rs | 16 +++++++ src/weapons/stat_calc.rs | 90 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 102 insertions(+), 4 deletions(-) diff --git a/src/types/rs_types.rs b/src/types/rs_types.rs index 978225fb..1b2a5050 100644 --- a/src/types/rs_types.rs +++ b/src/types/rs_types.rs @@ -216,3 +216,19 @@ impl FiringResponse { self.pve_explosion_damage *= _rpl_mult * _gpl_mult * _pve_mult * _combatant_mult; } } + +#[derive(Debug, Clone, Default)] +pub struct EDR { + pub pvp_first_tick_damage: f64, + pub pvp_avg_tick_damage: f64, + pub pvp_last_tick_damage: f64, + pub pvp_tick_duration: f64, + pub pvp_num_ticks: i32, + + pub pve_first_tick_damage: f64, + pub pve_avg_tick_damage: f64, + pub pve_last_tick_damage: f64, + pub pve_tick_duration: f64, + pub pve_num_ticks: i32, +} + diff --git a/src/weapons/stat_calc.rs b/src/weapons/stat_calc.rs index 76213764..a8c51024 100644 --- a/src/weapons/stat_calc.rs +++ b/src/weapons/stat_calc.rs @@ -16,8 +16,9 @@ use crate::{ }, types::rs_types::{ AmmoFormula, AmmoResponse, FiringResponse, HandlingFormula, HandlingResponse, RangeFormula, - RangeResponse, ReloadFormula, ReloadResponse, + RangeResponse, ReloadFormula, ReloadResponse, EDR, }, + Perk, }; impl ReloadFormula { @@ -374,12 +375,13 @@ impl Weapon { } impl Weapon { - pub fn get_damage_profile(&self) -> (f64, f64, f64, f64, f64) { + pub fn get_damage_profile( + &self + ) -> (f64, f64, f64, f64) { let impact; let mut explosion = 0.0_f64; let mut crit = 1.0_f64; let delay; - let mut tick = self.get_extra_damage.extra_damage; let epr = get_explosion_data(self.list_perks(), &self.static_calc_input(), false); if epr.percent <= 0.0 { @@ -394,7 +396,7 @@ impl Weapon { } delay = epr.delyed; } - (impact, explosion, crit, delay, tick) + (impact, explosion, crit, delay) } } @@ -592,3 +594,83 @@ impl Weapon { buffer } } + +impl Weapon { + pub fn calc_extra_damage( + &self, + _perks: Vec, + _calc_input: Option, + _cached_data: Option<&mut HashMap>, + _pvp: bool, + ) -> EDR { + let mut default_cached_data = HashMap::new(); + let cached_data = _cached_data.unwrap_or(&mut default_cached_data); + let pve_damage_modifiers: DamageModifierResponse; + let pvp_damage_modifiers: DamageModifierResponse; + let pvp_extra_damage: Vec; + let pve_extra_damage: Vec; + + if _calc_input.is_some() { + pvp_damage_modifiers = get_dmg_modifier( + self.list_perks(), + &_calc_input.clone().unwrap(), + true, + &mut cached_data.clone(), + ); + pve_damage_modifiers = get_dmg_modifier( + self.list_perks(), + &_calc_input.clone().unwrap(), + false, + &mut cached_data.clone(), + ); + + pvp_extra_damage = get_extra_damage( + self.list_perks(), + &_calc_input.clone().unwrap(), + true, + &mut cached_data.clone(), + ); + pve_extra_damage = get_extra_damage( + self.list_perks(), + &_calc_input.clone().unwrap(), + false, + &mut cached_data.clone(), + ); + } + else { + pvp_damage_modifiers = DamageModifierResponse::default(); + pve_damage_modifiers = DamageModifierResponse::default(); + pvp_extra_damage = vec![ExtraDamageResponse::default()]; + pve_extra_damage = vec![ExtraDamageResponse::default()]; + } + + + let mut pvp_average_tick_damage = 0.0; + // goes thru the vec to find the avg tick damage + for pvp_edr in pvp_extra_damage { + pvp_average_tick_damage += pvp_edr.additive_damage; + } + pvp_average_tick_damage /= pvp_extra_damage.len() as f64; + + let mut pve_average_tick_damage = 0.0; + for pve_edr in pve_extra_damage { + pve_average_tick_damage += pve_edr.additive_damage; + } + pve_average_tick_damage /= pve_extra_damage.len() as f64; + + let output = EDR { + pvp_first_tick_damage: pvp_extra_damage[0].additive_damage * pvp_damage_modifiers.impact_dmg_scale, + pvp_tick_duration: pvp_extra_damage[0].time_for_additive_damage, + pvp_num_ticks: pvp_extra_damage[0].times_to_hit, + pvp_last_tick_damage: pvp_extra_damage[pvp_extra_damage.len()].additive_damage * pvp_damage_modifiers.impact_dmg_scale, + pvp_avg_tick_damage: pvp_average_tick_damage * pvp_damage_modifiers.impact_dmg_scale, + + pve_first_tick_damage: pve_extra_damage[0].additive_damage * pve_damage_modifiers.impact_dmg_scale, + pve_tick_duration: pve_extra_damage[0].time_for_additive_damage, + pve_num_ticks: pve_extra_damage[0].times_to_hit, + pve_last_tick_damage: pve_extra_damage[pve_extra_damage.len()].additive_damage * pve_damage_modifiers.impact_dmg_scale, + pve_avg_tick_damage: pve_average_tick_damage * pve_damage_modifiers.impact_dmg_scale, + }; + output + } +} From 93c754ff2cdc00e285140e2dc48b257b90896647 Mon Sep 17 00:00:00 2001 From: Crystal Date: Mon, 19 Jun 2023 12:56:01 -0700 Subject: [PATCH 03/10] stat calc working --- src/weapons/stat_calc.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/weapons/stat_calc.rs b/src/weapons/stat_calc.rs index a8c51024..1e44c30d 100644 --- a/src/weapons/stat_calc.rs +++ b/src/weapons/stat_calc.rs @@ -644,16 +644,15 @@ impl Weapon { pve_extra_damage = vec![ExtraDamageResponse::default()]; } - let mut pvp_average_tick_damage = 0.0; // goes thru the vec to find the avg tick damage - for pvp_edr in pvp_extra_damage { + for pvp_edr in &pvp_extra_damage { pvp_average_tick_damage += pvp_edr.additive_damage; } pvp_average_tick_damage /= pvp_extra_damage.len() as f64; let mut pve_average_tick_damage = 0.0; - for pve_edr in pve_extra_damage { + for pve_edr in &pve_extra_damage { pve_average_tick_damage += pve_edr.additive_damage; } pve_average_tick_damage /= pve_extra_damage.len() as f64; From bffe69ec4619e12eff8bb57f0809f635a8ea0724 Mon Sep 17 00:00:00 2001 From: Crystal Date: Fri, 23 Jun 2023 14:18:34 -0700 Subject: [PATCH 04/10] wip --- src/weapons/stat_calc.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/weapons/stat_calc.rs b/src/weapons/stat_calc.rs index 1e44c30d..37464118 100644 --- a/src/weapons/stat_calc.rs +++ b/src/weapons/stat_calc.rs @@ -596,7 +596,7 @@ impl Weapon { } impl Weapon { - pub fn calc_extra_damage( + pub fn get_EDR( &self, _perks: Vec, _calc_input: Option, @@ -669,6 +669,7 @@ impl Weapon { pve_num_ticks: pve_extra_damage[0].times_to_hit, pve_last_tick_damage: pve_extra_damage[pve_extra_damage.len()].additive_damage * pve_damage_modifiers.impact_dmg_scale, pve_avg_tick_damage: pve_average_tick_damage * pve_damage_modifiers.impact_dmg_scale, + }; output } From e2eb1c7c45617b06cc97838ba85e673548e4adf1 Mon Sep 17 00:00:00 2001 From: Crystal Date: Fri, 23 Jun 2023 14:18:40 -0700 Subject: [PATCH 05/10] wip --- src/types/rs_types.rs | 10 ++++++++++ src/weapons/ttk_calc.rs | 10 ++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/types/rs_types.rs b/src/types/rs_types.rs index 1b2a5050..0ca01a77 100644 --- a/src/types/rs_types.rs +++ b/src/types/rs_types.rs @@ -225,6 +225,16 @@ pub struct EDR { pub pvp_tick_duration: f64, pub pvp_num_ticks: i32, + pub pvp_first_explo_damage: f64, + pub pvp_avg_explo_damage: f64, + pub pvp_last_explo_damage: f64, + + //delay before the explosion goes off + pub explo_delay: f64, + //delay between explosions if there are multiple + pub multiple_explo_delay: f64, + pub explo_num: i32, + pub pve_first_tick_damage: f64, pub pve_avg_tick_damage: f64, pub pve_last_tick_damage: f64, diff --git a/src/weapons/ttk_calc.rs b/src/weapons/ttk_calc.rs index 35f90c43..d594ea03 100644 --- a/src/weapons/ttk_calc.rs +++ b/src/weapons/ttk_calc.rs @@ -5,10 +5,10 @@ use serde::Serialize; use crate::{ d2_enums::WeaponType, logging::extern_log, - perks::{get_dmg_modifier, get_firing_modifier, lib::CalculationInput}, + perks::{get_dmg_modifier, get_firing_modifier, get_extra_damage, lib::CalculationInput}, }; -use super::{FiringData, Weapon}; +use super::{FiringData, Weapon, dps_calc::calc_extra_dmg}; //just to make code cleaner for now fn ceil(x: f64) -> f64 { @@ -94,6 +94,12 @@ pub fn calc_ttk(_weapon: &Weapon, _overshield: f64) -> Vec { true, &mut persistent_data, ); + let extra_damage = get_extra_damage( + _weapon.list_perks().clone(), + &calc_input, + true, + &mut persistent_data, + ); /////////////////////////////// let body_damage = (impact_dmg * dmg_mods.impact_dmg_scale) From be4c8589714c482b4b5832208ecc66c6392d59e6 Mon Sep 17 00:00:00 2001 From: Crystal Date: Wed, 2 Aug 2023 22:37:26 -0700 Subject: [PATCH 06/10] EDR stat done, needs testing --- src/lib.rs | 13 +++- src/perks/exotic_perks.rs | 2 + src/perks/lib.rs | 2 + src/perks/mod.rs | 1 - src/perks/year_1_perks.rs | 4 +- src/types/js_types.rs | 27 ++++++++ src/types/rs_types.rs | 27 ++------ src/weapons/stat_calc.rs | 131 ++++++++++++++++---------------------- 8 files changed, 105 insertions(+), 102 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fd2262e0..804b90a2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,7 +35,7 @@ mod database { //JavaScript use crate::types::js_types::{ - JsAmmoResponse, JsDifficultyOptions, JsDpsResponse, JsEnemyType, JsFiringResponse, + JsAmmoResponse, JsDifficultyOptions, JsDpsResponse, JsEDR, JsEnemyType, JsFiringResponse, JsHandlingResponse, JsMetaData, JsRangeResponse, JsReloadResponse, JsResillienceSummary, JsStat, }; @@ -271,6 +271,17 @@ pub fn get_weapon_ttk(_overshield: f64) -> Result { Ok(serde_wasm_bindgen::to_value(&js_ttk_data).unwrap()) } +#[wasm_bindgen(js_name = "getExtraDamage")] +pub fn get_weapon_extra_damage(_dynamic_traits: bool, _pvp: bool) -> Result { + let weapon = PERS_DATA.with(|perm_data| perm_data.borrow().weapon.clone()); + if _dynamic_traits { + Ok(weapon + .get_edr(Some(weapon.static_calc_input()), None, _pvp) + .into()) + } else { + Ok(weapon.get_edr(None, None, _pvp).into()) + } +} ///DEPRECATED for now // // #[wasm_bindgen(js_name = "getWeaponDps")] diff --git a/src/perks/exotic_perks.rs b/src/perks/exotic_perks.rs index 55724e07..4285d1be 100644 --- a/src/perks/exotic_perks.rs +++ b/src/perks/exotic_perks.rs @@ -237,6 +237,7 @@ pub fn exotic_perks() { weapon_scale: true, crit_scale: false, combatant_scale: true, + ..Default::default() } }), ); @@ -313,6 +314,7 @@ pub fn exotic_perks() { weapon_scale: true, crit_scale: false, combatant_scale: true, + ..Default::default() } }), ); diff --git a/src/perks/lib.rs b/src/perks/lib.rs index c3e9bd8a..57a47e41 100644 --- a/src/perks/lib.rs +++ b/src/perks/lib.rs @@ -174,6 +174,7 @@ pub struct ExtraDamageResponse { pub weapon_scale: bool, pub crit_scale: bool, pub combatant_scale: bool, + pub explosive_percent: f64, } impl Default for ExtraDamageResponse { fn default() -> Self { @@ -187,6 +188,7 @@ impl Default for ExtraDamageResponse { weapon_scale: false, crit_scale: false, combatant_scale: false, + explosive_percent: 0.0, } } } diff --git a/src/perks/mod.rs b/src/perks/mod.rs index 241a7f98..888c9ef9 100644 --- a/src/perks/mod.rs +++ b/src/perks/mod.rs @@ -443,7 +443,6 @@ pub enum Perks { TractorCannon = 1210807262, MarksmanSights = 1408087975, - #[num_enum(default)] Ignore = 69420, } diff --git a/src/perks/year_1_perks.rs b/src/perks/year_1_perks.rs index d9cc8fe0..560aee9c 100644 --- a/src/perks/year_1_perks.rs +++ b/src/perks/year_1_perks.rs @@ -700,10 +700,12 @@ pub fn year_1_perks() { crit_scale: false, increment_total_time: false, time_for_additive_damage: 0.8, - times_to_hit: 6, + times_to_hit: 8, weapon_scale: true, hit_at_same_time: true, is_dot: false, + explosive_percent: 1.0, + ..Default::default() } }), ); diff --git a/src/types/js_types.rs b/src/types/js_types.rs index a4e5f0e1..feaa995e 100644 --- a/src/types/js_types.rs +++ b/src/types/js_types.rs @@ -21,6 +21,7 @@ use wasm_bindgen::{ use super::rs_types::{ AmmoFormula, AmmoResponse, DamageMods, DpsResponse, FiringData, FiringResponse, HandlingFormula, HandlingResponse, RangeFormula, RangeResponse, ReloadFormula, ReloadResponse, + EDR, }; #[derive(Debug, Clone, Copy, Serialize)] @@ -115,6 +116,32 @@ impl From for JsAmmoResponse { } } +#[derive(Debug, Clone, Copy, Serialize)] +#[wasm_bindgen(js_name = "ExtraDamageResponse", inspectable)] +pub struct JsEDR { + #[wasm_bindgen(js_name = "firstTick", readonly)] + pub first_tick: f64, + #[wasm_bindgen(js_name = "lastTick", readonly)] + pub last_tick: f64, + #[wasm_bindgen(js_name = "avgTick", readonly)] + pub avg_tick: f64, + #[wasm_bindgen(js_name = "numTicks", readonly)] + pub num_ticks: i32, + #[wasm_bindgen(js_name = "tickDuration", readonly)] + pub tick_duration: f64, +} +impl From for JsEDR { + fn from(edr: EDR) -> Self { + JsEDR { + first_tick: edr.first_tick_damage, + last_tick: edr.last_tick_damage, + avg_tick: edr.avg_tick_damage, + num_ticks: edr.num_ticks, + tick_duration: edr.tick_duration, + } + } +} + #[derive(Debug, Clone, Serialize)] #[wasm_bindgen(js_name = "DpsResponse")] pub struct JsDpsResponse { diff --git a/src/types/rs_types.rs b/src/types/rs_types.rs index 8f258c93..19c65bcd 100644 --- a/src/types/rs_types.rs +++ b/src/types/rs_types.rs @@ -224,26 +224,9 @@ impl FiringResponse { #[derive(Debug, Clone, Default)] pub struct EDR { - pub pvp_first_tick_damage: f64, - pub pvp_avg_tick_damage: f64, - pub pvp_last_tick_damage: f64, - pub pvp_tick_duration: f64, - pub pvp_num_ticks: i32, - - pub pvp_first_explo_damage: f64, - pub pvp_avg_explo_damage: f64, - pub pvp_last_explo_damage: f64, - - //delay before the explosion goes off - pub explo_delay: f64, - //delay between explosions if there are multiple - pub multiple_explo_delay: f64, - pub explo_num: i32, - - pub pve_first_tick_damage: f64, - pub pve_avg_tick_damage: f64, - pub pve_last_tick_damage: f64, - pub pve_tick_duration: f64, - pub pve_num_ticks: i32, + pub first_tick_damage: f64, + pub avg_tick_damage: f64, + pub last_tick_damage: f64, + pub tick_duration: f64, + pub num_ticks: i32, } - diff --git a/src/weapons/stat_calc.rs b/src/weapons/stat_calc.rs index f06b8b9b..754a7f6a 100644 --- a/src/weapons/stat_calc.rs +++ b/src/weapons/stat_calc.rs @@ -4,13 +4,13 @@ use super::{reserve_calc::calc_reserves, Stat, Weapon}; use crate::{ d2_enums::{MetersPerSecond, Seconds, StatHashes, WeaponType}, perks::{ - get_dmg_modifier, get_explosion_data, get_firing_modifier, get_flinch_modifier, - get_handling_modifier, get_magazine_modifier, get_range_modifier, get_reload_modifier, - get_reserve_modifier, get_velocity_modifier, get_extra_damage, + get_dmg_modifier, get_explosion_data, get_extra_damage, get_firing_modifier, + get_flinch_modifier, get_handling_modifier, get_magazine_modifier, get_range_modifier, + get_reload_modifier, get_reserve_modifier, get_velocity_modifier, lib::{ - CalculationInput, DamageModifierResponse, FiringModifierResponse, + CalculationInput, DamageModifierResponse, ExtraDamageResponse, FiringModifierResponse, HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, - RangeModifierResponse, ReloadModifierResponse, ExtraDamageResponse, + RangeModifierResponse, ReloadModifierResponse, }, Perks, }, @@ -381,9 +381,7 @@ impl Weapon { } impl Weapon { - pub fn get_damage_profile( - &self - ) -> (f64, f64, f64, f64) { + pub fn get_damage_profile(&self) -> (f64, f64, f64, f64) { let impact; let mut explosion = 0.0_f64; let mut crit = 1.0_f64; @@ -602,81 +600,60 @@ impl Weapon { } impl Weapon { - pub fn get_EDR( + pub fn get_edr( &self, - _perks: Vec, _calc_input: Option, _cached_data: Option<&mut HashMap>, _pvp: bool, ) -> EDR { - let mut default_cached_data = HashMap::new(); - let cached_data = _cached_data.unwrap_or(&mut default_cached_data); - let pve_damage_modifiers: DamageModifierResponse; - let pvp_damage_modifiers: DamageModifierResponse; - let pvp_extra_damage: Vec; - let pve_extra_damage: Vec; - - if _calc_input.is_some() { - pvp_damage_modifiers = get_dmg_modifier( - self.list_perks(), - &_calc_input.clone().unwrap(), - true, - &mut cached_data.clone(), - ); - pve_damage_modifiers = get_dmg_modifier( - self.list_perks(), - &_calc_input.clone().unwrap(), - false, - &mut cached_data.clone(), - ); - - pvp_extra_damage = get_extra_damage( - self.list_perks(), - &_calc_input.clone().unwrap(), - true, - &mut cached_data.clone(), - ); - pve_extra_damage = get_extra_damage( - self.list_perks(), - &_calc_input.clone().unwrap(), - false, - &mut cached_data.clone(), - ); - } - else { - pvp_damage_modifiers = DamageModifierResponse::default(); - pve_damage_modifiers = DamageModifierResponse::default(); - pvp_extra_damage = vec![ExtraDamageResponse::default()]; - pve_extra_damage = vec![ExtraDamageResponse::default()]; - } + let mut default_cached_data = HashMap::new(); + let cached_data = _cached_data.unwrap_or(&mut default_cached_data); + let damage_modifiers: DamageModifierResponse; + let extra_damage: Vec; - let mut pvp_average_tick_damage = 0.0; - // goes thru the vec to find the avg tick damage - for pvp_edr in &pvp_extra_damage { - pvp_average_tick_damage += pvp_edr.additive_damage; - } - pvp_average_tick_damage /= pvp_extra_damage.len() as f64; + if _calc_input.is_some() { + damage_modifiers = get_dmg_modifier( + self.list_perks(), + &_calc_input.clone().unwrap(), + _pvp, + &mut cached_data.clone(), + ); - let mut pve_average_tick_damage = 0.0; - for pve_edr in &pve_extra_damage { - pve_average_tick_damage += pve_edr.additive_damage; - } - pve_average_tick_damage /= pve_extra_damage.len() as f64; - - let output = EDR { - pvp_first_tick_damage: pvp_extra_damage[0].additive_damage * pvp_damage_modifiers.impact_dmg_scale, - pvp_tick_duration: pvp_extra_damage[0].time_for_additive_damage, - pvp_num_ticks: pvp_extra_damage[0].times_to_hit, - pvp_last_tick_damage: pvp_extra_damage[pvp_extra_damage.len()].additive_damage * pvp_damage_modifiers.impact_dmg_scale, - pvp_avg_tick_damage: pvp_average_tick_damage * pvp_damage_modifiers.impact_dmg_scale, - - pve_first_tick_damage: pve_extra_damage[0].additive_damage * pve_damage_modifiers.impact_dmg_scale, - pve_tick_duration: pve_extra_damage[0].time_for_additive_damage, - pve_num_ticks: pve_extra_damage[0].times_to_hit, - pve_last_tick_damage: pve_extra_damage[pve_extra_damage.len()].additive_damage * pve_damage_modifiers.impact_dmg_scale, - pve_avg_tick_damage: pve_average_tick_damage * pve_damage_modifiers.impact_dmg_scale, - - }; - output + extra_damage = get_extra_damage( + self.list_perks(), + &_calc_input.clone().unwrap(), + _pvp, + &mut cached_data.clone(), + ); + } else { + damage_modifiers = DamageModifierResponse::default(); + extra_damage = vec![ExtraDamageResponse::default()]; + } + + let mut average_tick_damage = 0.0; + // goes thru the vec to find the avg tick damage + for edr in &extra_damage { + average_tick_damage += edr.additive_damage; + } + let length = extra_damage.len() - 1; + average_tick_damage /= length as f64 + 1.0; + + return EDR { + first_tick_damage: (extra_damage[0].additive_damage + * extra_damage[0].explosive_percent + * damage_modifiers.explosive_dmg_scale) + + (extra_damage[0].additive_damage + * (1.0 - extra_damage[0].explosive_percent) + * damage_modifiers.impact_dmg_scale), + tick_duration: extra_damage[0].time_for_additive_damage, + num_ticks: extra_damage[0].times_to_hit, + last_tick_damage: (extra_damage[length].additive_damage + * extra_damage[length].explosive_percent + * damage_modifiers.explosive_dmg_scale) + + (extra_damage[length].additive_damage + * (1.0 - extra_damage[length].explosive_percent) + * damage_modifiers.impact_dmg_scale), + avg_tick_damage: average_tick_damage * damage_modifiers.impact_dmg_scale, + }; } } From d2468926a22ea50aeb1d3a39325cd0a8c73cb5ca Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 3 Aug 2023 14:01:00 -0700 Subject: [PATCH 07/10] working --- src/perks/exotic_perks.rs | 39 +++++++++++++++++++++++++++++++ src/perks/mod.rs | 3 +++ src/perks/perk_options_handler.rs | 3 +++ src/perks/year_1_perks.rs | 3 ++- src/weapons/stat_calc.rs | 19 ++++++++++----- 5 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/perks/exotic_perks.rs b/src/perks/exotic_perks.rs index 4285d1be..25dc38bf 100644 --- a/src/perks/exotic_perks.rs +++ b/src/perks/exotic_perks.rs @@ -1102,4 +1102,43 @@ pub fn exotic_perks() { } }), ); + + add_edr( + Perks::MarkofTheDevourer, + Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { + let perks = _input.calc_data.perk_value_map.clone(); + let perk_check = + |hash: Perks| -> bool { matches!(perks.get(&hash.into()), Some(x) if x > &0) }; + let mut buff = 1.0; + if perk_check(Perks::SoulDevourer) { + buff = if _input.pvp { 17.5 } else { 2.0 } + }; + let dmg = if _input.pvp { 0.4 } else { 8.5 }; + ExtraDamageResponse { + additive_damage: dmg * buff, + time_for_additive_damage: 2.05, + times_to_hit: 4, + hit_at_same_time: true, + is_dot: true, + explosive_percent: 0.0, + ..Default::default() + } + }), + ) + + // add_edr( + // Perks::ToxicOverload, + // Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { + // if _input.calc_data.total_shots_hit > 14 { + // let time = if _input.pvp { 0.7 } else { 0.5 }; + // let ticks = if _input.pvp { 0 } else { 19 }; + // let dmg = if _input.pvp { 5.0 } else { 34 }; + // ExtraDamageResponse { + // additive_damage: dmg + (0.077 * _input.calc_data.s), + // time_for_additive_damage: time * ticks, + // } + // } + // ExtraDamageResponse::default() + // }), + // ); } diff --git a/src/perks/mod.rs b/src/perks/mod.rs index 888c9ef9..9c4c76e7 100644 --- a/src/perks/mod.rs +++ b/src/perks/mod.rs @@ -403,6 +403,9 @@ pub enum Perks { MarkovChain = 2814973067, MementoMori = 647617635, AgersScepterCatalyst = 970163821, + MarkofTheDevourer = 1863355414, + SoulDevourer = 2921090754, + ToxicOverload = 4015745376, //energy exotic LagragianSight = 2881100038, diff --git a/src/perks/perk_options_handler.rs b/src/perks/perk_options_handler.rs index a58cc22a..e6c70e9e 100644 --- a/src/perks/perk_options_handler.rs +++ b/src/perks/perk_options_handler.rs @@ -379,6 +379,9 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::LunaFaction => Some(PerkOptionData::options( ["Heal Rift", "Empowering Rift / Well"].to_vec(), )), + Perks::MarkofTheDevourer => Some(PerkOptionData::static_()), + Perks::SoulDevourer => Some(PerkOptionData::toggle()), + Perks::ToxicOverload => Some(PerkOptionData::static_()), Perks::Foetracer => Some(PerkOptionData::toggle()), Perks::MechaneersTricksleeves => Some(PerkOptionData::toggle()), Perks::Oathkeeper => Some(PerkOptionData::static_()), diff --git a/src/perks/year_1_perks.rs b/src/perks/year_1_perks.rs index 560aee9c..49866ccd 100644 --- a/src/perks/year_1_perks.rs +++ b/src/perks/year_1_perks.rs @@ -694,8 +694,9 @@ pub fn year_1_perks() { add_edr( Perks::ClusterBomb, Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { + let dmg = if _input.pvp { 0.0 } else { 51.0 }; ExtraDamageResponse { - additive_damage: 350.0 * 0.04, + additive_damage: dmg, combatant_scale: true, crit_scale: false, increment_total_time: false, diff --git a/src/weapons/stat_calc.rs b/src/weapons/stat_calc.rs index 754a7f6a..ba72d396 100644 --- a/src/weapons/stat_calc.rs +++ b/src/weapons/stat_calc.rs @@ -631,29 +631,36 @@ impl Weapon { } let mut average_tick_damage = 0.0; + let mut average_explosive_percent = 0.0; // goes thru the vec to find the avg tick damage for edr in &extra_damage { average_tick_damage += edr.additive_damage; + average_explosive_percent += edr.explosive_percent; } let length = extra_damage.len() - 1; average_tick_damage /= length as f64 + 1.0; + average_explosive_percent /= length as f64 + 1.0; return EDR { first_tick_damage: (extra_damage[0].additive_damage * extra_damage[0].explosive_percent * damage_modifiers.explosive_dmg_scale) - + (extra_damage[0].additive_damage - * (1.0 - extra_damage[0].explosive_percent) - * damage_modifiers.impact_dmg_scale), + + (extra_damage[0].additive_damage * (1.0 - extra_damage[0].explosive_percent)/* damage_modifiers.impact_dmg_scale*/), + tick_duration: extra_damage[0].time_for_additive_damage, + num_ticks: extra_damage[0].times_to_hit, + last_tick_damage: (extra_damage[length].additive_damage * extra_damage[length].explosive_percent * damage_modifiers.explosive_dmg_scale) + (extra_damage[length].additive_damage - * (1.0 - extra_damage[length].explosive_percent) - * damage_modifiers.impact_dmg_scale), - avg_tick_damage: average_tick_damage * damage_modifiers.impact_dmg_scale, + * (1.0 - extra_damage[length].explosive_percent)/* damage_modifiers.impact_dmg_scale*/), + + avg_tick_damage: (average_tick_damage + * average_explosive_percent + * damage_modifiers.explosive_dmg_scale) + + (average_tick_damage * (1.0 - average_explosive_percent)), /*damage_modifiers.impact_dmg_scale*/ }; } } From 30e2f3f7bc474dee20401a474a8cfe79f76c3f38 Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 3 Aug 2023 16:10:28 -0700 Subject: [PATCH 08/10] le monarque edr --- src/perks/exotic_perks.rs | 18 +++++++++++++++++- src/perks/mod.rs | 1 + src/perks/perk_options_handler.rs | 8 +++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/perks/exotic_perks.rs b/src/perks/exotic_perks.rs index 25dc38bf..dcf7be7a 100644 --- a/src/perks/exotic_perks.rs +++ b/src/perks/exotic_perks.rs @@ -1124,7 +1124,23 @@ pub fn exotic_perks() { ..Default::default() } }), - ) + ); + + add_edr( + Perks::PoisonArrows, + Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { + let dmg = if _input.pvp { 1.876 } else { 29.0 }; + ExtraDamageResponse { + additive_damage: dmg, + time_for_additive_damage: 4.0, + times_to_hit: 8, + hit_at_same_time: true, + is_dot: true, + explosive_percent: 0.0, + ..Default::default() + } + }), + ); // add_edr( // Perks::ToxicOverload, diff --git a/src/perks/mod.rs b/src/perks/mod.rs index 9c4c76e7..c07866b3 100644 --- a/src/perks/mod.rs +++ b/src/perks/mod.rs @@ -406,6 +406,7 @@ pub enum Perks { MarkofTheDevourer = 1863355414, SoulDevourer = 2921090754, ToxicOverload = 4015745376, + PoisonArrows = 2186532310, //energy exotic LagragianSight = 2881100038, diff --git a/src/perks/perk_options_handler.rs b/src/perks/perk_options_handler.rs index e6c70e9e..f0e551a2 100644 --- a/src/perks/perk_options_handler.rs +++ b/src/perks/perk_options_handler.rs @@ -347,6 +347,11 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::BlackHole => Some(PerkOptionData::static_()), Perks::TemporalUnlimiter => Some(PerkOptionData::toggle()), Perks::MarksmanSights => Some(PerkOptionData::static_()), + Perks::MarkofTheDevourer => Some(PerkOptionData::static_()), + Perks::SoulDevourer => Some(PerkOptionData::toggle()), + Perks::ToxicOverload => Some(PerkOptionData::static_()), + Perks::PoisonArrows => Some(PerkOptionData::static_()), + Perks::DexterityMod => Some(PerkOptionData::stacking(3)), Perks::ReserveMod => Some(PerkOptionData::stacking(3)), Perks::LoaderMod => Some(PerkOptionData::stacking(3)), @@ -379,9 +384,6 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::LunaFaction => Some(PerkOptionData::options( ["Heal Rift", "Empowering Rift / Well"].to_vec(), )), - Perks::MarkofTheDevourer => Some(PerkOptionData::static_()), - Perks::SoulDevourer => Some(PerkOptionData::toggle()), - Perks::ToxicOverload => Some(PerkOptionData::static_()), Perks::Foetracer => Some(PerkOptionData::toggle()), Perks::MechaneersTricksleeves => Some(PerkOptionData::toggle()), Perks::Oathkeeper => Some(PerkOptionData::static_()), From b43a07c616c475bd4498dd38059262563e61e92b Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 3 Aug 2023 16:16:28 -0700 Subject: [PATCH 09/10] add: Jotunn edr --- src/perks/exotic_perks.rs | 16 ++++++++++++++++ src/perks/mod.rs | 3 ++- src/perks/perk_options_handler.rs | 1 + src/perks/year_1_perks.rs | 2 +- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/perks/exotic_perks.rs b/src/perks/exotic_perks.rs index dcf7be7a..ce9783bd 100644 --- a/src/perks/exotic_perks.rs +++ b/src/perks/exotic_perks.rs @@ -1142,6 +1142,22 @@ pub fn exotic_perks() { }), ); + add_edr( + Perks::ChargeShot, + Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { + let dmg = if _input.pvp { 8.0 } else { 0.0 }; //NEED PVE VALUE + ExtraDamageResponse { + additive_damage: dmg, + time_for_additive_damage: 1.75, + times_to_hit: 7, + hit_at_same_time: false, + is_dot: true, + explosive_percent: 0.0, + ..Default::default() + } + }), + ); + // add_edr( // Perks::ToxicOverload, // Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { diff --git a/src/perks/mod.rs b/src/perks/mod.rs index c07866b3..c0ff4248 100644 --- a/src/perks/mod.rs +++ b/src/perks/mod.rs @@ -406,7 +406,6 @@ pub enum Perks { MarkofTheDevourer = 1863355414, SoulDevourer = 2921090754, ToxicOverload = 4015745376, - PoisonArrows = 2186532310, //energy exotic LagragianSight = 2881100038, @@ -435,6 +434,8 @@ pub enum Perks { ColdFusion = 1036269296, BlackHole = 3905543891, TemporalUnlimiter = 806917387, + PoisonArrows = 2186532310, + ChargeShot = 1656957541, //heavy exotic ReignHavoc = 4148158229, diff --git a/src/perks/perk_options_handler.rs b/src/perks/perk_options_handler.rs index f0e551a2..2452e609 100644 --- a/src/perks/perk_options_handler.rs +++ b/src/perks/perk_options_handler.rs @@ -351,6 +351,7 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::SoulDevourer => Some(PerkOptionData::toggle()), Perks::ToxicOverload => Some(PerkOptionData::static_()), Perks::PoisonArrows => Some(PerkOptionData::static_()), + Perks::ChargeShot => Some(PerkOptionData::static_()), Perks::DexterityMod => Some(PerkOptionData::stacking(3)), Perks::ReserveMod => Some(PerkOptionData::stacking(3)), diff --git a/src/perks/year_1_perks.rs b/src/perks/year_1_perks.rs index 49866ccd..3c830610 100644 --- a/src/perks/year_1_perks.rs +++ b/src/perks/year_1_perks.rs @@ -694,7 +694,7 @@ pub fn year_1_perks() { add_edr( Perks::ClusterBomb, Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { - let dmg = if _input.pvp { 0.0 } else { 51.0 }; + let dmg = if _input.pvp { 0.0 } else { 51.0 }; //NEED PVP VALUE ExtraDamageResponse { additive_damage: dmg, combatant_scale: true, From e7520b2f6e48decc680849bd436a5dc1ba17f17a Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 3 Aug 2023 16:25:03 -0700 Subject: [PATCH 10/10] add: divinity EDR --- src/perks/exotic_perks.rs | 16 ++++++++++++++++ src/perks/mod.rs | 1 + src/perks/perk_options_handler.rs | 1 + 3 files changed, 18 insertions(+) diff --git a/src/perks/exotic_perks.rs b/src/perks/exotic_perks.rs index ce9783bd..9dc83749 100644 --- a/src/perks/exotic_perks.rs +++ b/src/perks/exotic_perks.rs @@ -1158,6 +1158,22 @@ pub fn exotic_perks() { }), ); + add_edr( + Perks::Penance, + Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { + let dmg = if _input.pvp { 520.0 } else { 1060.0 }; + ExtraDamageResponse { + additive_damage: dmg, + time_for_additive_damage: 3.75, + times_to_hit: 1, + hit_at_same_time: true, + is_dot: false, + explosive_percent: 0.0, + ..Default::default() + } + }), + ) + // add_edr( // Perks::ToxicOverload, // Box::new(|_input: ModifierResponseInput| -> ExtraDamageResponse { diff --git a/src/perks/mod.rs b/src/perks/mod.rs index c0ff4248..7b1d38f5 100644 --- a/src/perks/mod.rs +++ b/src/perks/mod.rs @@ -436,6 +436,7 @@ pub enum Perks { TemporalUnlimiter = 806917387, PoisonArrows = 2186532310, ChargeShot = 1656957541, + Penance = 1185480639, //heavy exotic ReignHavoc = 4148158229, diff --git a/src/perks/perk_options_handler.rs b/src/perks/perk_options_handler.rs index 2452e609..ff58b4fd 100644 --- a/src/perks/perk_options_handler.rs +++ b/src/perks/perk_options_handler.rs @@ -352,6 +352,7 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::ToxicOverload => Some(PerkOptionData::static_()), Perks::PoisonArrows => Some(PerkOptionData::static_()), Perks::ChargeShot => Some(PerkOptionData::static_()), + Perks::Penance => Some(PerkOptionData::static_()), Perks::DexterityMod => Some(PerkOptionData::stacking(3)), Perks::ReserveMod => Some(PerkOptionData::stacking(3)),