Skip to main content

boon/
hitgroups.rs

1//! Hit group ID to name mapping for Deadlock.
2//!
3//! Values are Source 2's `HitGroup_t` enum, taken from
4//! `GameTracking-Deadlock/DumpSource2/schemas/client/HitGroup_t.h`:
5//!
6//! ```text
7//! enum HitGroup_t : uint32_t
8//! {
9//!     HITGROUP_INVALID = -1,
10//!     HITGROUP_GENERIC = 0,
11//!     HITGROUP_HEAD = 1,
12//!     HITGROUP_CHEST = 2,
13//!     HITGROUP_STOMACH = 3,
14//!     HITGROUP_LEFTARM = 4,
15//!     HITGROUP_RIGHTARM = 5,
16//!     HITGROUP_LEFTLEG = 6,
17//!     HITGROUP_RIGHTLEG = 7,
18//!     HITGROUP_NECK = 8,
19//!     HITGROUP_UNUSED = 9,
20//!     HITGROUP_GEAR = 10,
21//!     HITGROUP_SPECIAL = 11,
22//!     HITGROUP_T2_BOSS_FRONT_LEFT_LEG_WEAKPOINT = 12,
23//!     HITGROUP_T2_BOSS_FRONT_RIGHT_LEG_WEAKPOINT = 13,
24//!     HITGROUP_T2_BOSS_REAR_LEFT_LEG_WEAKPOINT = 14,
25//!     HITGROUP_T2_BOSS_REAR_RIGHT_LEG_WEAKPOINT = 15,
26//!     HITGROUP_T2_BOSS_HEAD_WEAKPOINT = 16,
27//!     HITGROUP_T2_BOSS_BACK_WEAKPOINT = 17,
28//!     HITGROUP_DRONE_BOSS_DRONE_WEAKPOINT = 18,
29//!     HITGROUP_HEAD_NO_RESIST = 19,
30//!     HITGROUP_COUNT = 20,
31//! };
32//! ```
33//!
34//! `HITGROUP_COUNT` (20) is a sentinel for the number of enum members, not a
35//! real hit group, so it is omitted.
36
37/// All known hit group (ID, name) pairs sorted by ID.
38const HITGROUPS: &[(i64, &str)] = &[
39    (-1, "invalid"),
40    (0, "generic"),
41    (1, "head"),
42    (2, "chest"),
43    (3, "stomach"),
44    (4, "left_arm"),
45    (5, "right_arm"),
46    (6, "left_leg"),
47    (7, "right_leg"),
48    (8, "neck"),
49    (9, "unused"),
50    (10, "gear"),
51    (11, "special"),
52    (12, "t2_boss_front_left_leg_weakpoint"),
53    (13, "t2_boss_front_right_leg_weakpoint"),
54    (14, "t2_boss_rear_left_leg_weakpoint"),
55    (15, "t2_boss_rear_right_leg_weakpoint"),
56    (16, "t2_boss_head_weakpoint"),
57    (17, "t2_boss_back_weakpoint"),
58    (18, "drone_boss_drone_weakpoint"),
59    (19, "head_no_resist"),
60];
61
62/// Look up a hit group name by ID. Returns `"HITGROUP_NOT_FOUND"` for unknown IDs.
63pub fn hitgroup_name(id: i64) -> &'static str {
64    HITGROUPS
65        .iter()
66        .find(|&&(k, _)| k == id)
67        .map(|&(_, v)| v)
68        .unwrap_or("HITGROUP_NOT_FOUND")
69}
70
71/// Return all known (hit group ID, hit group name) pairs.
72pub fn all_hitgroups() -> &'static [(i64, &'static str)] {
73    HITGROUPS
74}
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79
80    #[test]
81    fn known_hitgroup_generic() {
82        assert_eq!(hitgroup_name(0), "generic");
83    }
84
85    #[test]
86    fn known_hitgroup_head() {
87        assert_eq!(hitgroup_name(1), "head");
88    }
89
90    #[test]
91    fn known_hitgroup_invalid() {
92        assert_eq!(hitgroup_name(-1), "invalid");
93    }
94
95    #[test]
96    fn known_hitgroup_head_no_resist() {
97        assert_eq!(hitgroup_name(19), "head_no_resist");
98    }
99
100    #[test]
101    fn count_sentinel_not_present() {
102        assert_eq!(hitgroup_name(20), "HITGROUP_NOT_FOUND");
103    }
104
105    #[test]
106    fn unknown_hitgroup() {
107        assert_eq!(hitgroup_name(99), "HITGROUP_NOT_FOUND");
108    }
109
110    #[test]
111    fn all_hitgroups_count() {
112        assert_eq!(all_hitgroups().len(), 21);
113    }
114}