summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/battle_frontier_2.s28
-rw-r--r--asm/battle_tower.s2546
-rw-r--r--data/battle_tower.s10
-rw-r--r--data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc2
-rw-r--r--data/specials.inc2
-rw-r--r--include/battle_frontier_2.h1
-rw-r--r--include/battle_tower.h24
-rw-r--r--include/global.h32
-rw-r--r--src/apprentice.c58
-rw-r--r--src/battle_dome.c62
-rw-r--r--src/battle_frontier_1.c6
-rw-r--r--src/battle_setup.c4
-rw-r--r--src/battle_tent.c22
-rw-r--r--src/battle_tower.c977
-rw-r--r--src/map_name_popup.c2
-rw-r--r--src/record_mixing.c2
-rw-r--r--src/start_menu.c4
-rw-r--r--src/wild_encounter.c4
18 files changed, 1126 insertions, 2660 deletions
diff --git a/asm/battle_frontier_2.s b/asm/battle_frontier_2.s
index 3f6591927..48673d4fa 100644
--- a/asm/battle_frontier_2.s
+++ b/asm/battle_frontier_2.s
@@ -6195,8 +6195,8 @@ _081A4D90:
.pool
thumb_func_end CopyFrontierBrainTrainerName
- thumb_func_start sub_81A4DB8
-sub_81A4DB8: @ 81A4DB8
+ thumb_func_start IsFrontierBrainFemale
+IsFrontierBrainFemale: @ 81A4DB8
push {lr}
ldr r0, =0x000040cf
bl VarGet
@@ -6209,10 +6209,10 @@ sub_81A4DB8: @ 81A4DB8
pop {r1}
bx r1
.pool
- thumb_func_end sub_81A4DB8
+ thumb_func_end IsFrontierBrainFemale
- thumb_func_start sub_81A4DD8
-sub_81A4DD8: @ 81A4DD8
+ thumb_func_start SetFrontierBrainTrainerGfxId
+SetFrontierBrainTrainerGfxId: @ 81A4DD8
push {lr}
ldr r0, =0x000040cf
bl VarGet
@@ -6227,10 +6227,10 @@ sub_81A4DD8: @ 81A4DD8
pop {r0}
bx r0
.pool
- thumb_func_end sub_81A4DD8
+ thumb_func_end SetFrontierBrainTrainerGfxId
- thumb_func_start sub_81A4E04
-sub_81A4E04: @ 81A4E04
+ thumb_func_start CreateFrontierBrainPokemon
+CreateFrontierBrainPokemon: @ 81A4E04
push {r4-r7,lr}
mov r7, r10
mov r6, r9
@@ -6460,7 +6460,7 @@ _081A4FD0:
pop {r0}
bx r0
.pool
- thumb_func_end sub_81A4E04
+ thumb_func_end CreateFrontierBrainPokemon
thumb_func_start sub_81A4FF0
sub_81A4FF0: @ 81A4FF0
@@ -8755,7 +8755,7 @@ sub_81A63B8: @ 81A63B8
ldr r0, =gTrainerBattleOpponent_A
ldrh r0, [r0]
movs r1, 0
- bl sub_8162614
+ bl SetBattleFacilityTrainerGfxId
pop {r0}
bx r0
.pool
@@ -12662,7 +12662,7 @@ _081A831A:
str r0, [r1]
ldrh r0, [r5]
movs r1, 0
- bl sub_8162614
+ bl SetBattleFacilityTrainerGfxId
ldr r0, =gSaveBlock2Ptr
ldr r1, [r0]
ldr r0, =0x00000cb2
@@ -12747,7 +12747,7 @@ _081A83EE:
strh r4, [r5]
ldrh r0, [r5]
movs r1, 0
- bl sub_8162614
+ bl SetBattleFacilityTrainerGfxId
ldr r3, =gSaveBlock2Ptr
ldr r1, [r3]
ldr r0, =0x00000cb2
@@ -12808,7 +12808,7 @@ _081A8466:
strh r4, [r5]
ldrh r0, [r5]
movs r1, 0x1
- bl sub_8162614
+ bl SetBattleFacilityTrainerGfxId
ldr r0, =gSaveBlock2Ptr
ldr r1, [r0]
ldr r0, =0x00000cb2
@@ -17319,7 +17319,7 @@ _081AA8DC:
lsrs r7, r0, 16
adds r4, r7, 0
adds r0, r4, 0
- bl sub_81627A4
+ bl GetBattleFacilityTrainerGfxId
strb r0, [r5, 0x1]
ldr r0, =gSaveBlock2Ptr
ldr r0, [r0]
diff --git a/asm/battle_tower.s b/asm/battle_tower.s
index 8eedaf72f..fd011c555 100644
--- a/asm/battle_tower.s
+++ b/asm/battle_tower.s
@@ -6,2508 +6,8 @@
.text
- thumb_func_start sub_81623F0
-sub_81623F0: @ 81623F0
- push {r4-r7,lr}
- ldr r6, =gSaveBlock2Ptr
- ldr r0, [r6]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r0, 30
- cmp r0, 0x2
- bne _08162414
- bl sub_8165E18
- b _08162530
- .pool
-_08162414:
- ldr r0, =0x000040ce
- bl VarGet
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- bl sub_81A39C4
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x7
- bl __udivsi3
- lsls r0, 16
- lsrs r5, r0, 16
- bl GetFacilityEnemyMonLevel
- subs r4, 0x2
- cmp r4, 0x1
- bhi _08162488
- ldr r1, [r6]
- ldr r2, =0x00000cb2
- adds r0, r1, r2
- ldrh r3, [r0]
- ldr r2, =gTrainerBattleOpponent_A
- lsls r0, r3, 2
- ldr r4, =0x00000cb4
- adds r1, r4
- adds r0, r1, r0
- ldrh r0, [r0]
- strh r0, [r2]
- ldr r4, =gTrainerBattleOpponent_B
- lsls r0, r3, 1
- adds r0, 0x1
- lsls r0, 1
- adds r1, r0
- ldrh r0, [r1]
- strh r0, [r4]
- ldrh r0, [r2]
- movs r1, 0
- bl sub_8162614
- ldrh r0, [r4]
- movs r1, 0x1
- bl sub_8162614
- b _08162530
- .pool
-_08162488:
- bl ChooseSpecialBattleTowerTrainer
- lsls r0, 24
- cmp r0, 0
- beq _081624B4
- ldr r4, =gTrainerBattleOpponent_A
- ldrh r0, [r4]
- movs r1, 0
- bl sub_8162614
- ldr r1, [r6]
- ldr r2, =0x00000cb2
- adds r0, r1, r2
- ldrh r0, [r0]
- lsls r0, 1
- adds r2, 0x2
- b _08162528
- .pool
-_081624B4:
- lsls r7, r5, 24
- adds r5, r6, 0
- ldr r6, =0x00000cb2
-_081624BA:
- ldr r0, [r5]
- adds r0, r6
- ldrb r1, [r0]
- lsrs r0, r7, 24
- bl sub_8162548
- lsls r0, 16
- lsrs r3, r0, 16
- movs r4, 0
- ldr r1, [r5]
- adds r0, r1, r6
- ldrh r0, [r0]
- cmp r4, r0
- bge _081624FC
- ldr r2, =0x00000cb4
- adds r0, r1, r2
- ldrh r0, [r0]
- cmp r0, r3
- beq _081624FC
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- subs r2, 0x2
- adds r0, r1, r2
- ldrh r2, [r0]
- ldr r0, =0x00000cb4
- adds r1, r0
-_081624EE:
- adds r1, 0x2
- adds r4, 0x1
- cmp r4, r2
- bge _081624FC
- ldrh r0, [r1]
- cmp r0, r3
- bne _081624EE
-_081624FC:
- ldr r0, [r5]
- ldr r1, =0x00000cb2
- adds r0, r1
- ldrh r0, [r0]
- cmp r4, r0
- bne _081624BA
- ldr r4, =gTrainerBattleOpponent_A
- strh r3, [r4]
- ldrh r0, [r4]
- movs r1, 0
- bl sub_8162614
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r2, =0x00000cb2
- adds r0, r1, r2
- ldrh r2, [r0]
- adds r0, r2, 0x1
- cmp r0, 0x6
- bgt _08162530
- lsls r0, r2, 1
- ldr r2, =0x00000cb4
-_08162528:
- adds r1, r2
- adds r1, r0
- ldrh r0, [r4]
- strh r0, [r1]
-_08162530:
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81623F0
-
- thumb_func_start sub_8162548
-sub_8162548: @ 8162548
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- adds r3, r0, 0
- lsls r1, 24
- lsrs r1, 24
- cmp r0, 0x7
- bhi _08162584
- cmp r1, 0x6
- bne _08162570
- ldr r2, =gUnknown_085DFA1A
- lsls r1, r0, 2
- adds r0, r2, 0x2
- adds r0, r1, r0
- adds r1, r2
- ldrh r0, [r0]
- ldrh r4, [r1]
- b _0816258A
- .pool
-_08162570:
- ldr r2, =gUnknown_085DF9FA
- lsls r1, r3, 2
- adds r0, r2, 0x2
- adds r0, r1, r0
- adds r1, r2
- ldrh r0, [r0]
- ldrh r4, [r1]
- b _0816258A
- .pool
-_08162584:
- ldr r1, =gUnknown_085DF9FA
- ldrh r0, [r1, 0x1E]
- ldrh r4, [r1, 0x1C]
-_0816258A:
- subs r0, r4
- adds r0, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
- bl Random
- lsls r0, 16
- lsrs r0, 16
- adds r1, r5, 0
- bl __umodsi3
- adds r4, r0
- lsls r4, 16
- lsrs r5, r4, 16
- adds r0, r5, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_8162548
-
- thumb_func_start sub_81625B4
-sub_81625B4: @ 81625B4
- push {r4,lr}
- adds r4, r2, 0
- lsls r0, 24
- lsrs r0, 24
- adds r2, r0, 0
- lsls r1, 24
- lsrs r1, 24
- cmp r0, 0x7
- bhi _081625F4
- cmp r1, 0x6
- bne _081625D4
- ldr r1, =gUnknown_085DFA1A
- lsls r2, r0, 2
- b _081625D8
- .pool
-_081625D4:
- ldr r1, =gUnknown_085DF9FA
- lsls r2, 2
-_081625D8:
- adds r0, r1, 0x2
- adds r0, r2, r0
- adds r2, r1
- ldrh r0, [r0]
- ldrh r1, [r2]
- subs r0, r1
- adds r0, 0x1
- lsls r0, 16
- lsrs r1, r0, 16
- ldrh r0, [r2]
- b _08162604
- .pool
-_081625F4:
- ldr r0, =gUnknown_085DF9FA
- ldrh r1, [r0, 0x1E]
- ldrh r2, [r0, 0x1C]
- subs r1, r2
- adds r1, 0x1
- lsls r1, 16
- lsrs r1, 16
- ldrh r0, [r0, 0x1C]
-_08162604:
- strh r0, [r4]
- strb r1, [r3]
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81625B4
-
- thumb_func_start sub_8162614
-sub_8162614: @ 8162614
- push {r4-r6,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- adds r6, r4, 0
- lsls r1, 24
- lsrs r5, r1, 24
- bl GetFacilityEnemyMonLevel
- movs r0, 0xFA
- lsls r0, 1
- cmp r4, r0
- bne _08162640
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000bed
- adds r0, r1
- b _081626BA
- .pool
-_08162640:
- ldr r0, =0x000003fe
- cmp r4, r0
- bne _08162650
- bl sub_81A4DD8
- b _08162788
- .pool
-_08162650:
- ldr r0, =0x0000012b
- cmp r4, r0
- bhi _0816266C
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r4
- adds r0, r1
- b _081626BA
- .pool
-_0816266C:
- ldr r0, =0x0000018f
- cmp r4, r0
- bhi _08162698
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0xfffffed4
- adds r2, r4, r1
- movs r1, 0xEC
- muls r1, r2
- adds r0, r1
- ldr r1, =0x00000739
- adds r0, r1
- b _081626BA
- .pool
-_08162698:
- ldr r3, =gApprentices
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r0, =0xfffffe70
- adds r2, r6, r0
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0
- adds r1, 0xDC
- ldrb r0, [r1]
- lsls r0, 27
- lsrs r0, 27
- movs r1, 0x58
- muls r0, r1
- adds r0, r3
- adds r0, 0x32
-_081626BA:
- ldrb r2, [r0]
- movs r1, 0
- ldr r3, =gUnknown_085DCEDC
- ldrb r0, [r3]
- cmp r0, r2
- beq _081626D4
-_081626C6:
- adds r1, 0x1
- cmp r1, 0x1D
- bhi _081626D4
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, r2
- bne _081626C6
-_081626D4:
- cmp r1, 0x1E
- beq _08162700
- ldr r0, =gUnknown_085DCF0E
- adds r0, r1, r0
- ldrb r1, [r0]
- cmp r5, 0x1
- beq _08162744
- cmp r5, 0x1
- ble _0816272E
- cmp r5, 0xF
- bne _0816272E
- b _08162750
- .pool
-_08162700:
- movs r1, 0
- ldr r3, =gUnknown_085DCEFA
- ldrb r0, [r3]
- cmp r0, r2
- beq _08162718
-_0816270A:
- adds r1, 0x1
- cmp r1, 0x13
- bhi _08162718
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, r2
- bne _0816270A
-_08162718:
- cmp r1, 0x14
- beq _0816275C
- ldr r0, =gUnknown_085DCF2C
- adds r0, r1, r0
- ldrb r1, [r0]
- cmp r5, 0x1
- beq _08162744
- cmp r5, 0x1
- ble _0816272E
- cmp r5, 0xF
- beq _08162750
-_0816272E:
- ldr r0, =0x00004010
- bl VarSet
- b _08162788
- .pool
-_08162744:
- ldr r0, =0x00004011
- bl VarSet
- b _08162788
- .pool
-_08162750:
- ldr r0, =0x0000401e
- bl VarSet
- b _08162788
- .pool
-_0816275C:
- cmp r5, 0x1
- beq _08162770
- cmp r5, 0x1
- ble _08162768
- cmp r5, 0xF
- beq _08162780
-_08162768:
- ldr r0, =0x00004010
- b _08162772
- .pool
-_08162770:
- ldr r0, =0x00004011
-_08162772:
- movs r1, 0x7
- bl VarSet
- b _08162788
- .pool
-_08162780:
- ldr r0, =0x0000401e
- movs r1, 0x7
- bl VarSet
-_08162788:
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8162614
-
- thumb_func_start sub_8162794
-sub_8162794: @ 8162794
- push {lr}
- movs r0, 0xFA
- lsls r0, 1
- movs r1, 0
- bl sub_8162614
- pop {r0}
- bx r0
- thumb_func_end sub_8162794
-
- thumb_func_start sub_81627A4
-sub_81627A4: @ 81627A4
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- adds r5, r4, 0
- bl GetFacilityEnemyMonLevel
- movs r0, 0xFA
- lsls r0, 1
- cmp r4, r0
- bne _081627CC
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000bed
- adds r0, r1
- b _08162836
- .pool
-_081627CC:
- ldr r0, =0x0000012b
- cmp r4, r0
- bhi _081627E8
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r4
- adds r0, r1
- b _08162836
- .pool
-_081627E8:
- ldr r0, =0x0000018f
- cmp r4, r0
- bhi _08162814
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0xfffffed4
- adds r2, r4, r1
- movs r1, 0xEC
- muls r1, r2
- adds r0, r1
- ldr r1, =0x00000739
- adds r0, r1
- b _08162836
- .pool
-_08162814:
- ldr r3, =gApprentices
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r0, =0xfffffe70
- adds r2, r5, r0
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0
- adds r1, 0xDC
- ldrb r0, [r1]
- lsls r0, 27
- lsrs r0, 27
- movs r1, 0x58
- muls r0, r1
- adds r0, r3
- adds r0, 0x32
-_08162836:
- ldrb r2, [r0]
- movs r1, 0
- ldr r3, =gUnknown_085DCEDC
- ldrb r0, [r3]
- cmp r0, r2
- beq _08162850
-_08162842:
- adds r1, 0x1
- cmp r1, 0x1D
- bhi _08162850
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, r2
- bne _08162842
-_08162850:
- cmp r1, 0x1E
- beq _0816286C
- ldr r0, =gUnknown_085DCF0E
- b _08162892
- .pool
-_0816286C:
- movs r1, 0
- ldr r3, =gUnknown_085DCEFA
- ldrb r0, [r3]
- cmp r0, r2
- beq _08162884
-_08162876:
- adds r1, 0x1
- cmp r1, 0x13
- bhi _08162884
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, r2
- bne _08162876
-_08162884:
- cmp r1, 0x14
- bne _08162890
- movs r0, 0x7
- b _08162896
- .pool
-_08162890:
- ldr r0, =gUnknown_085DCF2C
-_08162892:
- adds r0, r1, r0
- ldrb r0, [r0]
-_08162896:
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81627A4
-
- thumb_func_start sub_81628A0
-sub_81628A0: @ 81628A0
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x20
- movs r1, 0
- mov r8, r1
- mov r10, r0
- movs r5, 0
- ldr r2, =gSaveBlock2Ptr
- ldr r0, [r2]
- mov r4, r10
- ldrb r4, [r4, 0xC]
- str r4, [sp, 0x18]
- mov r9, r5
- movs r7, 0x4
- str r7, [sp, 0x1C]
- ldr r1, =0x00000744
- adds r1, r0
- mov r12, r1
-_081628CA:
- movs r6, 0
- movs r3, 0
- mov r2, r12
- ldrb r0, [r2]
- ldr r4, [sp, 0x18]
- cmp r0, r4
- bne _081628FA
- mov r4, r9
- mov r2, r10
- adds r2, 0xC
-_081628DE:
- adds r3, 0x1
- cmp r3, 0x3
- bgt _081628FA
- ldr r7, =gSaveBlock2Ptr
- ldr r0, [r7]
- adds r1, r3, r4
- ldr r7, =0x00000744
- adds r0, r7
- adds r0, r1
- adds r1, r2, r3
- ldrb r0, [r0]
- ldrb r1, [r1]
- cmp r0, r1
- beq _081628DE
-_081628FA:
- cmp r3, 0x4
- bne _08162944
- movs r6, 0
- ldr r1, =gSaveBlock2Ptr
- ldr r0, [r1]
- ldr r3, =0x0000073c
- adds r0, r3
- ldr r2, [sp, 0x1C]
- adds r0, r2
- ldrb r0, [r0]
- mov r4, r10
- ldrb r4, [r4, 0x8]
- cmp r0, r4
- bne _08162944
- adds r1, r0, 0
- mov r2, r9
- adds r2, 0x4
-_0816291C:
- cmp r1, 0xFF
- bne _08162930
- movs r6, 0x7
- b _08162944
- .pool
-_08162930:
- adds r6, 0x1
- cmp r6, 0x6
- bgt _08162944
- ldr r7, =gSaveBlock2Ptr
- ldr r0, [r7]
- adds r0, r3
- adds r0, r2
- ldrb r0, [r0]
- cmp r0, r1
- beq _0816291C
-_08162944:
- cmp r6, 0x7
- beq _0816295A
- movs r0, 0xEC
- add r9, r0
- ldr r1, [sp, 0x1C]
- adds r1, 0xEC
- str r1, [sp, 0x1C]
- add r12, r0
- adds r5, 0x1
- cmp r5, 0x4
- ble _081628CA
-_0816295A:
- cmp r5, 0x4
- bgt _08162974
- ldr r2, =gSaveBlock2Ptr
- ldr r0, [r2]
- movs r1, 0xEC
- muls r1, r5
- adds r0, r1
- movs r4, 0xE7
- lsls r4, 3
- adds r0, r4
- b _081629B2
- .pool
-_08162974:
- movs r5, 0
- ldr r7, =gSaveBlock2Ptr
- ldr r0, [r7]
- ldr r1, =0x0000073a
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, 0
- beq _0816299E
- adds r3, r7, 0
- adds r2, r1, 0
- movs r1, 0
-_0816298A:
- adds r1, 0xEC
- adds r5, 0x1
- cmp r5, 0x4
- bgt _081629C4
- ldr r0, [r3]
- adds r0, r1
- adds r0, r2
- ldrh r0, [r0]
- cmp r0, 0
- bne _0816298A
-_0816299E:
- cmp r5, 0x4
- bgt _081629C4
- ldr r1, =gSaveBlock2Ptr
- ldr r0, [r1]
- movs r1, 0xEC
- muls r1, r5
- adds r0, r1
- movs r2, 0xE7
- lsls r2, 3
- adds r0, r2
-_081629B2:
- mov r1, r10
- movs r2, 0xEC
- bl memcpy
- b _08162A8A
- .pool
-_081629C4:
- mov r2, sp
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r3, =0x0000073a
- adds r0, r3
- ldrh r0, [r0]
- movs r1, 0
- strh r0, [r2]
- add r0, sp, 0xC
- strh r1, [r0]
- movs r7, 0x1
- add r8, r7
- movs r5, 0x1
- add r0, sp, 0xC
- mov r9, r0
- mov r12, r3
-_081629E4:
- movs r3, 0
- adds r7, r5, 0x1
- cmp r3, r8
- bge _08162A2E
- ldr r1, =gSaveBlock2Ptr
- ldr r0, [r1]
- movs r2, 0xEC
- adds r1, r5, 0
- muls r1, r2
- adds r0, r1
- mov r1, r12
- adds r4, r0, r1
- mov r6, sp
-_081629FE:
- lsls r0, r3, 1
- add r0, sp
- ldrh r2, [r4]
- adds r1, r2, 0
- ldrh r0, [r0]
- cmp r1, r0
- bcs _08162A24
- movs r3, 0
- movs r4, 0x1
- mov r8, r4
- strh r2, [r6]
- mov r0, r9
- strh r5, [r0]
- b _08162A2E
- .pool
-_08162A24:
- cmp r1, r0
- bhi _08162A2E
- adds r3, 0x1
- cmp r3, r8
- blt _081629FE
-_08162A2E:
- cmp r3, r8
- bne _08162A54
- mov r1, r8
- lsls r2, r1, 1
- mov r4, sp
- adds r3, r4, r2
- ldr r1, =gSaveBlock2Ptr
- ldr r0, [r1]
- movs r4, 0xEC
- adds r1, r5, 0
- muls r1, r4
- adds r0, r1
- add r0, r12
- ldrh r0, [r0]
- strh r0, [r3]
- add r2, r9
- strh r5, [r2]
- movs r0, 0x1
- add r8, r0
-_08162A54:
- adds r5, r7, 0
- cmp r5, 0x4
- ble _081629E4
- bl Random
- lsls r0, 16
- lsrs r0, 16
- mov r1, r8
- bl __modsi3
- adds r5, r0, 0
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- lsls r1, r5, 1
- add r1, sp
- adds r1, 0xC
- ldrh r2, [r1]
- movs r1, 0xEC
- muls r1, r2
- adds r0, r1
- movs r1, 0xE7
- lsls r1, 3
- adds r0, r1
- mov r1, r10
- movs r2, 0xEC
- bl memcpy
-_08162A8A:
- add sp, 0x20
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81628A0
-
- thumb_func_start GetFrontierTrainerFrontSpriteId
-GetFrontierTrainerFrontSpriteId: @ 8162AA0
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- adds r5, r4, 0
- bl GetFacilityEnemyMonLevel
- movs r0, 0xFA
- lsls r0, 1
- cmp r4, r0
- bne _08162AD0
- ldr r1, =gFacilityClassToPicIndex
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r2, =0x00000bed
- adds r0, r2
- ldrb r0, [r0]
- adds r0, r1
- b _08162BC8
- .pool
-_08162AD0:
- ldr r0, =0x000003fe
- cmp r4, r0
- bne _08162AE4
- bl GetFrontierBrainTrainerPicIndex
- lsls r0, 24
- lsrs r0, 24
- b _08162BCA
- .pool
-_08162AE4:
- ldr r0, =0x0000012b
- cmp r4, r0
- bhi _08162B08
- ldr r2, =gFacilityClassToPicIndex
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r4
- adds r0, r1
- ldrb r0, [r0]
- adds r0, r2
- b _08162BC8
- .pool
-_08162B08:
- ldr r0, =0x0000018f
- cmp r4, r0
- bhi _08162B64
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 17
- ands r0, r1
- cmp r0, 0
- beq _08162B38
- ldr r4, =gFacilityClassToPicIndex
- bl sub_818649C
- lsls r0, 24
- lsrs r0, 24
- adds r0, r4
- b _08162BC8
- .pool
-_08162B38:
- ldr r3, =gFacilityClassToPicIndex
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0xfffffed4
- adds r2, r4, r1
- movs r1, 0xEC
- muls r1, r2
- adds r0, r1
- ldr r2, =0x00000739
- adds r0, r2
- ldrb r0, [r0]
- adds r0, r3
- b _08162BC8
- .pool
-_08162B64:
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 17
- ands r0, r1
- cmp r0, 0
- bne _08162BB0
- ldr r4, =gFacilityClassToPicIndex
- ldr r3, =gApprentices
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r0, =0xfffffe70
- adds r2, r5, r0
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0
- adds r1, 0xDC
- ldrb r0, [r1]
- lsls r0, 27
- lsrs r0, 27
- movs r1, 0x58
- muls r0, r1
- adds r0, r3
- adds r0, 0x32
- ldrb r0, [r0]
- adds r0, r4
- b _08162BC8
- .pool
-_08162BB0:
- ldr r5, =gFacilityClassToPicIndex
- ldr r4, =gApprentices
- bl sub_81864A8
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x58
- muls r0, r1
- adds r0, r4
- adds r0, 0x32
- ldrb r0, [r0]
- adds r0, r5
-_08162BC8:
- ldrb r0, [r0]
-_08162BCA:
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end GetFrontierTrainerFrontSpriteId
-
- thumb_func_start GetFrontierOpponentClass
-GetFrontierOpponentClass: @ 8162BD8
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- adds r5, r4, 0
- bl GetFacilityEnemyMonLevel
- movs r0, 0xFA
- lsls r0, 1
- cmp r4, r0
- bne _08162C08
- ldr r1, =gFacilityClassToTrainerClass
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r2, =0x00000bed
- adds r0, r2
- ldrb r0, [r0]
- b _08162C26
- .pool
-_08162C08:
- ldr r0, =0x000003fe
- cmp r4, r0
- bne _08162C1C
- bl GetFrontierBrainTrainerClass
- lsls r0, 24
- lsrs r0, 24
- b _08162D1E
- .pool
-_08162C1C:
- ldr r0, =0x00000c03
- cmp r4, r0
- bne _08162C38
- ldr r0, =gTrainers
- ldr r1, =0x00007da1
-_08162C26:
- adds r0, r1
- ldrb r0, [r0]
- b _08162D1E
- .pool
-_08162C38:
- ldr r0, =0x0000012b
- cmp r4, r0
- bhi _08162C60
- ldr r2, =gFacilityClassToTrainerClass
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r4
- adds r0, r1
- ldrb r0, [r0]
- adds r0, r2
- ldrb r0, [r0]
- b _08162D1E
- .pool
-_08162C60:
- ldr r0, =0x0000018f
- cmp r4, r0
- bhi _08162CBC
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 17
- ands r0, r1
- cmp r0, 0
- beq _08162C90
- ldr r4, =gFacilityClassToTrainerClass
- bl sub_818649C
- lsls r0, 24
- lsrs r0, 24
- adds r0, r4
- ldrb r0, [r0]
- b _08162D1E
- .pool
-_08162C90:
- ldr r3, =gFacilityClassToTrainerClass
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0xfffffed4
- adds r2, r4, r1
- movs r1, 0xEC
- muls r1, r2
- adds r0, r1
- ldr r2, =0x00000739
- adds r0, r2
- ldrb r0, [r0]
- adds r0, r3
- ldrb r0, [r0]
- b _08162D1E
- .pool
-_08162CBC:
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 17
- ands r0, r1
- cmp r0, 0
- beq _08162CF4
- ldr r5, =gFacilityClassToTrainerClass
- ldr r4, =gApprentices
- bl sub_81864A8
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x58
- muls r0, r1
- adds r0, r4
- adds r0, 0x32
- ldrb r0, [r0]
- adds r0, r5
- ldrb r0, [r0]
- b _08162D1E
- .pool
-_08162CF4:
- ldr r4, =gFacilityClassToTrainerClass
- ldr r3, =gApprentices
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r0, =0xfffffe70
- adds r2, r5, r0
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0
- adds r1, 0xDC
- ldrb r0, [r1]
- lsls r0, 27
- lsrs r0, 27
- movs r1, 0x58
- muls r0, r1
- adds r0, r3
- adds r0, 0x32
- ldrb r0, [r0]
- adds r0, r4
- ldrb r0, [r0]
-_08162D1E:
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end GetFrontierOpponentClass
-
- thumb_func_start sub_8162D34
-sub_8162D34: @ 8162D34
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- adds r5, r4, 0
- bl GetFacilityEnemyMonLevel
- movs r0, 0xFA
- lsls r0, 1
- cmp r4, r0
- bne _08162D5C
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000bed
- adds r0, r1
- b _08162E0A
- .pool
-_08162D5C:
- ldr r0, =0x0000012b
- cmp r4, r0
- bhi _08162D78
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r4
- adds r0, r1
- b _08162E0A
- .pool
-_08162D78:
- ldr r0, =0x0000018f
- cmp r4, r0
- bhi _08162DC0
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 17
- ands r0, r1
- cmp r0, 0
- beq _08162DA0
- bl sub_818649C
- lsls r0, 24
- lsrs r0, 24
- b _08162E0C
- .pool
-_08162DA0:
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0xfffffed4
- adds r2, r4, r1
- movs r1, 0xEC
- muls r1, r2
- adds r0, r1
- ldr r1, =0x00000739
- adds r0, r1
- b _08162E0A
- .pool
-_08162DC0:
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 17
- ands r0, r1
- cmp r0, 0
- beq _08162DE8
- ldr r4, =gApprentices
- bl sub_81864A8
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x58
- muls r0, r1
- adds r0, r4
- b _08162E08
- .pool
-_08162DE8:
- ldr r3, =gApprentices
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r0, =0xfffffe70
- adds r2, r5, r0
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0
- adds r1, 0xDC
- ldrb r0, [r1]
- lsls r0, 27
- lsrs r0, 27
- movs r1, 0x58
- muls r0, r1
- adds r0, r3
-_08162E08:
- adds r0, 0x32
-_08162E0A:
- ldrb r0, [r0]
-_08162E0C:
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_8162D34
-
- thumb_func_start GetFrontierTrainerName
-GetFrontierTrainerName: @ 8162E20
- push {r4-r6,lr}
- adds r6, r0, 0
- lsls r1, 16
- lsrs r5, r1, 16
- movs r4, 0
- bl GetFacilityEnemyMonLevel
- movs r0, 0xFA
- lsls r0, 1
- cmp r5, r0
- bne _08162E54
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- movs r1, 0xBF
- lsls r1, 4
- adds r2, r0, r1
-_08162E40:
- adds r0, r6, r4
- adds r1, r2, r4
- ldrb r1, [r1]
- strb r1, [r0]
- adds r4, 0x1
- cmp r4, 0x6
- ble _08162E40
- b _08162F5C
- .pool
-_08162E54:
- ldr r0, =0x000003fe
- cmp r5, r0
- bne _08162E68
- adds r0, r6, 0
- bl CopyFrontierBrainTrainerName
- b _08162F62
- .pool
-_08162E68:
- ldr r0, =0x00000c03
- cmp r5, r0
- bne _08162E88
- ldr r2, =gTrainers + 804 * 0x28 + 0x4 @ TRAINER_STEVEN name
-_08162E70:
- adds r0, r6, r4
- adds r1, r4, r2
- ldrb r1, [r1]
- strb r1, [r0]
- adds r4, 0x1
- cmp r4, 0x6
- ble _08162E70
- b _08162F5C
- .pool
-_08162E88:
- ldr r0, =0x0000012b
- cmp r5, r0
- bhi _08162EB4
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r5
- adds r0, r1
- adds r2, r0, 0x4
-_08162E9A:
- adds r0, r6, r4
- adds r1, r2, r4
- ldrb r1, [r1]
- strb r1, [r0]
- adds r4, 0x1
- cmp r4, 0x6
- ble _08162E9A
- b _08162F5C
- .pool
-_08162EB4:
- ldr r0, =0x0000018f
- cmp r5, r0
- bhi _08162F00
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 17
- ands r0, r1
- cmp r0, 0
- beq _08162ED8
- adds r0, r6, 0
- bl sub_8186468
- b _08162F62
- .pool
-_08162ED8:
- ldr r2, =gSaveBlock2Ptr
- movs r0, 0xEC
- adds r1, r5, 0
- muls r1, r0
- ldr r0, =0xfffef2a8
- adds r1, r0
- ldr r0, [r2]
- adds r0, r1
- adds r1, r0, 0x4
- adds r0, 0xE4
- ldrb r2, [r0]
- adds r0, r6, 0
- bl TVShowConvertInternationalString
- b _08162F62
- .pool
-_08162F00:
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 17
- ands r0, r1
- cmp r0, 0
- beq _08162F24
- bl sub_81864A8
- lsls r0, 24
- lsrs r5, r0, 24
- bl sub_81864C0
- lsls r0, 24
- lsrs r4, r0, 24
- b _08162F3E
- .pool
-_08162F24:
- ldr r1, =gSaveBlock2Ptr
- lsls r0, r5, 4
- adds r0, r5
- lsls r0, 2
- ldr r2, =0xffff969c
- adds r0, r2
- ldr r1, [r1]
- adds r1, r0
- ldrb r0, [r1]
- lsls r0, 27
- lsrs r5, r0, 27
- adds r1, 0x3F
- ldrb r4, [r1]
-_08162F3E:
- adds r0, r5, 0
- adds r1, r4, 0
- bl GetApprenticeNameInLanguage
- adds r1, r0, 0
- adds r0, r6, 0
- adds r2, r4, 0
- bl TVShowConvertInternationalString
- b _08162F62
- .pool
-_08162F5C:
- adds r1, r6, r4
- movs r0, 0xFF
- strb r0, [r1]
-_08162F62:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end GetFrontierTrainerName
-
- thumb_func_start sub_8162F68
-sub_8162F68: @ 8162F68
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- adds r5, r4, 0
- bl GetFacilityEnemyMonLevel
- movs r0, 0xFA
- lsls r0, 1
- cmp r4, r0
- bne _08162F90
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000bed
- adds r0, r1
- b _0816300E
- .pool
-_08162F90:
- ldr r0, =0x000003fe
- cmp r4, r0
- bne _08162FA4
- bl sub_81A4DB8
- lsls r0, 24
- lsrs r0, 24
- b _08163042
- .pool
-_08162FA4:
- ldr r0, =0x0000012b
- cmp r4, r0
- bhi _08162FC0
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r4
- adds r0, r1
- b _0816300E
- .pool
-_08162FC0:
- ldr r0, =0x0000018f
- cmp r4, r0
- bhi _08162FEC
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0xfffffed4
- adds r2, r4, r1
- movs r1, 0xEC
- muls r1, r2
- adds r0, r1
- ldr r1, =0x00000739
- adds r0, r1
- b _0816300E
- .pool
-_08162FEC:
- ldr r3, =gApprentices
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r0, =0xfffffe70
- adds r2, r5, r0
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0
- adds r1, 0xDC
- ldrb r0, [r1]
- lsls r0, 27
- lsrs r0, 27
- movs r1, 0x58
- muls r0, r1
- adds r0, r3
- adds r0, 0x32
-_0816300E:
- ldrb r2, [r0]
- movs r1, 0
- ldr r3, =gUnknown_085DCEFA
- ldrb r0, [r3]
- cmp r0, r2
- beq _08163028
-_0816301A:
- adds r1, 0x1
- cmp r1, 0x13
- bhi _08163028
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, r2
- bne _0816301A
-_08163028:
- cmp r1, 0x14
- bne _08163040
- movs r0, 0
- b _08163042
- .pool
-_08163040:
- movs r0, 0x1
-_08163042:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_8162F68
-
- thumb_func_start sub_8163048
-sub_8163048: @ 8163048
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- bl ZeroEnemyPartyMons
- ldr r0, =gTrainerBattleOpponent_A
- ldrh r0, [r0]
- movs r1, 0
- adds r2, r4, 0
- bl sub_81630C4
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8163048
-
- thumb_func_start sub_816306C
-sub_816306C: @ 816306C
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- bl ZeroEnemyPartyMons
- ldr r0, =gTrainerBattleOpponent_A
- ldrh r0, [r0]
- movs r1, 0
- adds r2, r4, 0
- bl sub_81630C4
- ldr r0, =gTrainerBattleOpponent_B
- ldrh r0, [r0]
- movs r1, 0x3
- adds r2, r4, 0
- bl sub_81630C4
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_816306C
-
- thumb_func_start sub_81630A0
-sub_81630A0: @ 81630A0
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- bl ZeroEnemyPartyMons
- ldr r0, =gTrainerBattleOpponent_A
- ldrh r0, [r0]
- movs r1, 0
- adds r2, r4, 0
- bl sub_8165EA4
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81630A0
-
- thumb_func_start sub_81630C4
-sub_81630C4: @ 81630C4
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x40
- lsls r0, 16
- lsrs r5, r0, 16
- lsls r1, 24
- lsrs r1, 24
- str r1, [sp, 0x18]
- lsls r2, 24
- lsrs r2, 24
- str r2, [sp, 0x1C]
- add r4, sp, 0x14
- movs r0, 0xFF
- strb r0, [r4]
- bl GetFacilityEnemyMonLevel
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x20]
- ldr r0, =0x0000012b
- cmp r5, r0
- bhi _08163138
- adds r0, r5, 0
- bl sub_8165D08
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x24]
- ldr r0, =gTrainerBattleOpponent_A
- ldrh r2, [r0]
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r2
- adds r0, r1
- ldr r0, [r0, 0x30]
- str r0, [sp, 0x2C]
- movs r0, 0
- str r0, [sp, 0x28]
- ldr r2, [sp, 0x2C]
- ldrh r1, [r2]
- ldr r0, =0x0000ffff
- cmp r1, r0
- bne _08163124
- b _08163278
-_08163124:
- b _08163260
- .pool
-_08163138:
- movs r0, 0xFA
- lsls r0, 1
- cmp r5, r0
- bne _08163180
- ldr r7, [sp, 0x18]
- adds r0, r7, 0x3
- cmp r7, r0
- blt _0816314A
- b _08163426
-_0816314A:
- ldr r4, =gSaveBlock2Ptr
-_0816314C:
- movs r0, 0x64
- muls r0, r7
- ldr r1, =gEnemyParty
- adds r0, r1
- ldr r5, [sp, 0x18]
- subs r2, r7, r5
- movs r1, 0x2C
- muls r2, r1
- movs r6, 0xC2
- lsls r6, 4
- adds r2, r6
- ldr r1, [r4]
- adds r1, r2
- bl sub_806819C
- adds r7, 0x1
- adds r0, r5, 0
- adds r0, 0x3
- cmp r7, r0
- blt _0816314C
- b _08163426
- .pool
-_08163180:
- ldr r0, =0x000003fe
- cmp r5, r0
- bne _08163190
- bl sub_81A4E04
- b _08163426
- .pool
-_08163190:
- ldr r0, =0x0000018f
- cmp r5, r0
- bhi _08163218
- movs r6, 0
- ldr r7, [sp, 0x18]
- ldr r1, [sp, 0x1C]
- adds r0, r7, r1
- cmp r7, r0
- blt _081631A4
- b _08163426
-_081631A4:
- ldr r2, =0xfffffed4
- adds r1, r5, r2
- movs r0, 0xEC
- adds r2, r1, 0
- muls r2, r0
- mov r8, r2
- muls r0, r5
- ldr r5, =0xfffef2a8
- adds r4, r0, r5
-_081631B6:
- ldr r0, =gSaveBlock2Ptr
- ldr r3, [r0]
- movs r0, 0x2C
- adds r2, r6, 0
- muls r2, r0
- mov r1, r8
- adds r0, r2, r1
- adds r1, r3, r0
- ldr r5, =0x0000076c
- adds r0, r1, r5
- ldrh r0, [r0]
- cmp r0, 0
- beq _081631F0
- adds r5, 0xC
- adds r0, r1, r5
- ldrb r0, [r0]
- ldr r1, [sp, 0x20]
- cmp r0, r1
- bhi _081631F0
- movs r0, 0x64
- muls r0, r7
- ldr r1, =gEnemyParty
- adds r0, r1
- adds r1, r3, r4
- adds r2, 0x34
- adds r1, r2
- movs r2, 0
- bl sub_8068338
-_081631F0:
- adds r6, 0x1
- adds r7, 0x1
- ldr r2, [sp, 0x18]
- ldr r5, [sp, 0x1C]
- adds r0, r2, r5
- cmp r7, r0
- blt _081631B6
- b _08163426
- .pool
-_08163218:
- ldr r7, [sp, 0x18]
- adds r0, r7, 0x3
- cmp r7, r0
- blt _08163222
- b _08163426
-_08163222:
- ldr r6, =gSaveBlock2Ptr
- lsls r0, r5, 4
- adds r0, r5
- lsls r0, 2
- ldr r1, =0xffff969c
- adds r5, r0, r1
- movs r4, 0
-_08163230:
- movs r0, 0x64
- muls r0, r7
- ldr r1, =gEnemyParty
- adds r0, r1
- ldr r1, [r6]
- adds r1, r5
- lsrs r2, r4, 24
- bl CreateApprenticeMon
- movs r2, 0x80
- lsls r2, 17
- adds r4, r2
- adds r7, 0x1
- ldr r0, [sp, 0x18]
- adds r0, 0x3
- cmp r7, r0
- blt _08163230
- b _08163426
- .pool
-_08163260:
- ldr r0, [sp, 0x28]
- adds r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x28]
- lsls r0, 1
- ldr r5, [sp, 0x2C]
- adds r0, r5
- ldrh r1, [r0]
- ldr r0, =0x0000ffff
- cmp r1, r0
- bne _08163260
-_08163278:
- movs r7, 0
- bl Random
- adds r4, r0, 0
- bl Random
- lsls r4, 16
- lsrs r4, 16
- lsls r0, 16
- orrs r4, r0
- str r4, [sp, 0x30]
- ldr r6, [sp, 0x1C]
- cmp r7, r6
- bne _08163296
- b _08163426
-_08163296:
- bl Random
- lsls r0, 16
- lsrs r0, 16
- ldr r1, [sp, 0x28]
- bl __modsi3
- lsls r0, 1
- ldr r1, [sp, 0x2C]
- adds r0, r1
- ldrh r4, [r0]
- ldr r2, [sp, 0x20]
- cmp r2, 0x32
- beq _081632B6
- cmp r2, 0x14
- bne _081632BE
-_081632B6:
- ldr r0, =0x00000351
- cmp r4, r0
- bls _081632BE
- b _0816341E
-_081632BE:
- movs r6, 0
- ldr r5, [sp, 0x18]
- adds r5, r7
- mov r8, r5
- b _081632D2
- .pool
-_081632D0:
- adds r6, 0x1
-_081632D2:
- cmp r6, r8
- bge _081632F6
- movs r1, 0x64
- adds r0, r6, 0
- muls r0, r1
- ldr r2, =gEnemyParty
- adds r0, r2
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- ldr r1, =gFacilityTrainerMons
- ldr r2, [r1]
- lsls r1, r4, 4
- adds r1, r2
- ldrh r1, [r1]
- cmp r0, r1
- bne _081632D0
-_081632F6:
- cmp r6, r8
- beq _081632FC
- b _0816341E
-_081632FC:
- movs r6, 0
- cmp r6, r8
- bge _08163346
- ldr r5, =gBattleFrontierHeldItems
- mov r9, r5
- movs r3, 0
-_08163308:
- ldr r0, =gEnemyParty
- adds r5, r3, r0
- adds r0, r5, 0
- movs r1, 0xC
- movs r2, 0
- str r3, [sp, 0x38]
- bl GetMonData
- ldr r3, [sp, 0x38]
- cmp r0, 0
- beq _0816333E
- adds r0, r5, 0
- movs r1, 0xC
- movs r2, 0
- bl GetMonData
- ldr r1, =gFacilityTrainerMons
- ldr r2, [r1]
- lsls r1, r4, 4
- adds r1, r2
- ldrb r1, [r1, 0xA]
- lsls r1, 1
- add r1, r9
- ldr r3, [sp, 0x38]
- ldrh r1, [r1]
- cmp r0, r1
- beq _08163346
-_0816333E:
- adds r3, 0x64
- adds r6, 0x1
- cmp r6, r8
- blt _08163308
-_08163346:
- cmp r6, r8
- bne _0816341E
- movs r6, 0
- cmp r6, r7
- bge _08163368
- add r0, sp, 0xC
- ldrh r0, [r0]
- cmp r0, r4
- beq _08163368
- add r1, sp, 0xC
-_0816335A:
- adds r1, 0x2
- adds r6, 0x1
- cmp r6, r7
- bge _08163368
- ldrh r0, [r1]
- cmp r0, r4
- bne _0816335A
-_08163368:
- cmp r6, r7
- bne _0816341E
- lsls r0, r7, 1
- add r0, sp
- adds r0, 0xC
- strh r4, [r0]
- movs r1, 0x64
- mov r0, r8
- muls r0, r1
- ldr r2, =gEnemyParty
- adds r0, r2
- ldr r5, =gFacilityTrainerMons
- ldr r2, [r5]
- lsls r4, 4
- adds r2, r4, r2
- ldrh r1, [r2]
- ldrb r3, [r2, 0xC]
- ldr r6, [sp, 0x24]
- str r6, [sp]
- ldrb r2, [r2, 0xB]
- str r2, [sp, 0x4]
- ldr r2, [sp, 0x30]
- str r2, [sp, 0x8]
- ldr r2, [sp, 0x20]
- bl CreateMonWithEVSpreadPersonalityOTID
- movs r0, 0xFF
- mov r6, sp
- strb r0, [r6, 0x14]
- movs r6, 0
- adds r0, r7, 0x1
- str r0, [sp, 0x34]
- mov r9, r4
- movs r0, 0x64
- mov r3, r8
- muls r3, r0
- mov r1, r9
- str r1, [sp, 0x3C]
- ldr r2, =gEnemyParty
- mov r10, r2
-_081633B8:
- ldr r0, [r5]
- ldr r7, [sp, 0x3C]
- adds r0, r7, r0
- lsls r4, r6, 1
- adds r0, 0x2
- adds r0, r4
- ldrh r1, [r0]
- lsls r2, r6, 24
- lsrs r2, 24
- mov r7, r10
- adds r0, r3, r7
- str r3, [sp, 0x38]
- bl SetMonMoveSlot
- ldr r0, [r5]
- ldr r1, [sp, 0x3C]
- adds r0, r1, r0
- adds r0, 0x2
- adds r0, r4
- ldrh r0, [r0]
- ldr r3, [sp, 0x38]
- cmp r0, 0xDA
- bne _081633EC
- movs r0, 0
- mov r2, sp
- strb r0, [r2, 0x14]
-_081633EC:
- adds r6, 0x1
- cmp r6, 0x3
- ble _081633B8
- movs r5, 0x64
- mov r4, r8
- muls r4, r5
- ldr r6, =gEnemyParty
- adds r4, r6
- adds r0, r4, 0
- movs r1, 0x20
- add r2, sp, 0x14
- bl SetMonData
- ldr r0, =gFacilityTrainerMons
- ldr r0, [r0]
- add r0, r9
- ldrb r2, [r0, 0xA]
- lsls r2, 1
- ldr r0, =gBattleFrontierHeldItems
- adds r2, r0
- adds r0, r4, 0
- movs r1, 0xC
- bl SetMonData
- ldr r7, [sp, 0x34]
-_0816341E:
- ldr r0, [sp, 0x1C]
- cmp r7, r0
- beq _08163426
- b _08163296
-_08163426:
- add sp, 0x40
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81630C4
-
- thumb_func_start sub_8163444
-sub_8163444: @ 8163444
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x18
- lsls r1, 24
- lsrs r1, 24
- str r1, [sp, 0x8]
- movs r1, 0xFF
- add r0, sp, 0x4
- strb r1, [r0]
- ldr r0, =gSaveBlock2Ptr
- ldr r2, [r0]
- movs r0, 0xDC
- adds r0, r2
- mov r10, r0
- ldrb r0, [r0, 0x1]
- movs r1, 0x9
- str r1, [sp, 0x10]
- cmp r0, 0x4
- bhi _08163474
- movs r0, 0x6
- str r0, [sp, 0x10]
-_08163474:
- ldr r1, =0x00000ca9
- adds r0, r2, r1
- ldrb r1, [r0]
- movs r0, 0x3
- ands r0, r1
- movs r1, 0x32
- str r1, [sp, 0xC]
- cmp r0, 0
- beq _0816348A
- movs r0, 0x64
- str r0, [sp, 0xC]
-_0816348A:
- movs r7, 0
- adds r2, 0xE2
- str r2, [sp, 0x14]
- add r1, sp, 0x4
- mov r9, r1
-_08163494:
- ldr r2, [sp, 0x8]
- adds r6, r2, r7
- movs r0, 0x64
- muls r0, r6
- ldr r1, =gEnemyParty
- adds r0, r1
- lsls r5, r7, 1
- adds r4, r5, r7
- lsls r4, 2
- mov r2, r10
- adds r1, r2, r4
- ldrh r1, [r1, 0x4]
- movs r2, 0x8
- str r2, [sp]
- ldr r2, [sp, 0xC]
- ldr r3, [sp, 0x10]
- bl CreateMonWithEVSpread
- movs r0, 0xFF
- mov r1, r9
- strb r0, [r1]
- adds r2, r7, 0x1
- mov r8, r2
- movs r1, 0x3
-_081634C4:
- ldr r2, [sp, 0x14]
- adds r0, r2, r4
- ldrh r0, [r0]
- cmp r0, 0xDA
- bne _081634D4
- movs r2, 0
- mov r0, r9
- strb r2, [r0]
-_081634D4:
- adds r4, 0x2
- subs r1, 0x1
- cmp r1, 0
- bge _081634C4
- movs r0, 0x64
- adds r4, r6, 0
- muls r4, r0
- ldr r0, =gEnemyParty
- adds r4, r0
- adds r0, r4, 0
- movs r1, 0x20
- add r2, sp, 0x4
- bl SetMonData
- adds r2, r5, r7
- lsls r2, 2
- add r2, r10
- adds r2, 0xE
- adds r0, r4, 0
- movs r1, 0xC
- bl SetMonData
- mov r7, r8
- cmp r7, 0x3
- bne _08163494
- add sp, 0x18
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8163444
-
- thumb_func_start RandomizeFacilityTrainerMonId
-RandomizeFacilityTrainerMonId: @ 8163524
- push {r4-r6,lr}
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- bl GetFacilityEnemyMonLevel
- lsls r0, 24
- lsrs r6, r0, 24
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r4
- adds r0, r1
- ldr r5, [r0, 0x30]
- movs r4, 0
- ldrh r1, [r5]
- b _08163558
- .pool
-_0816354C:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r0, r4, 1
- adds r0, r5
- ldrh r1, [r0]
-_08163558:
- ldr r0, =0x0000ffff
- cmp r1, r0
- bne _0816354C
-_0816355E:
- bl Random
- lsls r0, 16
- lsrs r0, 16
- adds r1, r4, 0
- bl __modsi3
- lsls r0, 1
- adds r0, r5
- ldrh r1, [r0]
- cmp r6, 0x32
- beq _0816357A
- cmp r6, 0x14
- bne _08163580
-_0816357A:
- ldr r0, =0x00000351
- cmp r1, r0
- bhi _0816355E
-_08163580:
- adds r0, r1, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- .pool
- thumb_func_end RandomizeFacilityTrainerMonId
-
- thumb_func_start sub_8163590
-sub_8163590: @ 8163590
- push {lr}
- bl ZeroEnemyPartyMons
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r1, [r0]
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0x2
- beq _081635C0
- ldr r0, =gTrainerBattleOpponent_A
- ldrh r0, [r0]
- movs r1, 0
- bl sub_81635D4
- b _081635CA
- .pool
-_081635C0:
- ldr r0, =gTrainerBattleOpponent_A
- ldrh r0, [r0]
- movs r1, 0
- bl sub_816379C
-_081635CA:
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8163590
-
- thumb_func_start sub_81635D4
-sub_81635D4: @ 81635D4
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x20
- lsls r0, 16
- lsrs r2, r0, 16
- adds r3, r2, 0
- lsls r1, 24
- lsrs r1, 24
- str r1, [sp, 0x10]
- ldr r0, =0x0000012b
- cmp r2, r0
- bhi _0816364A
- ldr r4, =gSaveBlock2Ptr
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 24
- ldr r4, [r4]
- lsrs r0, 22
- movs r2, 0xCE
- lsls r2, 4
- adds r1, r4, r2
- adds r1, r0
- ldrh r0, [r1]
- movs r1, 0x7
- bl __udivsi3
- lsls r0, 24
- lsrs r1, r0, 24
- ldr r3, =0x00000cb2
- adds r4, r3
- ldrh r0, [r4]
- cmp r0, 0x5
- bhi _0816363C
- adds r0, r1, 0
- movs r1, 0
- bl sub_81A6CA8
- lsls r0, 24
- lsrs r0, 24
- b _081636A6
- .pool
-_0816363C:
- adds r0, r1, 0
- movs r1, 0x1
- bl sub_81A6CA8
- lsls r0, 24
- lsrs r0, 24
- b _081636A6
-_0816364A:
- movs r0, 0xFA
- lsls r0, 1
- cmp r2, r0
- bne _08163694
- ldr r7, [sp, 0x10]
- adds r0, r7, 0x3
- cmp r7, r0
- blt _0816365C
- b _08163776
-_0816365C:
- ldr r4, =gSaveBlock2Ptr
-_0816365E:
- movs r0, 0x64
- muls r0, r7
- ldr r1, =gEnemyParty
- adds r0, r1
- ldr r1, [sp, 0x10]
- subs r2, r7, r1
- movs r1, 0x2C
- muls r2, r1
- movs r3, 0xC2
- lsls r3, 4
- adds r2, r3
- ldr r1, [r4]
- adds r1, r2
- bl sub_806819C
- adds r0, r7, 0x1
- lsls r0, 24
- lsrs r7, r0, 24
- ldr r0, [sp, 0x10]
- adds r0, 0x3
- cmp r7, r0
- blt _0816365E
- b _08163776
- .pool
-_08163694:
- ldr r0, =0x000003fe
- cmp r3, r0
- bne _081636A4
- bl sub_81A6CD0
- b _08163776
- .pool
-_081636A4:
- movs r0, 0x1F
-_081636A6:
- str r0, [sp, 0x18]
- bl GetFacilityEnemyMonLevel
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x14]
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldrb r2, [r1, 0xA]
- ldrb r0, [r1, 0xB]
- lsls r0, 8
- orrs r2, r0
- ldrb r0, [r1, 0xC]
- lsls r0, 16
- orrs r2, r0
- ldrb r0, [r1, 0xD]
- lsls r0, 24
- orrs r2, r0
- mov r8, r2
- movs r7, 0
-_081636CE:
- ldr r1, =gUnknown_03006298
- lsls r0, r7, 1
- adds r0, r1
- ldrh r0, [r0]
- mov r9, r0
- ldr r3, [sp, 0x10]
- adds r5, r3, r7
- movs r0, 0x64
- adds r6, r5, 0
- muls r6, r0
- ldr r1, =gEnemyParty
- adds r0, r6, r1
- ldr r3, =gFacilityTrainerMons
- ldr r2, [r3]
- mov r1, r9
- lsls r4, r1, 4
- adds r2, r4, r2
- ldrh r1, [r2]
- ldrb r3, [r2, 0xC]
- mov r10, r3
- ldr r3, [sp, 0x18]
- str r3, [sp]
- ldrb r2, [r2, 0xB]
- str r2, [sp, 0x4]
- mov r2, r8
- str r2, [sp, 0x8]
- ldr r2, [sp, 0x14]
- mov r3, r10
- bl CreateMonWithEVSpreadPersonalityOTID
- movs r1, 0
- add r0, sp, 0xC
- strb r1, [r0]
- movs r3, 0
- adds r7, 0x1
- mov r10, r7
- adds r7, r4, 0
-_08163718:
- ldr r0, =gFacilityTrainerMons
- ldr r1, [r0]
- mov r2, r9
- lsls r0, r2, 4
- adds r0, r1
- lsls r1, r3, 1
- adds r0, 0x2
- adds r0, r1
- ldrh r1, [r0]
- ldr r2, =gEnemyParty
- adds r0, r6, r2
- adds r2, r3, 0
- str r3, [sp, 0x1C]
- bl SetMonMoveAvoidReturn
- ldr r3, [sp, 0x1C]
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x3
- bls _08163718
- movs r3, 0x64
- adds r4, r5, 0
- muls r4, r3
- ldr r0, =gEnemyParty
- adds r4, r0
- adds r0, r4, 0
- movs r1, 0x20
- add r2, sp, 0xC
- bl SetMonData
- ldr r1, =gFacilityTrainerMons
- ldr r0, [r1]
- adds r0, r7, r0
- ldrb r2, [r0, 0xA]
- lsls r2, 1
- ldr r0, =gBattleFrontierHeldItems
- adds r2, r0
- adds r0, r4, 0
- movs r1, 0xC
- bl SetMonData
- mov r2, r10
- lsls r0, r2, 24
- lsrs r7, r0, 24
- cmp r7, 0x2
- bls _081636CE
-_08163776:
- add sp, 0x20
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81635D4
- thumb_func_start sub_816379C
-sub_816379C: @ 816379C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x18
- lsls r1, 24
- lsrs r1, 24
- str r1, [sp, 0x10]
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldrb r0, [r1, 0xA]
- mov r9, r0
- ldrb r0, [r1, 0xB]
- lsls r0, 8
- mov r2, r9
- orrs r2, r0
- ldrb r0, [r1, 0xC]
- lsls r0, 16
- orrs r2, r0
- ldrb r0, [r1, 0xD]
- lsls r0, 24
- orrs r2, r0
- mov r9, r2
- movs r7, 0
- mov r8, r7
-_081637D0:
- ldr r1, =gUnknown_03006298
- mov r2, r8
- lsls r0, r2, 1
- adds r0, r1
- ldrh r4, [r0]
- ldr r5, [sp, 0x10]
- add r5, r8
- movs r7, 0x64
- adds r6, r5, 0
- muls r6, r7
- ldr r1, =gEnemyParty
- adds r0, r6, r1
- ldr r7, =gFacilityTrainerMons
- ldr r2, [r7]
- lsls r4, 4
- adds r2, r4, r2
- ldrh r1, [r2]
- ldrb r3, [r2, 0xC]
- movs r7, 0
- str r7, [sp]
- ldrb r2, [r2, 0xB]
- str r2, [sp, 0x4]
- mov r2, r9
- str r2, [sp, 0x8]
- movs r2, 0x1E
- bl CreateMonWithEVSpreadPersonalityOTID
- movs r1, 0
- add r0, sp, 0xC
- strb r1, [r0]
- mov r10, r5
- mov r0, r8
- adds r0, 0x1
- str r0, [sp, 0x14]
- mov r8, r4
- mov r5, r8
-_08163818:
- ldr r1, =gFacilityTrainerMons
- ldr r0, [r1]
- adds r0, r5, r0
- lsls r4, r7, 1
- adds r0, 0x2
- adds r0, r4
- ldrh r1, [r0]
- ldr r2, =gEnemyParty
- adds r0, r6, r2
- adds r2, r7, 0
- bl SetMonMoveAvoidReturn
- ldr r1, =gFacilityTrainerMons
- ldr r0, [r1]
- adds r0, r5, r0
- adds r0, 0x2
- adds r0, r4
- ldrh r0, [r0]
- cmp r0, 0xDA
- bne _08163846
- movs r1, 0
- add r0, sp, 0xC
- strb r1, [r0]
-_08163846:
- adds r0, r7, 0x1
- lsls r0, 24
- lsrs r7, r0, 24
- cmp r7, 0x3
- bls _08163818
- movs r2, 0x64
- mov r4, r10
- muls r4, r2
- ldr r7, =gEnemyParty
- adds r4, r7
- adds r0, r4, 0
- movs r1, 0x20
- add r2, sp, 0xC
- bl SetMonData
- ldr r1, =gFacilityTrainerMons
- ldr r0, [r1]
- add r0, r8
- ldrb r2, [r0, 0xA]
- lsls r2, 1
- ldr r0, =gBattleFrontierHeldItems
- adds r2, r0
- adds r0, r4, 0
- movs r1, 0xC
- bl SetMonData
- ldr r2, [sp, 0x14]
- lsls r0, r2, 24
- lsrs r0, 24
- mov r8, r0
- cmp r0, 0x2
- bls _081637D0
- add sp, 0x18
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_816379C
- thumb_func_start ConvertBattleFrontierTrainerSpeechToString
-ConvertBattleFrontierTrainerSpeechToString: @ 81638AC
- push {r4,r5,lr}
- adds r5, r0, 0
- ldr r4, =gStringVar4
- adds r0, r4, 0
- adds r1, r5, 0
- movs r2, 0x3
- movs r3, 0x2
- bl ConvertEasyChatWordsToString
- movs r2, 0x1
- negs r2, r2
- movs r0, 0x1
- adds r1, r4, 0
- bl GetStringWidth
- cmp r0, 0xCC
- bls _0816390A
- adds r0, r4, 0
- adds r1, r5, 0
- movs r2, 0x2
- movs r3, 0x3
- bl ConvertEasyChatWordsToString
- ldrb r0, [r4]
- movs r1, 0x1
- cmp r0, 0xFE
- beq _081638EE
- adds r2, r4, 0
-_081638E4:
- adds r0, r1, r2
- ldrb r0, [r0]
- adds r1, 0x1
- cmp r0, 0xFE
- bne _081638E4
-_081638EE:
- ldr r2, =gStringVar4
- adds r0, r1, r2
- ldrb r0, [r0]
- adds r3, r2, 0
- cmp r0, 0xFE
- beq _08163904
-_081638FA:
- adds r1, 0x1
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0xFE
- bne _081638FA
-_08163904:
- adds r1, r3
- movs r0, 0xFA
- strb r0, [r1]
-_0816390A:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end ConvertBattleFrontierTrainerSpeechToString
thumb_func_start sub_8163914
sub_8163914: @ 8163914
@@ -3118,7 +618,7 @@ sub_8163EE4: @ 8163EE4
ldrb r0, [r2, 0x8]
cmp r0, 0
beq _08163F40
- ldr r4, =gUnknown_085DCEFA
+ ldr r4, =gTowerFemaleFacilityClasses
ldrb r0, [r2, 0xA]
ldrb r1, [r2, 0xB]
adds r0, r1
@@ -3130,7 +630,7 @@ sub_8163EE4: @ 8163EE4
b _08163F52
.pool
_08163F40:
- ldr r4, =gUnknown_085DCEDC
+ ldr r4, =gTowerMaleFacilityClasses
ldrb r0, [r2, 0xA]
ldrb r1, [r2, 0xB]
adds r0, r1
@@ -3650,7 +1150,7 @@ _0816438C:
adds r0, r1
ldrh r0, [r0]
mov r8, r0
- bl sub_81627A4
+ bl GetBattleFacilityTrainerGfxId
ldr r4, [sp, 0x40]
strb r0, [r4, 0x19]
movs r7, 0
@@ -3841,7 +1341,7 @@ _081644E0:
adds r4, r5
strh r0, [r4]
ldrh r0, [r4]
- bl sub_81627A4
+ bl GetBattleFacilityTrainerGfxId
ldr r1, [sp, 0x24]
adds r1, 0xA8
strb r0, [r1, 0x1]
@@ -4003,7 +1503,7 @@ _08164660:
adds r4, r5
strh r0, [r4]
ldrh r0, [r4]
- bl sub_81627A4
+ bl GetBattleFacilityTrainerGfxId
ldr r1, [sp, 0x24]
adds r1, 0xC0
strb r0, [r1, 0x1]
@@ -4223,7 +1723,7 @@ _08164884:
cmp r1, 0x31
bhi _0816489A
lsrs r0, r6, 16
- bl sub_8162D34
+ bl GetFrontierTrainerFacilityClass
lsls r0, 24
lsrs r0, 24
ldr r1, [r4]
@@ -4739,10 +2239,10 @@ _08164D14:
strh r0, [r4]
ldrh r0, [r2]
movs r1, 0
- bl sub_8162614
+ bl SetBattleFacilityTrainerGfxId
ldrh r0, [r4]
movs r1, 0x1
- bl sub_8162614
+ bl SetBattleFacilityTrainerGfxId
ldr r0, =gReceivedRemoteLinkPlayers
ldrb r0, [r0]
cmp r0, 0
@@ -4805,7 +2305,7 @@ sub_8164DE4: @ 8164DE4
adds r0, r1
ldrh r0, [r0]
movs r1, 0xF
- bl sub_8162614
+ bl SetBattleFacilityTrainerGfxId
pop {r0}
bx r0
.pool
@@ -5234,7 +2734,7 @@ sub_816515C: @ 816515C
adds r5, r1, 0
cmp r0, 0
beq _08165194
- ldr r4, =gUnknown_085DCEFA
+ ldr r4, =gTowerFemaleFacilityClasses
ldrb r0, [r2, 0xA]
ldrb r1, [r2, 0xB]
adds r0, r1
@@ -5246,7 +2746,7 @@ sub_816515C: @ 816515C
b _081651A6
.pool
_08165194:
- ldr r4, =gUnknown_085DCEDC
+ ldr r4, =gTowerMaleFacilityClasses
ldrb r0, [r2, 0xA]
ldrb r1, [r2, 0xB]
adds r0, r1
@@ -5716,7 +3216,7 @@ _0816556C:
lsrs r0, 24
str r0, [sp, 0x50]
adds r0, r7, 0
- bl sub_8165D08
+ bl GetFrontierTrainerFixedIvs
lsls r0, 24
lsrs r0, 24
str r0, [sp, 0x4C]
@@ -5866,7 +3366,7 @@ _0816567E:
add r2, sp, 0x10
bl SetMonData
adds r0, r7, 0
- bl sub_8162F68
+ bl IsFrontierTrainerFemale
lsls r0, 24
lsrs r0, 24
str r0, [sp, 0x44]
@@ -5981,7 +3481,7 @@ _0816579C:
adds r0, r7, r2
lsls r0, 16
lsrs r0, 16
- bl sub_8162F68
+ bl IsFrontierTrainerFemale
lsls r0, 24
lsrs r0, 24
str r0, [sp, 0x44]
@@ -6037,7 +3537,7 @@ _08165812:
adds r0, r7, r3
lsls r0, 16
lsrs r0, 16
- bl sub_8162F68
+ bl IsFrontierTrainerFemale
lsls r0, 24
lsrs r0, 24
str r0, [sp, 0x44]
@@ -6666,8 +4166,8 @@ _08165CF4:
.pool
thumb_func_end sub_8165CB4
- thumb_func_start sub_8165D08
-sub_8165D08: @ 8165D08
+ thumb_func_start GetFrontierTrainerFixedIvs
+GetFrontierTrainerFixedIvs: @ 8165D08
push {lr}
lsls r0, 16
lsrs r0, 16
@@ -6697,7 +4197,7 @@ _08165D3A:
adds r0, r1, 0
pop {r1}
bx r1
- thumb_func_end sub_8165D08
+ thumb_func_end GetFrontierTrainerFixedIvs
thumb_func_start sub_8165D40
sub_8165D40: @ 8165D40
@@ -6831,7 +4331,7 @@ _08165E58:
strh r4, [r5]
ldrh r0, [r5]
movs r1, 0
- bl sub_8162614
+ bl SetBattleFacilityTrainerGfxId
ldr r0, =gSaveBlock2Ptr
ldr r1, [r0]
ldr r2, =0x00000cb2
@@ -7121,7 +4621,7 @@ sub_81660B8: @ 81660B8
lsls r0, 24
lsrs r2, r0, 24
movs r1, 0
- ldr r3, =gUnknown_085DCEDC
+ ldr r3, =gTowerMaleFacilityClasses
ldrb r0, [r3]
cmp r0, r2
beq _081660DA
@@ -7138,12 +4638,12 @@ _081660C8:
_081660DA:
cmp r1, 0x1E
beq _081660EC
- ldr r0, =gUnknown_085DCF0E
+ ldr r0, =gTowerMaleTrainerGfxIds
b _08166116
.pool
_081660EC:
movs r1, 0
- ldr r3, =gUnknown_085DCEFA
+ ldr r3, =gTowerFemaleFacilityClasses
ldrb r0, [r3]
cmp r0, r2
beq _08166108
@@ -7164,7 +4664,7 @@ _08166108:
b _0816611A
.pool
_08166114:
- ldr r0, =gUnknown_085DCF2C
+ ldr r0, =gTowerFemaleTrainerGfxIds
_08166116:
adds r0, r1, r0
ldrb r0, [r0]
diff --git a/data/battle_tower.s b/data/battle_tower.s
index 2cc0aa639..ec5ee924e 100644
--- a/data/battle_tower.s
+++ b/data/battle_tower.s
@@ -21,16 +21,16 @@
@ 85D97BC
.include "data/battle_frontier/battle_frontier_mons.inc"
-gUnknown_085DCEDC:: @ 85DCEDC
+gTowerMaleFacilityClasses:: @ 85DCEDC
.byte 0x0e, 0x11, 0x03, 0x15, 0x17, 0x07, 0x0a, 0x19, 0x1a, 0x1b, 0x1d, 0x1e, 0x20, 0x26, 0x29, 0x09, 0x2b, 0x2d, 0x2e, 0x30, 0x32, 0x34, 0x04, 0x35, 0x3a, 0x05, 0x42, 0x44, 0x43, 0x00
-gUnknown_085DCEFA:: @ 85DCEFA
+gTowerFemaleFacilityClasses:: @ 85DCEFA
.byte 0x0d, 0x10, 0x12, 0x0c, 0x13, 0x14, 0x1f, 0x27, 0x2a, 0x16, 0x2f, 0x31, 0x33, 0x36, 0x37, 0x38, 0x1c, 0x02, 0x45, 0x47
-gUnknown_085DCF0E:: @ 85DCF0E
+gTowerMaleTrainerGfxIds:: @ 85DCF0E
.byte 0x37, 0x36, 0x21, 0x0f, 0x27, 0x33, 0x2c, 0x42, 0x42, 0x1f, 0x27, 0x25, 0x30, 0x26, 0x19, 0x15, 0x23, 0x32, 0x38, 0x33, 0x33, 0x21, 0x42, 0x05, 0x31, 0x27, 0x41, 0x1f, 0x24, 0x37
-gUnknown_085DCF2C:: @ 85DCF2C
+gTowerFemaleTrainerGfxIds:: @ 85DCF2C
.byte 0x14, 0x35, 0x22, 0x28, 0x14, 0x2d, 0x2f, 0x0e, 0x12, 0x16, 0x39, 0x34, 0x34, 0x0e, 0x22, 0x34, 0x20, 0x14, 0x20, 0x2f
gUnknown_085DCF40:: @ 85DCF40
@@ -683,7 +683,7 @@ gUnknown_085DF96C:: @ 85DF96C
.4byte sub_8161F94
.4byte sub_8162054
.4byte sub_81620F4
- .4byte sub_81623F0
+ .4byte ChooseNextBattleTowerTrainer
.4byte sub_81621C0
.4byte sub_816502C
.4byte sub_8164040
diff --git a/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc b/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc
index b29ef99a5..6eea58f9f 100644
--- a/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc
+++ b/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc
@@ -4,7 +4,7 @@ SootopolisCity_MysteryEventsHouse_B1F_MapScripts:: @ 8227E4F
.byte 0
SootopolisCity_MysteryEventsHouse_B1F_MapScript1_227E5A: @ 8227E5A
- special sub_8162794
+ special SetEReaderTrainerGfxId
end
SootopolisCity_MysteryEventsHouse_B1F_MapScript2_227E5E: @ 8227E5E
diff --git a/data/specials.inc b/data/specials.inc
index cec36932a..3c5318309 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -332,7 +332,7 @@ gSpecials:: @ 81DBA64
def_special sp13F_fall_to_last_warp
def_special sub_80F8D28
def_special sub_80F8EB8
- def_special sub_8162794
+ def_special SetEReaderTrainerGfxId
def_special BattleSetup_StartLatiBattle
def_special SetRoute119Weather
def_special SetRoute123Weather
diff --git a/include/battle_frontier_2.h b/include/battle_frontier_2.h
index 573053f10..3bd605829 100644
--- a/include/battle_frontier_2.h
+++ b/include/battle_frontier_2.h
@@ -14,5 +14,6 @@ bool8 InBattlePike(void);
void sub_81AA078(u16*, u8);
void sub_81A4C30(void);
bool8 sub_81A6BF4(void);
+u8 sub_81A6CA8(u8, u8);
#endif // GUARD_BATTLE_FRONTIER_2_H
diff --git a/include/battle_tower.h b/include/battle_tower.h
index 6af87210b..f79fbb8c4 100644
--- a/include/battle_tower.h
+++ b/include/battle_tower.h
@@ -1,9 +1,9 @@
#ifndef GUARD_BATTLE_TOWER_H
#define GUARD_BATTLE_TOWER_H
-#define BATTLE_TOWER_EREADER_TRAINER_ID 200
#define BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID 300
#define BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID 400
+#define BATTLE_TOWER_EREADER_TRAINER_ID 500
struct RSBattleTowerRecord
{
@@ -12,9 +12,7 @@ struct RSBattleTowerRecord
/*0x02*/ u16 winStreak;
/*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1];
/*0x0C*/ u8 trainerId[4];
- /*0x10*/ struct {
- u16 easyChat[6];
- } greeting;
+ /*0x10*/ u16 greeting[6];
/*0x1C*/ struct UnknownPokemonStruct party[3];
/*0xA0*/ u32 checksum;
/*0xA4*/ u16 unk_11c8;
@@ -26,16 +24,15 @@ union BattleTowerRecord
struct EmeraldBattleTowerRecord emerald;
};
-#define FRONTIER_TRAINER_NAME_LENGTH 7
-
struct BattleFrontierTrainer
{
- u32 facilityClass;
- u8 trainerName[FRONTIER_TRAINER_NAME_LENGTH + 1];
+ u8 facilityClass;
+ u8 filler1[3];
+ u8 trainerName[PLAYER_NAME_LENGTH + 1];
u16 speechBefore[6];
u16 speechWin[6];
u16 speechLose[6];
- const u16 *btMonPool;
+ const u16 *bfMonPool;
};
struct FacilityMon
@@ -47,6 +44,11 @@ struct FacilityMon
u8 nature;
};
+extern const u8 gTowerMaleFacilityClasses[30];
+extern const u8 gTowerMaleTrainerGfxIds[30];
+extern const u8 gTowerFemaleFacilityClasses[20];
+extern const u8 gTowerFemaleTrainerGfxIds[20];
+
extern const struct BattleFrontierTrainer *gFacilityTrainers;
extern const struct FacilityMon *gFacilityTrainerMons;
@@ -54,8 +56,8 @@ u16 GetCurrentBattleTowerWinStreak(u8, u8);
void sub_81659DC(struct RSBattleTowerRecord *a0, struct RSBattleTowerRecord *a1);
bool32 sub_816587C(union BattleTowerRecord *, union BattleTowerRecord *);
void CalcEmeraldBattleTowerChecksum(struct EmeraldBattleTowerRecord *);
-void sub_81628A0(union BattleTowerRecord *);
-void sub_8162614(u16 trainerId, u8);
+void PutNewBattleTowerRecord(union BattleTowerRecord *);
+void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId);
void ConvertBattleFrontierTrainerSpeechToString(const u16 *words);
void GetFrontierTrainerName(u8 *dest, u16 trainerIdx);
void GetEreaderTrainerName(u8 *dest);
diff --git a/include/global.h b/include/global.h
index 35e34e722..ef5a944d0 100644
--- a/include/global.h
+++ b/include/global.h
@@ -326,19 +326,31 @@ struct UnknownPokemonStruct
struct EmeraldBattleTowerRecord
{
/*0x00*/ u8 lvlMode; // 0 = level 50, 1 = level 100
- /*0x01*/ u8 trainerClass;
+ /*0x01*/ u8 facilityClass;
/*0x02*/ u16 winStreak;
/*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1];
/*0x0C*/ u8 trainerId[4];
- /*0x10*/ struct {
- u16 easyChat[6];
- } greeting;
+ /*0x10*/ u16 greeting[6];
/*0x1C*/ u8 filler_1c[0x18];
/*0x34*/ struct UnknownPokemonStruct party[4];
/*0xE4*/ u8 language;
/*0xE8*/ u32 checksum;
};
+struct BattleTowerEReaderTrainer
+{
+ /*0x00*/ u8 unk0;
+ /*0x01*/ u8 facilityClass;
+ /*0x02*/ u16 winStreak;
+ /*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1];
+ /*0x0C*/ u8 trainerId[4];
+ /*0x10*/ u16 greeting[6];
+ /*0x1C*/ u16 farewellPlayerLost[6];
+ /*0x28*/ u16 farewellPlayerWon[6];
+ /*0x34*/ struct UnknownPokemonStruct party[3];
+ /*0xB8*/ u32 checksum;
+};
+
struct FrontierMonData
{
u16 moves[4];
@@ -367,17 +379,13 @@ struct BattleDomeTrainer
struct BattleFrontier
{
/*0x64C*/ struct EmeraldBattleTowerRecord battleTower;
- /*0x738*/ struct EmeraldBattleTowerRecord records[5]; // No idea here, it's probably wrong, no clue.
+ /*0x738*/ struct EmeraldBattleTowerRecord records[5]; // From record mixing.
/*0xBD4*/ u16 field_BD4;
/*0xBD6*/ u16 field_BD6;
/*0xBD8*/ u8 field_BD8[11];
/*0xBE3*/ u8 field_BE3[8];
/*0xBEB*/ u8 field_BEB;
- /*0xBEC*/ u8 filler_BEC[16];
- /*0xBFC*/ u16 ecwords_BFC[6];
- /*0xC08*/ u16 ecwords_C08[6];
- /*0xC14*/ u16 ecwords_C14[6];
- /*0xC20*/ u8 filler_C20[0x88];
+ /*0xBEC*/ struct BattleTowerEReaderTrainer ereaderTrainer;
/*0xCA8*/ u8 field_CA8;
/*0xCA9*/ u8 lvlMode:2; // 0x1, 0x2 -> 0x3
/*0xCA9*/ u8 field_CA9_a:1; // 0x4
@@ -388,8 +396,8 @@ struct BattleFrontier
/*0xCA9*/ u8 field_CA9_f:1; // 0x80
/*0xCAA*/ u16 field_CAA[3];
/*0xCB0*/ u16 field_CB0;
- /*0xCB2*/ u16 field_CB2;
- /*0xCB4*/ u16 field_CB4[20];
+ /*0xCB2*/ u16 curChallengeBattleNum; // In case of battle pyramid, the floor.
+ /*0xCB4*/ u16 battledTrainerIds[20];
/*0xCDC*/ u32 field_CDC;
/*0xCE0*/ u16 field_CE0[4][2];
/*0xCF0*/ u16 field_CF0[2];
diff --git a/src/apprentice.c b/src/apprentice.c
index f2a8aa9c0..2a79652ff 100644
--- a/src/apprentice.c
+++ b/src/apprentice.c
@@ -346,11 +346,6 @@ extern void (*gUnknown_030062F4)(void);
extern void sub_8165AE8(struct Apprentice *);
-extern const u8 gUnknown_085DCEDC[];
-extern const u8 gUnknown_085DCF0E[];
-extern const u8 gUnknown_085DCEFA[];
-extern const u8 gUnknown_085DCF2C[];
-
// This file's functions.
static u16 sub_819FF98(u8 arg0);
static bool8 sub_81A0194(u8 arg0, u16 moveId);
@@ -382,7 +377,7 @@ static void sub_81A1218(void);
static void sub_81A1224(void);
static void sub_81A1438(void);
static void sub_81A150C(void);
-static void sub_81A15A4(void);
+static void Script_SetPlayerApprenticeTrainerGfxId(void);
static void sub_81A1644(void);
static void sub_81A1370(void);
@@ -1030,7 +1025,7 @@ static void (* const sApprenticeFunctions[])(void) =
sub_81A1224,
sub_81A1438,
sub_81A150C,
- sub_81A15A4,
+ Script_SetPlayerApprenticeTrainerGfxId,
sub_81A1644,
sub_81A1370,
};
@@ -2270,51 +2265,46 @@ static void sub_81A150C(void)
u8 mapObjectGfxId;
u8 class = gApprentices[gSaveBlock2Ptr->apprentices[0].id].facilityClass;
- for (i = 0; i < 30 && gUnknown_085DCEDC[i] != class; i++)
+ // Search male classes.
+ for (i = 0; i < ARRAY_COUNT(gTowerMaleFacilityClasses) && gTowerMaleFacilityClasses[i] != class; i++)
;
-
- if (i != 30)
+ if (i != ARRAY_COUNT(gTowerMaleFacilityClasses))
{
- mapObjectGfxId = gUnknown_085DCF0E[i];
+ mapObjectGfxId = gTowerMaleTrainerGfxIds[i];
VarSet(VAR_OBJ_GFX_ID_0, mapObjectGfxId);
+ return;
}
- else
- {
- for (i = 0; i < 20 && gUnknown_085DCEFA[i] != class; i++)
- ;
- if (i != 20)
- {
- mapObjectGfxId = gUnknown_085DCF2C[i];
- VarSet(VAR_OBJ_GFX_ID_0, mapObjectGfxId);
- }
+ for (i = 0; i < ARRAY_COUNT(gTowerFemaleFacilityClasses) && gTowerFemaleFacilityClasses[i] != class; i++)
+ ;
+ if (i != ARRAY_COUNT(gTowerFemaleFacilityClasses))
+ {
+ mapObjectGfxId = gTowerFemaleTrainerGfxIds[i];
+ VarSet(VAR_OBJ_GFX_ID_0, mapObjectGfxId);
}
}
-static void sub_81A15A4(void)
+static void Script_SetPlayerApprenticeTrainerGfxId(void)
{
u8 i;
u8 mapObjectGfxId;
u8 class = gApprentices[PLAYER_APPRENTICE.id].facilityClass;
- for (i = 0; i < 30 && gUnknown_085DCEDC[i] != class; i++)
+ for (i = 0; i < ARRAY_COUNT(gTowerMaleFacilityClasses) && gTowerMaleFacilityClasses[i] != class; i++)
;
-
- if (i != 30)
+ if (i != ARRAY_COUNT(gTowerMaleFacilityClasses))
{
- mapObjectGfxId = gUnknown_085DCF0E[i];
+ mapObjectGfxId = gTowerMaleTrainerGfxIds[i];
VarSet(VAR_OBJ_GFX_ID_0, mapObjectGfxId);
+ return;
}
- else
- {
- for (i = 0; i < 20 && gUnknown_085DCEFA[i] != class; i++)
- ;
- if (i != 20)
- {
- mapObjectGfxId = gUnknown_085DCF2C[i];
- VarSet(VAR_OBJ_GFX_ID_0, mapObjectGfxId);
- }
+ for (i = 0; i < ARRAY_COUNT(gTowerFemaleFacilityClasses) && gTowerFemaleFacilityClasses[i] != class; i++)
+ ;
+ if (i != ARRAY_COUNT(gTowerFemaleFacilityClasses))
+ {
+ mapObjectGfxId = gTowerFemaleTrainerGfxIds[i];
+ VarSet(VAR_OBJ_GFX_ID_0, mapObjectGfxId);
}
}
diff --git a/src/battle_dome.c b/src/battle_dome.c
index 8de1c058c..6401530d7 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -62,7 +62,7 @@ extern u8 GetFacilityEnemyMonLevel(void);
extern u16 sub_81A5060(u8 monId, u8 moveSlotId);
extern u8 sub_81A50F0(u8, u8);
extern u8 sub_81A50B0(u8);
-extern void sub_8162614(u16, u8);
+extern void SetBattleFacilityTrainerGfxId(u16, u8);
extern void sub_81A4C30(void);
extern bool8 sub_81A3610(void);
extern u16 sub_81A4FF0(u8);
@@ -2424,7 +2424,7 @@ static void sub_818E9CC(void)
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
gSaveBlock2Ptr->frontier.field_CA8 = 0;
- gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = 0;
gSaveBlock2Ptr->frontier.field_CA9_b = 0;
if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860D0EC[battleMode][lvlMode]))
@@ -2824,12 +2824,12 @@ static void SwapDomeTrainers(s32 id1, s32 id2, u16 *statsArray)
static void sub_818F9B0(void)
{
- StringCopy(gStringVar1, gRoundsStringTable[gSaveBlock2Ptr->frontier.field_CB2]);
+ StringCopy(gStringVar1, gRoundsStringTable[gSaveBlock2Ptr->frontier.curChallengeBattleNum]);
}
static void sub_818F9E0(void)
{
- StringCopy(gStringVar1, gRoundsStringTable[gSaveBlock2Ptr->frontier.field_CB2]);
+ StringCopy(gStringVar1, gRoundsStringTable[gSaveBlock2Ptr->frontier.curChallengeBattleNum]);
CopyDomeTrainerName(gStringVar2, gTrainerBattleOpponent_A);
}
@@ -3480,12 +3480,12 @@ static void sub_8190298(void)
static u16 TrainerIdOfPlayerOpponent(void)
{
- return gSaveBlock2Ptr->frontier.domeTrainers[TournamentIdOfOpponent(gSaveBlock2Ptr->frontier.field_CB2, TRAINER_PLAYER)].trainerId;
+ return gSaveBlock2Ptr->frontier.domeTrainers[TournamentIdOfOpponent(gSaveBlock2Ptr->frontier.curChallengeBattleNum, TRAINER_PLAYER)].trainerId;
}
static void sub_81902E4(void)
{
- sub_8162614(gTrainerBattleOpponent_A, 0);
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
}
static void sub_81902F8(void)
@@ -3819,7 +3819,7 @@ static void sub_8190B40(struct Sprite *sprite)
s32 taskId1 = sprite->data[0];
s32 arrId = gTasks[gTasks[taskId1].data[4]].data[1];
s32 tournmanetTrainerId = gUnknown_0860D080[arrId];
- s32 r12 = gSaveBlock2Ptr->frontier.field_CB2;
+ s32 roundId = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
if (gTasks[taskId1].data[3] == 1)
{
@@ -3831,7 +3831,7 @@ static void sub_8190B40(struct Sprite *sprite)
sprite->invisible = FALSE;
}
else if (!gSaveBlock2Ptr->frontier.domeTrainers[tournmanetTrainerId].isEliminated
- && sBattleDomeStruct->unk_10 - 1 < r12)
+ && sBattleDomeStruct->unk_10 - 1 < roundId)
{
sprite->invisible = FALSE;
}
@@ -4635,7 +4635,7 @@ static u8 sub_819221C(u8 taskId)
s32 taskId2 = gTasks[taskId].data[4];
s32 r5 = gTasks[taskId2].data[1];
u8 r10 = gUnknown_0860D080[r5];
- u16 roundId = gSaveBlock2Ptr->frontier.field_CB2;
+ u16 roundId = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
retVal = 9;
@@ -5387,7 +5387,7 @@ static void sub_81938E0(void)
sub_8194D48();
gSaveBlock2Ptr->frontier.lvlMode = gSaveBlock2Ptr->frontier.field_D0A - 1;
- gSaveBlock2Ptr->frontier.field_CB2 = 3;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 3;
taskId = CreateTask(sub_8194220, 0);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
@@ -5489,7 +5489,7 @@ static u8 sub_8193BDC(u8 taskId)
u8 retVal = 1;
s32 arrId = 4;
s32 spriteId = gTasks[taskId].data[1];
- s32 roundId = gSaveBlock2Ptr->frontier.field_CB2;
+ s32 roundId = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
if (gMain.newKeys == B_BUTTON || (gMain.newKeys & A_BUTTON && spriteId == 31))
{
@@ -5550,19 +5550,19 @@ static void sub_8193D7C(void)
if (gSpecialVar_0x8005 == 1)
{
gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].isEliminated = 1;
- gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].eliminatedAt = gSaveBlock2Ptr->frontier.field_CB2;
+ gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].eliminatedAt = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
gSaveBlock2Ptr->frontier.field_EC0[TrainerIdToTournamentId(gTrainerBattleOpponent_A)] = gBattleResults.lastUsedMovePlayer;
- if (gSaveBlock2Ptr->frontier.field_CB2 < DOME_FINAL)
- DecideRoundWinners(gSaveBlock2Ptr->frontier.field_CB2);
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < DOME_FINAL)
+ DecideRoundWinners(gSaveBlock2Ptr->frontier.curChallengeBattleNum);
}
else
{
gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].isEliminated = 1;
- gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].eliminatedAt = gSaveBlock2Ptr->frontier.field_CB2;
+ gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].eliminatedAt = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
gSaveBlock2Ptr->frontier.field_EC0[TrainerIdToTournamentId(TRAINER_PLAYER)] = gBattleResults.lastUsedMoveOpponent;
if (gBattleOutcome == B_OUTCOME_FORFEITED || gSpecialVar_0x8005 == 9)
gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].unk3 = 1;
- for (i = gSaveBlock2Ptr->frontier.field_CB2; i < DOME_ROUNDS_COUNT; i++)
+ for (i = gSaveBlock2Ptr->frontier.curChallengeBattleNum; i < DOME_ROUNDS_COUNT; i++)
DecideRoundWinners(i);
}
}
@@ -5775,7 +5775,7 @@ static void sub_8194220(u8 taskId)
AddTextPrinter(&textPrinter, 0, NULL);
for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
{
- s32 var, var2;
+ s32 roundId, var2;
CopyDomeTrainerName(gDisplayedStringBattle, gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId);
if (r10 == 1)
@@ -5788,9 +5788,9 @@ static void sub_8194220(u8 taskId)
sub_81948EC(i, var2);
}
}
- else if (gSaveBlock2Ptr->frontier.field_CB2 != DOME_ROUND2)
+ else if (gSaveBlock2Ptr->frontier.curChallengeBattleNum != DOME_ROUND2)
{
- sub_81948EC(i, gSaveBlock2Ptr->frontier.field_CB2 - 2);
+ sub_81948EC(i, gSaveBlock2Ptr->frontier.curChallengeBattleNum - 2);
}
}
else if (r10 == 0)
@@ -5803,23 +5803,23 @@ static void sub_8194220(u8 taskId)
sub_81948EC(i, var2);
}
}
- else if (gSaveBlock2Ptr->frontier.field_CB2 != DOME_ROUND1)
+ else if (gSaveBlock2Ptr->frontier.curChallengeBattleNum != DOME_ROUND1)
{
if (gTasks[taskId].data[4])
- var2 = gSaveBlock2Ptr->frontier.field_CB2;
+ var2 = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
else
- var2 = gSaveBlock2Ptr->frontier.field_CB2 - 1;
+ var2 = gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1;
sub_81948EC(i, var2);
}
}
if (gTasks[taskId].data[4])
- var = gSaveBlock2Ptr->frontier.field_CB2;
+ roundId = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
else
- var = gSaveBlock2Ptr->frontier.field_CB2 - 1;
+ roundId = gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1;
- if ( ((r10 == 1 && gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt < gSaveBlock2Ptr->frontier.field_CB2 - 1)
- || (r10 == 0 && gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt <= var))
+ if ( ((r10 == 1 && gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt < gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1)
+ || (r10 == 0 && gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt <= roundId))
&& gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
{
if (gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId == TRAINER_PLAYER)
@@ -5944,7 +5944,7 @@ static void sub_8194950(u8 taskId)
for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
{
CopyDomeTrainerName(gDisplayedStringBattle, gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId);
- if (gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt == gSaveBlock2Ptr->frontier.field_CB2 - 1
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt == gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1
&& gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
{
if (gUnknown_0860D3F1[i][0] == 0)
@@ -5959,8 +5959,8 @@ static void sub_8194950(u8 taskId)
}
if (!gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
{
- s32 var = gSaveBlock2Ptr->frontier.field_CB2 - 1;
- sub_81948EC(i, var);
+ s32 roundId = gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1;
+ sub_81948EC(i, roundId);
}
}
}
@@ -6454,7 +6454,7 @@ static void CopyDomeTrainerName(u8 *dst, u16 trainerId)
}
else if (trainerId < 300)
{
- for (i = 0; i < FRONTIER_TRAINER_NAME_LENGTH; i++)
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
dst[i] = gFacilityTrainers[trainerId].trainerName[i];
}
dst[i] = EOS;
@@ -6475,7 +6475,7 @@ static void CopyDomeBrainTrainerName(u8 *dst)
{
s32 i;
- for (i = 0; i < FRONTIER_TRAINER_NAME_LENGTH; i++)
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
dst[i] = gTrainers[TRAINER_TUCKER].trainerName[i];
dst[i] = EOS;
}
diff --git a/src/battle_frontier_1.c b/src/battle_frontier_1.c
index ee8a42954..7c93f4cdc 100644
--- a/src/battle_frontier_1.c
+++ b/src/battle_frontier_1.c
@@ -5,7 +5,7 @@
#include "random.h"
#include "battle_tower.h"
-extern void sub_8162614(u16, u8);
+extern void SetBattleFacilityTrainerGfxId(u16, u8);
extern void (* const gUnknown_0860DE50[])(void);
extern const u32 gUnknown_0860DE98[][2];
@@ -23,7 +23,7 @@ void sub_8195980(void)
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
gSaveBlock2Ptr->frontier.field_CA8 = 0;
- gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = 0;
gSaveBlock2Ptr->frontier.field_CA9_b = 0;
if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode]))
@@ -90,7 +90,7 @@ void sub_8195BB0(void)
void sub_8195C20(void)
{
gTrainerBattleOpponent_A = 5 *(Random() % 255) / 64u;
- sub_8162614(gTrainerBattleOpponent_A, 0);
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
}
void sub_8195C50(void)
diff --git a/src/battle_setup.c b/src/battle_setup.c
index db173a38e..b5ae0d6ea 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -885,8 +885,8 @@ u8 sub_80B100C(s32 arg0)
return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)];
}
- var = gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.field_CB2 * 2 + 0]
- + gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.field_CB2 * 2 + 1];
+ var = gSaveBlock2Ptr->frontier.battledTrainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 0]
+ + gSaveBlock2Ptr->frontier.battledTrainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 1];
return sUnknown_0854FE98[var % ARRAY_COUNT(sUnknown_0854FE98)];
}
diff --git a/src/battle_tent.c b/src/battle_tent.c
index e30cac386..4edb0b619 100644
--- a/src/battle_tent.c
+++ b/src/battle_tent.c
@@ -102,7 +102,7 @@ void sub_81B99B4(void)
static void sub_81B99D4(void)
{
gSaveBlock2Ptr->frontier.field_CA8 = 0;
- gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
@@ -120,7 +120,7 @@ static void sub_81B9A44(void)
static void sub_81B9A60(void)
{
gTrainerBattleOpponent_A = (u32)((Random() % 255) * 5) / 64;
- sub_8162614(gTrainerBattleOpponent_A, 0);
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
}
static void sub_81B9A90(void)
@@ -164,7 +164,7 @@ void sub_81B9B80(void)
static void sub_81B9BA0(void)
{
gSaveBlock2Ptr->frontier.field_CA8 = 0;
- gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
@@ -219,7 +219,7 @@ void sub_81B9D08(void)
static void sub_81B9D28(void)
{
gSaveBlock2Ptr->frontier.field_CA8 = 0;
- gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
@@ -551,25 +551,25 @@ static void sub_81BA040(void)
do
{
trainerId = Random() % 30;
- for (i = 0; i < gSaveBlock2Ptr->frontier.field_CB2; i++)
+ for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
{
- if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
+ if (gSaveBlock2Ptr->frontier.battledTrainerIds[i] == trainerId)
break;
}
- } while (i != gSaveBlock2Ptr->frontier.field_CB2);
+ } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum);
gTrainerBattleOpponent_A = trainerId;
- while (gFacilityTrainers[gTrainerBattleOpponent_A].btMonPool[monPoolCount] != 0xFFFF)
+ while (gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool[monPoolCount] != 0xFFFF)
monPoolCount++;
if (monPoolCount > 8)
break;
monPoolCount = 0;
}
- if (gSaveBlock2Ptr->frontier.field_CB2 < 2)
- gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.field_CB2] = gTrainerBattleOpponent_A;
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 2)
+ gSaveBlock2Ptr->frontier.battledTrainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
- monSetsPool = gFacilityTrainers[gTrainerBattleOpponent_A].btMonPool;
+ monSetsPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool;
i = 0;
while (i != 3)
{
diff --git a/src/battle_tower.c b/src/battle_tower.c
index a6983897f..b9451aecd 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -1,27 +1,55 @@
#include "global.h"
+#include "battle_tower.h"
+#include "apprentice.h"
#include "event_data.h"
#include "battle_setup.h"
#include "overworld.h"
#include "random.h"
-#include "battle_tower.h"
+#include "text.h"
+#include "international_string_util.h"
+#include "battle.h"
#include "battle_frontier_1.h"
+#include "battle_frontier_2.h"
+#include "recorded_battle.h"
+#include "easy_chat.h"
#include "constants/battle_frontier.h"
+#include "constants/trainers.h"
+#include "constants/event_objects.h"
+#include "constants/moves.h"
extern void sub_81A3ACC(void);
+extern void CreateFrontierBrainPokemon(void);
+extern void sub_81A6CD0(void);
extern u8 GetFrontierEnemyMonLevel(u8);
+extern u8 GetFacilityEnemyMonLevel(void);
+extern u16 sub_81A39C4(void);
+extern void SetFrontierBrainTrainerGfxId(void);
+extern u8 GetFrontierBrainTrainerPicIndex(void);
+extern u8 GetFrontierBrainTrainerClass(void);
+extern u8 IsFrontierBrainFemale(void);
+extern void CopyFrontierBrainTrainerName(u8 *dst);
+extern void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 move, u8 moveSlot);
extern const u32 gUnknown_085DF9AC[][2];
extern const u32 gUnknown_085DF9CC[][2];
extern void (* const gUnknown_085DF96C[])(void);
extern const u8 gUnknown_085DF9F6[];
extern const u8 gUnknown_085DF9EC[];
+extern const u16 gBattleFrontierHeldItems[];
// This file's functions.
void sub_8164ED8(void);
void sub_8163E90(void);
void sub_8165B20(void);
+void sub_8165E18(void);
u16 GetCurrentBattleTowerWinStreak(u8 lvlMode, u8 battleMode);
void sub_816534C(void *);
+u16 sub_8162548(u8, u8);
+void sub_81630C4(u16 trainerId, u8 firstMonId, u8 monCount);
+void sub_8165EA4(u16 trainerId, u8 firstMonId, u8 monCount);
+void sub_81635D4(u16 trainerId, u8 firstMonId);
+void sub_816379C(u16 trainerId, u8 firstMonId);
+u8 GetFrontierTrainerFixedIvs(u16 trainerId);
// code
void sub_8161F74(void)
@@ -35,7 +63,7 @@ void sub_8161F94(void)
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
gSaveBlock2Ptr->frontier.field_CA8 = 1;
- gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = 0;
gSaveBlock2Ptr->frontier.field_CA9_b = 0;
sub_81A3ACC();
@@ -94,15 +122,15 @@ void sub_81620F4(void)
void sub_81621C0(void)
{
- if (gTrainerBattleOpponent_A == 500)
- sub_816534C(&gSaveBlock2Ptr->frontier.filler_BEC);
+ if (gTrainerBattleOpponent_A == BATTLE_TOWER_EREADER_TRAINER_ID)
+ sub_816534C(&gSaveBlock2Ptr->frontier.ereaderTrainer);
if (gSaveBlock2Ptr->frontier.field_D04 < 9999)
gSaveBlock2Ptr->frontier.field_D04++;
- gSaveBlock2Ptr->frontier.field_CB2++;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum++;
sub_8163E90();
- gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CB2;
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
}
bool8 ChooseSpecialBattleTowerTrainer(void)
@@ -172,3 +200,940 @@ bool8 ChooseSpecialBattleTowerTrainer(void)
return FALSE;
}
}
+
+void ChooseNextBattleTowerTrainer(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ if (lvlMode == FRONTIER_LVL_TENT)
+ {
+ sub_8165E18();
+ }
+ else
+ {
+ u16 id;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u32 r5 = sub_81A39C4() / 7;
+ GetFacilityEnemyMonLevel(); // Pointless function call.
+
+ if (battleMode == FRONTIER_MODE_MULTIS || battleMode == FRONTIER_MODE_LINK_MULTIS)
+ {
+ id = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
+ gTrainerBattleOpponent_A = gSaveBlock2Ptr->frontier.battledTrainerIds[id * 2];
+ gTrainerBattleOpponent_B = gSaveBlock2Ptr->frontier.battledTrainerIds[id * 2 + 1];
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1);
+ }
+ else if (ChooseSpecialBattleTowerTrainer())
+ {
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
+ gSaveBlock2Ptr->frontier.battledTrainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
+ }
+ else
+ {
+ s32 i;
+ while (1)
+ {
+ id = sub_8162548(r5, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
+
+ // Ensure trainer wasn't previously fought in this challenge.
+ for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.battledTrainerIds[i] == id)
+ break;
+ }
+ if (i == gSaveBlock2Ptr->frontier.curChallengeBattleNum)
+ break;
+ }
+
+ gTrainerBattleOpponent_A = id;
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum + 1 < 7)
+ gSaveBlock2Ptr->frontier.battledTrainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
+ }
+ }
+}
+
+extern const u16 gUnknown_085DFA1A[][2];
+extern const u16 gUnknown_085DF9FA[][2];
+
+u16 sub_8162548(u8 challengeNum, u8 battleNum)
+{
+ u16 trainerId;
+
+ if (challengeNum <= 7)
+ {
+ if (battleNum == 6)
+ {
+ trainerId = (gUnknown_085DFA1A[challengeNum][1] - gUnknown_085DFA1A[challengeNum][0]) + 1;
+ trainerId = gUnknown_085DFA1A[challengeNum][0] + (Random() % trainerId);
+ }
+ else
+ {
+ trainerId = (gUnknown_085DF9FA[challengeNum][1] - gUnknown_085DF9FA[challengeNum][0]) + 1;
+ trainerId = gUnknown_085DF9FA[challengeNum][0] + (Random() % trainerId);
+ }
+ }
+ else
+ {
+ trainerId = (gUnknown_085DF9FA[7][1] - gUnknown_085DF9FA[7][0]) + 1;
+ trainerId = gUnknown_085DF9FA[7][0] + (Random() % trainerId);
+ }
+
+ return trainerId;
+}
+
+#ifdef NONMATCHING
+u16 sub_81625B4(u8 challengeNum, u8 battleNum, u16 *trainerIdPtr, u8 *arg3) // Unused
+{
+ register u16 trainerId, count;
+
+ if (challengeNum <= 7)
+ {
+ if (battleNum == 6)
+ {
+ count = (gUnknown_085DFA1A[challengeNum][1] - gUnknown_085DFA1A[challengeNum][0]) + 1;
+ trainerId = gUnknown_085DFA1A[challengeNum][0];
+ }
+ else
+ {
+ count = (gUnknown_085DF9FA[challengeNum][1] - gUnknown_085DF9FA[challengeNum][0]) + 1;
+ trainerId = gUnknown_085DF9FA[challengeNum][0];
+ }
+ }
+ else
+ {
+ count = (gUnknown_085DF9FA[7][1] - gUnknown_085DF9FA[7][0]) + 1;
+ trainerId = gUnknown_085DF9FA[7][0];
+ }
+
+ *trainerIdPtr = trainerId;
+ *arg3 = count;
+}
+#else
+NAKED
+u16 sub_81625B4(u8 challengeNum, u8 battleNum, u16 *trainerIdPtr, u8 *arg3)
+{
+ asm_unified(" push {r4,lr}\n\
+ adds r4, r2, 0\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r2, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ cmp r0, 0x7\n\
+ bhi _081625F4\n\
+ cmp r1, 0x6\n\
+ bne _081625D4\n\
+ ldr r1, =gUnknown_085DFA1A\n\
+ lsls r2, r0, 2\n\
+ b _081625D8\n\
+ .pool\n\
+_081625D4:\n\
+ ldr r1, =gUnknown_085DF9FA\n\
+ lsls r2, 2\n\
+_081625D8:\n\
+ adds r0, r1, 0x2\n\
+ adds r0, r2, r0\n\
+ adds r2, r1\n\
+ ldrh r0, [r0]\n\
+ ldrh r1, [r2]\n\
+ subs r0, r1\n\
+ adds r0, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r1, r0, 16\n\
+ ldrh r0, [r2]\n\
+ b _08162604\n\
+ .pool\n\
+_081625F4:\n\
+ ldr r0, =gUnknown_085DF9FA\n\
+ ldrh r1, [r0, 0x1E]\n\
+ ldrh r2, [r0, 0x1C]\n\
+ subs r1, r2\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ ldrh r0, [r0, 0x1C]\n\
+_08162604:\n\
+ strh r0, [r4]\n\
+ strb r1, [r3]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool");
+}
+#endif
+
+void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId)
+{
+ u32 i;
+ u8 facilityClass;
+ u8 trainerObjectGfxId;
+
+ GetFacilityEnemyMonLevel(); // Pointless function call.
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ facilityClass = gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass;
+ }
+ else if (trainerId == TRAINER_FRONTIER_BRAIN)
+ {
+ SetFrontierBrainTrainerGfxId();
+ return;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ facilityClass = gFacilityTrainers[trainerId].facilityClass;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ facilityClass = gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].facilityClass;
+ }
+ else
+ {
+ facilityClass = gApprentices[gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].id].facilityClass;
+ }
+
+ // Search male classes.
+ for (i = 0; i < ARRAY_COUNT(gTowerMaleFacilityClasses); i++)
+ {
+ if (gTowerMaleFacilityClasses[i] == facilityClass)
+ break;
+ }
+ if (i != ARRAY_COUNT(gTowerMaleFacilityClasses))
+ {
+ trainerObjectGfxId = gTowerMaleTrainerGfxIds[i];
+ switch (tempVarId)
+ {
+ case 0:
+ default:
+ VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId);
+ return;
+ case 1:
+ VarSet(VAR_OBJ_GFX_ID_1, trainerObjectGfxId);
+ return;
+ case 15:
+ VarSet(VAR_OBJ_GFX_ID_E, trainerObjectGfxId);
+ return;
+ }
+ }
+
+ // Search female classes.
+ for (i = 0; i < ARRAY_COUNT(gTowerFemaleFacilityClasses); i++)
+ {
+ if (gTowerFemaleFacilityClasses[i] == facilityClass)
+ break;
+ }
+ if (i != ARRAY_COUNT(gTowerFemaleFacilityClasses))
+ {
+ trainerObjectGfxId = gTowerFemaleTrainerGfxIds[i];
+ switch (tempVarId)
+ {
+ case 0:
+ default:
+ VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId);
+ return;
+ case 1:
+ VarSet(VAR_OBJ_GFX_ID_1, trainerObjectGfxId);
+ return;
+ case 15:
+ VarSet(VAR_OBJ_GFX_ID_E, trainerObjectGfxId);
+ return;
+ }
+ }
+
+ switch (tempVarId)
+ {
+ case 0:
+ default:
+ VarSet(VAR_OBJ_GFX_ID_0, EVENT_OBJ_GFX_BOY_1);
+ return;
+ case 1:
+ VarSet(VAR_OBJ_GFX_ID_1, EVENT_OBJ_GFX_BOY_1);
+ return;
+ case 15:
+ VarSet(VAR_OBJ_GFX_ID_E, EVENT_OBJ_GFX_BOY_1);
+ return;
+ }
+}
+
+void SetEReaderTrainerGfxId(void)
+{
+ SetBattleFacilityTrainerGfxId(BATTLE_TOWER_EREADER_TRAINER_ID, 0);
+}
+
+u8 GetBattleFacilityTrainerGfxId(u16 trainerId)
+{
+ u32 i;
+ u8 facilityClass;
+ u8 trainerObjectGfxId;
+
+ GetFacilityEnemyMonLevel(); // Pointless function call.
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ facilityClass = gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ facilityClass = gFacilityTrainers[trainerId].facilityClass;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ facilityClass = gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].facilityClass;
+ }
+ else
+ {
+ facilityClass = gApprentices[gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].id].facilityClass;
+ }
+
+ // Search male classes.
+ for (i = 0; i < ARRAY_COUNT(gTowerMaleFacilityClasses); i++)
+ {
+ if (gTowerMaleFacilityClasses[i] == facilityClass)
+ break;
+ }
+ if (i != ARRAY_COUNT(gTowerMaleFacilityClasses))
+ {
+ trainerObjectGfxId = gTowerMaleTrainerGfxIds[i];
+ return trainerObjectGfxId;
+ }
+
+ // Search female classes.
+ for (i = 0; i < ARRAY_COUNT(gTowerFemaleFacilityClasses); i++)
+ {
+ if (gTowerFemaleFacilityClasses[i] == facilityClass)
+ break;
+ }
+ if (i != ARRAY_COUNT(gTowerFemaleFacilityClasses))
+ {
+ trainerObjectGfxId = gTowerFemaleTrainerGfxIds[i];
+ return trainerObjectGfxId;
+ }
+ else
+ {
+ return EVENT_OBJ_GFX_BOY_1;
+ }
+}
+
+void PutNewBattleTowerRecord(union BattleTowerRecord *newRecord)
+{
+ u16 slotValues[6];
+ u16 slotIds[6];
+ s32 i, j, k;
+ s32 slotsCount = 0;
+ struct EmeraldBattleTowerRecord *newRecordEm = &newRecord->emerald;
+
+ // Find a record slot of the same player and replace it.
+ for (i = 0; i < 5; i++)
+ {
+ k = 0;
+ for (j = 0; j < 4; j++)
+ {
+ if (gSaveBlock2Ptr->frontier.records[i].trainerId[j] != newRecordEm->trainerId[j])
+ break;
+ }
+ if (j == 4)
+ {
+ for (k = 0; k < PLAYER_NAME_LENGTH; k++)
+ {
+ // BUG: Wrong variable used, 'j' instead of 'k'.
+ if (gSaveBlock2Ptr->frontier.records[i].name[j] != newRecordEm->name[j])
+ break;
+ if (newRecordEm->name[j] == EOS)
+ {
+ k = PLAYER_NAME_LENGTH;
+ break;
+ }
+ }
+ }
+
+ if (k == PLAYER_NAME_LENGTH)
+ break;
+ }
+ if (i < 5)
+ {
+ gSaveBlock2Ptr->frontier.records[i] = *newRecordEm;
+ return;
+ }
+
+ // Find an empty record slot.
+ for (i = 0; i < 5; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.records[i].winStreak == 0)
+ break;
+ }
+ if (i < 5)
+ {
+ gSaveBlock2Ptr->frontier.records[i] = *newRecordEm;
+ return;
+ }
+
+ // Find possible slots to replace the record.
+ slotValues[0] = gSaveBlock2Ptr->frontier.records[0].winStreak;
+ slotIds[0] = 0;
+ slotsCount++;
+
+ for (i = 1; i < 5; i++)
+ {
+ for (j = 0; j < slotsCount; j++)
+ {
+ if (gSaveBlock2Ptr->frontier.records[i].winStreak < slotValues[j])
+ {
+ j = 0;
+ slotsCount = 1;
+ slotValues[0] = gSaveBlock2Ptr->frontier.records[i].winStreak;
+ slotIds[0] = i;
+ break;
+ }
+ else if (gSaveBlock2Ptr->frontier.records[i].winStreak > slotValues[j])
+ {
+ break;
+ }
+ }
+
+ if (j == slotsCount)
+ {
+ slotValues[slotsCount] = gSaveBlock2Ptr->frontier.records[i].winStreak;
+ slotIds[slotsCount] = i;
+ slotsCount++;
+ }
+ }
+
+ i = Random() % slotsCount;
+ gSaveBlock2Ptr->frontier.records[slotIds[i]] = *newRecordEm;
+}
+
+u8 GetFrontierTrainerFrontSpriteId(u16 trainerId)
+{
+ GetFacilityEnemyMonLevel(); // Pointless function call
+
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ return gFacilityClassToPicIndex[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass];
+ }
+ else if (trainerId == TRAINER_FRONTIER_BRAIN)
+ {
+ return GetFrontierBrainTrainerPicIndex();
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ return gFacilityClassToPicIndex[gFacilityTrainers[trainerId].facilityClass];
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ return gFacilityClassToPicIndex[sub_818649C()];
+ else
+ return gFacilityClassToPicIndex[gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].facilityClass];
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ return gFacilityClassToPicIndex[gApprentices[sub_81864A8()].facilityClass];
+ else
+ return gFacilityClassToPicIndex[gApprentices[gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].id].facilityClass];
+ }
+}
+
+u8 GetFrontierOpponentClass(u16 trainerId)
+{
+ u8 trainerClass = 0;
+ GetFacilityEnemyMonLevel(); // Pointless function call.
+
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ trainerClass = gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass];
+ }
+ else if (trainerId == TRAINER_FRONTIER_BRAIN)
+ {
+ trainerClass = GetFrontierBrainTrainerClass();
+ }
+ else if (trainerId == TRAINER_STEVEN_PARTNER)
+ {
+ trainerClass = gTrainers[TRAINER_STEVEN].trainerClass;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ trainerClass = gFacilityClassToTrainerClass[gFacilityTrainers[trainerId].facilityClass];
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ {
+ trainerClass = gFacilityClassToTrainerClass[sub_818649C()];
+ }
+ else
+ {
+ trainerClass = gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].facilityClass];
+ asm("");
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ {
+ trainerClass = gFacilityClassToTrainerClass[gApprentices[sub_81864A8()].facilityClass];
+ }
+ else
+ {
+ trainerClass = gFacilityClassToTrainerClass[gApprentices[gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].id].facilityClass];
+ asm("");
+ }
+ }
+
+ return trainerClass;
+}
+
+u8 GetFrontierTrainerFacilityClass(u16 trainerId)
+{
+ u8 facilityClass;
+ GetFacilityEnemyMonLevel(); // Pointless function call.
+
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ facilityClass = gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ facilityClass = gFacilityTrainers[trainerId].facilityClass;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ facilityClass = sub_818649C();
+ else
+ facilityClass = gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].facilityClass;
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ facilityClass = gApprentices[sub_81864A8()].facilityClass;
+ else
+ facilityClass = gApprentices[gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].id].facilityClass;
+ }
+
+ return facilityClass;
+}
+
+void GetFrontierTrainerName(u8 *dst, u16 trainerId)
+{
+ s32 i = 0;
+ GetFacilityEnemyMonLevel(); // Pointless function call.
+
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ dst[i] = gSaveBlock2Ptr->frontier.ereaderTrainer.name[i];
+ }
+ else if (trainerId == TRAINER_FRONTIER_BRAIN)
+ {
+ CopyFrontierBrainTrainerName(dst);
+ return;
+ }
+ else if (trainerId == TRAINER_STEVEN_PARTNER)
+ {
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ dst[i] = gTrainers[TRAINER_STEVEN].trainerName[i];
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ dst[i] = gFacilityTrainers[trainerId].trainerName[i];
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ {
+ sub_8186468(dst);
+ return;
+ }
+ else
+ {
+ struct EmeraldBattleTowerRecord *record = &gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID];
+ TVShowConvertInternationalString(dst, record->name, record->language);
+ return;
+ }
+ }
+ else
+ {
+ u8 id, language;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ {
+ id = sub_81864A8();
+ language = sub_81864C0();
+ }
+ else
+ {
+ struct Apprentice *apprentice = &gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID];
+ id = apprentice->id;
+ language = apprentice->language;
+ }
+ TVShowConvertInternationalString(dst, GetApprenticeNameInLanguage(id, language), language);
+ return;
+ }
+
+ dst[i] = EOS;
+}
+
+bool8 IsFrontierTrainerFemale(u16 trainerId)
+{
+ u32 i;
+ u8 facilityClass;
+
+ GetFacilityEnemyMonLevel(); // Pointless function call.
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ facilityClass = gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass;
+ }
+ else if (trainerId == TRAINER_FRONTIER_BRAIN)
+ {
+ return IsFrontierBrainFemale();
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ facilityClass = gFacilityTrainers[trainerId].facilityClass;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ facilityClass = gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].facilityClass;
+ }
+ else
+ {
+ facilityClass = gApprentices[gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].id].facilityClass;
+ }
+
+ // Search female classes.
+ for (i = 0; i < ARRAY_COUNT(gTowerFemaleFacilityClasses); i++)
+ {
+ if (gTowerFemaleFacilityClasses[i] == facilityClass)
+ break;
+ }
+ if (i != ARRAY_COUNT(gTowerFemaleFacilityClasses))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8163048(u8 monsCount)
+{
+ ZeroEnemyPartyMons();
+ sub_81630C4(gTrainerBattleOpponent_A, 0, monsCount);
+}
+
+void sub_816306C(u8 monsCount)
+{
+ ZeroEnemyPartyMons();
+ sub_81630C4(gTrainerBattleOpponent_A, 0, monsCount);
+ sub_81630C4(gTrainerBattleOpponent_B, 3, monsCount);
+}
+
+void sub_81630A0(u8 monsCount)
+{
+ ZeroEnemyPartyMons();
+ sub_8165EA4(gTrainerBattleOpponent_A, 0, monsCount);
+}
+
+void sub_81630C4(u16 trainerId, u8 firstMonId, u8 monCount)
+{
+ s32 i, j;
+ u16 chosenMonIndices[4];
+ u8 friendship = 0xFF;
+ u8 level = GetFacilityEnemyMonLevel();
+ u8 fixedIV = 0;
+ u8 bfMonCount;
+ const u16 *bfMonPool = NULL;
+ u32 otID = 0;
+
+ if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ // Normal battle frontier trainer.
+ fixedIV = GetFrontierTrainerFixedIvs(trainerId);
+ bfMonPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool;
+ }
+ else if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ for (i = firstMonId; i < firstMonId + 3; i++)
+ sub_806819C(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i - firstMonId]);
+ return;
+ }
+ else if (trainerId == TRAINER_FRONTIER_BRAIN)
+ {
+ CreateFrontierBrainPokemon();
+ return;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ // Record mixed player.
+ for (j = 0, i = firstMonId; i < firstMonId + monCount; j++, i++)
+ {
+ if (gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[j].species != 0
+ && gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[j].level <= level)
+ {
+ sub_8068338(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.records[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[j], FALSE);
+ }
+ }
+ return;
+ }
+ else
+ {
+ // Apprentice.
+ for (i = firstMonId; i < firstMonId + 3; i++)
+ CreateApprenticeMon(&gEnemyParty[i], &gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID], i - firstMonId);
+ return;
+ }
+
+ // Regular battle frontier trainer.
+ // Attempt to fill the trainer's party with random Pokemon until 3 have been
+ // successfully chosen. The trainer's party may not have duplicate pokemon species
+ // or duplicate held items.
+ for (bfMonCount = 0; bfMonPool[bfMonCount] != 0xFFFF; bfMonCount++)
+ ;
+ i = 0;
+ otID = Random32();
+ while (i != monCount)
+ {
+ u16 monPoolId = bfMonPool[Random() % bfMonCount];
+ if ((level == 50 || level == 20) && monPoolId > 849)
+ continue;
+
+ // Ensure this pokemon species isn't a duplicate.
+ for (j = 0; j < i + firstMonId; j++)
+ {
+ if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monPoolId].species)
+ break;
+ }
+ if (j != i + firstMonId)
+ continue;
+
+ // Ensure this Pokemon's held item isn't a duplicate.
+ for (j = 0; j < i + firstMonId; j++)
+ {
+ if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0
+ && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId])
+ break;
+ }
+ if (j != i + firstMonId)
+ continue;
+
+ // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary
+ // because the species and held items were already checked directly above.
+ for (j = 0; j < i; j++)
+ {
+ if (chosenMonIndices[j] == monPoolId)
+ break;
+ }
+ if (j != i)
+ continue;
+
+ chosenMonIndices[i] = monPoolId;
+
+ // Place the chosen pokemon into the trainer's party.
+ CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[i + firstMonId],
+ gFacilityTrainerMons[monPoolId].species,
+ level,
+ gFacilityTrainerMons[monPoolId].nature,
+ fixedIV,
+ gFacilityTrainerMons[monPoolId].evSpread,
+ otID);
+
+ friendship = 255;
+ // Give the chosen pokemon its specified moves.
+ for (j = 0; j < 4; j++)
+ {
+ SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monPoolId].moves[j], j);
+ if (gFacilityTrainerMons[monPoolId].moves[j] == MOVE_FRUSTRATION)
+ friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is.
+ }
+
+ SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]);
+
+ // The pokemon was successfully added to the trainer's party, so it's safe to move on to
+ // the next party slot.
+ i++;
+ }
+}
+
+// Probably an early draft before the 'CreateApprenticeMon' was written.
+void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId)
+{
+ s32 i, j;
+ u8 friendship = 0xFF;
+ u8 level = 0;
+ u8 fixedIV = 0;
+ struct Apprentice *apprentice = &gSaveBlock2Ptr->apprentices[0];
+
+ if (apprentice->field_1 < 5)
+ fixedIV = 6;
+ else
+ fixedIV = 9;
+
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
+ level = 100;
+ else
+ level = 50;
+
+ for (i = 0; i != 3; i++)
+ {
+ CreateMonWithEVSpread(&gEnemyParty[firstMonId + i], apprentice->monData[i].species, level, fixedIV, 8);
+ friendship = 0xFF;
+ for (j = 0; j < 4; j++)
+ {
+ if (apprentice->monData[i].moves[j] == MOVE_FRUSTRATION)
+ friendship = 0;
+ }
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &apprentice->monData[i].item);
+ }
+}
+
+u16 RandomizeFacilityTrainerMonId(u16 trainerId)
+{
+ u32 monPoolId;
+ u8 level = GetFacilityEnemyMonLevel();
+ const u16 *bfMonPool = gFacilityTrainers[trainerId].bfMonPool;
+ u8 bfMonCount = 0;
+
+ /*
+ I had to use ugly C tricks to get this part to match.
+ A cleaner version would look like this
+
+ for (bfMonCount = 0; bfMonPool[bfMonCount] != 0xFFFF; bfMonCount++)
+ ;
+
+ */
+
+ monPoolId = bfMonPool[bfMonCount];
+ goto COMPARE;
+ while (1)
+ {
+ bfMonCount++;
+ monPoolId = bfMonPool[bfMonCount];
+ COMPARE:
+ if (monPoolId == 0xFFFF)
+ break;
+ }
+
+ do
+ {
+ monPoolId = bfMonPool[Random() % bfMonCount];
+ } while((level == 50 || level == 20) && monPoolId > 849);
+
+ return monPoolId;
+}
+
+void sub_8163590(void)
+{
+ ZeroEnemyPartyMons();
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
+ sub_81635D4(gTrainerBattleOpponent_A, 0);
+ else
+ sub_816379C(gTrainerBattleOpponent_A, 0);
+}
+
+extern u16 gUnknown_03006298[];
+
+void sub_81635D4(u16 trainerId, u8 firstMonId)
+{
+ u8 i, j;
+ u8 friendship;
+ u8 level;
+ u8 fixedIV;
+ u32 otID;
+
+ if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; // Unused variable.
+ u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u8 r1 = gSaveBlock2Ptr->frontier.field_CE0[battleMode][0] / 7;
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6)
+ fixedIV = sub_81A6CA8(r1, 0);
+ else
+ fixedIV = sub_81A6CA8(r1, 1);
+ }
+ else if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ for (i = firstMonId; i < firstMonId + 3; i++)
+ sub_806819C(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i - firstMonId]);
+ return;
+ }
+ else if (trainerId == TRAINER_FRONTIER_BRAIN)
+ {
+ sub_81A6CD0();
+ return;
+ }
+ else
+ {
+ fixedIV = 31;
+ }
+
+
+ level = GetFacilityEnemyMonLevel();
+ otID = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
+ for (i = 0; i < 3; i++)
+ {
+ u16 poolId = gUnknown_03006298[i];
+ CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[firstMonId + i],
+ gFacilityTrainerMons[poolId].species,
+ level,
+ gFacilityTrainerMons[poolId].nature,
+ fixedIV,
+ gFacilityTrainerMons[poolId].evSpread,
+ otID);
+
+ friendship = 0;
+ for (j = 0; j < 4; j++)
+ SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[poolId].moves[j], j);
+
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[poolId].itemTableId]);
+ }
+}
+
+void sub_816379C(u16 trainerId, u8 firstMonId)
+{
+ u8 i, j;
+ u8 friendship;
+ u8 level = 30;
+ u8 fixedIV = 0;
+ u32 otID = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
+
+ for (i = 0; i < 3; i++)
+ {
+ u16 poolId = gUnknown_03006298[i];
+ CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[firstMonId + i],
+ gFacilityTrainerMons[poolId].species,
+ level,
+ gFacilityTrainerMons[poolId].nature,
+ fixedIV,
+ gFacilityTrainerMons[poolId].evSpread,
+ otID);
+
+ friendship = 0;
+ for (j = 0; j < 4; j++)
+ {
+ SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[poolId].moves[j], j);
+ if (gFacilityTrainerMons[poolId].moves[j] == MOVE_FRUSTRATION)
+ friendship = 0;
+ }
+
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[poolId].itemTableId]);
+ }
+}
+
+void ConvertBattleFrontierTrainerSpeechToString(const u16 *words)
+{
+ ConvertEasyChatWordsToString(gStringVar4, words, 3, 2);
+ if (GetStringWidth(1, gStringVar4, -1) > 204)
+ {
+ s32 i = 0;
+
+ ConvertEasyChatWordsToString(gStringVar4, words, 2, 3);
+ while (gStringVar4[i++] != CHAR_NEWLINE)
+ ;
+ while (gStringVar4[i] != CHAR_NEWLINE)
+ i++;
+
+ gStringVar4[i] = CHAR_PROMPT_SCROLL;
+ }
+}
diff --git a/src/map_name_popup.c b/src/map_name_popup.c
index 3feffd70d..94628f9c4 100644
--- a/src/map_name_popup.c
+++ b/src/map_name_popup.c
@@ -314,7 +314,7 @@ static void ShowMapNamePopUpWindow(void)
else
{
withoutPrefixPtr = &(mapDisplayHeader[3]);
- mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[gSaveBlock2Ptr->frontier.field_CB2];
+ mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[gSaveBlock2Ptr->frontier.curChallengeBattleNum];
}
StringCopy(withoutPrefixPtr, mapDisplayHeaderSource);
}
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 4c3c3d03c..4fb4a256e 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -686,7 +686,7 @@ static void ReceiveBattleTowerData(void *battleTowerRecord, size_t recordSize, u
}
CalcEmeraldBattleTowerChecksum(dest);
}
- sub_81628A0((void *)battleTowerRecord + recordSize * which);
+ PutNewBattleTowerRecord((void *)battleTowerRecord + recordSize * which);
}
static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSize, u8 which)
diff --git a/src/start_menu.c b/src/start_menu.c
index dcb2c4154..aaa9fec2c 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -383,14 +383,14 @@ static void ShowSafariBallsWindow(void)
static void ShowPyramidFloorWindow(void)
{
- if (gSaveBlock2Ptr->frontier.field_CB2 == 7)
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum == 7)
sBattlePyramidFloorWindowId = AddWindow(&sPyramidFloorWindowTemplate_1);
else
sBattlePyramidFloorWindowId = AddWindow(&sPyramidFloorWindowTemplate_2);
PutWindowTilemap(sBattlePyramidFloorWindowId);
NewMenuHelpers_DrawStdWindowFrame(sBattlePyramidFloorWindowId, FALSE);
- StringCopy(gStringVar1, sPyramindFloorNames[gSaveBlock2Ptr->frontier.field_CB2]);
+ StringCopy(gStringVar1, sPyramindFloorNames[gSaveBlock2Ptr->frontier.curChallengeBattleNum]);
StringExpandPlaceholders(gStringVar4, gText_BattlePyramidFloor);
AddTextPrinterParameterized(sBattlePyramidFloorWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
CopyWindowToVram(sBattlePyramidFloorWindowId, 2);
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 9a22323ff..ec69ad2b5 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -5102,7 +5102,7 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi
}
if (gMapHeader.mapLayoutId == 0x169)
{
- headerId = gSaveBlock2Ptr->frontier.field_CB2;
+ headerId = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
return FALSE;
else if (DoWildEncounterRateTest(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
@@ -5240,7 +5240,7 @@ bool8 SweetScentWildEncounter(void)
}
if (gMapHeader.mapLayoutId == 0x169)
{
- headerId = gSaveBlock2Ptr->frontier.field_CB2;
+ headerId = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE)
return FALSE;