Skip to main content

wowlab_engine_combat/state/combat_state/
telemetry.rs

1use super::{
2    ActorId, AuraKey, AuraTelemetryScope, CombatState, EnemyIdx, TargetMetadata, TelemetryScope,
3};
4
5impl CombatState {
6    /// Exact source/target ownership scope for telemetry emitted against `target`.
7    #[must_use]
8    pub fn telemetry_scope(&self, source: ActorId, target: EnemyIdx) -> Option<TelemetryScope> {
9        let definition = self.config.encounter.definition();
10        let enemy = definition.enemies.get(target.as_usize())?;
11        let group = definition.groups.get(enemy.group_id.as_usize())?;
12        let wave = definition.waves.get(group.wave_id.as_usize())?;
13
14        Some(TelemetryScope {
15            source,
16            target,
17            pull: wave.pull_id,
18            group: group.id,
19        })
20    }
21
22    /// Deterministic target dictionary in immutable encounter identity order.
23    #[must_use]
24    pub fn telemetry_targets(&self) -> Vec<TargetMetadata> {
25        self.enemy_definitions()
26            .map(|enemy| TargetMetadata {
27                id: enemy.id().to_target_idx(),
28                npc_id: enemy.npc_id(),
29                display_name: enemy.display_name().to_string(),
30                group: enemy.group_id(),
31                enemy_tags: enemy.enemy_tags().to_vec(),
32                group_tags: enemy.group_tags().to_vec(),
33            })
34            .collect()
35    }
36
37    /// Pull/group ownership for an exact aura instance.
38    #[must_use]
39    pub fn aura_telemetry_scope(&self, key: AuraKey) -> AuraTelemetryScope {
40        let (pull, group) = match key.affected() {
41            ActorId::Enemy(target) => self
42                .telemetry_scope(key.source(), target)
43                .map_or((self.runtime.encounter.active_pull(), None), |scope| {
44                    (scope.pull, Some(scope.group))
45                }),
46            ActorId::Player | ActorId::External | ActorId::Pet(_) => {
47                (self.runtime.encounter.active_pull(), None)
48            }
49        };
50
51        AuraTelemetryScope {
52            source: key.source(),
53            affected: key.affected(),
54            pull,
55            group,
56        }
57    }
58}