diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | asm/rom3.s | 3937 | ||||
-rw-r--r-- | asm/rom_803BA2C.s | 1528 | ||||
-rw-r--r-- | ewram_syms.txt | 3 | ||||
-rw-r--r-- | include/pokemon.h | 283 | ||||
-rw-r--r-- | iwram_syms.txt | 3 | ||||
-rw-r--r-- | ld_script.txt | 4 | ||||
-rw-r--r-- | src/pokemon_1.c | 678 | ||||
-rw-r--r-- | src/pokemon_2.c (renamed from src/pokemon.c) | 137 |
9 files changed, 2501 insertions, 4074 deletions
@@ -38,7 +38,7 @@ C_OBJS := $(C_SRCS:%.c=%.o) ASM_OBJS := asm/crt0.o asm/rom3.o asm/rom_8040EB4.o asm/rom4.o asm/rom_8074BAC.o asm/rom5.o \ asm/libgcnmultiboot.o asm/m4a_1.o asm/m4a_3.o asm/libagbsyscall.o \ -asm/rom_8072DF8.o asm/rom_8065394.o asm/rom_803D1FC.o +asm/rom_8072DF8.o asm/rom_8065394.o asm/rom_803D1FC.o asm/rom_803BA2C.o DATA_ASM_OBJS := data/data2.o data/graphics.o data/sound_data.o \ data/event_scripts.o data/battle_anim_scripts.o \ diff --git a/asm/rom3.s b/asm/rom3.s index ba00bb21d..62aabe46e 100644 --- a/asm/rom3.s +++ b/asm/rom3.s @@ -92608,3941 +92608,4 @@ nullsub_48: @ 803A6BC bx lr thumb_func_end nullsub_48 - thumb_func_start ZeroPokemonBoxData -ZeroPokemonBoxData: @ 803A6C0 - push {lr} - adds r2, r0, 0 - movs r1, 0 - movs r3, 0 -_0803A6C8: - adds r0, r2, r1 - strb r3, [r0] - adds r1, 0x1 - cmp r1, 0x4F - bls _0803A6C8 - pop {r0} - bx r0 - thumb_func_end ZeroPokemonBoxData - - thumb_func_start zero_pokemon_struct -zero_pokemon_struct: @ 803A6D8 - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - bl ZeroPokemonBoxData - movs r0, 0 - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x37 - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x38 - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x39 - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3A - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3B - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3C - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3D - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3E - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3F - mov r2, sp - bl SetMonData - movs r0, 0xFF - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x40 - mov r2, sp - bl SetMonData - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - thumb_func_end zero_pokemon_struct - - thumb_func_start zero_player_party_data -zero_player_party_data: @ 803A758 - push {r4,r5,lr} - ldr r4, _0803A774 - movs r0, 0xFA - lsls r0, 1 - adds r5, r4, r0 -_0803A762: - adds r0, r4, 0 - bl zero_pokemon_struct - adds r4, 0x64 - cmp r4, r5 - ble _0803A762 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803A774: .4byte 0x03004360 - thumb_func_end zero_player_party_data - - thumb_func_start zero_enemy_party_data -zero_enemy_party_data: @ 803A778 - push {r4,r5,lr} - ldr r4, _0803A794 - movs r0, 0xFA - lsls r0, 1 - adds r5, r4, r0 -_0803A782: - adds r0, r4, 0 - bl zero_pokemon_struct - adds r4, 0x64 - cmp r4, r5 - ble _0803A782 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803A794: .4byte 0x030045c0 - thumb_func_end zero_enemy_party_data - - thumb_func_start create_pokemon_set_level -create_pokemon_set_level: @ 803A798 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x1C - mov r8, r0 - adds r6, r1, 0 - ldr r4, [sp, 0x34] - ldr r7, [sp, 0x38] - ldr r5, [sp, 0x3C] - lsls r6, 16 - lsrs r6, 16 - add r0, sp, 0x10 - strb r2, [r0] - lsls r3, 24 - lsrs r3, 24 - lsls r4, 24 - lsrs r4, 24 - lsls r5, 24 - lsrs r5, 24 - mov r0, r8 - str r3, [sp, 0x18] - bl zero_pokemon_struct - str r4, [sp] - str r7, [sp, 0x4] - str r5, [sp, 0x8] - ldr r0, [sp, 0x40] - str r0, [sp, 0xC] - mov r0, r8 - adds r1, r6, 0 - add r2, sp, 0x10 - ldrb r2, [r2] - ldr r3, [sp, 0x18] - bl create_pokemon - mov r0, r8 - movs r1, 0x38 - add r2, sp, 0x10 - bl SetMonData - movs r0, 0xFF - str r0, [sp, 0x14] - add r2, sp, 0x14 - mov r0, r8 - movs r1, 0x40 - bl SetMonData - mov r0, r8 - bl pokemon_calc_effective_stats - add sp, 0x1C - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end create_pokemon_set_level - - thumb_func_start create_pokemon -create_pokemon: @ 803A808 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x20 - adds r7, r0, 0 - ldr r4, [sp, 0x40] - ldr r0, [sp, 0x48] - movs r5, 0xE - add r5, sp - strh r1, [r5] - add r6, sp, 0x10 - strb r2, [r6] - mov r5, sp - adds r5, 0x11 - strb r3, [r5] - lsls r4, 24 - lsrs r4, 24 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - adds r0, r7, 0 - bl ZeroPokemonBoxData - cmp r4, 0 - beq _0803A844 - ldr r0, [sp, 0x44] - str r0, [sp, 0x14] - b _0803A858 -_0803A844: - bl Random - adds r4, r0, 0 - bl Random - lsls r4, 16 - lsrs r4, 16 - lsls r0, 16 - orrs r4, r0 - str r4, [sp, 0x14] -_0803A858: - add r2, sp, 0x14 - adds r0, r7, 0 - movs r1, 0 - bl SetMonBoxData - add r0, sp, 0x18 - mov r9, r0 - add r5, sp, 0xC - mov r1, r10 - cmp r1, 0x2 - bne _0803A8B0 - ldr r2, _0803A8A8 - mov r8, r2 - ldr r6, _0803A8AC -_0803A874: - bl Random - adds r4, r0, 0 - bl Random - lsls r4, 16 - lsrs r4, 16 - lsls r0, 16 - orrs r4, r0 - str r4, [sp, 0x18] - adds r1, r4, 0 - mov r3, r8 - ands r1, r3 - lsrs r1, 16 - ands r4, r6 - eors r1, r4 - ldr r2, [sp, 0x14] - adds r0, r2, 0 - ands r0, r3 - lsrs r0, 16 - eors r1, r0 - ands r2, r6 - eors r1, r2 - cmp r1, 0x7 - bls _0803A874 - b _0803A8D4 - .align 2, 0 -_0803A8A8: .4byte 0xffff0000 -_0803A8AC: .4byte 0x0000ffff -_0803A8B0: - mov r0, r10 - cmp r0, 0x1 - bne _0803A8BC - ldr r0, [sp, 0x4C] - str r0, [sp, 0x18] - b _0803A8D4 -_0803A8BC: - ldr r2, _0803AA00 - ldrb r1, [r2, 0xA] - ldrb r0, [r2, 0xB] - lsls r0, 8 - orrs r1, r0 - ldrb r0, [r2, 0xC] - lsls r0, 16 - orrs r1, r0 - ldrb r0, [r2, 0xD] - lsls r0, 24 - orrs r1, r0 - str r1, [sp, 0x18] -_0803A8D4: - adds r0, r7, 0 - movs r1, 0x1 - mov r2, r9 - bl SetMonBoxData - adds r0, r7, 0 - bl pokemon_calc_checksum - strh r0, [r5] - adds r0, r7, 0 - movs r1, 0x9 - adds r2, r5, 0 - bl SetMonBoxData - adds r0, r7, 0 - bl EncryptMon - mov r0, sp - ldrh r1, [r0, 0xE] - bl GetSpeciesName - adds r0, r7, 0 - movs r1, 0x2 - mov r2, sp - bl SetMonBoxData - ldr r2, _0803AA04 - adds r0, r7, 0 - movs r1, 0x3 - bl SetMonBoxData - ldr r5, _0803AA00 - adds r0, r7, 0 - movs r1, 0x7 - adds r2, r5, 0 - bl SetMonBoxData - adds r0, r7, 0 - movs r1, 0xB - mov r2, sp - adds r2, 0xE - bl SetMonBoxData - ldr r4, _0803AA08 - mov r2, sp - ldrh r1, [r2, 0xE] - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - adds r0, r4 - ldrb r1, [r0, 0x13] - movs r0, 0xCA - lsls r0, 1 - adds r2, r1, 0 - muls r2, r0 - mov r3, sp - ldrb r0, [r3, 0x10] - lsls r0, 2 - ldr r1, _0803AA0C - adds r0, r1 - adds r2, r0 - adds r0, r7, 0 - movs r1, 0x19 - bl SetMonBoxData - mov r1, sp - ldrh r0, [r1, 0xE] - lsls r2, r0, 3 - subs r2, r0 - lsls r2, 2 - adds r4, 0x12 - adds r2, r4 - adds r0, r7, 0 - movs r1, 0x20 - bl SetMonBoxData - bl sav1_map_get_name - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x18] - adds r0, r7, 0 - movs r1, 0x23 - mov r2, r9 - bl SetMonBoxData - adds r0, r7, 0 - movs r1, 0x24 - add r2, sp, 0x10 - bl SetMonBoxData - ldr r2, _0803AA10 - adds r0, r7, 0 - movs r1, 0x25 - bl SetMonBoxData - movs r0, 0x4 - str r0, [sp, 0x18] - adds r0, r7, 0 - movs r1, 0x26 - mov r2, r9 - bl SetMonBoxData - adds r5, 0x8 - adds r0, r7, 0 - movs r1, 0x31 - adds r2, r5, 0 - bl SetMonBoxData - mov r2, sp - ldrb r0, [r2, 0x11] - cmp r0, 0x1F - bhi _0803AA14 - adds r0, r7, 0 - movs r1, 0x27 - adds r2, 0x11 - bl SetMonBoxData - adds r0, r7, 0 - movs r1, 0x28 - mov r2, sp - adds r2, 0x11 - bl SetMonBoxData - adds r0, r7, 0 - movs r1, 0x29 - mov r2, sp - adds r2, 0x11 - bl SetMonBoxData - adds r0, r7, 0 - movs r1, 0x2A - mov r2, sp - adds r2, 0x11 - bl SetMonBoxData - adds r0, r7, 0 - movs r1, 0x2B - mov r2, sp - adds r2, 0x11 - bl SetMonBoxData - adds r0, r7, 0 - movs r1, 0x2C - mov r2, sp - adds r2, 0x11 - bl SetMonBoxData - b _0803AA9C - .align 2, 0 -_0803AA00: .4byte gSaveBlock2 -_0803AA04: .4byte gGameLanguage -_0803AA08: .4byte gBaseStats -_0803AA0C: .4byte gExperienceTables -_0803AA10: .4byte gGameVersion -_0803AA14: - bl Random - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x18] - movs r3, 0x1F - mov r8, r3 - ands r0, r3 - str r0, [sp, 0x1C] - add r4, sp, 0x1C - adds r0, r7, 0 - movs r1, 0x27 - adds r2, r4, 0 - bl SetMonBoxData - ldr r0, [sp, 0x18] - movs r6, 0xF8 - lsls r6, 2 - ands r0, r6 - lsrs r0, 5 - str r0, [sp, 0x1C] - adds r0, r7, 0 - movs r1, 0x28 - adds r2, r4, 0 - bl SetMonBoxData - ldr r0, [sp, 0x18] - movs r5, 0xF8 - lsls r5, 7 - ands r0, r5 - lsrs r0, 10 - str r0, [sp, 0x1C] - adds r0, r7, 0 - movs r1, 0x29 - adds r2, r4, 0 - bl SetMonBoxData - bl Random - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x18] - mov r1, r8 - ands r0, r1 - str r0, [sp, 0x1C] - adds r0, r7, 0 - movs r1, 0x2A - adds r2, r4, 0 - bl SetMonBoxData - ldr r0, [sp, 0x18] - ands r0, r6 - lsrs r0, 5 - str r0, [sp, 0x1C] - adds r0, r7, 0 - movs r1, 0x2B - adds r2, r4, 0 - bl SetMonBoxData - ldr r0, [sp, 0x18] - ands r0, r5 - lsrs r0, 10 - str r0, [sp, 0x1C] - adds r0, r7, 0 - movs r1, 0x2C - adds r2, r4, 0 - bl SetMonBoxData -_0803AA9C: - ldr r2, _0803AAD8 - mov r3, sp - ldrh r1, [r3, 0xE] - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x17] - cmp r0, 0 - beq _0803AAC2 - ldr r0, [sp, 0x14] - movs r1, 0x1 - ands r0, r1 - str r0, [sp, 0x18] - adds r0, r7, 0 - movs r1, 0x2E - mov r2, r9 - bl SetMonBoxData -_0803AAC2: - adds r0, r7, 0 - bl sub_803B720 - add sp, 0x20 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803AAD8: .4byte gBaseStats - thumb_func_end create_pokemon - - thumb_func_start pokemon_make_with_nature -pokemon_make_with_nature: @ 803AADC - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x10 - mov r9, r0 - ldr r0, [sp, 0x2C] - lsls r1, 16 - lsrs r1, 16 - mov r8, r1 - lsls r2, 24 - lsrs r7, r2, 24 - lsls r3, 24 - lsrs r6, r3, 24 - lsls r0, 24 - lsrs r5, r0, 24 -_0803AAFC: - bl Random - adds r4, r0, 0 - bl Random - lsls r4, 16 - lsrs r4, 16 - lsls r0, 16 - orrs r4, r0 - adds r0, r4, 0 - bl GetNatureFromPersonality - lsls r0, 24 - lsrs r0, 24 - cmp r5, r0 - bne _0803AAFC - movs r0, 0x1 - str r0, [sp] - str r4, [sp, 0x4] - movs r0, 0 - str r0, [sp, 0x8] - str r0, [sp, 0xC] - mov r0, r9 - mov r1, r8 - adds r2, r7, 0 - adds r3, r6, 0 - bl create_pokemon_set_level - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end pokemon_make_with_nature - - thumb_func_start unref_sub_803AB44 -unref_sub_803AB44: @ 803AB44 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - str r0, [sp, 0x10] - ldr r4, [sp, 0x38] - ldr r5, [sp, 0x3C] - ldr r0, [sp, 0x40] - lsls r1, 16 - lsrs r7, r1, 16 - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0x14] - lsls r3, 24 - lsrs r3, 24 - mov r10, r3 - lsls r4, 24 - lsrs r4, 24 - mov r8, r4 - lsls r5, 24 - lsrs r6, r5, 24 - lsls r0, 24 - lsrs r1, r0, 24 - mov r9, r1 - movs r1, 0xFF - lsls r1, 24 - adds r0, r1 - lsrs r0, 24 - cmp r0, 0x1B - bhi _0803ABEA -_0803AB84: - bl Random - adds r4, r0, 0 - bl Random - lsls r4, 16 - lsrs r4, 16 - lsls r0, 16 - orrs r4, r0 - movs r0, 0xC0 - lsls r0, 18 - ands r0, r4 - lsrs r0, 18 - movs r1, 0xC0 - lsls r1, 10 - ands r1, r4 - lsrs r1, 12 - orrs r0, r1 - movs r1, 0xC0 - lsls r1, 2 - ands r1, r4 - lsrs r1, 6 - orrs r0, r1 - movs r1, 0x3 - ands r1, r4 - orrs r0, r1 - movs r1, 0x1C - bl __umodsi3 - lsls r0, 16 - lsrs r5, r0, 16 - adds r0, r4, 0 - bl GetNatureFromPersonality - lsls r0, 24 - lsrs r0, 24 - cmp r6, r0 - bne _0803AB84 - adds r0, r7, 0 - adds r1, r4, 0 - bl pokemon_species_get_gender_info - lsls r0, 24 - lsrs r0, 24 - cmp r8, r0 - bne _0803AB84 - mov r0, r9 - subs r0, 0x1 - cmp r5, r0 - bne _0803AB84 - b _0803AC1A -_0803ABEA: - bl Random - adds r4, r0, 0 - bl Random - lsls r4, 16 - lsrs r4, 16 - lsls r0, 16 - orrs r4, r0 - adds r0, r4, 0 - bl GetNatureFromPersonality - lsls r0, 24 - lsrs r0, 24 - cmp r6, r0 - bne _0803ABEA - adds r0, r7, 0 - adds r1, r4, 0 - bl pokemon_species_get_gender_info - lsls r0, 24 - lsrs r0, 24 - cmp r8, r0 - bne _0803ABEA -_0803AC1A: - movs r0, 0x1 - str r0, [sp] - str r4, [sp, 0x4] - movs r0, 0 - str r0, [sp, 0x8] - str r0, [sp, 0xC] - ldr r0, [sp, 0x10] - adds r1, r7, 0 - ldr r2, [sp, 0x14] - mov r3, r10 - bl create_pokemon_set_level - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end unref_sub_803AB44 - - thumb_func_start sub_803AC44 -sub_803AC44: @ 803AC44 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x10 - mov r8, r0 - lsls r1, 16 - lsrs r6, r1, 16 - lsls r2, 24 - lsrs r7, r2, 24 -_0803AC56: - bl Random - adds r4, r0, 0 - bl Random - lsls r4, 16 - lsrs r5, r4, 16 - lsls r0, 16 - orrs r5, r0 - bl Random - adds r4, r0, 0 - bl Random - lsls r4, 16 - lsrs r4, 16 - lsls r0, 16 - orrs r4, r0 - adds r0, r6, 0 - adds r1, r4, 0 - bl pokemon_species_get_gender_info - lsls r0, 24 - cmp r0, 0 - bne _0803AC56 - movs r0, 0x1 - str r0, [sp] - str r4, [sp, 0x4] - str r0, [sp, 0x8] - str r5, [sp, 0xC] - mov r0, r8 - adds r1, r6, 0 - adds r2, r7, 0 - movs r3, 0x20 - bl create_pokemon_set_level - add sp, 0x10 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_803AC44 - - thumb_func_start sub_803ACAC -sub_803ACAC: @ 803ACAC - push {r4,lr} - sub sp, 0x14 - adds r4, r0, 0 - str r3, [sp, 0x10] - ldr r3, [sp, 0x1C] - lsls r1, 16 - lsrs r1, 16 - lsls r2, 24 - lsrs r2, 24 - movs r0, 0x1 - str r0, [sp] - str r3, [sp, 0x4] - movs r0, 0 - str r0, [sp, 0x8] - str r0, [sp, 0xC] - adds r0, r4, 0 - movs r3, 0 - bl create_pokemon_set_level - adds r0, r4, 0 - movs r1, 0x42 - add r2, sp, 0x10 - bl SetMonData - adds r0, r4, 0 - bl pokemon_calc_effective_stats - add sp, 0x14 - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_803ACAC - - thumb_func_start unref_sub_803ACEC -unref_sub_803ACEC: @ 803ACEC - push {r4,r5,lr} - sub sp, 0x10 - adds r5, r0, 0 - adds r4, r3, 0 - ldr r3, [sp, 0x1C] - lsls r1, 16 - lsrs r1, 16 - lsls r2, 24 - lsrs r2, 24 - movs r0, 0 - str r0, [sp] - str r0, [sp, 0x4] - movs r0, 0x1 - str r0, [sp, 0x8] - str r3, [sp, 0xC] - adds r0, r5, 0 - movs r3, 0 - bl create_pokemon_set_level - adds r0, r5, 0 - movs r1, 0x27 - adds r2, r4, 0 - bl SetMonData - adds r2, r4, 0x1 - adds r0, r5, 0 - movs r1, 0x28 - bl SetMonData - adds r2, r4, 0x2 - adds r0, r5, 0 - movs r1, 0x29 - bl SetMonData - adds r2, r4, 0x3 - adds r0, r5, 0 - movs r1, 0x2A - bl SetMonData - adds r2, r4, 0x4 - adds r0, r5, 0 - movs r1, 0x2B - bl SetMonData - adds r4, 0x5 - adds r0, r5, 0 - movs r1, 0x2C - adds r2, r4, 0 - bl SetMonData - adds r0, r5, 0 - bl pokemon_calc_effective_stats - add sp, 0x10 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end unref_sub_803ACEC - - thumb_func_start pokemon_make_ev_something -pokemon_make_ev_something: @ 803AD60 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x14 - adds r7, r0, 0 - ldr r0, [sp, 0x2C] - lsls r1, 16 - lsrs r1, 16 - lsls r2, 24 - lsrs r2, 24 - lsls r3, 24 - lsrs r3, 24 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - movs r6, 0 - str r6, [sp] - str r6, [sp, 0x4] - str r6, [sp, 0x8] - str r6, [sp, 0xC] - adds r0, r7, 0 - bl create_pokemon_set_level - mov r4, r8 - movs r1, 0x1 - movs r5, 0x5 -_0803AD94: - adds r0, r4, 0 - ands r0, r1 - cmp r0, 0 - beq _0803AD9E - adds r6, 0x1 -_0803AD9E: - lsrs r4, 1 - subs r5, 0x1 - cmp r5, 0 - bge _0803AD94 - movs r0, 0xFF - lsls r0, 1 - adds r1, r6, 0 - bl __divsi3 - add r1, sp, 0x10 - strh r0, [r1] - movs r4, 0x1 - movs r5, 0 -_0803ADB8: - mov r0, r8 - ands r0, r4 - cmp r0, 0 - beq _0803ADCC - adds r1, r5, 0 - adds r1, 0x1A - adds r0, r7, 0 - add r2, sp, 0x10 - bl SetMonData -_0803ADCC: - lsls r0, r4, 25 - lsrs r4, r0, 24 - adds r5, 0x1 - cmp r5, 0x5 - ble _0803ADB8 - adds r0, r7, 0 - bl pokemon_calc_effective_stats - add sp, 0x14 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end pokemon_make_ev_something - - thumb_func_start sub_803ADE8 -sub_803ADE8: @ 803ADE8 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x20 - adds r7, r0, 0 - adds r6, r1, 0 - ldrh r1, [r6] - ldrb r2, [r6, 0xC] - movs r3, 0x1 - str r3, [sp] - ldr r0, [r6, 0x1C] - str r0, [sp, 0x4] - str r3, [sp, 0x8] - ldr r0, [r6, 0x14] - str r0, [sp, 0xC] - adds r0, r7, 0 - movs r3, 0 - bl create_pokemon_set_level - movs r5, 0 - add r0, sp, 0x1C - mov r9, r0 - movs r1, 0x1D - add r1, sp - mov r8, r1 - adds r4, r6, 0x4 -_0803AE1E: - ldrh r1, [r4] - lsls r2, r5, 24 - lsrs r2, 24 - adds r0, r7, 0 - bl sub_803B6A4 - adds r4, 0x2 - adds r5, 0x1 - cmp r5, 0x3 - ble _0803AE1E - adds r2, r6, 0 - adds r2, 0xD - adds r0, r7, 0 - movs r1, 0x15 - bl SetMonData - adds r2, r6, 0x2 - adds r0, r7, 0 - movs r1, 0xC - bl SetMonData - adds r1, r6, 0 - adds r1, 0x20 - add r0, sp, 0x10 - bl StringCopy - add r0, sp, 0x10 - ldrb r0, [r0] - cmp r0, 0xFC - bne _0803AE66 - add r0, sp, 0x10 - ldrb r0, [r0, 0x1] - cmp r0, 0x15 - bne _0803AE66 - movs r0, 0x1 - b _0803AE68 -_0803AE66: - movs r0, 0x2 -_0803AE68: - mov r1, r9 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x3 - mov r2, r9 - bl SetMonData - add r0, sp, 0x10 - bl SkipExtCtrlCodes - adds r0, r7, 0 - movs r1, 0x2 - add r2, sp, 0x10 - bl SetMonData - adds r2, r6, 0 - adds r2, 0x2B - adds r0, r7, 0 - movs r1, 0x20 - bl SetMonData - adds r2, r6, 0 - adds r2, 0xE - adds r0, r7, 0 - movs r1, 0x1A - bl SetMonData - adds r2, r6, 0 - adds r2, 0xF - adds r0, r7, 0 - movs r1, 0x1B - bl SetMonData - adds r2, r6, 0 - adds r2, 0x10 - adds r0, r7, 0 - movs r1, 0x1C - bl SetMonData - adds r2, r6, 0 - adds r2, 0x11 - adds r0, r7, 0 - movs r1, 0x1D - bl SetMonData - adds r2, r6, 0 - adds r2, 0x12 - adds r0, r7, 0 - movs r1, 0x1E - bl SetMonData - adds r2, r6, 0 - adds r2, 0x13 - adds r0, r7, 0 - movs r1, 0x1F - bl SetMonData - ldrb r0, [r6, 0x1B] - lsrs r0, 7 - mov r1, r8 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x2E - mov r2, r8 - bl SetMonData - ldrb r0, [r6, 0x18] - lsls r0, 27 - lsrs r0, 27 - mov r1, r8 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x27 - mov r2, r8 - bl SetMonData - ldrh r0, [r6, 0x18] - lsls r0, 22 - lsrs r0, 27 - mov r1, r8 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x28 - mov r2, r8 - bl SetMonData - ldrb r0, [r6, 0x19] - lsls r0, 25 - lsrs r0, 27 - mov r1, r8 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x29 - mov r2, r8 - bl SetMonData - ldr r0, [r6, 0x18] - lsls r0, 12 - lsrs r0, 27 - mov r1, r8 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x2A - mov r2, r8 - bl SetMonData - ldrh r0, [r6, 0x1A] - lsls r0, 23 - lsrs r0, 27 - mov r1, r8 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x2B - mov r2, r8 - bl SetMonData - ldrb r0, [r6, 0x1B] - lsls r0, 26 - lsrs r0, 27 - mov r1, r8 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x2C - mov r2, r8 - bl SetMonData - adds r0, r7, 0 - bl pokemon_calc_effective_stats - add sp, 0x20 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_803ADE8 - - thumb_func_start sub_803AF78 -sub_803AF78: @ 803AF78 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r7, r0, 0 - adds r6, r1, 0 - movs r1, 0xB - movs r2, 0 - bl GetMonData - strh r0, [r6] - adds r0, r7, 0 - movs r1, 0xC - movs r2, 0 - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0xAF - bne _0803AFA2 - movs r0, 0 -_0803AFA2: - strh r0, [r6, 0x2] - movs r5, 0 - movs r0, 0x2B - adds r0, r6 - mov r8, r0 - movs r1, 0x20 - adds r1, r6 - mov r9, r1 - adds r4, r6, 0x4 -_0803AFB4: - adds r1, r5, 0 - adds r1, 0xD - adds r0, r7, 0 - movs r2, 0 - bl GetMonData - strh r0, [r4] - adds r4, 0x2 - adds r5, 0x1 - cmp r5, 0x3 - ble _0803AFB4 - adds r0, r7, 0 - movs r1, 0x38 - movs r2, 0 - bl GetMonData - strb r0, [r6, 0xC] - adds r0, r7, 0 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - strb r0, [r6, 0xD] - adds r0, r7, 0 - movs r1, 0x1 - movs r2, 0 - bl GetMonData - str r0, [r6, 0x14] - adds r0, r7, 0 - movs r1, 0x1A - movs r2, 0 - bl GetMonData - strb r0, [r6, 0xE] - adds r0, r7, 0 - movs r1, 0x1B - movs r2, 0 - bl GetMonData - strb r0, [r6, 0xF] - adds r0, r7, 0 - movs r1, 0x1C - movs r2, 0 - bl GetMonData - strb r0, [r6, 0x10] - adds r0, r7, 0 - movs r1, 0x1D - movs r2, 0 - bl GetMonData - strb r0, [r6, 0x11] - adds r0, r7, 0 - movs r1, 0x1E - movs r2, 0 - bl GetMonData - strb r0, [r6, 0x12] - adds r0, r7, 0 - movs r1, 0x1F - movs r2, 0 - bl GetMonData - strb r0, [r6, 0x13] - adds r0, r7, 0 - movs r1, 0x20 - movs r2, 0 - bl GetMonData - mov r1, r8 - strb r0, [r1] - adds r0, r7, 0 - movs r1, 0x27 - movs r2, 0 - bl GetMonData - movs r4, 0x1F - ands r0, r4 - ldrb r2, [r6, 0x18] - movs r1, 0x20 - negs r1, r1 - ands r1, r2 - orrs r1, r0 - strb r1, [r6, 0x18] - adds r0, r7, 0 - movs r1, 0x28 - movs r2, 0 - bl GetMonData - movs r5, 0x1F - ands r0, r5 - lsls r0, 5 - ldrh r2, [r6, 0x18] - ldr r1, _0803B118 - ands r1, r2 - orrs r1, r0 - strh r1, [r6, 0x18] - adds r0, r7, 0 - movs r1, 0x29 - movs r2, 0 - bl GetMonData - ands r0, r4 - lsls r0, 2 - ldrb r2, [r6, 0x19] - movs r1, 0x7D - negs r1, r1 - ands r1, r2 - orrs r1, r0 - strb r1, [r6, 0x19] - adds r0, r7, 0 - movs r1, 0x2A - movs r2, 0 - bl GetMonData - movs r1, 0x1F - ands r1, r0 - lsls r1, 15 - ldr r0, [r6, 0x18] - ldr r2, _0803B11C - ands r0, r2 - orrs r0, r1 - str r0, [r6, 0x18] - adds r0, r7, 0 - movs r1, 0x2B - movs r2, 0 - bl GetMonData - ands r0, r5 - lsls r0, 4 - ldrh r2, [r6, 0x1A] - ldr r1, _0803B120 - ands r1, r2 - orrs r1, r0 - strh r1, [r6, 0x1A] - adds r0, r7, 0 - movs r1, 0x2C - movs r2, 0 - bl GetMonData - ands r0, r4 - lsls r0, 1 - ldrb r2, [r6, 0x1B] - movs r1, 0x3F - negs r1, r1 - ands r1, r2 - orrs r1, r0 - strb r1, [r6, 0x1B] - adds r0, r7, 0 - movs r1, 0x2E - movs r2, 0 - bl GetMonData - lsls r0, 7 - ldrb r2, [r6, 0x1B] - movs r1, 0x7F - ands r1, r2 - orrs r1, r0 - strb r1, [r6, 0x1B] - adds r0, r7, 0 - movs r1, 0 - movs r2, 0 - bl GetMonData - str r0, [r6, 0x1C] - adds r0, r7, 0 - movs r1, 0x2 - mov r2, r9 - bl GetMonData - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803B118: .4byte 0xfffffc1f -_0803B11C: .4byte 0xfff07fff -_0803B120: .4byte 0xfffffe0f - thumb_func_end sub_803AF78 - - thumb_func_start pokemon_calc_checksum -pokemon_calc_checksum: @ 803B124 - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r4, r0, 0 - movs r6, 0 - ldr r1, [r4] - movs r2, 0 - bl GetSubstruct - adds r5, r0, 0 - ldr r1, [r4] - adds r0, r4, 0 - movs r2, 0x1 - bl GetSubstruct - adds r7, r0, 0 - ldr r1, [r4] - adds r0, r4, 0 - movs r2, 0x2 - bl GetSubstruct - mov r8, r0 - ldr r1, [r4] - adds r0, r4, 0 - movs r2, 0x3 - bl GetSubstruct - adds r3, r0, 0 - movs r1, 0x5 -_0803B15E: - ldrh r0, [r5] - adds r0, r6, r0 - lsls r0, 16 - lsrs r6, r0, 16 - adds r5, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _0803B15E - adds r2, r7, 0 - movs r1, 0x5 -_0803B172: - ldrh r0, [r2] - adds r0, r6, r0 - lsls r0, 16 - lsrs r6, r0, 16 - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _0803B172 - mov r2, r8 - movs r1, 0x5 -_0803B186: - ldrh r0, [r2] - adds r0, r6, r0 - lsls r0, 16 - lsrs r6, r0, 16 - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _0803B186 - adds r2, r3, 0 - movs r1, 0x5 -_0803B19A: - ldrh r0, [r2] - adds r0, r6, r0 - lsls r0, 16 - lsrs r6, r0, 16 - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _0803B19A - adds r0, r6, 0 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end pokemon_calc_checksum - - thumb_func_start pokemon_calc_effective_stats -pokemon_calc_effective_stats: @ 803B1B8 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x40 - adds r5, r0, 0 - movs r1, 0x3A - movs r2, 0 - bl GetMonData - mov r8, r0 - adds r0, r5, 0 - movs r1, 0x39 - movs r2, 0 - bl GetMonData - str r0, [sp, 0x1C] - adds r0, r5, 0 - movs r1, 0x27 - movs r2, 0 - bl GetMonData - adds r6, r0, 0 - adds r0, r5, 0 - movs r1, 0x1A - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - adds r0, r5, 0 - movs r1, 0x28 - movs r2, 0 - bl GetMonData - mov r10, r0 - adds r0, r5, 0 - movs r1, 0x1B - movs r2, 0 - bl GetMonData - mov r9, r0 - adds r0, r5, 0 - movs r1, 0x29 - movs r2, 0 - bl GetMonData - str r0, [sp, 0x20] - adds r0, r5, 0 - movs r1, 0x1C - movs r2, 0 - bl GetMonData - str r0, [sp, 0x24] - adds r0, r5, 0 - movs r1, 0x2A - movs r2, 0 - bl GetMonData - str r0, [sp, 0x28] - adds r0, r5, 0 - movs r1, 0x1D - movs r2, 0 - bl GetMonData - str r0, [sp, 0x2C] - adds r0, r5, 0 - movs r1, 0x2B - movs r2, 0 - bl GetMonData - str r0, [sp, 0x30] - adds r0, r5, 0 - movs r1, 0x1E - movs r2, 0 - bl GetMonData - str r0, [sp, 0x34] - adds r0, r5, 0 - movs r1, 0x2C - movs r2, 0 - bl GetMonData - str r0, [sp, 0x38] - adds r0, r5, 0 - movs r1, 0x1F - movs r2, 0 - bl GetMonData - str r0, [sp, 0x3C] - adds r0, r5, 0 - movs r1, 0xB - movs r2, 0 - bl GetMonData - lsls r0, 16 - lsrs r7, r0, 16 - adds r0, r5, 0 - bl level_by_exp - lsls r0, 24 - lsrs r0, 24 - str r0, [sp] - adds r0, r5, 0 - movs r1, 0x38 - mov r2, sp - bl SetMonData - ldr r0, _0803B2A0 - cmp r7, r0 - bne _0803B2A4 - movs r0, 0x1 - str r0, [sp, 0x4] - lsls r6, r7, 3 - b _0803B2D2 - .align 2, 0 -_0803B2A0: .4byte 0x0000012f -_0803B2A4: - ldr r1, _0803B470 - lsls r2, r7, 3 - subs r0, r2, r7 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0] - lsls r0, 1 - adds r1, r0, r6 - adds r0, r4, 0 - adds r6, r2, 0 - cmp r0, 0 - bge _0803B2BE - adds r0, 0x3 -_0803B2BE: - asrs r0, 2 - adds r0, r1, r0 - ldr r4, [sp] - muls r0, r4 - movs r1, 0x64 - bl __divsi3 - adds r0, r4 - adds r0, 0xA - str r0, [sp, 0x4] -_0803B2D2: - ldr r1, _0803B474 - add r2, sp, 0x4 - ldrb r0, [r2] - mov r3, r8 - subs r0, r3 - ldr r3, _0803B478 - adds r1, r3 - strb r0, [r1] - lsls r0, 24 - cmp r0, 0 - bne _0803B2EC - movs r0, 0x1 - strb r0, [r1] -_0803B2EC: - adds r0, r5, 0 - movs r1, 0x3A - bl SetMonData - ldr r0, _0803B470 - subs r1, r6, r7 - lsls r1, 2 - adds r6, r1, r0 - ldrb r0, [r6, 0x1] - lsls r0, 1 - mov r2, r10 - adds r1, r0, r2 - mov r0, r9 - cmp r0, 0 - bge _0803B30C - adds r0, 0x3 -_0803B30C: - asrs r0, 2 - adds r0, r1, r0 - ldr r1, [sp] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - adds r0, 0x5 - str r0, [sp, 0x8] - adds r0, r5, 0 - bl GetNature - lsls r0, 24 - lsrs r0, 24 - add r4, sp, 0x8 - ldrh r1, [r4] - movs r2, 0x1 - bl nature_stat_mod - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x8] - adds r0, r5, 0 - movs r1, 0x3B - adds r2, r4, 0 - bl SetMonData - ldrb r0, [r6, 0x2] - lsls r0, 1 - ldr r3, [sp, 0x20] - adds r1, r0, r3 - ldr r0, [sp, 0x24] - cmp r0, 0 - bge _0803B352 - adds r0, 0x3 -_0803B352: - asrs r0, 2 - adds r0, r1, r0 - ldr r1, [sp] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - adds r0, 0x5 - str r0, [sp, 0xC] - adds r0, r5, 0 - bl GetNature - lsls r0, 24 - lsrs r0, 24 - add r4, sp, 0xC - ldrh r1, [r4] - movs r2, 0x2 - bl nature_stat_mod - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0xC] - adds r0, r5, 0 - movs r1, 0x3C - adds r2, r4, 0 - bl SetMonData - ldrb r0, [r6, 0x3] - lsls r0, 1 - ldr r2, [sp, 0x28] - adds r1, r0, r2 - ldr r0, [sp, 0x2C] - cmp r0, 0 - bge _0803B398 - adds r0, 0x3 -_0803B398: - asrs r0, 2 - adds r0, r1, r0 - ldr r1, [sp] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - adds r0, 0x5 - str r0, [sp, 0x10] - adds r0, r5, 0 - bl GetNature - lsls r0, 24 - lsrs r0, 24 - add r4, sp, 0x10 - ldrh r1, [r4] - movs r2, 0x3 - bl nature_stat_mod - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x10] - adds r0, r5, 0 - movs r1, 0x3D - adds r2, r4, 0 - bl SetMonData - ldrb r0, [r6, 0x4] - lsls r0, 1 - ldr r3, [sp, 0x30] - adds r1, r0, r3 - ldr r0, [sp, 0x34] - cmp r0, 0 - bge _0803B3DE - adds r0, 0x3 -_0803B3DE: - asrs r0, 2 - adds r0, r1, r0 - ldr r1, [sp] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - adds r0, 0x5 - str r0, [sp, 0x14] - adds r0, r5, 0 - bl GetNature - lsls r0, 24 - lsrs r0, 24 - add r4, sp, 0x14 - ldrh r1, [r4] - movs r2, 0x4 - bl nature_stat_mod - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x14] - adds r0, r5, 0 - movs r1, 0x3E - adds r2, r4, 0 - bl SetMonData - ldrb r0, [r6, 0x5] - lsls r0, 1 - ldr r2, [sp, 0x38] - adds r1, r0, r2 - ldr r0, [sp, 0x3C] - cmp r0, 0 - bge _0803B424 - adds r0, 0x3 -_0803B424: - asrs r0, 2 - adds r0, r1, r0 - ldr r1, [sp] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - adds r0, 0x5 - str r0, [sp, 0x18] - adds r0, r5, 0 - bl GetNature - lsls r0, 24 - lsrs r0, 24 - add r4, sp, 0x18 - ldrh r1, [r4] - movs r2, 0x5 - bl nature_stat_mod - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x18] - adds r0, r5, 0 - movs r1, 0x3F - adds r2, r4, 0 - bl SetMonData - ldr r0, _0803B47C - cmp r7, r0 - bne _0803B480 - ldr r0, [sp, 0x1C] - cmp r0, 0 - bne _0803B46C - mov r3, r8 - cmp r3, 0 - bne _0803B4A4 -_0803B46C: - movs r0, 0x1 - b _0803B498 - .align 2, 0 -_0803B470: .4byte gBaseStats -_0803B474: .4byte 0x02000000 -_0803B478: .4byte 0x000160fa -_0803B47C: .4byte 0x0000012f -_0803B480: - ldr r1, [sp, 0x1C] - cmp r1, 0 - bne _0803B490 - mov r0, r8 - cmp r0, 0 - bne _0803B4A4 - ldr r0, [sp, 0x4] - b _0803B498 -_0803B490: - ldr r0, [sp, 0x4] - mov r2, r8 - subs r0, r2 - adds r0, r1, r0 -_0803B498: - str r0, [sp, 0x1C] - add r2, sp, 0x1C - adds r0, r5, 0 - movs r1, 0x39 - bl SetMonData -_0803B4A4: - add sp, 0x40 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end pokemon_calc_effective_stats - - thumb_func_start sub_803B4B4 -sub_803B4B4: @ 803B4B4 - push {r4,lr} - sub sp, 0x4 - adds r2, r0, 0 - adds r4, r1, 0 - movs r0, 0 - str r0, [sp] - adds r0, r4, 0 - adds r1, r2, 0 - movs r2, 0x50 - bl memcpy - adds r0, r4, 0 - movs r1, 0x37 - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x39 - mov r2, sp - bl SetMonData - adds r0, r4, 0 - movs r1, 0x3A - mov r2, sp - bl SetMonData - movs r0, 0xFF - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x40 - mov r2, sp - bl SetMonData - adds r0, r4, 0 - bl pokemon_calc_effective_stats - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_803B4B4 - - thumb_func_start level_by_exp -level_by_exp: @ 803B504 - push {r4-r6,lr} - adds r5, r0, 0 - movs r1, 0xB - movs r2, 0 - bl GetMonData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - adds r0, r5, 0 - movs r1, 0x19 - movs r2, 0 - bl GetMonData - adds r3, r0, 0 - movs r2, 0x1 - ldr r6, _0803B568 - ldr r1, _0803B56C - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - adds r1, r0, r1 - ldrb r0, [r1, 0x13] - movs r5, 0xCA - lsls r5, 1 - muls r0, r5 - adds r0, 0x4 - adds r0, r6 - ldr r0, [r0] - cmp r0, r3 - bhi _0803B55A - adds r4, r1, 0 -_0803B544: - adds r2, 0x1 - cmp r2, 0x64 - bgt _0803B55A - lsls r1, r2, 2 - ldrb r0, [r4, 0x13] - muls r0, r5 - adds r1, r0 - adds r1, r6 - ldr r0, [r1] - cmp r0, r3 - bls _0803B544 -_0803B55A: - subs r0, r2, 0x1 - lsls r0, 24 - lsrs r0, 24 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_0803B568: .4byte gExperienceTables -_0803B56C: .4byte gBaseStats - thumb_func_end level_by_exp - - thumb_func_start sub_803B570 -sub_803B570: @ 803B570 - push {r4-r6,lr} - adds r5, r0, 0 - movs r1, 0xB - movs r2, 0 - bl GetMonBoxData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - adds r0, r5, 0 - movs r1, 0x19 - movs r2, 0 - bl GetMonBoxData - adds r3, r0, 0 - movs r2, 0x1 - ldr r6, _0803B5D4 - ldr r1, _0803B5D8 - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - adds r1, r0, r1 - ldrb r0, [r1, 0x13] - movs r5, 0xCA - lsls r5, 1 - muls r0, r5 - adds r0, 0x4 - adds r0, r6 - ldr r0, [r0] - cmp r0, r3 - bhi _0803B5C6 - adds r4, r1, 0 -_0803B5B0: - adds r2, 0x1 - cmp r2, 0x64 - bgt _0803B5C6 - lsls r1, r2, 2 - ldrb r0, [r4, 0x13] - muls r0, r5 - adds r1, r0 - adds r1, r6 - ldr r0, [r1] - cmp r0, r3 - bls _0803B5B0 -_0803B5C6: - subs r0, r2, 0x1 - lsls r0, 24 - lsrs r0, 24 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_0803B5D4: .4byte gExperienceTables -_0803B5D8: .4byte gBaseStats - thumb_func_end sub_803B570 - - thumb_func_start pokemon_moveset_pad_ -pokemon_moveset_pad_: @ 803B5DC - push {lr} - lsls r1, 16 - lsrs r1, 16 - bl pokemon_moveset_pad - lsls r0, 16 - lsrs r0, 16 - pop {r1} - bx r1 - thumb_func_end pokemon_moveset_pad_ - - thumb_func_start pokemon_moveset_pad -pokemon_moveset_pad: @ 803B5F0 - push {r4-r7,lr} - sub sp, 0x4 - adds r7, r0, 0 - mov r0, sp - strh r1, [r0] - movs r5, 0 - mov r6, sp -_0803B5FE: - adds r4, r5, 0 - adds r4, 0xD - adds r0, r7, 0 - adds r1, r4, 0 - movs r2, 0 - bl GetMonBoxData - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0 - bne _0803B63C - adds r0, r7, 0 - adds r1, r4, 0 - mov r2, sp - bl SetMonBoxData - adds r1, r5, 0 - adds r1, 0x11 - ldrh r0, [r6] - lsls r2, r0, 1 - adds r2, r0 - lsls r2, 2 - ldr r0, _0803B638 - adds r2, r0 - adds r0, r7, 0 - bl SetMonBoxData - ldrh r0, [r6] - b _0803B654 - .align 2, 0 -_0803B638: .4byte gBattleMoves + 0x4 @ PP offset -_0803B63C: - ldrh r1, [r6] - cmp r0, r1 - bne _0803B64C - ldr r0, _0803B648 - b _0803B654 - .align 2, 0 -_0803B648: .4byte 0x0000fffe -_0803B64C: - adds r5, 0x1 - cmp r5, 0x3 - ble _0803B5FE - ldr r0, _0803B65C -_0803B654: - add sp, 0x4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0803B65C: .4byte 0x0000ffff - thumb_func_end pokemon_moveset_pad - - thumb_func_start sub_803B660 -sub_803B660: @ 803B660 - push {r4,r5,lr} - lsls r1, 16 - lsrs r4, r1, 16 - movs r3, 0 - adds r5, r0, 0 - adds r5, 0x24 - ldr r2, _0803B68C - lsls r1, r4, 1 - adds r1, r4 - lsls r1, 2 - adds r2, r1, r2 - adds r1, r0, 0 - adds r1, 0xC -_0803B67A: - ldrh r0, [r1] - cmp r0, 0 - bne _0803B690 - strh r4, [r1] - adds r1, r5, r3 - ldrb r0, [r2, 0x4] - strb r0, [r1] - adds r0, r4, 0 - b _0803B69A - .align 2, 0 -_0803B68C: .4byte gBattleMoves -_0803B690: - adds r1, 0x2 - adds r3, 0x1 - cmp r3, 0x3 - ble _0803B67A - ldr r0, _0803B6A0 -_0803B69A: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_0803B6A0: .4byte 0x0000ffff - thumb_func_end sub_803B660 - - thumb_func_start sub_803B6A4 -sub_803B6A4: @ 803B6A4 - push {r4,r5,lr} - sub sp, 0x4 - adds r5, r0, 0 - adds r4, r2, 0 - mov r0, sp - strh r1, [r0] - lsls r4, 24 - lsrs r4, 24 - adds r1, r4, 0 - adds r1, 0xD - adds r0, r5, 0 - mov r2, sp - bl SetMonData - adds r4, 0x11 - mov r0, sp - ldrh r0, [r0] - lsls r2, r0, 1 - adds r2, r0 - lsls r2, 2 - ldr r0, _0803B6E0 - adds r2, r0 - adds r0, r5, 0 - adds r1, r4, 0 - bl SetMonData - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803B6E0: .4byte gBattleMoves + 0x4 @ PP offset - thumb_func_end sub_803B6A4 - - thumb_func_start sub_803B6E4 -sub_803B6E4: @ 803B6E4 - push {r4,lr} - lsls r1, 16 - lsrs r1, 16 - lsls r2, 24 - lsrs r2, 24 - lsls r4, r2, 1 - adds r3, r0, 0 - adds r3, 0xC - adds r3, r4 - strh r1, [r3] - adds r0, 0x24 - adds r0, r2 - ldr r3, _0803B710 - lsls r2, r1, 1 - adds r2, r1 - lsls r2, 2 - adds r2, r3 - ldrb r1, [r2, 0x4] - strb r1, [r0] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0803B710: .4byte gBattleMoves - thumb_func_end sub_803B6E4 - - thumb_func_start unref_sub_803B714 -unref_sub_803B714: @ 803B714 - push {lr} - bl sub_803B720 - pop {r0} - bx r0 - thumb_func_end unref_sub_803B714 - - thumb_func_start sub_803B720 -sub_803B720: @ 803B720 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r8, r0 - movs r1, 0xB - movs r2, 0 - bl GetMonBoxData - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - mov r0, r8 - bl sub_803B570 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - ldr r0, _0803B7BC - lsls r6, r4, 2 - adds r0, r6, r0 - ldr r0, [r0] - ldrh r1, [r0] - ldr r2, _0803B7C0 - lsrs r0, r2, 16 - cmp r1, r0 - beq _0803B7AC - mov r9, r2 - movs r3, 0 -_0803B75E: - ldr r0, _0803B7BC - adds r7, r6, r0 - ldr r0, [r7] - adds r0, r3, r0 - ldrh r2, [r0] - movs r1, 0xFE - lsls r1, 8 - adds r0, r1, 0 - ands r0, r2 - mov r4, r10 - lsls r1, r4, 9 - cmp r0, r1 - bgt _0803B7AC - ldr r1, _0803B7C4 - adds r0, r1, 0 - adds r4, r0, 0 - ands r4, r2 - mov r0, r8 - adds r1, r4, 0 - str r3, [sp] - bl pokemon_moveset_pad - lsls r0, 16 - mov r1, r9 - lsrs r5, r1, 16 - ldr r3, [sp] - cmp r0, r9 - bne _0803B7A0 - mov r0, r8 - adds r1, r4, 0 - bl sub_803B980 - ldr r3, [sp] -_0803B7A0: - adds r3, 0x2 - ldr r0, [r7] - adds r0, r3, r0 - ldrh r0, [r0] - cmp r0, r5 - bne _0803B75E -_0803B7AC: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803B7BC: .4byte gLevelUpLearnsetPointers -_0803B7C0: .4byte 0xffff0000 -_0803B7C4: .4byte 0x000001ff - thumb_func_end sub_803B720 - - thumb_func_start sub_803B7C8 -sub_803B7C8: @ 803B7C8 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r8, r0 - lsls r4, r1, 24 - lsrs r4, 24 - movs r0, 0 - str r0, [sp] - mov r0, r8 - movs r1, 0xB - movs r2, 0 - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - mov r9, r0 - mov r0, r8 - movs r1, 0x38 - movs r2, 0 - bl GetMonData - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - cmp r4, 0 - beq _0803B860 - ldr r4, _0803B84C - mov r1, sp - ldrb r1, [r1] - strb r1, [r4] - ldr r2, _0803B850 - mov r5, r9 - lsls r3, r5, 2 - adds r5, r3, r2 - ldr r0, [r5] - ldrh r1, [r0] - movs r7, 0xFE - lsls r7, 8 - adds r0, r7, 0 - ands r0, r1 - adds r6, r4, 0 - mov r12, r2 - mov r1, r10 - lsls r4, r1, 9 - cmp r0, r4 - beq _0803B888 - adds r2, r6, 0 - ldr r0, _0803B854 - mov r12, r0 - adds r6, r7, 0 - adds r3, r5, 0 -_0803B834: - ldrb r0, [r2] - adds r0, 0x1 - strb r0, [r2] - ldrb r0, [r2] - ldr r1, [r3] - lsls r0, 1 - adds r0, r1 - ldrh r1, [r0] - cmp r1, r12 - bne _0803B858 - movs r0, 0 - b _0803B8B4 - .align 2, 0 -_0803B84C: .4byte 0x02024e88 -_0803B850: .4byte gLevelUpLearnsetPointers -_0803B854: .4byte 0x0000ffff -_0803B858: - adds r0, r6, 0 - ands r0, r1 - cmp r0, r4 - bne _0803B834 -_0803B860: - ldr r3, _0803B8C4 - mov r1, r9 - lsls r4, r1, 2 - adds r1, r4, r3 - ldr r2, _0803B8C8 - ldrb r0, [r2] - ldr r1, [r1] - lsls r0, 1 - adds r0, r1 - ldrh r1, [r0] - movs r0, 0xFE - lsls r0, 8 - ands r0, r1 - mov r5, r10 - lsls r1, r5, 9 - adds r6, r2, 0 - mov r12, r3 - adds r3, r4, 0 - cmp r0, r1 - bne _0803B8B2 -_0803B888: - ldr r2, _0803B8CC - mov r0, r12 - adds r1, r3, r0 - ldrb r0, [r6] - ldr r1, [r1] - lsls r0, 1 - adds r0, r1 - ldrh r1, [r0] - ldr r0, _0803B8D0 - ands r0, r1 - strh r0, [r2] - ldrb r0, [r6] - adds r0, 0x1 - strb r0, [r6] - ldrh r1, [r2] - mov r0, r8 - bl pokemon_moveset_pad_ - lsls r0, 16 - lsrs r0, 16 - str r0, [sp] -_0803B8B2: - ldr r0, [sp] -_0803B8B4: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0803B8C4: .4byte gLevelUpLearnsetPointers -_0803B8C8: .4byte 0x02024e88 -_0803B8CC: .4byte 0x02024e82 -_0803B8D0: .4byte 0x000001ff - thumb_func_end sub_803B7C8 - - thumb_func_start sub_803B8D4 -sub_803B8D4: @ 803B8D4 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x10 - adds r6, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r8, r1 - movs r4, 0 - add r7, sp, 0x8 - add r0, sp, 0xC - mov r9, r0 - mov r5, sp -_0803B8F0: - adds r1, r4, 0 - adds r1, 0xE - adds r0, r6, 0 - movs r2, 0 - bl GetMonData - strh r0, [r5] - adds r1, r4, 0 - adds r1, 0x12 - adds r0, r6, 0 - movs r2, 0 - bl GetMonData - adds r1, r7, r4 - strb r0, [r1] - adds r5, 0x2 - adds r4, 0x1 - cmp r4, 0x2 - ble _0803B8F0 - adds r0, r6, 0 - movs r1, 0x15 - movs r2, 0 - bl GetMonData - mov r1, r9 - strb r0, [r1] - ldrb r0, [r1] - lsrs r0, 2 - strb r0, [r1] - mov r0, sp - mov r2, r8 - strh r2, [r0, 0x6] - ldr r1, _0803B97C - mov r2, r8 - lsls r0, r2, 1 - add r0, r8 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x4] - strb r0, [r7, 0x3] - movs r4, 0 - mov r5, sp -_0803B944: - adds r1, r4, 0 - adds r1, 0xD - adds r0, r6, 0 - adds r2, r5, 0 - bl SetMonData - adds r1, r4, 0 - adds r1, 0x11 - adds r2, r7, r4 - adds r0, r6, 0 - bl SetMonData - adds r5, 0x2 - adds r4, 0x1 - cmp r4, 0x3 - ble _0803B944 - adds r0, r6, 0 - movs r1, 0x15 - mov r2, r9 - bl SetMonData - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803B97C: .4byte gBattleMoves - thumb_func_end sub_803B8D4 - - thumb_func_start sub_803B980 -sub_803B980: @ 803B980 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x10 - adds r6, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r8, r1 - movs r4, 0 - add r7, sp, 0x8 - add r0, sp, 0xC - mov r9, r0 - mov r5, sp -_0803B99C: - adds r1, r4, 0 - adds r1, 0xE - adds r0, r6, 0 - movs r2, 0 - bl GetMonBoxData - strh r0, [r5] - adds r1, r4, 0 - adds r1, 0x12 - adds r0, r6, 0 - movs r2, 0 - bl GetMonBoxData - adds r1, r7, r4 - strb r0, [r1] - adds r5, 0x2 - adds r4, 0x1 - cmp r4, 0x2 - ble _0803B99C - adds r0, r6, 0 - movs r1, 0x15 - movs r2, 0 - bl GetMonBoxData - mov r1, r9 - strb r0, [r1] - ldrb r0, [r1] - lsrs r0, 2 - strb r0, [r1] - mov r0, sp - mov r2, r8 - strh r2, [r0, 0x6] - ldr r1, _0803BA28 - mov r2, r8 - lsls r0, r2, 1 - add r0, r8 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x4] - strb r0, [r7, 0x3] - movs r4, 0 - mov r5, sp -_0803B9F0: - adds r1, r4, 0 - adds r1, 0xD - adds r0, r6, 0 - adds r2, r5, 0 - bl SetMonBoxData - adds r1, r4, 0 - adds r1, 0x11 - adds r2, r7, r4 - adds r0, r6, 0 - bl SetMonBoxData - adds r5, 0x2 - adds r4, 0x1 - cmp r4, 0x3 - ble _0803B9F0 - adds r0, r6, 0 - movs r1, 0x15 - mov r2, r9 - bl SetMonBoxData - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803BA28: .4byte gBattleMoves - thumb_func_end sub_803B980 - - thumb_func_start sub_803BA2C -sub_803BA2C: @ 803BA2C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x2C - adds r7, r0, 0 - str r1, [sp, 0x4] - str r2, [sp, 0x8] - ldr r0, [sp, 0x4C] - ldr r1, [sp, 0x50] - ldr r2, [sp, 0x54] - ldr r4, [sp, 0x58] - lsls r3, 16 - lsrs r3, 16 - str r3, [sp, 0xC] - lsls r0, 16 - lsrs r3, r0, 16 - lsls r1, 24 - lsrs r6, r1, 24 - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0x10] - lsls r4, 24 - lsrs r4, 24 - movs r5, 0 - cmp r3, 0 - bne _0803BA80 - ldr r2, _0803BA78 - ldr r1, _0803BA7C - ldr r3, [sp, 0x8] - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x1] - strh r0, [r2] - b _0803BA84 - .align 2, 0 -_0803BA78: .4byte 0x02024e80 -_0803BA7C: .4byte gBattleMoves -_0803BA80: - ldr r0, _0803BA9C - strh r3, [r0] -_0803BA84: - cmp r6, 0 - bne _0803BAA4 - ldr r1, _0803BAA0 - ldr r6, [sp, 0x8] - lsls r0, r6, 1 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x2] - mov r9, r0 - b _0803BAAE - .align 2, 0 -_0803BA9C: .4byte 0x02024e80 -_0803BAA0: .4byte gBattleMoves -_0803BAA4: - movs r0, 0x3F - mov r9, r0 - mov r1, r9 - ands r1, r6 - mov r9, r1 -_0803BAAE: - ldrh r6, [r7, 0x2] - ldr r2, [sp, 0x4] - ldrh r2, [r2, 0x4] - str r2, [sp, 0x14] - ldrh r3, [r7, 0x8] - mov r8, r3 - ldr r0, [sp, 0x4] - ldrh r0, [r0, 0xA] - str r0, [sp, 0x18] - ldrh r0, [r7, 0x2E] - cmp r0, 0xAF - bne _0803BAE0 - ldr r1, _0803BADC - ldr r2, [sp, 0x10] - lsls r0, r2, 3 - subs r0, r2 - lsls r0, 2 - adds r0, r1 - ldrb r3, [r0, 0x7] - mov r10, r3 - ldrb r0, [r0, 0x1A] - b _0803BAF6 - .align 2, 0 -_0803BADC: .4byte 0x02024df0 -_0803BAE0: - ldrh r0, [r7, 0x2E] - bl itemid_get_x12 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - ldrh r0, [r7, 0x2E] - bl itemid_get_quality - lsls r0, 24 - lsrs r0, 24 -_0803BAF6: - str r0, [sp, 0x20] - ldr r1, [sp, 0x4] - ldrh r0, [r1, 0x2E] - cmp r0, 0xAF - bne _0803BB26 - ldr r1, _0803BB10 - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x7] - str r0, [sp, 0x1C] - b _0803BB3C - .align 2, 0 -_0803BB10: .4byte 0x02024df0 -_0803BB14: - ldr r0, [sp, 0x20] - adds r0, 0x64 - muls r0, r6 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r6, r0, 16 - b _0803BCDC -_0803BB26: - ldr r2, [sp, 0x4] - ldrh r0, [r2, 0x2E] - bl itemid_get_x12 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x1C] - ldr r3, [sp, 0x4] - ldrh r0, [r3, 0x2E] - bl itemid_get_quality -_0803BB3C: - adds r0, r7, 0 - adds r0, 0x20 - ldrb r1, [r0] - str r0, [sp, 0x24] - cmp r1, 0x25 - beq _0803BB4C - cmp r1, 0x4A - bne _0803BB50 -_0803BB4C: - lsls r0, r6, 17 - lsrs r6, r0, 16 -_0803BB50: - ldr r0, _0803BCB8 - ldrh r1, [r0] - ldr r0, _0803BCBC - ands r0, r1 - cmp r0, 0 - beq _0803BB5E - b _0803BC78 -_0803BB5E: - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _0803BB98 - ldr r0, _0803BCC0 - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 3 - cmp r1, r0 - beq _0803BB98 - ldr r0, _0803BCC4 - bl FlagGet - lsls r0, 24 - cmp r0, 0 - beq _0803BB98 - ldr r0, [sp, 0x10] - bl battle_side_get_owner - lsls r0, 24 - cmp r0, 0 - bne _0803BB98 - movs r0, 0x6E - muls r0, r6 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r6, r0, 16 -_0803BB98: - ldr r0, _0803BCB8 - ldrh r1, [r0] - ldr r0, _0803BCBC - ands r0, r1 - cmp r0, 0 - bne _0803BC78 - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _0803BBE2 - ldr r0, _0803BCC0 - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 3 - cmp r1, r0 - beq _0803BBE2 - ldr r0, _0803BCC8 - bl FlagGet - lsls r0, 24 - cmp r0, 0 - beq _0803BBE2 - adds r0, r4, 0 - bl battle_side_get_owner - lsls r0, 24 - cmp r0, 0 - bne _0803BBE2 - movs r0, 0x6E - ldr r1, [sp, 0x14] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x14] -_0803BBE2: - ldr r0, _0803BCB8 - ldrh r1, [r0] - ldr r0, _0803BCBC - ands r0, r1 - cmp r0, 0 - bne _0803BC78 - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _0803BC2E - ldr r0, _0803BCC0 - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 3 - cmp r1, r0 - beq _0803BC2E - ldr r0, _0803BCCC - bl FlagGet - lsls r0, 24 - cmp r0, 0 - beq _0803BC2E - ldr r0, [sp, 0x10] - bl battle_side_get_owner - lsls r0, 24 - cmp r0, 0 - bne _0803BC2E - movs r0, 0x6E - mov r2, r8 - muls r2, r0 - adds r0, r2, 0 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - mov r8, r0 -_0803BC2E: - ldr r0, _0803BCB8 - ldrh r1, [r0] - ldr r0, _0803BCBC - ands r0, r1 - cmp r0, 0 - bne _0803BC78 - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _0803BC78 - ldr r0, _0803BCC0 - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 3 - cmp r1, r0 - beq _0803BC78 - ldr r0, _0803BCCC - bl FlagGet - lsls r0, 24 - cmp r0, 0 - beq _0803BC78 - adds r0, r4, 0 - bl battle_side_get_owner - lsls r0, 24 - cmp r0, 0 - bne _0803BC78 - movs r0, 0x6E - ldr r3, [sp, 0x18] - muls r0, r3 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x18] -_0803BC78: - movs r2, 0 - ldr r4, _0803BCD0 - ldr r0, [sp, 0x4] - adds r0, 0x20 - str r0, [sp, 0x28] - adds r3, r4, 0 -_0803BC84: - lsls r1, r2, 1 - ldrb r0, [r3] - cmp r10, r0 - bne _0803BCD4 - adds r0, r4, 0x1 - adds r0, r1, r0 - ldrb r0, [r0] - cmp r9, r0 - bne _0803BCD4 - mov r1, r9 - cmp r1, 0x8 - bhi _0803BC9E - b _0803BB14 -_0803BC9E: - ldr r0, [sp, 0x20] - adds r0, 0x64 - mov r2, r8 - muls r2, r0 - adds r0, r2, 0 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - mov r8, r0 - b _0803BCDC - .align 2, 0 -_0803BCB8: .4byte 0x020239f8 -_0803BCBC: .4byte 0x00000902 -_0803BCC0: .4byte 0x0202ff5e -_0803BCC4: .4byte 0x00000807 -_0803BCC8: .4byte 0x0000080b -_0803BCCC: .4byte 0x0000080d -_0803BCD0: .4byte gHoldEffectToType -_0803BCD4: - adds r3, 0x2 - adds r2, 0x1 - cmp r2, 0x10 - bls _0803BC84 -_0803BCDC: - mov r3, r10 - cmp r3, 0x1D - bne _0803BCF0 - movs r0, 0x96 - muls r0, r6 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r6, r0, 16 -_0803BCF0: - mov r0, r10 - cmp r0, 0x22 - bne _0803BD28 - ldr r0, _0803BFDC - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 1 - ands r0, r1 - cmp r0, 0 - bne _0803BD28 - ldr r1, _0803BFE0 - adds r0, r1, 0 - ldrh r2, [r7] - adds r0, r2 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bhi _0803BD28 - movs r0, 0x96 - mov r3, r8 - muls r3, r0 - adds r0, r3, 0 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - mov r8, r0 -_0803BD28: - ldr r0, [sp, 0x1C] - cmp r0, 0x22 - bne _0803BD60 - ldr r0, _0803BFDC - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 1 - ands r0, r1 - cmp r0, 0 - bne _0803BD60 - ldr r1, _0803BFE0 - adds r0, r1, 0 - ldr r2, [sp, 0x4] - ldrh r2, [r2] - adds r0, r2 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bhi _0803BD60 - movs r0, 0x96 - ldr r3, [sp, 0x18] - muls r0, r3 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x18] -_0803BD60: - mov r0, r10 - cmp r0, 0x23 - bne _0803BD76 - ldrh r1, [r7] - ldr r0, _0803BFE4 - cmp r1, r0 - bne _0803BD76 - mov r1, r8 - lsls r0, r1, 17 - lsrs r0, 16 - mov r8, r0 -_0803BD76: - ldr r2, [sp, 0x1C] - cmp r2, 0x24 - bne _0803BD8E - ldr r3, [sp, 0x4] - ldrh r1, [r3] - ldr r0, _0803BFE4 - cmp r1, r0 - bne _0803BD8E - ldr r1, [sp, 0x18] - lsls r0, r1, 17 - lsrs r0, 16 - str r0, [sp, 0x18] -_0803BD8E: - mov r2, r10 - cmp r2, 0x2D - bne _0803BDA2 - ldrh r0, [r7] - cmp r0, 0x19 - bne _0803BDA2 - mov r3, r8 - lsls r0, r3, 17 - lsrs r0, 16 - mov r8, r0 -_0803BDA2: - ldr r0, [sp, 0x1C] - cmp r0, 0x40 - bne _0803BDB8 - ldr r1, [sp, 0x4] - ldrh r0, [r1] - cmp r0, 0x84 - bne _0803BDB8 - ldr r2, [sp, 0x14] - lsls r0, r2, 17 - lsrs r0, 16 - str r0, [sp, 0x14] -_0803BDB8: - mov r3, r10 - cmp r3, 0x41 - bne _0803BDCE - ldrh r0, [r7] - subs r0, 0x68 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bhi _0803BDCE - lsls r0, r6, 17 - lsrs r6, r0, 16 -_0803BDCE: - ldr r1, [sp, 0x28] - ldrb r0, [r1] - cmp r0, 0x2F - bne _0803BDE6 - mov r2, r9 - cmp r2, 0xA - beq _0803BDE0 - cmp r2, 0xF - bne _0803BDE6 -_0803BDE0: - mov r3, r8 - lsrs r3, 1 - mov r8, r3 -_0803BDE6: - ldr r0, [sp, 0x24] - ldrb r4, [r0] - cmp r4, 0x37 - bne _0803BDFC - movs r0, 0x96 - muls r0, r6 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r6, r0, 16 -_0803BDFC: - cmp r4, 0x39 - bne _0803BE2A - movs r0, 0 - str r0, [sp] - movs r0, 0xE - movs r1, 0 - movs r2, 0x3A - movs r3, 0 - bl sub_8018324 - lsls r0, 24 - cmp r0, 0 - beq _0803BE2A - movs r0, 0x96 - mov r1, r8 - muls r1, r0 - adds r0, r1, 0 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - mov r8, r0 -_0803BE2A: - ldr r2, [sp, 0x24] - ldrb r0, [r2] - cmp r0, 0x3A - bne _0803BE5C - movs r0, 0 - str r0, [sp] - movs r0, 0xE - movs r1, 0 - movs r2, 0x39 - movs r3, 0 - bl sub_8018324 - lsls r0, 24 - cmp r0, 0 - beq _0803BE5C - movs r0, 0x96 - mov r3, r8 - muls r3, r0 - adds r0, r3, 0 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - mov r8, r0 -_0803BE5C: - ldr r1, [sp, 0x24] - ldrb r0, [r1] - cmp r0, 0x3E - bne _0803BE78 - ldr r0, [r7, 0x4C] - cmp r0, 0 - beq _0803BE78 - movs r0, 0x96 - muls r0, r6 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r6, r0, 16 -_0803BE78: - ldr r2, [sp, 0x28] - ldrb r0, [r2] - cmp r0, 0x3F - bne _0803BE9A - ldr r3, [sp, 0x4] - ldr r0, [r3, 0x4C] - cmp r0, 0 - beq _0803BE9A - movs r0, 0x96 - ldr r1, [sp, 0x14] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x14] -_0803BE9A: - mov r2, r9 - cmp r2, 0xD - bne _0803BEBE - movs r0, 0 - str r0, [sp] - movs r0, 0xE - movs r1, 0 - movs r2, 0 - movs r3, 0xFD - bl sub_8018324 - lsls r0, 24 - cmp r0, 0 - beq _0803BEBE - ldr r1, _0803BFE8 - ldrh r0, [r1] - lsrs r0, 1 - strh r0, [r1] -_0803BEBE: - mov r3, r9 - cmp r3, 0xA - bne _0803BEE2 - movs r0, 0 - str r0, [sp] - movs r0, 0xE - movs r1, 0 - movs r2, 0 - movs r3, 0xFE - bl sub_8018324 - lsls r0, 24 - cmp r0, 0 - beq _0803BEE2 - ldr r1, _0803BFE8 - ldrh r0, [r1] - lsrs r0, 1 - strh r0, [r1] -_0803BEE2: - mov r0, r9 - cmp r0, 0xC - bne _0803BF12 - ldr r1, [sp, 0x24] - ldrb r0, [r1] - cmp r0, 0x41 - bne _0803BF12 - ldrh r0, [r7, 0x2C] - movs r1, 0x3 - bl __udivsi3 - ldrh r1, [r7, 0x28] - lsls r0, 16 - lsrs r0, 16 - cmp r1, r0 - bhi _0803BF12 - ldr r4, _0803BFE8 - ldrh r1, [r4] - movs r0, 0x96 - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - strh r0, [r4] -_0803BF12: - mov r2, r9 - cmp r2, 0xA - bne _0803BF42 - ldr r3, [sp, 0x24] - ldrb r0, [r3] - cmp r0, 0x42 - bne _0803BF42 - ldrh r0, [r7, 0x2C] - movs r1, 0x3 - bl __udivsi3 - ldrh r1, [r7, 0x28] - lsls r0, 16 - lsrs r0, 16 - cmp r1, r0 - bhi _0803BF42 - ldr r4, _0803BFE8 - ldrh r1, [r4] - movs r0, 0x96 - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - strh r0, [r4] -_0803BF42: - mov r0, r9 - cmp r0, 0xB - bne _0803BF72 - ldr r1, [sp, 0x24] - ldrb r0, [r1] - cmp r0, 0x43 - bne _0803BF72 - ldrh r0, [r7, 0x2C] - movs r1, 0x3 - bl __udivsi3 - ldrh r1, [r7, 0x28] - lsls r0, 16 - lsrs r0, 16 - cmp r1, r0 - bhi _0803BF72 - ldr r4, _0803BFE8 - ldrh r1, [r4] - movs r0, 0x96 - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - strh r0, [r4] -_0803BF72: - mov r2, r9 - cmp r2, 0x6 - bne _0803BFA2 - ldr r3, [sp, 0x24] - ldrb r0, [r3] - cmp r0, 0x44 - bne _0803BFA2 - ldrh r0, [r7, 0x2C] - movs r1, 0x3 - bl __udivsi3 - ldrh r1, [r7, 0x28] - lsls r0, 16 - lsrs r0, 16 - cmp r1, r0 - bhi _0803BFA2 - ldr r4, _0803BFE8 - ldrh r1, [r4] - movs r0, 0x96 - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - strh r0, [r4] -_0803BFA2: - ldr r2, _0803BFEC - ldr r0, _0803BFF0 - ldrh r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0] - cmp r0, 0x7 - bne _0803BFBC - ldr r0, [sp, 0x14] - lsrs r0, 1 - str r0, [sp, 0x14] -_0803BFBC: - mov r1, r9 - cmp r1, 0x8 - bls _0803BFC4 - b _0803C122 -_0803BFC4: - ldr r0, _0803BFF4 - ldrb r1, [r0] - adds r4, r0, 0 - cmp r1, 0x2 - bne _0803C000 - movs r0, 0x19 - ldrsb r0, [r7, r0] - cmp r0, 0x6 - ble _0803BFFC - ldr r2, _0803BFF8 - b _0803C006 - .align 2, 0 -_0803BFDC: .4byte 0x020239f8 -_0803BFE0: .4byte 0xfffffe69 -_0803BFE4: .4byte 0x00000175 -_0803BFE8: .4byte 0x02024e80 -_0803BFEC: .4byte gBattleMoves -_0803BFF0: .4byte 0x02024be6 -_0803BFF4: .4byte 0x02024c0d -_0803BFF8: .4byte gStatStageRatios -_0803BFFC: - adds r5, r6, 0 - b _0803C01E -_0803C000: - ldr r2, _0803C050 - movs r0, 0x19 - ldrsb r0, [r7, r0] -_0803C006: - lsls r0, 1 - adds r1, r0, r2 - ldrb r1, [r1] - adds r5, r6, 0 - muls r5, r1 - adds r2, 0x1 - adds r0, r2 - ldrb r1, [r0] - adds r0, r5, 0 - bl __divsi3 - adds r5, r0, 0 -_0803C01E: - ldr r0, _0803C054 - ldrh r0, [r0] - muls r5, r0 - adds r0, r7, 0 - adds r0, 0x2A - ldrb r0, [r0] - lsls r0, 1 - movs r1, 0x5 - bl __divsi3 - adds r0, 0x2 - muls r5, r0 - ldrb r0, [r4] - cmp r0, 0x2 - bne _0803C05C - ldr r2, [sp, 0x4] - movs r0, 0x1A - ldrsb r0, [r2, r0] - cmp r0, 0x5 - bgt _0803C058 - ldr r2, _0803C050 - ldr r3, [sp, 0x4] - movs r0, 0x1A - ldrsb r0, [r3, r0] - b _0803C064 - .align 2, 0 -_0803C050: .4byte gStatStageRatios -_0803C054: .4byte 0x02024e80 -_0803C058: - ldr r3, [sp, 0x14] - b _0803C07E -_0803C05C: - ldr r2, _0803C0DC - ldr r1, [sp, 0x4] - movs r0, 0x1A - ldrsb r0, [r1, r0] -_0803C064: - lsls r0, 1 - adds r1, r0, r2 - ldrb r1, [r1] - ldr r6, [sp, 0x14] - adds r3, r6, 0 - muls r3, r1 - adds r2, 0x1 - adds r0, r2 - ldrb r1, [r0] - adds r0, r3, 0 - bl __divsi3 - adds r3, r0, 0 -_0803C07E: - adds r0, r5, 0 - adds r1, r3, 0 - bl __divsi3 - adds r5, r0, 0 - movs r1, 0x32 - bl __divsi3 - adds r5, r0, 0 - ldr r0, [r7, 0x4C] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0803C0A8 - ldr r1, [sp, 0x24] - ldrb r0, [r1] - cmp r0, 0x3E - beq _0803C0A8 - lsrs r0, r5, 31 - adds r0, r5, r0 - asrs r5, r0, 1 -_0803C0A8: - movs r0, 0x1 - ldr r2, [sp, 0xC] - ands r0, r2 - cmp r0, 0 - beq _0803C0EA - ldrb r1, [r4] - cmp r1, 0x1 - bne _0803C0EA - ldr r0, _0803C0E0 - ldrh r0, [r0] - ands r1, r0 - cmp r1, 0 - beq _0803C0E4 - movs r0, 0x2 - bl sub_803C348 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - bne _0803C0E4 - adds r0, r5, 0 - movs r1, 0x3 - bl __divsi3 - lsls r5, r0, 1 - b _0803C0EA - .align 2, 0 -_0803C0DC: .4byte gStatStageRatios -_0803C0E0: .4byte 0x020239f8 -_0803C0E4: - lsrs r0, r5, 31 - adds r0, r5, r0 - asrs r5, r0, 1 -_0803C0EA: - ldr r0, _0803C148 - ldrh r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0803C11C - ldr r0, _0803C14C - ldr r3, [sp, 0x8] - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x6] - cmp r0, 0x8 - bne _0803C11C - movs r0, 0x2 - bl sub_803C348 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - bne _0803C11C - lsrs r0, r5, 31 - adds r0, r5, r0 - asrs r5, r0, 1 -_0803C11C: - cmp r5, 0 - bne _0803C122 - movs r5, 0x1 -_0803C122: - mov r6, r9 - cmp r6, 0x9 - bne _0803C12A - movs r5, 0 -_0803C12A: - mov r0, r9 - cmp r0, 0x9 - bhi _0803C132 - b _0803C330 -_0803C132: - ldr r0, _0803C150 - ldrb r1, [r0] - adds r4, r0, 0 - cmp r1, 0x2 - bne _0803C15C - movs r0, 0x1C - ldrsb r0, [r7, r0] - cmp r0, 0x6 - ble _0803C158 - ldr r2, _0803C154 - b _0803C162 - .align 2, 0 -_0803C148: .4byte 0x020239f8 -_0803C14C: .4byte gBattleMoves -_0803C150: .4byte 0x02024c0d -_0803C154: .4byte gStatStageRatios -_0803C158: - mov r5, r8 - b _0803C17A -_0803C15C: - ldr r2, _0803C1A8 - movs r0, 0x1C - ldrsb r0, [r7, r0] -_0803C162: - lsls r0, 1 - adds r1, r0, r2 - ldrb r1, [r1] - mov r5, r8 - muls r5, r1 - adds r2, 0x1 - adds r0, r2 - ldrb r1, [r0] - adds r0, r5, 0 - bl __divsi3 - adds r5, r0, 0 -_0803C17A: - ldr r0, _0803C1AC - ldrh r0, [r0] - muls r5, r0 - adds r0, r7, 0 - adds r0, 0x2A - ldrb r0, [r0] - lsls r0, 1 - movs r1, 0x5 - bl __divsi3 - adds r0, 0x2 - muls r5, r0 - ldrb r0, [r4] - cmp r0, 0x2 - bne _0803C1B4 - ldr r1, [sp, 0x4] - movs r0, 0x1D - ldrsb r0, [r1, r0] - cmp r0, 0x5 - bgt _0803C1B0 - ldr r2, _0803C1A8 - b _0803C1BC - .align 2, 0 -_0803C1A8: .4byte gStatStageRatios -_0803C1AC: .4byte 0x02024e80 -_0803C1B0: - ldr r3, [sp, 0x18] - b _0803C1D6 -_0803C1B4: - ldr r2, _0803C21C - ldr r1, [sp, 0x4] - movs r0, 0x1D - ldrsb r0, [r1, r0] -_0803C1BC: - lsls r0, 1 - adds r1, r0, r2 - ldrb r1, [r1] - ldr r6, [sp, 0x18] - adds r3, r6, 0 - muls r3, r1 - adds r2, 0x1 - adds r0, r2 - ldrb r1, [r0] - adds r0, r3, 0 - bl __divsi3 - adds r3, r0, 0 -_0803C1D6: - adds r0, r5, 0 - adds r1, r3, 0 - bl __divsi3 - adds r5, r0, 0 - movs r1, 0x32 - bl __divsi3 - adds r5, r0, 0 - movs r0, 0x2 - ldr r1, [sp, 0xC] - ands r0, r1 - cmp r0, 0 - beq _0803C22A - ldrb r1, [r4] - cmp r1, 0x1 - bne _0803C22A - ldr r0, _0803C220 - ldrh r0, [r0] - ands r1, r0 - cmp r1, 0 - beq _0803C224 - movs r0, 0x2 - bl sub_803C348 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - bne _0803C224 - adds r0, r5, 0 - movs r1, 0x3 - bl __divsi3 - lsls r5, r0, 1 - b _0803C22A - .align 2, 0 -_0803C21C: .4byte gStatStageRatios -_0803C220: .4byte 0x020239f8 -_0803C224: - lsrs r0, r5, 31 - adds r0, r5, r0 - asrs r5, r0, 1 -_0803C22A: - ldr r0, _0803C2A4 - ldrh r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0803C25C - ldr r0, _0803C2A8 - ldr r2, [sp, 0x8] - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x6] - cmp r0, 0x8 - bne _0803C25C - movs r0, 0x2 - bl sub_803C348 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - bne _0803C25C - lsrs r0, r5, 31 - adds r0, r5, r0 - asrs r5, r0, 1 -_0803C25C: - movs r0, 0 - str r0, [sp] - movs r0, 0xE - movs r1, 0 - movs r2, 0xD - movs r3, 0 - bl sub_8018324 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _0803C30C - str r0, [sp] - movs r0, 0xE - movs r1, 0 - movs r2, 0x4D - movs r3, 0 - bl sub_8018324 - lsls r0, 24 - cmp r0, 0 - bne _0803C30C - ldr r2, _0803C2AC - ldrh r1, [r2] - movs r0, 0x1 - ands r0, r1 - adds r4, r2, 0 - cmp r0, 0 - beq _0803C2C4 - mov r3, r9 - cmp r3, 0xA - beq _0803C2B0 - cmp r3, 0xB - beq _0803C2B8 - b _0803C2C4 - .align 2, 0 -_0803C2A4: .4byte 0x020239f8 -_0803C2A8: .4byte gBattleMoves -_0803C2AC: .4byte 0x02024db8 -_0803C2B0: - lsrs r0, r5, 31 - adds r0, r5, r0 - asrs r5, r0, 1 - b _0803C2C4 -_0803C2B8: - lsls r0, r5, 4 - subs r0, r5 - movs r1, 0xA - bl __divsi3 - adds r5, r0, 0 -_0803C2C4: - ldrh r1, [r4] - movs r0, 0x9F - ands r0, r1 - cmp r0, 0 - beq _0803C2DC - ldr r0, _0803C2F4 - ldrh r0, [r0] - cmp r0, 0x4C - bne _0803C2DC - lsrs r0, r5, 31 - adds r0, r5, r0 - asrs r5, r0, 1 -_0803C2DC: - ldrh r1, [r4] - movs r0, 0x60 - ands r0, r1 - cmp r0, 0 - beq _0803C30C - mov r6, r9 - cmp r6, 0xA - beq _0803C2F8 - cmp r6, 0xB - beq _0803C306 - b _0803C30C - .align 2, 0 -_0803C2F4: .4byte 0x02024be6 -_0803C2F8: - lsls r0, r5, 4 - subs r0, r5 - movs r1, 0xA - bl __divsi3 - adds r5, r0, 0 - b _0803C30C -_0803C306: - lsrs r0, r5, 31 - adds r0, r5, r0 - asrs r5, r0, 1 -_0803C30C: - ldr r1, _0803C344 - ldr r2, [sp, 0x10] - lsls r0, r2, 2 - adds r0, r1 - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0803C330 - mov r3, r9 - cmp r3, 0xA - bne _0803C330 - lsls r0, r5, 4 - subs r0, r5 - movs r1, 0xA - bl __divsi3 - adds r5, r0, 0 -_0803C330: - adds r0, r5, 0x2 - add sp, 0x2C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0803C344: .4byte 0x02017100 - thumb_func_end sub_803BA2C - - thumb_func_start sub_803C348 -sub_803C348: @ 803C348 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - adds r1, r0, 0 - movs r6, 0 - cmp r0, 0x1 - beq _0803C39C - cmp r0, 0x1 - bgt _0803C360 - cmp r0, 0 - beq _0803C366 - b _0803C41E -_0803C360: - cmp r1, 0x2 - beq _0803C3E4 - b _0803C41E -_0803C366: - movs r5, 0 - ldr r0, _0803C390 - ldrb r3, [r0] - ldr r4, _0803C394 - ldr r2, _0803C398 -_0803C370: - cmp r5, r3 - beq _0803C384 - ldrb r0, [r4] - ldr r1, [r2] - ands r0, r1 - cmp r0, 0 - bne _0803C384 - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 -_0803C384: - adds r2, 0x4 - adds r5, 0x1 - cmp r5, 0x3 - ble _0803C370 - b _0803C41E - .align 2, 0 -_0803C390: .4byte 0x02024a60 -_0803C394: .4byte 0x02024c0c -_0803C398: .4byte gBitTable -_0803C39C: - movs r5, 0 -_0803C39E: - lsls r0, r5, 24 - lsrs r0, 24 - bl battle_side_get_owner - adds r4, r0, 0 - ldr r0, _0803C3D8 - ldrb r0, [r0] - bl battle_side_get_owner - lsls r4, 24 - lsls r0, 24 - cmp r4, r0 - bne _0803C3D0 - ldr r0, _0803C3DC - ldrb r1, [r0] - ldr r2, _0803C3E0 - lsls r0, r5, 2 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - bne _0803C3D0 - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 -_0803C3D0: - adds r5, 0x1 - cmp r5, 0x3 - ble _0803C39E - b _0803C41E - .align 2, 0 -_0803C3D8: .4byte 0x02024c07 -_0803C3DC: .4byte 0x02024c0c -_0803C3E0: .4byte gBitTable -_0803C3E4: - movs r5, 0 -_0803C3E6: - lsls r0, r5, 24 - lsrs r0, 24 - bl battle_side_get_owner - adds r4, r0, 0 - ldr r0, _0803C428 - ldrb r0, [r0] - bl battle_side_get_owner - lsls r4, 24 - lsls r0, 24 - cmp r4, r0 - bne _0803C418 - ldr r0, _0803C42C - ldrb r1, [r0] - ldr r2, _0803C430 - lsls r0, r5, 2 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - bne _0803C418 - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 -_0803C418: - adds r5, 0x1 - cmp r5, 0x3 - ble _0803C3E6 -_0803C41E: - adds r0, r6, 0 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_0803C428: .4byte 0x02024c08 -_0803C42C: .4byte 0x02024c0c -_0803C430: .4byte gBitTable - thumb_func_end sub_803C348 - - thumb_func_start sub_803C434 -sub_803C434: @ 803C434 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - bl battle_get_per_side_status - movs r1, 0x1 - movs r6, 0x1 - adds r4, r6, 0 - ands r4, r0 - eors r4, r1 - adds r5, r4, 0 - ldr r0, _0803C45C - ldrh r1, [r0] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - bne _0803C460 - adds r0, r4, 0 - b _0803C4AA - .align 2, 0 -_0803C45C: .4byte 0x020239f8 -_0803C460: - movs r0, 0 - bl sub_803C348 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bls _0803C484 - bl Random - adds r1, r6, 0 - ands r1, r0 - cmp r1, 0 - bne _0803C480 - movs r0, 0x2 - eors r0, r4 - b _0803C4AA -_0803C480: - adds r0, r4, 0 - b _0803C4AA -_0803C484: - ldr r0, _0803C49C - ldrb r1, [r0] - ldr r2, _0803C4A0 - lsls r0, r4, 2 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - bne _0803C4A4 - adds r0, r4, 0 - b _0803C4AA - .align 2, 0 -_0803C49C: .4byte 0x02024c0c -_0803C4A0: .4byte gBitTable -_0803C4A4: - movs r0, 0x2 - eors r5, r0 - adds r0, r5, 0 -_0803C4AA: - bl battle_get_side_with_given_state - lsls r0, 24 - lsrs r0, 24 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_803C434 - - thumb_func_start pokemon_get_gender -pokemon_get_gender: @ 803C4B8 - push {lr} - bl pokemon_roll_gender - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end pokemon_get_gender - - thumb_func_start pokemon_roll_gender -pokemon_roll_gender: @ 803C4C8 - push {r4,r5,lr} - adds r4, r0, 0 - movs r1, 0xB - movs r2, 0 - bl GetMonBoxData - lsls r0, 16 - lsrs r5, r0, 16 - adds r0, r4, 0 - movs r1, 0 - movs r2, 0 - bl GetMonBoxData - adds r2, r0, 0 - ldr r1, _0803C518 - lsls r0, r5, 3 - subs r0, r5 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x10] - cmp r0, 0 - beq _0803C51E - cmp r0, 0 - blt _0803C500 - cmp r0, 0xFF - bgt _0803C500 - cmp r0, 0xFE - bge _0803C51E -_0803C500: - ldr r1, _0803C518 - lsls r0, r5, 3 - subs r0, r5 - lsls r0, 2 - adds r0, r1 - ldrb r1, [r0, 0x10] - movs r0, 0xFF - ands r0, r2 - cmp r1, r0 - bhi _0803C51C - movs r0, 0 - b _0803C51E - .align 2, 0 -_0803C518: .4byte gBaseStats -_0803C51C: - movs r0, 0xFE -_0803C51E: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end pokemon_roll_gender - - thumb_func_start pokemon_species_get_gender_info -pokemon_species_get_gender_info: @ 803C524 - push {lr} - adds r3, r1, 0 - lsls r0, 16 - lsrs r2, r0, 16 - ldr r1, _0803C560 - lsls r0, r2, 3 - subs r0, r2 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x10] - cmp r0, 0 - beq _0803C566 - cmp r0, 0 - blt _0803C548 - cmp r0, 0xFF - bgt _0803C548 - cmp r0, 0xFE - bge _0803C566 -_0803C548: - lsls r0, r2, 3 - subs r0, r2 - lsls r0, 2 - adds r0, r1 - ldrb r1, [r0, 0x10] - movs r0, 0xFF - ands r0, r3 - cmp r1, r0 - bhi _0803C564 - movs r0, 0 - b _0803C566 - .align 2, 0 -_0803C560: .4byte gBaseStats -_0803C564: - movs r0, 0xFE -_0803C566: - pop {r1} - bx r1 - thumb_func_end pokemon_species_get_gender_info - - thumb_func_start gpu_pal_obj_decompress_and_apply -gpu_pal_obj_decompress_and_apply: @ 803C56C - push {r4-r6,lr} - lsls r1, 24 - lsrs r1, 24 - ldr r3, _0803C594 - ldr r4, _0803C598 - lsls r2, r1, 1 - adds r2, r1 - lsls r2, 3 - adds r1, r3, 0 - adds r2, r4 - ldm r2!, {r4-r6} - stm r1!, {r4-r6} - ldm r2!, {r4-r6} - stm r1!, {r4-r6} - strh r0, [r3, 0x2] - ldr r0, _0803C59C - str r0, [r3, 0x8] - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0803C594: .4byte 0x02024e8c -_0803C598: .4byte gSpriteTemplate_8208288 -_0803C59C: .4byte gSpriteAnimTable_81E7C64 - thumb_func_end gpu_pal_obj_decompress_and_apply - - thumb_func_start sub_803C5A0 -sub_803C5A0: @ 803C5A0 - push {r4-r7,lr} - lsls r0, 16 - lsrs r4, r0, 16 - lsls r1, 24 - lsrs r3, r1, 24 - ldr r5, _0803C5D0 - ldr r2, _0803C5D4 - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 3 - adds r1, r5, 0 - adds r0, r2 - ldm r0!, {r2,r6,r7} - stm r1!, {r2,r6,r7} - ldm r0!, {r2,r6,r7} - stm r1!, {r2,r6,r7} - strh r4, [r5, 0x2] - cmp r3, 0 - beq _0803C5CA - cmp r3, 0x2 - bne _0803C5DC -_0803C5CA: - ldr r0, _0803C5D8 - b _0803C5DE - .align 2, 0 -_0803C5D0: .4byte 0x02024e8c -_0803C5D4: .4byte gSpriteTemplate_8208288 -_0803C5D8: .4byte gUnknown_081ECACC -_0803C5DC: - ldr r0, _0803C5EC -_0803C5DE: - lsls r1, r4, 2 - adds r1, r0 - ldr r0, [r1] - str r0, [r5, 0x8] - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803C5EC: .4byte gUnknown_081EC2A4 - thumb_func_end sub_803C5A0 - .align 2, 0 @ Don't pad with nop. diff --git a/asm/rom_803BA2C.s b/asm/rom_803BA2C.s new file mode 100644 index 000000000..cf88cbcb3 --- /dev/null +++ b/asm/rom_803BA2C.s @@ -0,0 +1,1528 @@ + .include "constants/gba_constants.s" + .include "constants/species_constants.s" + .include "asm/macros.s" + + .syntax unified + + .text + + thumb_func_start sub_803BA2C +sub_803BA2C: @ 803BA2C + push {r4-r7,lr} + mov r7, r10 + mov r6, r9 + mov r5, r8 + push {r5-r7} + sub sp, 0x2C + adds r7, r0, 0 + str r1, [sp, 0x4] + str r2, [sp, 0x8] + ldr r0, [sp, 0x4C] + ldr r1, [sp, 0x50] + ldr r2, [sp, 0x54] + ldr r4, [sp, 0x58] + lsls r3, 16 + lsrs r3, 16 + str r3, [sp, 0xC] + lsls r0, 16 + lsrs r3, r0, 16 + lsls r1, 24 + lsrs r6, r1, 24 + lsls r2, 24 + lsrs r2, 24 + str r2, [sp, 0x10] + lsls r4, 24 + lsrs r4, 24 + movs r5, 0 + cmp r3, 0 + bne _0803BA80 + ldr r2, _0803BA78 + ldr r1, _0803BA7C + ldr r3, [sp, 0x8] + lsls r0, r3, 1 + adds r0, r3 + lsls r0, 2 + adds r0, r1 + ldrb r0, [r0, 0x1] + strh r0, [r2] + b _0803BA84 + .align 2, 0 +_0803BA78: .4byte 0x02024e80 +_0803BA7C: .4byte gBattleMoves +_0803BA80: + ldr r0, _0803BA9C + strh r3, [r0] +_0803BA84: + cmp r6, 0 + bne _0803BAA4 + ldr r1, _0803BAA0 + ldr r6, [sp, 0x8] + lsls r0, r6, 1 + adds r0, r6 + lsls r0, 2 + adds r0, r1 + ldrb r0, [r0, 0x2] + mov r9, r0 + b _0803BAAE + .align 2, 0 +_0803BA9C: .4byte 0x02024e80 +_0803BAA0: .4byte gBattleMoves +_0803BAA4: + movs r0, 0x3F + mov r9, r0 + mov r1, r9 + ands r1, r6 + mov r9, r1 +_0803BAAE: + ldrh r6, [r7, 0x2] + ldr r2, [sp, 0x4] + ldrh r2, [r2, 0x4] + str r2, [sp, 0x14] + ldrh r3, [r7, 0x8] + mov r8, r3 + ldr r0, [sp, 0x4] + ldrh r0, [r0, 0xA] + str r0, [sp, 0x18] + ldrh r0, [r7, 0x2E] + cmp r0, 0xAF + bne _0803BAE0 + ldr r1, _0803BADC + ldr r2, [sp, 0x10] + lsls r0, r2, 3 + subs r0, r2 + lsls r0, 2 + adds r0, r1 + ldrb r3, [r0, 0x7] + mov r10, r3 + ldrb r0, [r0, 0x1A] + b _0803BAF6 + .align 2, 0 +_0803BADC: .4byte 0x02024df0 +_0803BAE0: + ldrh r0, [r7, 0x2E] + bl itemid_get_x12 + lsls r0, 24 + lsrs r0, 24 + mov r10, r0 + ldrh r0, [r7, 0x2E] + bl itemid_get_quality + lsls r0, 24 + lsrs r0, 24 +_0803BAF6: + str r0, [sp, 0x20] + ldr r1, [sp, 0x4] + ldrh r0, [r1, 0x2E] + cmp r0, 0xAF + bne _0803BB26 + ldr r1, _0803BB10 + lsls r0, r4, 3 + subs r0, r4 + lsls r0, 2 + adds r0, r1 + ldrb r0, [r0, 0x7] + str r0, [sp, 0x1C] + b _0803BB3C + .align 2, 0 +_0803BB10: .4byte 0x02024df0 +_0803BB14: + ldr r0, [sp, 0x20] + adds r0, 0x64 + muls r0, r6 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r6, r0, 16 + b _0803BCDC +_0803BB26: + ldr r2, [sp, 0x4] + ldrh r0, [r2, 0x2E] + bl itemid_get_x12 + lsls r0, 24 + lsrs r0, 24 + str r0, [sp, 0x1C] + ldr r3, [sp, 0x4] + ldrh r0, [r3, 0x2E] + bl itemid_get_quality +_0803BB3C: + adds r0, r7, 0 + adds r0, 0x20 + ldrb r1, [r0] + str r0, [sp, 0x24] + cmp r1, 0x25 + beq _0803BB4C + cmp r1, 0x4A + bne _0803BB50 +_0803BB4C: + lsls r0, r6, 17 + lsrs r6, r0, 16 +_0803BB50: + ldr r0, _0803BCB8 + ldrh r1, [r0] + ldr r0, _0803BCBC + ands r0, r1 + cmp r0, 0 + beq _0803BB5E + b _0803BC78 +_0803BB5E: + movs r0, 0x8 + ands r0, r1 + cmp r0, 0 + beq _0803BB98 + ldr r0, _0803BCC0 + ldrh r1, [r0] + movs r0, 0x80 + lsls r0, 3 + cmp r1, r0 + beq _0803BB98 + ldr r0, _0803BCC4 + bl FlagGet + lsls r0, 24 + cmp r0, 0 + beq _0803BB98 + ldr r0, [sp, 0x10] + bl battle_side_get_owner + lsls r0, 24 + cmp r0, 0 + bne _0803BB98 + movs r0, 0x6E + muls r0, r6 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r6, r0, 16 +_0803BB98: + ldr r0, _0803BCB8 + ldrh r1, [r0] + ldr r0, _0803BCBC + ands r0, r1 + cmp r0, 0 + bne _0803BC78 + movs r0, 0x8 + ands r0, r1 + cmp r0, 0 + beq _0803BBE2 + ldr r0, _0803BCC0 + ldrh r1, [r0] + movs r0, 0x80 + lsls r0, 3 + cmp r1, r0 + beq _0803BBE2 + ldr r0, _0803BCC8 + bl FlagGet + lsls r0, 24 + cmp r0, 0 + beq _0803BBE2 + adds r0, r4, 0 + bl battle_side_get_owner + lsls r0, 24 + cmp r0, 0 + bne _0803BBE2 + movs r0, 0x6E + ldr r1, [sp, 0x14] + muls r0, r1 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + str r0, [sp, 0x14] +_0803BBE2: + ldr r0, _0803BCB8 + ldrh r1, [r0] + ldr r0, _0803BCBC + ands r0, r1 + cmp r0, 0 + bne _0803BC78 + movs r0, 0x8 + ands r0, r1 + cmp r0, 0 + beq _0803BC2E + ldr r0, _0803BCC0 + ldrh r1, [r0] + movs r0, 0x80 + lsls r0, 3 + cmp r1, r0 + beq _0803BC2E + ldr r0, _0803BCCC + bl FlagGet + lsls r0, 24 + cmp r0, 0 + beq _0803BC2E + ldr r0, [sp, 0x10] + bl battle_side_get_owner + lsls r0, 24 + cmp r0, 0 + bne _0803BC2E + movs r0, 0x6E + mov r2, r8 + muls r2, r0 + adds r0, r2, 0 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + mov r8, r0 +_0803BC2E: + ldr r0, _0803BCB8 + ldrh r1, [r0] + ldr r0, _0803BCBC + ands r0, r1 + cmp r0, 0 + bne _0803BC78 + movs r0, 0x8 + ands r0, r1 + cmp r0, 0 + beq _0803BC78 + ldr r0, _0803BCC0 + ldrh r1, [r0] + movs r0, 0x80 + lsls r0, 3 + cmp r1, r0 + beq _0803BC78 + ldr r0, _0803BCCC + bl FlagGet + lsls r0, 24 + cmp r0, 0 + beq _0803BC78 + adds r0, r4, 0 + bl battle_side_get_owner + lsls r0, 24 + cmp r0, 0 + bne _0803BC78 + movs r0, 0x6E + ldr r3, [sp, 0x18] + muls r0, r3 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + str r0, [sp, 0x18] +_0803BC78: + movs r2, 0 + ldr r4, _0803BCD0 + ldr r0, [sp, 0x4] + adds r0, 0x20 + str r0, [sp, 0x28] + adds r3, r4, 0 +_0803BC84: + lsls r1, r2, 1 + ldrb r0, [r3] + cmp r10, r0 + bne _0803BCD4 + adds r0, r4, 0x1 + adds r0, r1, r0 + ldrb r0, [r0] + cmp r9, r0 + bne _0803BCD4 + mov r1, r9 + cmp r1, 0x8 + bhi _0803BC9E + b _0803BB14 +_0803BC9E: + ldr r0, [sp, 0x20] + adds r0, 0x64 + mov r2, r8 + muls r2, r0 + adds r0, r2, 0 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + mov r8, r0 + b _0803BCDC + .align 2, 0 +_0803BCB8: .4byte 0x020239f8 +_0803BCBC: .4byte 0x00000902 +_0803BCC0: .4byte 0x0202ff5e +_0803BCC4: .4byte 0x00000807 +_0803BCC8: .4byte 0x0000080b +_0803BCCC: .4byte 0x0000080d +_0803BCD0: .4byte gHoldEffectToType +_0803BCD4: + adds r3, 0x2 + adds r2, 0x1 + cmp r2, 0x10 + bls _0803BC84 +_0803BCDC: + mov r3, r10 + cmp r3, 0x1D + bne _0803BCF0 + movs r0, 0x96 + muls r0, r6 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r6, r0, 16 +_0803BCF0: + mov r0, r10 + cmp r0, 0x22 + bne _0803BD28 + ldr r0, _0803BFDC + ldrh r1, [r0] + movs r0, 0x80 + lsls r0, 1 + ands r0, r1 + cmp r0, 0 + bne _0803BD28 + ldr r1, _0803BFE0 + adds r0, r1, 0 + ldrh r2, [r7] + adds r0, r2 + lsls r0, 16 + lsrs r0, 16 + cmp r0, 0x1 + bhi _0803BD28 + movs r0, 0x96 + mov r3, r8 + muls r3, r0 + adds r0, r3, 0 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + mov r8, r0 +_0803BD28: + ldr r0, [sp, 0x1C] + cmp r0, 0x22 + bne _0803BD60 + ldr r0, _0803BFDC + ldrh r1, [r0] + movs r0, 0x80 + lsls r0, 1 + ands r0, r1 + cmp r0, 0 + bne _0803BD60 + ldr r1, _0803BFE0 + adds r0, r1, 0 + ldr r2, [sp, 0x4] + ldrh r2, [r2] + adds r0, r2 + lsls r0, 16 + lsrs r0, 16 + cmp r0, 0x1 + bhi _0803BD60 + movs r0, 0x96 + ldr r3, [sp, 0x18] + muls r0, r3 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + str r0, [sp, 0x18] +_0803BD60: + mov r0, r10 + cmp r0, 0x23 + bne _0803BD76 + ldrh r1, [r7] + ldr r0, _0803BFE4 + cmp r1, r0 + bne _0803BD76 + mov r1, r8 + lsls r0, r1, 17 + lsrs r0, 16 + mov r8, r0 +_0803BD76: + ldr r2, [sp, 0x1C] + cmp r2, 0x24 + bne _0803BD8E + ldr r3, [sp, 0x4] + ldrh r1, [r3] + ldr r0, _0803BFE4 + cmp r1, r0 + bne _0803BD8E + ldr r1, [sp, 0x18] + lsls r0, r1, 17 + lsrs r0, 16 + str r0, [sp, 0x18] +_0803BD8E: + mov r2, r10 + cmp r2, 0x2D + bne _0803BDA2 + ldrh r0, [r7] + cmp r0, 0x19 + bne _0803BDA2 + mov r3, r8 + lsls r0, r3, 17 + lsrs r0, 16 + mov r8, r0 +_0803BDA2: + ldr r0, [sp, 0x1C] + cmp r0, 0x40 + bne _0803BDB8 + ldr r1, [sp, 0x4] + ldrh r0, [r1] + cmp r0, 0x84 + bne _0803BDB8 + ldr r2, [sp, 0x14] + lsls r0, r2, 17 + lsrs r0, 16 + str r0, [sp, 0x14] +_0803BDB8: + mov r3, r10 + cmp r3, 0x41 + bne _0803BDCE + ldrh r0, [r7] + subs r0, 0x68 + lsls r0, 16 + lsrs r0, 16 + cmp r0, 0x1 + bhi _0803BDCE + lsls r0, r6, 17 + lsrs r6, r0, 16 +_0803BDCE: + ldr r1, [sp, 0x28] + ldrb r0, [r1] + cmp r0, 0x2F + bne _0803BDE6 + mov r2, r9 + cmp r2, 0xA + beq _0803BDE0 + cmp r2, 0xF + bne _0803BDE6 +_0803BDE0: + mov r3, r8 + lsrs r3, 1 + mov r8, r3 +_0803BDE6: + ldr r0, [sp, 0x24] + ldrb r4, [r0] + cmp r4, 0x37 + bne _0803BDFC + movs r0, 0x96 + muls r0, r6 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r6, r0, 16 +_0803BDFC: + cmp r4, 0x39 + bne _0803BE2A + movs r0, 0 + str r0, [sp] + movs r0, 0xE + movs r1, 0 + movs r2, 0x3A + movs r3, 0 + bl sub_8018324 + lsls r0, 24 + cmp r0, 0 + beq _0803BE2A + movs r0, 0x96 + mov r1, r8 + muls r1, r0 + adds r0, r1, 0 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + mov r8, r0 +_0803BE2A: + ldr r2, [sp, 0x24] + ldrb r0, [r2] + cmp r0, 0x3A + bne _0803BE5C + movs r0, 0 + str r0, [sp] + movs r0, 0xE + movs r1, 0 + movs r2, 0x39 + movs r3, 0 + bl sub_8018324 + lsls r0, 24 + cmp r0, 0 + beq _0803BE5C + movs r0, 0x96 + mov r3, r8 + muls r3, r0 + adds r0, r3, 0 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + mov r8, r0 +_0803BE5C: + ldr r1, [sp, 0x24] + ldrb r0, [r1] + cmp r0, 0x3E + bne _0803BE78 + ldr r0, [r7, 0x4C] + cmp r0, 0 + beq _0803BE78 + movs r0, 0x96 + muls r0, r6 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r6, r0, 16 +_0803BE78: + ldr r2, [sp, 0x28] + ldrb r0, [r2] + cmp r0, 0x3F + bne _0803BE9A + ldr r3, [sp, 0x4] + ldr r0, [r3, 0x4C] + cmp r0, 0 + beq _0803BE9A + movs r0, 0x96 + ldr r1, [sp, 0x14] + muls r0, r1 + movs r1, 0x64 + bl __divsi3 + lsls r0, 16 + lsrs r0, 16 + str r0, [sp, 0x14] +_0803BE9A: + mov r2, r9 + cmp r2, 0xD + bne _0803BEBE + movs r0, 0 + str r0, [sp] + movs r0, 0xE + movs r1, 0 + movs r2, 0 + movs r3, 0xFD + bl sub_8018324 + lsls r0, 24 + cmp r0, 0 + beq _0803BEBE + ldr r1, _0803BFE8 + ldrh r0, [r1] + lsrs r0, 1 + strh r0, [r1] +_0803BEBE: + mov r3, r9 + cmp r3, 0xA + bne _0803BEE2 + movs r0, 0 + str r0, [sp] + movs r0, 0xE + movs r1, 0 + movs r2, 0 + movs r3, 0xFE + bl sub_8018324 + lsls r0, 24 + cmp r0, 0 + beq _0803BEE2 + ldr r1, _0803BFE8 + ldrh r0, [r1] + lsrs r0, 1 + strh r0, [r1] +_0803BEE2: + mov r0, r9 + cmp r0, 0xC + bne _0803BF12 + ldr r1, [sp, 0x24] + ldrb r0, [r1] + cmp r0, 0x41 + bne _0803BF12 + ldrh r0, [r7, 0x2C] + movs r1, 0x3 + bl __udivsi3 + ldrh r1, [r7, 0x28] + lsls r0, 16 + lsrs r0, 16 + cmp r1, r0 + bhi _0803BF12 + ldr r4, _0803BFE8 + ldrh r1, [r4] + movs r0, 0x96 + muls r0, r1 + movs r1, 0x64 + bl __divsi3 + strh r0, [r4] +_0803BF12: + mov r2, r9 + cmp r2, 0xA + bne _0803BF42 + ldr r3, [sp, 0x24] + ldrb r0, [r3] + cmp r0, 0x42 + bne _0803BF42 + ldrh r0, [r7, 0x2C] + movs r1, 0x3 + bl __udivsi3 + ldrh r1, [r7, 0x28] + lsls r0, 16 + lsrs r0, 16 + cmp r1, r0 + bhi _0803BF42 + ldr r4, _0803BFE8 + ldrh r1, [r4] + movs r0, 0x96 + muls r0, r1 + movs r1, 0x64 + bl __divsi3 + strh r0, [r4] +_0803BF42: + mov r0, r9 + cmp r0, 0xB + bne _0803BF72 + ldr r1, [sp, 0x24] + ldrb r0, [r1] + cmp r0, 0x43 + bne _0803BF72 + ldrh r0, [r7, 0x2C] + movs r1, 0x3 + bl __udivsi3 + ldrh r1, [r7, 0x28] + lsls r0, 16 + lsrs r0, 16 + cmp r1, r0 + bhi _0803BF72 + ldr r4, _0803BFE8 + ldrh r1, [r4] + movs r0, 0x96 + muls r0, r1 + movs r1, 0x64 + bl __divsi3 + strh r0, [r4] +_0803BF72: + mov r2, r9 + cmp r2, 0x6 + bne _0803BFA2 + ldr r3, [sp, 0x24] + ldrb r0, [r3] + cmp r0, 0x44 + bne _0803BFA2 + ldrh r0, [r7, 0x2C] + movs r1, 0x3 + bl __udivsi3 + ldrh r1, [r7, 0x28] + lsls r0, 16 + lsrs r0, 16 + cmp r1, r0 + bhi _0803BFA2 + ldr r4, _0803BFE8 + ldrh r1, [r4] + movs r0, 0x96 + muls r0, r1 + movs r1, 0x64 + bl __divsi3 + strh r0, [r4] +_0803BFA2: + ldr r2, _0803BFEC + ldr r0, _0803BFF0 + ldrh r1, [r0] + lsls r0, r1, 1 + adds r0, r1 + lsls r0, 2 + adds r0, r2 + ldrb r0, [r0] + cmp r0, 0x7 + bne _0803BFBC + ldr r0, [sp, 0x14] + lsrs r0, 1 + str r0, [sp, 0x14] +_0803BFBC: + mov r1, r9 + cmp r1, 0x8 + bls _0803BFC4 + b _0803C122 +_0803BFC4: + ldr r0, _0803BFF4 + ldrb r1, [r0] + adds r4, r0, 0 + cmp r1, 0x2 + bne _0803C000 + movs r0, 0x19 + ldrsb r0, [r7, r0] + cmp r0, 0x6 + ble _0803BFFC + ldr r2, _0803BFF8 + b _0803C006 + .align 2, 0 +_0803BFDC: .4byte 0x020239f8 +_0803BFE0: .4byte 0xfffffe69 +_0803BFE4: .4byte 0x00000175 +_0803BFE8: .4byte 0x02024e80 +_0803BFEC: .4byte gBattleMoves +_0803BFF0: .4byte 0x02024be6 +_0803BFF4: .4byte 0x02024c0d +_0803BFF8: .4byte gStatStageRatios +_0803BFFC: + adds r5, r6, 0 + b _0803C01E +_0803C000: + ldr r2, _0803C050 + movs r0, 0x19 + ldrsb r0, [r7, r0] +_0803C006: + lsls r0, 1 + adds r1, r0, r2 + ldrb r1, [r1] + adds r5, r6, 0 + muls r5, r1 + adds r2, 0x1 + adds r0, r2 + ldrb r1, [r0] + adds r0, r5, 0 + bl __divsi3 + adds r5, r0, 0 +_0803C01E: + ldr r0, _0803C054 + ldrh r0, [r0] + muls r5, r0 + adds r0, r7, 0 + adds r0, 0x2A + ldrb r0, [r0] + lsls r0, 1 + movs r1, 0x5 + bl __divsi3 + adds r0, 0x2 + muls r5, r0 + ldrb r0, [r4] + cmp r0, 0x2 + bne _0803C05C + ldr r2, [sp, 0x4] + movs r0, 0x1A + ldrsb r0, [r2, r0] + cmp r0, 0x5 + bgt _0803C058 + ldr r2, _0803C050 + ldr r3, [sp, 0x4] + movs r0, 0x1A + ldrsb r0, [r3, r0] + b _0803C064 + .align 2, 0 +_0803C050: .4byte gStatStageRatios +_0803C054: .4byte 0x02024e80 +_0803C058: + ldr r3, [sp, 0x14] + b _0803C07E +_0803C05C: + ldr r2, _0803C0DC + ldr r1, [sp, 0x4] + movs r0, 0x1A + ldrsb r0, [r1, r0] +_0803C064: + lsls r0, 1 + adds r1, r0, r2 + ldrb r1, [r1] + ldr r6, [sp, 0x14] + adds r3, r6, 0 + muls r3, r1 + adds r2, 0x1 + adds r0, r2 + ldrb r1, [r0] + adds r0, r3, 0 + bl __divsi3 + adds r3, r0, 0 +_0803C07E: + adds r0, r5, 0 + adds r1, r3, 0 + bl __divsi3 + adds r5, r0, 0 + movs r1, 0x32 + bl __divsi3 + adds r5, r0, 0 + ldr r0, [r7, 0x4C] + movs r1, 0x10 + ands r0, r1 + cmp r0, 0 + beq _0803C0A8 + ldr r1, [sp, 0x24] + ldrb r0, [r1] + cmp r0, 0x3E + beq _0803C0A8 + lsrs r0, r5, 31 + adds r0, r5, r0 + asrs r5, r0, 1 +_0803C0A8: + movs r0, 0x1 + ldr r2, [sp, 0xC] + ands r0, r2 + cmp r0, 0 + beq _0803C0EA + ldrb r1, [r4] + cmp r1, 0x1 + bne _0803C0EA + ldr r0, _0803C0E0 + ldrh r0, [r0] + ands r1, r0 + cmp r1, 0 + beq _0803C0E4 + movs r0, 0x2 + bl sub_803C348 + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x2 + bne _0803C0E4 + adds r0, r5, 0 + movs r1, 0x3 + bl __divsi3 + lsls r5, r0, 1 + b _0803C0EA + .align 2, 0 +_0803C0DC: .4byte gStatStageRatios +_0803C0E0: .4byte 0x020239f8 +_0803C0E4: + lsrs r0, r5, 31 + adds r0, r5, r0 + asrs r5, r0, 1 +_0803C0EA: + ldr r0, _0803C148 + ldrh r1, [r0] + movs r0, 0x1 + ands r0, r1 + cmp r0, 0 + beq _0803C11C + ldr r0, _0803C14C + ldr r3, [sp, 0x8] + lsls r1, r3, 1 + adds r1, r3 + lsls r1, 2 + adds r1, r0 + ldrb r0, [r1, 0x6] + cmp r0, 0x8 + bne _0803C11C + movs r0, 0x2 + bl sub_803C348 + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x2 + bne _0803C11C + lsrs r0, r5, 31 + adds r0, r5, r0 + asrs r5, r0, 1 +_0803C11C: + cmp r5, 0 + bne _0803C122 + movs r5, 0x1 +_0803C122: + mov r6, r9 + cmp r6, 0x9 + bne _0803C12A + movs r5, 0 +_0803C12A: + mov r0, r9 + cmp r0, 0x9 + bhi _0803C132 + b _0803C330 +_0803C132: + ldr r0, _0803C150 + ldrb r1, [r0] + adds r4, r0, 0 + cmp r1, 0x2 + bne _0803C15C + movs r0, 0x1C + ldrsb r0, [r7, r0] + cmp r0, 0x6 + ble _0803C158 + ldr r2, _0803C154 + b _0803C162 + .align 2, 0 +_0803C148: .4byte 0x020239f8 +_0803C14C: .4byte gBattleMoves +_0803C150: .4byte 0x02024c0d +_0803C154: .4byte gStatStageRatios +_0803C158: + mov r5, r8 + b _0803C17A +_0803C15C: + ldr r2, _0803C1A8 + movs r0, 0x1C + ldrsb r0, [r7, r0] +_0803C162: + lsls r0, 1 + adds r1, r0, r2 + ldrb r1, [r1] + mov r5, r8 + muls r5, r1 + adds r2, 0x1 + adds r0, r2 + ldrb r1, [r0] + adds r0, r5, 0 + bl __divsi3 + adds r5, r0, 0 +_0803C17A: + ldr r0, _0803C1AC + ldrh r0, [r0] + muls r5, r0 + adds r0, r7, 0 + adds r0, 0x2A + ldrb r0, [r0] + lsls r0, 1 + movs r1, 0x5 + bl __divsi3 + adds r0, 0x2 + muls r5, r0 + ldrb r0, [r4] + cmp r0, 0x2 + bne _0803C1B4 + ldr r1, [sp, 0x4] + movs r0, 0x1D + ldrsb r0, [r1, r0] + cmp r0, 0x5 + bgt _0803C1B0 + ldr r2, _0803C1A8 + b _0803C1BC + .align 2, 0 +_0803C1A8: .4byte gStatStageRatios +_0803C1AC: .4byte 0x02024e80 +_0803C1B0: + ldr r3, [sp, 0x18] + b _0803C1D6 +_0803C1B4: + ldr r2, _0803C21C + ldr r1, [sp, 0x4] + movs r0, 0x1D + ldrsb r0, [r1, r0] +_0803C1BC: + lsls r0, 1 + adds r1, r0, r2 + ldrb r1, [r1] + ldr r6, [sp, 0x18] + adds r3, r6, 0 + muls r3, r1 + adds r2, 0x1 + adds r0, r2 + ldrb r1, [r0] + adds r0, r3, 0 + bl __divsi3 + adds r3, r0, 0 +_0803C1D6: + adds r0, r5, 0 + adds r1, r3, 0 + bl __divsi3 + adds r5, r0, 0 + movs r1, 0x32 + bl __divsi3 + adds r5, r0, 0 + movs r0, 0x2 + ldr r1, [sp, 0xC] + ands r0, r1 + cmp r0, 0 + beq _0803C22A + ldrb r1, [r4] + cmp r1, 0x1 + bne _0803C22A + ldr r0, _0803C220 + ldrh r0, [r0] + ands r1, r0 + cmp r1, 0 + beq _0803C224 + movs r0, 0x2 + bl sub_803C348 + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x2 + bne _0803C224 + adds r0, r5, 0 + movs r1, 0x3 + bl __divsi3 + lsls r5, r0, 1 + b _0803C22A + .align 2, 0 +_0803C21C: .4byte gStatStageRatios +_0803C220: .4byte 0x020239f8 +_0803C224: + lsrs r0, r5, 31 + adds r0, r5, r0 + asrs r5, r0, 1 +_0803C22A: + ldr r0, _0803C2A4 + ldrh r1, [r0] + movs r0, 0x1 + ands r0, r1 + cmp r0, 0 + beq _0803C25C + ldr r0, _0803C2A8 + ldr r2, [sp, 0x8] + lsls r1, r2, 1 + adds r1, r2 + lsls r1, 2 + adds r1, r0 + ldrb r0, [r1, 0x6] + cmp r0, 0x8 + bne _0803C25C + movs r0, 0x2 + bl sub_803C348 + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x2 + bne _0803C25C + lsrs r0, r5, 31 + adds r0, r5, r0 + asrs r5, r0, 1 +_0803C25C: + movs r0, 0 + str r0, [sp] + movs r0, 0xE + movs r1, 0 + movs r2, 0xD + movs r3, 0 + bl sub_8018324 + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0 + bne _0803C30C + str r0, [sp] + movs r0, 0xE + movs r1, 0 + movs r2, 0x4D + movs r3, 0 + bl sub_8018324 + lsls r0, 24 + cmp r0, 0 + bne _0803C30C + ldr r2, _0803C2AC + ldrh r1, [r2] + movs r0, 0x1 + ands r0, r1 + adds r4, r2, 0 + cmp r0, 0 + beq _0803C2C4 + mov r3, r9 + cmp r3, 0xA + beq _0803C2B0 + cmp r3, 0xB + beq _0803C2B8 + b _0803C2C4 + .align 2, 0 +_0803C2A4: .4byte 0x020239f8 +_0803C2A8: .4byte gBattleMoves +_0803C2AC: .4byte 0x02024db8 +_0803C2B0: + lsrs r0, r5, 31 + adds r0, r5, r0 + asrs r5, r0, 1 + b _0803C2C4 +_0803C2B8: + lsls r0, r5, 4 + subs r0, r5 + movs r1, 0xA + bl __divsi3 + adds r5, r0, 0 +_0803C2C4: + ldrh r1, [r4] + movs r0, 0x9F + ands r0, r1 + cmp r0, 0 + beq _0803C2DC + ldr r0, _0803C2F4 + ldrh r0, [r0] + cmp r0, 0x4C + bne _0803C2DC + lsrs r0, r5, 31 + adds r0, r5, r0 + asrs r5, r0, 1 +_0803C2DC: + ldrh r1, [r4] + movs r0, 0x60 + ands r0, r1 + cmp r0, 0 + beq _0803C30C + mov r6, r9 + cmp r6, 0xA + beq _0803C2F8 + cmp r6, 0xB + beq _0803C306 + b _0803C30C + .align 2, 0 +_0803C2F4: .4byte 0x02024be6 +_0803C2F8: + lsls r0, r5, 4 + subs r0, r5 + movs r1, 0xA + bl __divsi3 + adds r5, r0, 0 + b _0803C30C +_0803C306: + lsrs r0, r5, 31 + adds r0, r5, r0 + asrs r5, r0, 1 +_0803C30C: + ldr r1, _0803C344 + ldr r2, [sp, 0x10] + lsls r0, r2, 2 + adds r0, r1 + ldr r0, [r0] + movs r1, 0x1 + ands r0, r1 + cmp r0, 0 + beq _0803C330 + mov r3, r9 + cmp r3, 0xA + bne _0803C330 + lsls r0, r5, 4 + subs r0, r5 + movs r1, 0xA + bl __divsi3 + adds r5, r0, 0 +_0803C330: + adds r0, r5, 0x2 + add sp, 0x2C + pop {r3-r5} + mov r8, r3 + mov r9, r4 + mov r10, r5 + pop {r4-r7} + pop {r1} + bx r1 + .align 2, 0 +_0803C344: .4byte 0x02017100 + thumb_func_end sub_803BA2C + + thumb_func_start sub_803C348 +sub_803C348: @ 803C348 + push {r4-r6,lr} + lsls r0, 24 + lsrs r0, 24 + adds r1, r0, 0 + movs r6, 0 + cmp r0, 0x1 + beq _0803C39C + cmp r0, 0x1 + bgt _0803C360 + cmp r0, 0 + beq _0803C366 + b _0803C41E +_0803C360: + cmp r1, 0x2 + beq _0803C3E4 + b _0803C41E +_0803C366: + movs r5, 0 + ldr r0, _0803C390 + ldrb r3, [r0] + ldr r4, _0803C394 + ldr r2, _0803C398 +_0803C370: + cmp r5, r3 + beq _0803C384 + ldrb r0, [r4] + ldr r1, [r2] + ands r0, r1 + cmp r0, 0 + bne _0803C384 + adds r0, r6, 0x1 + lsls r0, 24 + lsrs r6, r0, 24 +_0803C384: + adds r2, 0x4 + adds r5, 0x1 + cmp r5, 0x3 + ble _0803C370 + b _0803C41E + .align 2, 0 +_0803C390: .4byte 0x02024a60 +_0803C394: .4byte 0x02024c0c +_0803C398: .4byte gBitTable +_0803C39C: + movs r5, 0 +_0803C39E: + lsls r0, r5, 24 + lsrs r0, 24 + bl battle_side_get_owner + adds r4, r0, 0 + ldr r0, _0803C3D8 + ldrb r0, [r0] + bl battle_side_get_owner + lsls r4, 24 + lsls r0, 24 + cmp r4, r0 + bne _0803C3D0 + ldr r0, _0803C3DC + ldrb r1, [r0] + ldr r2, _0803C3E0 + lsls r0, r5, 2 + adds r0, r2 + ldr r0, [r0] + ands r1, r0 + cmp r1, 0 + bne _0803C3D0 + adds r0, r6, 0x1 + lsls r0, 24 + lsrs r6, r0, 24 +_0803C3D0: + adds r5, 0x1 + cmp r5, 0x3 + ble _0803C39E + b _0803C41E + .align 2, 0 +_0803C3D8: .4byte 0x02024c07 +_0803C3DC: .4byte 0x02024c0c +_0803C3E0: .4byte gBitTable +_0803C3E4: + movs r5, 0 +_0803C3E6: + lsls r0, r5, 24 + lsrs r0, 24 + bl battle_side_get_owner + adds r4, r0, 0 + ldr r0, _0803C428 + ldrb r0, [r0] + bl battle_side_get_owner + lsls r4, 24 + lsls r0, 24 + cmp r4, r0 + bne _0803C418 + ldr r0, _0803C42C + ldrb r1, [r0] + ldr r2, _0803C430 + lsls r0, r5, 2 + adds r0, r2 + ldr r0, [r0] + ands r1, r0 + cmp r1, 0 + bne _0803C418 + adds r0, r6, 0x1 + lsls r0, 24 + lsrs r6, r0, 24 +_0803C418: + adds r5, 0x1 + cmp r5, 0x3 + ble _0803C3E6 +_0803C41E: + adds r0, r6, 0 + pop {r4-r6} + pop {r1} + bx r1 + .align 2, 0 +_0803C428: .4byte 0x02024c08 +_0803C42C: .4byte 0x02024c0c +_0803C430: .4byte gBitTable + thumb_func_end sub_803C348 + + thumb_func_start sub_803C434 +sub_803C434: @ 803C434 + push {r4-r6,lr} + lsls r0, 24 + lsrs r0, 24 + bl battle_get_per_side_status + movs r1, 0x1 + movs r6, 0x1 + adds r4, r6, 0 + ands r4, r0 + eors r4, r1 + adds r5, r4, 0 + ldr r0, _0803C45C + ldrh r1, [r0] + adds r0, r6, 0 + ands r0, r1 + cmp r0, 0 + bne _0803C460 + adds r0, r4, 0 + b _0803C4AA + .align 2, 0 +_0803C45C: .4byte 0x020239f8 +_0803C460: + movs r0, 0 + bl sub_803C348 + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x1 + bls _0803C484 + bl Random + adds r1, r6, 0 + ands r1, r0 + cmp r1, 0 + bne _0803C480 + movs r0, 0x2 + eors r0, r4 + b _0803C4AA +_0803C480: + adds r0, r4, 0 + b _0803C4AA +_0803C484: + ldr r0, _0803C49C + ldrb r1, [r0] + ldr r2, _0803C4A0 + lsls r0, r4, 2 + adds r0, r2 + ldr r0, [r0] + ands r1, r0 + cmp r1, 0 + bne _0803C4A4 + adds r0, r4, 0 + b _0803C4AA + .align 2, 0 +_0803C49C: .4byte 0x02024c0c +_0803C4A0: .4byte gBitTable +_0803C4A4: + movs r0, 0x2 + eors r5, r0 + adds r0, r5, 0 +_0803C4AA: + bl battle_get_side_with_given_state + lsls r0, 24 + lsrs r0, 24 + pop {r4-r6} + pop {r1} + bx r1 + thumb_func_end sub_803C434 + + thumb_func_start pokemon_get_gender +pokemon_get_gender: @ 803C4B8 + push {lr} + bl pokemon_roll_gender + lsls r0, 24 + lsrs r0, 24 + pop {r1} + bx r1 + thumb_func_end pokemon_get_gender + + thumb_func_start pokemon_roll_gender +pokemon_roll_gender: @ 803C4C8 + push {r4,r5,lr} + adds r4, r0, 0 + movs r1, 0xB + movs r2, 0 + bl GetMonBoxData + lsls r0, 16 + lsrs r5, r0, 16 + adds r0, r4, 0 + movs r1, 0 + movs r2, 0 + bl GetMonBoxData + adds r2, r0, 0 + ldr r1, _0803C518 + lsls r0, r5, 3 + subs r0, r5 + lsls r0, 2 + adds r0, r1 + ldrb r0, [r0, 0x10] + cmp r0, 0 + beq _0803C51E + cmp r0, 0 + blt _0803C500 + cmp r0, 0xFF + bgt _0803C500 + cmp r0, 0xFE + bge _0803C51E +_0803C500: + ldr r1, _0803C518 + lsls r0, r5, 3 + subs r0, r5 + lsls r0, 2 + adds r0, r1 + ldrb r1, [r0, 0x10] + movs r0, 0xFF + ands r0, r2 + cmp r1, r0 + bhi _0803C51C + movs r0, 0 + b _0803C51E + .align 2, 0 +_0803C518: .4byte gBaseStats +_0803C51C: + movs r0, 0xFE +_0803C51E: + pop {r4,r5} + pop {r1} + bx r1 + thumb_func_end pokemon_roll_gender + + thumb_func_start pokemon_species_get_gender_info +pokemon_species_get_gender_info: @ 803C524 + push {lr} + adds r3, r1, 0 + lsls r0, 16 + lsrs r2, r0, 16 + ldr r1, _0803C560 + lsls r0, r2, 3 + subs r0, r2 + lsls r0, 2 + adds r0, r1 + ldrb r0, [r0, 0x10] + cmp r0, 0 + beq _0803C566 + cmp r0, 0 + blt _0803C548 + cmp r0, 0xFF + bgt _0803C548 + cmp r0, 0xFE + bge _0803C566 +_0803C548: + lsls r0, r2, 3 + subs r0, r2 + lsls r0, 2 + adds r0, r1 + ldrb r1, [r0, 0x10] + movs r0, 0xFF + ands r0, r3 + cmp r1, r0 + bhi _0803C564 + movs r0, 0 + b _0803C566 + .align 2, 0 +_0803C560: .4byte gBaseStats +_0803C564: + movs r0, 0xFE +_0803C566: + pop {r1} + bx r1 + thumb_func_end pokemon_species_get_gender_info + + thumb_func_start gpu_pal_obj_decompress_and_apply +gpu_pal_obj_decompress_and_apply: @ 803C56C + push {r4-r6,lr} + lsls r1, 24 + lsrs r1, 24 + ldr r3, _0803C594 + ldr r4, _0803C598 + lsls r2, r1, 1 + adds r2, r1 + lsls r2, 3 + adds r1, r3, 0 + adds r2, r4 + ldm r2!, {r4-r6} + stm r1!, {r4-r6} + ldm r2!, {r4-r6} + stm r1!, {r4-r6} + strh r0, [r3, 0x2] + ldr r0, _0803C59C + str r0, [r3, 0x8] + pop {r4-r6} + pop {r0} + bx r0 + .align 2, 0 +_0803C594: .4byte 0x02024e8c +_0803C598: .4byte gSpriteTemplate_8208288 +_0803C59C: .4byte gSpriteAnimTable_81E7C64 + thumb_func_end gpu_pal_obj_decompress_and_apply + + thumb_func_start sub_803C5A0 +sub_803C5A0: @ 803C5A0 + push {r4-r7,lr} + lsls r0, 16 + lsrs r4, r0, 16 + lsls r1, 24 + lsrs r3, r1, 24 + ldr r5, _0803C5D0 + ldr r2, _0803C5D4 + lsls r0, r3, 1 + adds r0, r3 + lsls r0, 3 + adds r1, r5, 0 + adds r0, r2 + ldm r0!, {r2,r6,r7} + stm r1!, {r2,r6,r7} + ldm r0!, {r2,r6,r7} + stm r1!, {r2,r6,r7} + strh r4, [r5, 0x2] + cmp r3, 0 + beq _0803C5CA + cmp r3, 0x2 + bne _0803C5DC +_0803C5CA: + ldr r0, _0803C5D8 + b _0803C5DE + .align 2, 0 +_0803C5D0: .4byte 0x02024e8c +_0803C5D4: .4byte gSpriteTemplate_8208288 +_0803C5D8: .4byte gUnknown_081ECACC +_0803C5DC: + ldr r0, _0803C5EC +_0803C5DE: + lsls r1, r4, 2 + adds r1, r0 + ldr r0, [r1] + str r0, [r5, 0x8] + pop {r4-r7} + pop {r0} + bx r0 + .align 2, 0 +_0803C5EC: .4byte gUnknown_081EC2A4 + thumb_func_end sub_803C5A0 + + .align 2, 0 @ Don't pad with nop. diff --git a/ewram_syms.txt b/ewram_syms.txt index 41e6eb578..e8d2abf0c 100644 --- a/ewram_syms.txt +++ b/ewram_syms.txt @@ -3,6 +3,9 @@ unk_2004000 = 0x2004000; gUnknown_020239F8 = 0x20239F8; +word_2024E82 = 0x2024E82; +byte_2024E88 = 0x2024E88; + gUnknown_02024E8C = 0x2024E8C; gSaveBlock2 = 0x2024EA4; diff --git a/include/pokemon.h b/include/pokemon.h index 9b29d4322..fd5de69df 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -91,4 +91,287 @@ #define MON_DATA_SPATK2 87 #define MON_DATA_SPDEF2 88 +struct PokemonSubstruct0 +{ + u16 species; + u16 heldItem; + u32 experience; + u8 ppBonuses; + u8 friendship; +}; + +struct PokemonSubstruct1 +{ + u16 moves[4]; + u8 pp[4]; +}; + +struct PokemonSubstruct2 +{ + u8 hpEV; + u8 attackEV; + u8 defenseEV; + u8 speedEV; + u8 spAttackEV; + u8 spDefenseEV; + u8 cool; + u8 beauty; + u8 cute; + u8 smart; + u8 tough; + u8 sheen; +}; + +struct PokemonSubstruct3 +{ + u8 pokerus; + u8 metLocation; + + u16 metLevel:7; + u16 metGame:4; + u16 pokeball:4; + u16 otGender:1; + + u32 hpIV:5; + u32 attackIV:5; + u32 defenseIV:5; + u32 speedIV:5; + u32 spAttackIV:5; + u32 spDefenseIV:5; + u32 isEgg:1; + u32 altAbility:1; + + u32 coolRibbon:3; + u32 beautyRibbon:3; + u32 cuteRibbon:3; + u32 smartRibbon:3; + u32 toughRibbon:3; + u32 championRibbon:1; + u32 winningRibbon:1; + u32 victoryRibbon:1; + u32 artistRibbon:1; + u32 effortRibbon:1; + u32 giftRibbon1:1; + u32 giftRibbon2:1; + u32 giftRibbon3:1; + u32 giftRibbon4:1; + u32 giftRibbon5:1; + u32 giftRibbon6:1; + u32 giftRibbon7:1; + u32 fatefulEncounter:5; // unused in Ruby/Sapphire, but the high bit must be set for Mew/Deoxys to obey in FR/LG/Emerald +}; + +union PokemonSubstruct +{ + struct PokemonSubstruct0 type0; + struct PokemonSubstruct1 type1; + struct PokemonSubstruct2 type2; + struct PokemonSubstruct3 type3; + u16 raw[6]; +}; + +struct BoxPokemon +{ + u32 personality; + u32 otId; + u8 nickname[10]; + u8 language; + u8 isBadEgg:1; + u8 sanity2:1; + u8 sanity3:1; + u8 unused:5; + u8 otName[7]; + u8 markings; + u16 checksum; + u16 unknown; + + union + { + u32 raw[12]; + union PokemonSubstruct substructs[4]; + } secure; +}; + +struct Pokemon +{ + struct BoxPokemon box; + u32 status; + u8 level; + u8 pokerus; + u16 hp; + u16 maxHP; + u16 attack; + u16 defense; + u16 speed; + u16 spAttack; + u16 spDefense; +}; + +struct UnknownPokemonStruct +{ + u16 species; + u16 heldItem; + u16 moves[4]; + u8 level; + u8 ppBonuses; + u8 hpEV; + u8 attackEV; + u8 defenseEV; + u8 speedEV; + u8 spAttackEV; + u8 spDefenseEV; + u32 otId; + u32 hpIV:5; + u32 attackIV:5; + u32 defenseIV:5; + u32 speedIV:5; + u32 spAttackIV:5; + u32 spDefenseIV:5; + u32 gap:1; + u32 altAbility:1; + u32 personality; + u8 nickname[11]; + u8 friendship; +}; + +struct BattlePokemon +{ + u16 species; + u16 attack; + u16 defense; + u16 speed; + u16 spAttack; + u16 spDefense; + u16 moves[4]; + u32 hpIV:5; + u32 attackIV:5; + u32 defenseIV:5; + u32 speedIV:5; + u32 spAttackIV:5; + u32 spDefenseIV:5; + u8 hpStage; // not used + u8 attackStage; + u8 defenseStage; + u8 speedStage; + u8 spAttackStage; + u8 spDefenseStage; + u8 accuracyStage; + u8 evasionStage; + u8 ability; + u8 type1, type2; + u8 unknown; + u8 pp[4]; + u16 hp; + u8 level; + u8 friendship; + u16 maxHP; + u16 item; + u8 nickname[11]; + u8 unknown2; + u8 otName[8]; + u32 unknown3; + u32 personality; + u32 status1; + u32 status2; + u32 otId; +}; + +struct BaseStats +{ + u8 baseHP; + u8 baseAttack; + u8 baseDefense; + u8 baseSpeed; + u8 baseSpAttack; + u8 baseSpDefense; + + u8 type1, type2; + + u8 catchRate; + + u8 expYield; + + u16 evYield_HP:2; + u16 evYield_Attack:2; + u16 evYield_Defense:2; + u16 evYield_Speed:2; + u16 evYield_SpAttack:2; + u16 evYield_SpDefense:2; + + u16 item1, item2; + + u8 genderRatio; + + u8 eggCycles; + + u8 friendship; + + u8 growthRate; + + u8 eggGroup1, eggGroup2; + + u8 ability1, ability2; + + u8 safariZoneFleeRate; + + u8 bodyColor; +}; + +struct BattleMove +{ + u8 effect; + u8 power; + u8 type; + u8 accuracy; + u8 pp; + u8 secondaryEffectChance; + u8 target; + u8 priority; + u32 flags; +}; + +void ZeroPokemonBoxData(struct Pokemon *mon); +void zero_pokemon_struct(struct Pokemon *mon); +void zero_player_party_data(void); +void zero_enemy_party_data(void); +void create_pokemon_set_level(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId); +void create_pokemon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId); +void pokemon_make_with_nature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature); +void unref_sub_803AB44(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter); +void sub_803AC44(struct Pokemon *mon, u16 species, u8 level); +void unref_sub_803ACEC(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId); +void pokemon_make_ev_something(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread); +void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src); +void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest); +u16 pokemon_calc_checksum(struct Pokemon *mon); +void pokemon_calc_effective_stats(struct Pokemon *mon); +void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest); +u8 level_by_exp(struct Pokemon *mon); +u8 sub_803B570(struct BoxPokemon *mon); +u16 pokemon_moveset_pad_(struct Pokemon *mon, u16 value); +u16 pokemon_moveset_pad(struct Pokemon *mon, u16 value); +u16 sub_803B660(struct BattlePokemon *mon, u16 value); +void sub_803B6A4(struct Pokemon *mon, u16 move, u8 slot); +void sub_803B6E4(struct BattlePokemon *mon, u16 move, u8 slot); +void unref_sub_803B714(struct Pokemon *mon); +void sub_803B720(struct Pokemon *mon); +u16 sub_803B7C8(struct Pokemon *mon, u8 a2); +void sub_803B8D4(struct Pokemon *mon, u16 move); +void sub_803B980(struct Pokemon *mon, u16 move); + +u8 pokemon_species_get_gender_info(u16 species, u32 personality); + +void EncryptMon(struct Pokemon *mon); +void DecryptMon(struct Pokemon *mon); +union PokemonSubstruct *GetSubstruct(struct Pokemon *mon, u32 personality, u8 substructType); +u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data); +u32 GetMonBoxData(struct Pokemon *mon, s32 field, u8 *data); +void SetMonData(struct Pokemon *mon, s32 field, u8 *data); +void SetMonBoxData(struct Pokemon *mon, s32 field, const u8 *data); + +u8 GetNature(struct Pokemon *mon); +u8 GetNatureFromPersonality(u32 personality); + +u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex); + #endif // GUARD_POKEMON_H diff --git a/iwram_syms.txt b/iwram_syms.txt index a151b6eee..ba6a440e5 100644 --- a/iwram_syms.txt +++ b/iwram_syms.txt @@ -8,6 +8,9 @@ gPlayTimeCounterState = 0x300057C; gLocalTime = 0x3004038; +gPlayerParty = 0x3004360; +gEnemyParty = 0x30045C0; + gRngValue = 0x03004818; gUnknown_3004820 = 0x3004820; diff --git a/ld_script.txt b/ld_script.txt index c323d4b30..5d1ac9d7a 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -74,7 +74,9 @@ SECTIONS { src/rtc.o(.text); src/main_menu.o(.text); asm/rom3.o(.text); - src/pokemon.o(.text); + src/pokemon_1.o(.text); + asm/rom_803BA2C.o(.text); + src/pokemon_2.o(.text); asm/rom_803D1FC.o(.text); src/rng.o(.text); asm/rom_8040EB4.o(.text); diff --git a/src/pokemon_1.c b/src/pokemon_1.c new file mode 100644 index 000000000..1d5066c20 --- /dev/null +++ b/src/pokemon_1.c @@ -0,0 +1,678 @@ +#include "global.h" +#include "text.h" +#include "string_util.h" +#include "pokemon.h" +#include "species.h" +#include "main.h" + +extern u8 sav1_map_get_name(); + +extern struct Pokemon gPlayerParty[6]; // 0x3004360 +extern struct Pokemon gEnemyParty[6]; // 0x30045C0 + +extern u8 unk_2000000[]; +extern u16 word_2024E82; +extern u8 byte_2024E88; + +extern u32 gExperienceTables[8][101]; +extern struct BaseStats gBaseStats[]; +extern struct BattleMove gBattleMoves[]; +extern const u16 *gLevelUpLearnsetPointers[]; + +void ZeroPokemonBoxData(struct Pokemon *mon) +{ + u8 *raw = (u8 *)mon; + u32 i; + for (i = 0; i < sizeof(struct BoxPokemon); i++) + raw[i] = 0; +} + +void zero_pokemon_struct(struct Pokemon *mon) +{ + u32 arg; + ZeroPokemonBoxData(mon); + arg = 0; + SetMonData(mon, MON_DATA_STATUS, (u8 *)&arg); + SetMonData(mon, MON_DATA_LEVEL, (u8 *)&arg); + SetMonData(mon, MON_DATA_HP, (u8 *)&arg); + SetMonData(mon, MON_DATA_MAX_HP, (u8 *)&arg); + SetMonData(mon, MON_DATA_ATK, (u8 *)&arg); + SetMonData(mon, MON_DATA_DEF, (u8 *)&arg); + SetMonData(mon, MON_DATA_SPD, (u8 *)&arg); + SetMonData(mon, MON_DATA_SPATK, (u8 *)&arg); + SetMonData(mon, MON_DATA_SPDEF, (u8 *)&arg); + arg = 255; + SetMonData(mon, MON_DATA_64, (u8 *)&arg); +} + +void zero_player_party_data(void) +{ + s32 i; + for (i = 0; i < 6; i++) + zero_pokemon_struct(&gPlayerParty[i]); +} + +void zero_enemy_party_data(void) +{ + s32 i; + for (i = 0; i < 6; i++) + zero_pokemon_struct(&gEnemyParty[i]); +} + +void create_pokemon_set_level(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +{ + u32 arg; + zero_pokemon_struct(mon); + create_pokemon(mon, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); + SetMonData(mon, MON_DATA_LEVEL, &level); + arg = 255; + SetMonData(mon, MON_DATA_64, (u8 *)&arg); + pokemon_calc_effective_stats(mon); +} + +void create_pokemon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +{ + u8 speciesName[10]; + u32 personality; + u32 value; + u16 checksum; + + ZeroPokemonBoxData(mon); + + if (hasFixedPersonality) + { + personality = fixedPersonality; + } + else + { + u32 r = Random(); + personality = (u16)r | (Random() << 16); + } + + SetMonBoxData(mon, MON_DATA_PERSONALITY, (u8 *)&personality); + + if (otIdType == 2) + { + u32 shinyValue; + do + { + u32 r = Random(); + value = (u16)r | (Random() << 16); + asm(""); // needed to match for some reason + shinyValue = ((value & 0xFFFF0000) >> 16) ^ (value & 0x0000FFFF) ^ ((personality & 0xFFFF0000) >> 16) ^ (personality & 0x0000FFFF); + } while (shinyValue < 8); + } + else if (otIdType == 1) + { + value = fixedOtId; + } + else + { + value = gSaveBlock2.playerTrainerId[0] + | (gSaveBlock2.playerTrainerId[1] << 8) + | (gSaveBlock2.playerTrainerId[2] << 16) + | (gSaveBlock2.playerTrainerId[3] << 24); + } + + SetMonBoxData(mon, MON_DATA_OT_ID, (u8 *)&value); + + checksum = pokemon_calc_checksum(mon); + SetMonBoxData(mon, MON_DATA_CHECKSUM, (u8 *)&checksum); + EncryptMon(mon); + GetSpeciesName(speciesName, species); + SetMonBoxData(mon, MON_DATA_NICKNAME, speciesName); + SetMonBoxData(mon, MON_DATA_LANGUAGE, &gGameLanguage); + SetMonBoxData(mon, MON_DATA_OT_NAME, gSaveBlock2.playerName); + SetMonBoxData(mon, MON_DATA_SPECIES, (u8 *)&species); + SetMonBoxData(mon, MON_DATA_EXP, (u8 *)&gExperienceTables[gBaseStats[species].growthRate][level]); + SetMonBoxData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship); + value = sav1_map_get_name(); + SetMonBoxData(mon, MON_DATA_MET_LOCATION, (u8 *)&value); + SetMonBoxData(mon, MON_DATA_MET_LEVEL, &level); + SetMonBoxData(mon, MON_DATA_MET_GAME, &gGameVersion); + value = 4; + SetMonBoxData(mon, MON_DATA_POKEBALL, (u8 *)&value); + SetMonBoxData(mon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); + + if (fixedIV < 32) + { + SetMonBoxData(mon, MON_DATA_HP_IV, &fixedIV); + SetMonBoxData(mon, MON_DATA_ATK_IV, &fixedIV); + SetMonBoxData(mon, MON_DATA_DEF_IV, &fixedIV); + SetMonBoxData(mon, MON_DATA_SPD_IV, &fixedIV); + SetMonBoxData(mon, MON_DATA_SPATK_IV, &fixedIV); + SetMonBoxData(mon, MON_DATA_SPDEF_IV, &fixedIV); + } + else + { + u32 iv; + value = (u16)Random(); + + iv = value & 0x1F; + SetMonBoxData(mon, MON_DATA_HP_IV, (u8 *)&iv); + iv = (value & 0x3E0) >> 5; + SetMonBoxData(mon, MON_DATA_ATK_IV, (u8 *)&iv); + iv = (value &0x7C00) >> 10; + SetMonBoxData(mon, MON_DATA_DEF_IV, (u8 *)&iv); + + value = (u16)Random(); + + iv = value & 0x1F; + SetMonBoxData(mon, MON_DATA_SPD_IV, (u8 *)&iv); + iv = (value & 0x3E0) >> 5; + SetMonBoxData(mon, MON_DATA_SPATK_IV, (u8 *)&iv); + iv = (value &0x7C00) >> 10; + SetMonBoxData(mon, MON_DATA_SPDEF_IV, (u8 *)&iv); + } + + if (gBaseStats[species].ability2) + { + value = personality & 1; + SetMonBoxData(mon, MON_DATA_ALT_ABILITY, (u8 *)&value); + } + + sub_803B720(mon); +} + +void pokemon_make_with_nature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature) +{ + u32 personality; + + do + { + u32 r = Random(); + personality = (u16)r | (Random() << 16); + } + while (nature != GetNatureFromPersonality(personality)); + + create_pokemon_set_level(mon, species, level, fixedIV, 1, personality, 0, 0); +} + +void unref_sub_803AB44(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter) +{ + u32 personality; + + if ((u8)(unownLetter - 1) < 28) + { + u16 actualLetter; + + do + { + u32 r = Random(); + personality = (u16)r | (Random() << 16); + actualLetter = ((((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | personality & 0x3) % 28); + } + while (nature != GetNatureFromPersonality(personality) + || gender != pokemon_species_get_gender_info(species, personality) + || actualLetter != unownLetter - 1); + } + else + { + do + { + u32 r = Random(); + personality = (u16)r | (Random() << 16); + } + while (nature != GetNatureFromPersonality(personality) + || gender != pokemon_species_get_gender_info(species, personality)); + } + + create_pokemon_set_level(mon, species, level, fixedIV, 1, personality, 0, 0); +} + +void sub_803AC44(struct Pokemon *mon, u16 species, u8 level) +{ + u32 personality; + u32 otId; + + do + { + u32 r1, r2; + r1 = Random(); + otId = (u16)r1 | (Random() << 16); + r2 = Random(); + personality = (u16)r2 | (Random() << 16); + } + while (pokemon_species_get_gender_info(species, personality) != MALE); + create_pokemon_set_level(mon, species, level, 32, 1, personality, 1, otId); +} + +void sub_803ACAC(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) +{ + create_pokemon_set_level(mon, species, level, 0, 1, personality, 0, 0); + SetMonData(mon, MON_DATA_IVS, (u8 *)&ivs); + pokemon_calc_effective_stats(mon); +} + +void unref_sub_803ACEC(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) +{ + create_pokemon_set_level(mon, species, level, 0, 0, 0, 1, otId); + SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); + SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]); + SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]); + SetMonData(mon, MON_DATA_SPD_IV, &ivs[3]); + SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]); + SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]); + pokemon_calc_effective_stats(mon); +} + +void pokemon_make_ev_something(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread) +{ + register s32 i asm("r5"); + register u32 temp asm("r4"); + s32 statCount = 0; + u16 evAmount; + register u32 mask1 asm("r1"); + u8 mask2; + + create_pokemon_set_level(mon, species, level, fixedIV, 0, 0, 0, 0); + + temp = evSpread; + mask1 = 1; + i = 5; + do + { + if (temp & mask1) + statCount++; + temp >>= 1; + i--; + } while (i >= 0); + + + evAmount = 510 / statCount; + mask2 = 1; + i = 0; + do + { + if (evSpread & mask2) + SetMonData(mon, MON_DATA_HP_EV + i, (u8 *)&evAmount); + mask2 <<= 1; + i++; + } while (i < 6); + + pokemon_calc_effective_stats(mon); +} + +void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) +{ + s32 i; + u8 nickname[11]; + u8 language; + u8 value; + + create_pokemon_set_level(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId); + + for (i = 0; i < 4; i++) + sub_803B6A4(mon, src->moves[i], i); + + SetMonData(mon, MON_DATA_PP_BONUSES, (u8 *)&(src->ppBonuses)); + SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&(src->heldItem)); + + StringCopy(nickname, src->nickname); + + if (nickname[0] == 0xFC && nickname[1] == 0x15) + language = 1; + else + language = 2; + + SetMonData(mon, MON_DATA_LANGUAGE, &language); + SkipExtCtrlCodes(nickname); + SetMonData(mon, MON_DATA_NICKNAME, nickname); + SetMonData(mon, MON_DATA_FRIENDSHIP, (u8 *)&(src->friendship)); + SetMonData(mon, MON_DATA_HP_EV, (u8 *)&(src->hpEV)); + SetMonData(mon, MON_DATA_ATK_EV, (u8 *)&(src->attackEV)); + SetMonData(mon, MON_DATA_DEF_EV, (u8 *)&(src->defenseEV)); + SetMonData(mon, MON_DATA_SPD_EV, (u8 *)&(src->speedEV)); + SetMonData(mon, MON_DATA_SPATK_EV, (u8 *)&(src->spAttackEV)); + SetMonData(mon, MON_DATA_SPDEF_EV, (u8 *)&(src->spDefenseEV)); + value = src->altAbility; + SetMonData(mon, MON_DATA_ALT_ABILITY, &value); + value = src->hpIV; + SetMonData(mon, MON_DATA_HP_IV, &value); + value = src->attackIV; + SetMonData(mon, MON_DATA_ATK_IV, &value); + value = src->defenseIV; + SetMonData(mon, MON_DATA_DEF_IV, &value); + value = src->speedIV; + SetMonData(mon, MON_DATA_SPD_IV, &value); + value = src->spAttackIV; + SetMonData(mon, MON_DATA_SPATK_IV, &value); + value = src->spDefenseIV; + SetMonData(mon, MON_DATA_SPDEF_IV, &value); + pokemon_calc_effective_stats(mon); +} + +void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest) +{ + s32 i; + u16 heldItem; + + dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + + if (heldItem == 175) + heldItem = 0; + + dest->heldItem = heldItem; + + for (i = 0; i < 4; i++) + dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); + + dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL); + dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); + dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); + dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); + dest->speedEV = GetMonData(mon, MON_DATA_SPD_EV, NULL); + dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); + dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); + dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); + dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); + dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); + dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); + dest->speedIV = GetMonData(mon, MON_DATA_SPD_IV, NULL); + dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); + dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); + dest->altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); + dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + GetMonData(mon, MON_DATA_NICKNAME, dest->nickname); +} + +u16 pokemon_calc_checksum(struct Pokemon *mon) +{ + u16 checksum = 0; + union PokemonSubstruct *substruct0 = GetSubstruct(mon, mon->box.personality, 0); + union PokemonSubstruct *substruct1 = GetSubstruct(mon, mon->box.personality, 1); + union PokemonSubstruct *substruct2 = GetSubstruct(mon, mon->box.personality, 2); + union PokemonSubstruct *substruct3 = GetSubstruct(mon, mon->box.personality, 3); + s32 i; + + for (i = 0; i < 6; i++) + checksum += substruct0->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct1->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct2->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct3->raw[i]; + + return checksum; +} + +#define CALC_STAT(base, iv, ev, statIndex, field) \ +{ \ + u8 baseStat = gBaseStats[species].base; \ + s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ + u8 nature = GetNature(mon); \ + n = nature_stat_mod(nature, n, statIndex); \ + SetMonData(mon, field, (u8 *)&n); \ +} + +void pokemon_calc_effective_stats(struct Pokemon *mon) +{ + s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); + 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_SPD_IV, NULL); + s32 speedEV = GetMonData(mon, MON_DATA_SPD_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 = level_by_exp(mon); + s32 newMaxHP; + u8 nature; + + SetMonData(mon, MON_DATA_LEVEL, (u8 *)&level); + + if (species == SPECIES_SHEDINJA) + { + newMaxHP = 1; + } + else + { + s32 n = 2 * gBaseStats[species].baseHP + hpIV; + newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; + } + + unk_2000000[0x160FA] = newMaxHP - oldMaxHP; + if (unk_2000000[0x160FA] == 0) + unk_2000000[0x160FA] = 1; + + SetMonData(mon, MON_DATA_MAX_HP, (u8 *)&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_SPD) + CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) + CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) + + if (species == SPECIES_SHEDINJA) + { + if (currentHP != 0 || oldMaxHP == 0) + { + currentHP = 1; + goto set_hp; + } + } + else + { + if (currentHP != 0 || oldMaxHP == 0) + { + if (currentHP != 0) + currentHP += newMaxHP - oldMaxHP; + else if (oldMaxHP == 0) + currentHP = newMaxHP; + set_hp: + SetMonData(mon, MON_DATA_HP, (u8 *)¤tHP); + } + } +} + +void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest) +{ + u32 value = 0; + memcpy(&(dest->box), &(src->box), sizeof(struct BoxPokemon)); + SetMonData(dest, MON_DATA_STATUS, (u8 *)&value); + SetMonData(dest, MON_DATA_HP, (u8 *)&value); + SetMonData(dest, MON_DATA_MAX_HP, (u8 *)&value); + value = 255; + SetMonData(dest, MON_DATA_64, (u8 *)&value); + pokemon_calc_effective_stats(dest); +} + +u8 level_by_exp(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); + s32 level = 1; + + while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) + level++; + + return level - 1; +} + +u8 sub_803B570(struct BoxPokemon *mon) +{ + u16 species = GetMonBoxData(mon, MON_DATA_SPECIES, NULL); + u32 exp = GetMonBoxData(mon, MON_DATA_EXP, NULL); + s32 level = 1; + + while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) + level++; + + return level - 1; +} + +u16 pokemon_moveset_pad_(struct Pokemon *mon, u16 value) +{ + return pokemon_moveset_pad(mon, value); +} + +u16 pokemon_moveset_pad(struct Pokemon *mon, u16 value) +{ + s32 i; + for (i = 0; i < 4; i++) + { + u16 move = GetMonBoxData(&(mon->box), MON_DATA_MOVE1 + i, NULL); + if (!move) + { + SetMonBoxData(mon, MON_DATA_MOVE1 + i, (u8 *)&value); + SetMonBoxData(mon, MON_DATA_PP1 + i, &(gBattleMoves[value].pp)); + return value; + } + if (move == value) + return -2; + } + return -1; +} + +u16 sub_803B660(struct BattlePokemon *mon, u16 value) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (!mon->moves[i]) + { + mon->moves[i] = value; + mon->pp[i] = gBattleMoves[value].pp; + return value; + } + } + + return -1; +} + +void sub_803B6A4(struct Pokemon *mon, u16 move, u8 slot) +{ + SetMonData(mon, MON_DATA_MOVE1 + slot, (u8 *)&move); + SetMonData(mon, MON_DATA_PP1 + slot, &(gBattleMoves[move].pp)); +} + +void sub_803B6E4(struct BattlePokemon *mon, u16 move, u8 slot) +{ + mon->moves[slot] = move; + mon->pp[slot] = gBattleMoves[move].pp; +} + +void unref_sub_803B714(struct Pokemon *mon) +{ + sub_803B720(mon); +} + +void sub_803B720(struct Pokemon *mon) +{ + u16 species = GetMonBoxData(&(mon->box), MON_DATA_SPECIES, NULL); + s32 level = sub_803B570(&(mon->box)); + s32 i; + + for (i = 0; gLevelUpLearnsetPointers[species][i] != (u16)-1; i++) + { + u16 moveLevel; + u16 move; + + moveLevel = (gLevelUpLearnsetPointers[species][i] & 0xFE00); + + if (moveLevel > (level << 9)) + break; + + move = (gLevelUpLearnsetPointers[species][i] & 0x1FF); + + if (pokemon_moveset_pad(mon, move) == (u16)-1) + sub_803B980(mon, move); + } +} + +u16 sub_803B7C8(struct Pokemon *mon, u8 a2) +{ + u32 retVal = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); + + if (a2) + { + byte_2024E88 = retVal; + + while ((gLevelUpLearnsetPointers[species][byte_2024E88] & 0xFE00) != (level << 9)) + { + byte_2024E88++; + if (gLevelUpLearnsetPointers[species][byte_2024E88] == (u16)-1) + return 0; + } + } + + if ((gLevelUpLearnsetPointers[species][byte_2024E88] & 0xFE00) == (level << 9)) + { + word_2024E82 = (gLevelUpLearnsetPointers[species][byte_2024E88] & 0x1FF); + byte_2024E88++; + retVal = pokemon_moveset_pad_(mon, word_2024E82); + } + + return retVal; +} + +void sub_803B8D4(struct Pokemon *mon, u16 move) +{ + s32 i; + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; + + for (i = 0; i < 3; i++) + { + moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL); + pp[i]= GetMonData(mon, MON_DATA_PP2 + i, NULL); + } + + ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + ppBonuses >>= 2; + moves[3] = move; + pp[3] = gBattleMoves[move].pp; + + for (i = 0; i < 4; i++) + { + SetMonData(mon, MON_DATA_MOVE1 + i, (u8 *)&moves[i]); + SetMonData(mon, MON_DATA_PP1 + i, &pp[i]); + } + + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void sub_803B980(struct Pokemon *mon, u16 move) +{ + s32 i; + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; + + for (i = 0; i < 3; i++) + { + moves[i] = GetMonBoxData(mon, MON_DATA_MOVE2 + i, NULL); + pp[i]= GetMonBoxData(mon, MON_DATA_PP2 + i, NULL); + } + + ppBonuses = GetMonBoxData(mon, MON_DATA_PP_BONUSES, NULL); + ppBonuses >>= 2; + moves[3] = move; + pp[3] = gBattleMoves[move].pp; + + for (i = 0; i < 4; i++) + { + SetMonBoxData(mon, MON_DATA_MOVE1 + i, (u8 *)&moves[i]); + SetMonBoxData(mon, MON_DATA_PP1 + i, &pp[i]); + } + + SetMonBoxData(mon, MON_DATA_PP_BONUSES, &ppBonuses); +} diff --git a/src/pokemon.c b/src/pokemon_2.c index a2c98a71b..eb18f8840 100644 --- a/src/pokemon.c +++ b/src/pokemon_2.c @@ -2,146 +2,13 @@ #include "text.h" #include "string_util.h" #include "pokemon.h" - -struct PokemonSubstruct0 -{ - u16 species; - u16 heldItem; - u32 experience; - u8 ppBonuses; - u8 friendship; -}; - -struct PokemonSubstruct1 -{ - u16 moves[4]; - u8 pp[4]; -}; - -struct PokemonSubstruct2 -{ - u8 hpEV; - u8 attackEV; - u8 defenseEV; - u8 speedEV; - u8 spAttackEV; - u8 spDefenseEV; - u8 cool; - u8 beauty; - u8 cute; - u8 smart; - u8 tough; - u8 sheen; -}; - -struct PokemonSubstruct3 -{ - u8 pokerus; - u8 metLocation; - - u16 metLevel:7; - u16 metGame:4; - u16 pokeball:4; - u16 otGender:1; - - u32 hpIV:5; - u32 attackIV:5; - u32 defenseIV:5; - u32 speedIV:5; - u32 spAttackIV:5; - u32 spDefenseIV:5; - u32 isEgg:1; - u32 altAbility:1; - - u32 coolRibbon:3; - u32 beautyRibbon:3; - u32 cuteRibbon:3; - u32 smartRibbon:3; - u32 toughRibbon:3; - u32 championRibbon:1; - u32 winningRibbon:1; - u32 victoryRibbon:1; - u32 artistRibbon:1; - u32 effortRibbon:1; - u32 giftRibbon1:1; - u32 giftRibbon2:1; - u32 giftRibbon3:1; - u32 giftRibbon4:1; - u32 giftRibbon5:1; - u32 giftRibbon6:1; - u32 giftRibbon7:1; - u32 fatefulEncounter:5; // unused in Ruby/Sapphire, but the high bit must be set for Mew/Deoxys to obey in FR/LG/Emerald -}; - -union PokemonSubstruct -{ - struct PokemonSubstruct0 type0; - struct PokemonSubstruct1 type1; - struct PokemonSubstruct2 type2; - struct PokemonSubstruct3 type3; -}; - -struct BoxPokemon -{ - u32 personality; - u32 otId; - u8 nickname[10]; - u8 language; - u8 isBadEgg:1; - u8 sanity2:1; - u8 sanity3:1; - u8 unused:5; - u8 otName[7]; - u8 markings; - u16 checksum; - u16 unknown; - - union - { - u32 raw[12]; - union PokemonSubstruct substructs[4]; - } secure; -}; - -struct Pokemon -{ - struct BoxPokemon box; - u32 status; - u8 level; - u8 pokerus; - u16 hp; - u16 maxHP; - u16 attack; - u16 defense; - u16 speed; - u16 spAttack; - u16 spDefense; -}; - -void ZeroPokemonBoxData(struct BoxPokemon *mon); - -u16 pokemon_calc_checksum(struct Pokemon *mon); - -void EncryptMon(struct Pokemon *mon); -void DecryptMon(struct Pokemon *mon); -union PokemonSubstruct *GetSubstruct(struct Pokemon *mon, u32 personality, u8 substructType); -u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data); -u32 GetMonBoxData(struct Pokemon *mon, s32 field, u8 *data); +#include "species.h" +#include "main.h" extern u8 gBadEggNickname[]; extern u8 gEggNickname[]; extern u32 gBitTable[]; -/* -void ZeroPokemonBoxData(struct BoxPokemon *mon) -{ - u8 *raw = (u8 *)mon; - u32 i; - for (i = 0; i < sizeof(struct BoxPokemon); i++) - raw[i] = 0; -} -*/ - void EncryptMon(struct Pokemon *mon) { u32 i; |