u8 GetItemEffectType(u16 item) { const u8 *itemEffect; #ifndef NONMATCHING register u8 itemEffect0 asm("r1"); register u8 itemEffect3 asm("r3"); register u32 itemEffect0_r0 asm("r0"); // u32 to prevent shifting when transferring itemEffect0 to this u8 mask; #else #define itemEffect0 itemEffect[0] #define itemEffect3 itemEffect[3] #define mask 0x3F #endif // Read the item's effect properties. if (item == ITEM_ENIGMA_BERRY) { itemEffect = gSaveBlock1.enigmaBerry.itemEffect; } else { itemEffect = gItemEffectTable[item - ITEM_POTION]; } #ifndef NONMATCHING itemEffect0 = itemEffect[0]; mask = 0x3F; #endif if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2]) { return 0; } #ifndef NONMATCHING itemEffect3 = itemEffect[3]; #endif if (itemEffect3 & 0x80) { return 0; } else if (itemEffect0 & 0x40) { return 10; } else if (itemEffect3 & 0x40) { return 1; } else if ((itemEffect3 & mask) || (itemEffect0 >> 7)) { if ((itemEffect3 & mask) == 0x20) { return 4; } else if ((itemEffect3 & mask) == 0x10) { return 3; } else if ((itemEffect3 & mask) == 0x8) { return 5; } else if ((itemEffect3 & mask) == 0x4) { return 6; } else if ((itemEffect3 & mask) == 0x2) { return 7; } else if ((itemEffect3 & mask) == 0x1) { return 8; } // alternate fakematching // itemEffect0_r0 = itemEffect0 >> 7; // asm(""); // increase live length for greg // if ((itemEffect0_r0 != 0) && (itemEffect3 & mask) == 0) #ifndef NONMATCHING else if (((itemEffect0_r0 = itemEffect0 >> 7) != 0) && (itemEffect3 & mask) == 0) #else else if (((itemEffect[0] >> 7) != 0) && (itemEffect[3] & 0x3F) == 0) #endif { return 9; } else { return 11; } } else if (itemEffect[4] & 0x44) { return 2; } else if (itemEffect[4] & 0x2) { return 12; } else if (itemEffect[4] & 0x1) { return 13; } else if (itemEffect[5] & 0x8) { return 14; } else if (itemEffect[5] & 0x4) { return 15; } else if (itemEffect[5] & 0x2) { return 16; } else if (itemEffect[5] & 0x1) { return 17; } else if (itemEffect[4] & 0x80) { return 18; } else if (itemEffect[4] & 0x20) { return 19; } else if (itemEffect[5] & 0x10) { return 20; } else if (itemEffect[4] & 0x18) { return 21; } else { return 22; } #ifdef NONMATCHING #undef itemEffect0 #undef itemEffect3 #undef mask #endif }