diff --git a/src/perks/buff_perks.rs b/src/perks/buff_perks.rs index 3c4d52d0..59071184 100644 --- a/src/perks/buff_perks.rs +++ b/src/perks/buff_perks.rs @@ -63,6 +63,7 @@ pub fn buff_perks() { add_dmr( Perks::WellOfRadiance, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 {return DamageModifierResponse::default();} let buff = emp_buff(_input.cached_data, 1.25); DamageModifierResponse { impact_dmg_scale: buff, @@ -91,6 +92,7 @@ pub fn buff_perks() { add_dmr( Perks::Radiant, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 {return DamageModifierResponse::default();} let des_buff = if _input.pvp { 1.1 } else { 1.25 }; let buff = emp_buff(_input.cached_data, des_buff); _input.cached_data.insert("radiant".to_string(), 1.0); @@ -105,6 +107,9 @@ pub fn buff_perks() { add_dmr( Perks::PathOfTheBurningSteps, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } let buff = surge_buff(_input.cached_data, _input.value, _input.pvp); DamageModifierResponse { impact_dmg_scale: buff, @@ -117,6 +122,7 @@ pub fn buff_perks() { add_dmr( Perks::BannerShield, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 {return DamageModifierResponse::default();} let des_buff = if _input.pvp { 1.35 } else { 1.4 }; let buff = emp_buff(_input.cached_data, des_buff); DamageModifierResponse { @@ -130,6 +136,7 @@ pub fn buff_perks() { add_dmr( Perks::EmpRift, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 {return DamageModifierResponse::default();} let des_buff = if _input.pvp { 1.15 } else { 1.2 }; let buff = emp_buff(_input.cached_data, des_buff); DamageModifierResponse { @@ -143,6 +150,9 @@ pub fn buff_perks() { add_dmr( Perks::WardOfDawn, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } let buff = emp_buff(_input.cached_data, 1.25); DamageModifierResponse { impact_dmg_scale: buff, @@ -155,6 +165,9 @@ pub fn buff_perks() { add_dmr( Perks::Gyrfalcon, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } let des_buff = if _input.pvp { 1.0 } else { 1.35 }; let buff = emp_buff(_input.cached_data, des_buff); DamageModifierResponse { @@ -168,16 +181,16 @@ pub fn buff_perks() { add_dmr( Perks::AeonInsight, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { - if _input.value > 0 { - let des_buff = if _input.pvp { 1.0 } else { 1.35 }; - let buff = emp_buff(_input.cached_data, des_buff); - DamageModifierResponse { - impact_dmg_scale: buff, - explosive_dmg_scale: buff, - ..Default::default() - } - } else { - DamageModifierResponse::default() + if _input.value == 0 { + return DamageModifierResponse::default(); + } + + let des_buff = if _input.pvp { 1.0 } else { 1.35 }; + let buff = emp_buff(_input.cached_data, des_buff); + DamageModifierResponse { + impact_dmg_scale: buff, + explosive_dmg_scale: buff, + ..Default::default() } }), ); @@ -222,6 +235,7 @@ pub fn buff_perks() { add_dmr( Perks::Weaken, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 {return DamageModifierResponse::default();} let des_debuff = if _input.pvp { 1.075 } else { 1.15 }; let debuff = gbl_debuff(_input.cached_data, des_debuff); DamageModifierResponse { @@ -235,6 +249,9 @@ pub fn buff_perks() { add_dmr( Perks::TractorCannon, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } let des_debuff = if _input.pvp { 1.5 } else { 1.3 }; let debuff = gbl_debuff(_input.cached_data, des_debuff); DamageModifierResponse { @@ -248,6 +265,7 @@ pub fn buff_perks() { add_dmr( Perks::MoebiusQuiver, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 {return DamageModifierResponse::default();} let des_debuff = if _input.pvp { 1.5 } else { 1.3 }; let debuff = gbl_debuff(_input.cached_data, des_debuff); DamageModifierResponse { @@ -260,6 +278,7 @@ pub fn buff_perks() { add_dmr( Perks::DeadFall, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 {return DamageModifierResponse::default();} let des_debuff = if _input.pvp { 1.5 } else { 1.3 }; let debuff = gbl_debuff(_input.cached_data, des_debuff); DamageModifierResponse { @@ -272,15 +291,14 @@ pub fn buff_perks() { add_dmr( Perks::Felwinters, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { - if _input.value > 0 { - let debuff = gbl_debuff(_input.cached_data, 1.3); - DamageModifierResponse { - impact_dmg_scale: debuff, - explosive_dmg_scale: debuff, - ..Default::default() - } - } else { - DamageModifierResponse::default() + if _input.value == 0 { + return DamageModifierResponse::default(); + } + let debuff = gbl_debuff(_input.cached_data, 1.3); + DamageModifierResponse { + impact_dmg_scale: debuff, + explosive_dmg_scale: debuff, + ..Default::default() } }), ); diff --git a/src/perks/exotic_armor.rs b/src/perks/exotic_armor.rs index 37b6d7ab..9a463730 100644 --- a/src/perks/exotic_armor.rs +++ b/src/perks/exotic_armor.rs @@ -30,24 +30,14 @@ pub fn exotic_armor() { }), ); - add_dmr( - Perks::MechaneersTricksleeves, - Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { - let mut dmr = DamageModifierResponse::default(); - if _input.value <= 0 || _input.calc_data.weapon_type != &WeaponType::SIDEARM { - return dmr; - }; - let damage_mult = if _input.pvp { 1.35 } else { 2.0 }; - dmr.explosive_dmg_scale = damage_mult; - dmr.impact_dmg_scale = damage_mult; - dmr - }), - ); - //doesnt work for sturm overcharge, (maybe) memento add_dmr( Perks::LuckyPants, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { + if _input.value == 0 { + return DamageModifierResponse::default(); + } + let perks = _input.calc_data.perk_value_map.clone(); let perk_check = @@ -90,11 +80,10 @@ pub fn exotic_armor() { add_flmr( Perks::TomeOfDawn, Box::new(|_input: ModifierResponseInput| -> FlinchModifierResponse { - if _input.value > 0 { - FlinchModifierResponse { flinch_scale: 0.80 } - } else { - FlinchModifierResponse::default() + if _input.value == 0 { + return FlinchModifierResponse::default(); } + FlinchModifierResponse { flinch_scale: 0.80 } }), ); @@ -130,7 +119,7 @@ pub fn exotic_armor() { Box::new( |_input: ModifierResponseInput| -> HashMap { let mut stats = HashMap::new(); - if _input.calc_data.weapon_type == &WeaponType::SIDEARM { + if _input.value > 0 && _input.calc_data.weapon_type == &WeaponType::SIDEARM { stats.insert(StatHashes::AIRBORNE.into(), 50); stats.insert(StatHashes::HANDLING.into(), 100); stats.insert(StatHashes::RELOAD.into(), 100); @@ -144,13 +133,12 @@ pub fn exotic_armor() { Perks::MechaneersTricksleeves, Box::new( |_input: ModifierResponseInput| -> HandlingModifierResponse { - if _input.calc_data.weapon_type == &WeaponType::SIDEARM { - HandlingModifierResponse { - stat_add: 100, - ..Default::default() - } - } else { - HandlingModifierResponse::default() + if _input.value == 0 || _input.calc_data.weapon_type != &WeaponType::SIDEARM { + return HandlingModifierResponse::default(); + } + HandlingModifierResponse { + stat_add: 100, + ..Default::default() } }, ), @@ -158,13 +146,12 @@ pub fn exotic_armor() { add_rsmr( Perks::MechaneersTricksleeves, Box::new(|_input: ModifierResponseInput| -> ReloadModifierResponse { - if _input.calc_data.weapon_type == &WeaponType::SIDEARM { - ReloadModifierResponse { - reload_stat_add: 100, - ..Default::default() - } - } else { - ReloadModifierResponse::default() + if _input.value == 0 || _input.calc_data.weapon_type != &WeaponType::SIDEARM { + return ReloadModifierResponse::default(); + } + ReloadModifierResponse { + reload_stat_add: 100, + ..Default::default() } }), ); @@ -172,15 +159,15 @@ pub fn exotic_armor() { add_dmr( Perks::MechaneersTricksleeves, Box::new(|_input: ModifierResponseInput| -> DamageModifierResponse { - let mult = if _input.pvp { 1.35 } else { 2.0 }; - if _input.value > 0 && _input.calc_data.weapon_type == &WeaponType::SIDEARM { - DamageModifierResponse { - explosive_dmg_scale: mult, - impact_dmg_scale: mult, - ..Default::default() - } - } else { - DamageModifierResponse::default() + if _input.value == 0 || _input.calc_data.weapon_type != &WeaponType::SIDEARM { + return DamageModifierResponse::default(); + } + + let damage_mult = if _input.pvp { 1.35 } else { 2.0 }; + DamageModifierResponse { + explosive_dmg_scale: damage_mult, + impact_dmg_scale: damage_mult, + ..Default::default() } }), ); @@ -264,7 +251,7 @@ pub fn exotic_armor() { Box::new( |_input: ModifierResponseInput| -> HashMap { let mut stats = HashMap::new(); - if _input.calc_data.weapon_type == &WeaponType::SHOTGUN { + if _input.value > 0 && _input.calc_data.weapon_type == &WeaponType::SHOTGUN { stats.insert(StatHashes::AIRBORNE.into(), 30); }; stats @@ -292,13 +279,16 @@ pub fn exotic_armor() { Perks::ActiumWarRig, Box::new( |_input: ModifierResponseInput| -> HashMap { - let mut stats = HashMap::new(); - if _input.calc_data.weapon_type == &WeaponType::AUTORIFLE - || _input.calc_data.weapon_type == &WeaponType::MACHINEGUN + if _input.value == 0 + || !matches!( + *_input.calc_data.weapon_type, + WeaponType::AUTORIFLE | WeaponType::MACHINEGUN + ) { - stats.insert(StatHashes::AIRBORNE.into(), 30); + return HashMap::new(); } - stats + + HashMap::from([(StatHashes::AIRBORNE.into(), 30)]) }, ), ); @@ -309,6 +299,9 @@ pub fn exotic_armor() { Perks::HallowfireHeart, Box::new( |_input: ModifierResponseInput| -> HashMap { + if _input.value == 0 { + return HashMap::new(); + } HashMap::from([(StatHashes::AIRBORNE.into(), 20)]) }, ), @@ -318,11 +311,10 @@ pub fn exotic_armor() { Perks::LionRampart, Box::new( |_input: ModifierResponseInput| -> HashMap { - let mut stats = HashMap::new(); - if _input.value > 0 { - stats.insert(StatHashes::AIRBORNE.into(), 50); + if _input.value == 0 { + return HashMap::new(); }; - stats + HashMap::from([(StatHashes::AIRBORNE.into(), 50)]) }, ), ); @@ -331,12 +323,13 @@ pub fn exotic_armor() { Perks::Peacekeepers, Box::new( |_input: ModifierResponseInput| -> HashMap { - let mut stats = HashMap::new(); - if _input.calc_data.weapon_type == &WeaponType::SUBMACHINEGUN { - stats.insert(StatHashes::AIRBORNE.into(), 40); - stats.insert(StatHashes::HANDLING.into(), 100); - }; - stats + if _input.calc_data.weapon_type != &WeaponType::SUBMACHINEGUN || _input.value == 0 { + return HashMap::new(); + } + HashMap::from([ + (StatHashes::AIRBORNE.into(), 40), + (StatHashes::HANDLING.into(), 100), + ]) }, ), ); @@ -345,16 +338,16 @@ pub fn exotic_armor() { Perks::Peacekeepers, Box::new( |_input: ModifierResponseInput| -> HandlingModifierResponse { - if _input.calc_data.weapon_type == &WeaponType::SUBMACHINEGUN { - return HandlingModifierResponse { - stat_add: 100, - ads_scale: 1.0, - draw_scale: 0.6, - stow_scale: 0.6, - ..Default::default() - }; + if _input.calc_data.weapon_type == &WeaponType::SUBMACHINEGUN || _input.value == 0 { + return HandlingModifierResponse::default(); + } + + HandlingModifierResponse { + stat_add: 100, + draw_scale: 0.6, + stow_scale: 0.6, + ..Default::default() } - return HandlingModifierResponse::default(); }, ), ); @@ -363,6 +356,9 @@ pub fn exotic_armor() { Perks::PeregrineGreaves, Box::new( |_input: ModifierResponseInput| -> HashMap { + if _input.value == 0 { + return HashMap::new(); + } HashMap::from([(StatHashes::AIRBORNE.into(), 20)]) }, ), @@ -372,6 +368,9 @@ pub fn exotic_armor() { Perks::EyeOfAnotherWorld, Box::new( |_input: ModifierResponseInput| -> HashMap { + if _input.value == 0 { + return HashMap::new(); + } HashMap::from([(StatHashes::AIRBORNE.into(), 15)]) }, ), @@ -381,7 +380,7 @@ pub fn exotic_armor() { Perks::AstrocyteVerse, Box::new( |_input: ModifierResponseInput| -> HashMap { - let mut stats = HashMap::new(); + let mut stats: HashMap = HashMap::new(); stats.insert(StatHashes::AIRBORNE.into(), 30); if _input.value > 0 { stats.insert(StatHashes::HANDLING.into(), 100); @@ -410,15 +409,17 @@ pub fn exotic_armor() { Perks::NecroticGrips, Box::new( |_input: ModifierResponseInput| -> HashMap { - let mut stats = HashMap::new(); - if _input.calc_data.intrinsic_hash == 1863355414 - || _input.calc_data.intrinsic_hash == 2965975126 - || _input.calc_data.intrinsic_hash == 2724693746 + if _input.value == 0 + || !matches!( + _input.calc_data.intrinsic_hash, + 1863355414 | 2965975126 | 2724693746 + ) { - //Thorn, Osteo Striga, Touch of Malice - stats.insert(StatHashes::AIRBORNE.into(), 30); - }; - stats + return HashMap::new(); + } + + //Thorn, Osteo Striga, Touch of Malice + HashMap::from([(StatHashes::AIRBORNE.into(), 30)]) }, ), ); @@ -427,12 +428,11 @@ pub fn exotic_armor() { Perks::BootsOfTheAssembler, Box::new( |_input: ModifierResponseInput| -> HashMap { - let mut stats = HashMap::new(); - if _input.calc_data.intrinsic_hash == 2144092201 { - //Lumina - stats.insert(StatHashes::AIRBORNE.into(), 30); - }; - stats + if _input.calc_data.intrinsic_hash != 2144092201 || _input.value == 0 { + return HashMap::new(); + } + + HashMap::from([(StatHashes::AIRBORNE.into(), 30)]) }, ), ); @@ -441,13 +441,16 @@ pub fn exotic_armor() { Perks::RainOfFire, Box::new( |_input: ModifierResponseInput| -> HashMap { - let mut stats = HashMap::new(); - if _input.calc_data.weapon_type == &WeaponType::FUSIONRIFLE - || _input.calc_data.weapon_type == &WeaponType::LINEARFUSIONRIFLE + if _input.value == 0 + || !matches!( + *_input.calc_data.weapon_type, + WeaponType::FUSIONRIFLE | WeaponType::LINEARFUSIONRIFLE + ) { - stats.insert(StatHashes::AIRBORNE.into(), 30); + return HashMap::new(); } - stats + + HashMap::from([(StatHashes::AIRBORNE.into(), 30)]) }, ), ); @@ -456,6 +459,9 @@ pub fn exotic_armor() { Perks::SpeedloaderSlacks, Box::new( |_input: ModifierResponseInput| -> HashMap { + if _input.value == 0 { + return HashMap::new(); + } let modifiers = match _input.value { 0 => (0, 0, 0), 1 => (40, 40, 30), diff --git a/src/perks/meta_perks.rs b/src/perks/meta_perks.rs index 3903d90d..ff7fdb56 100644 --- a/src/perks/meta_perks.rs +++ b/src/perks/meta_perks.rs @@ -298,8 +298,10 @@ pub fn meta_perks() { Perks::RallyBarricade, Box::new(|_input: ModifierResponseInput| -> HashMap { let mut stats = HashMap::new(); + if _input.value > 0 { stats.insert(StatHashes::STABILITY.into(), 30); stats.insert(StatHashes::RELOAD.into(), 100); + } stats }), ); @@ -307,6 +309,7 @@ pub fn meta_perks() { add_flmr( Perks::RallyBarricade, Box::new(|_input: ModifierResponseInput| -> FlinchModifierResponse { + if _input.value == 0 {return FlinchModifierResponse::default();} FlinchModifierResponse { flinch_scale: 0.5 } }), ); @@ -314,6 +317,7 @@ pub fn meta_perks() { add_rsmr( Perks::RallyBarricade, Box::new(|_input: ModifierResponseInput| -> ReloadModifierResponse { + if _input.value == 0 {return ReloadModifierResponse::default();} ReloadModifierResponse { reload_stat_add: 100, reload_time_scale: 0.9, @@ -324,6 +328,7 @@ pub fn meta_perks() { add_rmr( Perks::RallyBarricade, Box::new(|_input: ModifierResponseInput| -> RangeModifierResponse { + if _input.value == 0 {return RangeModifierResponse::default();} RangeModifierResponse { range_all_scale: 1.1, ..Default::default() diff --git a/src/perks/other_perks.rs b/src/perks/other_perks.rs index b8409c0a..b691d490 100644 --- a/src/perks/other_perks.rs +++ b/src/perks/other_perks.rs @@ -1,4 +1,7 @@ -use std::collections::{btree_map::Range, HashMap}; +use std::{ + alloc::handle_alloc_error, + collections::{btree_map::Range, HashMap}, +}; use serde::de::value; @@ -117,6 +120,9 @@ pub fn other_perks() { Perks::OphidianAspect, Box::new( |_input: ModifierResponseInput| -> HandlingModifierResponse { + if _input.value == 0 { + return HandlingModifierResponse::default(); + } HandlingModifierResponse { stat_add: 35, ..Default::default() @@ -128,6 +134,9 @@ pub fn other_perks() { add_rsmr( Perks::OphidianAspect, Box::new(|_input: ModifierResponseInput| -> ReloadModifierResponse { + if _input.value == 0 { + return ReloadModifierResponse::default(); + } ReloadModifierResponse { reload_stat_add: 35, reload_time_scale: 1.0, @@ -139,9 +148,11 @@ pub fn other_perks() { Perks::OphidianAspect, Box::new(|_input: ModifierResponseInput| -> HashMap { let mut stats = HashMap::new(); - stats.insert(StatHashes::HANDLING.into(), 35); - stats.insert(StatHashes::RELOAD.into(), 35); - stats.insert(StatHashes::AIRBORNE.into(), 10); + if _input.value > 0 { + stats.insert(StatHashes::HANDLING.into(), 35); + stats.insert(StatHashes::RELOAD.into(), 35); + stats.insert(StatHashes::AIRBORNE.into(), 10); + } stats }), ); @@ -150,7 +161,7 @@ pub fn other_perks() { Perks::DragonShadow, Box::new(|_input: ModifierResponseInput| -> HashMap { let mut stats = HashMap::new(); - if _input.value >= 1 { + if _input.value > 0 { stats.insert(StatHashes::HANDLING.into(), 100); stats.insert(StatHashes::RELOAD.into(), 100); } @@ -162,15 +173,14 @@ pub fn other_perks() { Perks::DragonShadow, Box::new( |_input: ModifierResponseInput| -> HandlingModifierResponse { - if _input.value >= 1 { - HandlingModifierResponse { - stat_add: 100, - draw_scale: 0.7, - stow_scale: 0.7, - ..Default::default() - } - } else { - HandlingModifierResponse::default() + if _input.value == 0 { + return HandlingModifierResponse::default(); + } + HandlingModifierResponse { + stat_add: 100, + draw_scale: 0.7, + stow_scale: 0.7, + ..Default::default() } }, ), @@ -179,13 +189,12 @@ pub fn other_perks() { add_rsmr( Perks::DragonShadow, Box::new(|_input: ModifierResponseInput| -> ReloadModifierResponse { - if _input.value >= 1 { - ReloadModifierResponse { - reload_stat_add: 100, - reload_time_scale: 1.0, - } - } else { - ReloadModifierResponse::default() + if _input.value == 0 { + return ReloadModifierResponse::default(); + } + ReloadModifierResponse { + reload_stat_add: 100, + reload_time_scale: 1.0, } }), ); @@ -194,7 +203,9 @@ pub fn other_perks() { Perks::Amplified, Box::new(|_input: ModifierResponseInput| -> HashMap { let mut stats = HashMap::new(); - stats.insert(StatHashes::HANDLING.into(), 40); + if _input.value > 0 { + stats.insert(StatHashes::HANDLING.into(), 40); + } stats }), ); @@ -203,6 +214,9 @@ pub fn other_perks() { Perks::Amplified, Box::new( |_input: ModifierResponseInput| -> HandlingModifierResponse { + if _input.value == 0 { + return HandlingModifierResponse::default(); + } HandlingModifierResponse { stat_add: 40, draw_scale: 0.95, @@ -216,13 +230,12 @@ pub fn other_perks() { add_rsmr( Perks::Frequency, Box::new(|_input: ModifierResponseInput| -> ReloadModifierResponse { - if _input.value > 0 { - ReloadModifierResponse { - reload_stat_add: 50, - reload_time_scale: 0.8, - } - } else { - ReloadModifierResponse::default() + if _input.value == 0 { + return ReloadModifierResponse::default(); + } + ReloadModifierResponse { + reload_stat_add: 50, + reload_time_scale: 0.8, } }), ); @@ -241,13 +254,12 @@ pub fn other_perks() { add_rsmr( Perks::FlowState, Box::new(|_input: ModifierResponseInput| -> ReloadModifierResponse { - if _input.value > 0 { - ReloadModifierResponse { - reload_stat_add: 50, - reload_time_scale: 0.8, - } - } else { - ReloadModifierResponse::default() + if _input.value == 0 { + return ReloadModifierResponse::default(); + } + ReloadModifierResponse { + reload_stat_add: 50, + reload_time_scale: 0.8, } }), ); @@ -562,15 +574,14 @@ pub fn other_perks() { Perks::ThreadOfAscent, Box::new( |_input: ModifierResponseInput| -> HandlingModifierResponse { - if _input.value > 0 { - HandlingModifierResponse { - stat_add: 40, - draw_scale: 0.925, - stow_scale: 0.925, - ..Default::default() - } - } else { - HandlingModifierResponse::default() + if _input.value == 0 { + return HandlingModifierResponse::default(); + } + HandlingModifierResponse { + stat_add: 40, + draw_scale: 0.925, + stow_scale: 0.925, + ..Default::default() } }, ), @@ -578,13 +589,12 @@ pub fn other_perks() { add_rsmr( Perks::ThreadOfAscent, Box::new(|_input: ModifierResponseInput| -> ReloadModifierResponse { - if _input.value > 0 { - ReloadModifierResponse { - reload_time_scale: 0.925, - reload_stat_add: 40, - } - } else { - ReloadModifierResponse::default() + if _input.value == 0 { + return ReloadModifierResponse::default(); + } + ReloadModifierResponse { + reload_time_scale: 0.925, + reload_stat_add: 40, } }), ); diff --git a/src/perks/perk_options_handler.rs b/src/perks/perk_options_handler.rs index dc52e5f9..ab9a2a04 100644 --- a/src/perks/perk_options_handler.rs +++ b/src/perks/perk_options_handler.rs @@ -32,13 +32,20 @@ impl PerkOptionData { option_type: PerkValueVariant::STATIC, } } - pub fn toggle() -> PerkOptionData { + pub fn toggled_off() -> PerkOptionData { PerkOptionData { stacks: (0, 1), options: vec![], option_type: PerkValueVariant::TOGGLE, } } + pub fn toggled_on() -> PerkOptionData { + PerkOptionData { + stacks: (1, 0), + options: vec![], + option_type: PerkValueVariant::TOGGLE, + } + } pub fn stacking(_stacks: u32) -> PerkOptionData { PerkOptionData { stacks: (0, _stacks), @@ -82,21 +89,44 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { match perk { //Meta perks Perks::BuiltIn => None, - Perks::RallyBarricade => Some(PerkOptionData::static_()), - Perks::EmpRift => Some(PerkOptionData::static_()), + Perks::RallyBarricade => Some(PerkOptionData::toggled_on()), + Perks::EmpRift => Some(PerkOptionData::toggled_on()), + Perks::OnYourMark => Some(PerkOptionData::stacking(3)), + Perks::Frequency => Some(PerkOptionData::toggled_on()), + Perks::Tempering => Some(PerkOptionData::toggled_on()), + Perks::Hedrons => Some(PerkOptionData::toggled_on()), + Perks::HeatRises => Some(PerkOptionData::toggled_on()), + Perks::FlowState => Some(PerkOptionData::toggled_on()), + Perks::ThreadOfAscent => Some(PerkOptionData::toggled_on()), + Perks::WellOfRadiance => Some(PerkOptionData::toggled_on()), + Perks::Amplified => Some(PerkOptionData::toggled_on()), + Perks::Radiant => Some(PerkOptionData::toggled_on()), + Perks::Weaken => Some(PerkOptionData::toggled_on()), + Perks::WardOfDawn => Some(PerkOptionData::toggled_on()), + Perks::BannerShield => Some(PerkOptionData::toggled_on()), + Perks::DeadFall => Some(PerkOptionData::toggled_on()), + Perks::MoebiusQuiver => Some(PerkOptionData::toggled_on()), //intrinsics - Perks::RapidFireFrame => Some(PerkOptionData::toggle()), + Perks::RapidFireFrame => Some(PerkOptionData::toggled_off()), Perks::PrecisionFrame => Some(PerkOptionData::static_()), //armor + Perks::DexterityMod => Some(PerkOptionData::stacking(3)), + Perks::ReserveMod => Some(PerkOptionData::stacking(3)), + Perks::LoaderMod => Some(PerkOptionData::stacking(3)), + Perks::TargetingMod => Some(PerkOptionData::stacking(3)), + Perks::UnflinchingMod => Some(PerkOptionData::stacking(3)), + Perks::SurgeMod => Some(PerkOptionData::stacking(3)), + Perks::UmbralSharpening => Some(PerkOptionData::stacking(5)), + Perks::EnhancedScannerAugment => Some(PerkOptionData::toggled_off()), //parts Perks::ImpactCasing => Some(PerkOptionData::static_()), Perks::SwapMag => Some(PerkOptionData::static_()), Perks::FullChoke => Some(PerkOptionData::static_()), Perks::SpikeGrenades => Some(PerkOptionData::static_()), - Perks::AlloyMag => Some(PerkOptionData::toggle()), + Perks::AlloyMag => Some(PerkOptionData::toggled_off()), Perks::LiquidCoils => Some(PerkOptionData::static_()), Perks::AcceleratedCoils => Some(PerkOptionData::static_()), Perks::ChargetimeMW => Some(PerkOptionData::static_()), @@ -115,65 +145,65 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { Perks::MajorSpec => Some(PerkOptionData::static_()), Perks::MinorSpec => Some(PerkOptionData::static_()), Perks::BigOnesSpec => Some(PerkOptionData::static_()), - Perks::TakenSpec => Some(PerkOptionData::toggle()), + Perks::TakenSpec => Some(PerkOptionData::toggled_off()), Perks::FreehandGrip => Some(PerkOptionData::static_()), //origin | year 5+ - Perks::VeistStinger => Some(PerkOptionData::toggle()), - Perks::HakkeBreach => Some(PerkOptionData::toggle()), - Perks::Alacrity => Some(PerkOptionData::toggle()), - Perks::FluidDynamics => Some(PerkOptionData::toggle()), - Perks::QuietMoment => Some(PerkOptionData::toggle()), - Perks::SurosSynergy => Some(PerkOptionData::toggle()), + Perks::VeistStinger => Some(PerkOptionData::toggled_off()), + Perks::HakkeBreach => Some(PerkOptionData::toggled_off()), + Perks::Alacrity => Some(PerkOptionData::toggled_off()), + Perks::FluidDynamics => Some(PerkOptionData::toggled_off()), + Perks::QuietMoment => Some(PerkOptionData::toggled_off()), + Perks::SurosSynergy => Some(PerkOptionData::toggled_off()), Perks::BitterSpite => Some(PerkOptionData::stacking(5)), Perks::RunnethOver => Some(PerkOptionData::stacking(5)), - Perks::HotSwap => Some(PerkOptionData::toggle()), - Perks::RightHook => Some(PerkOptionData::toggle()), - Perks::Ambush => Some(PerkOptionData::toggle()), - Perks::TexBalancedStock => Some(PerkOptionData::toggle()), - Perks::SearchParty => Some(PerkOptionData::toggle()), + Perks::HotSwap => Some(PerkOptionData::toggled_off()), + Perks::RightHook => Some(PerkOptionData::toggled_off()), + Perks::Ambush => Some(PerkOptionData::toggled_off()), + Perks::TexBalancedStock => Some(PerkOptionData::toggled_off()), + Perks::SearchParty => Some(PerkOptionData::toggled_off()), Perks::HarmonicResonance => Some(PerkOptionData::stacking(2)), Perks::FieldTested => Some(PerkOptionData::stacking(5)), //season 1 | year 1 - Perks::KillClip => Some(PerkOptionData::toggle()), - Perks::Outlaw => Some(PerkOptionData::toggle()), - Perks::BackupPlan => Some(PerkOptionData::toggle()), - Perks::FieldPrep => Some(PerkOptionData::toggle()), + Perks::KillClip => Some(PerkOptionData::toggled_off()), + Perks::Outlaw => Some(PerkOptionData::toggled_off()), + Perks::BackupPlan => Some(PerkOptionData::toggled_off()), + Perks::FieldPrep => Some(PerkOptionData::toggled_off()), Perks::Rampage => Some(PerkOptionData::stacking(3)), - Perks::OpeningShot => Some(PerkOptionData::toggle()), - Perks::MovingTarget => Some(PerkOptionData::toggle()), + Perks::OpeningShot => Some(PerkOptionData::toggled_off()), + Perks::MovingTarget => Some(PerkOptionData::toggled_off()), Perks::AmbitiousAssassin => Some(PerkOptionData::stacking(15)), Perks::ClusterBomb => Some(PerkOptionData::static_()), Perks::ExplosivePayload => Some(PerkOptionData::static_()), - Perks::FirmlyPlanted => Some(PerkOptionData::toggle()), + Perks::FirmlyPlanted => Some(PerkOptionData::toggled_off()), Perks::FullAutoTrigger => Some(PerkOptionData::static_()), Perks::HeadSeeker => Some(PerkOptionData::static_()), Perks::HighImpactReserves => Some(PerkOptionData::static_()), - Perks::HipFireGrip => Some(PerkOptionData::toggle()), + Perks::HipFireGrip => Some(PerkOptionData::toggled_off()), Perks::Snapshot => Some(PerkOptionData::static_()), - Perks::TapTheTrigger => Some(PerkOptionData::toggle()), - Perks::SlideWays => Some(PerkOptionData::toggle()), - Perks::QuickDraw => Some(PerkOptionData::toggle()), + Perks::TapTheTrigger => Some(PerkOptionData::toggled_off()), + Perks::SlideWays => Some(PerkOptionData::toggled_off()), + Perks::QuickDraw => Some(PerkOptionData::toggled_off()), Perks::TimedPayload => Some(PerkOptionData::static_()), Perks::ThreatDetector => Some(PerkOptionData::stacking(2)), - Perks::SlideShot => Some(PerkOptionData::toggle()), + Perks::SlideShot => Some(PerkOptionData::toggled_off()), Perks::TripleTap => Some(PerkOptionData::static_()), - Perks::UnderPressure => Some(PerkOptionData::toggle()), - Perks::PulseMonitor => Some(PerkOptionData::toggle()), + Perks::UnderPressure => Some(PerkOptionData::toggled_off()), + Perks::PulseMonitor => Some(PerkOptionData::toggled_off()), //season 2 | year 1 //lmao bozo //season 3 | year 1 Perks::RangeFinder => Some(PerkOptionData::static_()), - Perks::DisruptionBreak => Some(PerkOptionData::toggle()), - Perks::TrenchBarrel => Some(PerkOptionData::toggle()), - Perks::Desperado => Some(PerkOptionData::toggle()), - Perks::BoxBreathing => Some(PerkOptionData::toggle()), + Perks::DisruptionBreak => Some(PerkOptionData::toggled_off()), + Perks::TrenchBarrel => Some(PerkOptionData::toggled_off()), + Perks::Desperado => Some(PerkOptionData::toggled_off()), + Perks::BoxBreathing => Some(PerkOptionData::toggled_off()), //season 4 | year 2 - Perks::ArchersTempo => Some(PerkOptionData::toggle()), + Perks::ArchersTempo => Some(PerkOptionData::toggled_off()), Perks::ExplosiveHead => Some(PerkOptionData::static_()), Perks::FeedingFrenzy => Some(PerkOptionData::stacking(5)), Perks::FourthTimesTheCharm => Some(PerkOptionData::static_()), @@ -181,23 +211,23 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { //season 5 | year 2 Perks::ResevoirBurst => Some(PerkOptionData::static_()), - Perks::Surrounded => Some(PerkOptionData::toggle()), + Perks::Surrounded => Some(PerkOptionData::toggled_off()), Perks::AirAssault => Some(PerkOptionData::stacking(2)), //season 6 | year 2 - Perks::FiringLine => Some(PerkOptionData::toggle()), - Perks::FullCourt => Some(PerkOptionData::toggle()), + Perks::FiringLine => Some(PerkOptionData::toggled_off()), + Perks::FullCourt => Some(PerkOptionData::toggled_off()), Perks::KillingTally => Some(PerkOptionData::stacking(3)), // Perks::Demolitionist => Some(PerkOptionData::options(vec!["Once", "Every 3s"])), Perks::MultikillClip => Some(PerkOptionData::stacking(3)), Perks::Swashbuckler => Some(PerkOptionData::stacking(5)), - Perks::OverFlow => Some(PerkOptionData::toggle()), + Perks::OverFlow => Some(PerkOptionData::toggled_off()), //season 7 | year 2 - Perks::UnderDog => Some(PerkOptionData::toggle()), - Perks::ExplosiveLight => Some(PerkOptionData::toggle()), - Perks::EyeOfTheStorm => Some(PerkOptionData::toggle()), - Perks::NoDistractions => Some(PerkOptionData::toggle()), + Perks::UnderDog => Some(PerkOptionData::toggled_off()), + Perks::ExplosiveLight => Some(PerkOptionData::toggled_off()), + Perks::EyeOfTheStorm => Some(PerkOptionData::toggled_off()), + Perks::NoDistractions => Some(PerkOptionData::toggled_off()), //season 8 | year 3 //TODO @@ -213,215 +243,196 @@ fn hash_to_perk_option_data(_hash: u32) -> Option { //bad season lmao //season 11 | year 3 - Perks::KillingWind => Some(PerkOptionData::toggle()), + Perks::KillingWind => Some(PerkOptionData::toggled_off()), //season 12 | year 4 - Perks::DualLoader => Some(PerkOptionData::toggle()), - Perks::OneForAll => Some(PerkOptionData::toggle()), + Perks::DualLoader => Some(PerkOptionData::toggled_off()), + Perks::OneForAll => Some(PerkOptionData::toggled_off()), Perks::Recombination => Some(PerkOptionData::stacking(10)), - Perks::Reconstruction => Some(PerkOptionData::toggle()), + Perks::Reconstruction => Some(PerkOptionData::toggled_off()), Perks::Surplus => Some(PerkOptionData::stacking(3)), //season 13 | year 4 Perks::ImpulseAmplifier => Some(PerkOptionData::static_()), - Perks::Frenzy => Some(PerkOptionData::toggle()), + Perks::Frenzy => Some(PerkOptionData::toggled_off()), Perks::LastingImpression => Some(PerkOptionData::static_()), - Perks::KickStart => Some(PerkOptionData::toggle()), + Perks::KickStart => Some(PerkOptionData::toggled_off()), //season 14 | year 4 - Perks::Cornered => Some(PerkOptionData::toggle()), + Perks::Cornered => Some(PerkOptionData::toggled_off()), Perks::AdrenalineJunkie => Some(PerkOptionData::stacking(5)), Perks::RewindRounds => Some(PerkOptionData::static_()), Perks::HeatingUp => Some(PerkOptionData::stacking(2)), - Perks::FireFly => Some(PerkOptionData::toggle()), - Perks::DangerZone => Some(PerkOptionData::toggle()), - Perks::TunnelVision => Some(PerkOptionData::toggle()), + Perks::FireFly => Some(PerkOptionData::toggled_off()), + Perks::DangerZone => Some(PerkOptionData::toggled_off()), + Perks::TunnelVision => Some(PerkOptionData::toggled_off()), //season 15 | year 4 Perks::Encore => Some(PerkOptionData::stacking(4)), - Perks::Ensemble => Some(PerkOptionData::toggle()), + Perks::Ensemble => Some(PerkOptionData::toggled_off()), Perks::GoldenTricorn => Some(PerkOptionData::stacking(2)), - Perks::Harmony => Some(PerkOptionData::toggle()), + Perks::Harmony => Some(PerkOptionData::toggled_off()), Perks::PerpetualMotion => Some(PerkOptionData::stacking(2)), - Perks::Adagio => Some(PerkOptionData::toggle()), + Perks::Adagio => Some(PerkOptionData::toggled_off()), //season 16 | year 5 - Perks::BaitAndSwitch => Some(PerkOptionData::toggle()), - Perks::CompulsiveReloader => Some(PerkOptionData::toggle()), - Perks::FocusedFury => Some(PerkOptionData::toggle()), + Perks::BaitAndSwitch => Some(PerkOptionData::toggled_off()), + Perks::CompulsiveReloader => Some(PerkOptionData::toggled_off()), + Perks::FocusedFury => Some(PerkOptionData::toggled_off()), Perks::ChillClip => Some(PerkOptionData::static_()), Perks::SleightOfHand => Some(PerkOptionData::stacking(3)), - Perks::StatsForAll => Some(PerkOptionData::toggle()), - Perks::SteadyHands => Some(PerkOptionData::toggle()), - Perks::SuccesfulWarmup => Some(PerkOptionData::toggle()), - Perks::UnstoppableForce => Some(PerkOptionData::toggle()), + Perks::StatsForAll => Some(PerkOptionData::toggled_off()), + Perks::SteadyHands => Some(PerkOptionData::toggled_off()), + Perks::SuccesfulWarmup => Some(PerkOptionData::toggled_off()), + Perks::UnstoppableForce => Some(PerkOptionData::toggled_off()), //season 17 | year 5 - Perks::FragileFocus => Some(PerkOptionData::toggle()), + Perks::FragileFocus => Some(PerkOptionData::toggled_off()), Perks::WellRounded => Some(PerkOptionData::stacking(2)), //season 18 | year 5 Perks::GutShot => Some(PerkOptionData::static_()), - Perks::Pugilist => Some(PerkOptionData::toggle()), + Perks::Pugilist => Some(PerkOptionData::toggled_off()), Perks::Slickdraw => Some(PerkOptionData::static_()), Perks::OverUnder => Some(PerkOptionData::static_()), //season 19 | year 5 - Perks::CascadePoint => Some(PerkOptionData::toggle()), - Perks::CloseToMelee => Some(PerkOptionData::toggle()), - Perks::OffhandStrike => Some(PerkOptionData::toggle()), - Perks::PerfectFloat => Some(PerkOptionData::toggle()), - Perks::ShotSwap => Some(PerkOptionData::toggle()), + Perks::CascadePoint => Some(PerkOptionData::toggled_off()), + Perks::CloseToMelee => Some(PerkOptionData::toggled_off()), + Perks::OffhandStrike => Some(PerkOptionData::toggled_off()), + Perks::PerfectFloat => Some(PerkOptionData::toggled_off()), + Perks::ShotSwap => Some(PerkOptionData::toggled_off()), Perks::TargetLock => Some(PerkOptionData::static_()), //season 20 | year 6 - Perks::KeepAway => Some(PerkOptionData::toggle()), - Perks::ParacausalAffinity => Some(PerkOptionData::toggle()), + Perks::KeepAway => Some(PerkOptionData::toggled_off()), + Perks::ParacausalAffinity => Some(PerkOptionData::toggled_off()), Perks::EnviousAssasin => Some(PerkOptionData::stacking(15)), //season 21 | year 6 - Perks::CollectiveAction => Some(PerkOptionData::toggle()), + Perks::CollectiveAction => Some(PerkOptionData::toggled_off()), Perks::Bipod => Some(PerkOptionData::static_()), - Perks::ControlledBurst => Some(PerkOptionData::toggle()), - Perks::InvisibleHand => Some(PerkOptionData::toggle()), - Perks::UnsatedHunger => Some(PerkOptionData::toggle()), - Perks::Discord => Some(PerkOptionData::toggle()), + Perks::ControlledBurst => Some(PerkOptionData::toggled_off()), + Perks::InvisibleHand => Some(PerkOptionData::toggled_off()), + Perks::UnsatedHunger => Some(PerkOptionData::toggled_off()), + Perks::Discord => Some(PerkOptionData::toggled_off()), + //season 22 | year 6 Perks::PrecisionInstrument => Some(PerkOptionData::stacking(6)), - Perks::LooseChange => Some(PerkOptionData::toggle()), - Perks::HighGround => Some(PerkOptionData::toggle()), - Perks::HeadRush => Some(PerkOptionData::toggle()), + Perks::LooseChange => Some(PerkOptionData::toggled_off()), + Perks::HighGround => Some(PerkOptionData::toggled_off()), + Perks::HeadRush => Some(PerkOptionData::toggled_off()), Perks::EnlightendAction => Some(PerkOptionData::stacking(5)), Perks::SwordLogic => Some(PerkOptionData::stacking(4)), - //exotics + + //exotic weapon Perks::CranialSpike => Some(PerkOptionData::stacking(5)), Perks::DarkForgedTrigger => Some(PerkOptionData::options_raw(["Hip-Fire", "ADS"].to_vec())), Perks::AgersCall => Some(PerkOptionData::static_()), - Perks::LagragianSight => Some(PerkOptionData::toggle()), + Perks::LagragianSight => Some(PerkOptionData::toggled_off()), Perks::StringofCurses => Some(PerkOptionData::stacking(5)), Perks::WormsHunger => Some(PerkOptionData::stacking(20)), - Perks::WormByproduct => Some(PerkOptionData::toggle()), + Perks::WormByproduct => Some(PerkOptionData::toggled_off()), Perks::RocketTracers => Some(PerkOptionData::static_()), Perks::ParacausalShot => Some(PerkOptionData::stacking(7)), Perks::CorruptionSpreads => Some(PerkOptionData::static_()), - Perks::TimeSlip => Some(PerkOptionData::toggle()), - Perks::ToM => Some(PerkOptionData::toggle()), - Perks::IgnitionTrigger => Some(PerkOptionData::toggle()), - Perks::GuidanceRing => Some(PerkOptionData::toggle()), + Perks::TimeSlip => Some(PerkOptionData::toggled_off()), + Perks::ToM => Some(PerkOptionData::toggled_off()), + Perks::IgnitionTrigger => Some(PerkOptionData::toggled_off()), + Perks::GuidanceRing => Some(PerkOptionData::toggled_off()), Perks::ConserveMomentum => Some(PerkOptionData::stacking(15)), - Perks::Impetus => Some(PerkOptionData::toggle()), - Perks::FirstGlance => Some(PerkOptionData::toggle()), + Perks::Impetus => Some(PerkOptionData::toggled_off()), + Perks::FirstGlance => Some(PerkOptionData::toggled_off()), Perks::PerfectFith => Some(PerkOptionData::static_()), Perks::Broadside => Some(PerkOptionData::stacking(4)), - Perks::FourthHorsemanCatalyst => Some(PerkOptionData::toggle()), + Perks::FourthHorsemanCatalyst => Some(PerkOptionData::toggled_off()), Perks::Stormbringer => Some(PerkOptionData::static_()), Perks::PrismaticInferno => Some(PerkOptionData::static_()), - Perks::ReignHavoc => Some(PerkOptionData::toggle()), - Perks::WhisperCatalyst => Some(PerkOptionData::toggle()), - Perks::Roadborn => Some(PerkOptionData::toggle()), - Perks::SwoopingTalons => Some(PerkOptionData::toggle()), - Perks::CalculatedBalance => Some(PerkOptionData::toggle()), - Perks::RavenousBeast => Some(PerkOptionData::toggle()), + Perks::ReignHavoc => Some(PerkOptionData::toggled_off()), + Perks::WhisperCatalyst => Some(PerkOptionData::toggled_off()), + Perks::Roadborn => Some(PerkOptionData::toggled_off()), + Perks::SwoopingTalons => Some(PerkOptionData::toggled_off()), + Perks::CalculatedBalance => Some(PerkOptionData::toggled_off()), + Perks::RavenousBeast => Some(PerkOptionData::toggled_off()), Perks::LordOfWolvesCatalyst => Some(PerkOptionData::static_()), - Perks::ReleaseTheWolves => Some(PerkOptionData::toggle()), + Perks::ReleaseTheWolves => Some(PerkOptionData::toggled_off()), Perks::Fundamentals => Some(PerkOptionData::options(["Void", "Solar", "Arc"].to_vec())), - Perks::ThinTheHerd => Some(PerkOptionData::toggle()), - Perks::Chimera => Some(PerkOptionData::toggle()), + Perks::ThinTheHerd => Some(PerkOptionData::toggled_off()), + Perks::Chimera => Some(PerkOptionData::toggled_off()), Perks::FateOfAllFools => Some(PerkOptionData::stacking(3)), Perks::HonedEdge => Some(PerkOptionData::stacking_min(4, 1)), Perks::TakenPredator => Some(PerkOptionData::options( ["Taken", "Witherhoard", "Both"].to_vec(), )), Perks::MarkovChain => Some(PerkOptionData::stacking(5)), - Perks::StormAndStress => Some(PerkOptionData::toggle()), - Perks::DualSpeedReceiver => Some(PerkOptionData::toggle()), + Perks::StormAndStress => Some(PerkOptionData::toggled_off()), + Perks::DualSpeedReceiver => Some(PerkOptionData::toggled_off()), Perks::ExplosiveShadow => Some(PerkOptionData::static_()), Perks::SurosLegacy => Some(PerkOptionData::static_()), Perks::SpinningUp => Some(PerkOptionData::stacking(2)), - Perks::DarkDescent => Some(PerkOptionData::toggle()), + Perks::DarkDescent => Some(PerkOptionData::toggled_off()), Perks::SleeperCatalyst => Some(PerkOptionData::static_()), - Perks::TargetAquired => Some(PerkOptionData::toggle()), + Perks::TargetAquired => Some(PerkOptionData::toggled_off()), Perks::RatPack => Some(PerkOptionData::stacking_min(5, 1)), Perks::HuntersTrance => Some(PerkOptionData::static_()), Perks::RideTheBull => Some(PerkOptionData::stacking(2)), - Perks::NobleRounds => Some(PerkOptionData::toggle()), - Perks::MementoMori => Some(PerkOptionData::toggle()), + Perks::NobleRounds => Some(PerkOptionData::toggled_off()), + Perks::MementoMori => Some(PerkOptionData::toggled_off()), Perks::TractorCannon => Some(PerkOptionData::static_()), Perks::HarmonicLaser => Some(PerkOptionData::stacking(2)), - Perks::AgersScepterCatalyst => Some(PerkOptionData::toggle()), - Perks::ColdFusion => Some(PerkOptionData::toggle()), + Perks::AgersScepterCatalyst => Some(PerkOptionData::toggled_off()), + Perks::ColdFusion => Some(PerkOptionData::toggled_off()), Perks::BlackHole => Some(PerkOptionData::static_()), - Perks::TemporalUnlimiter => Some(PerkOptionData::toggle()), + Perks::TemporalUnlimiter => Some(PerkOptionData::toggled_off()), Perks::MarksmanSights => Some(PerkOptionData::static_()), - Perks::DexterityMod => Some(PerkOptionData::stacking(3)), - Perks::ReserveMod => Some(PerkOptionData::stacking(3)), - Perks::LoaderMod => Some(PerkOptionData::stacking(3)), - Perks::TargetingMod => Some(PerkOptionData::stacking(3)), - Perks::UnflinchingMod => Some(PerkOptionData::stacking(3)), - Perks::SurgeMod => Some(PerkOptionData::stacking(3)), - Perks::OnYourMark => Some(PerkOptionData::stacking(3)), - Perks::Frequency => Some(PerkOptionData::toggle()), - Perks::Tempering => Some(PerkOptionData::toggle()), - Perks::Hedrons => Some(PerkOptionData::toggle()), - Perks::HeatRises => Some(PerkOptionData::toggle()), - Perks::FlowState => Some(PerkOptionData::toggle()), - Perks::ThreadOfAscent => Some(PerkOptionData::toggle()), - Perks::WellOfRadiance => Some(PerkOptionData::static_()), - Perks::Amplified => Some(PerkOptionData::static_()), - Perks::Radiant => Some(PerkOptionData::static_()), - Perks::Weaken => Some(PerkOptionData::static_()), - Perks::WardOfDawn => Some(PerkOptionData::static_()), - Perks::BannerShield => Some(PerkOptionData::static_()), - Perks::DeadFall => Some(PerkOptionData::static_()), - Perks::MoebiusQuiver => Some(PerkOptionData::static_()), Perks::Broadhead => Some(PerkOptionData::static_()), - Perks::HuntersTrace => Some(PerkOptionData::toggle()), - Perks::Desperation => Some(PerkOptionData::toggle()), + Perks::HuntersTrace => Some(PerkOptionData::toggled_off()), + Perks::FullStop => Some(PerkOptionData::static_()), + Perks::HakkeHeavyBurst => Some(PerkOptionData::static_()), + Perks::Desperation => Some(PerkOptionData::toggled_off()), - Perks::DragonShadow => Some(PerkOptionData::toggle()), - Perks::OphidianAspect => Some(PerkOptionData::static_()), - Perks::TomeOfDawn => Some(PerkOptionData::toggle()), + //exotic armor + Perks::DragonShadow => Some(PerkOptionData::toggled_on()), + Perks::OphidianAspect => Some(PerkOptionData::toggled_on()), + Perks::TomeOfDawn => Some(PerkOptionData::toggled_on()), Perks::PathOfTheBurningSteps => Some(PerkOptionData::stacking(4)), - Perks::MantleOfBattleHarmony => Some(PerkOptionData::static_()), - Perks::MaskOfBakris => Some(PerkOptionData::toggle()), - Perks::BallindorseWrathweavers => Some(PerkOptionData::toggle()), + Perks::MantleOfBattleHarmony => Some(PerkOptionData::toggled_on()), + Perks::MaskOfBakris => Some(PerkOptionData::toggled_on()), + Perks::BallindorseWrathweavers => Some(PerkOptionData::toggled_on()), Perks::LunaFaction => Some(PerkOptionData::options( ["Heal Rift", "Empowering Rift / Well"].to_vec(), )), - Perks::KnuckleheadRadar => Some(PerkOptionData::toggle()), - Perks::MechaneersTricksleeves => Some(PerkOptionData::toggle()), + Perks::KnuckleheadRadar => Some(PerkOptionData::toggled_on()), + Perks::MechaneersTricksleeves => Some(PerkOptionData::toggled_on()), Perks::Oathkeeper => Some(PerkOptionData::static_()), - Perks::SealedAhamkaraGrasps => Some(PerkOptionData::toggle()), + Perks::SealedAhamkaraGrasps => Some(PerkOptionData::toggled_on()), Perks::LuckyPants => Some(PerkOptionData::stacking(10)), - Perks::NoBackupPlans => Some(PerkOptionData::toggle()), - Perks::ActiumWarRig => Some(PerkOptionData::static_()), - Perks::HallowfireHeart => Some(PerkOptionData::static_()), - Perks::LionRampart => Some(PerkOptionData::toggle()), - Perks::Peacekeepers => Some(PerkOptionData::static_()), - Perks::EyeOfAnotherWorld => Some(PerkOptionData::static_()), - Perks::AstrocyteVerse => Some(PerkOptionData::toggle()), - Perks::NecroticGrips => Some(PerkOptionData::static_()), - Perks::BootsOfTheAssembler => Some(PerkOptionData::static_()), - Perks::RainOfFire => Some(PerkOptionData::static_()), + Perks::NoBackupPlans => Some(PerkOptionData::toggled_on()), + Perks::ActiumWarRig => Some(PerkOptionData::toggled_on()), + Perks::HallowfireHeart => Some(PerkOptionData::toggled_on()), + Perks::LionRampart => Some(PerkOptionData::toggled_on()), + Perks::Peacekeepers => Some(PerkOptionData::toggled_on()), + Perks::EyeOfAnotherWorld => Some(PerkOptionData::toggled_on()), + Perks::AstrocyteVerse => Some(PerkOptionData::toggled_on()), + Perks::NecroticGrips => Some(PerkOptionData::toggled_on()), + Perks::BootsOfTheAssembler => Some(PerkOptionData::toggled_on()), + Perks::RainOfFire => Some(PerkOptionData::toggled_on()), Perks::SpeedloaderSlacks => Some(PerkOptionData::stacking(5)), - Perks::PeregrineGreaves => Some(PerkOptionData::static_()), - Perks::Gyrfalcon => Some(PerkOptionData::toggle()), - Perks::AeonInsight => Some(PerkOptionData::toggle()), - Perks::Felwinters => Some(PerkOptionData::toggle()), - Perks::SanguineAlchemy => Some(PerkOptionData::toggle()), - Perks::TritonVice => Some(PerkOptionData::toggle()), - Perks::Foetracers => Some(PerkOptionData::toggle()), - Perks::GlacialGuard => Some(PerkOptionData::toggle()), - //misc - Perks::UmbralSharpening => Some(PerkOptionData::stacking(5)), - Perks::EnhancedScannerAugment => Some(PerkOptionData::toggle()), - Perks::Demolitionist => Some(PerkOptionData::static_()), - Perks::FullStop => Some(PerkOptionData::static_()), - Perks::HakkeHeavyBurst => Some(PerkOptionData::static_()), + Perks::PeregrineGreaves => Some(PerkOptionData::toggled_on()), + Perks::Gyrfalcon => Some(PerkOptionData::toggled_on()), + Perks::AeonInsight => Some(PerkOptionData::toggled_on()), + Perks::Felwinters => Some(PerkOptionData::toggled_on()), + Perks::SanguineAlchemy => Some(PerkOptionData::toggled_on()), + Perks::TritonVice => Some(PerkOptionData::toggled_on()), Perks::EternalWarrior => Some(PerkOptionData::stacking(4)), + Perks::Foetracers => Some(PerkOptionData::toggled_on()), + Perks::GlacialGuard => Some(PerkOptionData::toggled_on()), + + //misc + Perks::Demolitionist => Some(PerkOptionData::static_()), Perks::Ignore => None, } }