diff options
Diffstat (limited to 'src/pokemon_2.c')
-rw-r--r-- | src/pokemon_2.c | 97 |
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; } |