mirror of
https://github.com/pret/pokeruby.git
synced 2026-04-26 08:17:48 -05:00
Sync GetItemEffectType from Emerald
This commit is contained in:
parent
a1ad14f4af
commit
10f14b2a58
92
include/constants/item_effects.h
Normal file
92
include/constants/item_effects.h
Normal 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
|
||||
382
src/party_menu.c
382
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 ((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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user