Skip to main content

wowlab_engine_domain/rotation/buffer/dense/
offsets.rs

1use wowlab_types::{
2    combat::ResourceType,
3    sim::{AuraKey, AuraProjectionKey, FastMap, IntMap, SpellIdx},
4};
5
6use crate::rotation::buffer::{ByteOffset, DescriptorId};
7
8#[derive(Clone, Debug)]
9pub(crate) struct SlotMaps<V> {
10    pub(crate) cooldowns: IntMap<SpellIdx, V>,
11    pub(crate) auras: FastMap<AuraKey, V>,
12    pub(crate) aura_projections: FastMap<AuraProjectionKey, V>,
13    pub(crate) resources: FastMap<ResourceType, V>,
14    pub(crate) spells: IntMap<SpellIdx, V>,
15    pub(crate) talents: FastMap<String, V>,
16    pub(crate) hero_trees: FastMap<String, V>,
17    pub(crate) items: FastMap<String, V>,
18    pub(crate) swings: FastMap<String, V>,
19    pub(crate) history: IntMap<SpellIdx, V>,
20    pub(crate) equipment: FastMap<String, V>,
21    pub(crate) set_bonuses: FastMap<String, V>,
22    pub(crate) units: FastMap<String, V>,
23    pub(crate) weapon_imbues: FastMap<String, V>,
24}
25
26impl<V> Default for SlotMaps<V> {
27    fn default() -> Self {
28        Self {
29            cooldowns: IntMap::default(),
30            auras: FastMap::default(),
31            aura_projections: FastMap::default(),
32            resources: FastMap::default(),
33            spells: IntMap::default(),
34            talents: FastMap::default(),
35            hero_trees: FastMap::default(),
36            items: FastMap::default(),
37            swings: FastMap::default(),
38            history: IntMap::default(),
39            equipment: FastMap::default(),
40            set_bonuses: FastMap::default(),
41            units: FastMap::default(),
42            weapon_imbues: FastMap::default(),
43        }
44    }
45}
46
47impl SlotMaps<usize> {
48    pub(crate) fn into_byte_offsets(self) -> SlotMaps<ByteOffset> {
49        fn convert<K, S>(
50            map: std::collections::HashMap<K, usize, S>,
51        ) -> std::collections::HashMap<K, ByteOffset, S>
52        where
53            K: Eq + std::hash::Hash,
54            S: std::hash::BuildHasher + Default,
55        {
56            map.into_iter()
57                .map(|(key, offset)| (key, ByteOffset::new(offset)))
58                .collect()
59        }
60
61        SlotMaps {
62            cooldowns: convert(self.cooldowns),
63            auras: convert(self.auras),
64            aura_projections: convert(self.aura_projections),
65            resources: convert(self.resources),
66            spells: convert(self.spells),
67            talents: convert(self.talents),
68            hero_trees: convert(self.hero_trees),
69            items: convert(self.items),
70            swings: convert(self.swings),
71            history: convert(self.history),
72            equipment: convert(self.equipment),
73            set_bonuses: convert(self.set_bonuses),
74            units: convert(self.units),
75            weapon_imbues: convert(self.weapon_imbues),
76        }
77    }
78}
79
80/// Maps slot types and keys to their byte offsets within the dense buffer.
81#[derive(Clone, Debug)]
82pub(crate) struct BufferOffsets {
83    pub(crate) slots: SlotMaps<ByteOffset>,
84    pub(crate) player: ByteOffset,
85    pub(crate) combat: ByteOffset,
86    pub(crate) pet: ByteOffset,
87    pub(crate) standalone: FastMap<DescriptorId, ByteOffset>,
88}