wowlab_engine_domain/dbc/passives/
talent.rs1use super::{AuraSubtypeKind, ClassId, SpellDataFlat, aura_kind};
2
3#[rustfmt::skip]
5const CLASS_PASSIVE_SPELLS: &[(ClassId, u32)] = &[
6 (ClassId::Warrior , 3_127) , (ClassId::Warrior , 123_829), (ClassId::Warrior , 137_047), (ClassId::Warrior , 319_158), (ClassId::Paladin , 82_242) , (ClassId::Paladin , 115_675), (ClassId::Paladin , 123_830), (ClassId::Paladin , 137_026), (ClassId::Paladin , 327_977), (ClassId::Hunter , 93_321) , (ClassId::Hunter , 137_014), (ClassId::Hunter , 157_443), (ClassId::Rogue , 1_860) , (ClassId::Rogue , 2_836) , (ClassId::Rogue , 82_245) , (ClassId::Rogue , 137_034), (ClassId::Rogue , 157_442), (ClassId::Priest , 45_243) , (ClassId::Priest , 89_745) , (ClassId::Priest , 137_030), (ClassId::Priest , 186_440), (ClassId::DeathKnight, 51_986) , (ClassId::DeathKnight, 82_246) , (ClassId::DeathKnight, 137_005), (ClassId::DeathKnight, 197_147), (ClassId::Shaman , 20_608) , (ClassId::Shaman , 123_831), (ClassId::Shaman , 137_038), (ClassId::Shaman , 318_044), (ClassId::Mage , 89_744) , (ClassId::Mage , 121_039), (ClassId::Mage , 137_018), (ClassId::Warlock , 137_042), (ClassId::Warlock , 246_985), (ClassId::Warlock , 342_914), (ClassId::Monk , 8_647) , (ClassId::Monk , 107_500), (ClassId::Monk , 116_812), (ClassId::Monk , 117_959), (ClassId::Monk , 130_610), (ClassId::Monk , 137_022), (ClassId::Monk , 157_361), (ClassId::Druid , 20_719) , (ClassId::Druid , 125_972), (ClassId::Druid , 137_009), (ClassId::Druid , 159_456), (ClassId::Druid , 276_012), (ClassId::Druid , 276_029), (ClassId::Druid , 343_238), (ClassId::DemonHunter, 196_055), (ClassId::DemonHunter, 197_130), (ClassId::DemonHunter, 203_724), (ClassId::DemonHunter, 212_611), (ClassId::DemonHunter, 255_260), (ClassId::DemonHunter, 320_364), (ClassId::Evoker , 353_167), (ClassId::Evoker , 381_773), (ClassId::Evoker , 396_571), (ClassId::Evoker , 400_006), ];
67
68pub fn class_passive_spell_ids(class: ClassId) -> impl Iterator<Item = u32> {
70 CLASS_PASSIVE_SPELLS
71 .iter()
72 .filter(move |(c, _)| *c == class)
73 .map(|(_, id)| *id)
74}
75
76#[derive(Clone, Copy, Debug, PartialEq)]
78pub enum ResourcePassive {
80 MaxFlat(f64),
81 RegenPercent(f64),
82 RegenPerFiveSeconds(f64),
83 AutoAttackGainPercent(f64),
84 CostPercent(f64),
85}
86
87pub fn talent_resource_passives(
89 spell: &SpellDataFlat,
90 ranks: u8,
91 specialization_order: Option<i32>,
92) -> impl Iterator<Item = (i32, ResourcePassive)> + '_ {
93 let ranks = f64::from(ranks);
94 let rage_effect_count = spell
95 .effects
96 .iter()
97 .filter(|effect| {
98 aura_kind(effect) == Some(AuraSubtypeKind::ModRageGeneratedFromAutoAttacks)
99 })
100 .count();
101 let specialization_order = specialization_order.and_then(|order| usize::try_from(order).ok());
104 let specialization_rage_effect = specialization_order.and_then(|order| {
105 spell
106 .effects
107 .iter()
108 .filter(|effect| {
109 aura_kind(effect) == Some(AuraSubtypeKind::ModRageGeneratedFromAutoAttacks)
110 })
111 .nth(order)
112 });
113 let specialization_rage_effect = specialization_rage_effect.map(|effect| effect.index);
114
115 spell
116 .effects
117 .iter()
118 .filter(move |_| spell.is_passive)
119 .filter_map(move |e| match aura_kind(e) {
120 Some(AuraSubtypeKind::ModIncreaseEnergy | AuraSubtypeKind::ModMaxResource) => Some((
121 e.misc_value_0,
122 ResourcePassive::MaxFlat(e.base_points * ranks),
123 )),
124 Some(AuraSubtypeKind::ModPowerRegenPercent) => Some((
125 e.misc_value_0,
126 ResourcePassive::RegenPercent(e.base_points * ranks),
127 )),
128 Some(AuraSubtypeKind::ModPowerRegen) => Some((
129 e.misc_value_0,
130 ResourcePassive::RegenPerFiveSeconds(e.base_points * ranks),
131 )),
132 Some(AuraSubtypeKind::ModRageGeneratedFromAutoAttacks)
133 if rage_effect_count <= 1 || specialization_rage_effect == Some(e.index) =>
134 {
135 Some((
136 i32::from(u8::from(wowlab_types::combat::ResourceType::Rage)),
137 ResourcePassive::AutoAttackGainPercent(e.base_points * ranks),
138 ))
139 }
140 Some(AuraSubtypeKind::ModManaCostPercent) => Some((
141 i32::from(u8::from(wowlab_types::combat::ResourceType::Mana)),
142 ResourcePassive::CostPercent(e.base_points * ranks),
143 )),
144 _ => None,
145 })
146}