summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/battle_2.s12
-rw-r--r--asm/battle_interface.s4
-rw-r--r--asm/battle_script_commands.s10
-rw-r--r--asm/battle_setup.s2
-rw-r--r--asm/battle_tower.s6
-rw-r--r--asm/battle_util.s2
-rw-r--r--asm/overworld.s2
-rw-r--r--asm/party_menu.s2
-rw-r--r--asm/pokemon_3.s1228
-rw-r--r--asm/pokemon_summary_screen.s8
-rw-r--r--asm/script_pokemon_util_80BF8FC.s4
-rw-r--r--asm/trade.s2
-rw-r--r--asm/trainer_card.s4
-rw-r--r--data/data.s106
-rw-r--r--data/maps/BirthIsland_Exterior/scripts.inc2
-rw-r--r--data/maps/NavelRock_Base/scripts.inc2
-rw-r--r--data/maps/NavelRock_Summit/scripts.inc2
-rw-r--r--data/specials.inc2
-rw-r--r--include/battle.h34
-rw-r--r--include/battle_2.h1
-rw-r--r--include/battle_ai_script_commands.h2
-rw-r--r--include/battle_util.h1
-rw-r--r--include/constants/battle.h2
-rw-r--r--include/data2.h28
-rw-r--r--include/field_specials.h2
-rw-r--r--include/party_menu.h1
-rw-r--r--include/pokemon.h145
-rw-r--r--include/pokemon_3.h12
-rw-r--r--include/pokemon_storage_system.h1
-rw-r--r--include/strings.h11
-rw-r--r--ld_script.txt2
-rw-r--r--src/oak_speech.c8
-rw-r--r--src/pokemon.c1213
-rw-r--r--src/trainer_tower.c8
-rw-r--r--sym_ewram.txt8
35 files changed, 1297 insertions, 1582 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s
index ee7b80ad4..3fdaeca33 100644
--- a/asm/battle_2.s
+++ b/asm/battle_2.s
@@ -1132,7 +1132,7 @@ _0801067E:
adds r1, r0
ldrh r0, [r1]
strh r0, [r2, 0x10]
- bl sub_8044708
+ bl SetDeoxysStats
ldr r1, _080106F0 @ =gUnknown_2023E82
b _080108B2
.align 2, 0
@@ -1834,7 +1834,7 @@ _08010CE2:
adds r1, r7, 0
bl sub_8010414
bl sub_801017C
- bl sub_8044708
+ bl SetDeoxysStats
ldr r0, _08010D4C @ =gDecompressionBuffer
ldr r1, _08010D50 @ =gPlayerParty
movs r2, 0x96
@@ -6570,7 +6570,7 @@ _080131F6:
add r1, r10
ldr r2, [r1]
movs r1, 0x2
- bl sub_8044898
+ bl HandleSetPokedexFlag
b _080132C2
.align 2, 0
_08013230: .4byte gBaseStats
@@ -6609,7 +6609,7 @@ _0801324C:
add r1, r10
ldr r2, [r1]
movs r1, 0x2
- bl sub_8044898
+ bl HandleSetPokedexFlag
b _080132B4
_0801328E:
ldr r0, _08013324 @ =0x0001aa02
@@ -6628,7 +6628,7 @@ _0801328E:
add r1, r10
ldr r2, [r1]
movs r1, 0x2
- bl sub_8044898
+ bl HandleSetPokedexFlag
_080132B4:
movs r0, 0
bl EmitLoadMonSprite
@@ -7097,7 +7097,7 @@ _0801364C:
adds r1, r7
ldr r2, [r1]
movs r1, 0x2
- bl sub_8044898
+ bl HandleSetPokedexFlag
_08013684:
ldrb r0, [r4]
adds r0, 0x1
diff --git a/asm/battle_interface.s b/asm/battle_interface.s
index acf228669..959e4e19d 100644
--- a/asm/battle_interface.s
+++ b/asm/battle_interface.s
@@ -3610,7 +3610,7 @@ _08049734:
lsls r1, 24
lsrs r1, 24
adds r0, r7, 0
- bl sub_80448F8
+ bl CheckBattleTypeGhost
lsls r0, 24
cmp r0, 0
beq _08049754
@@ -3755,7 +3755,7 @@ sub_804981C: @ 804981C
ldr r6, _080498EC @ =gEnemyParty
adds r0, r6
adds r1, r4, 0
- bl sub_80448F8
+ bl CheckBattleTypeGhost
lsls r0, 24
cmp r0, 0
bne _0804991C
diff --git a/asm/battle_script_commands.s b/asm/battle_script_commands.s
index b240c3da2..747859147 100644
--- a/asm/battle_script_commands.s
+++ b/asm/battle_script_commands.s
@@ -13273,7 +13273,7 @@ sub_80240D4: @ 80240D4
adds r1, r4
ldr r2, [r1]
movs r1, 0x2
- bl sub_8044898
+ bl HandleSetPokedexFlag
_0802412A:
ldr r2, _08024180 @ =gAbsentBattlerFlags
ldr r1, _08024184 @ =gBitTable
@@ -13398,7 +13398,7 @@ _08024228:
bl GetBankMultiplayerId
lsls r0, 24
lsrs r0, 24
- bl sub_8043620
+ bl GetLinkTrainerFlankId
lsls r0, 16
lsrs r0, 16
cmp r0, 0x1
@@ -21520,7 +21520,7 @@ _08028336:
bl GetBankMultiplayerId
lsls r0, 24
lsrs r0, 24
- bl sub_8043620
+ bl GetLinkTrainerFlankId
lsls r0, 16
lsrs r0, 16
cmp r0, 0x1
@@ -21665,7 +21665,7 @@ _08028458:
bl GetBankMultiplayerId
lsls r0, 24
lsrs r0, 24
- bl sub_8043620
+ bl GetLinkTrainerFlankId
lsls r0, 16
lsrs r0, 16
cmp r0, 0x1
@@ -32384,7 +32384,7 @@ _0802D9B4:
lsrs r0, 16
movs r1, 0x3
adds r2, r4, 0
- bl sub_8044898
+ bl HandleSetPokedexFlag
ldr r1, _0802D9D4 @ =gUnknown_2023D74
ldr r0, [r1]
adds r0, 0x5
diff --git a/asm/battle_setup.s b/asm/battle_setup.s
index db8b366b4..99e4c3468 100644
--- a/asm/battle_setup.s
+++ b/asm/battle_setup.s
@@ -2051,7 +2051,7 @@ sub_8080628: @ 8080628
beq _080806BE
ldr r0, _08080668 @ =gTrainerBattleOpponent_A
ldrh r0, [r0]
- bl sub_804367C
+ bl GetTrainerEncounterMusicId
lsls r0, 24
lsrs r0, 24
cmp r0, 0xD
diff --git a/asm/battle_tower.s b/asm/battle_tower.s
index 01ac780a2..453896446 100644
--- a/asm/battle_tower.s
+++ b/asm/battle_tower.s
@@ -1222,7 +1222,7 @@ _080E6286:
adds r2, r3
ldr r1, [r4]
adds r1, r2
- bl sub_803E0A4
+ bl CreateBattleTowerMon
adds r6, 0x1
cmp r6, 0x2
ble _080E6286
@@ -1251,7 +1251,7 @@ _080E62B2:
muls r2, r6
adds r2, 0x1C
adds r1, r2
- bl sub_803E0A4
+ bl CreateBattleTowerMon
adds r6, 0x1
cmp r6, 0x2
ble _080E62B2
@@ -2136,7 +2136,7 @@ _080E69A0:
adds r2, r1
ldr r1, [r4]
adds r1, r2
- bl sub_803E0A4
+ bl CreateBattleTowerMon
adds r5, 0x1
cmp r5, 0x2
ble _080E69A0
diff --git a/asm/battle_util.s b/asm/battle_util.s
index 04202e9da..50f5210aa 100644
--- a/asm/battle_util.s
+++ b/asm/battle_util.s
@@ -5775,7 +5775,7 @@ _08019C40:
mov r8, r0
_08019C66:
adds r0, r7, 0
- bl sub_8043620
+ bl GetLinkTrainerFlankId
lsls r0, 24
lsrs r6, r0, 24
lsls r0, r6, 1
diff --git a/asm/overworld.s b/asm/overworld.s
index 5e50a5d05..934fd29f3 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -38,7 +38,7 @@ sub_8054C04: @ 8054C04
adds r4, r0, 0
lsls r4, 24
lsrs r4, 24
- bl sub_80444F8
+ bl GetPlayerPartyHighestLevel
lsls r0, 24
lsrs r0, 24
ldr r1, _08054C40 @ =gUnknown_826D294
diff --git a/asm/party_menu.s b/asm/party_menu.s
index 215dfbe8e..ace2e3554 100644
--- a/asm/party_menu.s
+++ b/asm/party_menu.s
@@ -18182,7 +18182,7 @@ sub_8127AC0: @ 8127AC0
bne _08127B08
_08127AE6:
ldr r4, _08127AFC @ =gStringVar1
- bl sub_80444C4
+ bl GetTrainerPartnerName
adds r1, r0, 0
adds r0, r4, 0
bl StringCopy
diff --git a/asm/pokemon_3.s b/asm/pokemon_3.s
deleted file mode 100644
index 416c996bb..000000000
--- a/asm/pokemon_3.s
+++ /dev/null
@@ -1,1228 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80444F8
-sub_80444F8: @ 80444F8
- push {r4-r6,lr}
- movs r6, 0x1
- movs r5, 0
-_080444FE:
- movs r0, 0x64
- adds r1, r5, 0
- muls r1, r0
- ldr r0, _08044548 @ =gPlayerParty
- adds r4, r1, r0
- adds r0, r4, 0
- movs r1, 0x5
- movs r2, 0
- bl GetMonData
- cmp r0, 0x1
- bne _08044538
- adds r0, r4, 0
- movs r1, 0x6
- movs r2, 0
- bl GetMonData
- cmp r0, 0
- bne _08044538
- adds r0, r4, 0
- movs r1, 0x38
- movs r2, 0
- bl GetMonData
- lsls r0, 24
- lsrs r0, 24
- cmp r0, r6
- bls _08044538
- adds r6, r0, 0
-_08044538:
- adds r5, 0x1
- cmp r5, 0x5
- ble _080444FE
- adds r0, r6, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_08044548: .4byte gPlayerParty
- thumb_func_end sub_80444F8
-
- thumb_func_start sub_804454C
-sub_804454C: @ 804454C
- lsls r0, 16
- lsrs r0, 16
- ldr r1, _08044558 @ =gFacilityClassToPicIndex
- adds r0, r1
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_08044558: .4byte gFacilityClassToPicIndex
- thumb_func_end sub_804454C
-
- thumb_func_start sub_804455C
-sub_804455C: @ 804455C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r5, r1, 24
- cmp r0, 0x5
- bhi _08044632
- lsls r0, 2
- ldr r1, _08044574 @ =_08044578
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08044574: .4byte _08044578
- .align 2, 0
-_08044578:
- .4byte _08044632
- .4byte _08044590
- .4byte _08044664
- .4byte _080445BC
- .4byte _08044664
- .4byte _080445F4
-_08044590:
- ldr r0, _080445B0 @ =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x40
- ands r0, r1
- cmp r0, 0
- beq _08044632
- ldr r0, _080445B4 @ =gMain
- ldr r1, _080445B8 @ =0x00000439
- adds r0, r1
- ldrb r1, [r0]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _08044632
- b _0804461A
- .align 2, 0
-_080445B0: .4byte gBattleTypeFlags
-_080445B4: .4byte gMain
-_080445B8: .4byte 0x00000439
-_080445BC:
- ldr r0, _080445E8 @ =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x40
- ands r0, r1
- cmp r0, 0
- beq _08044632
- ldr r0, _080445EC @ =gMain
- ldr r1, _080445F0 @ =0x00000439
- adds r0, r1
- ldrb r1, [r0]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _08044632
- cmp r5, 0x1
- beq _08044664
- cmp r5, 0x4
- beq _08044664
- cmp r5, 0x5
- beq _08044664
- b _08044632
- .align 2, 0
-_080445E8: .4byte gBattleTypeFlags
-_080445EC: .4byte gMain
-_080445F0: .4byte 0x00000439
-_080445F4:
- ldr r0, _08044638 @ =gBattleTypeFlags
- ldr r2, [r0]
- movs r3, 0x2
- adds r0, r2, 0
- ands r0, r3
- cmp r0, 0
- beq _08044648
- ldr r0, _0804463C @ =gMain
- ldr r1, _08044640 @ =0x00000439
- adds r0, r1
- ldrb r1, [r0]
- adds r0, r3, 0
- ands r0, r1
- cmp r0, 0
- beq _08044632
- movs r0, 0x40
- ands r2, r0
- cmp r2, 0
- beq _08044658
-_0804461A:
- ldr r4, _08044644 @ =gLinkPlayers
- bl GetMultiplayerId
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r1, r4
- ldrh r0, [r1, 0x18]
- cmp r0, r5
- bne _08044664
-_08044632:
- movs r0, 0
- b _08044666
- .align 2, 0
-_08044638: .4byte gBattleTypeFlags
-_0804463C: .4byte gMain
-_08044640: .4byte 0x00000439
-_08044644: .4byte gLinkPlayers
-_08044648:
- ldr r0, _0804466C @ =gMain
- ldr r1, _08044670 @ =0x00000439
- adds r0, r1
- ldrb r1, [r0]
- adds r0, r3, 0
- ands r0, r1
- cmp r0, 0
- beq _08044632
-_08044658:
- adds r0, r5, 0
- bl GetBattlerSide
- lsls r0, 24
- cmp r0, 0
- beq _08044632
-_08044664:
- movs r0, 0x1
-_08044666:
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_0804466C: .4byte gMain
-_08044670: .4byte 0x00000439
- thumb_func_end sub_804455C
-
- thumb_func_start GetDeoxysStat
-GetDeoxysStat: @ 8044674
- push {r4-r6,lr}
- adds r5, r0, 0
- adds r6, r1, 0
- ldr r0, _0804469C @ =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x20
- ands r0, r1
- cmp r0, 0
- bne _08044698
- adds r0, r5, 0
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- movs r1, 0xCD
- lsls r1, 1
- cmp r0, r1
- beq _080446A0
-_08044698:
- movs r0, 0
- b _080446FE
- .align 2, 0
-_0804469C: .4byte gBattleTypeFlags
-_080446A0:
- adds r1, r6, 0
- adds r1, 0x27
- adds r0, r5, 0
- movs r2, 0
- bl GetMonData
- adds r4, r0, 0
- adds r1, r6, 0
- adds r1, 0x1A
- adds r0, r5, 0
- movs r2, 0
- bl GetMonData
- ldr r2, _08044704 @ =gUnknown_825E026
- lsls r1, r6, 1
- adds r1, r2
- ldrh r1, [r1]
- lsls r1, 1
- adds r1, r4
- cmp r0, 0
- bge _080446CC
- adds r0, 0x3
-_080446CC:
- asrs r0, 2
- adds r0, r1, r0
- adds r1, r5, 0
- adds r1, 0x54
- ldrb r1, [r1]
- muls r0, r1
- movs r1, 0x64
- bl __divsi3
- adds r0, 0x5
- lsls r0, 16
- lsrs r4, r0, 16
- adds r0, r5, 0
- bl GetNature
- lsls r0, 24
- lsrs r0, 24
- lsls r2, r6, 24
- lsrs r2, 24
- adds r1, r4, 0
- bl nature_stat_mod
- lsls r0, 16
- lsrs r4, r0, 16
- adds r0, r4, 0
-_080446FE:
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_08044704: .4byte gUnknown_825E026
- thumb_func_end GetDeoxysStat
-
- thumb_func_start sub_8044708
-sub_8044708: @ 8044708
- push {r4,r5,lr}
- sub sp, 0x4
- movs r5, 0
-_0804470E:
- movs r0, 0x64
- adds r1, r5, 0
- muls r1, r0
- ldr r0, _080447A8 @ =gPlayerParty
- adds r4, r1, r0
- adds r0, r4, 0
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- movs r1, 0xCD
- lsls r1, 1
- cmp r0, r1
- bne _08044798
- adds r0, r4, 0
- movs r1, 0x3B
- movs r2, 0
- bl GetMonData
- str r0, [sp]
- adds r0, r4, 0
- movs r1, 0x3B
- mov r2, sp
- bl SetMonData
- adds r0, r4, 0
- movs r1, 0x3C
- movs r2, 0
- bl GetMonData
- str r0, [sp]
- adds r0, r4, 0
- movs r1, 0x3C
- mov r2, sp
- bl SetMonData
- adds r0, r4, 0
- movs r1, 0x3D
- movs r2, 0
- bl GetMonData
- str r0, [sp]
- adds r0, r4, 0
- movs r1, 0x3D
- mov r2, sp
- bl SetMonData
- adds r0, r4, 0
- movs r1, 0x3E
- movs r2, 0
- bl GetMonData
- str r0, [sp]
- adds r0, r4, 0
- movs r1, 0x3E
- mov r2, sp
- bl SetMonData
- adds r0, r4, 0
- movs r1, 0x3F
- movs r2, 0
- bl GetMonData
- str r0, [sp]
- adds r0, r4, 0
- movs r1, 0x3F
- mov r2, sp
- bl SetMonData
-_08044798:
- adds r5, 0x1
- cmp r5, 0x5
- ble _0804470E
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080447A8: .4byte gPlayerParty
- thumb_func_end sub_8044708
-
- thumb_func_start sub_80447AC
-sub_80447AC: @ 80447AC
- push {lr}
- bl GetMultiplayerId
- movs r1, 0x1
- eors r0, r1
- lsls r0, 24
- lsrs r0, 24
- ldr r3, _080447E8 @ =gLinkPlayers
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r0, r3, 0x4
- adds r0, r1, r0
- ldr r2, [r0]
- movs r0, 0x7
- ands r2, r0
- adds r1, r3
- ldrb r0, [r1, 0x13]
- lsls r0, 3
- orrs r2, r0
- ldr r0, _080447EC @ =gUnknown_825E032
- lsls r2, 1
- adds r2, r0
- ldrh r0, [r2]
- bl sub_804454C
- lsls r0, 16
- lsrs r0, 16
- pop {r1}
- bx r1
- .align 2, 0
-_080447E8: .4byte gLinkPlayers
-_080447EC: .4byte gUnknown_825E032
- thumb_func_end sub_80447AC
-
- thumb_func_start sub_80447F0
-sub_80447F0: @ 80447F0
- push {lr}
- bl GetMultiplayerId
- movs r1, 0x1
- eors r0, r1
- lsls r0, 24
- lsrs r0, 24
- ldr r3, _0804482C @ =gLinkPlayers
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r0, r3, 0x4
- adds r0, r1, r0
- ldr r2, [r0]
- movs r0, 0x7
- ands r2, r0
- adds r1, r3
- ldrb r0, [r1, 0x13]
- lsls r0, 3
- orrs r2, r0
- ldr r1, _08044830 @ =gFacilityClassToTrainerClass
- ldr r0, _08044834 @ =gUnknown_825E032
- lsls r2, 1
- adds r2, r0
- ldrh r0, [r2]
- adds r0, r1
- ldrb r0, [r0]
- pop {r1}
- bx r1
- .align 2, 0
-_0804482C: .4byte gLinkPlayers
-_08044830: .4byte gFacilityClassToTrainerClass
-_08044834: .4byte gUnknown_825E032
- thumb_func_end sub_80447F0
-
- thumb_func_start sub_8044838
-sub_8044838: @ 8044838
- push {r4-r7,lr}
- sub sp, 0x14
- ldr r0, _08044888 @ =gSpecialVar_0x8004
- ldrh r5, [r0]
- ldr r0, _0804488C @ =gSpecialVar_0x8005
- ldrh r4, [r0]
- ldr r0, _08044890 @ =gSpecialVar_0x8006
- ldrh r6, [r0]
- bl ZeroEnemyPartyMons
- ldr r7, _08044894 @ =gEnemyParty
- lsls r4, 24
- lsrs r4, 24
- movs r0, 0
- str r0, [sp]
- str r0, [sp, 0x4]
- str r0, [sp, 0x8]
- str r0, [sp, 0xC]
- adds r0, r7, 0
- adds r1, r5, 0
- adds r2, r4, 0
- movs r3, 0x20
- bl CreateObedientMon
- cmp r6, 0
- beq _08044880
- add r0, sp, 0x10
- strb r6, [r0]
- adds r1, r0, 0
- asrs r0, r6, 8
- strb r0, [r1, 0x1]
- adds r0, r7, 0
- movs r1, 0xC
- add r2, sp, 0x10
- bl SetMonData
-_08044880:
- add sp, 0x14
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08044888: .4byte gSpecialVar_0x8004
-_0804488C: .4byte gSpecialVar_0x8005
-_08044890: .4byte gSpecialVar_0x8006
-_08044894: .4byte gEnemyParty
- thumb_func_end sub_8044838
-
- thumb_func_start sub_8044898
-sub_8044898: @ 8044898
- push {r4-r7,lr}
- adds r7, r2, 0
- lsls r0, 16
- lsrs r4, r0, 16
- adds r6, r4, 0
- lsls r1, 24
- lsrs r5, r1, 24
- movs r0, 0x2
- eors r0, r5
- negs r1, r0
- orrs r1, r0
- lsrs r1, 31
- adds r0, r4, 0
- bl GetSetPokedexFlag
- lsls r0, 24
- cmp r0, 0
- bne _080448EE
- adds r0, r4, 0
- adds r1, r5, 0
- bl GetSetPokedexFlag
- adds r0, r4, 0
- bl NationalPokedexNumToSpecies
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0xC9
- bne _080448D8
- ldr r0, _080448F4 @ =gSaveBlock2Ptr
- ldr r0, [r0]
- str r7, [r0, 0x1C]
-_080448D8:
- adds r0, r6, 0
- bl NationalPokedexNumToSpecies
- lsls r0, 16
- movs r1, 0x9A
- lsls r1, 17
- cmp r0, r1
- bne _080448EE
- ldr r0, _080448F4 @ =gSaveBlock2Ptr
- ldr r0, [r0]
- str r7, [r0, 0x20]
-_080448EE:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080448F4: .4byte gSaveBlock2Ptr
- thumb_func_end sub_8044898
-
- thumb_func_start sub_80448F8
-sub_80448F8: @ 80448F8
- push {r4,lr}
- sub sp, 0xC
- adds r4, r0, 0
- lsls r1, 24
- lsrs r2, r1, 24
- ldr r0, _0804493C @ =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 8
- ands r0, r1
- cmp r0, 0
- beq _08044944
- adds r0, r2, 0
- bl GetBattlerSide
- lsls r0, 24
- cmp r0, 0
- beq _08044944
- adds r0, r4, 0
- movs r1, 0x2
- mov r2, sp
- bl GetMonData
- mov r0, sp
- bl StringGetEnd10
- ldr r1, _08044940 @ =gUnknown_841D148
- mov r0, sp
- bl StringCompare
- cmp r0, 0
- bne _08044944
- movs r0, 0x1
- b _08044946
- .align 2, 0
-_0804493C: .4byte gBattleTypeFlags
-_08044940: .4byte gUnknown_841D148
-_08044944:
- movs r0, 0
-_08044946:
- add sp, 0xC
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80448F8
-
- thumb_func_start sub_8044950
-sub_8044950: @ 8044950
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r4, r0, 0
- lsls r1, 24
- lsrs r1, 24
- movs r6, 0
- cmp r1, 0x3
- bls _080449EC
- adds r5, r6, 0
- ldrb r0, [r4]
- lsls r0, 28
- lsrs r0, 28
- cmp r5, r0
- bge _08044A2C
-_08044972:
- ldr r1, [r4, 0x10]
- lsls r3, r5, 1
- adds r0, r3, r5
- lsls r0, 3
- ldr r2, _080449E8 @ =gUnknown_825DEF0
- adds r1, r0, r1
- adds r0, r2
- ldm r0!, {r2,r6,r7}
- stm r1!, {r2,r6,r7}
- ldm r0!, {r2,r6,r7}
- stm r1!, {r2,r6,r7}
- movs r6, 0
- ldrb r2, [r4, 0x1]
- ldr r0, [r4, 0x10]
- mov r10, r0
- mov r8, r3
- ldr r7, [r4, 0x14]
- adds r1, r5, 0x1
- mov r9, r1
- cmp r6, r2
- bcs _080449C2
- mov r12, r7
- ldr r1, [r4, 0xC]
- lsls r0, r5, 2
- adds r0, r1
- ldr r3, [r0]
-_080449A6:
- adds r0, r5, 0
- muls r0, r2
- adds r0, r6
- lsls r0, 3
- add r0, r12
- lsls r1, r6, 11
- adds r1, r3, r1
- str r1, [r0]
- adds r0, r6, 0x1
- lsls r0, 16
- lsrs r6, r0, 16
- ldrb r2, [r4, 0x1]
- cmp r6, r2
- bcc _080449A6
-_080449C2:
- mov r2, r8
- adds r1, r2, r5
- lsls r1, 3
- add r1, r10
- ldrb r0, [r4, 0x1]
- muls r0, r5
- lsls r0, 3
- adds r0, r7, r0
- str r0, [r1, 0xC]
- mov r3, r9
- lsls r0, r3, 16
- lsrs r5, r0, 16
- ldrb r0, [r4]
- lsls r0, 28
- lsrs r0, 28
- cmp r5, r0
- blt _08044972
- b _08044A2C
- .align 2, 0
-_080449E8: .4byte gUnknown_825DEF0
-_080449EC:
- lsls r0, r1, 1
- adds r0, r1
- lsls r0, 3
- ldr r2, _08044A3C @ =gUnknown_825DEF0
- ldr r1, [r4, 0x10]
- adds r0, r2
- ldm r0!, {r2,r5,r7}
- stm r1!, {r2,r5,r7}
- ldm r0!, {r3,r5,r7}
- stm r1!, {r3,r5,r7}
- ldr r0, [r4, 0x10]
- mov r10, r0
- ldr r7, [r4, 0x14]
- ldrb r1, [r4, 0x1]
- cmp r6, r1
- bcs _08044A28
- adds r3, r7, 0
- ldr r0, [r4, 0xC]
- ldr r2, [r0]
-_08044A12:
- lsls r0, r6, 3
- adds r0, r3
- lsls r1, r6, 11
- adds r1, r2, r1
- str r1, [r0]
- adds r0, r6, 0x1
- lsls r0, 16
- lsrs r6, r0, 16
- ldrb r5, [r4, 0x1]
- cmp r6, r5
- bcc _08044A12
-_08044A28:
- mov r6, r10
- str r7, [r6, 0xC]
-_08044A2C:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08044A3C: .4byte gUnknown_825DEF0
- thumb_func_end sub_8044950
-
- thumb_func_start sub_8044A40
-sub_8044A40: @ 8044A40
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r4, r0, 0
- ldrb r0, [r4]
- lsls r0, 28
- movs r3, 0
- cmp r0, 0
- beq _08044ADA
- ldr r0, _08044AE8 @ =gUnknown_825E05C
- mov r10, r0
-_08044A5A:
- ldr r0, [r4, 0x10]
- lsls r2, r3, 1
- adds r1, r2, r3
- lsls r1, 3
- adds r1, r0
- mov r0, r10
- ldm r0!, {r5-r7}
- stm r1!, {r5-r7}
- ldm r0!, {r5-r7}
- stm r1!, {r5-r7}
- movs r5, 0
- ldr r0, [r4, 0x10]
- mov r8, r0
- mov r12, r2
- ldr r7, [r4, 0x14]
- adds r1, r3, 0x1
- mov r9, r1
- ldrb r6, [r4, 0x1]
- cmp r5, r6
- bcs _08044AAE
- adds r6, r7, 0
- ldr r1, [r4, 0xC]
- lsls r0, r3, 2
- adds r0, r1
- ldr r2, [r0]
-_08044A8C:
- ldrb r0, [r4]
- lsls r0, 28
- lsrs r0, 28
- adds r1, r3, 0
- muls r1, r0
- adds r1, r5
- lsls r1, 3
- adds r1, r6
- lsls r0, r5, 11
- adds r0, r2, r0
- str r0, [r1]
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
- ldrb r0, [r4, 0x1]
- cmp r5, r0
- bcc _08044A8C
-_08044AAE:
- mov r5, r12
- adds r1, r5, r3
- lsls r1, 3
- add r1, r8
- ldrb r0, [r4]
- lsls r0, 28
- lsrs r0, 28
- muls r0, r3
- lsls r0, 3
- adds r0, r7, r0
- str r0, [r1, 0xC]
- ldr r6, _08044AEC @ =gUnknown_82349BC
- str r6, [r1, 0x8]
- strh r3, [r1, 0x2]
- mov r7, r9
- lsls r0, r7, 16
- lsrs r3, r0, 16
- ldrb r0, [r4]
- lsls r0, 28
- lsrs r0, 28
- cmp r3, r0
- blt _08044A5A
-_08044ADA:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08044AE8: .4byte gUnknown_825E05C
-_08044AEC: .4byte gUnknown_82349BC
- thumb_func_end sub_8044A40
-
- thumb_func_start SetUpMonSpriteManagerMaybe
-SetUpMonSpriteManagerMaybe: @ 8044AF0
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r1, 24
- lsrs r5, r1, 24
- movs r0, 0
- mov r8, r0
- ldr r4, _08044B34 @ =gUnknown_20244F4
- ldr r1, [r4]
- cmp r1, 0
- beq _08044B1E
- ldrb r0, [r1, 0x2]
- cmp r0, 0xA3
- beq _08044B2E
- adds r0, r1, 0
- movs r1, 0
- movs r2, 0x18
- bl memset
- mov r1, r8
- str r1, [r4]
-_08044B1E:
- ldr r4, _08044B34 @ =gUnknown_20244F4
- movs r0, 0x18
- bl AllocZeroed
- adds r2, r0, 0
- str r2, [r4]
- cmp r2, 0
- bne _08044B38
-_08044B2E:
- movs r0, 0
- b _08044D70
- .align 2, 0
-_08044B34: .4byte gUnknown_20244F4
-_08044B38:
- cmp r5, 0
- beq _08044B94
- cmp r5, 0x1
- bne _08044B94
- cmp r6, 0x4
- bne _08044B5E
- ldrb r1, [r2]
- movs r0, 0x10
- negs r0, r0
- ands r0, r1
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r2]
- ldr r2, [r4]
- ldrb r1, [r2]
- movs r0, 0xF
- ands r0, r1
- movs r1, 0x40
- b _08044B7C
-_08044B5E:
- cmp r6, 0x4
- bls _08044B64
- movs r6, 0
-_08044B64:
- ldrb r1, [r2]
- movs r0, 0x10
- negs r0, r0
- ands r0, r1
- movs r1, 0x1
- orrs r0, r1
- strb r0, [r2]
- ldr r2, [r4]
- ldrb r1, [r2]
- movs r0, 0xF
- ands r0, r1
- movs r1, 0x10
-_08044B7C:
- orrs r0, r1
- strb r0, [r2]
- ldr r2, _08044B90 @ =gUnknown_20244F4
- ldr r1, [r2]
- movs r0, 0x4
- strb r0, [r1, 0x1]
- ldr r1, [r2]
- movs r0, 0x1
- strb r0, [r1, 0x3]
- b _08044BD0
- .align 2, 0
-_08044B90: .4byte gUnknown_20244F4
-_08044B94:
- cmp r6, 0
- bne _08044B9A
- movs r6, 0x1
-_08044B9A:
- cmp r6, 0x8
- bls _08044BA0
- movs r6, 0x8
-_08044BA0:
- ldr r4, _08044C10 @ =gUnknown_20244F4
- ldr r3, [r4]
- movs r0, 0xF
- adds r1, r6, 0
- ands r1, r0
- ldrb r2, [r3]
- movs r0, 0x10
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r3]
- ldr r2, [r4]
- lsls r3, r6, 4
- ldrb r1, [r2]
- movs r0, 0xF
- ands r0, r1
- orrs r0, r3
- strb r0, [r2]
- ldr r1, [r4]
- movs r2, 0
- movs r0, 0x4
- strb r0, [r1, 0x1]
- ldr r0, [r4]
- strb r2, [r0, 0x3]
-_08044BD0:
- ldr r5, _08044C10 @ =gUnknown_20244F4
- ldr r0, [r5]
- ldrb r1, [r0, 0x1]
- lsls r1, 11
- str r1, [r0, 0x4]
- ldrb r0, [r0]
- lsls r0, 28
- lsrs r0, 28
- muls r0, r1
- bl AllocZeroed
- ldr r1, [r5]
- str r0, [r1, 0x8]
- ldrb r0, [r1]
- lsls r0, 28
- lsrs r0, 23
- bl AllocZeroed
- adds r2, r0, 0
- ldr r1, [r5]
- str r2, [r1, 0xC]
- ldr r0, [r1, 0x8]
- cmp r0, 0
- beq _08044C04
- cmp r2, 0
- bne _08044C14
-_08044C04:
- movs r0, 0x1
- mov r1, r8
- orrs r1, r0
- mov r8, r1
- b _08044C44
- .align 2, 0
-_08044C10: .4byte gUnknown_20244F4
-_08044C14:
- ldrb r0, [r1]
- lsls r0, 28
- movs r4, 0
- adds r3, r5, 0
- cmp r0, 0
- beq _08044C44
-_08044C20:
- ldr r3, [r5]
- ldr r0, [r3, 0xC]
- lsls r1, r4, 2
- adds r1, r0
- ldr r0, [r3, 0x4]
- adds r2, r0, 0
- muls r2, r4
- ldr r0, [r3, 0x8]
- adds r0, r2
- str r0, [r1]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- ldrb r0, [r3]
- lsls r0, 28
- lsrs r0, 28
- cmp r4, r0
- blt _08044C20
-_08044C44:
- ldr r5, _08044C8C @ =gUnknown_20244F4
- ldr r0, [r5]
- ldrb r1, [r0]
- lsls r1, 28
- lsrs r1, 28
- lsls r0, r1, 1
- adds r0, r1
- lsls r0, 3
- bl AllocZeroed
- ldr r2, [r5]
- str r0, [r2, 0x10]
- ldrb r1, [r2]
- lsls r1, 28
- lsrs r1, 28
- ldrb r0, [r2, 0x1]
- lsls r0, 3
- muls r0, r1
- bl AllocZeroed
- adds r2, r0, 0
- ldr r1, [r5]
- str r2, [r1, 0x14]
- ldr r0, [r1, 0x10]
- cmp r0, 0
- beq _08044C7C
- cmp r2, 0
- bne _08044C90
-_08044C7C:
- movs r0, 0x2
- mov r1, r8
- orrs r1, r0
- lsls r0, r1, 24
- lsrs r0, 24
- mov r8, r0
- b _08044CE2
- .align 2, 0
-_08044C8C: .4byte gUnknown_20244F4
-_08044C90:
- movs r4, 0
- ldrb r0, [r1, 0x1]
- ldrb r1, [r1]
- lsls r1, 28
- lsrs r1, 28
- muls r0, r1
- adds r3, r5, 0
- cmp r4, r0
- bge _08044CC6
- adds r7, r3, 0
- movs r5, 0x80
- lsls r5, 4
-_08044CA8:
- ldr r2, [r7]
- ldr r1, [r2, 0x14]
- lsls r0, r4, 3
- adds r0, r1
- strh r5, [r0, 0x4]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- ldrb r1, [r2, 0x1]
- ldrb r0, [r2]
- lsls r0, 28
- lsrs r0, 28
- muls r0, r1
- cmp r4, r0
- blt _08044CA8
-_08044CC6:
- ldr r0, [r3]
- ldrb r4, [r0, 0x3]
- cmp r4, 0
- beq _08044CDA
- cmp r4, 0x1
- bne _08044CDA
- adds r1, r6, 0
- bl sub_8044950
- b _08044CE2
-_08044CDA:
- ldr r0, _08044D60 @ =gUnknown_20244F4
- ldr r0, [r0]
- bl sub_8044A40
-_08044CE2:
- movs r0, 0x2
- mov r1, r8
- ands r0, r1
- cmp r0, 0
- beq _08044D12
- ldr r4, _08044D60 @ =gUnknown_20244F4
- ldr r0, [r4]
- ldr r0, [r0, 0x14]
- cmp r0, 0
- beq _08044D00
- bl Free
- ldr r1, [r4]
- movs r0, 0
- str r0, [r1, 0x14]
-_08044D00:
- ldr r0, [r4]
- ldr r0, [r0, 0x10]
- cmp r0, 0
- beq _08044D12
- bl Free
- ldr r1, [r4]
- movs r0, 0
- str r0, [r1, 0x10]
-_08044D12:
- movs r0, 0x1
- mov r1, r8
- ands r0, r1
- cmp r0, 0
- beq _08044D42
- ldr r4, _08044D60 @ =gUnknown_20244F4
- ldr r0, [r4]
- ldr r0, [r0, 0xC]
- cmp r0, 0
- beq _08044D30
- bl Free
- ldr r1, [r4]
- movs r0, 0
- str r0, [r1, 0xC]
-_08044D30:
- ldr r0, [r4]
- ldr r0, [r0, 0x8]
- cmp r0, 0
- beq _08044D42
- bl Free
- ldr r1, [r4]
- movs r0, 0
- str r0, [r1, 0x8]
-_08044D42:
- mov r0, r8
- cmp r0, 0
- beq _08044D64
- ldr r4, _08044D60 @ =gUnknown_20244F4
- ldr r0, [r4]
- movs r1, 0
- movs r2, 0x18
- bl memset
- ldr r0, [r4]
- bl Free
- movs r0, 0
- str r0, [r4]
- b _08044D6C
- .align 2, 0
-_08044D60: .4byte gUnknown_20244F4
-_08044D64:
- ldr r0, _08044D7C @ =gUnknown_20244F4
- ldr r1, [r0]
- movs r0, 0xA3
- strb r0, [r1, 0x2]
-_08044D6C:
- ldr r0, _08044D7C @ =gUnknown_20244F4
- ldr r0, [r0]
-_08044D70:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08044D7C: .4byte gUnknown_20244F4
- thumb_func_end SetUpMonSpriteManagerMaybe
-
- thumb_func_start sub_8044D80
-sub_8044D80: @ 8044D80
- push {r4,lr}
- ldr r4, _08044D9C @ =gUnknown_20244F4
- ldr r1, [r4]
- cmp r1, 0
- beq _08044DFA
- ldrb r0, [r1, 0x2]
- cmp r0, 0xA3
- beq _08044DA0
- adds r0, r1, 0
- movs r1, 0
- movs r2, 0x18
- bl memset
- b _08044DF6
- .align 2, 0
-_08044D9C: .4byte gUnknown_20244F4
-_08044DA0:
- ldr r0, [r1, 0x14]
- cmp r0, 0
- beq _08044DB0
- bl Free
- ldr r1, [r4]
- movs r0, 0
- str r0, [r1, 0x14]
-_08044DB0:
- ldr r0, [r4]
- ldr r0, [r0, 0x10]
- cmp r0, 0
- beq _08044DC2
- bl Free
- ldr r1, [r4]
- movs r0, 0
- str r0, [r1, 0x10]
-_08044DC2:
- ldr r0, [r4]
- ldr r0, [r0, 0xC]
- cmp r0, 0
- beq _08044DD4
- bl Free
- ldr r1, [r4]
- movs r0, 0
- str r0, [r1, 0xC]
-_08044DD4:
- ldr r0, [r4]
- ldr r0, [r0, 0x8]
- cmp r0, 0
- beq _08044DE6
- bl Free
- ldr r1, [r4]
- movs r0, 0
- str r0, [r1, 0x8]
-_08044DE6:
- ldr r0, [r4]
- movs r1, 0
- movs r2, 0x18
- bl memset
- ldr r0, [r4]
- bl Free
-_08044DF6:
- movs r0, 0
- str r0, [r4]
-_08044DFA:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_8044D80
-
- thumb_func_start sub_8044E00
-sub_8044E00: @ 8044E00
- push {lr}
- lsls r0, 24
- lsrs r1, r0, 24
- ldr r0, _08044E14 @ =gUnknown_20244F4
- ldr r2, [r0]
- ldrb r0, [r2, 0x2]
- cmp r0, 0xA3
- beq _08044E18
- movs r0, 0
- b _08044E2C
- .align 2, 0
-_08044E14: .4byte gUnknown_20244F4
-_08044E18:
- ldrb r0, [r2]
- lsls r0, 28
- lsrs r0, 28
- cmp r1, r0
- blt _08044E24
- movs r1, 0
-_08044E24:
- ldr r0, [r2, 0xC]
- lsls r1, 2
- adds r1, r0
- ldr r0, [r1]
-_08044E2C:
- pop {r1}
- bx r1
- thumb_func_end sub_8044E00
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/pokemon_summary_screen.s b/asm/pokemon_summary_screen.s
index 2fa836876..cf1782306 100644
--- a/asm/pokemon_summary_screen.s
+++ b/asm/pokemon_summary_screen.s
@@ -9193,7 +9193,7 @@ sub_81390B0: @ 81390B0
mov r4, sp
adds r4, 0x6
strb r0, [r4]
- ldr r5, _081391E8 @ =gUnknown_825DEA1
+ ldr r5, _081391E8 @ =gPPUpGetMask
ldr r0, _081391E0 @ =gUnknown_203B16D
ldrb r1, [r0]
adds r0, r1, r5
@@ -9278,7 +9278,7 @@ _081391D8: .4byte gUnknown_203B140
_081391DC: .4byte 0x000032f4
_081391E0: .4byte gUnknown_203B16D
_081391E4: .4byte gUnknown_203B16E
-_081391E8: .4byte gUnknown_825DEA1
+_081391E8: .4byte gPPUpGetMask
thumb_func_end sub_81390B0
thumb_func_start sub_81391EC
@@ -9340,7 +9340,7 @@ sub_81391EC: @ 81391EC
mov r4, sp
adds r4, 0x6
strb r0, [r4]
- ldr r5, _08139324 @ =gUnknown_825DEA1
+ ldr r5, _08139324 @ =gPPUpGetMask
ldr r0, _0813931C @ =gUnknown_203B16D
ldrb r1, [r0]
adds r0, r1, r5
@@ -9425,7 +9425,7 @@ _08139314: .4byte gUnknown_203B140
_08139318: .4byte 0x000032f4
_0813931C: .4byte gUnknown_203B16D
_08139320: .4byte gUnknown_203B16E
-_08139324: .4byte gUnknown_825DEA1
+_08139324: .4byte gPPUpGetMask
thumb_func_end sub_81391EC
thumb_func_start sub_8139328
diff --git a/asm/script_pokemon_util_80BF8FC.s b/asm/script_pokemon_util_80BF8FC.s
index 26c113dfd..b5ef5f090 100644
--- a/asm/script_pokemon_util_80BF8FC.s
+++ b/asm/script_pokemon_util_80BF8FC.s
@@ -269,7 +269,7 @@ sub_80BFAA8: @ 80BFAA8
mov r6, sp
adds r6, 0x6
strb r0, [r6]
- ldr r1, _080BFBA4 @ =gUnknown_825DEA1
+ ldr r1, _080BFBA4 @ =gPPUpGetMask
adds r0, r5, r1
ldrb r0, [r0]
mov r9, r0
@@ -330,7 +330,7 @@ sub_80BFAA8: @ 80BFAA8
pop {r0}
bx r0
.align 2, 0
-_080BFBA4: .4byte gUnknown_825DEA1
+_080BFBA4: .4byte gPPUpGetMask
thumb_func_end sub_80BFAA8
thumb_func_start sub_80BFBA8
diff --git a/asm/trade.s b/asm/trade.s
index 967144d63..61328d618 100644
--- a/asm/trade.s
+++ b/asm/trade.s
@@ -8135,7 +8135,7 @@ sub_80507A0: @ 80507A0
adds r0, r4, 0
movs r1, 0x3
adds r2, r5, 0
- bl sub_8044898
+ bl HandleSetPokedexFlag
_080507F4:
pop {r4,r5}
pop {r0}
diff --git a/asm/trainer_card.s b/asm/trainer_card.s
index e8a591264..0ccec8553 100644
--- a/asm/trainer_card.s
+++ b/asm/trainer_card.s
@@ -4955,7 +4955,7 @@ sub_808B838: @ 808B838
adds r0, r1
ldrb r4, [r0]
adds r0, r4, 0
- bl sub_804454C
+ bl FacilityClassToPicIndex
lsls r0, 16
lsrs r0, 16
ldr r4, _0808B8A0 @ =gUnknown_83CD8EC
@@ -4982,7 +4982,7 @@ _0808B8A4:
cmp r0, 0
beq _0808B8FC
adds r0, r4, 0
- bl sub_804454C
+ bl FacilityClassToPicIndex
lsls r0, 16
lsrs r0, 16
ldr r4, _0808B8F4 @ =gUnknown_83CD8EC
diff --git a/data/data.s b/data/data.s
index 499e3c9db..d0725532a 100644
--- a/data/data.s
+++ b/data/data.s
@@ -68,7 +68,52 @@ gUnknown_8234690:: @ 8234690
.incbin "baserom.gba", 0x234690, 0x4
gUnknown_8234694:: @ 8234694
- .incbin "baserom.gba", 0x234694, 0x328
+ .incbin "baserom.gba", 0x234694, 0x4
+
+gUnknown_8234698:: @ 8234698
+ .incbin "baserom.gba", 0x234698, 0x20
+
+gUnknown_82346B8:: @ 82346B8
+ .incbin "baserom.gba", 0x2346B8, 0x20
+
+gUnknown_82346D8:: @ 82346D8
+ .incbin "baserom.gba", 0x2346D8, 0x20
+
+gUnknown_82346F8:: @ 82346F8
+ .incbin "baserom.gba", 0x2346F8, 0x20
+
+gUnknown_8234718:: @ 8234718
+ .incbin "baserom.gba", 0x234718, 0x28
+
+gUnknown_8234740:: @ 8234740
+ .incbin "baserom.gba", 0x234740, 0x28
+
+gUnknown_8234768:: @ 8234768
+ .incbin "baserom.gba", 0x234768, 0x20
+
+gUnknown_8234788:: @ 8234788
+ .incbin "baserom.gba", 0x234788, 0x20
+
+gUnknown_82347A8:: @ 82347A8
+ .incbin "baserom.gba", 0x2347A8, 0x20
+
+gUnknown_82347C8:: @ 82347C8
+ .incbin "baserom.gba", 0x2347C8, 0x20
+
+gUnknown_82347E8:: @ 82347E8
+ .incbin "baserom.gba", 0x2347E8, 0xE0
+
+gUnknown_82348C8:: @ 82348C8
+ .incbin "baserom.gba", 0x2348C8, 0x24
+
+gUnknown_82348EC:: @ 82348EC
+ .incbin "baserom.gba", 0x2348EC, 0x58
+
+gUnknown_8234944:: @ 8234944
+ .incbin "baserom.gba", 0x234944, 0x58
+
+gUnknown_823499C:: @ 823499C
+ .incbin "baserom.gba", 0x23499C, 0x20
gUnknown_82349BC:: @ 82349BC
.incbin "baserom.gba", 0x2349BC, 0x10
@@ -174,7 +219,16 @@ gUnknown_824EFF0:: @ 824EFF0
.incbin "baserom.gba", 0x24EFF0, 0x18
gUnknown_824F008:: @ 824F008
- .incbin "baserom.gba", 0x24F008, 0x40
+ .incbin "baserom.gba", 0x24F008, 0x8
+
+gUnknown_824F010:: @ 824F010
+ .incbin "baserom.gba", 0x24F010, 0x8
+
+gUnknown_824F018:: @ 824F018
+ .incbin "baserom.gba", 0x24F018, 0x8
+
+gUnknown_824F020:: @ 824F020
+ .incbin "baserom.gba", 0x24F020, 0x28
gUnknown_824F048:: @ 824F048
.incbin "baserom.gba", 0x24F048, 0x8
@@ -499,54 +553,6 @@ gEvolutionTable:: @ 8259754
gLevelUpLearnsets:: @ 825D7B4
.incbin "baserom.gba", 0x25D7B4, 0x670
-gPokeblockFlavorCompatibilityTable:: @ 825DE24
- .incbin "baserom.gba", 0x25DE24, 0x7D
-
-gUnknown_825DEA1:: @ 825DEA1
- .incbin "baserom.gba", 0x25DEA1, 0x4
-
-gPPUpWriteMasks:: @ 825DEA5
- .incbin "baserom.gba", 0x25DEA5, 0x4
-
-gUnknown_825DEA9:: @ 825DEA9
- .incbin "baserom.gba", 0x25DEA9, 0x4
-
-gStatStageRatios:: @ 825DEAD
- .incbin "baserom.gba", 0x25DEAD, 0x1F
-
-sHoldEffectToType:: @ 825DECC
- .incbin "baserom.gba", 0x25DECC, 0x24
-
-gUnknown_825DEF0:: @ 825DEF0
- .incbin "baserom.gba", 0x25DEF0, 0x60
-
-gUnknown_825DF50:: @ 825DF50
- .incbin "baserom.gba", 0x25DF50, 0x90
-
-sSecretBaseFacilityClasses:: @ 825DFE0
- .incbin "baserom.gba", 0x25DFE0, 0xA
-
-sGetMonDataEVConstants:: @ 825DFEA
- .incbin "baserom.gba", 0x25DFEA, 0x6
-
-gUnknown_825DFF0:: @ 825DFF0
- .incbin "baserom.gba", 0x25DFF0, 0x6
-
-sFriendshipEventDeltas:: @ 825DFF6
- .incbin "baserom.gba", 0x25DFF6, 0x1E
-
-sHMMoves:: @ 825E014
- .incbin "baserom.gba", 0x25E014, 0x12
-
-gUnknown_825E026:: @ 825E026
- .incbin "baserom.gba", 0x25E026, 0xC
-
-gUnknown_825E032:: @ 825E032
- .incbin "baserom.gba", 0x25E032, 0x2A
-
-gUnknown_825E05C:: @ 825E05C
- .incbin "baserom.gba", 0x25E05C, 0x18
-
.section .rodata.825EF0C
.align 2
diff --git a/data/maps/BirthIsland_Exterior/scripts.inc b/data/maps/BirthIsland_Exterior/scripts.inc
index 1d3fc4db6..f00cd73f2 100644
--- a/data/maps/BirthIsland_Exterior/scripts.inc
+++ b/data/maps/BirthIsland_Exterior/scripts.inc
@@ -90,7 +90,7 @@ EventScript_1652C0:: @ 81652C0
setvar VAR_0x8004, SPECIES_DEOXYS
setvar VAR_0x8005, 30
setvar VAR_0x8006, 0
- special sub_8044838
+ special CreateObedientEnemyMon
setflag FLAG_0x807
special sub_807F9D8
waitstate
diff --git a/data/maps/NavelRock_Base/scripts.inc b/data/maps/NavelRock_Base/scripts.inc
index 34cca4e9b..8818c1d01 100644
--- a/data/maps/NavelRock_Base/scripts.inc
+++ b/data/maps/NavelRock_Base/scripts.inc
@@ -63,7 +63,7 @@ NavelRock_Base_EventScript_165134:: @ 8165134
setvar VAR_0x8004, SPECIES_LUGIA
setvar VAR_0x8005, 70
setvar VAR_0x8006, 0
- special sub_8044838
+ special CreateObedientEnemyMon
setflag FLAG_0x807
special sub_807F9D8
waitstate
diff --git a/data/maps/NavelRock_Summit/scripts.inc b/data/maps/NavelRock_Summit/scripts.inc
index cb82149e8..d359d4d25 100644
--- a/data/maps/NavelRock_Summit/scripts.inc
+++ b/data/maps/NavelRock_Summit/scripts.inc
@@ -67,7 +67,7 @@ NavelRock_Summit_EventScript_164FFB:: @ 8164FFB
setvar VAR_0x8004, SPECIES_HO_OH
setvar VAR_0x8005, 70
setvar VAR_0x8006, 0
- special sub_8044838
+ special CreateObedientEnemyMon
setflag FLAG_0x807
special sub_807F9D8
waitstate
diff --git a/data/specials.inc b/data/specials.inc
index 4c7ad327d..7c82d42f8 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -452,5 +452,5 @@ gSpecials:: @ 815FD60
def_special sub_80CB328
def_special sub_80CD154
def_special sub_80CD1B4
- def_special sub_8044838
+ def_special CreateObedientEnemyMon
gSpecialsEnd::
diff --git a/include/battle.h b/include/battle.h
index 2e6d251c3..277f79c51 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -33,39 +33,6 @@
#define GET_BANK_SIDE(bank)((GetBattlerPosition(bank) & BIT_SIDE))
#define GET_BANK_SIDE2(bank)((GET_BANK_IDENTITY(bank) & BIT_SIDE))
-#define BATTLE_TYPE_DOUBLE 0x0001
-#define BATTLE_TYPE_LINK 0x0002
-#define BATTLE_TYPE_WILD 0x0004
-#define BATTLE_TYPE_TRAINER 0x0008
-#define BATTLE_TYPE_FIRST_BATTLE 0x0010
-#define BATTLE_TYPE_20 0x0020
-#define BATTLE_TYPE_MULTI 0x0040
-#define BATTLE_TYPE_SAFARI 0x0080
-#define BATTLE_TYPE_BATTLE_TOWER 0x0100
-#define BATTLE_TYPE_WALLY_TUTORIAL 0x0200
-#define BATTLE_TYPE_ROAMER 0x0400
-#define BATTLE_TYPE_EREADER_TRAINER 0x0800
-#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000
-#define BATTLE_TYPE_LEGENDARY 0x2000
-#define BATTLE_TYPE_REGI 0x4000
-#define BATTLE_TYPE_TWO_OPPONENTS 0x8000
-#define BATTLE_TYPE_DOME 0x10000 // this is used in pokemon.c, but its clearly not the correct name for FR/LG. TODO: Fix these
-#define BATTLE_TYPE_PALACE 0x20000
-#define BATTLE_TYPE_ARENA 0x40000
-#define BATTLE_TYPE_FACTORY 0x80000
-#define BATTLE_TYPE_x100000 0x100000
-#define BATTLE_TYPE_PYRAMID 0x200000
-#define BATTLE_TYPE_INGAME_PARTNER 0x400000
-#define BATTLE_TYPE_x800000 0x800000
-#define BATTLE_TYPE_RECORDED 0x1000000
-#define BATTLE_TYPE_x2000000 0x2000000
-#define BATTLE_TYPE_x4000000 0x4000000
-#define BATTLE_TYPE_SECRET_BASE 0x8000000
-#define BATTLE_TYPE_GROUDON 0x10000000
-#define BATTLE_TYPE_KYORGE 0x20000000
-#define BATTLE_TYPE_RAYQUAZA 0x40000000
-#define BATTLE_TYPE_x80000000 0x80000000
-
#define TRAINER_OPPONENT_3FE 0x3FE
#define TRAINER_OPPONENT_C00 0xC00
#define TRAINER_OPPONENT_800 0x800
@@ -984,5 +951,6 @@ extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT];
extern s32 gBattleMoveDamage;
extern u8 gBattleOutcome;
+extern u8 gBattleMonForms[MAX_BATTLERS_COUNT];
#endif // GUARD_BATTLE_H
diff --git a/include/battle_2.h b/include/battle_2.h
index 1f7a2304d..cb9247372 100644
--- a/include/battle_2.h
+++ b/include/battle_2.h
@@ -44,6 +44,7 @@ void RunBattleScriptCommands_PopCallbacksStack(void);
void RunBattleScriptCommands(void);
bool8 TryRunFromBattle(u8 bank);
void sub_800FD9C(void);
+void sub_80120C4(struct Sprite *);
extern const u8 gStatusConditionString_PoisonJpn[8];
extern const u8 gStatusConditionString_SleepJpn[8];
diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h
index 5f8c4419b..3786d4a8c 100644
--- a/include/battle_ai_script_commands.h
+++ b/include/battle_ai_script_commands.h
@@ -3,6 +3,8 @@
#include "global.h"
+extern u8 sBattler_AI;
+
void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves);
void BattleAI_SetupAIData(u8 defaultScoreMoves);
u8 BattleAI_ChooseMoveOrAction(void);
diff --git a/include/battle_util.h b/include/battle_util.h
index ed070720d..a062f0743 100644
--- a/include/battle_util.h
+++ b/include/battle_util.h
@@ -87,5 +87,6 @@ void HandleAction_RunBattleScript(void);
u8 GetMoveTarget(u16 move, u8 useMoveTarget);
u8 IsMonDisobedient(void);
void MarkBufferBankForExecution(u8 battlerId);
+void sub_80174B8(u8 battlerId);
#endif // GUARD_BATTLE_UTIL_H
diff --git a/include/constants/battle.h b/include/constants/battle.h
index 074c0d0cd..3b765eede 100644
--- a/include/constants/battle.h
+++ b/include/constants/battle.h
@@ -59,7 +59,7 @@
#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000
#define BATTLE_TYPE_LEGENDARY 0x2000
#define BATTLE_TYPE_REGI 0x4000
-#define BATTLE_TYPE_TWO_OPPONENTS 0x8000
+#define BATTLE_TYPE_GHOST 0x8000
#define BATTLE_TYPE_DOME 0x10000
#define BATTLE_TYPE_PALACE 0x20000
#define BATTLE_TYPE_ARENA 0x40000
diff --git a/include/data2.h b/include/data2.h
index e383b1c9a..5601fc16c 100644
--- a/include/data2.h
+++ b/include/data2.h
@@ -18,5 +18,33 @@ extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern const u8 gMoveNames[][13];
extern const u8 gAbilityNames[][13];
extern const u8 gTypeNames[][7];
+extern u16 gUnknown_8251CB8[];
+extern u16 gUnknown_8251FEE[];
+extern u16 gUnknown_8252324[];
+extern u16 gUnknown_82539D4[];
+extern struct SpindaSpot gSpindaSpotGraphics[];
+extern s8 gNatureStatTable[][5];
+extern u32 gTMHMLearnsets[][2];
+
+extern const struct CompressedSpritePalette gMonPaletteTable[];
+extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
+extern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[];
+extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[];
+
+extern const struct OamData gUnknown_824F010;
+extern const struct OamData gUnknown_824F018;
+extern const union AnimCmd *const gUnknown_82349BC[];
+extern const union AffineAnimCmd *const gUnknown_82348C8[];
+extern const union AffineAnimCmd *const gUnknown_8234944[];
+extern const struct SpriteFrameImage gUnknown_8234698[];
+extern const struct SpriteFrameImage gUnknown_82346B8[];
+extern const struct SpriteFrameImage gUnknown_82346D8[];
+extern const struct SpriteFrameImage gUnknown_82346F8[];
+extern const struct SpriteFrameImage gUnknown_8234718[];
+extern const struct SpriteFrameImage gUnknown_8234740[];
+extern const struct SpriteFrameImage gUnknown_8234768[];
+extern const struct SpriteFrameImage gUnknown_8234788[];
+extern const struct SpriteFrameImage gUnknown_82347A8[];
+extern const struct SpriteFrameImage gUnknown_82347C8[];
#endif // GUARD_DATA2_H
diff --git a/include/field_specials.h b/include/field_specials.h
index 0e4fdd787..a82cb20a2 100644
--- a/include/field_specials.h
+++ b/include/field_specials.h
@@ -11,5 +11,7 @@ void sub_80CCB68(void);
void nullsub_60(void);
void nullsub_61(void);
u8 ContextNpcGetTextColor(void);
+void set_unknown_box_id(u8);
+u16 get_unknown_box_id(void);
#endif // GUARD_FIELD_SPECIALS_H
diff --git a/include/party_menu.h b/include/party_menu.h
index 3b620c3b0..e4fc182e9 100644
--- a/include/party_menu.h
+++ b/include/party_menu.h
@@ -61,5 +61,6 @@ void sub_8126894(u8 taskId, TaskFunc followUpFunc);
void sub_81279E0(void);
void ItemUseCB_Medicine(u8 taskId, TaskFunc followUpFunc);
u8 GetItemEffectType(u16 itemId);
+u8 pokemon_order_func(u8);
#endif // GUARD_PARTY_MENU_H
diff --git a/include/pokemon.h b/include/pokemon.h
index 558eedc67..e84778fa3 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -2,6 +2,7 @@
#define GUARD_POKEMON_H
#include "global.h"
+#include "sprite.h"
#define MON_DATA_PERSONALITY 0
#define MON_DATA_OT_ID 1
@@ -545,30 +546,26 @@ void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV,
void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter);
void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level);
void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality);
-void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId);
void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread);
-u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
+void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src);
+void sub_803E23C(struct Pokemon *mon, struct BattleTowerPokemon *dest);
void CalculateMonStats(struct Pokemon *mon);
-u8 GetLevelFromMonExp(struct Pokemon *mon);
+void BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest);
u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon);
u16 GiveMoveToMon(struct Pokemon *mon, u16 move);
-u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move);
-void MonRestorePP(struct Pokemon *mon);
void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot);
void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot);
-void GiveMonInitialMoveset(struct Pokemon *mon);
-void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon);
+u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove);
void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move);
-void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
-bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex);
-bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e);
-
+s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef);
+u8 CountAliveMons(u8 a1);
+u8 GetDefaultMoveTarget(u8 a1);
u8 GetMonGender(struct Pokemon *mon);
u8 GetBoxMonGender(struct BoxPokemon *boxMon);
u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality);
-void EncryptBoxMon(struct BoxPokemon *boxMon);
-void DecryptBoxMon(struct BoxPokemon *boxMon);
+void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition);
+void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition);
// These are full type signatures for GetMonData() and GetBoxMonData(),
// but they are not used since some code erroneously omits the third arg.
@@ -583,101 +580,81 @@ u32 GetMonData();
u32 GetBoxMonData();
#endif // IS_POKEMON_C
-void SetMonData(struct Pokemon *mon, s32 field, const void *data);
-void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *data);
+void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg);
+void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg);
void CopyMon(void *dest, void *src, size_t size);
u8 GiveMonToPlayer(struct Pokemon *mon);
-u8 SendMonToPC(struct Pokemon *mon);
u8 CalculatePlayerPartyCount(void);
u8 CalculateEnemyPartyCount(void);
-
+u8 GetMonsStateToDoubles(void);
u8 GetAbilityBySpecies(u16 species, bool8 altAbility);
u8 GetMonAbility(struct Pokemon *mon);
-void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord);
u8 GetSecretBaseTrainerPicIndex(void);
u8 GetSecretBaseTrainerNameIndex(void);
bool8 IsPlayerPartyAndPokemonStorageFull(void);
-bool8 IsPokemonStorageFull(void);
void GetSpeciesName(u8 *name, u16 species);
u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex);
void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex);
void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex);
-void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex);
-
+bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex);
+bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e);
+bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e);
+u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);
+const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId);
u8 GetNature(struct Pokemon *mon);
-u8 GetNatureFromPersonality(u32 personality);
-
-u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex);
-
-void MonRestorePP(struct Pokemon *);
-void BoxMonRestorePP(struct BoxPokemon *);
-
+u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem);
u16 NationalPokedexNumToSpecies(u16 nationalNum);
-u16 NationalToHoennOrder(u16);
-u16 SpeciesToNationalPokedexNum(u16);
-u16 HoennToNationalOrder(u16);
+u16 SpeciesToNationalPokedexNum(u16 species);
+u16 HoennToNationalOrder(u16 hoennNum);
u16 SpeciesToCryId(u16 species);
-void DrawSpindaSpots(u16, u32, u8 *, u8);
-void AdjustFriendship(struct Pokemon *, u8);
-u8 CheckPartyHasHadPokerus(struct Pokemon *, u8);
-void UpdatePartyPokerusTime(u16);
-u32 CanMonLearnTMHM(struct Pokemon *, u8);
-u32 CanSpeciesLearnTMHM(u16 species, u8 tm);
+void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4);
+void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies);
+bool8 sub_80435E0(void);
+bool8 GetLinkTrainerFlankId(u8 linkPlayerId);
+s32 GetBankMultiplayerId(u16 a1);
+u8 GetTrainerEncounterMusicId(u16 trainer);
+void AdjustFriendship(struct Pokemon *mon, u8 event);
+void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies);
+u16 GetMonEVCount(struct Pokemon *mon);
+void sub_8043A68(void);
+u8 CheckPartyPokerus(struct Pokemon *party, u8 selection);
+u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection);
+void sub_8043B40(void);
+bool8 TryIncrementMonLevel(struct Pokemon *mon);
+u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm);
u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves);
+u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves);
+u8 GetNumberOfRelearnableMoves(struct Pokemon *mon);
+u16 sub_8043F90(u16 species);
void ClearBattleMonForms(void);
+void PlayBattleBGM(void);
+void PlayMapChosenOrBattleBGM(u16 songId);
const u32 *GetMonFrontSpritePal(struct Pokemon *mon);
-const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16, u32, u32);
-const struct CompressedSpritePalette *sub_80409C8(u16, u32, u32);
-bool8 IsOtherTrainer(u32, u8 *);
-void SetWildMonHeldItem(void);
-u16 GetMonEVCount(struct Pokemon *);
-
-const struct CompressedSpritePalette *sub_806E794(struct Pokemon *mon);
+const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality);
const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon);
const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality);
bool32 IsHMMove2(u16 move);
bool8 IsPokeSpriteNotFlipped(u16 species);
-bool8 IsMonShiny(struct Pokemon *mon);
-bool8 IsShinyOtIdPersonality(u32 otId, u32 personality);
-
-void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies);
+s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor);
bool8 IsTradedMon(struct Pokemon *mon);
+bool8 IsOtherTrainer(u32 otId, u8 *otName);
+void MonRestorePP(struct Pokemon *mon);
+void BoxMonRestorePP(struct BoxPokemon *boxMon);
+void sub_8044348(void);
+void SetWildMonHeldItem(void);
+bool8 IsMonShiny(struct Pokemon *mon);
+u8 *GetTrainerPartnerName(void);
+u8 GetPlayerPartyHighestLevel(void);
+u16 FacilityClassToPicIndex(u16 facilityClass);
+bool8 sub_804455C(u8 caseId, u8 battlerId);
+void SetDeoxysStats(void);
+u16 sub_80447AC(void);
+u16 sub_80447F0(void);
+void CreateObedientEnemyMon(void);
void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality);
-s32 GetBankMultiplayerId(u16 a1);
-bool16 sub_806D82C(u8 id);
-u16 MonTryLearningNewMove(struct Pokemon* mon, bool8);
-void sub_8068AA4(void); // sets stats for deoxys
-bool8 HasTwoFramesAnimation(u16 species);
-u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem);
-void RandomlyGivePartyPokerus(struct Pokemon *party);
-u8 CheckPartyPokerus(struct Pokemon *party, u8 selection);
-u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection);
-void UpdatePartyPokerusTime(u16 days);
-void PartySpreadPokerus(struct Pokemon *party);
-s8 GetMonFlavorRelation(struct Pokemon *mon, u8 a2);
-s8 GetFlavorRelationByPersonality(u32 personality, u8 a2);
-u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);
-u8 GetDefaultMoveTarget(u8 atkBank);
-u16 PlayerGenderToFrontTrainerPicId(u8 playerGender);
-void sub_806A1C0(u16 arg0, u8 bankIdentity);
-void sub_806A12C(u16 trainerSpriteId, u8 bankIdentity);
-u8 GetSecretBaseTrainerPicIndex(void);
-bool8 TryIncrementMonLevel(struct Pokemon *mon);
-void BoxMonToMon(struct BoxPokemon *srcMon, struct Pokemon *dstMon);
-u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves);
-bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battlerId);
-
-#include "sprite.h"
-
-void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3);
-void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3);
-void BattleAnimateBackSprite(struct Sprite* sprite, u16 species);
-
-void PlayMapChosenOrBattleBGM(u16 songId);
-u8 GetMonsStateToDoubles(void);
-void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src);
-void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition);
-
-const u8 * Battle_PrintStatBoosterEffectMessage(u16 itemId);
+bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank);
+struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable);
+void OakSpeechNidoranFFreeResources(void);
+void *OakSpeechNidoranFGetBuffer(u8 bufferId);
#endif // GUARD_POKEMON_H
diff --git a/include/pokemon_3.h b/include/pokemon_3.h
deleted file mode 100644
index e65bc85fc..000000000
--- a/include/pokemon_3.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef GUARD_POKEMON_3_H
-#define GUARD_POKEMON_3_H
-
-#include "global.h"
-
-const u8* GetTrainerClassNameFromId(u16 trainerId);
-const u8* GetTrainerNameFromId(u16 trainerId);
-void * SetUpMonSpriteManagerMaybe(u8, u8);
-void sub_8044D80(void);
-void * sub_8044E00(u8 buffId);
-
-#endif // GUARD_POKEMON_3_H
diff --git a/include/pokemon_storage_system.h b/include/pokemon_storage_system.h
index f2fbe85a7..8ab9e5f0e 100644
--- a/include/pokemon_storage_system.h
+++ b/include/pokemon_storage_system.h
@@ -14,5 +14,6 @@ u32 GetBoxMonDataFromAnyBox(u8 boxId, u8 monPosition, u32 request);
void sub_808BCB4(u8 boxId, u8 monPosition);
u8 * GetBoxNamePtr(u8 boxId);
void sub_808CE60(void);
+u8 StorageGetCurrentBox(void);
#endif // GUARD_POKEMON_STORAGE_SYSTEM_H
diff --git a/include/strings.h b/include/strings.h
index 8fb15be76..70d30b230 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -177,6 +177,17 @@ extern const u8 gUnknown_84166A7[];
extern const u8 gUnknown_84169DC[];
extern const u8 gUnknown_841623D[];
extern const u8 gUnknown_84162BD[];
+extern const u8 gUnknown_841D148[];
+
+// pokemon.c
+extern const u8 BattleText_Rose[];
+extern const u8 BattleText_UnknownString3[];
+extern const u8 BattleText_GetPumped[];
+extern const u8 BattleText_MistShroud[];
+extern const u8 gText_EggNickname[];
+extern const u8 gText_BadEgg[];
+extern const u8 gText_PkmnsXPreventsSwitching[];
+extern u8 *gUnknown_83FD5D0[];
// diploma
extern const u8 gUnknown_841B60E[];
diff --git a/ld_script.txt b/ld_script.txt
index 6dddecf0c..d891908ca 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -76,7 +76,6 @@ SECTIONS {
asm/battle_ai_switch_items.o(.text);
asm/battle_controller_link_opponent.o(.text);
src/pokemon.o(.text);
- asm/pokemon_3.o(.text);
src/trig.o(.text);
src/random.o(.text);
src/util.o(.text);
@@ -381,6 +380,7 @@ SECTIONS {
src/bg_regs.o(.rodata);
src/string_util.o(.rodata);
data/data.o(.rodata);
+ src/pokemon.o(.rodata);
src/trig.o(.rodata);
src/util.o(.rodata);
src/daycare.o(.rodata);
diff --git a/src/oak_speech.c b/src/oak_speech.c
index 26736604e..c00335136 100644
--- a/src/oak_speech.c
+++ b/src/oak_speech.c
@@ -14,7 +14,7 @@
#include "menu.h"
#include "help_system.h"
#include "new_menu_helpers.h"
-#include "pokemon_3.h"
+#include "pokemon.h"
#include "sound.h"
#include "event_scripts.h"
#include "scanline_effect.h"
@@ -500,7 +500,7 @@ static void Task_OaksSpeech1(u8 taskId)
break;
case 1:
sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources));
- SetUpMonSpriteManagerMaybe(1, 1);
+ OakSpeechNidoranFSetup(1, 1);
break;
case 2:
SetGpuReg(REG_OFFSET_WIN0H, 0);
@@ -1513,7 +1513,7 @@ static void Task_OakSpeech41(u8 taskId)
static void Task_OakSpeech42(u8 taskId)
{
FreeAllWindowBuffers();
- sub_8044D80();
+ OakSpeechNidoranFFreeResources();
Free(sOakSpeechResources);
sOakSpeechResources = NULL;
gTextFlags.canABSpeedUpPrint = FALSE;
@@ -1612,7 +1612,7 @@ static void CreateNidoranFSprite(u8 taskId)
{
u8 spriteId;
- DecompressPicFromTable(gUnknown_8235194, sub_8044E00(0), SPECIES_NIDORAN_F);
+ DecompressPicFromTable(gUnknown_8235194, OakSpeechNidoranFGetBuffer(0), SPECIES_NIDORAN_F);
LoadCompressedSpritePaletteUsingHeap(&gUnknown_82373F4);
SetMultiuseSpriteTemplateToPokemon(SPECIES_NIDORAN_F, 0);
spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x60, 0x60, 1);
diff --git a/src/pokemon.c b/src/pokemon.c
index b9b5e6d76..f4150d5b6 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -5,8 +5,10 @@
#include "random.h"
#include "main.h"
#include "text.h"
+#include "data2.h"
#include "string_util.h"
#include "battle.h"
+#include "battle_2.h"
#include "item.h"
#include "event_data.h"
#include "util.h"
@@ -16,9 +18,17 @@
#include "battle_controllers.h"
#include "evolution_scene.h"
#include "battle_message.h"
+#include "battle_util.h"
+#include "battle_ai_script_commands.h"
#include "link.h"
#include "m4a.h"
#include "sound.h"
+#include "pokedex.h"
+#include "strings.h"
+#include "malloc.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "field_specials.h"
#include "constants/items.h"
#include "constants/species.h"
#include "constants/pokemon.h"
@@ -34,63 +44,304 @@
// Extracts the lower 16 bits of a 32-bit number
#define LOHALF(n) ((n) & 0xFFFF)
-// TODO: what is this
-struct UnkStruct20244F4
+struct OakSpeechNidoranFStruct
{
- u8 unk0:4;
- u8 unk0_2:4;
- u8 filler1[0xF];
- struct SpriteTemplate *unk10;
+ u8 spriteCount:4;
+ u8 battlePosition:4;
+ u8 frameCount;
+ u8 enable;
+ bool8 enable2;
+ u32 sizePerSprite;
+ u8 *dataBuffer;
+ u8 **bufferPtrs;
+ struct SpriteTemplate *templates;
+ struct SpriteFrameImage *frameImages;
};
-// External symbols
-extern struct UnkStruct20244F4 *gUnknown_20244F4;
-extern struct SpriteTemplate gUnknown_825DEF0[];
-extern struct SpriteTemplate gUnknown_825DF50[];
-extern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[];
-extern struct SpriteTemplate gUnknown_825DEF0[];
-extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[];
-extern const union AnimCmd *const gUnknown_82349BC[];
-extern const u8 gUnknown_825DEA1[];
-extern const u8 gPPUpWriteMasks[];
-extern u8 *gUnknown_83FD5D0[];
-extern const u8 gUnknown_825DFF0[];
-extern const u8 gText_EggNickname[];
-extern const u8 gText_BadEgg[];
-extern const u8 BattleText_Rose[];
-extern const u8 BattleText_UnknownString3[];
-extern const u8 BattleText_GetPumped[];
-extern const u8 BattleText_MistShroud[];
-extern const u8 gText_PkmnsXPreventsSwitching[];
-extern const u8 sHoldEffectToType[][2];
+// TODO: move sLearningMoveTableID, gPlayerPartyCount, gEnemyPartyCount,
+// gEnemyParty, gPlayerParty here after resolving symbol ref in between.
extern u8 sLearningMoveTableID;
-extern const u8 sSecretBaseFacilityClasses[2][5];
-extern u16 gUnknown_8251CB8[];
-extern u16 gUnknown_8251FEE[];
-extern u16 gUnknown_8252324[];
-extern u16 gUnknown_82539D4[];
-extern struct SpindaSpot gSpindaSpotGraphics[];
-extern s8 gNatureStatTable[][5];
-extern const s8 sFriendshipEventDeltas[][3];
-extern u32 gTMHMLearnsets[][2];
-extern u8 gBattleMonForms[4];
-extern const struct CompressedSpritePalette gMonPaletteTable[];
-extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
-extern const u16 sHMMoves[];
-extern s8 gPokeblockFlavorCompatibilityTable[];
-
-// External functions
-extern u8 GetCurrentRegionMapSectionId(void); // overworld
-extern const struct BattleMove gBattleMoves[];
-extern u8 sBattler_AI; // battle_ai
-extern void set_unknown_box_id(u8); // field_specials
-extern u8 pokemon_order_func(u8);
-extern u16 get_unknown_box_id(void); // field_specials
-extern u8 StorageGetCurrentBox(void); // pokemon_storage_system
-extern void sub_80174B8(u8 battlerId);
-
-union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType);
-s32 GetDeoxysStat(struct Pokemon *mon, s32 statId);
+
+EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0};
+static EWRAM_DATA struct OakSpeechNidoranFStruct *sOakSpeechNidoranResources = NULL;
+
+static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType);
+static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId);
+static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality);
+static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex);
+static u8 GetNatureFromPersonality(u32 personality);
+static bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
+static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
+static bool8 IsPokemonStorageFull(void);
+static u8 SendMonToPC(struct Pokemon* mon);
+static void EncryptBoxMon(struct BoxPokemon *boxMon);
+static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon);
+static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+static u8 GetLevelFromMonExp(struct Pokemon *mon);
+static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
+
+const s8 gPokeblockFlavorCompatibilityTable[] =
+{
+ // Cool, Beauty, Cute, Smart, Tough
+ 0, 0, 0, 0, 0, // Hardy
+ 1, 0, 0, 0, -1, // Lonely
+ 1, 0, -1, 0, 0, // Brave
+ 1, -1, 0, 0, 0, // Adamant
+ 1, 0, 0, -1, 0, // Naughty
+ -1, 0, 0, 0, 1, // Bold
+ 0, 0, 0, 0, 0, // Docile
+ 0, 0, -1, 0, 1, // Relaxed
+ 0, -1, 0, 0, 1, // Impish
+ 0, 0, 0, -1, 1, // Lax
+ -1, 0, 1, 0, 0, // Timid
+ 0, 0, 1, 0, -1, // Hasty
+ 0, 0, 0, 0, 0, // Serious
+ 0, -1, 1, 0, 0, // Jolly
+ 0, 0, 1, -1, 0, // Naive
+ -1, 1, 0, 0, 0, // Modest
+ 0, 1, 0, 0, -1, // Mild
+ 0, 1, -1, 0, 0, // Quiet
+ 0, 0, 0, 0, 0, // Bashful
+ 0, 1, 0, -1, 0, // Rash
+ -1, 0, 0, 1, 0, // Calm
+ 0, 0, 0, 1, -1, // Gentle
+ 0, 0, -1, 1, 0, // Sassy
+ 0, -1, 0, 1, 0, // Careful
+ 0, 0, 0, 0, 0 // Quirky
+};
+
+const u8 gPPUpGetMask[] = { 0x03, 0x0c, 0x30, 0xc0 }; // Masks for getting PP Up count, also PP Max values
+
+const u8 gPPUpSetMask[] = { 0xfc, 0xf3, 0xcf, 0x3f }; // Masks for setting PP Up count
+
+const u8 gPPUpAddMask[] = { 0x01, 0x04, 0x10, 0x40 }; // Values added to PP Up count
+
+const u8 gStatStageRatios[][2] =
+{
+ { 10, 40 },
+ { 10, 35 },
+ { 10, 30 },
+ { 10, 25 },
+ { 10, 20 },
+ { 10, 15 },
+ { 10, 10 },
+ { 15, 10 },
+ { 20, 10 },
+ { 25, 10 },
+ { 30, 10 },
+ { 35, 10 },
+ { 40, 10 },
+ { 138, 174 },
+ { 108, 120 },
+};
+
+static const u8 sFiller = _("");
+
+static const u8 sHoldEffectToType[][2] =
+{
+ {HOLD_EFFECT_BUG_POWER, TYPE_BUG},
+ {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL},
+ {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND},
+ {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK},
+ {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS},
+ {HOLD_EFFECT_DARK_POWER, TYPE_DARK},
+ {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING},
+ {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC},
+ {HOLD_EFFECT_WATER_POWER, TYPE_WATER},
+ {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING},
+ {HOLD_EFFECT_POISON_POWER, TYPE_POISON},
+ {HOLD_EFFECT_ICE_POWER, TYPE_ICE},
+ {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST},
+ {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC},
+ {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE},
+ {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON},
+ {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL},
+};
+
+const struct SpriteTemplate gUnknown_825DEF0[] =
+{
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234698,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F010,
+ .anims = NULL,
+ .images = gUnknown_82346B8,
+ .affineAnims = gUnknown_8234944,
+ .callback = oac_poke_opponent,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82346D8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F010,
+ .anims = NULL,
+ .images = gUnknown_82346F8,
+ .affineAnims = gUnknown_8234944,
+ .callback = oac_poke_opponent,
+ },
+};
+
+const struct SpriteTemplate gUnknown_825DF50[] =
+{
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234718,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234740,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82347A8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82347C8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234768,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234788,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+};
+
+static const u8 sSecretBaseFacilityClasses[][5] =
+{
+ { 0x58, 0x58, 0x58, 0x58, 0x58 },
+ { 0x58, 0x58, 0x58, 0x58, 0x58 },
+};
+
+static const u8 sGetMonDataEVConstants[] =
+{
+ MON_DATA_HP_EV,
+ MON_DATA_ATK_EV,
+ MON_DATA_DEF_EV,
+ MON_DATA_SPEED_EV,
+ MON_DATA_SPDEF_EV,
+ MON_DATA_SPATK_EV
+};
+
+static const u8 gUnknown_825DFF0[] =
+{
+ STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC
+};
+
+static const s8 sFriendshipEventDeltas[][3] =
+{
+ { 5, 3, 2 },
+ { 5, 3, 2 },
+ { 1, 1, 0 },
+ { 3, 2, 1 },
+ { 1, 1, 0 },
+ { 1, 1, 1 },
+ { 3, 3, 3 },
+ {-1, -1, -1 },
+ {-5, -5, -10 },
+ {-5, -5, -10 },
+};
+
+static const u16 sHMMoves[] =
+{
+ MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH,
+ MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, 0xFFFF
+};
+
+static const u16 sDeoxysBaseStats[] =
+{
+ 50, // Hp
+ 180, // Attack
+ 20, // Defense
+ 150, // Speed
+ 180, // Sp.Attack
+ 20, // Sp.Defense
+};
+
+const u16 gLinkPlayerFacilityClasses[] =
+{
+ 0x74, 0x6F, 0x5C, 0x58, 0x6A,
+ 0x59, 0x6D, 0x6C, 0x75, 0x7D,
+ 0x5D, 0x5A, 0x89, 0x8A, 0x8C,
+ 0x68, 0x0,
+};
+
+const static struct OamData sOakSpeechNidoranFDummyOamData =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+};
+
+const struct SpriteTemplate sOakSpeechNidoranFDummyTemplate =
+{
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = SPRITE_INVALID_TAG,
+ .oam = &sOakSpeechNidoranFDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
// code
void ZeroBoxMonData(struct BoxPokemon *boxMon)
@@ -307,7 +558,7 @@ void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32
CalculateMonStats(mon);
}
-void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId)
+static void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId)
{
CreateMon(mon, species, level, 0, 0, 0, OT_ID_PRESET, otId);
SetMonData(mon, MON_DATA_HP_IV, &ivs[0]);
@@ -351,7 +602,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI
CalculateMonStats(mon);
}
-void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src)
+void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src)
{
s32 i;
u8 value;
@@ -402,7 +653,7 @@ void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src)
CalculateMonStats(mon);
}
-void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
+static void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
{
bool32 obedient = TRUE;
@@ -447,7 +698,7 @@ void sub_803E23C(struct Pokemon *mon, struct BattleTowerPokemon *dest)
GetMonData(mon, MON_DATA_NICKNAME, dest->nickname);
}
-u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
+static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
{
u16 checksum = 0;
union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0);
@@ -476,7 +727,7 @@ u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
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); \
+ n = ModifyStatByNature(nature, n, statIndex); \
SetMonData(mon, field, &n); \
}
@@ -556,7 +807,7 @@ void BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest)
CalculateMonStats(dest);
}
-u8 GetLevelFromMonExp(struct Pokemon *mon)
+static u8 GetLevelFromMonExp(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);
@@ -585,7 +836,7 @@ u16 GiveMoveToMon(struct Pokemon *mon, u16 move)
return GiveMoveToBoxMon(&mon->box, move);
}
-u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
+static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
{
s32 i;
for (i = 0; i < 4; i++)
@@ -632,7 +883,7 @@ void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot)
mon->pp[slot] = gBattleMoves[move].pp;
}
-void GiveMonInitialMoveset(struct Pokemon *mon)
+static void GiveMonInitialMoveset(struct Pokemon *mon)
{
GiveBoxMonInitialMoveset(&mon->box);
}
@@ -640,7 +891,7 @@ void GiveMonInitialMoveset(struct Pokemon *mon)
// TODO: make level_up_learnsets.h in src/data and move this to there.
#define LEVEL_UP_END 0xffff
-void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)
+static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)
{
u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);
s32 level = GetLevelFromBoxMonExp(boxMon);
@@ -722,7 +973,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move)
SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
}
-void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
+static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
{
s32 i;
u16 moves[4];
@@ -1122,7 +1373,7 @@ u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality)
return MON_MALE;
}
-void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition)
+void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition)
{
if(gMonSpritesGfxPtr != NULL)
{
@@ -1133,12 +1384,12 @@ void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition)
}
else
{
- if(gUnknown_20244F4)
+ if(sOakSpeechNidoranResources)
{
- if(battlerPosition >= (s8)gUnknown_20244F4->unk0_2) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler?
+ if(battlerPosition >= (s8)sOakSpeechNidoranResources->battlePosition) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler?
battlerPosition = 0;
- gMultiuseSpriteTemplate = gUnknown_20244F4->unk10[battlerPosition];
+ gMultiuseSpriteTemplate = sOakSpeechNidoranResources->templates[battlerPosition];
}
else
{
@@ -1148,7 +1399,7 @@ void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition)
gMultiuseSpriteTemplate = gUnknown_825DEF0[battlerPosition];
}
}
- gMultiuseSpriteTemplate.paletteTag = trainerSpriteId;
+ gMultiuseSpriteTemplate.paletteTag = speciesTag;
gMultiuseSpriteTemplate.anims = gUnknown_82349BC;
}
@@ -1170,7 +1421,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosit
}
}
-void EncryptBoxMon(struct BoxPokemon *boxMon)
+static void EncryptBoxMon(struct BoxPokemon *boxMon)
{
u32 i;
for (i = 0; i < 12; i++)
@@ -1180,7 +1431,7 @@ void EncryptBoxMon(struct BoxPokemon *boxMon)
}
}
-void DecryptBoxMon(struct BoxPokemon *boxMon)
+static void DecryptBoxMon(struct BoxPokemon *boxMon)
{
u32 i;
for (i = 0; i < 12; i++)
@@ -1236,7 +1487,7 @@ case n: \
break; \
} \
-union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)
+static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)
{
union PokemonSubstruct *substruct = NULL;
@@ -1290,27 +1541,27 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data)
ret = mon->maxHP;
break;
case MON_DATA_ATK:
- ret = (u16)GetDeoxysStat(mon, STAT_ATK);
+ ret = GetDeoxysStat(mon, STAT_ATK);
if (!ret)
ret = mon->attack;
break;
case MON_DATA_DEF:
- ret = (u16)GetDeoxysStat(mon, STAT_DEF);
+ ret = GetDeoxysStat(mon, STAT_DEF);
if (!ret)
ret = mon->defense;
break;
case MON_DATA_SPEED:
- ret = (u16)GetDeoxysStat(mon, STAT_SPEED);
+ ret = GetDeoxysStat(mon, STAT_SPEED);
if (!ret)
ret = mon->speed;
break;
case MON_DATA_SPATK:
- ret = (u16)GetDeoxysStat(mon, STAT_SPATK);
+ ret = GetDeoxysStat(mon, STAT_SPATK);
if (!ret)
ret = mon->spAttack;
break;
case MON_DATA_SPDEF:
- ret = (u16)GetDeoxysStat(mon, STAT_SPDEF);
+ ret = GetDeoxysStat(mon, STAT_SPDEF);
if (!ret)
ret = mon->spDefense;
break;
@@ -2065,7 +2316,7 @@ u8 GiveMonToPlayer(struct Pokemon *mon)
return MON_GIVEN_TO_PARTY;
}
-u8 SendMonToPC(struct Pokemon* mon)
+static u8 SendMonToPC(struct Pokemon* mon)
{
s32 boxNo, boxPos;
@@ -2165,7 +2416,7 @@ u8 GetMonAbility(struct Pokemon *mon)
return GetAbilityBySpecies(species, altAbility);
}
-void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
+static void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
{
s32 i, j;
@@ -2224,7 +2475,7 @@ bool8 IsPlayerPartyAndPokemonStorageFull(void)
return IsPokemonStorageFull();
}
-bool8 IsPokemonStorageFull(void)
+static bool8 IsPokemonStorageFull(void)
{
s32 i, j;
@@ -2258,22 +2509,22 @@ void GetSpeciesName(u8 *name, u16 species)
u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex)
{
u8 basePP = gBattleMoves[move].pp;
- return basePP + ((basePP * 20 * ((gUnknown_825DEA1[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);
+ return basePP + ((basePP * 20 * ((gPPUpGetMask[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);
}
void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex)
{
u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
- ppBonuses &= gPPUpWriteMasks[moveIndex];
+ ppBonuses &= gPPUpSetMask[moveIndex];
SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
}
void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex)
{
- mon->ppBonuses &= gPPUpWriteMasks[moveIndex];
+ mon->ppBonuses &= gPPUpSetMask[moveIndex];
}
-void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
+static void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
{
u16* hpSwitchout;
s32 i;
@@ -2333,10 +2584,6 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex,
return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0);
}
-extern const u8 gUnknown_825DEA1[];
-extern const u8 gUnknown_825DEA9[];
-extern const u8 sGetMonDataEVConstants[];
-
bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e)
{
u32 data;
@@ -2512,11 +2759,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
if (r10 & 0x20)
{
r10 &= ~0x20;
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3 && sp28 > 4)
{
- data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex];
+ data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex];
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28;
@@ -2741,13 +2988,13 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
}
break;
case 4:
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
if (data < 3)
{
r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
- data &= gPPUpWriteMasks[moveIndex];
- data += gUnknown_825DEA9[moveIndex] * 3;
+ data &= gPPUpSetMask[moveIndex];
+ data += gPPUpAddMask[moveIndex] * 3;
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4;
@@ -2840,7 +3087,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
return retVal;
}
-bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
+static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
{
u32 status = GetMonData(mon, MON_DATA_STATUS, 0);
@@ -2858,8 +3105,6 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 bat
}
}
-extern bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
-
#ifdef NONMATCHING
/*
* This is nonmatching due to the compiler's insistence on avoiding the u8 cast
@@ -3047,11 +3292,11 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
if (r10 & 0x20)
{
r10 &= ~0x20;
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3 && sp28 > 4)
{
- //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex];
+ //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex];
//SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
//
//data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28;
@@ -3286,7 +3531,7 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
}
break;
case 4:
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3)
{
@@ -3295,8 +3540,8 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
/*
data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
- data &= gPPUpWriteMasks[moveIndex];
- data += gUnknown_825DEA9[moveIndex] * 3;
+ data &= gPPUpSetMask[moveIndex];
+ data += gPPUpAddMask[moveIndex] * 3;
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4;
@@ -3957,7 +4202,7 @@ _08042850:\n\
movs r2, 0\n\
bl GetMonData\n\
adds r5, r0, 0\n\
- ldr r0, _080428DC @ =gUnknown_825DEA1\n\
+ ldr r0, _080428DC @ =gPPUpGetMask\n\
ldr r1, [sp, 0x8]\n\
adds r0, r1, r0\n\
ldrb r0, [r0]\n\
@@ -4013,7 +4258,7 @@ _080428D2:\n\
ldr r0, [r0]\n\
mov pc, r0\n\
.align 2, 0\n\
-_080428DC: .4byte gUnknown_825DEA1\n\
+_080428DC: .4byte gPPUpGetMask\n\
_080428E0: .4byte _080428E4\n\
.align 2, 0\n\
_080428E4:\n\
@@ -4275,7 +4520,7 @@ _08042AF4:\n\
movs r2, 0\n\
bl GetMonData\n\
adds r5, r0, 0\n\
- ldr r0, _08042B48 @ =gUnknown_825DEA1\n\
+ ldr r0, _08042B48 @ =gPPUpGetMask\n\
ldr r1, [sp, 0x8]\n\
adds r0, r1, r0\n\
ldrb r0, [r0]\n\
@@ -4309,7 +4554,7 @@ _08042AF4:\n\
str r2, [sp, 0x10]\n\
b _08042BBE\n\
.align 2, 0\n\
-_08042B48: .4byte gUnknown_825DEA1\n\
+_08042B48: .4byte gPPUpGetMask\n\
_08042B4C:\n\
mov r0, r8\n\
movs r1, 0x20\n\
@@ -4397,7 +4642,7 @@ _08042BD8:\n\
}
#endif
-bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
+static bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
{
if((GetMonData(mon, MON_DATA_STATUS, NULL) & healMask) != 0)
return TRUE;
@@ -4518,7 +4763,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
return offset;
}
-void sub_8042D50(int stat)
+static void sub_8042D50(int stat)
{
gBattlerTarget = gBattlerInMenuId;
StringCopy(gBattleTextBuff1, gUnknown_83FD5D0[gUnknown_825DFF0[stat]]);
@@ -4581,13 +4826,11 @@ u8 GetNature(struct Pokemon *mon)
return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25;
}
-u8 GetNatureFromPersonality(u32 personality)
+static u8 GetNatureFromPersonality(u32 personality)
{
return personality % 25;
}
-extern bool32 sub_806E25C(void);
-
u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
{
int i;
@@ -4718,7 +4961,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
// HoennPokedexNumToSpecies, but is it really Hoenn or Kanto its checking
// TODO: Figure this out
-u16 sub_80431B4(u16 var)
+static u16 sub_80431B4(u16 var)
{
u16 species;
@@ -4755,7 +4998,7 @@ u16 NationalPokedexNumToSpecies(u16 nationalNum)
}
// NationalToKantoOrder?
-u16 sub_804324C(u16 nationalNum)
+static u16 sub_804324C(u16 nationalNum)
{
u16 hoennNum;
@@ -4783,7 +5026,7 @@ u16 SpeciesToNationalPokedexNum(u16 species)
// these 2 functions are probably kanto and not hoenn
// TODO: figure this out
-u16 SpeciesToHoennPokedexNum(u16 species)
+static u16 SpeciesToHoennPokedexNum(u16 species)
{
if (!species)
return 0;
@@ -4810,7 +5053,7 @@ u16 SpeciesToCryId(u16 species)
return gUnknown_82539D4[species - ((SPECIES_OLD_UNOWN_Z + 1) - 1)];
}
-void sub_8043338(u16 species, u32 personality, u8 *dest)
+static void sub_8043338(u16 species, u32 personality, u8 *dest)
{
if (species == SPECIES_SPINDA
&& dest != gMonSpritesGfxPtr->sprites[0]
@@ -4928,10 +5171,10 @@ bool8 sub_80435E0(void)
return retVal;
}
-bool8 sub_8043620(u8 id)
+bool8 GetLinkTrainerFlankId(u8 linkPlayerId)
{
bool8 retVal = FALSE;
- switch (gLinkPlayers[id].id)
+ switch (gLinkPlayers[linkPlayerId].id)
{
case 0:
case 3:
@@ -4954,12 +5197,12 @@ s32 GetBankMultiplayerId(u16 a1)
return id;
}
-u8 sub_804367C(u16 trainer)
+u8 GetTrainerEncounterMusicId(u16 trainer)
{
return gTrainers[trainer].encounterMusic_gender & 0x7F;
}
-u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
+static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
{
if (statIndex < 1 || statIndex > 5)
{
@@ -5204,7 +5447,7 @@ u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection)
return retVal;
}
-void sub_8043B38(void)
+static void sub_8043B38(void)
{
u8 foo[4]; // huh?
}
@@ -5214,7 +5457,7 @@ void sub_8043B40(void)
u8 foo[4]; // huh?
}
-void sub_8043B48(struct Pokemon *mon, int species, u8 unused, u32 data)
+static void SetMonExpWithMaxLevelCheck(struct Pokemon *mon, int species, u8 unused, u32 data)
{
if (data > gExperienceTables[gBaseStats[species].growthRate][100])
{
@@ -5235,7 +5478,7 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon)
if(exp > gExperienceTables[gBaseStats[species].growthRate][newLevel])
{
SetMonData(mon, MON_DATA_LEVEL, &newLevel);
- sub_8043B48(mon, species, newLevel, exp);
+ SetMonExpWithMaxLevelCheck(mon, species, newLevel, exp);
return TRUE;
}
else
@@ -5243,7 +5486,7 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon)
}
else
{
- sub_8043B48(mon, species, level, exp);
+ SetMonExpWithMaxLevelCheck(mon, species, level, exp);
return FALSE;
}
}
@@ -5377,7 +5620,7 @@ void ClearBattleMonForms(void)
gBattleMonForms[i] = 0;
}
-u16 GetMUS_ForBattle(void)
+static u16 GetMUS_ForBattle(void)
{
if(gBattleTypeFlags & 0x1000)
return 0x12A;
@@ -5480,7 +5723,7 @@ bool8 IsPokeSpriteNotFlipped(u16 species)
return gBaseStats[species].noFlip;
}
-s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
+static s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
{
u8 nature = GetNature(mon);
return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
@@ -5595,7 +5838,7 @@ bool8 IsMonShiny(struct Pokemon *mon)
return IsShinyOtIdPersonality(otId, personality);
}
-bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
+static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
{
bool8 retVal = FALSE;
u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
@@ -5604,8 +5847,728 @@ bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
return retVal;
}
-u8 *sub_80444C4(void)
+u8 *GetTrainerPartnerName(void)
{
u8 id = GetMultiplayerId();
return gLinkPlayers[GetBankMultiplayerId(gLinkPlayers[id].id ^ 2)].name;
}
+
+u8 GetPlayerPartyHighestLevel(void)
+{
+ s32 slot;
+ u8 level, monLevel;
+
+ level = 1;
+ for(slot = 0; slot < PARTY_SIZE; ++slot)
+ {
+ if (GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_HAS_SPECIES, NULL) == 1 && !GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_IS_EGG, NULL))
+ {
+ monLevel = GetMonData(&gPlayerParty[slot], MON_DATA_LEVEL, NULL);
+ if (monLevel > level)
+ level = monLevel;
+ }
+ }
+ return level;
+}
+
+u16 FacilityClassToPicIndex(u16 facilityClass)
+{
+ return gFacilityClassToPicIndex[facilityClass];
+}
+
+bool8 sub_804455C(u8 caseId, u8 battlerId)
+{
+ switch (caseId)
+ {
+ case 0:
+ default:
+ return FALSE;
+ case 1:
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ return FALSE;
+ if (!gMain.inBattle)
+ return FALSE;
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ return FALSE;
+ break;
+ case 2:
+ break;
+ case 3:
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ return FALSE;
+ if (!gMain.inBattle)
+ return FALSE;
+ if (battlerId == 1 || battlerId == 4 || battlerId == 5)
+ return TRUE;
+ return FALSE;
+ case 4:
+ break;
+ case 5:
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ if (!gMain.inBattle)
+ return FALSE;
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ return FALSE;
+ }
+ else
+ {
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!gMain.inBattle)
+ return FALSE;
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId)
+{
+ s32 ivVal, evVal;
+ u16 statValue;
+ u8 nature;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ {
+ return statValue = 0;
+ }
+ else
+ {
+ ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL);
+ evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL);
+ statValue = ((sDeoxysBaseStats[statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5;
+ nature = GetNature(mon);
+ statValue = ModifyStatByNature(nature, statValue, (u8)statId);
+ }
+ return statValue;
+}
+
+void SetDeoxysStats(void)
+{
+ s32 i, value;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ struct Pokemon *mon = &gPlayerParty[i];
+
+ if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ continue;
+ value = GetMonData(mon, MON_DATA_ATK, NULL);
+ SetMonData(mon, MON_DATA_ATK, &value);
+ value = GetMonData(mon, MON_DATA_DEF, NULL);
+ SetMonData(mon, MON_DATA_DEF, &value);
+ value = GetMonData(mon, MON_DATA_SPEED, NULL);
+ SetMonData(mon, MON_DATA_SPEED, &value);
+ value = GetMonData(mon, MON_DATA_SPATK, NULL);
+ SetMonData(mon, MON_DATA_SPATK, &value);
+ value = GetMonData(mon, MON_DATA_SPDEF, NULL);
+ SetMonData(mon, MON_DATA_SPDEF, &value);
+ }
+}
+
+u16 sub_80447AC(void)
+{
+ u8 linkId = GetMultiplayerId() ^ 1;
+ u32 arrId = gLinkPlayers[linkId].trainerId & 7;
+
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return FacilityClassToPicIndex(gLinkPlayerFacilityClasses[arrId]);
+}
+
+u16 sub_80447F0(void)
+{
+ u8 linkId = GetMultiplayerId() ^ 1;
+ u32 arrId = gLinkPlayers[linkId].trainerId & 7;
+
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return gFacilityClassToTrainerClass[gLinkPlayerFacilityClasses[arrId]];
+}
+
+void CreateObedientEnemyMon(void)
+{
+ s32 species = gSpecialVar_0x8004;
+ s32 level = gSpecialVar_0x8005;
+ s32 itemId = gSpecialVar_0x8006;
+
+ ZeroEnemyPartyMons();
+ CreateObedientMon(&gEnemyParty[0], species, level, 32, 0, 0, 0, 0);
+ if (itemId)
+ {
+ u8 heldItem[2];
+
+ heldItem[0] = itemId;
+ heldItem[1] = itemId >> 8;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
+ }
+}
+
+void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)
+{
+ u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT;
+
+ if (!GetSetPokedexFlag(nationalNum, getFlagCaseId))
+ {
+ GetSetPokedexFlag(nationalNum, caseId);
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN)
+ gSaveBlock2Ptr->pokedex.unownPersonality = personality;
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA)
+ gSaveBlock2Ptr->pokedex.spindaPersonality = personality;
+ }
+}
+
+bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank)
+{
+ u8 buffer[12];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_GHOST && GetBattlerSide(bank))
+ {
+ GetMonData(mon, MON_DATA_NICKNAME, buffer);
+ StringGetEnd10(buffer);
+ if (!StringCompare(buffer, gUnknown_841D148))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void OakSpeechNidoranFSetupTemplate(struct OakSpeechNidoranFStruct *structPtr, u8 battlePosition)
+{
+ u16 i = 0, j = 0;
+
+ if (battlePosition > 3)
+ {
+ for (i = 0; i < (s8)structPtr->spriteCount; ++i)
+ {
+ structPtr->templates[i] = gUnknown_825DEF0[i];
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[i * structPtr->frameCount + j].data = &structPtr->bufferPtrs[i][j * 0x800];
+ structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->frameCount];
+ }
+ }
+ else
+ {
+ const struct SpriteTemplate *template = &gUnknown_825DEF0[battlePosition];
+
+ structPtr->templates[0] = *template;
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[j].data = &structPtr->bufferPtrs[0][j * 0x800];
+ structPtr->templates[0].images = structPtr->frameImages;
+ }
+}
+
+// not used
+static void OakSpeechNidoranFSetupTemplateDummy(struct OakSpeechNidoranFStruct *structPtr)
+{
+ u16 i, j;
+
+ for (i = 0; i < (s8)structPtr->spriteCount; ++i)
+ {
+ structPtr->templates[i] = sOakSpeechNidoranFDummyTemplate;
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[i * structPtr->spriteCount + j].data = &structPtr->bufferPtrs[i][j * 0x800];
+ structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->spriteCount]; // should be frameCount logically
+ structPtr->templates[i].anims = gUnknown_82349BC;
+ structPtr->templates[i].paletteTag = i;
+ }
+}
+
+#ifdef NONMATCHING
+struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable)
+{
+ s32 size;
+ u8 i, flags = 0;
+
+ if (sOakSpeechNidoranResources != NULL)
+ {
+ if (sOakSpeechNidoranResources->enable == 0xA3)
+ return NULL;
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ sOakSpeechNidoranResources = NULL;
+ }
+ sOakSpeechNidoranResources = AllocZeroed(0x18);
+ if (sOakSpeechNidoranResources == NULL)
+ return NULL;
+ switch (enable)
+ {
+ case TRUE:
+ if (battlePosition == 4)
+ {
+ sOakSpeechNidoranResources->spriteCount = 4;
+ sOakSpeechNidoranResources->battlePosition = 4;
+ }
+ else
+ {
+ if (battlePosition > 4)
+ battlePosition = 0;
+ sOakSpeechNidoranResources->spriteCount = 1;
+ sOakSpeechNidoranResources->battlePosition = 1;
+ }
+ sOakSpeechNidoranResources->frameCount = 4;
+ sOakSpeechNidoranResources->enable2 = TRUE;
+ break;
+ case FALSE:
+ default:
+ if (!battlePosition)
+ battlePosition = 1;
+ if (battlePosition > 8)
+ battlePosition = 8;
+ // The following two statements refused to cooperate.
+ sOakSpeechNidoranResources->spriteCount = battlePosition;
+ sOakSpeechNidoranResources->battlePosition = battlePosition;
+ sOakSpeechNidoranResources->frameCount = 4;
+ sOakSpeechNidoranResources->enable2 = FALSE;
+ break;
+ }
+ size = sOakSpeechNidoranResources->frameCount * 0x800;
+ sOakSpeechNidoranResources->sizePerSprite = size;
+ sOakSpeechNidoranResources->dataBuffer = AllocZeroed(sOakSpeechNidoranResources->spriteCount * size);
+ sOakSpeechNidoranResources->bufferPtrs = AllocZeroed(sOakSpeechNidoranResources->spriteCount * 0x20);
+ if (sOakSpeechNidoranResources->dataBuffer == NULL || sOakSpeechNidoranResources->bufferPtrs == NULL)
+ {
+ flags |= 1;
+ }
+ else
+ {
+ for (i = 0; i < (s8)sOakSpeechNidoranResources->spriteCount; ++i)
+ sOakSpeechNidoranResources->bufferPtrs[i] = &sOakSpeechNidoranResources->dataBuffer[sOakSpeechNidoranResources->sizePerSprite * i];
+ }
+ sOakSpeechNidoranResources->templates = AllocZeroed(sizeof(struct SpriteTemplate) * sOakSpeechNidoranResources->spriteCount);
+ sOakSpeechNidoranResources->frameImages = AllocZeroed(sOakSpeechNidoranResources->spriteCount * sizeof(struct SpriteFrameImage) * sOakSpeechNidoranResources->frameCount);
+ if (sOakSpeechNidoranResources->templates == NULL || sOakSpeechNidoranResources->frameImages == NULL)
+ {
+ flags |= 2;
+ }
+ else
+ {
+ for (i = 0; i < sOakSpeechNidoranResources->frameCount * sOakSpeechNidoranResources->spriteCount; ++i)
+ sOakSpeechNidoranResources->frameImages[i].size = 0x800;
+ switch (sOakSpeechNidoranResources->enable2)
+ {
+ case TRUE:
+ OakSpeechNidoranFSetupTemplate(sOakSpeechNidoranResources, battlePosition);
+ break;
+ case FALSE:
+ default:
+ OakSpeechNidoranFSetupTemplateDummy(sOakSpeechNidoranResources);
+ break;
+ }
+ }
+ if (flags & 2)
+ {
+ if (sOakSpeechNidoranResources->frameImages != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages);
+ if (sOakSpeechNidoranResources->templates != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates);
+ }
+ if (flags & 1)
+ {
+ if (sOakSpeechNidoranResources->bufferPtrs != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs);
+ if (sOakSpeechNidoranResources->dataBuffer != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer);
+ }
+ if (flags)
+ {
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources);
+ }
+ else
+ {
+ sOakSpeechNidoranResources->enable = 0xA3;
+ }
+ return sOakSpeechNidoranResources;
+}
+#else
+NAKED
+struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r5, r1, 24\n\
+ movs r0, 0\n\
+ mov r8, r0\n\
+ ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r4]\n\
+ cmp r1, 0\n\
+ beq _08044B1E\n\
+ ldrb r0, [r1, 0x2]\n\
+ cmp r0, 0xA3\n\
+ beq _08044B2E\n\
+ adds r0, r1, 0\n\
+ movs r1, 0\n\
+ movs r2, 0x18\n\
+ bl memset\n\
+ mov r1, r8\n\
+ str r1, [r4]\n\
+ _08044B1E:\n\
+ ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\
+ movs r0, 0x18\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ str r2, [r4]\n\
+ cmp r2, 0\n\
+ bne _08044B38\n\
+ _08044B2E:\n\
+ movs r0, 0\n\
+ b _08044D70\n\
+ .align 2, 0\n\
+ _08044B34: .4byte sOakSpeechNidoranResources\n\
+ _08044B38:\n\
+ cmp r5, 0\n\
+ beq _08044B94\n\
+ cmp r5, 0x1\n\
+ bne _08044B94\n\
+ cmp r6, 0x4\n\
+ bne _08044B5E\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, [r4]\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ movs r1, 0x40\n\
+ b _08044B7C\n\
+ _08044B5E:\n\
+ cmp r6, 0x4\n\
+ bls _08044B64\n\
+ movs r6, 0\n\
+ _08044B64:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x1\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, [r4]\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ movs r1, 0x10\n\
+ _08044B7C:\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, _08044B90 @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r2]\n\
+ movs r0, 0x4\n\
+ strb r0, [r1, 0x1]\n\
+ ldr r1, [r2]\n\
+ movs r0, 0x1\n\
+ strb r0, [r1, 0x3]\n\
+ b _08044BD0\n\
+ .align 2, 0\n\
+ _08044B90: .4byte sOakSpeechNidoranResources\n\
+ _08044B94:\n\
+ cmp r6, 0\n\
+ bne _08044B9A\n\
+ movs r6, 0x1\n\
+ _08044B9A:\n\
+ cmp r6, 0x8\n\
+ bls _08044BA0\n\
+ movs r6, 0x8\n\
+ _08044BA0:\n\
+ ldr r4, _08044C10 @ =sOakSpeechNidoranResources\n\
+ ldr r3, [r4]\n\
+ movs r0, 0xF\n\
+ adds r1, r6, 0\n\
+ ands r1, r0\n\
+ ldrb r2, [r3]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ strb r0, [r3]\n\
+ ldr r2, [r4]\n\
+ lsls r3, r6, 4\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ orrs r0, r3\n\
+ strb r0, [r2]\n\
+ ldr r1, [r4]\n\
+ movs r2, 0\n\
+ movs r0, 0x4\n\
+ strb r0, [r1, 0x1]\n\
+ ldr r0, [r4]\n\
+ strb r2, [r0, 0x3]\n\
+ _08044BD0:\n\
+ ldr r5, _08044C10 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r5]\n\
+ ldrb r1, [r0, 0x1]\n\
+ lsls r1, 11\n\
+ str r1, [r0, 0x4]\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ muls r0, r1\n\
+ bl AllocZeroed\n\
+ ldr r1, [r5]\n\
+ str r0, [r1, 0x8]\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 28\n\
+ lsrs r0, 23\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ ldr r1, [r5]\n\
+ str r2, [r1, 0xC]\n\
+ ldr r0, [r1, 0x8]\n\
+ cmp r0, 0\n\
+ beq _08044C04\n\
+ cmp r2, 0\n\
+ bne _08044C14\n\
+ _08044C04:\n\
+ movs r0, 0x1\n\
+ mov r1, r8\n\
+ orrs r1, r0\n\
+ mov r8, r1\n\
+ b _08044C44\n\
+ .align 2, 0\n\
+ _08044C10: .4byte sOakSpeechNidoranResources\n\
+ _08044C14:\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 28\n\
+ movs r4, 0\n\
+ adds r3, r5, 0\n\
+ cmp r0, 0\n\
+ beq _08044C44\n\
+ _08044C20:\n\
+ ldr r3, [r5]\n\
+ ldr r0, [r3, 0xC]\n\
+ lsls r1, r4, 2\n\
+ adds r1, r0\n\
+ ldr r0, [r3, 0x4]\n\
+ adds r2, r0, 0\n\
+ muls r2, r4\n\
+ ldr r0, [r3, 0x8]\n\
+ adds r0, r2\n\
+ str r0, [r1]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ cmp r4, r0\n\
+ blt _08044C20\n\
+ _08044C44:\n\
+ ldr r5, _08044C8C @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r5]\n\
+ ldrb r1, [r0]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ lsls r0, 3\n\
+ bl AllocZeroed\n\
+ ldr r2, [r5]\n\
+ str r0, [r2, 0x10]\n\
+ ldrb r1, [r2]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ ldrb r0, [r2, 0x1]\n\
+ lsls r0, 3\n\
+ muls r0, r1\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ ldr r1, [r5]\n\
+ str r2, [r1, 0x14]\n\
+ ldr r0, [r1, 0x10]\n\
+ cmp r0, 0\n\
+ beq _08044C7C\n\
+ cmp r2, 0\n\
+ bne _08044C90\n\
+ _08044C7C:\n\
+ movs r0, 0x2\n\
+ mov r1, r8\n\
+ orrs r1, r0\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ b _08044CE2\n\
+ .align 2, 0\n\
+ _08044C8C: .4byte sOakSpeechNidoranResources\n\
+ _08044C90:\n\
+ movs r4, 0\n\
+ ldrb r0, [r1, 0x1]\n\
+ ldrb r1, [r1]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ muls r0, r1\n\
+ adds r3, r5, 0\n\
+ cmp r4, r0\n\
+ bge _08044CC6\n\
+ adds r7, r3, 0\n\
+ movs r5, 0x80\n\
+ lsls r5, 4\n\
+ _08044CA8:\n\
+ ldr r2, [r7]\n\
+ ldr r1, [r2, 0x14]\n\
+ lsls r0, r4, 3\n\
+ adds r0, r1\n\
+ strh r5, [r0, 0x4]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldrb r1, [r2, 0x1]\n\
+ ldrb r0, [r2]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ muls r0, r1\n\
+ cmp r4, r0\n\
+ blt _08044CA8\n\
+ _08044CC6:\n\
+ ldr r0, [r3]\n\
+ ldrb r4, [r0, 0x3]\n\
+ cmp r4, 0\n\
+ beq _08044CDA\n\
+ cmp r4, 0x1\n\
+ bne _08044CDA\n\
+ adds r1, r6, 0\n\
+ bl OakSpeechNidoranFSetupTemplate\n\
+ b _08044CE2\n\
+ _08044CDA:\n\
+ ldr r0, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r0]\n\
+ bl OakSpeechNidoranFSetupTemplateDummy\n\
+ _08044CE2:\n\
+ movs r0, 0x2\n\
+ mov r1, r8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08044D12\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x14]\n\
+ cmp r0, 0\n\
+ beq _08044D00\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x14]\n\
+ _08044D00:\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x10]\n\
+ cmp r0, 0\n\
+ beq _08044D12\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x10]\n\
+ _08044D12:\n\
+ movs r0, 0x1\n\
+ mov r1, r8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08044D42\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0xC]\n\
+ cmp r0, 0\n\
+ beq _08044D30\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0xC]\n\
+ _08044D30:\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x8]\n\
+ cmp r0, 0\n\
+ beq _08044D42\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x8]\n\
+ _08044D42:\n\
+ mov r0, r8\n\
+ cmp r0, 0\n\
+ beq _08044D64\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ movs r1, 0\n\
+ movs r2, 0x18\n\
+ bl memset\n\
+ ldr r0, [r4]\n\
+ bl Free\n\
+ movs r0, 0\n\
+ str r0, [r4]\n\
+ b _08044D6C\n\
+ .align 2, 0\n\
+ _08044D60: .4byte sOakSpeechNidoranResources\n\
+ _08044D64:\n\
+ ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r0]\n\
+ movs r0, 0xA3\n\
+ strb r0, [r1, 0x2]\n\
+ _08044D6C:\n\
+ ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r0]\n\
+ _08044D70:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+ _08044D7C: .4byte sOakSpeechNidoranResources\n\
+ ");
+}
+#endif
+
+void OakSpeechNidoranFFreeResources(void)
+{
+ if (sOakSpeechNidoranResources != NULL)
+ {
+ if (sOakSpeechNidoranResources->enable != 0xA3)
+ {
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ sOakSpeechNidoranResources = NULL;
+ }
+ else
+ {
+ if (sOakSpeechNidoranResources->frameImages != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages);
+ if (sOakSpeechNidoranResources->templates != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates);
+ if (sOakSpeechNidoranResources->bufferPtrs != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs);
+ if (sOakSpeechNidoranResources->dataBuffer != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer);
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources);
+ }
+
+ }
+}
+
+void *OakSpeechNidoranFGetBuffer(u8 bufferId)
+{
+ if (sOakSpeechNidoranResources->enable != 0xA3)
+ {
+ return NULL;
+ }
+ else
+ {
+ if (bufferId >= (s8)sOakSpeechNidoranResources->spriteCount)
+ bufferId = 0;
+ return sOakSpeechNidoranResources->bufferPtrs[bufferId];
+ }
+}
diff --git a/src/trainer_tower.c b/src/trainer_tower.c
index b7b9c096d..cdb42ca96 100644
--- a/src/trainer_tower.c
+++ b/src/trainer_tower.c
@@ -1378,21 +1378,21 @@ void sub_815E9FC(void)
{
r2 = gUnknown_847A2EE[r5][r6];
gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
- sub_803E0A4(&gEnemyParty[r6], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
+ CreateBattleTowerMon(&gEnemyParty[r6], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
}
break;
case 1:
r2 = gUnknown_847A2FE[r5][0];
gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2].level = r9;
- sub_803E0A4(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2]);
+ CreateBattleTowerMon(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2]);
r2 = gUnknown_847A2FE[r5][1];
gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2].level = r9;
- sub_803E0A4(&gEnemyParty[1], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2]);
+ CreateBattleTowerMon(&gEnemyParty[1], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2]);
break;
case 2:
r2 = gUnknown_847A30E[r5][r4];
gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
- sub_803E0A4(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
+ CreateBattleTowerMon(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
break;
}
}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index b968e31ee..bb2198bd4 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -487,13 +487,7 @@ gUnknown_2024414: @ 2024414
gUnknown_2024478: @ 2024478
.space 0x64
-gMultiuseSpriteTemplate: @ 20244DC
- .space 0x18
-
-gUnknown_20244F4: @ 20244F4
- .space 0x4
-
- .align 2
+ .include "src/pokemon.o"
.include "src/daycare.o"
.align 2
.include "src/load_save.o"