summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/party_menu.c388
1 files changed, 59 insertions, 329 deletions
diff --git a/src/party_menu.c b/src/party_menu.c
index 6154d5db5..ce6a5c4e3 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "constants/items.h"
+#include "constants/item_effects.h"
#include "constants/moves.h"
#include "constants/songs.h"
#include "constants/species.h"
@@ -4925,346 +4926,75 @@ void DoEvolutionStoneItemEffect(u8 taskId, u16 evolutionStoneItem, TaskFunc c)
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
+ u32 statusCure;
+
+#ifdef UBFIX
+ // Enforces that the item ID is within the bounds of gItemEffectTable.
+ // In the retail ROM, the otherwise situation will never arise.
+ // Nevertheless, GameFreak added this sanity check in FireRed.
+ if (!ITEM_HAS_EFFECT(item))
+ return ITEM_EFFECT_NONE;
#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;
- }
+ if ((itemEffect[0] & (ITEM0_DIRE_HIT | ITEM0_X_ATTACK)) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & ITEM3_GUARD_SPEC))
+ return ITEM_EFFECT_X_ITEM;
+ else if (itemEffect[0] & ITEM0_SACRED_ASH)
+ return ITEM_EFFECT_SACRED_ASH;
+ else if (itemEffect[3] & ITEM3_LEVEL_UP)
+ return ITEM_EFFECT_RAISE_LEVEL;
+
+ statusCure = itemEffect[3] & ITEM3_STATUS_ALL;
+ if (statusCure || (itemEffect[0] >> 7))
+ {
+ if (statusCure == ITEM3_SLEEP)
+ return ITEM_EFFECT_CURE_SLEEP;
+ else if (statusCure == ITEM3_POISON)
+ return ITEM_EFFECT_CURE_POISON;
+ else if (statusCure == ITEM3_BURN)
+ return ITEM_EFFECT_CURE_BURN;
+ else if (statusCure == ITEM3_FREEZE)
+ return ITEM_EFFECT_CURE_FREEZE;
+ else if (statusCure == ITEM3_PARALYSIS)
+ return ITEM_EFFECT_CURE_PARALYSIS;
+ else if (statusCure == ITEM3_CONFUSION)
+ return ITEM_EFFECT_CURE_CONFUSION;
+ else if (itemEffect[0] >> 7 && !statusCure)
+ return ITEM_EFFECT_CURE_INFATUATION;
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;
- }
+ return ITEM_EFFECT_CURE_ALL_STATUS;
+ }
+
+ if (itemEffect[4] & (ITEM4_REVIVE | ITEM4_HEAL_HP))
+ return ITEM_EFFECT_HEAL_HP;
+ else if (itemEffect[4] & ITEM4_EV_ATK)
+ return ITEM_EFFECT_ATK_EV;
+ else if (itemEffect[4] & ITEM4_EV_HP)
+ return ITEM_EFFECT_HP_EV;
+ else if (itemEffect[5] & ITEM5_EV_SPATK)
+ return ITEM_EFFECT_SPATK_EV;
+ else if (itemEffect[5] & ITEM5_EV_SPDEF)
+ return ITEM_EFFECT_SPDEF_EV;
+ else if (itemEffect[5] & ITEM5_EV_SPEED)
+ return ITEM_EFFECT_SPEED_EV;
+ else if (itemEffect[5] & ITEM5_EV_DEF)
+ return ITEM_EFFECT_DEF_EV;
+ else if (itemEffect[4] & ITEM4_EVO_STONE)
+ return ITEM_EFFECT_EVO_STONE;
+ else if (itemEffect[4] & ITEM4_PP_UP)
+ return ITEM_EFFECT_PP_UP;
+ else if (itemEffect[5] & ITEM5_PP_MAX)
+ return ITEM_EFFECT_PP_MAX;
+ else if (itemEffect[4] & (ITEM4_HEAL_PP | ITEM4_HEAL_PP_ONE))
+ return ITEM_EFFECT_HEAL_PP;
else
- {
- return 22;
- }
-#ifdef NONMATCHING
-#undef itemEffect0
-#undef itemEffect3
-#undef mask
-#endif
+ return ITEM_EFFECT_NONE;
}
-#if 0
-NAKED
-u8 GetItemEffectType(u16 item)
-{
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0xAF\n\
- bne _08070E5C\n\
- ldr r4, _08070E58 @ =gSaveBlock1 + 0x3676\n\
- b _08070E66\n\
- .align 2, 0\n\
-_08070E58: .4byte gSaveBlock1 + 0x3676\n\
-_08070E5C:\n\
- ldr r1, _08070E8C @ =gItemEffectTable\n\
- subs r0, 0xD\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldr r4, [r0]\n\
-_08070E66:\n\
- ldrb r1, [r4]\n\
- movs r5, 0x3F\n\
- adds r0, r5, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08070E88\n\
- ldrb r0, [r4, 0x1]\n\
- cmp r0, 0\n\
- bne _08070E88\n\
- ldrb r0, [r4, 0x2]\n\
- cmp r0, 0\n\
- bne _08070E88\n\
- ldrb r3, [r4, 0x3]\n\
- movs r0, 0x80\n\
- ands r0, r3\n\
- cmp r0, 0\n\
- beq _08070E90\n\
-_08070E88:\n\
- movs r0, 0\n\
- b _08070F8A\n\
- .align 2, 0\n\
-_08070E8C: .4byte gItemEffectTable\n\
-_08070E90:\n\
- movs r2, 0x40\n\
- adds r0, r2, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08070E9E\n\
- movs r0, 0xA\n\
- b _08070F8A\n\
-_08070E9E:\n\
- adds r0, r2, 0\n\
- ands r0, r3\n\
- cmp r0, 0\n\
- beq _08070EAA\n\
- movs r0, 0x1\n\
- b _08070F8A\n\
-_08070EAA:\n\
- adds r2, r5, 0\n\
- ands r2, r3\n\
- cmp r2, 0\n\
- bne _08070EB8\n\
- lsrs r0, r1, 7\n\
- cmp r0, 0\n\
- beq _08070EFA\n\
-_08070EB8:\n\
- cmp r2, 0x20\n\
- bne _08070EC0\n\
- movs r0, 0x4\n\
- b _08070F8A\n\
-_08070EC0:\n\
- cmp r2, 0x10\n\
- bne _08070EC8\n\
- movs r0, 0x3\n\
- b _08070F8A\n\
-_08070EC8:\n\
- cmp r2, 0x8\n\
- bne _08070ED0\n\
- movs r0, 0x5\n\
- b _08070F8A\n\
-_08070ED0:\n\
- cmp r2, 0x4\n\
- bne _08070ED8\n\
- movs r0, 0x6\n\
- b _08070F8A\n\
-_08070ED8:\n\
- cmp r2, 0x2\n\
- bne _08070EE0\n\
- movs r0, 0x7\n\
- b _08070F8A\n\
-_08070EE0:\n\
- cmp r2, 0x1\n\
- bne _08070EE8\n\
- movs r0, 0x8\n\
- b _08070F8A\n\
-_08070EE8:\n\
- lsrs r0, r1, 7\n\
- cmp r0, 0\n\
- beq _08070EF6\n\
- cmp r2, 0\n\
- bne _08070EF6\n\
- movs r0, 0x9\n\
- b _08070F8A\n\
-_08070EF6:\n\
- movs r0, 0xB\n\
- b _08070F8A\n\
-_08070EFA:\n\
- ldrb r1, [r4, 0x4]\n\
- movs r0, 0x44\n\
- ands r0, r1\n\
- adds r2, r1, 0\n\
- cmp r0, 0\n\
- beq _08070F0A\n\
- movs r0, 0x2\n\
- b _08070F8A\n\
-_08070F0A:\n\
- movs r5, 0x2\n\
- adds r0, r5, 0\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _08070F18\n\
- movs r0, 0xC\n\
- b _08070F8A\n\
-_08070F18:\n\
- movs r3, 0x1\n\
- adds r0, r3, 0\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _08070F26\n\
- movs r0, 0xD\n\
- b _08070F8A\n\
-_08070F26:\n\
- ldrb r1, [r4, 0x5]\n\
- movs r0, 0x8\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08070F34\n\
- movs r0, 0xE\n\
- b _08070F8A\n\
-_08070F34:\n\
- movs r0, 0x4\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08070F40\n\
- movs r0, 0xF\n\
- b _08070F8A\n\
-_08070F40:\n\
- adds r0, r5, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08070F4C\n\
- movs r0, 0x10\n\
- b _08070F8A\n\
-_08070F4C:\n\
- adds r0, r3, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08070F58\n\
- movs r0, 0x11\n\
- b _08070F8A\n\
-_08070F58:\n\
- movs r0, 0x80\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _08070F64\n\
- movs r0, 0x12\n\
- b _08070F8A\n\
-_08070F64:\n\
- movs r0, 0x20\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _08070F70\n\
- movs r0, 0x13\n\
- b _08070F8A\n\
-_08070F70:\n\
- movs r0, 0x10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08070F7C\n\
- movs r0, 0x14\n\
- b _08070F8A\n\
-_08070F7C:\n\
- movs r0, 0x18\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- bne _08070F88\n\
- movs r0, 0x16\n\
- b _08070F8A\n\
-_08070F88:\n\
- movs r0, 0x15\n\
-_08070F8A:\n\
- pop {r4,r5}\n\
- pop {r1}\n\
- bx r1\n\
- .syntax divided\n");
-}
-#endif
// Maybe this goes in start_menu.c
#if !DEBUG