summaryrefslogtreecommitdiff
path: root/src/pokemon
diff options
context:
space:
mode:
Diffstat (limited to 'src/pokemon')
-rw-r--r--src/pokemon/pokemon_1.c359
-rw-r--r--src/pokemon/pokemon_menu.c151
2 files changed, 61 insertions, 449 deletions
diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c
index 6f187ad71..41579fa28 100644
--- a/src/pokemon/pokemon_1.c
+++ b/src/pokemon/pokemon_1.c
@@ -525,324 +525,49 @@ void CalculateMonStats(struct Pokemon *mon)
}
#if DEBUG
-__attribute__((naked))
-void debug_sub_803F55C()
+void debug_sub_803F55C(struct Pokemon *mon)
{
- asm(
- " push {r4, r5, r6, r7, lr}\n"
- " mov r7, sl\n"
- " mov r6, r9\n"
- " mov r5, r8\n"
- " push {r5, r6, r7}\n"
- " add sp, sp, #0xffffffc4\n"
- " add r5, r0, #0\n"
- " mov r1, #0x39\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " str r0, [sp, #0x1c]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x27\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " add r7, r0, #0\n"
- " add r0, r5, #0\n"
- " mov r1, #0x1a\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " add r4, r0, #0\n"
- " add r0, r5, #0\n"
- " mov r1, #0x28\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " mov r9, r0\n"
- " add r0, r5, #0\n"
- " mov r1, #0x1b\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " mov r8, r0\n"
- " add r0, r5, #0\n"
- " mov r1, #0x29\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " str r0, [sp, #0x20]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x1c\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " mov sl, r0\n"
- " add r0, r5, #0\n"
- " mov r1, #0x2a\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " str r0, [sp, #0x24]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x1d\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " str r0, [sp, #0x28]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x2b\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " str r0, [sp, #0x2c]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x1e\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " str r0, [sp, #0x30]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x2c\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " str r0, [sp, #0x34]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x1f\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " str r0, [sp, #0x38]\n"
- " add r0, r5, #0\n"
- " mov r1, #0xb\n"
- " mov r2, #0x0\n"
- " bl GetMonData\n"
- " lsl r0, r0, #0x10\n"
- " lsr r6, r0, #0x10\n"
- " add r0, r5, #0\n"
- " bl GetLevelFromMonExp\n"
- " lsl r0, r0, #0x18\n"
- " lsr r0, r0, #0x18\n"
- " str r0, [sp]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x38\n"
- " mov r2, sp\n"
- " bl SetMonData\n"
- " ldr r0, ._71\n"
- " cmp r6, r0\n"
- " bne ._69 @cond_branch\n"
- " mov r0, #0x1\n"
- " str r0, [sp, #0x4]\n"
- " lsl r7, r6, #0x3\n"
- " b ._70\n"
- "._72:\n"
- " .align 2, 0\n"
- "._71:\n"
- " .word 0x12f\n"
- "._69:\n"
- " ldr r1, ._80\n"
- " lsl r2, r6, #0x3\n"
- " sub r0, r2, r6\n"
- " lsl r0, r0, #0x2\n"
- " add r0, r0, r1\n"
- " ldrb r0, [r0]\n"
- " lsl r0, r0, #0x1\n"
- " add r1, r0, r7\n"
- " add r0, r4, #0\n"
- " add r7, r2, #0\n"
- " cmp r0, #0\n"
- " bge ._73 @cond_branch\n"
- " add r0, r0, #0x3\n"
- "._73:\n"
- " asr r0, r0, #0x2\n"
- " add r0, r1, r0\n"
- " ldr r4, [sp]\n"
- " mul r0, r0, r4\n"
- " mov r1, #0x64\n"
- " bl __divsi3\n"
- " add r0, r0, r4\n"
- " add r0, r0, #0xa\n"
- " str r0, [sp, #0x4]\n"
- "._70:\n"
- " add r2, sp, #0x4\n"
- " add r0, r5, #0\n"
- " mov r1, #0x3a\n"
- " bl SetMonData\n"
- " ldr r1, ._80\n"
- " sub r0, r7, r6\n"
- " lsl r0, r0, #0x2\n"
- " add r6, r0, r1\n"
- " ldrb r0, [r6, #0x1]\n"
- " lsl r0, r0, #0x1\n"
- " mov r2, r9\n"
- " add r1, r0, r2\n"
- " mov r0, r8\n"
- " cmp r0, #0\n"
- " bge ._74 @cond_branch\n"
- " add r0, r0, #0x3\n"
- "._74:\n"
- " asr r0, r0, #0x2\n"
- " add r0, r1, r0\n"
- " ldr r1, [sp]\n"
- " mul r0, r0, r1\n"
- " mov r1, #0x64\n"
- " bl __divsi3\n"
- " add r0, r0, #0x5\n"
- " str r0, [sp, #0x8]\n"
- " add r0, r5, #0\n"
- " bl GetNature\n"
- " lsl r0, r0, #0x18\n"
- " lsr r0, r0, #0x18\n"
- " add r4, sp, #0x8\n"
- " ldrh r1, [r4]\n"
- " mov r2, #0x1\n"
- " bl nature_stat_mod\n"
- " lsl r0, r0, #0x10\n"
- " lsr r0, r0, #0x10\n"
- " str r0, [sp, #0x8]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x3b\n"
- " add r2, r4, #0\n"
- " bl SetMonData\n"
- " ldrb r0, [r6, #0x2]\n"
- " lsl r0, r0, #0x1\n"
- " ldr r2, [sp, #0x20]\n"
- " add r1, r0, r2\n"
- " mov r0, sl\n"
- " cmp r0, #0\n"
- " bge ._75 @cond_branch\n"
- " add r0, r0, #0x3\n"
- "._75:\n"
- " asr r0, r0, #0x2\n"
- " add r0, r1, r0\n"
- " ldr r1, [sp]\n"
- " mul r0, r0, r1\n"
- " mov r1, #0x64\n"
- " bl __divsi3\n"
- " add r0, r0, #0x5\n"
- " str r0, [sp, #0xc]\n"
- " add r0, r5, #0\n"
- " bl GetNature\n"
- " lsl r0, r0, #0x18\n"
- " lsr r0, r0, #0x18\n"
- " add r4, sp, #0xc\n"
- " ldrh r1, [r4]\n"
- " mov r2, #0x2\n"
- " bl nature_stat_mod\n"
- " lsl r0, r0, #0x10\n"
- " lsr r0, r0, #0x10\n"
- " str r0, [sp, #0xc]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x3c\n"
- " add r2, r4, #0\n"
- " bl SetMonData\n"
- " ldrb r0, [r6, #0x3]\n"
- " lsl r0, r0, #0x1\n"
- " ldr r2, [sp, #0x24]\n"
- " add r1, r0, r2\n"
- " ldr r0, [sp, #0x28]\n"
- " cmp r0, #0\n"
- " bge ._76 @cond_branch\n"
- " add r0, r0, #0x3\n"
- "._76:\n"
- " asr r0, r0, #0x2\n"
- " add r0, r1, r0\n"
- " ldr r1, [sp]\n"
- " mul r0, r0, r1\n"
- " mov r1, #0x64\n"
- " bl __divsi3\n"
- " add r0, r0, #0x5\n"
- " str r0, [sp, #0x10]\n"
- " add r0, r5, #0\n"
- " bl GetNature\n"
- " lsl r0, r0, #0x18\n"
- " lsr r0, r0, #0x18\n"
- " add r4, sp, #0x10\n"
- " ldrh r1, [r4]\n"
- " mov r2, #0x3\n"
- " bl nature_stat_mod\n"
- " lsl r0, r0, #0x10\n"
- " lsr r0, r0, #0x10\n"
- " str r0, [sp, #0x10]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x3d\n"
- " add r2, r4, #0\n"
- " bl SetMonData\n"
- " ldrb r0, [r6, #0x4]\n"
- " lsl r0, r0, #0x1\n"
- " ldr r2, [sp, #0x2c]\n"
- " add r1, r0, r2\n"
- " ldr r0, [sp, #0x30]\n"
- " cmp r0, #0\n"
- " bge ._77 @cond_branch\n"
- " add r0, r0, #0x3\n"
- "._77:\n"
- " asr r0, r0, #0x2\n"
- " add r0, r1, r0\n"
- " ldr r1, [sp]\n"
- " mul r0, r0, r1\n"
- " mov r1, #0x64\n"
- " bl __divsi3\n"
- " add r0, r0, #0x5\n"
- " str r0, [sp, #0x14]\n"
- " add r0, r5, #0\n"
- " bl GetNature\n"
- " lsl r0, r0, #0x18\n"
- " lsr r0, r0, #0x18\n"
- " add r4, sp, #0x14\n"
- " ldrh r1, [r4]\n"
- " mov r2, #0x4\n"
- " bl nature_stat_mod\n"
- " lsl r0, r0, #0x10\n"
- " lsr r0, r0, #0x10\n"
- " str r0, [sp, #0x14]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x3e\n"
- " add r2, r4, #0\n"
- " bl SetMonData\n"
- " ldrb r0, [r6, #0x5]\n"
- " lsl r0, r0, #0x1\n"
- " ldr r1, [sp, #0x34]\n"
- " add r2, r0, r1\n"
- " ldr r0, [sp, #0x38]\n"
- " cmp r0, #0\n"
- " bge ._78 @cond_branch\n"
- " add r0, r0, #0x3\n"
- "._78:\n"
- " asr r0, r0, #0x2\n"
- " add r0, r2, r0\n"
- " ldr r1, [sp]\n"
- " mul r0, r0, r1\n"
- " mov r1, #0x64\n"
- " bl __divsi3\n"
- " add r0, r0, #0x5\n"
- " str r0, [sp, #0x18]\n"
- " add r0, r5, #0\n"
- " bl GetNature\n"
- " lsl r0, r0, #0x18\n"
- " lsr r0, r0, #0x18\n"
- " add r4, sp, #0x18\n"
- " ldrh r1, [r4]\n"
- " mov r2, #0x5\n"
- " bl nature_stat_mod\n"
- " lsl r0, r0, #0x10\n"
- " lsr r0, r0, #0x10\n"
- " str r0, [sp, #0x18]\n"
- " add r0, r5, #0\n"
- " mov r1, #0x3f\n"
- " add r2, r4, #0\n"
- " bl SetMonData\n"
- " ldr r1, [sp, #0x4]\n"
- " ldr r0, [sp, #0x1c]\n"
- " cmp r1, r0\n"
- " bge ._79 @cond_branch\n"
- " str r1, [sp, #0x1c]\n"
- "._79:\n"
- " add r2, sp, #0x1c\n"
- " add r0, r5, #0\n"
- " mov r1, #0x39\n"
- " bl SetMonData\n"
- " add sp, sp, #0x3c\n"
- " pop {r3, r4, r5}\n"
- " mov r8, r3\n"
- " mov r9, r4\n"
- " mov sl, r5\n"
- " pop {r4, r5, r6, r7}\n"
- " pop {r0}\n"
- " bx r0\n"
- "._81:\n"
- " .align 2, 0\n"
- "._80:\n"
- " .word gBaseStats\n"
- "\n"
- );
+ s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL);
+ s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL);
+ s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL);
+ s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL);
+ s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL);
+ s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL);
+ s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL);
+ s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL);
+ s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL);
+ s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL);
+ s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL);
+ s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL);
+ s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL);
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ s32 level = GetLevelFromMonExp(mon);
+ s32 newMaxHP;
+
+ SetMonData(mon, MON_DATA_LEVEL, &level);
+
+ if (species == SPECIES_SHEDINJA)
+ {
+ newMaxHP = 1;
+ }
+ else
+ {
+ s32 n = 2 * gBaseStats[species].baseHP + hpIV;
+ newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10;
+ }
+
+ SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP);
+
+ CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK)
+ CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF)
+ CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED)
+ CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK)
+ CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF)
+
+ if (newMaxHP < currentHP)
+ currentHP = newMaxHP;
+
+ SetMonData(mon, MON_DATA_HP, &currentHP);
}
#endif
diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c
index 8e1bd1671..532340ce4 100644
--- a/src/pokemon/pokemon_menu.c
+++ b/src/pokemon/pokemon_menu.c
@@ -31,6 +31,7 @@
#include "item_menu.h"
#include "player_pc.h"
#include "ewram.h"
+#include "script.h"
/*
Pokemon menu:
@@ -45,6 +46,7 @@ struct PokeMenuFieldMoveFunc
u8 field_1;
};
+extern u8 gUnknown_020297ED;
extern u8 gUnknown_020384F0;
extern u8 gUnknown_0202E8F4;
extern u8 gUnknown_0202E8F5;
@@ -900,9 +902,10 @@ static void sub_808AE08(void)
static bool8 SetUpFieldMove_Waterfall(void)
{
s16 x, y;
+
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE
- && IsPlayerSurfingNorth() == TRUE)
+ && IsPlayerSurfingNorth() == TRUE)
{
gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_808AE08;
@@ -913,138 +916,19 @@ static bool8 SetUpFieldMove_Waterfall(void)
}
#if DEBUG
-__attribute__((naked))
-void debug_sub_80986AC()
-{
- asm("\
- push {r4, lr}\n\
- add sp, sp, #0xfffffffc\n\
- mov r4, sp\n\
- add r4, r4, #0x2\n\
- mov r0, sp\n\
- add r1, r4, #0\n\
- bl GetXYCoordsOneStepInFrontOfPlayer\n\
- mov r0, sp\n\
- mov r1, #0x0\n\
- ldsh r0, [r0, r1]\n\
- mov r2, #0x0\n\
- ldsh r1, [r4, r2]\n\
- bl MapGridGetMetatileBehaviorAt\n\
- lsl r0, r0, #0x18\n\
- lsr r0, r0, #0x18\n\
- bl MetatileBehavior_IsWaterfall\n\
- lsl r0, r0, #0x18\n\
- lsr r0, r0, #0x18\n\
- cmp r0, #0x1\n\
- bne ._274 @cond_branch\n\
- bl IsPlayerSurfingNorth\n\
- lsl r0, r0, #0x18\n\
- lsr r0, r0, #0x18\n\
- cmp r0, #0x1\n\
- bne ._274 @cond_branch\n\
- bl sub_808AE08\n\
- b ._275\n\
-._274:\n\
- bl ScriptContext2_Disable\n\
-._275:\n\
- add sp, sp, #0x4\n\
- pop {r4}\n\
- pop {r0}\n\
- bx r0");
+void debug_sub_80986AC(void)
+{
+ s16 x, y;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE
+ && IsPlayerSurfingNorth() == TRUE)
+ sub_808AE08();
+ else
+ ScriptContext2_Disable();
}
#endif
-#if DEBUG
-__attribute__((naked))
-static void sub_808AE8C(void)
-{
- asm("\
- push {r4, r5, r6, lr}\n\
- ldr r0, ._281\n\
- ldrb r0, [r0]\n\
- sub r0, r0, #0x21\n\
- lsl r0, r0, #0x18\n\
- lsr r6, r0, #0x18\n\
- mov r5, #0x0\n\
-._287:\n\
- mov r0, #0x64\n\
- add r1, r5, #0\n\
- mul r1, r1, r0\n\
- ldr r0, ._281 + 4\n\
- add r4, r1, r0\n\
- add r0, r4, #0\n\
- mov r1, #0xb\n\
- bl GetMonData\n\
- cmp r0, #0\n\
- beq ._284 @cond_branch\n\
- add r0, r5, #0\n\
- bl sub_806D668\n\
- ldr r0, ._281 + 8\n\
- ldrb r0, [r0]\n\
- cmp r0, #0\n\
- bne ._279 @cond_branch\n\
- add r0, r4, #0\n\
- mov r1, #0x2d\n\
- bl GetMonData\n\
- cmp r0, #0\n\
- bne ._278 @cond_branch\n\
- add r0, r4, #0\n\
- add r1, r6, #0\n\
- bl CanMonLearnTMHM\n\
- cmp r0, #0\n\
- bne ._279 @cond_branch\n\
-._278:\n\
- add r0, r5, #0\n\
- mov r1, #0x9a\n\
- bl sub_806BC3C\n\
- b ._284\n\
-._282:\n\
- .align 2, 0\n\
-._281:\n\
- .word gSpecialVar_ItemId\n\
- .word gPlayerParty\n\
- .word gUnknown_020297ED\n\
-._279:\n\
- mov r0, #0x64\n\
- add r4, r5, #0\n\
- mul r4, r4, r0\n\
- ldr r0, ._285\n\
- add r4, r4, r0\n\
- ldr r0, ._285 + 4\n\
- ldrh r0, [r0]\n\
- bl ItemIdToBattleMoveId\n\
- add r1, r0, #0\n\
- lsl r1, r1, #0x10\n\
- lsr r1, r1, #0x10\n\
- add r0, r4, #0\n\
- bl pokemon_has_move\n\
- lsl r0, r0, #0x18\n\
- cmp r0, #0\n\
- beq ._283 @cond_branch\n\
- add r0, r5, #0\n\
- mov r1, #0xa8\n\
- bl sub_806BC3C\n\
- b ._284\n\
-._286:\n\
- .align 2, 0\n\
-._285:\n\
- .word gPlayerParty\n\
- .word gSpecialVar_ItemId\n\
-._283:\n\
- add r0, r5, #0\n\
- mov r1, #0x8c\n\
- bl sub_806BC3C\n\
-._284:\n\
- add r0, r5, #1\n\
- lsl r0, r0, #0x18\n\
- lsr r5, r0, #0x18\n\
- cmp r5, #0x5\n\
- bls ._287 @cond_branch\n\
- pop {r4, r5, r6}\n\
- pop {r0}\n\
- bx r0");
-}
-#else
static void sub_808AE8C(void)
{
u8 i;
@@ -1054,7 +938,11 @@ static void sub_808AE8C(void)
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES))
{
sub_806D668(i);
- if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg))
+ if (
+#if DEBUG
+ gUnknown_020297ED == 0 &&
+#endif
+ (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg)))
sub_806BC3C(i, 0x9A);
else if (pokemon_has_move(&gPlayerParty[i], ItemIdToBattleMoveId(gSpecialVar_ItemId)))
sub_806BC3C(i, 0xA8);
@@ -1063,7 +951,6 @@ static void sub_808AE8C(void)
}
}
}
-#endif
static void sub_808AF20(void)
{