summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2018-10-22 19:22:57 +0200
committerDizzyEggg <jajkodizzy@wp.pl>2018-10-22 19:22:57 +0200
commitb330bdba51b86959e702e904c4a5d8039e6395c7 (patch)
tree88c9552bc137c9185c2c8c7ece049fa91a5cd605
parent0ab27e44b14a0dc4523b5bac7fef18312ab4fdde (diff)
More and more battle tower
-rw-r--r--asm/battle_tower.s2227
-rw-r--r--asm/rom_8011DC0.s2
-rw-r--r--data/battle_tower.s6
-rw-r--r--data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc2
-rw-r--r--data/specials.inc2
-rw-r--r--include/battle_tower.h11
-rw-r--r--include/global.h15
-rw-r--r--src/battle_setup.c11
-rw-r--r--src/battle_tower.c853
-rw-r--r--src/record_mixing.c21
10 files changed, 821 insertions, 2329 deletions
diff --git a/asm/battle_tower.s b/asm/battle_tower.s
index b8f138e7b..46d10acd1 100644
--- a/asm/battle_tower.s
+++ b/asm/battle_tower.s
@@ -5,2227 +5,6 @@
.text
- thumb_func_start sub_81646BC
-sub_81646BC: @ 81646BC
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- lsls r0, 16
- lsrs r5, r0, 16
- lsls r1, 16
- lsrs r4, r1, 16
- movs r0, 0
- mov r9, r0
- mov r10, r0
- bl GetFacilityEnemyMonLevel
- movs r0, 0xFA
- lsls r0, 1
- cmp r5, r0
- beq _081647CE
- subs r0, 0xC9
- cmp r5, r0
- bhi _081646FC
- ldr r0, =gFacilityTrainerMons
- ldr r1, [r0]
- lsls r0, r4, 4
- adds r0, r1
- ldrh r1, [r0, 0x2]
- mov r9, r1
- ldrh r0, [r0]
- mov r10, r0
- b _081647CE
- .pool
-_081646FC:
- ldr r0, =0x0000018f
- cmp r5, r0
- bhi _08164750
- ldr r0, =gSaveBlock2Ptr
- ldr r3, [r0]
- ldr r1, =gUnknown_03006298
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- adds r0, 0x1
- lsls r0, 1
- adds r0, r1
- ldrh r1, [r0]
- movs r0, 0x2C
- muls r1, r0
- ldr r0, =0xfffffed4
- adds r2, r5, r0
- movs r0, 0xEC
- muls r0, r2
- adds r1, r0
- adds r3, r1
- movs r1, 0xEE
- lsls r1, 3
- adds r0, r3, r1
- ldrh r0, [r0]
- mov r9, r0
- ldr r2, =0x0000076c
- adds r3, r2
- ldrh r3, [r3]
- mov r10, r3
- b _081647CE
- .pool
-_08164750:
- ldr r4, =gSaveBlock2Ptr
- ldr r3, [r4]
- ldr r1, =gUnknown_03006298
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- subs r0, 0x1
- lsls r0, 1
- adds r0, r1
- ldrh r1, [r0]
- lsls r0, r1, 1
- adds r0, r1
- lsls r0, 2
- ldr r2, =0xfffffe70
- adds r1, r5, r2
- lsls r2, r1, 4
- adds r2, r1
- lsls r2, 2
- adds r0, r2
- adds r3, r0
- adds r0, r3, 0
- adds r0, 0xE2
- ldrh r0, [r0]
- mov r9, r0
- adds r3, 0xE0
- ldrh r3, [r3]
- mov r10, r3
- movs r3, 0
- ldr r7, =gStringVar3
- mov r8, r7
- adds r0, r4, 0
- mov r12, r0
- adds r4, r2, 0
- movs r6, 0x8A
- lsls r6, 1
-_08164794:
- mov r1, r8
- adds r2, r3, r1
- mov r1, r12
- ldr r0, [r1]
- adds r1, r3, r4
- adds r0, r6
- adds r0, r1
- ldrb r0, [r0]
- strb r0, [r2]
- adds r3, 0x1
- cmp r3, 0x6
- ble _08164794
- adds r1, r3, r7
- movs r0, 0xFF
- strb r0, [r1]
- ldr r0, =gSaveBlock2Ptr
- ldr r2, [r0]
- ldr r0, =0xfffffe70
- adds r1, r5, r0
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r2, r0
- ldr r1, =0x0000011b
- adds r0, r2, r1
- ldrb r1, [r0]
- adds r0, r7, 0
- bl ConvertInternationalString
-_081647CE:
- ldr r0, =gStringVar1
- movs r1, 0xD
- mov r2, r9
- muls r2, r1
- adds r1, r2, 0
- ldr r2, =gMoveNames
- adds r1, r2
- bl StringCopy
- ldr r0, =gStringVar2
- movs r1, 0xB
- mov r2, r10
- muls r2, r1
- adds r1, r2, 0
- ldr r2, =gSpeciesNames
- adds r1, r2
- bl StringCopy
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81646BC
-
- thumb_func_start sub_8164828
-sub_8164828: @ 8164828
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x8
- bl GetFacilityEnemyMonLevel
- bl sub_81A39C4
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x7
- bl __udivsi3
- lsls r0, 16
- lsrs r0, 16
- mov r8, r0
- ldr r0, =gSpecialVar_LastTalked
- ldrh r0, [r0]
- subs r5, r0, 0x2
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- lsls r1, r5, 1
- ldr r2, =0x00000cb4
- adds r0, r2
- adds r0, r1
- ldrh r7, [r0]
- movs r3, 0
- str r3, [sp]
- ldr r4, =gUnknown_085DD500
- lsls r6, r7, 16
- b _08164884
- .pool
-_0816487C:
- adds r4, 0x8
- ldr r0, [sp]
- adds r0, 0x1
- str r0, [sp]
-_08164884:
- ldr r1, [sp]
- cmp r1, 0x31
- bhi _0816489A
- lsrs r0, r6, 16
- bl GetFrontierTrainerFacilityClass
- lsls r0, 24
- lsrs r0, 24
- ldr r1, [r4]
- cmp r1, r0
- bne _0816487C
-_0816489A:
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- cmp r0, 0x4
- bls _081648A4
- b _08164AC2
-_081648A4:
- lsls r0, 2
- ldr r1, =_081648B8
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_081648B8:
- .4byte _081648CC
- .4byte _08164984
- .4byte _0816499C
- .4byte _081649BC
- .4byte _08164AC2
-_081648CC:
- movs r0, 0xFA
- lsls r0, 1
- cmp r7, r0
- bne _081648D6
- b _08164B54
-_081648D6:
- subs r0, 0xC9
- cmp r7, r0
- ble _081648E2
- ldr r0, =0x0000018f
- cmp r7, r0
- bgt _081648F4
-_081648E2:
- ldr r0, =gStringVar1
- adds r1, r7, 0
- bl GetFrontierTrainerName
- b _08164AC2
- .pool
-_081648F4:
- movs r3, 0
- lsls r2, r7, 16
- mov r10, r2
- ldr r6, =gStringVar1
- mov r9, r6
- ldr r4, =gSaveBlock2Ptr
- mov r8, r4
- ldr r5, =0xfffffe70
- adds r1, r7, r5
- lsls r0, r1, 4
- adds r0, r1
- lsls r4, r0, 2
- movs r5, 0x8A
- lsls r5, 1
-_08164910:
- mov r0, r9
- adds r2, r3, r0
- mov r1, r8
- ldr r0, [r1]
- adds r1, r3, r4
- adds r0, r5
- adds r0, r1
- ldrb r0, [r0]
- strb r0, [r2]
- adds r3, 0x1
- cmp r3, 0x6
- ble _08164910
- adds r1, r3, r6
- movs r0, 0xFF
- strb r0, [r1]
- ldr r2, =gSaveBlock2Ptr
- ldr r1, [r2]
- ldr r3, =0xfffffe70
- adds r0, r7, r3
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- adds r1, r4
- ldr r5, =0x0000011b
- adds r0, r1, r5
- ldrb r1, [r0]
- adds r0, r6, 0
- bl ConvertInternationalString
- ldr r0, =gStringVar2
- ldr r2, =gSaveBlock2Ptr
- ldr r1, [r2]
- adds r1, r4
- adds r1, 0xDE
- ldrb r1, [r1]
- movs r2, 0
- movs r3, 0x3
- bl ConvertIntToDecimalStringN
- ldr r0, =gStringVar3
- mov r3, r10
- lsrs r1, r3, 16
- bl GetFrontierTrainerName
- b _08164AC2
- .pool
-_08164984:
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- lsls r0, r5, 2
- adds r1, r0
- ldr r4, =0x00000cc4
- adds r1, r4
- b _081649A8
- .pool
-_0816499C:
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- lsls r0, r5, 2
- adds r1, r0
- ldr r5, =0x00000cc6
- adds r1, r5
-_081649A8:
- adds r0, r7, 0
- ldrh r1, [r1]
- bl sub_81646BC
- b _08164AC2
- .pool
-_081649BC:
- ldr r0, =gPartnerTrainerId
- strh r7, [r0]
- ldr r0, =0x0000012b
- cmp r7, r0
- bgt _08164A08
- ldr r0, =gSaveBlock2Ptr
- ldr r4, [r0]
- lsls r1, r5, 1
- adds r0, r1, 0
- adds r0, 0x8
- lsls r0, 1
- ldr r3, =0x00000cb4
- adds r2, r4, r3
- adds r0, r2, r0
- ldrh r3, [r0]
- ldr r5, =0x00000cd8
- adds r0, r4, r5
- strh r3, [r0]
- adds r1, 0x9
- lsls r1, 1
- adds r2, r1
- ldrh r0, [r2]
- ldr r1, =0x00000cda
- adds r4, r1
- strh r0, [r4]
- b _08164A46
- .pool
-_08164A08:
- ldr r0, =0x0000018f
- cmp r7, r0
- bgt _08164A30
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r3, =gUnknown_03006298
- ldrh r2, [r3, 0x4]
- ldr r4, =0x00000cd8
- adds r0, r1, r4
- strh r2, [r0]
- ldrh r0, [r3, 0x6]
- b _08164A40
- .pool
-_08164A30:
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r3, =gUnknown_03006298
- ldrh r2, [r3]
- ldr r4, =0x00000cd8
- adds r0, r1, r4
- strh r2, [r0]
- ldrh r0, [r3, 0x2]
-_08164A40:
- ldr r5, =0x00000cda
- adds r1, r5
- strh r0, [r1]
-_08164A46:
- movs r5, 0
- mov r0, r8
- lsls r0, 24
- str r0, [sp, 0x4]
-_08164A4E:
- lsls r1, r5, 1
- mov r10, r1
- adds r2, r5, 0x1
- mov r9, r2
- lsrs r0, r5, 31
- adds r0, r5, r0
- asrs r0, 1
- lsls r0, 24
- mov r8, r0
-_08164A60:
- ldr r3, [sp, 0x4]
- lsrs r0, r3, 24
- mov r4, r8
- lsrs r1, r4, 24
- bl sub_8162548
- lsls r0, 16
- lsrs r3, r0, 16
- ldr r0, =gPartnerTrainerId
- ldrh r0, [r0]
- cmp r0, r3
- beq _08164A60
- movs r2, 0
- cmp r2, r5
- bge _08164AA2
- ldr r1, =gSaveBlock2Ptr
- ldr r0, [r1]
- ldr r4, =0x00000cb4
- adds r0, r4
- ldrh r0, [r0]
- cmp r0, r3
- beq _08164AA2
- adds r6, r1, 0
-_08164A8E:
- adds r2, 0x1
- cmp r2, r5
- bge _08164AA2
- ldr r0, [r6]
- lsls r1, r2, 1
- adds r0, r4
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, r3
- bne _08164A8E
-_08164AA2:
- cmp r2, r5
- bne _08164A60
- ldr r5, =gSaveBlock2Ptr
- ldr r0, [r5]
- ldr r1, =0x00000cb4
- adds r0, r1
- add r0, r10
- strh r3, [r0]
- mov r5, r9
- cmp r5, 0xD
- ble _08164A4E
- ldr r2, =gSaveBlock2Ptr
- ldr r0, [r2]
- ldr r3, =0x00000cd6
- adds r0, r3
- strh r7, [r0]
-_08164AC2:
- movs r0, 0xFA
- lsls r0, 1
- cmp r7, r0
- beq _08164B54
- subs r0, 0xC9
- cmp r7, r0
- bgt _08164AF8
- ldr r0, =gUnknown_085DD500
- ldr r4, [sp]
- lsls r1, r4, 3
- b _08164B04
- .pool
-_08164AF8:
- ldr r0, =0x0000018f
- cmp r7, r0
- bgt _08164B28
- ldr r0, =gUnknown_085DD500
- ldr r5, [sp]
- lsls r1, r5, 3
-_08164B04:
- adds r0, 0x4
- adds r1, r0
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- ldr r1, [r1]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl ShowFieldMessage
- b _08164B54
- .pool
-_08164B28:
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r0, =0xfffffe70
- adds r2, r7, r0
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0
- adds r1, 0xDC
- ldrb r0, [r1]
- lsls r0, 27
- ldr r1, =gUnknown_085DD690
- lsrs r0, 25
- adds r0, r1
- ldr r1, =gSpecialVar_0x8005
- ldrh r1, [r1]
- ldr r0, [r0]
- lsls r1, 2
- adds r1, r0
- ldr r0, [r1]
- bl ShowFieldMessage
-_08164B54:
- add sp, 0x8
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8164828
-
- thumb_func_start sub_8164B74
-sub_8164B74: @ 8164B74
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x4
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r7, r0, 30
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 16
- lsrs r5, r0, 16
- ldr r0, [r4]
- ldr r2, =0x00000cb2
- adds r0, r2
- ldrh r6, [r0]
- bl GetMultiplayerId
- ldr r0, =gSpecialVar_Result
- ldrh r0, [r0]
- cmp r0, 0x6
- bls _08164BAC
- b _08164DB6
-_08164BAC:
- lsls r0, 2
- ldr r1, =_08164BD0
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_08164BD0:
- .4byte _08164BEC
- .4byte _08164C3C
- .4byte _08164CE0
- .4byte _08164D14
- .4byte _08164D98
- .4byte _08164DA8
- .4byte _08164DB6
-_08164BEC:
- cmp r5, 0x3
- beq _08164BF2
- b _08164DB0
-_08164BF2:
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- lsls r1, r7, 1
- adds r0, r1
- ldr r3, =0x00000cec
- adds r0, r3
- ldrh r0, [r0]
- movs r1, 0x7
- bl __udivsi3
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp]
- bl sub_800A520
- lsls r0, 24
- cmp r0, 0
- bne _08164C18
- b _08164DB6
-_08164C18:
- bl bitmask_all_link_players_but_self
- lsls r0, 24
- lsrs r0, 24
- mov r1, sp
- movs r2, 0x4
- bl SendBlock
- ldr r1, =gSpecialVar_Result
- movs r0, 0x1
- b _08164DB4
- .pool
-_08164C3C:
- bl GetBlockReceivedStatus
- movs r1, 0x3
- ands r1, r0
- cmp r1, 0x3
- beq _08164C4A
- b _08164DB6
-_08164C4A:
- bl ResetBlockReceivedFlags
- ldr r1, =gBlockRecvBuffer
- movs r0, 0x80
- lsls r0, 1
- adds r2, r1, r0
- ldrh r0, [r1]
- ldrh r3, [r2]
- cmp r0, r3
- bhi _08164C60
- ldrh r0, [r2]
-_08164C60:
- str r0, [sp]
- movs r4, 0
- ldr r0, =gSaveBlock2Ptr
- mov r9, r0
-_08164C68:
- adds r1, r4, 0x1
- mov r8, r1
- lsrs r0, r4, 31
- adds r0, r4, r0
- asrs r0, 1
- lsls r7, r0, 24
-_08164C74:
- ldr r0, [sp]
- lsls r0, 24
- lsrs r0, 24
- lsrs r1, r7, 24
- bl sub_8162548
- lsls r0, 16
- lsrs r3, r0, 16
- movs r2, 0
- cmp r2, r4
- bge _08164CB0
- mov r1, r9
- ldr r0, [r1]
- ldr r1, =0x00000cb4
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, r3
- beq _08164CB0
- ldr r6, =gSaveBlock2Ptr
- adds r5, r1, 0
-_08164C9C:
- adds r2, 0x1
- cmp r2, r4
- bge _08164CB0
- ldr r0, [r6]
- lsls r1, r2, 1
- adds r0, r5
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, r3
- bne _08164C9C
-_08164CB0:
- cmp r4, r2
- bne _08164C74
- mov r2, r9
- ldr r0, [r2]
- lsls r1, r4, 1
- ldr r2, =0x00000cb4
- adds r0, r2
- adds r0, r1
- strh r3, [r0]
- mov r4, r8
- cmp r4, 0xD
- ble _08164C68
- ldr r1, =gSpecialVar_Result
- movs r0, 0x2
- b _08164DB4
- .pool
-_08164CE0:
- bl sub_800A520
- lsls r0, 24
- cmp r0, 0
- beq _08164DB6
- bl bitmask_all_link_players_but_self
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gSaveBlock2Ptr
- ldr r1, [r1]
- ldr r3, =0x00000cb4
- adds r1, r3
- movs r2, 0x28
- bl SendBlock
- ldr r1, =gSpecialVar_Result
- movs r0, 0x3
- b _08164DB4
- .pool
-_08164D14:
- bl GetBlockReceivedStatus
- movs r1, 0x3
- ands r1, r0
- cmp r1, 0x3
- bne _08164DB6
- bl ResetBlockReceivedFlags
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r5, =0x00000cb4
- adds r0, r5
- ldr r1, =gBlockRecvBuffer
- movs r2, 0x28
- bl memcpy
- ldr r2, =gTrainerBattleOpponent_A
- ldr r1, [r4]
- lsls r0, r6, 2
- adds r1, r5
- adds r0, r1, r0
- ldrh r0, [r0]
- strh r0, [r2]
- ldr r4, =gTrainerBattleOpponent_B
- lsls r0, r6, 1
- adds r0, 0x1
- lsls r0, 1
- adds r1, r0
- ldrh r0, [r1]
- strh r0, [r4]
- ldrh r0, [r2]
- movs r1, 0
- bl SetBattleFacilityTrainerGfxId
- ldrh r0, [r4]
- movs r1, 0x1
- bl SetBattleFacilityTrainerGfxId
- ldr r0, =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0
- beq _08164DB0
- ldr r0, =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _08164DB0
- ldr r1, =gSpecialVar_Result
- movs r0, 0x4
- b _08164DB4
- .pool
-_08164D98:
- bl sub_800AC34
- ldr r1, =gSpecialVar_Result
- movs r0, 0x5
- b _08164DB4
- .pool
-_08164DA8:
- ldr r0, =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0
- bne _08164DB6
-_08164DB0:
- ldr r1, =gSpecialVar_Result
- movs r0, 0x6
-_08164DB4:
- strh r0, [r1]
-_08164DB6:
- add sp, 0x4
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8164B74
-
- thumb_func_start sub_8164DCC
-sub_8164DCC: @ 8164DCC
- push {lr}
- ldr r0, =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- beq _08164DDA
- bl sub_800AC34
-_08164DDA:
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8164DCC
-
- thumb_func_start sub_8164DE4
-sub_8164DE4: @ 8164DE4
- push {lr}
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000cd6
- adds r0, r1
- ldrh r0, [r0]
- movs r1, 0xF
- bl SetBattleFacilityTrainerGfxId
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8164DE4
-
- thumb_func_start sub_8164E04
-sub_8164E04: @ 8164E04
- push {r4-r6,lr}
- sub sp, 0x20
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 16
- cmp r0, 0
- bne _08164E9A
- ldr r5, =gTrainerBattleOpponent_A
- ldrh r1, [r5]
- mov r0, sp
- bl GetFrontierTrainerName
- mov r0, sp
- bl StripExtCtrlCodes
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r1, =0x00000bd8
- adds r0, r1
- mov r1, sp
- bl StringCopy
- ldr r0, [r4]
- ldr r2, =0x00000beb
- adds r0, r2
- ldrh r1, [r5]
- bl sub_8165B88
- ldr r6, =gBattlerPartyIndexes
- ldrh r0, [r6, 0x2]
- movs r5, 0x64
- muls r0, r5
- ldr r1, =gEnemyParty
- adds r0, r1
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- ldr r1, [r4]
- ldr r2, =0x00000bd6
- adds r1, r2
- strh r0, [r1]
- ldrh r0, [r6]
- muls r0, r5
- ldr r1, =gPlayerParty
- adds r0, r1
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- ldr r1, [r4]
- ldr r2, =0x00000bd4
- adds r1, r2
- strh r0, [r1]
- movs r2, 0
- movs r5, 0xBE
- lsls r5, 4
- ldr r3, =gBattleMons + 0x30
- adds r6, r4, 0
-_08164E7C:
- ldr r0, [r4]
- adds r0, r5
- adds r0, r2
- adds r1, r2, r3
- ldrb r1, [r1]
- strb r1, [r0]
- adds r2, 0x1
- cmp r2, 0xA
- ble _08164E7C
- ldr r0, [r6]
- ldr r1, =gBattleOutcome
- ldrb r1, [r1]
- ldr r2, =0x00000d06
- adds r0, r2
- strb r1, [r0]
-_08164E9A:
- add sp, 0x20
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8164E04
-
- thumb_func_start sub_8164ED8
-sub_8164ED8: @ 8164ED8
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- movs r3, 0
- movs r2, 0
- ldr r4, =0x0000064c
- adds r1, r0, r4
-_08164EEA:
- ldm r1!, {r0}
- adds r3, r0
- adds r2, 0x1
- cmp r2, 0x39
- bls _08164EEA
- ldr r5, =gSaveBlock2Ptr
- ldr r1, [r5]
- ldr r2, =0x00000734
- adds r0, r1, r2
- ldr r0, [r0]
- cmp r0, r3
- beq _08164F0A
- ldr r3, =0x0000064c
- adds r0, r1, r3
- bl sub_8164FB8
-_08164F0A:
- movs r4, 0
- adds r7, r5, 0
- movs r6, 0xEC
- mov r8, r7
-_08164F12:
- adds r0, r4, 0
- muls r0, r6
- movs r1, 0xE7
- lsls r1, 3
- adds r0, r1
- ldr r1, [r7]
- movs r3, 0
- movs r2, 0
- adds r5, r4, 0x1
- adds r1, r0
-_08164F26:
- ldm r1!, {r0}
- adds r3, r0
- adds r2, 0x1
- cmp r2, 0x39
- bls _08164F26
- mov r0, r8
- ldr r2, [r0]
- adds r1, r4, 0
- muls r1, r6
- movs r4, 0x82
- lsls r4, 4
- adds r0, r2, r4
- adds r0, r1
- ldr r0, [r0]
- cmp r0, r3
- beq _08164F52
- movs r3, 0xE7
- lsls r3, 3
- adds r0, r1, r3
- adds r0, r2, r0
- bl sub_8164FB8
-_08164F52:
- adds r4, r5, 0
- cmp r4, 0x4
- ble _08164F12
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8164ED8
-
- thumb_func_start CalcEmeraldBattleTowerChecksum
-CalcEmeraldBattleTowerChecksum: @ 8164F70
- push {r4,lr}
- adds r2, r0, 0
- adds r2, 0xE8
- movs r1, 0
- str r1, [r2]
- movs r3, 0
- adds r4, r0, 0
-_08164F7E:
- ldr r0, [r2]
- ldm r4!, {r1}
- adds r0, r1
- str r0, [r2]
- adds r3, 0x1
- cmp r3, 0x39
- bls _08164F7E
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end CalcEmeraldBattleTowerChecksum
-
- thumb_func_start sub_8164F94
-sub_8164F94: @ 8164F94
- push {r4,lr}
- adds r2, r0, 0
- adds r2, 0xA0
- movs r1, 0
- str r1, [r2]
- movs r3, 0
- adds r4, r0, 0
-_08164FA2:
- ldr r0, [r2]
- ldm r4!, {r1}
- adds r0, r1
- str r0, [r2]
- adds r3, 0x1
- cmp r3, 0x27
- bls _08164FA2
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_8164F94
-
- thumb_func_start sub_8164FB8
-sub_8164FB8: @ 8164FB8
- push {lr}
- movs r1, 0
- movs r2, 0
-_08164FBE:
- stm r0!, {r2}
- adds r1, 0x1
- cmp r1, 0x3A
- bls _08164FBE
- pop {r0}
- bx r0
- thumb_func_end sub_8164FB8
-
- thumb_func_start GetCurrentBattleTowerWinStreak
-GetCurrentBattleTowerWinStreak: @ 8164FCC
- push {lr}
- lsls r0, 24
- lsls r1, 24
- ldr r2, =gSaveBlock2Ptr
- ldr r2, [r2]
- lsrs r0, 23
- lsrs r1, 22
- adds r0, r1
- movs r1, 0xCE
- lsls r1, 4
- adds r2, r1
- adds r2, r0
- ldrh r0, [r2]
- ldr r1, =0x0000270f
- cmp r0, r1
- bls _08164FEE
- adds r0, r1, 0
-_08164FEE:
- pop {r1}
- bx r1
- .pool
- thumb_func_end GetCurrentBattleTowerWinStreak
-
- thumb_func_start sub_8164FFC
-sub_8164FFC: @ 8164FFC
- push {r4,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r1, =gUnknown_085DFA42
- mov r0, sp
- movs r2, 0x4
- bl memcpy
- cmp r4, 0x3
- bls _0816501C
- movs r0, 0x3
- b _08165022
- .pool
-_0816501C:
- mov r1, sp
- adds r0, r1, r4
- ldrb r0, [r0]
-_08165022:
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8164FFC
-
- thumb_func_start sub_816502C
-sub_816502C: @ 816502C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0xC
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r0, 30
- adds r5, r0, 0
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 24
- lsrs r0, 24
- adds r4, r0, 0
- bl sub_8164FFC
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- movs r2, 0x44
- mov r10, r2
- cmp r5, 0
- beq _0816506A
- movs r0, 0x45
- mov r10, r0
-_0816506A:
- ldr r1, =gSpecialVar_Result
- mov r9, r1
- movs r0, 0
- strh r0, [r1]
- adds r0, r5, 0
- adds r1, r4, 0
- bl GetCurrentBattleTowerWinStreak
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x37
- bls _081650DC
- movs r6, 0
- cmp r6, r8
- bge _081650DC
- ldr r7, =gSaveBlock1Ptr
- mov r5, sp
-_0816508C:
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- lsls r1, r6, 1
- ldr r2, =0x00000caa
- adds r0, r2
- adds r0, r1
- ldrh r1, [r0]
- subs r1, 0x1
- movs r0, 0
- strb r1, [r5]
- strb r0, [r5, 0x1]
- movs r0, 0x64
- muls r0, r1
- movs r1, 0x8E
- lsls r1, 2
- adds r4, r0, r1
- ldr r0, [r7]
- adds r0, r4
- mov r1, r10
- bl GetMonData
- cmp r0, 0
- bne _081650D4
- movs r0, 0x1
- mov r2, r9
- strh r0, [r2]
- ldr r0, [r7]
- adds r0, r4
- mov r1, r10
- bl SetMonData
- ldr r0, [r7]
- adds r0, r4
- bl GetRibbonCount
- strb r0, [r5, 0x1]
-_081650D4:
- adds r5, 0x4
- adds r6, 0x1
- cmp r6, r8
- blt _0816508C
-_081650DC:
- ldr r0, =gSpecialVar_Result
- ldrh r0, [r0]
- cmp r0, 0
- beq _08165132
- movs r0, 0x2A
- bl IncrementGameStat
- mov r0, r8
- cmp r0, 0x1
- ble _08165110
- mov r3, sp
- add r2, sp, 0x4
- mov r6, r8
- subs r6, 0x1
-_081650F8:
- ldrb r1, [r3, 0x1]
- ldrb r0, [r2, 0x1]
- cmp r0, r1
- bls _08165108
- ldr r1, [sp]
- ldr r0, [r2]
- str r0, [sp]
- str r1, [r2]
-_08165108:
- adds r2, 0x4
- subs r6, 0x1
- cmp r6, 0
- bne _081650F8
-_08165110:
- mov r0, sp
- ldrb r0, [r0, 0x1]
- cmp r0, 0x4
- bls _08165132
- ldr r2, =gSaveBlock1Ptr
- mov r0, sp
- ldrb r1, [r0]
- movs r0, 0x64
- muls r1, r0
- movs r0, 0x8E
- lsls r0, 2
- adds r1, r0
- ldr r0, [r2]
- adds r0, r1
- mov r1, r10
- bl sub_80EE4DC
-_08165132:
- add sp, 0xC
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_816502C
-
- thumb_func_start sub_816515C
-sub_816515C: @ 816515C
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- ldr r1, =gSaveBlock2Ptr
- ldr r2, [r1]
- ldr r0, =0x00000bec
- adds r7, r2, r0
- ldrb r0, [r2, 0x8]
- adds r5, r1, 0
- cmp r0, 0
- beq _08165194
- ldr r4, =gTowerFemaleFacilityClasses
- ldrb r0, [r2, 0xA]
- ldrb r1, [r2, 0xB]
- adds r0, r1
- ldrb r1, [r2, 0xC]
- adds r0, r1
- ldrb r1, [r2, 0xD]
- adds r0, r1
- movs r1, 0x14
- b _081651A6
- .pool
-_08165194:
- ldr r4, =gTowerMaleFacilityClasses
- ldrb r0, [r2, 0xA]
- ldrb r1, [r2, 0xB]
- adds r0, r1
- ldrb r1, [r2, 0xC]
- adds r0, r1
- ldrb r1, [r2, 0xD]
- adds r0, r1
- movs r1, 0x1E
-_081651A6:
- bl __umodsi3
- adds r0, r4
- ldrb r0, [r0]
- strb r0, [r7, 0x1]
- adds r0, r7, 0
- adds r0, 0xC
- ldr r1, [r5]
- adds r1, 0xA
- bl CopyUnalignedWord
- adds r0, r7, 0x4
- ldr r1, [r5]
- bl StringCopy7
- movs r0, 0x1
- strh r0, [r7, 0x2]
- movs r6, 0x7
- movs r4, 0
- ldr r0, =gSaveBlock1Ptr
- mov r8, r0
- adds r5, r7, 0
- adds r5, 0x10
- ldr r1, =0x00002bbc
- mov r12, r1
- adds r3, r7, 0
- adds r3, 0x28
- adds r2, r7, 0
- adds r2, 0x1C
-_081651E0:
- lsls r0, r4, 1
- mov r9, r0
- mov r1, r8
- ldr r0, [r1]
- add r0, r12
- add r0, r9
- ldrh r0, [r0]
- strh r0, [r5]
- strh r6, [r2]
- adds r0, r6, 0x6
- strh r0, [r3]
- adds r6, 0x1
- adds r5, 0x2
- adds r3, 0x2
- adds r2, 0x2
- adds r4, 0x1
- cmp r4, 0x5
- ble _081651E0
- movs r4, 0
-_08165206:
- movs r0, 0x64
- muls r0, r4
- ldr r1, =gPlayerParty
- adds r0, r1
- movs r1, 0x2C
- muls r1, r4
- adds r1, 0x34
- adds r1, r7, r1
- bl sub_80686FC
- adds r4, 0x1
- cmp r4, 0x2
- ble _08165206
- adds r0, r7, 0
- bl sub_8165328
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_816515C
-
- thumb_func_start GetEreaderTrainerFrontSpriteId
-GetEreaderTrainerFrontSpriteId: @ 8165244
- ldr r1, =gFacilityClassToPicIndex
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r2, =0x00000bed
- adds r0, r2
- ldrb r0, [r0]
- adds r0, r1
- ldrb r0, [r0]
- bx lr
- .pool
- thumb_func_end GetEreaderTrainerFrontSpriteId
-
- thumb_func_start GetEreaderTrainerClassId
-GetEreaderTrainerClassId: @ 8165264
- ldr r1, =gFacilityClassToTrainerClass
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r2, =0x00000bed
- adds r0, r2
- ldrb r0, [r0]
- adds r0, r1
- ldrb r0, [r0]
- bx lr
- .pool
- thumb_func_end GetEreaderTrainerClassId
-
- thumb_func_start GetEreaderTrainerName
-GetEreaderTrainerName: @ 8165284
- push {r4,lr}
- adds r3, r0, 0
- movs r2, 0
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- movs r1, 0xBF
- lsls r1, 4
- adds r4, r0, r1
-_08165294:
- adds r0, r3, r2
- adds r1, r4, r2
- ldrb r1, [r1]
- strb r1, [r0]
- adds r2, 0x1
- cmp r2, 0x4
- ble _08165294
- adds r1, r3, r2
- movs r0, 0xFF
- strb r0, [r1]
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end GetEreaderTrainerName
-
- thumb_func_start ValidateEReaderTrainer
-ValidateEReaderTrainer: @ 81652B4
- push {r4-r6,lr}
- ldr r2, =gSpecialVar_Result
- movs r0, 0
- strh r0, [r2]
- ldr r1, =gSaveBlock2Ptr
- ldr r0, [r1]
- ldr r3, =0x00000bec
- adds r5, r0, r3
- movs r4, 0
- movs r3, 0
- adds r6, r1, 0
- adds r1, r5, 0
-_081652CC:
- ldm r1!, {r0}
- orrs r4, r0
- adds r3, 0x1
- cmp r3, 0x2D
- bls _081652CC
- cmp r4, 0
- bne _081652EC
- movs r0, 0x1
- strh r0, [r2]
- b _08165316
- .pool
-_081652EC:
- movs r4, 0
- movs r3, 0
- adds r2, r5, 0
-_081652F2:
- ldm r2!, {r0}
- adds r4, r0
- adds r3, 0x1
- cmp r3, 0x2D
- bls _081652F2
- ldr r1, [r6]
- ldr r2, =0x00000ca4
- adds r0, r1, r2
- ldr r0, [r0]
- cmp r0, r4
- beq _08165316
- ldr r3, =0x00000bec
- adds r0, r1, r3
- bl sub_816534C
- ldr r1, =gSpecialVar_Result
- movs r0, 0x1
- strh r0, [r1]
-_08165316:
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end ValidateEReaderTrainer
-
- thumb_func_start sub_8165328
-sub_8165328: @ 8165328
- push {r4,lr}
- adds r2, r0, 0
- adds r2, 0xB8
- movs r1, 0
- str r1, [r2]
- movs r3, 0
- adds r4, r0, 0
-_08165336:
- ldr r0, [r2]
- ldm r4!, {r1}
- adds r0, r1
- str r0, [r2]
- adds r3, 0x1
- cmp r3, 0x2D
- bls _08165336
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_8165328
-
- thumb_func_start sub_816534C
-sub_816534C: @ 816534C
- push {lr}
- movs r1, 0
- movs r2, 0
-_08165352:
- stm r0!, {r2}
- adds r1, 0x1
- cmp r1, 0x2E
- bls _08165352
- pop {r0}
- bx r0
- thumb_func_end sub_816534C
-
- thumb_func_start sub_8165360
-sub_8165360: @ 8165360
- push {lr}
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000bfc
- adds r0, r1
- bl FrontierSpeechToString
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8165360
-
- thumb_func_start sub_816537C
-sub_816537C: @ 816537C
- push {lr}
- ldr r0, =gBattleOutcome
- ldrb r0, [r0]
- cmp r0, 0x3
- bne _08165398
- ldr r1, =gStringVar4
- movs r0, 0xFF
- strb r0, [r1]
- b _081653C0
- .pool
-_08165398:
- cmp r0, 0x1
- bne _081653B4
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000c14
- adds r0, r1
- bl FrontierSpeechToString
- b _081653C0
- .pool
-_081653B4:
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000c08
- adds r0, r1
- bl FrontierSpeechToString
-_081653C0:
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_816537C
-
- thumb_func_start sub_81653CC
-sub_81653CC: @ 81653CC
- push {lr}
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000ca8
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _081653E0
- bl sub_80F01B8
-_081653E0:
- movs r0, 0x77
- bl FlagGet
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _081653F8
- bl sub_80F01B8
- movs r0, 0x77
- bl FlagClear
-_081653F8:
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81653CC
-
- thumb_func_start sub_8165404
-sub_8165404: @ 8165404
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x70
- lsls r0, 16
- lsrs r7, r0, 16
- bl GetFacilityEnemyMonLevel
- ldr r0, =0x00000c03
- cmp r7, r0
- beq _08165420
- b _0816554C
-_08165420:
- movs r0, 0
- mov r10, r0
- mov r1, sp
- adds r1, 0x44
- str r1, [sp, 0x64]
-_0816542A:
- mov r2, r10
- lsls r2, 2
- mov r9, r2
- mov r3, r10
- adds r3, 0x1
- str r3, [sp, 0x60]
- mov r0, r9
- add r0, r10
- lsls r0, 2
- ldr r6, =gUnknown_085DD6D0
- adds r5, r0, r6
-_08165440:
- bl Random
- adds r4, r0, 0
- bl Random
- lsls r4, 16
- lsrs r4, 16
- lsls r0, 16
- orrs r4, r0
- str r4, [sp, 0x44]
- ldr r0, =0x0000ef2a
- adds r1, r4, 0
- bl IsShinyOtIdPersonality
- lsls r0, 24
- lsrs r7, r0, 24
- cmp r7, 0
- bne _08165440
- ldr r0, [sp, 0x44]
- bl GetNatureFromPersonality
- ldrb r1, [r5, 0x4]
- lsls r0, 24
- lsrs r0, 24
- cmp r1, r0
- bne _08165440
- movs r0, 0x64
- mov r6, r10
- muls r6, r0
- ldr r1, =gPlayerParty + 300
- mov r8, r1
- adds r0, r6, r1
- mov r5, r9
- add r5, r10
- lsls r5, 2
- ldr r2, =gUnknown_085DD6D0
- adds r3, r5, r2
- ldrh r1, [r3]
- ldrb r2, [r3, 0x3]
- ldrb r3, [r3, 0x2]
- mov r12, r3
- movs r4, 0x1
- str r4, [sp]
- mov r3, r10
- str r3, [sp, 0x4]
- str r4, [sp, 0x8]
- ldr r4, =0x0000ef2a
- str r4, [sp, 0xC]
- mov r3, r12
- bl CreateMon
- str r7, [sp, 0x44]
- movs r3, 0
- mov r4, r8
- ldr r0, =gUnknown_085DD6D5
- adds r5, r0
-_081654B0:
- adds r1, r3, 0
- adds r1, 0x1A
- adds r2, r5, r3
- adds r0, r6, r4
- bl SetMonData
- ldr r0, [sp, 0x44]
- adds r0, 0x1
- str r0, [sp, 0x44]
- adds r3, r0, 0
- cmp r3, 0x5
- ble _081654B0
- movs r0, 0
- str r0, [sp, 0x44]
- movs r1, 0
- movs r6, 0x64
- mov r4, r10
- muls r4, r6
- ldr r7, =gUnknown_085DD6DC
- ldr r6, =gPlayerParty + 300
- mov r0, r9
- add r0, r10
- lsls r5, r0, 2
-_081654DE:
- lsls r0, r1, 1
- adds r0, r5
- adds r0, r7
- ldrh r1, [r0]
- ldr r0, [sp, 0x64]
- ldrb r2, [r0]
- adds r0, r4, r6
- bl SetMonMoveSlot
- ldr r0, [sp, 0x44]
- adds r0, 0x1
- str r0, [sp, 0x44]
- adds r1, r0, 0
- cmp r1, 0x3
- ble _081654DE
- movs r1, 0x64
- mov r4, r10
- muls r4, r1
- ldr r0, =gPlayerParty + 300
- adds r4, r0
- adds r0, r4, 0
- movs r1, 0x7
- ldr r2, =gTrainers + 804 * 0x28 + 0x4 @ TRAINER_STEVEN name
- bl SetMonData
- movs r0, 0
- str r0, [sp, 0x44]
- adds r0, r4, 0
- movs r1, 0x31
- ldr r2, [sp, 0x64]
- bl SetMonData
- adds r0, r4, 0
- bl CalculateMonStats
- ldr r2, [sp, 0x60]
- mov r10, r2
- cmp r2, 0x2
- bgt _0816552E
- b _0816542A
-_0816552E:
- b _0816585A
- .pool
-_0816554C:
- movs r0, 0xFA
- lsls r0, 1
- cmp r7, r0
- bne _08165564
- add r0, sp, 0x10
- ldr r1, =gGameLanguage
- ldrb r1, [r1]
- strb r1, [r0]
- b _0816585A
- .pool
-_08165564:
- ldr r0, =0x0000012b
- cmp r7, r0
- bls _0816556C
- b _081656E8
-_0816556C:
- bl GetFacilityEnemyMonLevel
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x50]
- adds r0, r7, 0
- bl GetFrontierTrainerFixedIvs
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x4C]
- bl Random
- adds r4, r0, 0
- bl Random
- lsls r4, 16
- lsrs r4, 16
- lsls r0, 16
- orrs r4, r0
- str r4, [sp, 0x58]
- movs r3, 0
- mov r10, r3
- mov r6, sp
- adds r6, 0x44
- str r6, [sp, 0x64]
- mov r0, sp
- adds r0, 0x48
- str r0, [sp, 0x5C]
-_081655A6:
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- mov r0, r10
- adds r0, 0x12
- lsls r0, 1
- ldr r2, =0x00000cb4
- adds r1, r2
- adds r1, r0
- ldrh r1, [r1]
- str r1, [sp, 0x54]
- movs r6, 0x64
- mov r3, r10
- muls r3, r6
- mov r8, r3
- ldr r0, =gPlayerParty + 300
- mov r9, r0
- mov r0, r8
- add r0, r9
- ldr r6, =gFacilityTrainerMons
- ldr r4, [r6]
- lsls r5, r1, 4
- adds r4, r5, r4
- ldrh r1, [r4]
- ldr r3, [sp, 0x50]
- lsls r2, r3, 24
- ldrb r3, [r4, 0xC]
- mov r12, r3
- ldr r3, [sp, 0x4C]
- str r3, [sp]
- ldrb r4, [r4, 0xB]
- str r4, [sp, 0x4]
- ldr r3, [sp, 0x58]
- str r3, [sp, 0x8]
- lsrs r2, 24
- mov r3, r12
- bl CreateMonWithEVSpreadPersonalityOTID
- movs r0, 0xFF
- str r0, [sp, 0x48]
- movs r0, 0
- str r0, [sp, 0x44]
- movs r2, 0
- mov r0, r10
- adds r0, 0x1
- str r0, [sp, 0x60]
- mov r4, r8
- mov r3, r9
-_08165604:
- ldr r0, [r6]
- adds r0, r5, r0
- lsls r1, r2, 1
- adds r0, 0x2
- adds r0, r1
- ldrh r1, [r0]
- lsls r2, 24
- lsrs r2, 24
- adds r0, r4, r3
- str r3, [sp, 0x68]
- bl SetMonMoveSlot
- ldr r0, [r6]
- adds r0, r5, r0
- ldr r2, [sp, 0x44]
- lsls r1, r2, 1
- adds r0, 0x2
- adds r0, r1
- ldrh r0, [r0]
- ldr r3, [sp, 0x68]
- cmp r0, 0xDA
- bne _08165634
- movs r0, 0
- str r0, [sp, 0x48]
-_08165634:
- adds r0, r2, 0x1
- str r0, [sp, 0x44]
- adds r2, r0, 0
- cmp r2, 0x3
- ble _08165604
- movs r1, 0x64
- mov r4, r10
- muls r4, r1
- ldr r0, =gPlayerParty + 300
- adds r4, r0
- adds r0, r4, 0
- movs r1, 0x20
- ldr r2, [sp, 0x5C]
- bl SetMonData
- ldr r0, =gFacilityTrainerMons
- ldr r1, [r0]
- ldr r2, [sp, 0x54]
- lsls r0, r2, 4
- adds r0, r1
- ldrb r2, [r0, 0xA]
- lsls r2, 1
- ldr r0, =gBattleFrontierHeldItems
- adds r2, r0
- adds r0, r4, 0
- movs r1, 0xC
- bl SetMonData
- movs r0, 0
- str r0, [sp, 0x44]
- movs r2, 0
- ldr r0, =gFacilityTrainers
- ldr r1, [r0]
- movs r0, 0x34
- muls r0, r7
- adds r0, r1
- adds r3, r0, 0x4
-_0816567E:
- mov r1, sp
- adds r1, r2
- adds r1, 0x10
- adds r0, r3, r2
- ldrb r0, [r0]
- strb r0, [r1]
- ldr r0, [sp, 0x44]
- adds r0, 0x1
- str r0, [sp, 0x44]
- adds r2, r0, 0
- cmp r2, 0x7
- ble _0816567E
- movs r3, 0x64
- mov r4, r10
- muls r4, r3
- ldr r0, =gPlayerParty + 300
- adds r4, r0
- adds r0, r4, 0
- movs r1, 0x7
- add r2, sp, 0x10
- bl SetMonData
- adds r0, r7, 0
- bl IsFrontierTrainerFemale
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x44]
- adds r0, r4, 0
- movs r1, 0x31
- ldr r2, [sp, 0x64]
- bl SetMonData
- ldr r6, [sp, 0x60]
- mov r10, r6
- cmp r6, 0x1
- bgt _081656CA
- b _081655A6
-_081656CA:
- b _0816585A
- .pool
-_081656E8:
- ldr r0, =0x0000018f
- cmp r7, r0
- bls _081656F0
- b _081657F0
-_081656F0:
- ldr r1, =0xfffffed4
- adds r0, r7, r1
- lsls r0, 16
- lsrs r7, r0, 16
- movs r2, 0
- mov r10, r2
- mov r3, sp
- adds r3, 0x44
- str r3, [sp, 0x64]
- add r5, sp, 0x18
- ldr r6, =0x000015fc
- mov r9, r6
- ldr r0, =0x0000ffff
- mov r8, r0
- movs r1, 0x24
- str r1, [sp, 0x6C]
-_08165710:
- ldr r1, =gSaveBlock2Ptr
- movs r0, 0xEC
- adds r4, r7, 0
- muls r4, r0
- movs r2, 0xE7
- lsls r2, 3
- adds r4, r2
- ldr r0, [r1]
- adds r4, r0, r4
- ldr r3, =0x00000cb4
- adds r0, r3
- ldr r6, [sp, 0x6C]
- adds r0, r6
- ldrh r1, [r0]
- movs r0, 0x2C
- muls r1, r0
- adds r1, r4, r1
- adds r0, r5, 0
- adds r1, 0x34
- ldm r1!, {r2,r3,r6}
- stm r0!, {r2,r3,r6}
- ldm r1!, {r2,r3,r6}
- stm r0!, {r2,r3,r6}
- ldm r1!, {r2,r3,r6}
- stm r0!, {r2,r3,r6}
- ldm r1!, {r2,r3}
- stm r0!, {r2,r3}
- adds r1, r4, 0x4
- add r0, sp, 0x10
- bl StringCopy
- adds r4, 0xE4
- ldrb r0, [r4]
- cmp r0, 0x1
- bne _0816578C
- ldrh r0, [r5, 0x20]
- mov r6, r8
- ands r0, r6
- cmp r0, r9
- beq _0816579C
- mov r1, sp
- adds r1, 0x3D
- movs r0, 0xFF
- strb r0, [r1]
- add r0, sp, 0x38
- movs r1, 0x1
- bl ConvertInternationalString
- b _0816579C
- .pool
-_0816578C:
- ldrh r0, [r5, 0x20]
- mov r1, r8
- ands r0, r1
- cmp r0, r9
- bne _0816579C
- add r1, sp, 0x10
- movs r0, 0xFF
- strb r0, [r1, 0x5]
-_0816579C:
- movs r0, 0x64
- mov r4, r10
- muls r4, r0
- ldr r0, =gPlayerParty + 300
- adds r4, r0
- adds r0, r4, 0
- adds r1, r5, 0
- movs r2, 0x1
- bl sub_8068338
- adds r0, r4, 0
- movs r1, 0x7
- add r2, sp, 0x10
- bl SetMonData
- movs r2, 0x96
- lsls r2, 1
- adds r0, r7, r2
- lsls r0, 16
- lsrs r0, 16
- bl IsFrontierTrainerFemale
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x44]
- adds r0, r4, 0
- movs r1, 0x31
- ldr r2, [sp, 0x64]
- bl SetMonData
- ldr r3, [sp, 0x6C]
- adds r3, 0x2
- str r3, [sp, 0x6C]
- movs r6, 0x1
- add r10, r6
- mov r0, r10
- cmp r0, 0x1
- ble _08165710
- b _0816585A
- .pool
-_081657F0:
- ldr r1, =0xfffffe70
- adds r0, r7, r1
- lsls r0, 16
- lsrs r7, r0, 16
- movs r2, 0
- mov r10, r2
- mov r3, sp
- adds r3, 0x44
- str r3, [sp, 0x64]
- ldr r6, =gSaveBlock2Ptr
- mov r8, r6
- movs r5, 0x24
- lsls r0, r7, 4
- adds r0, r7
- lsls r0, 2
- adds r6, r0, 0
- adds r6, 0xDC
-_08165812:
- movs r0, 0x64
- mov r4, r10
- muls r4, r0
- ldr r0, =gPlayerParty + 300
- adds r4, r0
- mov r1, r8
- ldr r0, [r1]
- adds r1, r0, r6
- ldr r2, =0x00000cb4
- adds r0, r2
- adds r0, r5
- ldrb r2, [r0]
- adds r0, r4, 0
- bl CreateApprenticeMon
- movs r3, 0xC8
- lsls r3, 1
- adds r0, r7, r3
- lsls r0, 16
- lsrs r0, 16
- bl IsFrontierTrainerFemale
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x44]
- adds r0, r4, 0
- movs r1, 0x31
- ldr r2, [sp, 0x64]
- bl SetMonData
- adds r5, 0x2
- movs r0, 0x1
- add r10, r0
- mov r1, r10
- cmp r1, 0x1
- ble _08165812
-_0816585A:
- add sp, 0x70
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8165404
-
- thumb_func_start sub_816587C
-sub_816587C: @ 816587C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x14
- adds r6, r0, 0
- adds r5, r1, 0
- movs r2, 0
- adds r1, r6, 0
- adds r3, r6, 0
- adds r3, 0x58
-_08165894:
- ldrh r0, [r1, 0x1C]
- cmp r0, 0
- beq _0816589C
- adds r2, 0x1
-_0816589C:
- adds r1, 0x2C
- cmp r1, r3
- ble _08165894
- cmp r2, 0x3
- beq _081658B4
- adds r0, r5, 0
- movs r1, 0
- movs r2, 0xEC
- bl memset
- movs r0, 0
- b _081659BE
-_081658B4:
- ldrb r0, [r6]
- strb r0, [r5]
- ldrh r0, [r6, 0x2]
- strh r0, [r5, 0x2]
- movs r2, 0
- ldr r0, =gUnknown_085DCF40
- ldrb r1, [r0]
- ldrb r3, [r6, 0x1]
- mov r12, r0
- adds r4, r5, 0x4
- adds r7, r6, 0x4
- movs r0, 0xC
- adds r0, r5
- mov r9, r0
- movs r0, 0xC
- adds r0, r6
- mov r8, r0
- adds r0, r5, 0
- adds r0, 0x10
- str r0, [sp, 0x4]
- movs r0, 0x10
- adds r0, r6
- mov r10, r0
- adds r0, r5, 0
- adds r0, 0x1C
- str r0, [sp, 0x8]
- adds r0, 0xC
- str r0, [sp, 0xC]
- adds r0, 0x90
- str r0, [sp, 0x10]
- cmp r1, r3
- beq _08165904
- mov r1, r12
-_081658F6:
- adds r1, 0x2
- adds r2, 0x1
- cmp r2, 0x51
- bgt _08165904
- ldrb r0, [r1]
- cmp r0, r3
- bne _081658F6
-_08165904:
- cmp r2, 0x52
- beq _08165918
- lsls r0, r2, 1
- mov r1, r12
- adds r1, 0x1
- adds r0, r1
- ldrb r0, [r0]
- b _0816591A
- .pool
-_08165918:
- movs r0, 0x2B
-_0816591A:
- strb r0, [r5, 0x1]
- movs r2, 0
- adds r3, r7, 0
-_08165920:
- adds r0, r4, r2
- adds r1, r3, r2
- ldrb r1, [r1]
- strb r1, [r0]
- adds r2, 0x1
- cmp r2, 0x7
- ble _08165920
- movs r2, 0
- mov r4, r9
- mov r3, r8
-_08165934:
- adds r0, r4, r2
- adds r1, r3, r2
- ldrb r1, [r1]
- strb r1, [r0]
- adds r2, 0x1
- cmp r2, 0x3
- ble _08165934
- mov r3, r10
- ldr r1, [sp, 0x4]
- movs r2, 0x5
-_08165948:
- ldrh r0, [r3]
- strh r0, [r1]
- adds r3, 0x2
- adds r1, 0x2
- subs r2, 0x1
- cmp r2, 0
- bge _08165948
- ldr r3, =gUnknown_085DFA46
- ldr r1, [sp, 0x8]
- movs r2, 0x5
-_0816595C:
- ldrh r0, [r3]
- strh r0, [r1]
- adds r3, 0x2
- adds r1, 0x2
- subs r2, 0x1
- cmp r2, 0
- bge _0816595C
- ldr r3, =gUnknown_085DFA52
- ldr r1, [sp, 0xC]
- movs r2, 0x5
-_08165970:
- ldrh r0, [r3]
- strh r0, [r1]
- adds r3, 0x2
- adds r1, 0x2
- subs r2, 0x1
- cmp r2, 0
- bge _08165970
- adds r2, r6, 0
- adds r3, r5, 0
- movs r4, 0x58
- adds r4, r2
- mov r8, r4
-_08165988:
- adds r1, r3, 0
- adds r1, 0x34
- adds r0, r2, 0
- adds r0, 0x1C
- ldm r0!, {r4,r6,r7}
- stm r1!, {r4,r6,r7}
- ldm r0!, {r4,r6,r7}
- stm r1!, {r4,r6,r7}
- ldm r0!, {r4,r6,r7}
- stm r1!, {r4,r6,r7}
- ldm r0!, {r6,r7}
- stm r1!, {r6,r7}
- adds r2, 0x2C
- adds r3, 0x2C
- cmp r2, r8
- ble _08165988
- movs r0, 0
- str r0, [sp]
- ldr r2, =0x0500000b
- mov r0, sp
- ldr r1, [sp, 0x10]
- bl CpuSet
- adds r0, r5, 0
- bl CalcEmeraldBattleTowerChecksum
- movs r0, 0x1
-_081659BE:
- add sp, 0x14
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_816587C
thumb_func_start sub_81659DC
sub_81659DC: @ 81659DC
@@ -2264,7 +43,7 @@ _08165A14:
ldrh r0, [r4, 0x2]
strh r0, [r6, 0x2]
movs r2, 0
- ldr r0, =gUnknown_085DCF40
+ ldr r0, =sRubyFacilityClassToEmerald
ldrb r1, [r0, 0x1]
ldrb r3, [r4, 0x1]
mov r12, r0
@@ -2361,7 +140,7 @@ _08165AB0:
cmp r2, r8
ble _08165AB0
adds r0, r6, 0
- bl sub_8164F94
+ bl CalcRubyBattleTowerChecksum
movs r0, 0x1
_08165AD8:
add sp, 0x4
@@ -3201,7 +980,7 @@ _08166174:
lsls r3, 3
adds r0, r1, r3
adds r0, r2, r0
- bl sub_8164FB8
+ bl ClearBattleTowerRecord
_08166180:
movs r0, 0
_08166182:
diff --git a/asm/rom_8011DC0.s b/asm/rom_8011DC0.s
index 415ebfc0c..1c02f93cd 100644
--- a/asm/rom_8011DC0.s
+++ b/asm/rom_8011DC0.s
@@ -10934,7 +10934,7 @@ sub_801B1E8: @ 801B1E8
ldr r0, [r0]
ldr r1, =0x00000bec
adds r0, r1
- bl sub_816534C
+ bl ClearEReaderTrainer
pop {r0}
bx r0
.pool
diff --git a/data/battle_tower.s b/data/battle_tower.s
index 296db3577..63eec4347 100644
--- a/data/battle_tower.s
+++ b/data/battle_tower.s
@@ -33,7 +33,7 @@ gTowerMaleTrainerGfxIds:: @ 85DCF0E
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
+sRubyFacilityClassToEmerald:: @ 85DCF40
.byte 0x00, 0x0b, 0x01, 0x01, 0x02, 0x06, 0x03, 0x0d, 0x04, 0x0e, 0x05, 0x0f, 0x06, 0x10, 0x07, 0x11, 0x08, 0x03, 0x09, 0x12, 0x0a, 0x0c, 0x0b, 0x13, 0x0c, 0x14, 0x0d, 0x15, 0x0e, 0x17, 0x0f, 0x07
.byte 0x10, 0x0a, 0x11, 0x19, 0x12, 0x1a, 0x13, 0x1b, 0x14, 0x1d, 0x15, 0x1e, 0x16, 0x1f, 0x17, 0x20, 0x18, 0x21, 0x19, 0x22, 0x1a, 0x23, 0x1b, 0x24, 0x1c, 0x25, 0x1d, 0x26, 0x1e, 0x27, 0x1f, 0x28
.byte 0x20, 0x29, 0x21, 0x2a, 0x22, 0x09, 0x23, 0x16, 0x24, 0x2b, 0x25, 0x2c, 0x26, 0x2d, 0x27, 0x2e, 0x28, 0x2f, 0x29, 0x30, 0x2a, 0x31, 0x2b, 0x32, 0x2c, 0x33, 0x2d, 0x34, 0x2e, 0x04, 0x2f, 0x35
@@ -640,7 +640,7 @@ gUnknown_085DD690:: @ 85DD690
.4byte gUnknown_085DD0F0
.4byte gUnknown_085DD104
-gUnknown_085DD6D0:: @ 85DD6D0
+sStevenMons:: @ 85DD6D0
.byte 0x8f, 0x01, 0x1f, 0x2a, 0x02
gUnknown_085DD6D5:: @ 85DD6D5
@@ -685,7 +685,7 @@ gUnknown_085DF96C:: @ 85DF96C
.4byte sub_81620F4
.4byte ChooseNextBattleTowerTrainer
.4byte sub_81621C0
- .4byte sub_816502C
+ .4byte AwardBattleTowerRibbons
.4byte SaveBattleTowerProgress
.4byte sub_8163914
.4byte nullsub_61
diff --git a/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc b/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc
index 1ecf08399..eb21ead54 100644
--- a/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc
+++ b/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc
@@ -15,7 +15,7 @@ SootopolisCity_MysteryEventsHouse_B1F_EventScript_227E68:: @ 8227E68
lockall
applymovement 255, SootopolisCity_MysteryEventsHouse_B1F_Movement_227EF3
waitmovement 0
- special sub_8165360
+ special CopyEReaderTrainerGreeting
msgbox gStringVar4, 4
closemessage
setvar VAR_0x8004, SPECIAL_BATTLE_EREADER
diff --git a/data/specials.inc b/data/specials.inc
index 09f74cb51..08e12e5e0 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -246,7 +246,7 @@ gSpecials:: @ 81DBA64
def_special sub_8161F74
def_special CallBattleDomeFunction
def_special sub_8195960
- def_special sub_8165360
+ def_special CopyEReaderTrainerGreeting
def_special DoSpecialTrainerBattle
def_special sub_81A5238
def_special sub_81A5E74
diff --git a/include/battle_tower.h b/include/battle_tower.h
index a47007122..4b68be923 100644
--- a/include/battle_tower.h
+++ b/include/battle_tower.h
@@ -7,15 +7,14 @@
struct RSBattleTowerRecord
{
- /*0x00*/ u8 battleTowerLevelType; // 0 = level 50, 1 = level 100
- /*0x01*/ u8 trainerClass;
+ /*0x00*/ u8 lvlMode; // 0 = level 50, 1 = level 100
+ /*0x01*/ u8 facilityClass;
/*0x02*/ u16 winStreak;
/*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1];
/*0x0C*/ u8 trainerId[4];
/*0x10*/ u16 greeting[6];
/*0x1C*/ struct UnknownPokemonStruct party[3];
/*0xA0*/ u32 checksum;
- /*0xA4*/ u16 unk_11c8;
};
union BattleTowerRecord
@@ -54,12 +53,14 @@ extern const struct FacilityMon *gFacilityTrainerMons;
u16 GetCurrentBattleTowerWinStreak(u8, u8);
void sub_81659DC(struct RSBattleTowerRecord *a0, struct RSBattleTowerRecord *a1);
-bool32 sub_816587C(union BattleTowerRecord *, union BattleTowerRecord *);
+bool32 RubyBattleTowerRecordToEmerald(struct RSBattleTowerRecord *src, struct EmeraldBattleTowerRecord *dst);
void CalcEmeraldBattleTowerChecksum(struct EmeraldBattleTowerRecord *);
-void PutNewBattleTowerRecord(union BattleTowerRecord *);
+void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm);
void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId);
void FrontierSpeechToString(const u16 *words);
void GetFrontierTrainerName(u8 *dest, u16 trainerIdx);
void GetEreaderTrainerName(u8 *dest);
+void FillFrontierTrainerParty(u8 monsCount);
+void FillFrontierTrainersParties(u8 monsCount);
#endif //GUARD_BATTLE_TOWER_H
diff --git a/include/global.h b/include/global.h
index 6840d5fe2..a7b50278c 100644
--- a/include/global.h
+++ b/include/global.h
@@ -288,7 +288,7 @@ struct Apprentice
u8 lvlMode:2; // + 1
u8 field_1;
u8 number;
- struct ApprenticeMon monData[3];
+ struct ApprenticeMon party[3];
u16 easyChatWords[6];
u8 playerId[4];
u8 playerName[PLAYER_NAME_LENGTH];
@@ -383,8 +383,8 @@ struct BattleFrontier
/*0x738*/ struct EmeraldBattleTowerRecord towerRecords[5]; // From record mixing.
/*0xBD4*/ u16 field_BD4;
/*0xBD6*/ u16 field_BD6;
- /*0xBD8*/ u8 field_BD8[11];
- /*0xBE3*/ u8 field_BE3[8];
+ /*0xBD8*/ u8 field_BD8[PLAYER_NAME_LENGTH + 1];
+ /*0xBE3*/ u8 field_BE0[POKEMON_NAME_LENGTH + 1];
/*0xBEB*/ u8 field_BEB;
/*0xBEC*/ struct BattleTowerEReaderTrainer ereaderTrainer;
/*0xCA8*/ u8 field_CA8;
@@ -395,15 +395,12 @@ struct BattleFrontier
/*0xCA9*/ u8 field_CA9_d:1; // 0x20
/*0xCA9*/ u8 field_CA9_e:1; // 0x40
/*0xCA9*/ u8 field_CA9_f:1; // 0x80
- /*0xCAA*/ u16 field_CAA[3];
+ /*0xCAA*/ u16 selectedPartyMons[3];
/*0xCB0*/ u16 field_CB0;
/*0xCB2*/ u16 curChallengeBattleNum; // In case of battle pyramid, the floor.
- /*0xCB4*/ u16 battledTrainerIds[17];
- u16 field_CD6;
- u16 field_CD8;
- u16 field_CDA;
+ /*0xCB4*/ u16 field_CB4[20];
/*0xCDC*/ u32 field_CDC;
- /*0xCE0*/ u16 field_CE0[4][2];
+ /*0xCE0*/ u16 winStreaks[4][2];
/*0xCF0*/ u16 field_CF0[2];
/*0xCF4*/ u16 field_CF4[2];
/*0xCF8*/ u16 field_CF8[2];
diff --git a/src/battle_setup.c b/src/battle_setup.c
index b5ae0d6ea..c18176706 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -31,6 +31,7 @@
#include "string_util.h"
#include "overworld.h"
#include "field_weather.h"
+#include "battle_tower.h"
#include "gym_leader_rematch.h"
#include "constants/map_types.h"
#include "constants/battle_frontier.h"
@@ -67,8 +68,6 @@ extern u16 sub_81D6180(u8 localId);
extern bool8 GetBattlePyramidTrainerFlag(u8 eventObjId);
extern bool8 GetTrainerHillTrainerFlag(u8 eventObjId);
extern bool8 sub_81D5C18(void);
-extern void sub_816306C(u8 a0);
-extern void sub_8163048(u8 a0);
extern void sub_81A9B04(void);
extern void sub_81D639C(void);
extern void sub_81D6384(void);
@@ -885,8 +884,8 @@ u8 sub_80B100C(s32 arg0)
return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)];
}
- var = gSaveBlock2Ptr->frontier.battledTrainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 0]
- + gSaveBlock2Ptr->frontier.battledTrainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 1];
+ var = gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 0]
+ + gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 1];
return sUnknown_0854FE98[var % ARRAY_COUNT(sUnknown_0854FE98)];
}
@@ -1264,7 +1263,7 @@ void BattleSetup_StartTrainerBattle(void)
if (gNoOfApproachingTrainers == 2)
{
- sub_816306C(1);
+ FillFrontierTrainersParties(1);
ZeroMonData(&gEnemyParty[1]);
ZeroMonData(&gEnemyParty[2]);
ZeroMonData(&gEnemyParty[4]);
@@ -1272,7 +1271,7 @@ void BattleSetup_StartTrainerBattle(void)
}
else
{
- sub_8163048(1);
+ FillFrontierTrainerParty(1);
ZeroMonData(&gEnemyParty[1]);
ZeroMonData(&gEnemyParty[2]);
}
diff --git a/src/battle_tower.c b/src/battle_tower.c
index 75253792e..25a46d073 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -18,6 +18,10 @@
#include "trainer_see.h"
#include "new_game.h"
#include "string_util.h"
+#include "data2.h"
+#include "link.h"
+#include "field_message_box.h"
+#include "tv.h"
#include "constants/battle_frontier.h"
#include "constants/trainers.h"
#include "constants/event_objects.h"
@@ -44,21 +48,23 @@ extern const u8 gUnknown_085DF9EC[];
extern const u16 gBattleFrontierHeldItems[];
// This file's functions.
-void sub_8164ED8(void);
+void ValidateBattleTowerRecordChecksums(void);
void SaveCurrentWinStreak(void);
void sub_8165B20(void);
void sub_8165E18(void);
-void sub_816537C(void);
-void sub_8164FB8(struct EmeraldBattleTowerRecord *record);
+void CopyEReaderTrainerFarewellMessage(void);
+void ClearBattleTowerRecord(struct EmeraldBattleTowerRecord *record);
u16 GetCurrentBattleTowerWinStreak(u8 lvlMode, u8 battleMode);
-void sub_816534C(void *);
u16 sub_8162548(u8, u8);
-void sub_81630C4(u16 trainerId, u8 firstMonId, u8 monCount);
+static void FillTrainerParty(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);
void sub_8165404(u16 trainerId);
+void sub_8165B88(u8 *dst, u16 trainerId);
+void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer);
+void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer);
// code
void sub_8161F74(void)
@@ -77,9 +83,9 @@ void sub_8161F94(void)
gSaveBlock2Ptr->frontier.field_CA9_b = 0;
sub_81A3ACC();
if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_085DF9AC[battleMode][lvlMode]))
- gSaveBlock2Ptr->frontier.field_CE0[battleMode][lvlMode] = 0;
+ gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] = 0;
- sub_8164ED8();
+ ValidateBattleTowerRecordChecksums();
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
gTrainerBattleOpponent_A = 0;
}
@@ -115,7 +121,7 @@ void sub_81620F4(void)
case 0:
break;
case 1:
- gSaveBlock2Ptr->frontier.field_CE0[battleMode][lvlMode] = gSpecialVar_0x8006;
+ gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] = gSpecialVar_0x8006;
break;
case 2:
if (gSpecialVar_0x8006)
@@ -132,7 +138,7 @@ void sub_81620F4(void)
void sub_81621C0(void)
{
if (gTrainerBattleOpponent_A == BATTLE_TOWER_EREADER_TRAINER_ID)
- sub_816534C(&gSaveBlock2Ptr->frontier.ereaderTrainer);
+ ClearEReaderTrainer(&gSaveBlock2Ptr->frontier.ereaderTrainer);
if (gSaveBlock2Ptr->frontier.field_D04 < 9999)
gSaveBlock2Ptr->frontier.field_D04++;
@@ -227,15 +233,15 @@ void ChooseNextBattleTowerTrainer(void)
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];
+ gTrainerBattleOpponent_A = gSaveBlock2Ptr->frontier.field_CB4[id * 2];
+ gTrainerBattleOpponent_B = gSaveBlock2Ptr->frontier.field_CB4[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;
+ gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
}
else
{
@@ -247,7 +253,7 @@ void ChooseNextBattleTowerTrainer(void)
// Ensure trainer wasn't previously fought in this challenge.
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
{
- if (gSaveBlock2Ptr->frontier.battledTrainerIds[i] == id)
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == id)
break;
}
if (i == gSaveBlock2Ptr->frontier.curChallengeBattleNum)
@@ -257,7 +263,7 @@ void ChooseNextBattleTowerTrainer(void)
gTrainerBattleOpponent_A = id;
SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
if (gSaveBlock2Ptr->frontier.curChallengeBattleNum + 1 < 7)
- gSaveBlock2Ptr->frontier.battledTrainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
+ gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
}
}
}
@@ -522,13 +528,13 @@ u8 GetBattleFacilityTrainerGfxId(u16 trainerId)
}
}
-void PutNewBattleTowerRecord(union BattleTowerRecord *newRecord)
+void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm)
{
u16 slotValues[6];
u16 slotIds[6];
s32 i, j, k;
s32 slotsCount = 0;
- struct EmeraldBattleTowerRecord *newRecordEm = &newRecord->emerald;
+ struct EmeraldBattleTowerRecord *newRecord = newRecordEm; // Needed to match.
// Find a record slot of the same player and replace it.
for (i = 0; i < 5; i++)
@@ -536,7 +542,7 @@ void PutNewBattleTowerRecord(union BattleTowerRecord *newRecord)
k = 0;
for (j = 0; j < 4; j++)
{
- if (gSaveBlock2Ptr->frontier.towerRecords[i].trainerId[j] != newRecordEm->trainerId[j])
+ if (gSaveBlock2Ptr->frontier.towerRecords[i].trainerId[j] != newRecord->trainerId[j])
break;
}
if (j == 4)
@@ -544,9 +550,9 @@ void PutNewBattleTowerRecord(union BattleTowerRecord *newRecord)
for (k = 0; k < PLAYER_NAME_LENGTH; k++)
{
// BUG: Wrong variable used, 'j' instead of 'k'.
- if (gSaveBlock2Ptr->frontier.towerRecords[i].name[j] != newRecordEm->name[j])
+ if (gSaveBlock2Ptr->frontier.towerRecords[i].name[j] != newRecord->name[j])
break;
- if (newRecordEm->name[j] == EOS)
+ if (newRecord->name[j] == EOS)
{
k = PLAYER_NAME_LENGTH;
break;
@@ -559,7 +565,7 @@ void PutNewBattleTowerRecord(union BattleTowerRecord *newRecord)
}
if (i < 5)
{
- gSaveBlock2Ptr->frontier.towerRecords[i] = *newRecordEm;
+ gSaveBlock2Ptr->frontier.towerRecords[i] = *newRecord;
return;
}
@@ -571,7 +577,7 @@ void PutNewBattleTowerRecord(union BattleTowerRecord *newRecord)
}
if (i < 5)
{
- gSaveBlock2Ptr->frontier.towerRecords[i] = *newRecordEm;
+ gSaveBlock2Ptr->frontier.towerRecords[i] = *newRecord;
return;
}
@@ -607,7 +613,7 @@ void PutNewBattleTowerRecord(union BattleTowerRecord *newRecord)
}
i = Random() % slotsCount;
- gSaveBlock2Ptr->frontier.towerRecords[slotIds[i]] = *newRecordEm;
+ gSaveBlock2Ptr->frontier.towerRecords[slotIds[i]] = *newRecord;
}
u8 GetFrontierTrainerFrontSpriteId(u16 trainerId)
@@ -822,17 +828,17 @@ bool8 IsFrontierTrainerFemale(u16 trainerId)
return FALSE;
}
-void sub_8163048(u8 monsCount)
+void FillFrontierTrainerParty(u8 monsCount)
{
ZeroEnemyPartyMons();
- sub_81630C4(gTrainerBattleOpponent_A, 0, monsCount);
+ FillTrainerParty(gTrainerBattleOpponent_A, 0, monsCount);
}
-void sub_816306C(u8 monsCount)
+void FillFrontierTrainersParties(u8 monsCount)
{
ZeroEnemyPartyMons();
- sub_81630C4(gTrainerBattleOpponent_A, 0, monsCount);
- sub_81630C4(gTrainerBattleOpponent_B, 3, monsCount);
+ FillTrainerParty(gTrainerBattleOpponent_A, 0, monsCount);
+ FillTrainerParty(gTrainerBattleOpponent_B, 3, monsCount);
}
void sub_81630A0(u8 monsCount)
@@ -841,7 +847,7 @@ void sub_81630A0(u8 monsCount)
sub_8165EA4(gTrainerBattleOpponent_A, 0, monsCount);
}
-void sub_81630C4(u16 trainerId, u8 firstMonId, u8 monCount)
+static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
{
s32 i, j;
u16 chosenMonIndices[4];
@@ -983,15 +989,15 @@ void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId)
for (i = 0; i != 3; i++)
{
- CreateMonWithEVSpread(&gEnemyParty[firstMonId + i], apprentice->monData[i].species, level, fixedIV, 8);
+ CreateMonWithEVSpread(&gEnemyParty[firstMonId + i], apprentice->party[i].species, level, fixedIV, 8);
friendship = 0xFF;
for (j = 0; j < 4; j++)
{
- if (apprentice->monData[i].moves[j] == MOVE_FRUSTRATION)
+ if (apprentice->party[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);
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &apprentice->party[i].item);
}
}
@@ -1053,7 +1059,7 @@ void sub_81635D4(u16 trainerId, u8 firstMonId)
{
u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; // Unused variable.
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- u8 challengeNum = gSaveBlock2Ptr->frontier.field_CE0[battleMode][0] / 7;
+ u8 challengeNum = gSaveBlock2Ptr->frontier.winStreaks[battleMode][0] / 7;
if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6)
fixedIV = sub_81A6CA8(challengeNum, 0);
else
@@ -1201,7 +1207,7 @@ static void HandleSpecialTrainerBattleEnd(void)
}
break;
case SPECIAL_BATTLE_EREADER:
- sub_816537C();
+ CopyEReaderTrainerFarewellMessage();
break;
}
@@ -1233,21 +1239,21 @@ void DoSpecialTrainerBattle(void)
switch (VarGet(VAR_FRONTIER_BATTLE_MODE))
{
case FRONTIER_MODE_SINGLES:
- sub_8163048(3);
+ FillFrontierTrainerParty(3);
break;
case FRONTIER_MODE_DOUBLES:
- sub_8163048(4);
+ FillFrontierTrainerParty(4);
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;
break;
case FRONTIER_MODE_MULTIS:
- sub_816306C(2);
- gPartnerTrainerId = gSaveBlock2Ptr->frontier.field_CD6;
+ FillFrontierTrainersParties(2);
+ gPartnerTrainerId = gSaveBlock2Ptr->frontier.field_CB4[17];
sub_8165404(gPartnerTrainerId);
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS;
break;
case FRONTIER_MODE_LINK_MULTIS:
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI | BATTLE_TYPE_x800000;
- sub_816306C(2);
+ FillFrontierTrainersParties(2);
break;
}
CreateTask(Task_StartBattleAfterTransition, 1);
@@ -1279,7 +1285,7 @@ void DoSpecialTrainerBattle(void)
if (VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_DOUBLES)
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;
if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
- sub_8163048(2);
+ FillFrontierTrainerParty(2);
CreateTask(Task_StartBattleAfterTransition, 1);
sub_806E694(0);
BattleTransition_StartOnField(sub_80B100C(3));
@@ -1289,7 +1295,7 @@ void DoSpecialTrainerBattle(void)
if (VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_DOUBLES)
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;
if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
- sub_8163048(3);
+ FillFrontierTrainerParty(3);
else
sub_81630A0(3);
CreateTask(Task_StartBattleAfterTransition, 1);
@@ -1299,7 +1305,7 @@ void DoSpecialTrainerBattle(void)
case SPECIAL_BATTLE_ARENA:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_ARENA;
if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
- sub_8163048(3);
+ FillFrontierTrainerParty(3);
else
sub_81630A0(3);
CreateTask(Task_StartBattleAfterTransition, 1);
@@ -1317,21 +1323,21 @@ void DoSpecialTrainerBattle(void)
break;
case SPECIAL_BATTLE_PIKE_SINGLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_BATTLE_TOWER;
- sub_8163048(3);
+ FillFrontierTrainerParty(3);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
BattleTransition_StartOnField(sub_80B100C(7));
break;
case SPECIAL_BATTLE_PYRAMID:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID;
- sub_8163048(3);
+ FillFrontierTrainerParty(3);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
BattleTransition_StartOnField(sub_80B100C(10));
break;
case SPECIAL_BATTLE_PIKE_DOUBLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS;
- sub_816306C(1);
+ FillFrontierTrainersParties(1);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
BattleTransition_StartOnField(sub_80B100C(7));
@@ -1357,8 +1363,8 @@ void SaveCurrentWinStreak(void)
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
u16 winStreak = GetCurrentBattleTowerWinStreak(lvlMode, battleMode);
- if (gSaveBlock2Ptr->frontier.field_CE0[battleMode][lvlMode] < winStreak)
- gSaveBlock2Ptr->frontier.field_CE0[battleMode][lvlMode] = winStreak;
+ if (gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] < winStreak)
+ gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] = winStreak;
}
void sub_8163EE4(void)
@@ -1367,7 +1373,7 @@ void sub_8163EE4(void)
u8 lvlMode, battleMode, class;
struct EmeraldBattleTowerRecord *playerRecord = &gSaveBlock2Ptr->frontier.towerPlayer;
- sub_8164FB8(playerRecord);
+ ClearBattleTowerRecord(playerRecord);
lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
if (gSaveBlock2Ptr->playerGender != MALE)
@@ -1399,8 +1405,8 @@ void sub_8163EE4(void)
for (i = 0; i < 4; i++)
{
- if (gSaveBlock2Ptr->frontier.field_CAA[i] != 0)
- sub_80686FC(&gPlayerParty[gSaveBlock2Ptr->frontier.field_CAA[i] - 1], &playerRecord->party[i]);
+ if (gSaveBlock2Ptr->frontier.selectedPartyMons[i] != 0)
+ sub_80686FC(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], &playerRecord->party[i]);
}
playerRecord->language = gGameLanguage;
@@ -1412,7 +1418,7 @@ void SaveBattleTowerProgress(void)
{
u16 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u16 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- s32 challengeNum = (signed)(gSaveBlock2Ptr->frontier.field_CE0[battleMode][lvlMode] / 7);
+ s32 challengeNum = (signed)(gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] / 7);
if (gSpecialVar_0x8005 == 0 && (challengeNum > 1 || gSaveBlock2Ptr->frontier.curChallengeBattleNum != 0))
sub_8163EE4();
@@ -1443,7 +1449,7 @@ void sub_81640E0(u16 trainerId)
count = 0;
for (i = 0; i < 3; i++)
{
- u16 apprenticeSpecies = gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].monData[i].species;
+ u16 apprenticeSpecies = gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].party[i].species;
if (apprenticeSpecies != species1 && apprenticeSpecies != species2)
{
validSpecies[count] = i;
@@ -1502,43 +1508,45 @@ void sub_81642A0(void)
eventObjTemplates = gSaveBlock1Ptr->eventObjectTemplates;
lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- challengeNum = gSaveBlock2Ptr->frontier.field_CE0[battleMode][lvlMode] / 7;
+ challengeNum = gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] / 7;
species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
level = GetFacilityEnemyMonLevel();
- for (j = 0; j < 6; j++)
+ j = 0;
+ do
{
do
{
trainerId = sub_8162548(challengeNum, 0);
for (i = 0; i < j; i++)
{
- if (gSaveBlock2Ptr->frontier.battledTrainerIds[i] == trainerId)
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
break;
- if (gFacilityTrainers[gSaveBlock2Ptr->frontier.battledTrainerIds[i]].facilityClass == gFacilityTrainers[trainerId].facilityClass)
+ if (gFacilityTrainers[gSaveBlock2Ptr->frontier.field_CB4[i]].facilityClass == gFacilityTrainers[trainerId].facilityClass)
break;
}
} while (i != j);
- gSaveBlock2Ptr->frontier.battledTrainerIds[j] = trainerId;
- }
+ gSaveBlock2Ptr->frontier.field_CB4[j] = trainerId;
+ j++;
+ } while (j < 6);
r10 = 8;
for (i = 0; i < 6; i++)
{
- trainerId = gSaveBlock2Ptr->frontier.battledTrainerIds[i];
+ trainerId = gSaveBlock2Ptr->frontier.field_CB4[i];
eventObjTemplates[i + 1].graphicsId = GetBattleFacilityTrainerGfxId(trainerId);
for (j = 0; j < 2; j++)
{
while (1)
{
monPoolId = RandomizeFacilityTrainerMonId(trainerId);
- if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.battledTrainerIds[r10 - 1]].itemTableId == gFacilityTrainerMons[monPoolId].itemTableId)
+ if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[r10 - 1]].itemTableId == gFacilityTrainerMons[monPoolId].itemTableId)
continue;
for (k = 8; k < r10; k++)
{
- if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.battledTrainerIds[k]].species == gFacilityTrainerMons[monPoolId].species)
+ if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[k]].species == gFacilityTrainerMons[monPoolId].species)
break;
if (species1 == gFacilityTrainerMons[monPoolId].species)
break;
@@ -1549,7 +1557,7 @@ void sub_81642A0(void)
break;
}
- gSaveBlock2Ptr->frontier.battledTrainerIds[r10] = monPoolId;
+ gSaveBlock2Ptr->frontier.field_CB4[r10] = monPoolId;
r10++;
}
}
@@ -1565,8 +1573,8 @@ void sub_81642A0(void)
k = 0;
for (j = 0; j < 3; j++)
{
- if (species1 != gSaveBlock2Ptr->apprentices[i].monData[j].species
- && species2 != gSaveBlock2Ptr->apprentices[i].monData[j].species)
+ if (species1 != gSaveBlock2Ptr->apprentices[i].party[j].species
+ && species2 != gSaveBlock2Ptr->apprentices[i].party[j].species)
{
k++;
}
@@ -1580,10 +1588,10 @@ void sub_81642A0(void)
}
if (r10 != 0)
{
- gSaveBlock2Ptr->frontier.battledTrainerIds[6] = spArray[Random() % r10];
- eventObjTemplates[7].graphicsId = GetBattleFacilityTrainerGfxId(gSaveBlock2Ptr->frontier.battledTrainerIds[6]);
+ gSaveBlock2Ptr->frontier.field_CB4[6] = spArray[Random() % r10];
+ eventObjTemplates[7].graphicsId = GetBattleFacilityTrainerGfxId(gSaveBlock2Ptr->frontier.field_CB4[6]);
FlagClear(FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1);
- sub_81640E0(gSaveBlock2Ptr->frontier.battledTrainerIds[6]);
+ sub_81640E0(gSaveBlock2Ptr->frontier.field_CB4[6]);
}
r10 = 0;
@@ -1623,9 +1631,716 @@ void sub_81642A0(void)
}
if (r10 != 0)
{
- gSaveBlock2Ptr->frontier.battledTrainerIds[7] = spArray[Random() % r10];
- eventObjTemplates[8].graphicsId = GetBattleFacilityTrainerGfxId(gSaveBlock2Ptr->frontier.battledTrainerIds[7]);
+ gSaveBlock2Ptr->frontier.field_CB4[7] = spArray[Random() % r10];
+ eventObjTemplates[8].graphicsId = GetBattleFacilityTrainerGfxId(gSaveBlock2Ptr->frontier.field_CB4[7]);
FlagClear(FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2);
- sub_8164188(gSaveBlock2Ptr->frontier.battledTrainerIds[7]);
+ sub_8164188(gSaveBlock2Ptr->frontier.field_CB4[7]);
+ }
+}
+
+void sub_81646BC(u16 trainerId, u16 monPoolId)
+{
+ u16 move = 0;
+ u16 species = 0;
+ GetFacilityEnemyMonLevel(); // Pointless function call.
+
+ if (trainerId != BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ move = gFacilityTrainerMons[monPoolId].moves[0];
+ species = gFacilityTrainerMons[monPoolId].species;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ move = gSaveBlock2Ptr->frontier.towerRecords[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[gUnknown_03006298[gSpecialVar_0x8005 + 1]].moves[0];
+ species = gSaveBlock2Ptr->frontier.towerRecords[trainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[gUnknown_03006298[gSpecialVar_0x8005 + 1]].species;
+ }
+ else
+ {
+ s32 i;
+
+ move = gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].party[gUnknown_03006298[gSpecialVar_0x8005 - 1]].moves[0];
+ species = gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].party[gUnknown_03006298[gSpecialVar_0x8005 - 1]].species;
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ gStringVar3[i] = gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].playerName[i];
+ gStringVar3[i] = EOS;
+ ConvertInternationalString(gStringVar3, gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].language);
+ }
+ }
+
+ StringCopy(gStringVar1, gMoveNames[move]);
+ StringCopy(gStringVar2, gSpeciesNames[species]);
+}
+
+struct
+{
+ u32 facilityClass;
+ const u8 *const *strings;
+} extern const gUnknown_085DD500[50];
+
+extern const u8 *const *const gUnknown_085DD690[];
+extern const u8 gUnknown_085DFA42[4];
+
+void sub_8164828(void)
+{
+ s32 i, j, arrId;
+ s32 monPoolId;
+ s32 level = GetFacilityEnemyMonLevel(); // Unused variable.
+ s32 challengeNum = sub_81A39C4() / 7;
+ s32 k = gSpecialVar_LastTalked - 2;
+ s32 trainerId = gSaveBlock2Ptr->frontier.field_CB4[k];
+
+ for (arrId = 0; arrId < ARRAY_COUNT(gUnknown_085DD500); arrId++)
+ {
+ if (gUnknown_085DD500[arrId].facilityClass == GetFrontierTrainerFacilityClass(trainerId))
+ break;
+ }
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ return;
+ if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ GetFrontierTrainerName(gStringVar1, trainerId);
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ GetFrontierTrainerName(gStringVar1, trainerId);
+ }
+ else
+ {
+ s32 i;
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ gStringVar1[i] = gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].playerName[i];
+ gStringVar1[i] = EOS;
+ ConvertInternationalString(gStringVar1, gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].language);
+ ConvertIntToDecimalStringN(gStringVar2, gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].number, STR_CONV_MODE_LEFT_ALIGN, 3);
+ GetFrontierTrainerName(gStringVar3, trainerId);
+ }
+ break;
+ case 1:
+ monPoolId = gSaveBlock2Ptr->frontier.field_CB4[8 + k * 2];
+ sub_81646BC(trainerId, monPoolId);
+ break;
+ case 2:
+ monPoolId = gSaveBlock2Ptr->frontier.field_CB4[9 + k * 2];
+ sub_81646BC(trainerId, monPoolId);
+ break;
+ case 3:
+ gPartnerTrainerId = trainerId;
+ if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ gSaveBlock2Ptr->frontier.field_CB4[18] = gSaveBlock2Ptr->frontier.field_CB4[8 + k * 2];
+ gSaveBlock2Ptr->frontier.field_CB4[19] = gSaveBlock2Ptr->frontier.field_CB4[9 + k * 2];
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ gSaveBlock2Ptr->frontier.field_CB4[18] = gUnknown_03006298[2];
+ gSaveBlock2Ptr->frontier.field_CB4[19] = gUnknown_03006298[3];
+ }
+ else
+ {
+ gSaveBlock2Ptr->frontier.field_CB4[18] = gUnknown_03006298[0];
+ gSaveBlock2Ptr->frontier.field_CB4[19] = gUnknown_03006298[1];
+ }
+ for (k = 0; k < 14; k++)
+ {
+ while (1)
+ {
+ i = sub_8162548(challengeNum, k / 2);
+ if (gPartnerTrainerId == i)
+ continue;
+
+ for (j = 0; j < k; j++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_CB4[j] == i)
+ break;
+ }
+ if (j == k)
+ break;
+ }
+ gSaveBlock2Ptr->frontier.field_CB4[k] = i;
+ }
+ gSaveBlock2Ptr->frontier.field_CB4[17] = trainerId;
+ break;
+ case 4:
+ break;
+ }
+
+ if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ return;
+
+ if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ ShowFieldMessage(gUnknown_085DD500[arrId].strings[gSpecialVar_0x8005]);
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ ShowFieldMessage(gUnknown_085DD500[arrId].strings[gSpecialVar_0x8005]);
+ }
+ else
+ {
+ u8 id = gSaveBlock2Ptr->apprentices[trainerId - BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID].id;
+ ShowFieldMessage(gUnknown_085DD690[id][gSpecialVar_0x8005]);
+ }
+}
+
+void sub_8164B74(void)
+{
+ s32 challengeNum;
+ s32 i, j;
+ s32 trainerId = 0;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u32 battleNum = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
+ GetMultiplayerId(); // Yet another pointless function call.
+
+ switch (gSpecialVar_Result)
+ {
+ case 0:
+ if (battleMode == FRONTIER_MODE_LINK_MULTIS)
+ {
+ challengeNum = gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] / 7;
+ if (sub_800A520())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), &challengeNum, sizeof(challengeNum));
+ gSpecialVar_Result = 1;
+ }
+ }
+ else
+ {
+ gSpecialVar_Result = 6;
+ }
+ break;
+ case 1:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ ResetBlockReceivedFlags();
+ if (gBlockRecvBuffer[0][0] > gBlockRecvBuffer[1][0])
+ challengeNum = gBlockRecvBuffer[0][0];
+ else
+ challengeNum = gBlockRecvBuffer[1][0];
+ for (i = 0; i < 14; i++)
+ {
+ do
+ {
+ trainerId = sub_8162548(challengeNum, i / 2);
+ for (j = 0; j < i; j++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_CB4[j] == trainerId)
+ break;
+ }
+ } while (i != j);
+ if (i == j) // This condition is always true, because of the loop above.
+ gSaveBlock2Ptr->frontier.field_CB4[i] = trainerId;
+ }
+ gSpecialVar_Result = 2;
+ }
+ break;
+ case 2:
+ if (sub_800A520())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), &gSaveBlock2Ptr->frontier.field_CB4, sizeof(gSaveBlock2Ptr->frontier.field_CB4));
+ gSpecialVar_Result = 3;
+ }
+ break;
+ case 3:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ ResetBlockReceivedFlags();
+ memcpy(&gSaveBlock2Ptr->frontier.field_CB4, gBlockRecvBuffer, sizeof(gSaveBlock2Ptr->frontier.field_CB4));
+ gTrainerBattleOpponent_A = gSaveBlock2Ptr->frontier.field_CB4[battleNum * 2];
+ gTrainerBattleOpponent_B = gSaveBlock2Ptr->frontier.field_CB4[battleNum * 2 + 1];
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1);
+ if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType == 0)
+ gSpecialVar_Result = 4;
+ else
+ gSpecialVar_Result = 6;
+ }
+ break;
+ case 4:
+ sub_800AC34();
+ gSpecialVar_Result = 5;
+ break;
+ case 5:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gSpecialVar_Result = 6;
+ }
+ break;
+ case 6:
+ return;
+ }
+}
+
+void sub_8164DCC(void)
+{
+ if (gWirelessCommType != 0)
+ sub_800AC34();
+}
+
+void sub_8164DE4(void)
+{
+ SetBattleFacilityTrainerGfxId(gSaveBlock2Ptr->frontier.field_CB4[17], 0xF);
+}
+
+void sub_8164E04(void)
+{
+ s32 i;
+ u8 text[32];
+
+ if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_SINGLES)
+ return;
+
+ GetFrontierTrainerName(text, gTrainerBattleOpponent_A);
+ StripExtCtrlCodes(text);
+ StringCopy(gSaveBlock2Ptr->frontier.field_BD8, text);
+ sub_8165B88(&gSaveBlock2Ptr->frontier.field_BEB, gTrainerBattleOpponent_A);
+ gSaveBlock2Ptr->frontier.field_BD6 = GetMonData(&gEnemyParty[gBattlerPartyIndexes[1]], MON_DATA_SPECIES, NULL);
+ gSaveBlock2Ptr->frontier.field_BD4 = GetMonData(&gPlayerParty[gBattlerPartyIndexes[0]], MON_DATA_SPECIES, NULL);
+ for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++)
+ gSaveBlock2Ptr->frontier.field_BE0[i] = gBattleMons[0].nickname[i];
+ gSaveBlock2Ptr->frontier.field_D06 = gBattleOutcome;
+}
+
+void ValidateBattleTowerRecordChecksums(void)
+{
+ s32 i, j;
+ u32 *record = (u32*)(&gSaveBlock2Ptr->frontier.towerPlayer);
+ u32 checksum = 0;
+
+ for (j = 0; j < (sizeof(struct EmeraldBattleTowerRecord) - 4) / 4; j++) // - 4, because of the last field being the checksum itself.
+ {
+ checksum += record[j];
+ }
+ if (gSaveBlock2Ptr->frontier.towerPlayer.checksum != checksum)
+ ClearBattleTowerRecord(&gSaveBlock2Ptr->frontier.towerPlayer);
+
+ for (i = 0; i < 5; i++)
+ {
+ record = (u32*)(&gSaveBlock2Ptr->frontier.towerRecords[i]);
+ checksum = 0;
+ for (j = 0; j < (sizeof(struct EmeraldBattleTowerRecord) - 4) / 4; j++) // - 4, because of the last field being the checksum itself.
+ {
+ checksum += record[j];
+ }
+ if (gSaveBlock2Ptr->frontier.towerRecords[i].checksum != checksum)
+ ClearBattleTowerRecord(&gSaveBlock2Ptr->frontier.towerRecords[i]);
+ }
+}
+
+void CalcEmeraldBattleTowerChecksum(struct EmeraldBattleTowerRecord *record)
+{
+ u32 i;
+
+ record->checksum = 0;
+ for (i = 0; i < (sizeof(struct EmeraldBattleTowerRecord) - 4) / 4; i++) // - 4, because of the last field being the checksum itself.
+ record->checksum += ((u32 *)record)[i];
+}
+
+void CalcRubyBattleTowerChecksum(struct RSBattleTowerRecord *record)
+{
+ u32 i;
+
+ record->checksum = 0;
+ for (i = 0; i < (sizeof(struct RSBattleTowerRecord) - 4) / 4; i++) // - 4, because of the last field being the checksum itself.
+ record->checksum += ((u32 *)record)[i];
+}
+
+void ClearBattleTowerRecord(struct EmeraldBattleTowerRecord *record)
+{
+ u32 i;
+
+ for (i = 0; i < sizeof(struct EmeraldBattleTowerRecord) / 4; i++)
+ ((u32 *)record)[i] = 0;
+}
+
+u16 GetCurrentBattleTowerWinStreak(u8 lvlMode, u8 battleMode)
+{
+ u16 winStreak = gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode];
+
+ if (winStreak > 9999)
+ return 9999;
+ else
+ return winStreak;
+}
+
+u8 GetMonCountForBattleMode(u8 battleMode)
+{
+ u8 sp[ARRAY_COUNT(gUnknown_085DFA42)];
+ memcpy(sp, gUnknown_085DFA42, sizeof(gUnknown_085DFA42));
+
+ if (battleMode < ARRAY_COUNT(gUnknown_085DFA42))
+ return sp[battleMode];
+ else
+ return 3;
+}
+
+struct RibbonCounter
+{
+ u8 partyIndex;
+ u8 count;
+};
+
+void AwardBattleTowerRibbons(void)
+{
+ s32 i;
+ u32 partyIndex;
+ struct RibbonCounter ribbons[3]; // BUG: 4 Pokemon can receive ribbons in a double battle mode.
+ u8 ribbonType = 0;
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u8 monCount = GetMonCountForBattleMode(battleMode);
+
+ if (lvlMode != FRONTIER_LVL_50)
+ ribbonType = MON_DATA_VICTORY_RIBBON;
+ else
+ ribbonType = MON_DATA_WINNING_RIBBON;
+
+ gSpecialVar_Result = FALSE;
+
+ if (GetCurrentBattleTowerWinStreak(lvlMode, battleMode) > 55)
+ {
+ for (i = 0; i < monCount; i++)
+ {
+ partyIndex = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1;
+ ribbons[i].partyIndex = partyIndex;
+ ribbons[i].count = 0;
+ if (!GetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], ribbonType))
+ {
+ gSpecialVar_Result = TRUE;
+ SetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], ribbonType, &gSpecialVar_Result);
+ ribbons[i].count = GetRibbonCount(&gSaveBlock1Ptr->playerParty[partyIndex]);
+ }
+ }
+ }
+
+ if (gSpecialVar_Result)
+ {
+ IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS);
+ for (i = 1; i < monCount; i++)
+ {
+ if (ribbons[i].count > ribbons[0].count)
+ {
+ struct RibbonCounter prevBest = ribbons[0];
+ ribbons[0] = ribbons[i];
+ ribbons[i] = prevBest;
+ }
+ }
+ if (ribbons[0].count > 4)
+ {
+ sub_80EE4DC(&gSaveBlock1Ptr->playerParty[ribbons[0].partyIndex], ribbonType);
+ }
+ }
+}
+
+// This is a leftover debugging function that is used to populate the E-Reader
+// trainer with the player's current data.
+void FillEReaderTrainerWithPlayerData(void)
+{
+ struct BattleTowerEReaderTrainer *ereaderTrainer = &gSaveBlock2Ptr->frontier.ereaderTrainer;
+ s32 i, j;
+
+ if (gSaveBlock2Ptr->playerGender != MALE)
+ {
+ ereaderTrainer->facilityClass = gTowerFemaleFacilityClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]
+ + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % ARRAY_COUNT(gTowerFemaleFacilityClasses)];
+ }
+ else
+ {
+ ereaderTrainer->facilityClass = gTowerMaleFacilityClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]
+ + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % ARRAY_COUNT(gTowerMaleFacilityClasses)];
+ }
+
+ CopyUnalignedWord(ereaderTrainer->trainerId, gSaveBlock2Ptr->playerTrainerId);
+ StringCopy7(ereaderTrainer->name, gSaveBlock2Ptr->playerName);
+
+ ereaderTrainer->winStreak = 1;
+
+ j = 7;
+ for (i = 0; i < 6; i++)
+ {
+ ereaderTrainer->greeting[i] = gSaveBlock1Ptr->unk2BBC[i];
+ ereaderTrainer->farewellPlayerLost[i] = j;
+ ereaderTrainer->farewellPlayerWon[i] = j + 6;
+ j++;
+ }
+
+ for (i = 0; i < 3; i++)
+ sub_80686FC(&gPlayerParty[i], &ereaderTrainer->party[i]);
+
+ SetEReaderTrainerChecksum(ereaderTrainer);
+}
+
+u8 GetEreaderTrainerFrontSpriteId(void)
+{
+ return gFacilityClassToPicIndex[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass];
+}
+
+u8 GetEreaderTrainerClassId(void)
+{
+ return gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass];
+}
+
+void GetEreaderTrainerName(u8 *trainerName)
+{
+ s32 i;
+
+ for (i = 0; i < 5; i++)
+ trainerName[i] = gSaveBlock2Ptr->frontier.ereaderTrainer.name[i];
+
+ trainerName[i] = EOS;
+}
+
+// Checks if the saved E-Reader trainer is valid.
+void ValidateEReaderTrainer(void)
+{
+ u32 i;
+ u32 checksum;
+ struct BattleTowerEReaderTrainer *ereaderTrainer;
+
+ gSpecialVar_Result = FALSE;
+ ereaderTrainer = &gSaveBlock2Ptr->frontier.ereaderTrainer;
+
+ checksum = 0;
+ for (i = 0; i < (sizeof(struct BattleTowerEReaderTrainer) - 4) / 4; i++) // - 4, because of the last field being the checksum itself.
+ checksum |= ((u32 *)ereaderTrainer)[i];
+
+ if (checksum == 0)
+ {
+ gSpecialVar_Result = TRUE;
+ return;
+ }
+
+ checksum = 0;
+ for (i = 0; i < (sizeof(struct BattleTowerEReaderTrainer) - 4) / 4; i++) // - 4, because of the last field being the checksum itself.
+ checksum += ((u32 *)ereaderTrainer)[i];
+
+ if (gSaveBlock2Ptr->frontier.ereaderTrainer.checksum != checksum)
+ {
+ ClearEReaderTrainer(&gSaveBlock2Ptr->frontier.ereaderTrainer);
+ gSpecialVar_Result = TRUE;
+ }
+}
+
+void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer)
+{
+ s32 i;
+
+ ereaderTrainer->checksum = 0;
+ for (i = 0; i < (sizeof(struct BattleTowerEReaderTrainer) - 4) / 4; i++) // - 4, because of the last field being the checksum itself.
+ ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i];
+}
+
+void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer)
+{
+ u32 i;
+
+ for (i = 0; i < (sizeof(struct BattleTowerEReaderTrainer)) / 4; i++)
+ ((u32 *)ereaderTrainer)[i] = 0;
+}
+
+void CopyEReaderTrainerGreeting(void)
+{
+ FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.greeting);
+}
+
+void CopyEReaderTrainerFarewellMessage(void)
+{
+ if (gBattleOutcome == B_OUTCOME_DREW)
+ gStringVar4[0] = EOS;
+ else if (gBattleOutcome == B_OUTCOME_WON)
+ FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.farewellPlayerWon);
+ else
+ FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.farewellPlayerLost);
+}
+
+void sub_81653CC(void)
+{
+ if (gSaveBlock2Ptr->frontier.field_CA8 == 1)
+ sub_80F01B8();
+ if (FlagGet(FLAG_0x077) == TRUE)
+ {
+ sub_80F01B8();
+ FlagClear(FLAG_0x077);
+ }
+}
+
+struct StevenMon
+{
+ u16 species;
+ u8 fixedIV;
+ u8 level;
+ u8 nature;
+ u8 evs[6];
+ u16 moves[4];
+};
+
+extern const struct StevenMon sStevenMons[3];
+
+#define STEVEN_OTID 61226
+
+void sub_8165404(u16 trainerId)
+{
+ s32 i, j;
+ u32 ivs, level;
+ u32 friendship;
+ u16 monPoolId;
+ u32 otID;
+ u8 trainerName[PLAYER_NAME_LENGTH + 1];
+ GetFacilityEnemyMonLevel(); // Unused return variable.
+
+ if (trainerId == TRAINER_STEVEN_PARTNER)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ do
+ {
+ j = Random32();
+ } while (IsShinyOtIdPersonality(STEVEN_OTID, j) || sStevenMons[i].nature != GetNatureFromPersonality(j));
+ CreateMon(&gPlayerParty[3 + i],
+ sStevenMons[i].species,
+ sStevenMons[i].level,
+ sStevenMons[i].fixedIV,
+ TRUE, i, // BUG: personality was stored in the 'j' variable. As a result, Steven's pokemon do not have the intended natures.
+ TRUE, STEVEN_OTID);
+ for (j = 0; j < 6; j++)
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_HP_EV + j, &sStevenMons[i].evs[j]);
+ for (j = 0; j < 4; j++)
+ SetMonMoveSlot(&gPlayerParty[3 + i], sStevenMons[i].moves[j], j);
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, gTrainers[TRAINER_STEVEN].trainerName);
+ j = MALE;
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_GENDER, &j);
+ CalculateMonStats(&gPlayerParty[3 + i]);
+ }
+ }
+ else if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
+ {
+ // Scrapped, lol.
+ trainerName[0] = gGameLanguage;
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
+ {
+ level = GetFacilityEnemyMonLevel();
+ ivs = GetFrontierTrainerFixedIvs(trainerId);
+ otID = Random32();
+ for (i = 0; i < 2; i++)
+ {
+ monPoolId = gSaveBlock2Ptr->frontier.field_CB4[i + 18];
+ CreateMonWithEVSpreadPersonalityOTID(&gPlayerParty[3 + i],
+ gFacilityTrainerMons[monPoolId].species,
+ level,
+ gFacilityTrainerMons[monPoolId].nature,
+ ivs,
+ gFacilityTrainerMons[monPoolId].evSpread,
+ otID);
+ friendship = 0xFF;
+ for (j = 0; j < 4; j++)
+ {
+ SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monPoolId].moves[j], j);
+ if (gFacilityTrainerMons[monPoolId].moves[j] == MOVE_FRUSTRATION)
+ friendship = 0;
+ }
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]);
+ for (j = 0; j < PLAYER_NAME_LENGTH + 1; j++)
+ trainerName[j] = gFacilityTrainers[trainerId].trainerName[j];
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, &trainerName);
+ j = IsFrontierTrainerFemale(trainerId);
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_GENDER, &j);
+ }
+ }
+ else if (trainerId < BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID)
+ {
+ trainerId -= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID;
+ for (i = 0; i < 2; i++)
+ {
+ struct EmeraldBattleTowerRecord *record = &gSaveBlock2Ptr->frontier.towerRecords[trainerId];
+ struct UnknownPokemonStruct monData = record->party[gSaveBlock2Ptr->frontier.field_CB4[18 + i]];
+ StringCopy(trainerName, record->name);
+ if (record->language == LANGUAGE_JAPANESE)
+ {
+ if (monData.nickname[0] != EXT_CTRL_CODE_BEGIN || monData.nickname[1] != EXT_CTRL_CODE_JPN)
+ {
+ monData.nickname[5] = EOS;
+ ConvertInternationalString(monData.nickname, LANGUAGE_JAPANESE);
+ }
+ }
+ else
+ {
+ if (monData.nickname[0] == EXT_CTRL_CODE_BEGIN && monData.nickname[1] == EXT_CTRL_CODE_JPN)
+ trainerName[5] = EOS;
+ }
+ sub_8068338(&gPlayerParty[3 + i], &monData, TRUE);
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, trainerName);
+ j = IsFrontierTrainerFemale(trainerId + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID);
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_GENDER, &j);
+ }
+ }
+ else
+ {
+ trainerId -= BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID;
+ for (i = 0; i < 2; i++)
+ {
+ CreateApprenticeMon(&gPlayerParty[3 + i], &gSaveBlock2Ptr->apprentices[trainerId], gSaveBlock2Ptr->frontier.field_CB4[18 + i]);
+ j = IsFrontierTrainerFemale(trainerId + BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID);
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_GENDER, &j);
+ }
+ }
+}
+
+extern const u8 sRubyFacilityClassToEmerald[82][2];
+extern const u16 gUnknown_085DFA46[];
+extern const u16 gUnknown_085DFA52[];
+
+bool32 RubyBattleTowerRecordToEmerald(struct RSBattleTowerRecord *src, struct EmeraldBattleTowerRecord *dst)
+{
+ s32 i, validMons = 0;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (src->party[i].species)
+ validMons++;
+ }
+
+ if (validMons != 3)
+ {
+ memset(dst, 0, sizeof(*dst));
+ return FALSE;
+ }
+ else
+ {
+ dst->lvlMode = src->lvlMode;
+ dst->winStreak = src->winStreak;
+ for (i = 0; i < (signed) ARRAY_COUNT(sRubyFacilityClassToEmerald); i++)
+ {
+ if (sRubyFacilityClassToEmerald[i][0] == src->facilityClass)
+ break;
+ }
+ if (i != ARRAY_COUNT(sRubyFacilityClassToEmerald))
+ dst->facilityClass = sRubyFacilityClassToEmerald[i][1];
+ else
+ dst->facilityClass = FACILITY_CLASS_YOUNGSTER;
+
+ for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
+ dst->name[i] = src->name[i];
+ for (i = 0; i < 4; i++)
+ dst->trainerId[i] = src->trainerId[i];
+ for (i = 0; i < 6; i++)
+ dst->greeting[i] = src->greeting[i];
+ for (i = 0; i < 6; i++)
+ dst->unk1C[i] = gUnknown_085DFA46[i];
+ for (i = 0; i < 6; i++)
+ dst->unk28[i] = gUnknown_085DFA52[i];
+ for (i = 0; i < 3; i++)
+ dst->party[i] = src->party[i];
+
+ CpuFill32(0, &dst->party[3], sizeof(dst->party[3]));
+ CalcEmeraldBattleTowerChecksum(dst);
+ return TRUE;
}
}
diff --git a/src/record_mixing.c b/src/record_mixing.c
index c9fe3fd47..11c3f2fef 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -69,6 +69,7 @@ struct PlayerRecordsRS
struct EasyChatPair easyChatPairs[5];
struct RecordMixingDayCareMail dayCareMail;
struct RSBattleTowerRecord battleTowerRecord;
+ u16 giftItem;
u16 filler11C8[0x32];
};
@@ -81,7 +82,7 @@ struct PlayerRecordsEmerald
/* 0x1084 */ struct EasyChatPair easyChatPairs[5];
/* 0x10ac */ struct RecordMixingDayCareMail dayCareMail;
/* 0x1124 */ struct EmeraldBattleTowerRecord battleTowerRecord;
- /* 0x1210 */ u16 unk_1210;
+ /* 0x1210 */ u16 giftItem;
/* 0x1214 */ LilycoveLady lilycoveLady;
/* 0x1254 */ struct Apprentice apprentice[2];
/* 0x12dc */ struct UnkRecordMixingStruct2 unk_12dc;
@@ -132,7 +133,7 @@ static void ReceiveBattleTowerData(void *battleTowerRecord, size_t, u8);
static void ReceiveLilycoveLadyData(LilycoveLady *, size_t, u8);
static void sub_80E7B2C(const u8 *);
static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *, size_t, u8, TVShow *);
-static void sub_80E7F68(u16 *item, u8 which);
+static void ReceiveGiftItem(u16 *item, u8 which);
static void sub_80E7FF8(u8 taskId);
static void sub_80E8110(struct Apprentice *arg0, struct Apprentice *arg1);
static void ReceiveApprenticeData(struct Apprentice *arg0, size_t arg1, u32 arg2);
@@ -215,7 +216,7 @@ static void PrepareUnknownExchangePacket(struct PlayerRecordsRS *dest)
sub_81659DC(sBattleTowerSave, &dest->battleTowerRecord);
if (GetMultiplayerId() == 0)
- dest->battleTowerRecord.unk_11c8 = GetRecordMixingGift();
+ dest->giftItem = GetRecordMixingGift();
}
static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest)
@@ -234,7 +235,7 @@ static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest)
SanitizeRubyBattleTowerRecord(&dest->battleTowerRecord);
if (GetMultiplayerId() == 0)
- dest->battleTowerRecord.unk_11c8 = GetRecordMixingGift();
+ dest->giftItem = GetRecordMixingGift();
}
static void PrepareExchangePacket(void)
@@ -263,7 +264,7 @@ static void PrepareExchangePacket(void)
SanitizeEmeraldBattleTowerRecord(&sSentRecord->emerald.battleTowerRecord);
if (GetMultiplayerId() == 0)
- sSentRecord->emerald.unk_1210 = GetRecordMixingGift();
+ sSentRecord->emerald.giftItem = GetRecordMixingGift();
sub_80E8110(sSentRecord->emerald.apprentice, gUnknown_03001154);
sub_80E8260(&sSentRecord->emerald.unk_12dc);
@@ -283,7 +284,7 @@ static void ReceiveExchangePacket(u32 which)
ReceivePokeNewsData(sReceivedRecords->ruby.pokeNews, sizeof(struct PlayerRecordsRS), which);
ReceiveOldManData(&sReceivedRecords->ruby.oldMan, sizeof(struct PlayerRecordsRS), which);
ReceiveEasyChatPairsData(sReceivedRecords->ruby.easyChatPairs, sizeof(struct PlayerRecordsRS), which);
- sub_80E7F68(&sReceivedRecords->ruby.battleTowerRecord.unk_11c8, which);
+ ReceiveGiftItem(&sReceivedRecords->ruby.giftItem, which);
}
else
{
@@ -296,7 +297,7 @@ static void ReceiveExchangePacket(u32 which)
ReceiveEasyChatPairsData(sReceivedRecords->emerald.easyChatPairs, sizeof(struct PlayerRecordsEmerald), which);
ReceiveDaycareMailData(&sReceivedRecords->emerald.dayCareMail, sizeof(struct PlayerRecordsEmerald), which, sReceivedRecords->emerald.tvShows);
ReceiveBattleTowerData(&sReceivedRecords->emerald.battleTowerRecord, sizeof(struct PlayerRecordsEmerald), which);
- sub_80E7F68(&sReceivedRecords->emerald.unk_1210, which);
+ ReceiveGiftItem(&sReceivedRecords->emerald.giftItem, which);
ReceiveLilycoveLadyData(&sReceivedRecords->emerald.lilycoveLady, sizeof(struct PlayerRecordsEmerald), which);
ReceiveApprenticeData(sReceivedRecords->emerald.apprentice, sizeof(struct PlayerRecordsEmerald), (u8) which);
sub_80E89AC(&sReceivedRecords->emerald.unk_12dc, sizeof(struct PlayerRecordsEmerald), (u8) which);
@@ -667,7 +668,7 @@ static void ReceiveBattleTowerData(void *battleTowerRecord, size_t recordSize, u
ShufflePlayerIndices(mixIndices);
if (Link_AnyPartnersPlayingRubyOrSapphire())
{
- if (sub_816587C((void *)battleTowerRecord + recordSize * mixIndices[which], (void *)battleTowerRecord + recordSize * which) == TRUE)
+ if (RubyBattleTowerRecordToEmerald((void *)battleTowerRecord + recordSize * mixIndices[which], (void *)battleTowerRecord + recordSize * which) == TRUE)
{
dest = (void *)battleTowerRecord + recordSize * which;
dest->language = gLinkPlayers[mixIndices[which]].language;
@@ -676,7 +677,7 @@ static void ReceiveBattleTowerData(void *battleTowerRecord, size_t recordSize, u
}
else
{
- memcpy((void *)battleTowerRecord + recordSize * which, (void *)battleTowerRecord + recordSize * mixIndices[which], sizeof(union BattleTowerRecord));
+ memcpy((void *)battleTowerRecord + recordSize * which, (void *)battleTowerRecord + recordSize * mixIndices[which], sizeof(struct EmeraldBattleTowerRecord));
dest = (void *)battleTowerRecord + recordSize * which;
for (i = 0; i < 4; i ++)
{
@@ -1460,7 +1461,7 @@ static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t r
}
#endif // NONMATCHING
-static void sub_80E7F68(u16 *item, u8 which)
+static void ReceiveGiftItem(u16 *item, u8 which)
{
if (which != 0 && *item != ITEM_NONE && GetPocketByItemId(*item) == POCKET_KEY_ITEMS)
{