summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcamthesaxman <cameronghall@cox.net>2018-01-15 15:29:27 -0600
committercamthesaxman <cameronghall@cox.net>2018-01-15 15:29:27 -0600
commitc8bd765540bc38c2273a70caf99051727c467d21 (patch)
tree4efd24241065f84b6d477a1a4c8322395341f8a9
parentfd3ab3fcc69708d082f3791052823ec333165b36 (diff)
get sub_803E1B0 a lot closer
-rw-r--r--src/pokemon/pokemon_item_effect.c54
1 files changed, 25 insertions, 29 deletions
diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c
index b4b7206dc..92bf01171 100644
--- a/src/pokemon/pokemon_item_effect.c
+++ b/src/pokemon/pokemon_item_effect.c
@@ -33,6 +33,10 @@ const u8 gUnknown_082082F2[] =
MON_DATA_SPATK_EV
};
+extern u8 gUnknown_08208238[];
+extern u8 gUnknown_0820823C[];
+extern u8 gUnknown_08208240[];
+
bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e);
bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 b, u8 c, u8 d)
@@ -40,10 +44,6 @@ bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 b, u8 c, u8 d)
return sub_803E1B0(pkmn, b, c, d, 0);
}
-extern u8 gUnknown_08208238[];
-extern u8 gUnknown_0820823C[];
-extern u8 gUnknown_08208240[];
-
bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
{
u32 sp0;
@@ -58,6 +58,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
u8 sp34 = 4;
u16 item;
u8 r10;
+ u32 r4;
item = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL);
if (item == 0xAF)
@@ -131,9 +132,9 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
sp1C = 0;
}
//_0803E3F0
- if ((sp20[sp18] & 0x30) && !(gBattleMons[gActiveBank].status2 & 0x4000000))
+ if ((sp20[sp18] & 0x30) && !(gBattleMons[gActiveBank].status2 & 0x100000))
{
- gBattleMons[gActiveBank].status2 |= 0x4000000;
+ gBattleMons[gActiveBank].status2 |= 0x100000;
sp1C = 0;
}
//_0803E41E
@@ -235,8 +236,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
r10 &= ~0x20;
- sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) << (d * 2);
- //r4 = GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL);
+ sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) >> (d * 2);
sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d);
if (sp0 <= 2 && sp28 > 4)
{
@@ -255,8 +255,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
{
if (r10 & 1)
{
- s32 r5;
- u32 r4;
+ s32 r5; // TODO: the ev count is a separate variable
u32 r1;
switch (sp28)
@@ -271,14 +270,13 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
sp0 = r1;
if (r1 < 100)
{
- r1 += sp20[sp24];
- if (r1 > 100)
- r4 = 100 - r1;
+ if (r1 + sp20[sp24] > 100)
+ r4 = 100 - (r1 + sp20[sp24]) + sp20[sp24];
else
r4 = sp20[sp24];
- //_0803E8F6
- if (r5 + r4 > 510)
- r4 = (r4 - 510) - (r5 + r4);
+ r1 = r5 + r4;
+ if (r1 > 510)
+ r4 += 510 - r1;
sp0 += r4;
SetMonData(pkmn, gUnknown_082082F2[sp28], &sp0);
CalculateMonStats(pkmn);
@@ -336,7 +334,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL);
break;
case 0xFE:
- sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) * 2;
+ sp0 = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2;
if (sp0 == 0)
sp0 = 1;
break;
@@ -472,7 +470,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
if (r10 & 1)
{
u16 r5;
- u32 r4;
u32 r1;
switch (sp28)
@@ -489,14 +486,13 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
sp0 = r1;
if (r1 < 100)
{
- r1 += sp20[sp24];
- if (r1 > 100)
- r4 = 100 - r1;
+ if (r1 + sp20[sp24] > 100)
+ r4 = 100 - (r1 + sp20[sp24]) + sp20[sp24];
else
r4 = sp20[sp24];
- //_0803EEC6
- if (r5 + r4 > 510)
- r4 = (r4 + 510) - (r5 + r4);
+ r1 = r5 + r4;
+ if (r1 > 510)
+ r4 += 510 - r1;
sp0 += r4;
SetMonData(pkmn, gUnknown_082082F2[sp28 + 2], &sp0);
CalculateMonStats(pkmn);
@@ -506,11 +502,11 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
break;
case 4:
//_0803EEF8
- sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) << (d * 2);
+ sp0 = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[d]) >> (d * 2);
if (sp0 < 3)
{
//_0803EF18
- u8 r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d);
+ r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), d);
sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
sp0 &= gUnknown_0820823C[d];
sp0 += gUnknown_08208240[d] * 3;
@@ -531,7 +527,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
if (sp2C > 0 && sp30 == 0x1B)
{
- sp4 += 0x96 * sp2C / 100;
+ sp4 += 150 * sp2C / 100;
}
//to _0803F0D0 hmm...
else
@@ -568,7 +564,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
if (sp2C > 0 && sp30 == 0x1B)
{
//to _0803F0BE
- sp4 = 0x96 * sp2C / 100;
+ sp4 = 150 * sp2C / 100;
}
else
{
@@ -603,7 +599,7 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
if (sp2C > 0 && sp30 == 0x1B)
{
//_0803F0BE
- sp4 = 0x96 * sp2C / 100;
+ sp4 = 150 * sp2C / 100;
}
//_0803F0D0
else