Sync GetItemEffectType from Emerald

This commit is contained in:
PikalaxALT 2021-06-28 11:04:11 -04:00
parent a1ad14f4af
commit 10f14b2a58
2 changed files with 148 additions and 326 deletions

View File

@ -0,0 +1,92 @@
#ifndef POKERUBY_CONSTANTS_ITEM_EFFECTS_H
#define POKERUBY_CONSTANTS_ITEM_EFFECTS_H
// field 0 masks
#define ITEM0_X_ATTACK 0x0F
#define ITEM0_DIRE_HIT 0x30 // Works the same way as the move Focus Energy.
#define ITEM0_SACRED_ASH 0x40
#define ITEM0_INFATUATION 0x80
// field 1 masks
#define ITEM1_X_SPEED 0x0F
#define ITEM1_X_DEFEND 0xF0
// field 2 masks
#define ITEM2_X_SPATK 0x0F
#define ITEM2_X_ACCURACY 0xF0
// field 3 masks
#define ITEM3_CONFUSION 0x1
#define ITEM3_PARALYSIS 0x2
#define ITEM3_FREEZE 0x4
#define ITEM3_BURN 0x8
#define ITEM3_POISON 0x10
#define ITEM3_SLEEP 0x20
#define ITEM3_LEVEL_UP 0x40
#define ITEM3_GUARD_SPEC 0x80 // Works the same way as the move Mist.
#define ITEM3_STATUS_ALL (ITEM3_CONFUSION | ITEM3_PARALYSIS | ITEM3_FREEZE | ITEM3_BURN | ITEM3_POISON | ITEM3_SLEEP)
// field 4 masks
#define ITEM4_EV_HP 0x1
#define ITEM4_EV_ATK 0x2
#define ITEM4_HEAL_HP 0x4
#define ITEM4_HEAL_PP 0x8
#define ITEM4_HEAL_PP_ONE 0x10
#define ITEM4_PP_UP 0x20
#define ITEM4_REVIVE 0x40
#define ITEM4_EVO_STONE 0x80
// field 5 masks
#define ITEM5_EV_DEF 0x1
#define ITEM5_EV_SPEED 0x2
#define ITEM5_EV_SPDEF 0x4
#define ITEM5_EV_SPATK 0x8
#define ITEM5_PP_MAX 0x10
#define ITEM5_FRIENDSHIP_LOW 0x20
#define ITEM5_FRIENDSHIP_MID 0x40
#define ITEM5_FRIENDSHIP_HIGH 0x80
#define ITEM5_FRIENDSHIP_ALL (ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID | ITEM5_FRIENDSHIP_HIGH)
// fields 6 and onwards are item-specific arguments
#define ITEM_EFFECT_ARG_START 6
// Special HP recovery amounts for ITEM4_HEAL_HP
#define ITEM6_HEAL_HP_FULL ((u8) -1)
#define ITEM6_HEAL_HP_HALF ((u8) -2)
#define ITEM6_HEAL_HP_LVL_UP ((u8) -3)
// Special PP recovery amounts for ITEM4_HEAL_PP
#define ITEM6_HEAL_PP_FULL 0x7F
// Amount of EV modified by ITEM4_EV_HP, ITEM4_EV_ATK, ITEM5_EV_DEF, ITEM5_EV_SPEED, ITEM5_EV_SPDEF and ITEM5_EV_SPATK
#define ITEM6_ADD_EV 10
#define ITEM6_SUBTRACT_EV -10
// Used for GetItemEffectType.
#define ITEM_EFFECT_X_ITEM 0
#define ITEM_EFFECT_RAISE_LEVEL 1
#define ITEM_EFFECT_HEAL_HP 2
#define ITEM_EFFECT_CURE_POISON 3
#define ITEM_EFFECT_CURE_SLEEP 4
#define ITEM_EFFECT_CURE_BURN 5
#define ITEM_EFFECT_CURE_FREEZE 6
#define ITEM_EFFECT_CURE_PARALYSIS 7
#define ITEM_EFFECT_CURE_CONFUSION 8
#define ITEM_EFFECT_CURE_INFATUATION 9
#define ITEM_EFFECT_SACRED_ASH 10
#define ITEM_EFFECT_CURE_ALL_STATUS 11
#define ITEM_EFFECT_ATK_EV 12
#define ITEM_EFFECT_HP_EV 13
#define ITEM_EFFECT_SPATK_EV 14
#define ITEM_EFFECT_SPDEF_EV 15
#define ITEM_EFFECT_SPEED_EV 16
#define ITEM_EFFECT_DEF_EV 17
#define ITEM_EFFECT_EVO_STONE 18
#define ITEM_EFFECT_PP_UP 19
#define ITEM_EFFECT_PP_MAX 20
#define ITEM_EFFECT_HEAL_PP 21
#define ITEM_EFFECT_NONE 22
#endif // POKERUBY_CONSTANTS_ITEM_EFFECTS_H

View File

@ -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 ((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;
if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2])
statusCure = itemEffect[3] & ITEM3_STATUS_ALL;
if (statusCure || (itemEffect[0] >> 7))
{
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 (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