Skip to main content

wowlab_engine_combat/handler/spec_handler/
introspect.rs

1use super::{CombatHandler, build_introspection};
2
3impl CombatHandler {
4    pub(super) fn introspect_impl(&self) -> wowlab_types::game::SpecIntrospection {
5        build_introspection(&self.program, &self.program.names)
6    }
7
8    pub(super) fn attach_decision_trace_impl(
9        &mut self,
10        sink: std::sync::Arc<dyn wowlab_engine_ports::DecisionTraceSink>,
11    ) {
12        self.engine
13            .set_decision_trace(wowlab_engine_ports::DecisionTraceTarget::new(sink));
14    }
15
16    pub(super) fn paperdoll_impl(&self) -> wowlab_engine_ports::Paperdoll {
17        use wowlab_engine_ports::{Paperdoll, PaperdollLoadout};
18
19        let introspection = build_introspection(&self.program, &self.program.names);
20
21        // #t(block: rust_unchecked_indexing) local_idx set at build time, always in bounds
22        let precombat_aura_ids: Vec<u32> = self
23            .program
24            .precombat_auras
25            .iter()
26            .map(|&local_idx| self.program.auras[local_idx.as_usize()].aura_id)
27            .collect();
28
29        // #t(block: rust_unchecked_indexing) local_idx set at build time, always in bounds
30        let talent_ranks = self
31            .program
32            .talent_aura_stacks
33            .iter()
34            .map(|&(local_idx, rank)| (self.program.auras[local_idx.as_usize()].aura_id, rank))
35            .collect();
36
37        Paperdoll::new(
38            self.program.config.base_stats.stats.clone(),
39            introspection,
40            PaperdollLoadout {
41                precombat_aura_ids,
42                talent_ranks,
43                item_use_spells: self.program.item_use_spells.clone(),
44                weapon_main: self.program.config.game_data.main_hand(),
45                weapon_off: self.program.config.game_data.off_hand(),
46            },
47        )
48    }
49}