summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pokemon/pokemon_item_effect.c181
1 files changed, 177 insertions, 4 deletions
diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c
index 34a61a489..d25e96f9d 100644
--- a/src/pokemon/pokemon_item_effect.c
+++ b/src/pokemon/pokemon_item_effect.c
@@ -6,6 +6,7 @@
#include "ewram.h"
#include "item.h"
#include "main.h"
+#include "overworld.h"
#include "pokemon.h"
#include "pokemon_item_effect.h"
#include "rom_8077ABC.h"
@@ -40,18 +41,20 @@ bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 b, u8 c, u8 d)
}
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)
{
int r10;
- int r5;
+ u32 sp0;
+ u32 sp4;
u8 sp18;
int sp1C = 1;
const u8 *sp20;
u8 sp24 = 6;
u32 sp28;
- int sp2C = 0;
+ s8 sp2C = 0;
u8 sp30;
int sp34 = 4;
u16 item;
@@ -229,7 +232,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
r10 = sp20[sp18] & 0x20;
if (r10 != 0)
{
- u32 sp0;
u16 r4;
r10 &= 0xDF;
@@ -256,7 +258,6 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
{
u16 r5;
u32 r4;
- u32 sp0;
u32 r1;
switch (sp28)
@@ -456,6 +457,178 @@ bool8 sub_803E1B0(struct Pokemon *pkmn, u16 b, u8 c, u8 d, u8 e)
//_0803EE0A
}
break;
+ case 5:
+ //_0803EE1E
+ r10 = sp20[sp18];
+ sp28 = 0;
+ while (r10 != 0)
+ {
+ //_0803EE32
+ if (r10 & 1)
+ {
+ u16 r5;
+ u32 r4;
+ u32 r1;
+
+ switch (sp28)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ //_0803EE74
+ r5 = GetMonEVCount(pkmn);
+ if (r5 >= 510)
+ return 1;
+ r1 = GetMonData(pkmn, gUnknown_082082F2[sp28], NULL);
+ sp0 = r1;
+ if (r1 < 100)
+ {
+ r1 += sp20[sp24];
+ if (r1 > 100)
+ r4 = 100 - r1;
+ else
+ r4 = sp20[sp24];
+ //_0803EEC6
+ if (r5 + r4 > 510)
+ r4 = (r4 + 510) - (r5 + r4);
+ sp0 += r4;
+ SetMonData(pkmn, gUnknown_082082F2[sp28], &sp0);
+ CalculateMonStats(pkmn);
+ sp1C = 0;
+ sp24++;
+ }
+ break;
+ case 4:
+ //_0803EEF8
+ 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);
+ sp0 = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
+ sp0 &= gUnknown_0820823C[d];
+ sp0 += gUnknown_08208240[d] * 3;
+
+ SetMonData(pkmn, MON_DATA_PP_BONUSES, &sp0);
+ sp0 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + d, NULL), sp0, d) - r4;
+ sp0 += GetMonData(pkmn, MON_DATA_PP1 + b, NULL);
+ SetMonData(pkmn, MON_DATA_PP1 + b, &sp0);
+ sp1C = 0;
+ }
+ break;
+ case 5:
+ //_0803EFCC
+ if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && sp1C == 0 && sp2C == 0)
+ {
+ //_0803EFEC
+ sp2C = sp20[sp24];
+ sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
+ if (sp2C > 0 && sp30 == 0x1B)
+ {
+ sp4 = 0x96 * sp2C / 100;
+ }
+ //to _0803F0D0 hmm...
+ else
+ {
+ sp4 += sp2C;
+ }
+ //_0803F0DC (tail merged)
+
+ if (sp2C > 0)
+ {
+ if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
+ sp4++;
+ //_0803F0F4
+ if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ sp4++;
+ }
+ //_0803F112
+ if (sp4 < 0)
+ sp4 = 0;
+ if (sp4 > 255)
+ sp4 = 255;
+ SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4);
+ }
+ //to _0803F130 hmm...
+ sp24++;
+ break;
+ case 6:
+ //_0803F026
+ if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200
+ && sp1C == 0 && sp2C == 0)
+ {
+ sp2C = sp20[sp24];
+ sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
+ if (sp2C > 0 && sp30 == 0x1B)
+ {
+ //to _0803F0BE
+ sp4 = 0x96 * sp2C / 100;
+ }
+ else
+ {
+ sp4 += sp2C;
+ }
+ //_0803F0DC (tail merged)
+
+ if (sp2C > 0)
+ {
+ if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
+ sp4++;
+ //_0803F0F4
+ if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ sp4++;
+ }
+ //_0803F112
+ if (sp4 < 0)
+ sp4 = 0;
+ if (sp4 > 255)
+ sp4 = 255;
+ SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4);
+ }
+ //to _0803F130 hmm...
+ sp24++;
+ break;
+ case 7:
+ //_0803F07C
+ if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && sp1C == 0 && sp2C == 0)
+ {
+ sp2C = sp20[sp24];
+ sp4 = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL);
+ if (sp2C > 0 && sp30 == 0x1B)
+ {
+ //_0803F0BE
+ sp4 = 0x96 * sp2C / 100;
+ }
+ //_0803F0D0
+ else
+ {
+ sp4 += sp2C;
+ }
+ //_0803F0DC
+
+ if (sp2C > 0)
+ {
+ if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11)
+ sp4++;
+ //_0803F0F4
+ if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ sp4++;
+ }
+ //_0803F112
+ if (sp4 < 0)
+ sp4 = 0;
+ if (sp4 > 255)
+ sp4 = 255;
+ SetMonData(pkmn, MON_DATA_FRIENDSHIP, &sp4);
+ }
+ //to _0803F130
+ sp24++;
+ break;
+ }
+ }
+ }
+ break;
}
}
//_0803F15A