ssbm_utils/enums/
item.rs

1#![allow(non_camel_case_types)]
2#![allow(clippy::upper_case_acronyms)]
3
4// use std::collections::HashSet;
5// use lazy_static::lazy_static;
6use strum_macros::{Display, EnumString, FromRepr, IntoStaticStr};
7
8#[derive(Debug, Clone, Copy, EnumString, IntoStaticStr, Display, FromRepr, PartialEq, Eq)]
9#[repr(u16)]
10pub enum Item {
11    // fake
12    UNKNOWN = u16::MAX,
13
14    // real
15    CAPSULE = 0x00,
16    BOX = 0x01,
17    BARREL = 0x02,
18    EGG = 0x03,
19    PARTY_BALL = 0x04,
20    BARREL_CANNON = 0x05,
21    BOB_OMB = 0x06,
22    MR_SATURN = 0x07,
23    HEART_CONTAINER = 0x08,
24    MAXIM_TOMATO = 0x09,
25    STARMAN = 0x0A,
26    HOME_RUN_BAT = 0x0B,
27    BEAM_SWORD = 0x0C,
28    PARASOL = 0x0D,
29    GREEN_SHELL_1 = 0x0E,
30    RED_SHELL_1 = 0x0F,
31    RAY_GUN = 0x10,
32    FREEZIE = 0x11,
33    FOOD = 0x12,
34    PROXIMITY_MINE = 0x13,
35    FLIPPER = 0x14,
36    SUPER_SCOPE = 0x15,
37    STAR_ROD = 0x16,
38    LIP_STICK = 0x17,
39    FAN = 0x18,
40    FIRE_FLOWER = 0x19,
41    SUPER_MUSHROOM = 0x1A,
42    POISON_MUSHROOM = 0x1B,
43    HAMMER = 0x1C,
44    WARP_STAR = 0x1D,
45    SCREW_ATTACK = 0x1E,
46    BUNNY_HOOD = 0x1F,
47    METAL_BOX = 0x20,
48    CLOAKING_DEVICE = 0x21,
49    POKE_BALL = 0x22,
50
51    // ------------------------------------------------ ITEM RELATED ------------------------------------------------ //
52    RAY_GUN_RECOIL_EFFECT = 0x23,
53    STAR_ROD_STAR = 0x24,
54    LIP_STICK_DUST = 0x25,
55    SUPER_SCOPE_BEAM = 0x26,
56    RAY_GUN_BEAM = 0x27,
57    HAMMER_HEAD = 0x28,
58    FLOWER = 0x29,
59    YOSHI_EGG_1 = 0x2A,
60
61    // -------------------------------------------------- MONSTERS -------------------------------------------------- //
62    GOOMBA = 0x2B,
63    REDEAD = 0x2C,
64    OCTAROK = 0x2D,
65    OTTOSEA = 0x2E,
66    STONE = 0x2F,
67
68    // ---------------------------------------------- CHARACTER RELATED --------------------------------------------- //
69    MARIO_FIRE = 0x30,
70    DR_MARIO_PILL = 0x31,
71    KIRBY_CUTTER_BEAM = 0x32,
72    KIRBY_HAMMER = 0x33,
73    /// maybe kirby copy star?
74    UNKNOWN_1 = 0x34,
75    UNKNOWN_2 = 0x35,
76    FOX_LASER = 0x36,
77    FALCO_LASER = 0x37,
78    FOX_SHADOW = 0x38,
79    FALCO_SHADOW = 0x39,
80    LINK_BOMB = 0x3A,
81    YOUNG_LINK_BOMB = 0x3B,
82    LINK_BOOMERANG = 0x3C,
83    YOUNG_LINK_BOOMERANG = 0x3D,
84    LINK_HOOKSHOT = 0x3E,
85    YOUNG_LINK_HOOKSHOT = 0x3F,
86    LINK_ARROW_1 = 0x40,
87    YOUNG_LINK_FIRE_ARROW = 0x41,
88    /// Main projectile. see also: `NESS_PK_FIRE_PILLAR`
89    NESS_PK_FIRE = 0x42,
90    /// Residual effect after connecting. See also: `NESS_PK_FIRE`
91    NESS_PK_FIRE_PILLAR = 0x43,
92    NESS_PK_FLASH_CHARGE = 0x44,
93    /// Main projectile
94    NESS_PK_THUNDER = 0x45,
95    /// Part of the trail
96    NESS_PK_THUNDER_1 = 0x46,
97    /// Part of the trail
98    NESS_PK_THUNDER_2 = 0x47,
99    /// Part of the trail
100    NESS_PK_THUNDER_3 = 0x48,
101    /// Part of the trail
102    NESS_PK_THUNDER_4 = 0x49,
103    FOX_BLASTER = 0x4A,
104    FALCO_BLASTER = 0x4B,
105    LINK_BOW = 0x4C,
106    YOUNG_LINK_BOW = 0x4D,
107    NESS_PK_FLASH_EXPLODE = 0x4E,
108    SHEIK_NEEDLE_THROWN = 0x4F,
109    SHEIK_NEEDLE_HELD = 0x50,
110    PIKACHU_THUNDER = 0x51,
111    PICHU_THUNDER = 0x52,
112    MARIO_CAPE = 0x53,
113    DR_MARIO_CAPE = 0x54,
114    SHEIK_SMOKE = 0x55,
115    YOSHI_EGG_THROW = 0x56,
116    YOSHI_EGGLAY = 0x57,
117    YOSHI_STAR = 0x58,
118    PIKACHU_TJOLT_GROUND = 0x59,
119    PIKACHU_TJOLT_AIR = 0x5A,
120    PICHU_TJOLT_GROUND = 0x5B,
121    PICHU_TJOLT_AIR = 0x5C,
122    SAMUS_BOMB = 0x5D,
123    SAMUS_CHARGESHOT = 0x5E,
124    SAMUS_MISSILE = 0x5F,
125    SAMUS_GRAPPLE_BEAM = 0x60,
126    SHEIK_CHAIN = 0x61,
127    PEACH_BOMBER_EXPLODE = 0x62,
128    PEACH_TURNIP = 0x63,
129    BOWSER_FLAME = 0x64,
130    NESS_BAT = 0x65,
131    NESS_YOYO = 0x66,
132    PEACH_PARASOL = 0x67,
133    PEACH_TOAD = 0x68,
134    LUIGI_FIRE = 0x69,
135    ICE_CLIMBERS_ICE = 0x6A,
136    ICE_CLIMBERS_BLIZZARD = 0x6B,
137    ZELDA_FIRE = 0x6C,
138    ZELDA_FIRE_EXPLODE = 0x6D,
139    MEWTWO_DISABLE = 0x6E,
140    PEACH_TOAD_SPORE = 0x6F,
141    MEWTWO_SHADOWBALL = 0x70,
142    ICE_CLIMBERS_UP_B_STRING = 0x71,
143    GAME_AND_WATCH_PESTICIDE = 0x72,
144    GAME_AND_WATCH_MANHOLE = 0x73,
145    GAME_AND_WATCH_FIRE = 0x74,
146    GAME_AND_WATCH_PARACHUTE = 0x75,
147    GAME_AND_WATCH_TURTLE = 0x76,
148    GAME_AND_WATCH_SPARKY = 0x77,
149    GAME_AND_WATCH_JUDGE = 0x78,
150    GAME_AND_WATCH_OIL = 0x79,
151    GAME_AND_WATCH_SAUSAGE = 0x7A,
152    YOUNG_LINK_MILK = 0x7B,
153    GAME_AND_WATCH_FIREFIGHTER = 0x7C,
154    MASTER_HAND_LASER = 0x7D,
155    MASTER_HAND_BULLET = 0x7E,
156    CRAZY_HAND_LASER = 0x7F,
157    CRAZY_HAND_BULLET = 0x80,
158    CRAZY_HAND_BOMB = 0x81,
159    KIRBY_COPY_MARIO_FIRE = 0x82,
160    KIRBY_COPY_DR_MARIO_PILL = 0x83,
161    KIRBY_COPY_LUIGI_FIRE = 0x84,
162    KIRBY_COPY_ICE_CLIMBERS_ICE = 0x85,
163    KIRBY_COPY_PEACH_TOAD = 0x86,
164    KIRBY_COPY_TOAD_SPORE = 0x87,
165    KIRBY_COPY_FOX_LASER = 0x88,
166    KIRBY_COPY_FALCO_LASER = 0x89,
167    KIRBY_COPY_FOX_BLASTER = 0x8A,
168    KIRBY_COPY_FALCO_BLASTER = 0x8B,
169    KIRBY_COPY_LINK_ARROW = 0x8C,
170    KIRBY_COPY_YOUNG_LINK_ARROW = 0x8D,
171    KIRBY_COPY_LINK_BOW = 0x8E,
172    KIRBY_COPY_YOUNG_LINK_BOW = 0x8F,
173    KIRBY_COPY_MEWTWO_SHADOWBALL = 0x90,
174    KIRBY_COPY_PK_FLASH = 0x91,
175    KIRBY_COPY_PK_FLASH_EXPLOSION = 0x92,
176    KIRBY_COPY_PIKACHU_TJOLT_GROUND = 0x93,
177    KIRBY_COPY_PIKACHU_TJOLT_AIR = 0x94,
178    KIRBY_COPY_PICHU_TJOLT_GROUND = 0x95,
179    KIRBY_COPY_PICHU_TJOLT_AIR = 0x96,
180    KIRBY_COPY_SAMUS_CHARGESHOT = 0x97,
181    KIRBY_COPY_SHEIK_NEEDLE_THROWN = 0x98,
182    KIRBY_COPY_SHEIK_NEEDLE_HELD = 0x99,
183    KIRBY_COPY_BOWSER_FLAME = 0x9A,
184    KIRBY_COPY_GAME_AND_WATCH_SAUSAGE = 0x9B,
185    KIRBY_COPY_YOSHI_EGGLAY = 0x9D,
186    UNKNOWN_3 = 0x9E,
187    MARIO_LUIGI_COIN = 0x9F,
188
189    // --------------------------------------------------- POKEMON -------------------------------------------------- //
190    RANDOM_POKEMON = 0xA0,
191    GOLDEEN = 0xA1,
192    CHICORITA = 0xA2,
193    SNORLAX = 0xA3,
194    BLASTOISE = 0xA4,
195    WEEZING = 0xA5,
196    CHARIZARD = 0xA6,
197    MOLTRES = 0xA7,
198    ZAPDOS = 0xA8,
199    ARTICUNO = 0xA9,
200    WOBBUFFET = 0xAA,
201    SCIZOR = 0xAB,
202    UNOWN = 0xAC,
203    ENTEI = 0xAD,
204    RAIKOU = 0xAE,
205    SUICUNE = 0xAF,
206    BELLOSSOM = 0xB0,
207    ELECTRODE = 0xB1,
208    LUGIA = 0xB2,
209    HO_OH = 0xB3,
210    DITTO = 0xB4,
211    CLEFAIRY = 0xB5,
212    TOGEPI = 0xB6,
213    MEW = 0xB7,
214    CELEBI = 0xB8,
215    STARYU = 0xB9,
216    CHANSEY = 0xBA,
217    PORYGON2 = 0xBB,
218    CYNDAQUIL = 0xBC,
219    MARILL = 0xBD,
220    VENUSAUR = 0xBE,
221
222    // ----------------------------------------------- POKEMON RELATED ---------------------------------------------- //
223    CHICORITA_LEAF = 0xBF,
224    BLASTOISE_WATER = 0xC0,
225    WEEZING_GAS_1 = 0xC1,
226    WEEZING_GAS_2 = 0xC2,
227    CHARIZARD_BREATH_1 = 0xC3,
228    CHARIZARD_BREATH_2 = 0xC4,
229    CHARIZARD_BREATH_3 = 0xC5,
230    CHARIZARD_BREATH_4 = 0xC6,
231    MINI_UNOWNS = 0xC7,
232    LUGIA_AEROBLAST_1 = 0xC8,
233    LUGIA_AEROBLAST_2 = 0xC9,
234    LUGIA_AEROBLAST_3 = 0xCA,
235    HO_OH_FLAME = 0xCB,
236    STARYU_STAR = 0xCC,
237    HEALING_EGG = 0xCD,
238    CYNDAQUIL_FIRE = 0xCE,
239    UNKNOWN_4 = 0xCF,
240
241    // ------------------------------------------------ MONSTERS CONT ----------------------------------------------- //
242    OLD_GOOMBA = 0xD0,
243    TARGET = 0xD1,
244    SHYGUY = 0xD2,
245    KOOPA_GREEN = 0xD3,
246    KOOPA_RED = 0xD4,
247    LIKE_LIKE = 0xD5,
248    /// Decomp says "invalid"
249    OLD_REDEAD = 0xD6,
250    /// Decomp says "invalid"
251    OLD_OCTAROK = 0xD7,
252    OLD_OTTOSEA = 0xD8,
253    WHITE_BEAR = 0xD9,
254    KLAP = 0xDA,
255    Z_GREEN_SHELL = 0xDB,
256    Z_RED_SHELL = 0xDC,
257
258    // ----------------------------------------------- STAGE SPECIFIC ----------------------------------------------- //
259    TINGLE = 0xDD,
260    INVALID_1 = 0xDE,
261    INVALID_2 = 0xDF,
262    INVALID_3 = 0xE0,
263    APPLE = 0xE1,
264    HEALING_APPLE = 0xE2,
265    INVALID_4 = 0xE3,
266    INVALID_5 = 0xE4,
267    INVALID_6 = 0xE5,
268    /// Flatzone
269    TOOL = 0xE6,
270    INVALID_7 = 0xE7,
271    INVALID_8 = 0xE8,
272    BIRDO = 0xE9,
273    ARWING_LASER = 0xEA,
274    GREAT_FOX_LASER = 0xEB,
275    BIRDO_EGG = 0xEC,
276
277    // ----------------------------- NO REAL ITEMS BEYOND THIS POINT ---------------------------- //
278    // this section is convenience so that "sub-items" (i.e. turnip types, missile types) can have
279    // the same static type and representation as all other items. It's a little gross, but I can't
280    // add data to the individual types, as old replay versions don't have turnip/missile types. Also,
281    // if you're working with raw game data, you might not have it so it is what it is.
282
283    // turnip faces
284    TURNIP_SMILEY = 1000,
285    TURNIP_BORED,
286    TURNIP_SLEEPY,
287    TURNIP_SHOCKED,
288    TURNIP_LAUGHING,
289    TURNIP_WINK,
290    TURNIP_DOT,
291    TURNIP_STITCH,
292
293    // missile types
294    HOMING_MISSILE,
295    SUPER_MISSILE,
296}
297
298impl Item {
299    /// Same as from_repr, except also resolves TurnipFace and MissileType into their respective
300    /// sub-items
301    pub fn resolve_subitem(&self, subitem: u8) -> Item {
302        match self {
303            Item::PEACH_TURNIP => match subitem {
304                0 => Item::TURNIP_SMILEY,
305                1 => Item::TURNIP_BORED,
306                2 => Item::TURNIP_SLEEPY,
307                3 => Item::TURNIP_SHOCKED,
308                4 => Item::TURNIP_LAUGHING,
309                5 => Item::TURNIP_WINK,
310                6 => Item::TURNIP_DOT,
311                7 => Item::TURNIP_STITCH,
312                _ => panic!("Invalid turnip type {subitem}. Expected value 0-7 inclusive"),
313            },
314            Item::SAMUS_MISSILE => match subitem {
315                0 => Item::HOMING_MISSILE,
316                1 => Item::SUPER_MISSILE,
317                _ => panic!("Invalid missile type {subitem}. Expected value 0 or 1"),
318            },
319
320            _ => *self,
321        }
322    }
323}
324
325#[derive(Debug, Clone, Copy, EnumString, IntoStaticStr, Display, FromRepr, PartialEq, Eq)]
326#[repr(u8)]
327pub enum TurnipFace {
328    // TODO verify this
329    SMILEY = 0,
330    BORED = 1,
331    SLEEPY = 2,
332    SHOCKED = 3,
333    LAUGHING = 4,
334    WINK = 5,
335    DOT = 6,
336    STITCH = 7,
337}
338
339#[derive(Debug, Clone, Copy, EnumString, IntoStaticStr, Display, FromRepr, PartialEq, Eq)]
340#[repr(u8)]
341pub enum MissileType {
342    HOMING = 0,
343    SUPER = 1,
344}
345
346// TODO maybe eventually finish this? Requires a lot of "what even is this" work in dolphin
347// lazy_static! {
348// /// Subset of items that contains only projectiles. Used to filter out things like falco's gun from counting as a
349// /// projectile for item stats
350// ///
351// pub static ref PROJECTILES: HashSet<u16> = HashSet::from(
352//     [Item::BOB_OMB as u16,
353//     Item::MR_SATURN as u16,
354//     Item::BEAM_SWORD as u16,
355//     Item::MARIO_FIRE as u16,
356//     Item::DR_MARIO_PILL as u16,
357//     Item::KIRBY_CUTTER_BEAM as u16,
358//     Item::KIRBY_HAMMER as u16,
359//     Item::FOX_LASER as u16,
360//     Item::FALCO_LASER as u16,
361//     Item::FOX_SHADOW as u16,
362//     Item::FALCO_SHADOW as u16,
363//     Item::LINK_BOMB as u16,
364//     Item::YOUNG_LINK_BOMB as u16,
365//     Item::LINK_BOOMERANG as u16,
366//     Item::YOUNG_LINK_BOOMERANG as u16,
367//     Item::LINK_ARROW_1 as u16,
368//     Item::YOUNG_LINK_FIRE_ARROW as u16,
369//     Item::NESS_PK_FIRE as u16,
370//     Item::NESS_PK_FLASH_1 as u16,
371//     Item::NESS_PK_FLASH_2 as u16,
372//     Item::NESS_PK_THUNDER_1 as u16,
373//     Item::NESS_PK_THUNDER_2 as u16,
374//     Item::NESS_PK_THUNDER_3 as u16,
375//     Item::NESS_PK_THUNDER_4 as u16,
376//     Item::NESS_PK_THUNDER_5 as u16,
377//     ]);
378// }