diff --git a/build.rs b/build.rs index b7da8fa..6b4c7df 100644 --- a/build.rs +++ b/build.rs @@ -672,8 +672,10 @@ fn default_i32_1() -> i32 { pub struct FiringData { pub damage: f64, pub crit_mult: f64, + pub melee: f64, pub pve_damage: f64, pub pve_crit_mult: f64, + pub pve_melee: f64, pub burst_delay: f64, pub inner_burst_delay: f64, #[serde(default)] @@ -691,8 +693,10 @@ impl From for FiringData { FiringData { damage: value.damage, crit_mult: (value.crit_mult) / 51.0 + 1.5, + melee: value.melee, pve_damage: value.pve_damage, pve_crit_mult: (value.pve_crit_mult) / 51.0 + 1.5, + pve_melee: value.pve_melee, burst_delay: value.burst_delay / 30.0, inner_burst_delay: value.inner_burst_delay / 30.0, burst_size: value.burst_size, @@ -778,8 +782,12 @@ struct RangeJson { struct SubFamJson { damage: f64, crit_mult: f64, + #[serde(default)] + melee: f64, pve_damage: f64, pve_crit_mult: f64, + #[serde(default)] + pve_melee: f64, burst_delay: f64, #[serde(default = "default_i32_1")] burst_size: i32, diff --git a/build_resources/weapon_formulas.json b/build_resources/weapon_formulas.json index 7772ef3..f361dfe 100644 --- a/build_resources/weapon_formulas.json +++ b/build_resources/weapon_formulas.json @@ -1235,7 +1235,7 @@ "2898674462": {"name": "Vexcaliber", "cat": "default", "subFam": "Lightweight", "magProf": "default", "pve": 1.25}, "2898674457": {"name": "Vexcaliber", "cat": "default", "subFam": "Vexcaliber", "magProf": "default", "pve": 1.25}, "1956005708": {"name": "Rapid-Fire Glaive", "cat": "default", "subFam": "Lightweight", "magProf": "default", "pve": 1.25}, - "1207608520": {"name": "Winterbite", "cat": "zero", "subFam": "zero", "magProf": "winterbite"}, + "1207608520": {"name": "Winterbite", "cat": "zero", "subFam": "Winterbite", "magProf": "winterbite"}, "cat": { "default": { "range": {"vpp_start": 0.0546,"offset_start": 15.0,"vpp_end": 0.198,"offset_end": 30.33, "floor_percent": 0.33}, @@ -1259,11 +1259,12 @@ } }, "subFam": { - "Lightweight": {"damage":120.769, "crit_mult":-25.5, "pve_damage":108.07, "pve_crit_mult":-25.5, "burst_delay":22.0, "burst_size":1, "inner_burst_delay":0}, - "Aggressive": {"damage":147.538, "crit_mult":-25.5, "pve_damage":133.75, "pve_crit_mult":-25.5, "burst_delay":30.0, "burst_size":1, "inner_burst_delay":0}, - "Adaptive": {"damage":136.462, "crit_mult":-25.5, "pve_damage":120.91, "pve_crit_mult":-25.5, "burst_delay":27.0, "burst_size":1, "inner_burst_delay":0}, - "Vexcaliber": {"damage":32.962, "crit_mult":-25.5, "pve_damage":30.87, "pve_crit_mult":-25.5, "burst_delay":22.0, "burst_size":5, "inner_burst_delay":0, "one_ammo":true}, - "zero": {"damage":0.0, "crit_mult":0.0, "pve_damage":0.0, "pve_crit_mult":0.0, "burst_delay":0.0, "burst_size":1, "inner_burst_delay":0} + "Lightweight": {"damage":120.899, "crit_mult":-25.5, "melee": 84, "pve_damage":107.801, "pve_crit_mult":-25.5, "pve_melee": 70, "burst_delay":22.0, "burst_size":1, "inner_burst_delay":0}, + "Aggressive": {"damage":147.457, "crit_mult":-25.5, "melee": 84, "pve_damage":131.483, "pve_crit_mult":-25.5, "pve_melee": 70, "burst_delay":30.0, "burst_size":1, "inner_burst_delay":0}, + "Adaptive": {"damage":136.577, "crit_mult":-25.5, "melee": 84, "pve_damage":121.781, "pve_crit_mult":-25.5, "pve_melee": 70, "burst_delay":27.0, "burst_size":1, "inner_burst_delay":0}, + "Vexcaliber": {"damage":33.231, "crit_mult":-25.5, "melee": 84, "pve_damage":36.596, "pve_crit_mult":-25.5, "pve_melee": 70, "burst_delay":22.0, "burst_size":5, "inner_burst_delay":0, "one_ammo":true}, + "Winterbite": {"damage":570, "crit_mult":-25.5, "melee": 84, "pve_damage":508.25, "pve_crit_mult":-25.5, "pve_melee": 70, "burst_delay":30.0, "burst_size":1, "inner_burst_delay":0}, + "zero": {"damage":0.0, "crit_mult":0.0, "melee": 0.0, "pve_damage":0.0, "pve_crit_mult":0.0, "pve_melee": 0.0, "burst_delay":0.0, "burst_size":1, "inner_burst_delay":0} }, "magProf": { diff --git a/src/perks/buff_perks.rs b/src/perks/buff_perks.rs index 201c9ca..822abfd 100644 --- a/src/perks/buff_perks.rs +++ b/src/perks/buff_perks.rs @@ -398,4 +398,36 @@ pub fn buff_perks() { } }), ); + add_dmr( + Perks::BurningFists, + Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } + let buffs = match _input.value { + 1 => (1.0, 1.0, 1.55, 1.4), + 2 => (1.2, 1.0, 2.10, 1.8), + 3 => (1.25, 1.2, 2.65, 2.2), + 4 => (1.3, 1.25, 3.2, 2.6), + 5 => (1.35, 1.25, 3.75, 3.0), + _ => (1.35, 1.25, 3.75, 3.0) + }; + let weapon_buff = if _input.pvp { + emp_buff(_input.cached_data, buffs.1) + } else { + emp_buff(_input.cached_data, buffs.0) + }; + let melee_buff = if _input.calc_data.weapon_type == &WeaponType::GLAIVE { + buffs.3 + } else { + buffs.2 + }; + DamageModifierResponse { + impact_dmg_scale: weapon_buff, + explosive_dmg_scale: weapon_buff, + melee_dmg_scale: melee_buff, + ..Default::default() + } + }), + ); } diff --git a/src/perks/exotic_armor.rs b/src/perks/exotic_armor.rs index 2ac2a43..b377448 100644 --- a/src/perks/exotic_armor.rs +++ b/src/perks/exotic_armor.rs @@ -544,5 +544,37 @@ pub fn exotic_armor() { } stats }), - ) + ); + add_dmr( + Perks::TritonVice, + Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 || _input.calc_data.weapon_type != &WeaponType::GLAIVE { + return DamageModifierResponse::default(); + } + DamageModifierResponse { + melee_dmg_scale: 2.0, + ..Default::default() + } + }), + ); + add_dmr( + Perks::WarlordsSigil, + Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } + let melee_buff = match _input.value { + 1 => 1.55, + 2 => 2.10, + 3 => 2.65, + 4 => 3.2, + 5 => 3.75, + _ => 3.75 + }; + DamageModifierResponse { + melee_dmg_scale: melee_buff, + ..Default::default() + } + }), + ); } diff --git a/src/perks/exotic_perks.rs b/src/perks/exotic_perks.rs index ae81c2e..3c63b1b 100644 --- a/src/perks/exotic_perks.rs +++ b/src/perks/exotic_perks.rs @@ -9,9 +9,10 @@ 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, lib::{ - CalculationInput, DamageModifierResponse, ExtraDamageResponse, FiringModifierResponse, - HandlingModifierResponse, InventoryModifierResponse, MagazineModifierResponse, - RangeModifierResponse, RefundResponse, ReloadModifierResponse, ReloadOverrideResponse, + CalculationInput, DamageModifierResponse, ExplosivePercentResponse, ExtraDamageResponse, + FiringModifierResponse, HandlingModifierResponse, InventoryModifierResponse, + MagazineModifierResponse, RangeModifierResponse, RefundResponse, ReloadModifierResponse, + ReloadOverrideResponse, }, ModifierResponseInput, Perks, }; @@ -1232,6 +1233,40 @@ pub fn exotic_perks() { }), ); + add_dmr( + Perks::PerpetualLoophole, + Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } + DamageModifierResponse { + melee_dmg_scale: 1.2, + ..Default::default() + } + }), + ); + add_epr( + Perks::BigFrigidGlaive, + Box::new(|_input: ModifierResponseInput| -> ExplosivePercentResponse { + ExplosivePercentResponse { + percent: 1.0, + ..Default::default() + } + }), + ); + add_dmr( + Perks::WeightedEdge, + Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } + DamageModifierResponse { + melee_dmg_scale: 1.5, + ..Default::default() + } + }), + ); + add_dmr( Perks::InverseRelationship, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { diff --git a/src/perks/lib.rs b/src/perks/lib.rs index 150f263..98eb61d 100644 --- a/src/perks/lib.rs +++ b/src/perks/lib.rs @@ -141,6 +141,7 @@ pub struct DamageModifierResponse { pub impact_dmg_scale: f64, pub explosive_dmg_scale: f64, pub crit_scale: f64, + pub melee_dmg_scale: f64, } impl Default for DamageModifierResponse { fn default() -> Self { @@ -148,6 +149,7 @@ impl Default for DamageModifierResponse { impact_dmg_scale: 1.0, explosive_dmg_scale: 1.0, crit_scale: 1.0, + melee_dmg_scale: 1.0, } } } @@ -157,7 +159,7 @@ impl DamageModifierResponse { Self { impact_dmg_scale: modifier, explosive_dmg_scale: modifier, - // pending: melee_dmg_scale + melee_dmg_scale: modifier, ..Default::default() } } @@ -423,4 +425,5 @@ pub struct DamageProfile { pub explosion_dmg: f64, pub crit_mult: f64, pub damage_delay: f64, + pub melee_dmg: f64, } diff --git a/src/perks/mod.rs b/src/perks/mod.rs index 35e0968..032253c 100644 --- a/src/perks/mod.rs +++ b/src/perks/mod.rs @@ -152,6 +152,8 @@ pub enum Perks { TritonVice = 187957397, GlacialGuard = 185514250, DoomFang = 1155472387, + BurningFists = 384759955, + WarlordsSigil = 2731901709, //parts ImpactCasing = 3796465595, @@ -446,6 +448,7 @@ pub enum Perks { Tempering = 362132290, ThreadOfAscent = 4208512216, Amplified = 880704824, + BannerOfWar = 988980154, //kinetic exotic CranialSpike = 1319823571, @@ -513,6 +516,7 @@ pub enum Perks { Unrepentant = 2641107734, ArcConductor = 2516532331, VoidLeech = 3441203855, + PerpetualLoophole = 2171805903, InverseRelationship = 1833111001, Spindle = 1180907940, TheRightChoice = 34498892, @@ -538,6 +542,8 @@ pub enum Perks { TargetAquired = 939227542, TractorCannon = 1210807262, MarksmanSights = 1408087975, + BigFrigidGlaive = 1207608520, + WeightedEdge = 75282108, #[num_enum(default)] Ignore = 69420, diff --git a/src/perks/other_perks.rs b/src/perks/other_perks.rs index 6a37733..66576d8 100644 --- a/src/perks/other_perks.rs +++ b/src/perks/other_perks.rs @@ -567,6 +567,21 @@ pub fn other_perks() { } }), ); + + add_dmr( + Perks::BannerOfWar, + Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } + // TODO for glaives handle syntho/wormgod reducing this to 1.125/1.05 respectively + DamageModifierResponse { + melee_dmg_scale: 1.25, + ..Default::default() + } + }), + ); + add_dmr( Perks::SupportFrame, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { diff --git a/src/perks/perk_options_handler.rs b/src/perks/perk_options_handler.rs index 00a725f..ac947f0 100644 --- a/src/perks/perk_options_handler.rs +++ b/src/perks/perk_options_handler.rs @@ -391,6 +391,7 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::HeatRises => Some(PerkOptionData::toggle()), Perks::FlowState => Some(PerkOptionData::toggle()), Perks::ThreadOfAscent => Some(PerkOptionData::toggle()), + Perks::BannerOfWar => Some(PerkOptionData::stacking(4)), Perks::WellOfRadiance => Some(PerkOptionData::static_()), Perks::Amplified => Some(PerkOptionData::static_()), Perks::Radiant => Some(PerkOptionData::static_()), @@ -407,6 +408,9 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::Unrepentant => Some(PerkOptionData::toggle()), Perks::ArcConductor => Some(PerkOptionData::toggle()), Perks::VoidLeech => Some(PerkOptionData::toggle()), + Perks::PerpetualLoophole => Some(PerkOptionData::toggle()), + Perks::BigFrigidGlaive => Some(PerkOptionData::static_()), + Perks::WeightedEdge => Some(PerkOptionData::toggle()), Perks::InverseRelationship => Some(PerkOptionData::stacking(3)), Perks::Spindle => Some(PerkOptionData::stacking(25)), Perks::TheRightChoice => Some(PerkOptionData::static_()), @@ -450,6 +454,8 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::StringTheory => Some(PerkOptionData::static_()), Perks::Judgment => Some(PerkOptionData::toggle()), Perks::DoomFang => Some(PerkOptionData::stacking(4)), + Perks::BurningFists => Some(PerkOptionData::stacking(5)), + Perks::WarlordsSigil => Some(PerkOptionData::stacking(5)), //misc Perks::UmbralSharpening => Some(PerkOptionData::stacking(5)), diff --git a/src/perks/year_5_perks.rs b/src/perks/year_5_perks.rs index defbb5f..74b325f 100644 --- a/src/perks/year_5_perks.rs +++ b/src/perks/year_5_perks.rs @@ -543,4 +543,17 @@ pub fn year_5_perks() { } }), ); + + add_dmr( + Perks::CloseToMelee, + Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } + DamageModifierResponse { + melee_dmg_scale: 1.3, + ..Default::default() + } + }), + ); } diff --git a/src/types/js_types.rs b/src/types/js_types.rs index dfaaf8d..cc5d674 100644 --- a/src/types/js_types.rs +++ b/src/types/js_types.rs @@ -237,6 +237,8 @@ pub struct JsFiringResponse { pub pvp_explosion_damage: f64, #[wasm_bindgen(js_name = "pvpCritMult", readonly)] pub pvp_crit_mult: f64, + #[wasm_bindgen(js_name = "pvpMeleeDamage", readonly)] + pub pvp_melee_damage: f64, #[wasm_bindgen(js_name = "pveImpactDamage", readonly)] pub pve_impact_damage: f64, @@ -244,6 +246,8 @@ pub struct JsFiringResponse { pub pve_explosion_damage: f64, #[wasm_bindgen(js_name = "pveCritMult", readonly)] pub pve_crit_mult: f64, + #[wasm_bindgen(js_name = "pveMeleeDamage", readonly)] + pub pve_melee_damage: f64, #[wasm_bindgen(js_name = "burstDelay", readonly)] pub burst_delay: f64, @@ -262,9 +266,11 @@ impl From for JsFiringResponse { pvp_impact_damage: firing.pvp_impact_damage, pvp_explosion_damage: firing.pvp_explosion_damage, pvp_crit_mult: firing.pvp_crit_mult, + pvp_melee_damage: firing.pvp_melee_damage, pve_impact_damage: firing.pve_impact_damage, pve_explosion_damage: firing.pve_explosion_damage, pve_crit_mult: firing.pve_crit_mult, + pve_melee_damage: firing.pve_melee_damage, burst_delay: firing.burst_delay, inner_burst_delay: firing.inner_burst_delay, burst_size: firing.burst_size, diff --git a/src/types/rs_types.rs b/src/types/rs_types.rs index 0fccd9e..5b124fe 100644 --- a/src/types/rs_types.rs +++ b/src/types/rs_types.rs @@ -21,8 +21,10 @@ pub struct WeaponPath(pub u32, pub u32); pub struct FiringData { pub damage: f64, pub crit_mult: f64, + pub melee: f64, pub pve_damage: f64, pub pve_crit_mult: f64, + pub pve_melee: f64, pub burst_delay: f64, pub inner_burst_delay: f64, pub burst_size: i32, @@ -196,10 +198,12 @@ pub struct FiringResponse { pub pvp_impact_damage: f64, pub pvp_explosion_damage: f64, pub pvp_crit_mult: f64, + pub pvp_melee_damage: f64, pub pve_impact_damage: f64, pub pve_explosion_damage: f64, pub pve_crit_mult: f64, + pub pve_melee_damage: f64, pub burst_delay: f64, pub inner_burst_delay: f64, @@ -227,5 +231,6 @@ impl FiringResponse { ); self.pve_impact_damage *= _rpl_mult * _gpl_mult * _pve_mult * _combatant_mult; self.pve_explosion_damage *= _rpl_mult * _gpl_mult * _pve_mult * _combatant_mult; + self.pve_melee_damage *= _rpl_mult * _gpl_mult * _pve_mult * _combatant_mult; } } diff --git a/src/weapons/stat_calc.rs b/src/weapons/stat_calc.rs index 3085a36..4e84a5a 100644 --- a/src/weapons/stat_calc.rs +++ b/src/weapons/stat_calc.rs @@ -329,6 +329,7 @@ impl Weapon { let impact_dmg = tmp_dmg_prof.impact_dmg; let explosion_dmg = tmp_dmg_prof.explosion_dmg; let crit_mult = tmp_dmg_prof.crit_mult; + let melee_dmg = tmp_dmg_prof.melee_dmg; let fd = self.firing_data; let extra_charge_delay = if self.weapon_type == WeaponType::FUSIONRIFLE { @@ -357,10 +358,12 @@ impl Weapon { pvp_impact_damage: impact_dmg * pvp_damage_modifiers.impact_dmg_scale, pvp_explosion_damage: explosion_dmg * pvp_damage_modifiers.explosive_dmg_scale, pvp_crit_mult: crit_mult * pvp_damage_modifiers.crit_scale, + pvp_melee_damage: melee_dmg * pvp_damage_modifiers.melee_dmg_scale, pve_impact_damage: impact_dmg * pve_damage_modifiers.impact_dmg_scale, pve_explosion_damage: explosion_dmg * pve_damage_modifiers.explosive_dmg_scale, pve_crit_mult: crit_mult * pve_damage_modifiers.crit_scale, + pve_melee_damage: melee_dmg * pve_damage_modifiers.melee_dmg_scale, burst_delay, burst_size, @@ -387,6 +390,11 @@ impl Weapon { self.firing_data.pve_crit_mult }; let mut delay = 0.0; + let melee: f64 = if _pvp { + self.firing_data.melee + } else { + self.firing_data.pve_melee + }; let epr = get_explosion_data(self.list_perks(), &self.static_calc_input(), _pvp); if epr.percent > 0.0 { @@ -403,6 +411,7 @@ impl Weapon { explosion_dmg: explosion, crit_mult: crit, damage_delay: delay, + melee_dmg: melee } } }