diff --git a/build.rs b/build.rs index bc7102a3..e2c9e196 100644 --- a/build.rs +++ b/build.rs @@ -393,7 +393,10 @@ fn main() { } else { let file_res = std::fs::File::open(build_cache_path); if file_res.is_err() { - println!("cargo:warning=error opening cached build file: {}", file_res.err().unwrap()); + println!( + "cargo:warning=error opening cached build file: {}", + file_res.err().unwrap() + ); cached_data = CachedBuildData::default(); } else { let file = file_res.unwrap(); @@ -431,9 +434,11 @@ fn main() { panic!("cargo:warning=error initializing ron serializer"); } else { #[allow(unused_variables)] - let cd: CachedBuildData = ron::de::from_str(&res.clone().unwrap()).expect("cargo:warning=error deserializing"); + let cd: CachedBuildData = ron::de::from_str(&res.clone().unwrap()) + .expect("cargo:warning=error deserializing"); } - file.write_all(res.unwrap().as_bytes()).expect("cargo:warning=error writing cached build file"); + file.write_all(res.unwrap().as_bytes()) + .expect("cargo:warning=error writing cached build file"); } } @@ -856,11 +861,12 @@ fn construct_enhance_perk_mapping(formula_file: &mut File, cached: &mut CachedBu (902, vec!["VEIST Rapid-Fire", "Rapid-Fire Frame"]), (903, vec!["Adaptive Frame", "Adaptive Glaive"]), (904, vec!["Aggressive Frame", "Aggressive Glaive"]), - (905, vec!["Lightweight Frame", "MIDA Synergy"]), + (905, vec!["Lightweight Frame"]), (906, vec!["Precision Frame", "Häkke Precision Frame"]), (907, vec!["Double Fire"]), (908, vec!["Wave Frame"]), (911, vec!["Legacy PR-55 Frame"]), + (912, vec!["MIDA Synergy"]), ]); let content_paths = manifest_json["Response"]["jsonWorldComponentContentPaths"] ["en"] diff --git a/build_resources/cached_build.ron b/build_resources/cached_build.ron index 4726aa7b..c84e0317 100644 --- a/build_resources/cached_build.ron +++ b/build_resources/cached_build.ron @@ -204,7 +204,7 @@ (1034287523, 906), (1045795938, 906), (1052350088, 906), - (1057935015, 905), + (1057935015, 912), (1063261332, 904), (1069611115, 904), (1206996986, 906), @@ -249,7 +249,7 @@ (1831499663, 904), (1875323682, 901), (1886418605, 902), - (1891876363, 905), + (1891876363, 912), (1894749743, 902), (1900989425, 903), (1946568256, 901), @@ -269,7 +269,7 @@ (2164888232, 902), (2178772051, 903), (2189829540, 903), - (2213377102, 905), + (2213377102, 912), (2213429699, 907), (2260949877, 902), (2263539715, 902), @@ -278,7 +278,7 @@ (2409208302, 906), (2444870733, 907), (2458294492, 906), - (2470575005, 905), + (2470575005, 912), (2490530085, 903), (2516075140, 901), (2518716062, 904), @@ -286,7 +286,7 @@ (2563509458, 906), (2617324347, 901), (2662827496, 904), - (2670025099, 905), + (2670025099, 912), (2696719570, 903), (2725422375, 906), (2743098132, 906), diff --git a/src/perks/buff_perks.rs b/src/perks/buff_perks.rs index 24e39bf5..92d9b891 100644 --- a/src/perks/buff_perks.rs +++ b/src/perks/buff_perks.rs @@ -215,7 +215,7 @@ pub fn buff_perks() { ); add_dmr( - Perks::TractorCannon, + Perks::RepulsorForce, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { let des_debuff = if _input.pvp { 1.5 } else { 1.3 }; let debuff = gbl_debuff(_input.cached_data, des_debuff); diff --git a/src/perks/exotic_armor.rs b/src/perks/exotic_armor.rs index 2f4a1759..3b3509b8 100644 --- a/src/perks/exotic_armor.rs +++ b/src/perks/exotic_armor.rs @@ -6,12 +6,12 @@ use crate::{ }; use super::{ - add_dmr, add_epr, add_flmr, add_fmr, add_hmr, add_mmr, add_rmr, add_rsmr, add_sbr, add_vmr, + add_dmr, add_epr, add_flmr, add_fmr, add_hmr, add_mmr, add_rmr, add_rsmr, add_sbr, add_vmr, add_msmr, clamp, lib::{ CalculationInput, DamageModifierResponse, ExtraDamageResponse, FiringModifierResponse, FlinchModifierResponse, HandlingModifierResponse, RangeModifierResponse, RefundResponse, - ReloadModifierResponse, ReloadOverrideResponse, + ReloadModifierResponse, ReloadOverrideResponse, MovementSpeedModifierResponse, }, ModifierResponseInput, Perks, }; @@ -559,4 +559,55 @@ pub fn exotic_armor() { RangeModifierResponse::default() }), ); + + add_msmr( + Perks::Transversives, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + sprint_speed: 0.5, + crouch_speed: 4.0, + slide_distance_mult: 1.33, + ..Default::default() + } + }), + ); + + add_msmr( + Perks::Stompees, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + sprint_speed: 0.5, + slide_distance_mult: 1.33, + ..Default::default() + } + }), + ); + + add_msmr( + Perks::Dunemarchers, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + sprint_speed: 0.5, + slide_distance_mult: 1.33, + ..Default::default() + } + }) + ); + + add_msmr( + Perks::Peacekeepers, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + if _input.calc_data.weapon_type == &WeaponType::SUBMACHINEGUN { + MovementSpeedModifierResponse { + sprint_speed: 0.5, + slide_distance_mult: 1.33, + strafe_speed_mult: 1.09, + ..Default::default() + } + } + else { + MovementSpeedModifierResponse::default() + } + }), + ); } diff --git a/src/perks/exotic_perks.rs b/src/perks/exotic_perks.rs index d0995e5a..23496a2b 100644 --- a/src/perks/exotic_perks.rs +++ b/src/perks/exotic_perks.rs @@ -4,12 +4,13 @@ use std::collections::HashMap; use crate::{d2_enums::StatHashes, enemies::EnemyType, weapons::Stat}; use super::{ - add_dmr, add_edr, add_epr, add_fmr, add_hmr, add_mmr, add_rmr, add_rr, add_rsmr, add_sbr, - add_vmr, clamp, + add_dmr, add_edr, add_epr, add_fmr, add_hmr, add_mmr, add_msmr, add_rmr, add_rr, add_rsmr, + add_sbr, add_vmr, clamp, lib::{ CalculationInput, DamageModifierResponse, ExtraDamageResponse, FiringModifierResponse, HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, - RangeModifierResponse, RefundResponse, ReloadModifierResponse, ReloadOverrideResponse, + MovementSpeedModifierResponse, RangeModifierResponse, RefundResponse, + ReloadModifierResponse, ReloadOverrideResponse, }, ModifierResponseInput, Perks, }; @@ -934,4 +935,58 @@ pub fn exotic_perks() { } }), ); + + add_msmr( + Perks::RepulsorForce, + Box::new( + |_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + sprint_speed: 1.0, + ..Default::default() + } + }, + ), + ); + + add_msmr( + Perks::MidaMT, + Box::new( + |_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + sprint_speed: 0.8, + ..Default::default() + } + }, + ), + ); + + add_msmr(Perks::HarshTruths, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + if _input.value > 0 { + MovementSpeedModifierResponse { + sprint_speed: 0.5, + slide_distance_mult: 1.33, + extra_mobility: 20, + ..Default::default() + } + } + else { + MovementSpeedModifierResponse::default() + } + }), + ); + + add_rsmr(Perks::LastStand, + Box::new(|_input: ModifierResponseInput| -> ReloadModifierResponse { + if _input.value > 0 { + ReloadModifierResponse { + reload_stat_add: 30, + ..Default::default() + } + } + else { + ReloadModifierResponse::default() + } + }), + ); } diff --git a/src/perks/lib.rs b/src/perks/lib.rs index 46e498e2..9ed34974 100644 --- a/src/perks/lib.rs +++ b/src/perks/lib.rs @@ -389,6 +389,33 @@ impl Default for DamageResistModifierResponse { } } +#[derive(Debug, Clone, PartialEq, Serialize)] +pub struct MovementSpeedModifierResponse { + // if mult isn't in the var name its additive + // exception for the crouch speed since all things + // that affect crouch speed just set it to a value as far as I could tell + pub sprint_speed: f64, + pub crouch_speed: f64, + pub slide_distance_mult: f64, + pub base_jump_height_mult: f64, + pub strafe_speed_mult: f64, + pub extra_mobility: i32, + pub ads_scalar: f64, +} +impl Default for MovementSpeedModifierResponse { + fn default() -> Self { + Self { + sprint_speed: 0.0, + crouch_speed: 0.0, + slide_distance_mult: 1.0, + base_jump_height_mult: 1.0, + strafe_speed_mult: 1.0, + extra_mobility: 0, + ads_scalar: 1.0, + } + } +} + #[derive(Debug, Clone, PartialEq, Serialize)] pub struct ModifierResponseSummary { pub rmr: Option, @@ -401,6 +428,7 @@ pub struct ModifierResponseSummary { pub imr: Option, pub drmr: Option, pub statbump: Option>, + pub msmr: Option, } impl Default for ModifierResponseSummary { @@ -416,6 +444,7 @@ impl Default for ModifierResponseSummary { imr: None, drmr: None, statbump: None, + msmr: None, } } } diff --git a/src/perks/meta_perks.rs b/src/perks/meta_perks.rs index 9bb241d4..7387533c 100644 --- a/src/perks/meta_perks.rs +++ b/src/perks/meta_perks.rs @@ -7,12 +7,12 @@ use crate::{ use super::{ add_dmr, add_epr, add_flmr, add_fmr, add_hmr, add_imr, add_mmr, add_rmr, add_rsmr, add_sbr, - add_vmr, clamp, + add_vmr, add_msmr, clamp, lib::{ CalculationInput, DamageModifierResponse, ExplosivePercentResponse, ExtraDamageResponse, FiringModifierResponse, FlinchModifierResponse, HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, RangeModifierResponse, RefundResponse, - ReloadModifierResponse, + ReloadModifierResponse, MovementSpeedModifierResponse, }, ModifierResponseInput, Perks, }; diff --git a/src/perks/mod.rs b/src/perks/mod.rs index 8635c05d..af8c99c6 100644 --- a/src/perks/mod.rs +++ b/src/perks/mod.rs @@ -32,8 +32,8 @@ use self::{ CalculationInput, DamageModifierResponse, ExplosivePercentResponse, ExtraDamageResponse, FiringModifierResponse, FlinchModifierResponse, HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, ModifierResponseSummary, - RangeModifierResponse, RefundResponse, ReloadModifierResponse, ReloadOverrideResponse, - VelocityModifierResponse, + MovementSpeedModifierResponse, RangeModifierResponse, RefundResponse, + ReloadModifierResponse, ReloadOverrideResponse, VelocityModifierResponse, }, meta_perks::*, origin_perks::*, @@ -104,6 +104,8 @@ pub enum Perks { //intrinsics RapidFireFrame = 902, + MidaSynergy = 912, + Lightweights = 905, //armor DexterityMod = 1001, @@ -141,6 +143,8 @@ pub enum Perks { Gyrfalcon = 3809192347, AeonInsight = 3651607301, Felwinters = 622433369, + Transversives = 2954558333, + Dunemarchers = 1160559849, //parts ImpactCasing = 3796465595, @@ -361,6 +365,7 @@ pub enum Perks { Tempering = 362132290, ThreadOfAscent = 4208512216, Amplified = 880704824, + Dilation = 2272984656, //kinetic exotic CranialSpike = 1319823571, @@ -389,6 +394,9 @@ pub enum Perks { Roadborn = 1658733671, MarkovChain = 2814973067, MementoMori = 647617635, + MidaMT = 1331482397, + HarshTruths = 2307143135, + LastStand = 4146729347, //energy exotic LagragianSight = 2881100038, @@ -420,7 +428,7 @@ pub enum Perks { DarkDescent = 3333994164, TargetAquired = 939227542, SleeperCatalyst = 2142466730, - TractorCannon = 1210807262, + RepulsorForce = 1210807262, #[num_enum(default)] Ignore = 69420, @@ -449,6 +457,7 @@ pub struct PersistentModifierResponses { pub epr: HashMap ExplosivePercentResponse>>, pub mmr: HashMap MagazineModifierResponse>>, pub imr: HashMap InventoryModifierResponse>>, + pub msmr: HashMap MovementSpeedModifierResponse>>, } impl PersistentModifierResponses { fn is_empty(&self) -> bool { @@ -570,6 +579,13 @@ impl PersistentModifierResponses { InventoryModifierResponse::default() } } + fn get_msmr(&self, perk: Perks, input: ModifierResponseInput) -> MovementSpeedModifierResponse { + if let Some(func) = self.msmr.get(&perk) { + func(input) + } else { + MovementSpeedModifierResponse::default() + } + } } fn add_sbr(perk: Perks, func: Box HashMap>) { @@ -637,6 +653,14 @@ fn add_imr(perk: Perks, func: Box InventoryModi map.borrow_mut().imr.insert(perk, func); }); } +fn add_msmr( + perk: Perks, + func: Box MovementSpeedModifierResponse>, +) { + PERK_FUNC_MAP.with(|map| { + map.borrow_mut().msmr.insert(perk, func); + }); +} pub fn get_stat_bumps( _perks: Vec, @@ -991,6 +1015,34 @@ pub fn get_velocity_modifier( velocity } +pub fn get_movement_modifier( + _perks: Vec, + _input_data: &CalculationInput, + _pvp: bool, + _cached_data: &mut HashMap, +) -> MovementSpeedModifierResponse { + let mut buffer = MovementSpeedModifierResponse::default(); + for perk in _perks { + let tmp = PERK_FUNC_MAP.with(|pers_modifier| { + let inp = ModifierResponseInput { + is_enhanced: perk.enhanced, + value: perk.value, + calc_data: &_input_data, + pvp: _pvp, + cached_data: _cached_data, + }; + pers_modifier.borrow().get_msmr(perk.hash.into(), inp) + }); + buffer.crouch_speed += tmp.crouch_speed; + buffer.extra_mobility += tmp.extra_mobility; + buffer.sprint_speed += tmp.sprint_speed; + buffer.base_jump_height_mult *= buffer.base_jump_height_mult; + buffer.slide_distance_mult *= buffer.slide_distance_mult; + buffer.strafe_speed_mult *= buffer.strafe_speed_mult; + } + buffer +} + impl Weapon { pub fn get_modifier_summary( &self, diff --git a/src/perks/other_perks.rs b/src/perks/other_perks.rs index 7a4b41ec..882f146e 100644 --- a/src/perks/other_perks.rs +++ b/src/perks/other_perks.rs @@ -8,13 +8,13 @@ use crate::{ }; use super::{ - add_dmr, add_epr, add_fmr, add_hmr, add_imr, add_mmr, add_rmr, add_rsmr, add_sbr, add_vmr, + add_dmr, add_epr, add_fmr, add_hmr, add_imr, add_mmr, add_rmr, add_rsmr, add_sbr, add_vmr, add_msmr, clamp, lib::{ CalculationInput, DamageModifierResponse, ExtraDamageResponse, FiringModifierResponse, FlinchModifierResponse, HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, RangeModifierResponse, RefundResponse, ReloadModifierResponse, - ReloadOverrideResponse, + ReloadOverrideResponse, MovementSpeedModifierResponse }, ModifierResponseInput, Perks, }; @@ -573,4 +573,67 @@ pub fn other_perks() { } }), ); + + add_msmr( + Perks::Lightweights, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + sprint_speed: 0.5, + extra_mobility: 20, + ..Default::default() + } + }), + ); + + add_msmr( + Perks::MidaSynergy, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + let speed_bonus = if _input.value > 0 { 0.8 } else { 0.5 }; // mida synergy bonus is 10%, unsure if my number is accurate + MovementSpeedModifierResponse { + sprint_speed: speed_bonus, + extra_mobility: 20, + ..Default::default() + } + }), + ); + + add_msmr( + Perks::Dilation, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + if _input.value > 0 { + MovementSpeedModifierResponse { + // crouch speed is set to 4.0 and cannot be lowered by slows + crouch_speed: 4.0, + ..Default::default() + } + } + else { + MovementSpeedModifierResponse::default() + } + }), + ); + + add_msmr( + Perks::Amplified, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + // Speed boosted + if _input.value > 0 { + MovementSpeedModifierResponse { + sprint_speed: 1.0, // this number may be incorrect + slide_distance_mult: 1.5, + extra_mobility: 50, + base_jump_height_mult: 1.5, + ..Default::default() + } + } + // normal amplified + else { + MovementSpeedModifierResponse { + slide_distance_mult: 1.33, + extra_mobility: 50, + ..Default::default() + } + } + }), + ); } diff --git a/src/perks/perk_options_handler.rs b/src/perks/perk_options_handler.rs index 02ebe802..648cff85 100644 --- a/src/perks/perk_options_handler.rs +++ b/src/perks/perk_options_handler.rs @@ -87,7 +87,8 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { //intrinsics Perks::RapidFireFrame => Some(PerkOptionData::toggle()), - + Perks::Lightweights => Some(PerkOptionData::static_()), + Perks::MidaSynergy => Some(PerkOptionData::toggle()), //armor //parts @@ -280,9 +281,7 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { //exotics Perks::CranialSpike => Some(PerkOptionData::stacking(5)), - Perks::DarkForgedTrigger => Some(PerkOptionData::options_raw( - ["Hip-Fire", "ADS"].to_vec() - )), + Perks::DarkForgedTrigger => Some(PerkOptionData::options_raw(["Hip-Fire", "ADS"].to_vec())), Perks::AgersCall => Some(PerkOptionData::toggle()), Perks::LagragianSight => Some(PerkOptionData::toggle()), Perks::StringofCurses => Some(PerkOptionData::stacking(5)), @@ -331,7 +330,10 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::RideTheBull => Some(PerkOptionData::stacking(2)), Perks::NobleRounds => Some(PerkOptionData::toggle()), Perks::MementoMori => Some(PerkOptionData::toggle()), - Perks::TractorCannon => Some(PerkOptionData::toggle()), + Perks::RepulsorForce => Some(PerkOptionData::toggle()), + Perks::MidaMT => Some(PerkOptionData::static_()), + Perks::HarshTruths => Some(PerkOptionData::toggle()), + Perks::LastStand => Some(PerkOptionData::toggle()), Perks::DexterityMod => Some(PerkOptionData::stacking(3)), Perks::ReserveMod => Some(PerkOptionData::stacking(3)), @@ -342,8 +344,6 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::OnYourMark => Some(PerkOptionData::stacking(3)), Perks::Frequency => Some(PerkOptionData::toggle()), Perks::Tempering => Some(PerkOptionData::toggle()), - Perks::DragonShadow => Some(PerkOptionData::toggle()), - Perks::OphidianAspect => Some(PerkOptionData::static_()), Perks::Hedrons => Some(PerkOptionData::toggle()), Perks::HeatRises => Some(PerkOptionData::toggle()), Perks::FlowState => Some(PerkOptionData::toggle()), @@ -357,6 +357,7 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::BannerShield => Some(PerkOptionData::static_()), Perks::DeadFall => Some(PerkOptionData::toggle()), Perks::MoebiusQuiver => Some(PerkOptionData::toggle()), + Perks::Dilation => Some(PerkOptionData::toggle()), Perks::PathOfTheBurningSteps => Some(PerkOptionData::stacking(4)), Perks::MantleOfBattleHarmony => Some(PerkOptionData::static_()), @@ -386,6 +387,10 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::Gyrfalcon => Some(PerkOptionData::toggle()), Perks::AeonInsight => Some(PerkOptionData::toggle()), Perks::Felwinters => Some(PerkOptionData::toggle()), + Perks::Transversives => Some(PerkOptionData::static_()), + Perks::Dunemarchers => Some(PerkOptionData::static_()), + Perks::DragonShadow => Some(PerkOptionData::toggle()), + Perks::OphidianAspect => Some(PerkOptionData::static_()), //misc Perks::UmbralSharpening => Some(PerkOptionData::stacking(5)), @@ -394,8 +399,6 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::FullStop => Some(PerkOptionData::static_()), Perks::HakkeHeavyBurst => Some(PerkOptionData::static_()), - - Perks::Ignore => None, } } diff --git a/src/perks/year_1_perks.rs b/src/perks/year_1_perks.rs index 0e299947..408ed062 100644 --- a/src/perks/year_1_perks.rs +++ b/src/perks/year_1_perks.rs @@ -7,12 +7,12 @@ use crate::{ use super::{ add_dmr, add_edr, add_epr, add_fmr, add_hmr, add_imr, add_mmr, add_rmr, add_rr, add_rsmr, - add_sbr, add_vmr, clamp, lerp, + add_sbr, add_vmr, add_msmr, clamp, lerp, lib::{ CalculationInput, DamageModifierResponse, ExplosivePercentResponse, ExtraDamageResponse, FiringModifierResponse, HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, RangeModifierResponse, RefundResponse, ReloadModifierResponse, - VelocityModifierResponse, + VelocityModifierResponse, MovementSpeedModifierResponse, }, ModifierResponseInput, Perks, }; @@ -826,4 +826,15 @@ pub fn year_1_perks() { }, ), ); + + add_msmr( + Perks::MovingTarget, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + ads_scalar: 1.025, + ..Default::default() + } + }), + ); + } diff --git a/src/perks/year_3_perks.rs b/src/perks/year_3_perks.rs index 77d02043..1b63bbfd 100644 --- a/src/perks/year_3_perks.rs +++ b/src/perks/year_3_perks.rs @@ -6,11 +6,11 @@ use crate::{ }; use super::{ - add_dmr, add_epr, add_fmr, add_hmr, add_mmr, add_rmr, add_rsmr, add_sbr, add_vmr, + add_dmr, add_epr, add_fmr, add_hmr, add_mmr, add_rmr, add_rsmr, add_sbr, add_vmr, add_msmr, lib::{ CalculationInput, DamageModifierResponse, ExtraDamageResponse, FiringModifierResponse, HandlingModifierResponse, MagazineModifierResponse, RangeModifierResponse, RefundResponse, - ReloadModifierResponse, + ReloadModifierResponse, MovementSpeedModifierResponse, }, ModifierResponseInput, Perks, }; @@ -79,6 +79,16 @@ pub fn year_3_perks() { }), ); + add_msmr( + Perks::ElementalCapacitor, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + ads_scalar: 1.05, + ..Default::default() + } + }), + ); + add_sbr( Perks::KillingWind, Box::new(|_input: ModifierResponseInput| -> HashMap { @@ -128,6 +138,16 @@ pub fn year_3_perks() { ), ); + add_msmr( + Perks::KillingWind, + Box::new(|_input: ModifierResponseInput| -> MovementSpeedModifierResponse { + MovementSpeedModifierResponse { + extra_mobility: 50, + ..Default::default() + } + }), + ); + add_dmr( Perks::LastingImpression, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { diff --git a/src/types/rs_types.rs b/src/types/rs_types.rs index 6b5f86f2..6b6be5db 100644 --- a/src/types/rs_types.rs +++ b/src/types/rs_types.rs @@ -208,3 +208,23 @@ impl FiringResponse { self.pve_explosion_damage *= _rpl_mult * _gpl_mult * _pve_mult * _combatant_mult; } } + +pub struct MovementResponse { + pub sprint_speed: f64, + pub walk_speed: f64, + pub strafe_speed: f64, + pub crouch_speed: f64, + pub slide_distance: f64, +} + +impl Default for MovementResponse { + fn default() -> Self { + MovementResponse { + sprint_speed: 8.0, + walk_speed: 5.0, + strafe_speed: 4.25, + crouch_speed: 2.75, + slide_distance: 5.25, //recheck + } + } +} diff --git a/src/weapons/stat_calc.rs b/src/weapons/stat_calc.rs index 68328cfb..f126eb8e 100644 --- a/src/weapons/stat_calc.rs +++ b/src/weapons/stat_calc.rs @@ -5,18 +5,18 @@ 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_handling_modifier, get_magazine_modifier, get_movement_modifier, get_range_modifier, + get_reload_modifier, get_reserve_modifier, get_velocity_modifier, lib::{ CalculationInput, DamageModifierResponse, FiringModifierResponse, HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, - RangeModifierResponse, ReloadModifierResponse, + MovementSpeedModifierResponse, RangeModifierResponse, ReloadModifierResponse, }, Perks, }, types::rs_types::{ - AmmoFormula, AmmoResponse, FiringResponse, HandlingFormula, HandlingResponse, RangeFormula, - RangeResponse, ReloadFormula, ReloadResponse, + AmmoFormula, AmmoResponse, FiringResponse, HandlingFormula, HandlingResponse, + MovementResponse, RangeFormula, RangeResponse, ReloadFormula, ReloadResponse, }, }; @@ -221,7 +221,13 @@ impl AmmoFormula { let mut reserve_size = 1; if _calc_inv { - reserve_size = calc_reserves(raw_mag_size, _mag_stat as i32, inv_stat as i32, _inv_id, _inv_modifiers.inv_scale); + reserve_size = calc_reserves( + raw_mag_size, + _mag_stat as i32, + inv_stat as i32, + _inv_id, + _inv_modifiers.inv_scale, + ); } AmmoResponse { mag_size, @@ -591,6 +597,44 @@ impl Weapon { buffer.insert("perfect_draw".to_string(), self.calc_perfect_draw()); } + buffer + } +} + +impl Weapon { + pub fn calc_movement_speed( + &self, + _calc_input: Option, + _mobility: i32, + _pvp: bool, + _ads: bool, + _cached_data: Option<&mut HashMap>, + ) -> MovementResponse { + let mut default_cached_data = HashMap::new(); + let cached_data = _cached_data.unwrap_or(&mut default_cached_data); + let mut buffer = MovementResponse::default(); + let modifiers = get_movement_modifier( + self.list_perks(), + &self.static_calc_input(), + _pvp, + cached_data, + ); + + let mobility = (_mobility + modifiers.extra_mobility).clamp(0, 100); + let ads_scalar = if _ads { + 0.75 * modifiers.ads_scalar + } else { + 1.0 + }; + + let scalar = 1.0 + (mobility / 10) as f64 * 0.04 * ads_scalar; + buffer.crouch_speed *= scalar; + buffer.strafe_speed *= scalar; + buffer.walk_speed *= scalar; + buffer.sprint_speed += modifiers.sprint_speed.clamp(0.0, 1.0); + + + buffer } }