11/**
2- * @fileoverview NPC model/animation mappings for Zulrah encounter rendering.
2+ * @fileoverview NPC model/animation mappings for encounter rendering.
33 *
44 * Maps NPC definition IDs to cache model IDs and animation sequence IDs.
5- * Generated data — edit export scripts to regenerate .
5+ * Generated by scripts/export_inferno_npcs.py — do not edit .
66 */
77
88#ifndef NPC_MODELS_H
@@ -15,13 +15,14 @@ typedef struct {
1515 uint32_t model_id ;
1616 uint32_t idle_anim ;
1717 uint32_t attack_anim ;
18+ uint32_t walk_anim ; /* walk cycle animation; 65535 = use idle_anim */
1819} NpcModelMapping ;
1920
2021/* zulrah forms + snakeling */
21- static const NpcModelMapping NPC_MODEL_MAP [] = {
22- {2042 , 14408 , 5069 , 5068 }, /* green zulrah (ranged) */
23- {2043 , 14409 , 5069 , 5068 }, /* red zulrah (melee) */
24- {2044 , 14407 , 5069 , 5068 }, /* blue zulrah (magic) */
22+ static const NpcModelMapping NPC_MODEL_MAP_ZULRAH [] = {
23+ {2042 , 14408 , 5069 , 5068 , 65535 }, /* green zulrah (ranged) */
24+ {2043 , 14409 , 5069 , 5068 , 65535 }, /* red zulrah (melee) */
25+ {2044 , 14407 , 5069 , 5068 , 65535 }, /* blue zulrah (magic) */
2526};
2627
2728/* snakeling model + animations (NPC 2045 melee, 2046 magic — same model) */
@@ -34,27 +35,104 @@ static const NpcModelMapping NPC_MODEL_MAP[] = {
3435
3536/* zulrah spotanim (projectile/cloud) model IDs */
3637#define GFX_RANGED_PROJ_MODEL 20390 /* GFX 1044 ranged projectile */
37- #define GFX_CLOUD_PROJ_MODEL 11221 /* GFX 1045 cloud projectile (flies to target) */
38+ #define GFX_CLOUD_PROJ_MODEL 11221 /* GFX 1045 cloud projectile */
3839#define GFX_MAGIC_PROJ_MODEL 26593 /* GFX 1046 magic projectile */
39- #define GFX_TOXIC_CLOUD_MODEL 4086 /* object 11700 — venom cloud on ground (3x3) */
40- #define GFX_SNAKELING_SPAWN_MODEL 20390 /* GFX 1047 spawn orb (same mesh as 1044, white recolor) */
40+ #define GFX_TOXIC_CLOUD_MODEL 4086 /* object 11700 */
41+ #define GFX_SNAKELING_SPAWN_MODEL 20390 /* GFX 1047 spawn orb */
4142
4243/* zulrah animation sequence IDs */
4344#define ZULRAH_ANIM_ATTACK 5068
4445#define ZULRAH_ANIM_IDLE 5069
45- #define ZULRAH_ANIM_DIVE 5072 /* DIG_ANIM_ID from RuneLite plugin — sinks into water */
46- #define ZULRAH_ANIM_SURFACE 5071 /* INITIAL_RISE_ANIM_ID — first appearance */
47- #define ZULRAH_ANIM_RISE 5073 /* RISE_ANIM_ID — subsequent phase surfaces */
48- #define ZULRAH_ANIM_5070 5070 /* unknown — possibly unused */
49- #define ZULRAH_ANIM_5806 5806 /* melee whip variant 1 */
50- #define ZULRAH_ANIM_5807 5807 /* melee whip variant 2 */
51-
52- /* GFX 1047 snakeling spawn orb animation */
46+ #define ZULRAH_ANIM_DIVE 5072
47+ #define ZULRAH_ANIM_SURFACE 5071
48+ #define ZULRAH_ANIM_RISE 5073
49+ #define ZULRAH_ANIM_5070 5070
50+ #define ZULRAH_ANIM_5806 5806
51+ #define ZULRAH_ANIM_5807 5807
5352#define GFX_SNAKELING_SPAWN_ANIM 5358
5453
54+ /* ================================================================ */
55+ /* inferno NPC model/animation mappings */
56+ /* ================================================================ */
57+
58+ static const NpcModelMapping NPC_MODEL_MAP_INFERNO [] = {
59+ {7691 , 0xC1E0B , 7573 , 7574 , 7572 }, /* Jal-Nib (nibbler) */
60+ {7692 , 0xC1E0C , 7577 , 7578 , 7577 }, /* Jal-MejRah (bat) — walk = idle */
61+ {7693 , 0xC1E0D , 7586 , 7581 , 7587 }, /* Jal-Ak (blob) */
62+ {7694 , 0xC1E0E , 7586 , 65535 , 7587 }, /* Jal-Ak-Rek-Ket (blob melee split) */
63+ {7695 , 0xC1E0F , 7586 , 65535 , 7587 }, /* Jal-Ak-Rek-Xil (blob range split) */
64+ {7696 , 0xC1E10 , 7586 , 65535 , 7587 }, /* Jal-Ak-Rek-Mej (blob mage split) */
65+ {7697 , 0xC1E11 , 7595 , 7597 , 7596 }, /* Jal-ImKot (meleer) */
66+ {7698 , 0xC1E12 , 7602 , 7605 , 7603 }, /* Jal-Xil (ranger) */
67+ {7699 , 0xC1E13 , 7609 , 7610 , 7608 }, /* Jal-Zek (mager) */
68+ {7700 , 0xC1E14 , 7589 , 7593 , 7588 }, /* JalTok-Jad */
69+ {7701 , 0xC1E15 , 2636 , 65535 , 2634 }, /* Yt-HurKot (jad healer) */
70+ {7706 , 0xC1E1A , 7564 , 7566 , 65535 }, /* TzKal-Zuk — no walk */
71+ {7707 , 0xC1E1B , 7567 , 65535 , 7567 }, /* Zuk shield */
72+ {7708 , 0xC1E1C , 2867 , 65535 , 2863 }, /* Jal-MejJak (zuk healer) */
73+ };
74+
75+ /* inferno NPC walk animation IDs */
76+ #define INF_WALK_ANIM_NIBBLER 7572
77+ #define INF_WALK_ANIM_BAT 7577
78+ #define INF_WALK_ANIM_BLOB 7587
79+ #define INF_WALK_ANIM_BLOB_MELEE_SPLIT 7587
80+ #define INF_WALK_ANIM_BLOB_RANGE_SPLIT 7587
81+ #define INF_WALK_ANIM_BLOB_MAGE_SPLIT 7587
82+ #define INF_WALK_ANIM_MELEER 7596
83+ #define INF_WALK_ANIM_RANGER 7603
84+ #define INF_WALK_ANIM_MAGER 7608
85+ #define INF_WALK_ANIM_JALTOK_JAD 7588
86+ #define INF_WALK_ANIM_JAD_HEALER 2634
87+ #define INF_WALK_ANIM_ZUK_SHIELD 7567
88+ #define INF_WALK_ANIM_ZUK_HEALER 2863
89+
90+ /* inferno spotanim (projectile/effect) model + animation IDs */
91+ #define INF_GFX_157_MODEL 3116 /* Jad magic hit */
92+ #define INF_GFX_157_ANIM 693
93+ #define INF_GFX_447_MODEL 9334 /* Jad ranged projectile (fireball) */
94+ #define INF_GFX_447_ANIM 2658
95+ #define INF_GFX_448_MODEL 9337 /* Jad magic projectile */
96+ #define INF_GFX_448_ANIM 2659
97+ #define INF_GFX_451_MODEL 9342 /* Jad ranged hit */
98+ #define INF_GFX_451_ANIM 2660
99+ #define INF_GFX_942_MODEL 19374 /* Dragon arrow projectile (twisted bow) */
100+ #define INF_GFX_942_ANIM 5233
101+ #define INF_GFX_1374_MODEL 3082 /* Bat ranged projectile */
102+ #define INF_GFX_1374_ANIM 660
103+ #define INF_GFX_1375_MODEL 33006 /* Zuk magic projectile */
104+ #define INF_GFX_1375_ANIM 7571
105+ #define INF_GFX_1376_MODEL 33007 /* Zuk ranged projectile */
106+ #define INF_GFX_1376_ANIM 7571
107+ #define INF_GFX_1377_MODEL 33013 /* Ranger ranged projectile */
108+ #define INF_GFX_1378_MODEL 33015 /* Ranger ranged hit */
109+ #define INF_GFX_1378_ANIM 7615
110+ #define INF_GFX_1379_MODEL 33016 /* Mager magic projectile */
111+ #define INF_GFX_1379_ANIM 7614
112+ #define INF_GFX_1380_MODEL 33008 /* Mager magic hit */
113+ #define INF_GFX_1380_ANIM 7616
114+ #define INF_GFX_1381_MODEL 33009 /* Zuk typeless hit (falling rocks?) */
115+ #define INF_GFX_1381_ANIM 7616
116+ #define INF_GFX_1382_MODEL 33017 /* Blob melee */
117+ #define INF_GFX_1382_ANIM 7614
118+ #define INF_GFX_1383_MODEL 26293 /* Blob ranged */
119+ #define INF_GFX_1383_ANIM 366
120+ #define INF_GFX_1384_MODEL 3136 /* Blob magic */
121+ #define INF_GFX_1385_MODEL 3142 /* Healer magic attack */
122+ #define INF_GFX_1385_ANIM 366
123+
124+ /* inferno pillar models — "Rocky support" objects 30284-30287, 4 HP levels */
125+ #define INF_PILLAR_MODEL_100 33044 /* object 30284 — full health */
126+ #define INF_PILLAR_MODEL_75 33043 /* object 30285 — 75% HP */
127+ #define INF_PILLAR_MODEL_50 33042 /* object 30286 — 50% HP */
128+ #define INF_PILLAR_MODEL_25 33045 /* object 30287 — 25% HP */
129+
55130static const NpcModelMapping * npc_model_lookup (uint16_t npc_id ) {
56- for (int i = 0 ; i < (int )(sizeof (NPC_MODEL_MAP ) / sizeof (NPC_MODEL_MAP [0 ])); i ++ ) {
57- if (NPC_MODEL_MAP [i ].npc_id == npc_id ) return & NPC_MODEL_MAP [i ];
131+ for (int i = 0 ; i < (int )(sizeof (NPC_MODEL_MAP_ZULRAH ) / sizeof (NPC_MODEL_MAP_ZULRAH [0 ])); i ++ ) {
132+ if (NPC_MODEL_MAP_ZULRAH [i ].npc_id == npc_id ) return & NPC_MODEL_MAP_ZULRAH [i ];
133+ }
134+ for (int i = 0 ; i < (int )(sizeof (NPC_MODEL_MAP_INFERNO ) / sizeof (NPC_MODEL_MAP_INFERNO [0 ])); i ++ ) {
135+ if (NPC_MODEL_MAP_INFERNO [i ].npc_id == npc_id ) return & NPC_MODEL_MAP_INFERNO [i ];
58136 }
59137 return NULL ;
60138}
0 commit comments