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}