Skip to main content

wowlab_engine_application/game_data/
auras.rs

1//! Aura property resolution from spell data and static passives.
2
3use 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
11// #t(fn: rust_builder_param) this mutates the resolved-data accumulator; it is not a factory.
12pub(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}