wowlab_engine_application/game_data/
auras.rs1use wowlab_engine_domain::dbc::PassiveQuery;
4use wowlab_engine_gamedata::{AuraProps, ResolvedGameDataBuilder};
5use wowlab_engine_ports::{DataResolver, DynDataResolver, EngineError, SpellId};
6use wowlab_types::{
7 data::SpellDataFlat,
8 sim::{FastSet, SpellIdx},
9};
10
11pub(super) async fn resolve_auras(
13 builder: &mut ResolvedGameDataBuilder,
14 resolver: &DynDataResolver<'_>,
15 aura_ids: &FastSet<u32>,
16 passives: &[wowlab_engine_domain::dbc::RankedPassive],
17) -> Result<(), EngineError> {
18 for &aura_id_raw in aura_ids {
19 let aura_idx = SpellIdx::from_raw(aura_id_raw);
20 let aura_id = SpellId::try_from(aura_idx).map_err(|source| {
21 EngineError::spell_id_conversion("failed to convert aura spell id", source)
22 })?;
23 let spell = resolve_aura_spell(resolver, aura_id).await?;
24 let query = PassiveQuery {
25 passives,
26 spell: &spell,
27 };
28
29 builder.insert_aura_props(
30 aura_idx,
31 AuraProps {
32 duration_ms: wowlab_engine_domain::dbc::passive_duration_ms(query, spell.duration),
33 doses: wowlab_engine_domain::dbc::passive_doses(passives, &spell).max(1),
34 max_stacks: wowlab_engine_domain::dbc::passive_max_stacks(query, spell.max_stacks),
35 tick_period_ms: spell.tick_period_ms,
36 pandemic: spell.pandemic_refresh,
37 },
38 );
39 }
40
41 Ok(())
42}
43
44async fn resolve_aura_spell(
45 resolver: &DynDataResolver<'_>,
46 aura_id: SpellId,
47) -> Result<SpellDataFlat, EngineError> {
48 resolver.get_spell(aura_id).await.map_err(|error| {
49 EngineError::spec_construction(format!("failed to resolve aura spell {aura_id}: {error}"))
50 })
51}