summaryrefslogtreecommitdiff
path: root/src/pokemon_2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pokemon_2.c')
-rw-r--r--src/pokemon_2.c97
1 files changed, 84 insertions, 13 deletions
diff --git a/src/pokemon_2.c b/src/pokemon_2.c
index c8d07f88d..8b55baaba 100644
--- a/src/pokemon_2.c
+++ b/src/pokemon_2.c
@@ -1,12 +1,13 @@
#include "global.h"
+#include "asm.h"
#include "text.h"
#include "string_util.h"
#include "pokemon.h"
+#include "rng.h"
#include "species.h"
#include "main.h"
#include "sprite.h"
-#include "berry.h"
-#include "flag.h"
+#include "event_data.h"
extern u8 gPlayerPartyCount;
extern struct Pokemon gPlayerParty[6];
@@ -16,7 +17,7 @@ extern struct Pokemon gEnemyParty[6];
extern u16 unk_20160BC[];
extern struct SecretBaseRecord gSecretBaseRecord;
extern u32 dword_2017100[];
-extern u16 gUnknown_020239F8;
+extern u16 gBattleTypeFlags;
extern u8 gUnknown_02024A60;
extern struct BattlePokemon gBattleMons[4];
extern u16 gUnknown_02024BE6;
@@ -25,7 +26,7 @@ extern u8 gUnknown_02024C07;
extern u8 gUnknown_02024C08;
extern u8 gUnknown_02024C0C;
extern u8 gXXX_CritRelated;
-extern u16 word_2024DB8;
+extern u16 gBattleWeather;
extern struct BattleEnigmaBerry gEnigmaBerries[];
extern u16 gBattleMovePower;
extern struct SpriteTemplate gUnknown_02024E8C;
@@ -50,12 +51,6 @@ extern u8 gUnknown_0820823C[];
extern u8 gStatStageRatios[][2];
extern u8 gHoldEffectToType[][2];
-extern u8 battle_side_get_owner(u8);
-extern u8 battle_get_side_with_given_state(u8);
-extern u32 battle_get_per_side_status(u8);
-extern u8 sub_8018324(u8, u8, u8, u8, u16);
-extern u8 sub_803C348(u8);
-
u8 sub_803C348(u8 a1)
{
s32 i;
@@ -89,6 +84,7 @@ u8 sub_803C348(u8 a1)
return retVal;
}
+#ifdef NONMATCHING
u8 sub_803C434(u8 a1)
{
u32 status0 = battle_get_per_side_status(a1);
@@ -102,7 +98,7 @@ u8 sub_803C434(u8 a1)
status = status_ ^ mask1;
{
- register u16 val_ asm("r1") = gUnknown_020239F8;
+ register u16 val_ asm("r1") = gBattleTypeFlags;
u32 val = mask2;
val &= val_;
if (!val)
@@ -113,7 +109,7 @@ u8 sub_803C434(u8 a1)
if (sub_803C348(0) > 1)
{
- u32 r = Random();
+ u16 r = Random();
register u32 val asm("r1") = mask2;
val &= r;
if (!val)
@@ -135,6 +131,77 @@ u8 sub_803C434(u8 a1)
return battle_get_side_with_given_state(status);
}
}
+#else
+__attribute__((naked))
+u8 sub_803C434(u8 a1) {
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ bl battle_get_per_side_status\n\
+ movs r1, 0x1\n\
+ movs r6, 0x1\n\
+ adds r4, r6, 0\n\
+ ands r4, r0\n\
+ eors r4, r1\n\
+ adds r5, r4, 0\n\
+ ldr r0, _0803C45C\n\
+ ldrh r1, [r0]\n\
+ adds r0, r6, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0803C460\n\
+ adds r0, r4, 0\n\
+ b _0803C4AA\n\
+ .align 2, 0\n\
+_0803C45C: .4byte gBattleTypeFlags\n\
+_0803C460:\n\
+ movs r0, 0\n\
+ bl sub_803C348\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bls _0803C484\n\
+ bl Random\n\
+ adds r1, r6, 0\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ bne _0803C480\n\
+ movs r0, 0x2\n\
+ eors r0, r4\n\
+ b _0803C4AA\n\
+_0803C480:\n\
+ adds r0, r4, 0\n\
+ b _0803C4AA\n\
+_0803C484:\n\
+ ldr r0, _0803C49C\n\
+ ldrb r1, [r0]\n\
+ ldr r2, _0803C4A0\n\
+ lsls r0, r4, 2\n\
+ adds r0, r2\n\
+ ldr r0, [r0]\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ bne _0803C4A4\n\
+ adds r0, r4, 0\n\
+ b _0803C4AA\n\
+ .align 2, 0\n\
+_0803C49C: .4byte gUnknown_02024C0C\n\
+_0803C4A0: .4byte gBitTable\n\
+_0803C4A4:\n\
+ movs r0, 0x2\n\
+ eors r5, r0\n\
+ adds r0, r5, 0\n\
+_0803C4AA:\n\
+ bl battle_get_side_with_given_state\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ pop {r4-r6}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif
u8 GetMonGender(struct Pokemon *mon)
{
@@ -949,7 +1016,11 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data)
break;
case MON_DATA_IVS:
{
+#ifdef BUGFIX_SETMONIVS
+ u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
+#else
u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0.
+#endif
substruct3->hpIV = ivs & 0x1F;
substruct3->attackIV = (ivs >> 5) & 0x1F;
substruct3->defenseIV = (ivs >> 10) & 0x1F;
@@ -1116,7 +1187,7 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
}
}
- gUnknown_020239F8 = 8;
+ gBattleTypeFlags = 8;
gTrainerBattleOpponent = 1024;
}