summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-09-09 21:18:37 -0700
committerYamaArashi <shadow962@live.com>2016-09-09 21:18:37 -0700
commit0b48cbfed8a3332d6b164c51a224b154fef858e6 (patch)
tree64434dcdbac0f2031d7cf29ed52e9ed82d2aeb68
parent65a978e4f71f347894458ee1d1282af2668585cf (diff)
more decompilation of pokemon functions
-rw-r--r--Makefile2
-rw-r--r--asm/rom3.s3937
-rw-r--r--asm/rom_803BA2C.s1528
-rw-r--r--ewram_syms.txt3
-rw-r--r--include/pokemon.h283
-rw-r--r--iwram_syms.txt3
-rw-r--r--ld_script.txt4
-rw-r--r--src/pokemon_1.c678
-rw-r--r--src/pokemon_2.c (renamed from src/pokemon.c)137
9 files changed, 2501 insertions, 4074 deletions
diff --git a/Makefile b/Makefile
index 50daabed2..fcbecde37 100644
--- a/Makefile
+++ b/Makefile
@@ -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 *)&currentHP);
+ }
+ }
+}
+
+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;