summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2018-11-11 16:44:27 +0100
committerDizzyEggg <jajkodizzy@wp.pl>2018-11-11 16:44:27 +0100
commit81410fee17547726e551204dcadc7271a9334aa2 (patch)
treed8dd292fd118f59af4f12b3328ead150d579abd8
parent1437755cdd2b5ce0a6eae4b9f716bcca4fc00061 (diff)
Factory done
-rw-r--r--asm/battle_frontier_2.s3560
-rw-r--r--data/battle_frontier/battle_factory_style_move_lists.inc191
-rw-r--r--data/battle_frontier_2.s858
-rw-r--r--data/battle_frontier_3.s803
-rw-r--r--data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc6
-rw-r--r--data/maps/BattleFrontier_BattleArenaLobby/scripts.inc14
-rw-r--r--data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc14
-rw-r--r--data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc20
-rw-r--r--data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc66
-rw-r--r--data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc4
-rw-r--r--data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc2
-rw-r--r--data/maps/SlateportCity_BattleTentCorridor/scripts.inc6
-rw-r--r--data/specials.inc4
-rw-r--r--include/battle.h4
-rw-r--r--include/battle_factory.h11
-rw-r--r--include/battle_factory_screen.h7
-rw-r--r--include/battle_tower.h4
-rw-r--r--include/frontier_util.h1
-rw-r--r--include/pokemon.h2
-rw-r--r--ld_script.txt9
-rw-r--r--src/battle_ai_script_commands.c9
-rw-r--r--src/battle_arena.c292
-rw-r--r--src/battle_dome.c36
-rw-r--r--src/battle_factory.c4397
-rw-r--r--src/battle_factory_screen.c4111
-rw-r--r--src/battle_tent.c256
-rw-r--r--src/battle_tower.c179
-rw-r--r--src/frontier_util.c4
-rw-r--r--src/pokemon.c2
-rw-r--r--sym_bss.txt2
-rw-r--r--sym_ewram.txt2
31 files changed, 6017 insertions, 8859 deletions
diff --git a/asm/battle_frontier_2.s b/asm/battle_frontier_2.s
index 291ea90c4..15d319d99 100644
--- a/asm/battle_frontier_2.s
+++ b/asm/battle_frontier_2.s
@@ -6,3567 +6,7 @@
.text
-
-
- thumb_func_start sub_81A5238
-sub_81A5238: @ 81A5238
- push {lr}
- ldr r1, =gUnknown_08611F84
- ldr r0, =gSpecialVar_0x8004
- ldrh r0, [r0]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5238
-
- thumb_func_start sub_81A5258
-sub_81A5258: @ 81A5258
- push {r4-r6,lr}
- sub sp, 0x4
- adds r5, r0, 0
- movs r6, 0
- ldrb r0, [r5]
- cmp r0, 0xA
- bls _081A5268
- b _081A5544
-_081A5268:
- lsls r0, 2
- ldr r1, =_081A5278
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_081A5278:
- .4byte _081A52A4
- .4byte _081A52F4
- .4byte _081A531C
- .4byte _081A53B4
- .4byte _081A540C
- .4byte _081A542C
- .4byte _081A544C
- .4byte _081A5490
- .4byte _081A553E
- .4byte _081A54D4
- .4byte _081A5520
-_081A52A4:
- ldr r0, =0x7fffff1c
- movs r1, 0
- str r1, [sp]
- movs r1, 0x4
- movs r2, 0
- movs r3, 0x8
- bl BeginNormalPaletteFade
- ldr r1, =0x00003f3e
- movs r0, 0x48
- bl SetGpuReg
- ldr r0, =gUnknown_08611F74
- bl LoadCompressedObjectPic
- ldr r0, =gUnknown_08D855E8
- movs r1, 0xF8
- lsls r1, 1
- movs r2, 0x20
- bl LoadCompressedPalette
- ldr r1, =gBattle_WIN0H
- movs r0, 0xFF
- strh r0, [r1]
- ldr r1, =gBattle_WIN0V
- movs r0, 0x70
- strh r0, [r1]
- b _081A553E
- .pool
-_081A52F4:
- ldr r0, =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- beq _081A5306
- b _081A5544
-_081A5306:
- str r0, [sp]
- movs r0, 0x5
- movs r1, 0
- movs r2, 0x18
- movs r3, 0xD
- bl HandleBattleWindow
- b _081A553E
- .pool
-_081A531C:
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- beq _081A5328
- b _081A5544
-_081A5328:
- ldr r1, =gBattleTextBuff1
- movs r2, 0xA1
- strb r2, [r1]
- movs r0, 0xFF
- strb r0, [r1, 0x1]
- ldr r1, =gBattleTextBuff2
- strb r2, [r1]
- movs r0, 0x1
- negs r0, r0
- strb r0, [r1, 0x1]
- ldr r0, =gText_PlayerMon1Name
- bl BattleStringExpandPlaceholdersToDisplayedString
- ldr r4, =gDisplayedStringBattle
- adds r0, r4, 0
- movs r1, 0xF
- bl BattlePutTextOnWindow
- ldr r0, =gText_Vs
- movs r1, 0x10
- bl BattlePutTextOnWindow
- ldr r0, =gText_OpponentMon1Name
- bl BattleStringExpandPlaceholdersToDisplayedString
- adds r0, r4, 0
- movs r1, 0x11
- bl BattlePutTextOnWindow
- ldr r0, =gText_Mind
- movs r1, 0x12
- bl BattlePutTextOnWindow
- ldr r0, =gText_Skill
- movs r1, 0x13
- bl BattlePutTextOnWindow
- ldr r0, =gText_Body
- movs r1, 0x14
- bl BattlePutTextOnWindow
- ldr r0, =gText_Judgement
- bl BattleStringExpandPlaceholdersToDisplayedString
- adds r0, r4, 0
- movs r1, 0x15
- bl BattlePutTextOnWindow
- b _081A553E
- .pool
-_081A53B4:
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- beq _081A53C0
- b _081A5544
-_081A53C0:
- ldr r1, =0x00003f3f
- movs r0, 0x48
- bl SetGpuReg
- movs r6, 0x80
- lsls r6, 15
- movs r4, 0x7
-_081A53CE:
- asrs r1, r6, 16
- ldr r0, =gUnknown_08611F5C
- movs r2, 0x54
- movs r3, 0
- bl CreateSprite
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, =gSprites
- adds r0, r1
- movs r1, 0x3
- bl StartSpriteAnim
- movs r0, 0x80
- lsls r0, 13
- adds r6, r0
- subs r4, 0x1
- cmp r4, 0
- bge _081A53CE
- b _081A553C
- .pool
-_081A540C:
- ldr r0, =0x00000109
- bl PlaySE
- movs r0, 0x50
- movs r1, 0x28
- movs r2, 0
- movs r3, 0
- bl sub_81A5558
- movs r0, 0xA0
- movs r1, 0x28
- movs r2, 0
- b _081A5464
- .pool
-_081A542C:
- ldr r0, =0x00000109
- bl PlaySE
- movs r0, 0x50
- movs r1, 0x38
- movs r2, 0x1
- movs r3, 0
- bl sub_81A5558
- movs r0, 0xA0
- movs r1, 0x38
- movs r2, 0x1
- b _081A5464
- .pool
-_081A544C:
- ldr r0, =0x00000109
- bl PlaySE
- movs r0, 0x50
- movs r1, 0x48
- movs r2, 0x2
- movs r3, 0
- bl sub_81A5558
- movs r0, 0xA0
- movs r1, 0x48
- movs r2, 0x2
-_081A5464:
- movs r3, 0x1
- bl sub_81A5558
- ldr r0, =gText_Judgement
- bl BattleStringExpandPlaceholdersToDisplayedString
- ldr r0, =gDisplayedStringBattle
- movs r1, 0x15
- bl BattlePutTextOnWindow
- ldrb r0, [r5]
- adds r0, 0x1
- strb r0, [r5]
- movs r6, 0x1
- b _081A5544
- .pool
-_081A5490:
- movs r0, 0x85
- lsls r0, 1
- bl PlaySE
- ldr r0, =gBattleTextBuff1
- ldr r1, =gBattleTextBuff2
- ldrb r2, [r0]
- ldrb r0, [r1]
- cmp r2, r0
- bls _081A54BC
- movs r6, 0x2
- ldr r1, =gBattleScripting
- movs r0, 0
- strb r0, [r1, 0x17]
- b _081A553E
- .pool
-_081A54BC:
- cmp r2, r0
- bcs _081A54D0
- movs r6, 0x3
- ldr r1, =gBattleScripting
- movs r0, 0x1
- strb r0, [r1, 0x17]
- b _081A553E
- .pool
-_081A54D0:
- movs r6, 0x4
- b _081A553E
-_081A54D4:
- ldr r1, =0x00003f3e
- movs r0, 0x48
- bl SetGpuReg
- movs r0, 0x1
- str r0, [sp]
- movs r0, 0x5
- movs r1, 0
- movs r2, 0x18
- movs r3, 0xD
- bl HandleBattleWindow
- movs r0, 0
- bl CopyBgTilemapBufferToVram
- ldr r0, =gMPlayInfo_BGM
- ldr r1, =0x0000ffff
- movs r2, 0x80
- lsls r2, 1
- bl m4aMPlayVolumeControl
- ldr r0, =0x7fffff1c
- movs r1, 0
- str r1, [sp]
- movs r1, 0x4
- movs r2, 0x8
- movs r3, 0
- bl BeginNormalPaletteFade
- b _081A553E
- .pool
-_081A5520:
- ldr r0, =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _081A5544
- ldr r1, =0x00003f3f
- movs r0, 0x48
- bl SetGpuReg
- movs r0, 0xFA
- lsls r0, 2
- bl FreeSpriteTilesByTag
-_081A553C:
- movs r6, 0x1
-_081A553E:
- ldrb r0, [r5]
- adds r0, 0x1
- strb r0, [r5]
-_081A5544:
- adds r0, r6, 0
- add sp, 0x4
- pop {r4-r6}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81A5258
-
- thumb_func_start sub_81A5558
-sub_81A5558: @ 81A5558
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp]
- lsls r1, 24
- lsrs r1, 24
- mov r10, r1
- lsls r2, 24
- lsrs r2, 24
- mov r9, r2
- lsls r3, 24
- lsrs r7, r3, 24
- movs r6, 0
- movs r1, 0
- ldr r0, =gBattleStruct
- ldr r0, [r0]
- movs r3, 0xA6
- lsls r3, 2
- adds r4, r0, r3
- ldr r5, =0x0000029a
- adds r3, r0, r5
- adds r5, 0x2
- adds r5, r0
- mov r8, r5
- cmp r2, 0x1
- beq _081A55C4
- cmp r2, 0x1
- bgt _081A55A8
- cmp r2, 0
- beq _081A55B0
- b _081A5612
- .pool
-_081A55A8:
- mov r0, r9
- cmp r0, 0x2
- beq _081A55D8
- b _081A5612
-_081A55B0:
- adds r0, r4, r7
- movs r6, 0
- ldrsb r6, [r0, r6]
- movs r1, 0x1
- adds r0, r7, 0
- eors r0, r1
- adds r0, r4, r0
- movs r1, 0
- ldrsb r1, [r0, r1]
- b _081A5612
-_081A55C4:
- adds r0, r3, r7
- movs r6, 0
- ldrsb r6, [r0, r6]
- movs r1, 0x1
- adds r0, r7, 0
- eors r0, r1
- adds r0, r3, r0
- movs r1, 0
- ldrsb r1, [r0, r1]
- b _081A5612
-_081A55D8:
- ldr r3, =gBattleMons
- mov r9, r3
- movs r5, 0x58
- adds r0, r7, 0
- muls r0, r5
- add r0, r9
- ldrh r0, [r0, 0x28]
- movs r4, 0x64
- muls r0, r4
- lsls r1, r7, 1
- add r1, r8
- ldrh r1, [r1]
- bl __divsi3
- adds r6, r0, 0
- movs r0, 0x1
- adds r1, r7, 0
- eors r1, r0
- adds r0, r1, 0
- muls r0, r5
- add r0, r9
- ldrh r0, [r0, 0x28]
- muls r0, r4
- lsls r1, 1
- add r1, r8
- ldrh r1, [r1]
- bl __divsi3
- adds r1, r0, 0
-_081A5612:
- cmp r6, r1
- ble _081A5638
- movs r4, 0x2
- cmp r7, 0
- beq _081A5628
- ldr r1, =gBattleTextBuff2
- b _081A562A
- .pool
-_081A5628:
- ldr r1, =gBattleTextBuff1
-_081A562A:
- ldrb r0, [r1]
- adds r0, 0x2
- strb r0, [r1]
- b _081A565E
- .pool
-_081A5638:
- cmp r6, r1
- bne _081A565C
- movs r4, 0x1
- cmp r7, 0
- beq _081A564C
- ldr r1, =gBattleTextBuff2
- b _081A564E
- .pool
-_081A564C:
- ldr r1, =gBattleTextBuff1
-_081A564E:
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- b _081A565E
- .pool
-_081A565C:
- movs r4, 0
-_081A565E:
- ldr r0, =gUnknown_08611F5C
- ldr r1, [sp]
- mov r2, r10
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r0, r6, 4
- adds r0, r6
- lsls r0, 2
- ldr r1, =gSprites
- adds r0, r1
- adds r1, r4, 0
- bl StartSpriteAnim
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5558
-
- thumb_func_start sub_81A5698
-sub_81A5698: @ 81A5698
- push {lr}
- adds r1, r0, 0
- ldr r0, =gBattleCommunication
- ldrb r0, [r0]
- cmp r0, 0x8
- bls _081A56AA
- adds r0, r1, 0
- bl DestroySprite
-_081A56AA:
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5698
-
- thumb_func_start sub_81A56B4
-sub_81A56B4: @ 81A56B4
- ldr r0, =gBattleStruct
- ldr r2, [r0]
- movs r0, 0xA6
- lsls r0, 2
- adds r1, r2, r0
- adds r0, 0x2
- adds r3, r2, r0
- adds r0, 0x2
- adds r2, r0
- movs r0, 0
- strb r0, [r1]
- strb r0, [r1, 0x1]
- strb r0, [r3]
- strb r0, [r3, 0x1]
- ldr r0, =gBattleMons
- ldrh r1, [r0, 0x28]
- strh r1, [r2]
- adds r0, 0x80
- ldrh r0, [r0]
- strh r0, [r2, 0x2]
- bx lr
- .pool
- thumb_func_end sub_81A56B4
-
- thumb_func_start sub_81A56E8
-sub_81A56E8: @ 81A56E8
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gBattleStruct
- ldr r1, [r1]
- movs r2, 0xA6
- lsls r2, 2
- adds r1, r2
- adds r1, r0
- ldr r2, =gBattleArenaMoveMindRatings
- ldr r0, =gCurrentMove
- ldrh r0, [r0]
- adds r0, r2
- ldrb r0, [r0]
- ldrb r2, [r1]
- adds r0, r2
- strb r0, [r1]
- bx lr
- .pool
- thumb_func_end sub_81A56E8
-
- thumb_func_start sub_81A5718
-sub_81A5718: @ 81A5718
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r3, r0, 24
- adds r6, r3, 0
- ldr r0, =gBattleStruct
- ldr r2, [r0]
- ldr r0, =0x0000029a
- adds r5, r2, r0
- ldr r0, =gHitMarker
- ldr r0, [r0]
- movs r1, 0x80
- lsls r1, 18
- ands r0, r1
- cmp r0, 0
- beq _081A57DA
- ldr r0, =0x000002a2
- adds r4, r2, r0
- ldrb r2, [r4]
- ldr r0, =gBitTable
- lsls r1, r3, 2
- adds r1, r0
- ldr r1, [r1]
- adds r0, r2, 0
- ands r0, r1
- cmp r0, 0
- beq _081A576C
- bics r2, r1
- strb r2, [r4]
- adds r1, r5, r3
- ldrb r0, [r1]
- subs r0, 0x2
- b _081A57D8
- .pool
-_081A576C:
- ldr r0, =gMoveResultFlags
- ldrb r1, [r0]
- movs r0, 0x29
- ands r0, r1
- cmp r0, 0
- beq _081A5798
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _081A5788
- ldr r0, =gBattleCommunication
- ldrb r0, [r0, 0x6]
- cmp r0, 0x1
- beq _081A57DA
-_081A5788:
- adds r1, r5, r3
- ldrb r0, [r1]
- subs r0, 0x2
- b _081A57D8
- .pool
-_081A5798:
- movs r0, 0x6
- ands r0, r1
- cmp r0, 0x6
- bne _081A57A4
- adds r1, r5, r3
- b _081A57D4
-_081A57A4:
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _081A57B4
- adds r1, r5, r3
- ldrb r0, [r1]
- adds r0, 0x2
- b _081A57D8
-_081A57B4:
- movs r0, 0x4
- ands r0, r1
- cmp r0, 0
- beq _081A57C4
- adds r1, r5, r3
- ldrb r0, [r1]
- subs r0, 0x1
- b _081A57D8
-_081A57C4:
- ldr r0, =gProtectStructs
- lsls r1, r6, 4
- adds r1, r0
- ldrb r0, [r1]
- lsls r0, 31
- cmp r0, 0
- bne _081A57DA
- adds r1, r5, r6
-_081A57D4:
- ldrb r0, [r1]
- adds r0, 0x1
-_081A57D8:
- strb r0, [r1]
-_081A57DA:
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5718
-
- thumb_func_start sub_81A57E4
-sub_81A57E4: @ 81A57E4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 16
- lsrs r1, 16
- adds r2, r1, 0
- ldr r0, =gBattleStruct
- ldr r0, [r0]
- ldr r5, =0x0000029a
- adds r3, r0, r5
- movs r0, 0x99
- lsls r0, 1
- cmp r1, r0
- bgt _081A582A
- subs r0, 0x1
- cmp r1, r0
- bge _081A585C
- cmp r1, 0xC5
- bgt _081A581C
- cmp r1, 0xC3
- bge _081A585C
- cmp r1, 0x77
- beq _081A585C
- b _081A5864
- .pool
-_081A581C:
- cmp r1, 0xC7
- blt _081A5864
- cmp r1, 0xCC
- ble _081A585C
- cmp r1, 0xCE
- beq _081A585C
- b _081A5864
-_081A582A:
- ldr r0, =0x00000147
- cmp r1, r0
- beq _081A585C
- cmp r1, r0
- bgt _081A5848
- subs r0, 0x12
- cmp r1, r0
- beq _081A585C
- adds r0, 0x2
- cmp r1, r0
- beq _081A585C
- b _081A5864
- .pool
-_081A5848:
- movs r0, 0xAD
- lsls r0, 1
- cmp r2, r0
- blt _081A5864
- adds r0, 0x1
- cmp r2, r0
- ble _081A585C
- adds r0, 0x3
- cmp r2, r0
- bne _081A5864
-_081A585C:
- adds r1, r3, r4
- ldrb r0, [r1]
- subs r0, 0x3
- strb r0, [r1]
-_081A5864:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_81A57E4
-
- thumb_func_start sub_81A586C
-sub_81A586C: @ 81A586C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gBattleStruct
- ldr r3, [r1]
- movs r1, 0xA7
- lsls r1, 2
- adds r3, r1
- lsls r2, r0, 1
- adds r2, r3
- ldr r5, =gBattleMons
- movs r4, 0x58
- adds r1, r0, 0
- muls r1, r4
- adds r1, r5
- ldrh r1, [r1, 0x28]
- strh r1, [r2]
- movs r1, 0x1
- eors r0, r1
- lsls r1, r0, 1
- adds r1, r3
- muls r0, r4
- adds r0, r5
- ldrh r2, [r0, 0x28]
- ldrh r0, [r1]
- cmp r0, r2
- bls _081A58A4
- strh r2, [r1]
-_081A58A4:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A586C
-
- thumb_func_start sub_81A58B4
-sub_81A58B4: @ 81A58B4
- push {r4-r6,lr}
- ldr r4, =gSaveBlock2Ptr
- ldr r1, [r4]
- ldr r3, =0x00000ca9
- adds r0, r1, r3
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r5, r0, 30
- ldr r0, =0x00000ca8
- adds r1, r0
- movs r2, 0
- strb r2, [r1]
- ldr r1, [r4]
- ldr r6, =0x00000cb2
- adds r0, r1, r6
- strh r2, [r0]
- adds r1, r3
- ldrb r2, [r1]
- movs r0, 0x5
- negs r0, r0
- ands r0, r2
- strb r0, [r1]
- ldr r1, [r4]
- adds r1, r3
- ldrb r2, [r1]
- movs r0, 0x9
- negs r0, r0
- ands r0, r2
- strb r0, [r1]
- cmp r5, 0
- beq _081A5914
- ldr r0, [r4]
- ldr r1, =0x00000cdc
- adds r0, r1
- ldr r2, [r0]
- movs r0, 0x80
- b _081A591E
- .pool
-_081A5914:
- ldr r0, [r4]
- ldr r3, =0x00000cdc
- adds r0, r3
- ldr r2, [r0]
- movs r0, 0x40
-_081A591E:
- ands r2, r0
- cmp r2, 0
- bne _081A5930
- ldr r0, [r4]
- lsls r1, r5, 1
- ldr r6, =0x00000dda
- adds r0, r6
- adds r0, r1
- strh r2, [r0]
-_081A5930:
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- movs r1, 0x4
- ldrsb r1, [r0, r1]
- movs r2, 0x5
- ldrsb r2, [r0, r2]
- movs r3, 0x1
- negs r3, r3
- movs r0, 0
- bl saved_warp2_set
- ldr r1, =gTrainerBattleOpponent_A
- movs r0, 0
- strh r0, [r1]
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A58B4
-
- thumb_func_start sub_81A5964
-sub_81A5964: @ 81A5964
- push {r4,lr}
- ldr r0, =gSaveBlock2Ptr
- ldr r3, [r0]
- ldr r1, =0x00000ca9
- adds r0, r3, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r1, r0, 30
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- cmp r0, 0x1
- beq _081A59B0
- cmp r0, 0x1
- bgt _081A5994
- cmp r0, 0
- beq _081A599A
- b _081A59EE
- .pool
-_081A5994:
- cmp r0, 0x2
- beq _081A59C8
- b _081A59EE
-_081A599A:
- ldr r0, =gSpecialVar_Result
- ldr r2, =0x00000dd8
- adds r1, r3, r2
- ldrh r1, [r1]
- strh r1, [r0]
- b _081A59EE
- .pool
-_081A59B0:
- ldr r2, =gSpecialVar_Result
- lsls r1, 1
- ldr r4, =0x00000dda
- adds r0, r3, r4
- adds r0, r1
- ldrh r0, [r0]
- b _081A59EC
- .pool
-_081A59C8:
- cmp r1, 0
- beq _081A59E0
- ldr r2, =gSpecialVar_Result
- ldr r1, =0x00000cdc
- adds r0, r3, r1
- ldr r0, [r0]
- movs r1, 0x80
- b _081A59EA
- .pool
-_081A59E0:
- ldr r2, =gSpecialVar_Result
- ldr r4, =0x00000cdc
- adds r0, r3, r4
- ldr r0, [r0]
- movs r1, 0x40
-_081A59EA:
- ands r0, r1
-_081A59EC:
- strh r0, [r2]
-_081A59EE:
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5964
-
- thumb_func_start sub_81A59FC
-sub_81A59FC: @ 81A59FC
- push {lr}
- ldr r0, =gSaveBlock2Ptr
- ldr r2, [r0]
- ldr r1, =0x00000ca9
- adds r0, r2, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r1, r0, 30
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- cmp r0, 0x1
- beq _081A5A48
- cmp r0, 0x1
- bgt _081A5A2C
- cmp r0, 0
- beq _081A5A32
- b _081A5ABA
- .pool
-_081A5A2C:
- cmp r0, 0x2
- beq _081A5A60
- b _081A5ABA
-_081A5A32:
- ldr r0, =gSpecialVar_0x8006
- ldrh r1, [r0]
- ldr r3, =0x00000dd8
- adds r0, r2, r3
- strh r1, [r0]
- b _081A5ABA
- .pool
-_081A5A48:
- lsls r1, 1
- ldr r3, =0x00000dda
- adds r0, r2, r3
- adds r0, r1
- ldr r1, =gSpecialVar_0x8006
- ldrh r1, [r1]
- strh r1, [r0]
- b _081A5ABA
- .pool
-_081A5A60:
- cmp r1, 0
- beq _081A5A90
- ldr r0, =gSpecialVar_0x8006
- ldrh r0, [r0]
- cmp r0, 0
- beq _081A5A80
- ldr r1, =0x00000cdc
- adds r0, r2, r1
- ldr r1, [r0]
- movs r2, 0x80
- orrs r1, r2
- b _081A5AB8
- .pool
-_081A5A80:
- ldr r3, =0x00000cdc
- adds r0, r2, r3
- ldr r1, [r0]
- movs r2, 0x81
- negs r2, r2
- b _081A5AB6
- .pool
-_081A5A90:
- ldr r0, =gSpecialVar_0x8006
- ldrh r0, [r0]
- cmp r0, 0
- beq _081A5AAC
- ldr r1, =0x00000cdc
- adds r0, r2, r1
- ldr r1, [r0]
- movs r2, 0x40
- orrs r1, r2
- b _081A5AB8
- .pool
-_081A5AAC:
- ldr r3, =0x00000cdc
- adds r0, r2, r3
- ldr r1, [r0]
- movs r2, 0x41
- negs r2, r2
-_081A5AB6:
- ands r1, r2
-_081A5AB8:
- str r1, [r0]
-_081A5ABA:
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A59FC
-
- thumb_func_start sub_81A5AC4
-sub_81A5AC4: @ 81A5AC4
- push {r4,lr}
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r1, =gSpecialVar_0x8005
- ldrh r1, [r1]
- ldr r2, =0x00000ca8
- adds r0, r2
- strb r1, [r0]
- movs r0, 0x80
- lsls r0, 7
- movs r1, 0
- bl VarSet
- ldr r1, [r4]
- ldr r0, =0x00000ca9
- adds r1, r0
- ldrb r0, [r1]
- movs r2, 0x4
- orrs r0, r2
- strb r0, [r1]
- bl sub_81A4C30
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5AC4
-
- thumb_func_start sub_81A5B08
-sub_81A5B08: @ 81A5B08
- push {r4,r5,lr}
- ldr r4, =gSaveBlock2Ptr
- ldr r1, [r4]
- ldr r2, =0x00000ca9
- adds r0, r1, r2
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r0, 29
- ldr r2, =0x00000dda
- adds r1, r2
- adds r1, r0
- ldrh r0, [r1]
- cmp r0, 0x29
- bls _081A5B58
- bl Random
- ldr r4, [r4]
- ldr r5, =gUnknown_08611FAC
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x9
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 15
- adds r0, r5
- ldrh r0, [r0]
- ldr r1, =0x00000dd8
- adds r4, r1
- b _081A5B76
- .pool
-_081A5B58:
- bl Random
- ldr r4, [r4]
- ldr r5, =gUnknown_08611FA0
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x6
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 15
- adds r0, r5
- ldrh r0, [r0]
- ldr r2, =0x00000dd8
- adds r4, r2
-_081A5B76:
- strh r0, [r4]
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5B08
-
- thumb_func_start sub_81A5B88
-sub_81A5B88: @ 81A5B88
- push {r4,r5,lr}
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r1, =0x00000dd8
- adds r0, r1
- ldrh r0, [r0]
- movs r1, 0x1
- bl AddBagItem
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x1
- bne _081A5BD0
- ldr r0, [r4]
- ldr r1, =0x00000dd8
- adds r0, r1
- ldrh r0, [r0]
- ldr r1, =gStringVar1
- bl CopyItemName
- ldr r0, [r4]
- ldr r1, =0x00000dd8
- adds r0, r1
- movs r1, 0
- strh r1, [r0]
- ldr r0, =gSpecialVar_Result
- strh r5, [r0]
- b _081A5BD6
- .pool
-_081A5BD0:
- ldr r1, =gSpecialVar_Result
- movs r0, 0
- strh r0, [r1]
-_081A5BD6:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5B88
-
- thumb_func_start sub_81A5BE0
-sub_81A5BE0: @ 81A5BE0
- push {lr}
- ldr r0, =gStringVar1
- ldr r1, =gTrainerBattleOpponent_A
- ldrh r1, [r1]
- bl GetFrontierTrainerName
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5BE0
-
- thumb_func_start sub_81A5BF8
-sub_81A5BF8: @ 81A5BF8
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- sub sp, 0xC
- movs r0, 0x1B
- mov r8, r0
- movs r5, 0x7
- movs r4, 0x1
- str r4, [sp]
- movs r6, 0x6
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0
- movs r2, 0xFE
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0
- movs r2, 0x20
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x31
- movs r2, 0
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x33
- movs r2, 0x1
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- mov r0, r8
- str r0, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x34
- movs r2, 0x2
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- movs r0, 0x1C
- mov r8, r0
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x35
- movs r2, 0x1C
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x36
- movs r2, 0x1D
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- str r4, [sp]
- movs r6, 0x5
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x37
- movs r2, 0
- movs r3, 0xF
- bl FillBgTilemapBufferRect
- mov r0, r8
- str r0, [sp]
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x39
- movs r2, 0x1
- movs r3, 0xF
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x3A
- movs r2, 0x1D
- movs r3, 0xF
- bl FillBgTilemapBufferRect
- ldr r1, =0x00000831
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r2, 0
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- ldr r1, =0x00000833
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r2, 0x1
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- ldr r1, =0x00000834
- movs r0, 0x1A
- str r0, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r2, 0x2
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- ldr r1, =0x00000835
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r2, 0x1C
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- ldr r1, =0x00000836
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r2, 0x1D
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- add sp, 0xC
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5BF8
-
- thumb_func_start sub_81A5D44
-sub_81A5D44: @ 81A5D44
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- sub sp, 0xC
- movs r5, 0
- movs r4, 0x1
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x3
- movs r2, 0
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- movs r6, 0x4
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x4
- movs r2, 0x1
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- movs r0, 0x1B
- mov r8, r0
- str r0, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x5
- movs r2, 0x2
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x6
- movs r2, 0x1C
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x7
- movs r2, 0x1D
- movs r3, 0xE
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x8
- movs r2, 0
- movs r3, 0xF
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x9
- movs r2, 0x1
- movs r3, 0xF
- bl FillBgTilemapBufferRect
- mov r0, r8
- str r0, [sp]
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0xA
- movs r2, 0x2
- movs r3, 0xF
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0xB
- movs r2, 0x1C
- movs r3, 0xF
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r6, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0xC
- movs r2, 0x1D
- movs r3, 0xF
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0xD
- movs r2, 0
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0xE
- movs r2, 0x1
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- mov r0, r8
- str r0, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0xF
- movs r2, 0x2
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x10
- movs r2, 0x1C
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0x11
- movs r2, 0x1D
- movs r3, 0x13
- bl FillBgTilemapBufferRect
- add sp, 0xC
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_81A5D44
-
- thumb_func_start sub_81A5E74
-sub_81A5E74: @ 81A5E74
- push {lr}
- ldr r1, =gUnknown_08612120
- ldr r0, =gSpecialVar_0x8004
- ldrh r0, [r0]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5E74
-
- thumb_func_start sub_81A5E94
-sub_81A5E94: @ 81A5E94
- push {r4-r7,lr}
- ldr r5, =gSaveBlock2Ptr
- ldr r0, [r5]
- ldr r4, =0x00000ca9
- adds r0, r4
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r7, r0, 30
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 16
- lsrs r6, r0, 16
- ldr r0, [r5]
- ldr r1, =0x00000ca8
- adds r0, r1
- movs r2, 0
- strb r2, [r0]
- ldr r1, [r5]
- ldr r3, =0x00000cb2
- adds r0, r1, r3
- strh r2, [r0]
- adds r1, r4
- ldrb r2, [r1]
- movs r0, 0x5
- negs r0, r0
- ands r0, r2
- strb r0, [r1]
- ldr r1, [r5]
- adds r1, r4
- ldrb r2, [r1]
- movs r0, 0x9
- negs r0, r0
- ands r0, r2
- strb r0, [r1]
- ldr r4, [r5]
- ldr r0, =0x00000cdc
- adds r3, r4, r0
- ldr r2, =gUnknown_08612164
- lsls r0, r7, 2
- lsls r1, r6, 3
- adds r0, r1
- adds r0, r2
- ldr r3, [r3]
- ldr r0, [r0]
- ands r3, r0
- cmp r3, 0
- bne _081A5F0A
- lsls r1, r7, 1
- lsls r0, r6, 2
- adds r1, r0
- ldr r2, =0x00000de2
- adds r0, r4, r2
- adds r0, r1
- strh r3, [r0]
- adds r2, 0x10
- adds r0, r4, r2
- adds r0, r1
- strh r3, [r0]
-_081A5F0A:
- ldr r1, =gUnknown_03001288
- movs r0, 0
- strb r0, [r1]
- movs r2, 0
- ldr r6, =gSaveBlock1Ptr
- movs r4, 0xE7
- lsls r4, 4
- ldr r0, =0x0000ffff
- adds r3, r0, 0
-_081A5F1C:
- ldr r1, [r5]
- lsls r0, r2, 1
- adds r0, r2
- lsls r0, 2
- adds r1, r0
- adds r1, r4
- ldrh r0, [r1]
- orrs r0, r3
- strh r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x5
- bls _081A5F1C
- movs r2, 0
- ldr r4, =gUnknown_03006298
- ldr r1, =0x0000ffff
- adds r3, r1, 0
-_081A5F40:
- lsls r0, r2, 1
- adds r0, r4
- ldrh r1, [r0]
- orrs r1, r3
- strh r1, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x2
- bls _081A5F40
- ldr r0, [r6]
- movs r1, 0x4
- ldrsb r1, [r0, r1]
- movs r2, 0x5
- ldrsb r2, [r0, r2]
- movs r3, 0x1
- negs r3, r3
- movs r0, 0
- bl saved_warp2_set
- ldr r1, =gTrainerBattleOpponent_A
- movs r0, 0
- strh r0, [r1]
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5E94
-
- thumb_func_start sub_81A5FA8
-sub_81A5FA8: @ 81A5FA8
- push {r4-r7,lr}
- ldr r7, =gSaveBlock2Ptr
- ldr r0, [r7]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r6, r0, 30
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 16
- lsrs r5, r0, 16
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- cmp r0, 0x2
- beq _081A6000
- cmp r0, 0x2
- bgt _081A5FE4
- cmp r0, 0x1
- beq _081A5FEA
- b _081A6044
- .pool
-_081A5FE4:
- cmp r0, 0x3
- beq _081A6030
- b _081A6044
-_081A5FEA:
- ldr r3, =gSpecialVar_Result
- ldr r0, [r7]
- lsls r1, r6, 1
- lsls r2, r5, 2
- adds r1, r2
- ldr r2, =0x00000de2
- b _081A603C
- .pool
-_081A6000:
- ldr r4, =gSpecialVar_Result
- ldr r2, [r7]
- ldr r0, =0x00000cdc
- adds r2, r0
- ldr r3, =gUnknown_08612164
- lsls r0, r6, 2
- lsls r1, r5, 3
- adds r0, r1
- adds r0, r3
- ldr r1, [r2]
- ldr r0, [r0]
- ands r1, r0
- negs r0, r1
- orrs r0, r1
- lsrs r0, 31
- strh r0, [r4]
- b _081A6044
- .pool
-_081A6030:
- ldr r3, =gSpecialVar_Result
- ldr r0, [r7]
- lsls r1, r6, 1
- lsls r2, r5, 2
- adds r1, r2
- ldr r2, =0x00000df2
-_081A603C:
- adds r0, r2
- adds r0, r1
- ldrh r0, [r0]
- strh r0, [r3]
-_081A6044:
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A5FA8
-
- thumb_func_start sub_81A6054
-sub_81A6054: @ 81A6054
- push {r4-r6,lr}
- ldr r6, =gSaveBlock2Ptr
- ldr r0, [r6]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r5, r0, 30
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- cmp r0, 0x2
- beq _081A60B4
- cmp r0, 0x2
- bgt _081A6090
- cmp r0, 0x1
- beq _081A6096
- b _081A6128
- .pool
-_081A6090:
- cmp r0, 0x3
- beq _081A6108
- b _081A6128
-_081A6096:
- ldr r2, [r6]
- lsls r0, r5, 1
- lsls r1, r4, 2
- adds r0, r1
- ldr r1, =0x00000de2
- adds r2, r1
- adds r2, r0
- ldr r0, =gSpecialVar_0x8006
- ldrh r0, [r0]
- strh r0, [r2]
- b _081A6128
- .pool
-_081A60B4:
- ldr r0, =gSpecialVar_0x8006
- ldrh r0, [r0]
- cmp r0, 0
- beq _081A60E4
- ldr r2, [r6]
- ldr r0, =0x00000cdc
- adds r2, r0
- ldr r3, =gUnknown_08612164
- lsls r1, r5, 2
- lsls r0, r4, 3
- adds r1, r0
- adds r1, r3
- ldr r0, [r2]
- ldr r1, [r1]
- orrs r0, r1
- str r0, [r2]
- b _081A6128
- .pool
-_081A60E4:
- ldr r2, [r6]
- ldr r1, =0x00000cdc
- adds r2, r1
- ldr r3, =gUnknown_08612174
- lsls r1, r5, 2
- lsls r0, r4, 3
- adds r1, r0
- adds r1, r3
- ldr r0, [r2]
- ldr r1, [r1]
- ands r0, r1
- str r0, [r2]
- b _081A6128
- .pool
-_081A6108:
- ldr r3, =gUnknown_03001288
- ldrb r0, [r3]
- cmp r0, 0x1
- bne _081A6128
- ldr r2, [r6]
- lsls r0, r5, 1
- lsls r1, r4, 2
- adds r0, r1
- ldr r1, =0x00000df2
- adds r2, r1
- adds r2, r0
- ldr r0, =gSpecialVar_0x8006
- ldrh r0, [r0]
- movs r1, 0
- strh r0, [r2]
- strb r1, [r3]
-_081A6128:
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A6054
-
- thumb_func_start sub_81A613C
-sub_81A613C: @ 81A613C
- push {r4,lr}
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r1, =gSpecialVar_0x8005
- ldrh r1, [r1]
- ldr r2, =0x00000ca8
- adds r0, r2
- strb r1, [r0]
- movs r0, 0x80
- lsls r0, 7
- movs r1, 0
- bl VarSet
- ldr r1, [r4]
- ldr r0, =0x00000ca9
- adds r1, r0
- ldrb r0, [r1]
- movs r2, 0x4
- orrs r0, r2
- strb r0, [r1]
- bl sub_81A4C30
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A613C
-
- thumb_func_start nullsub_75
-nullsub_75: @ 81A6180
- bx lr
- thumb_func_end nullsub_75
-
- thumb_func_start nullsub_123
-nullsub_123: @ 81A6184
- bx lr
- thumb_func_end nullsub_123
-
- thumb_func_start sub_81A6188
-sub_81A6188: @ 81A6188
- push {lr}
- bl ZeroPlayerPartyMons
- bl DoBattleFactorySelectScreen
- pop {r0}
- bx r0
- thumb_func_end sub_81A6188
-
- thumb_func_start sub_81A6198
-sub_81A6198: @ 81A6198
- push {lr}
- bl DoBattleFactorySwapScreen
- pop {r0}
- bx r0
- thumb_func_end sub_81A6198
-
- thumb_func_start sub_81A61A4
-sub_81A61A4: @ 81A61A4
- ldr r1, =gUnknown_03001288
- movs r0, 0x1
- strb r0, [r1]
- bx lr
- .pool
- thumb_func_end sub_81A61A4
-
- thumb_func_start sub_81A61B0
-sub_81A61B0: @ 81A61B0
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x28
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r0, 30
- str r0, [sp, 0x10]
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 16
- ldr r1, [r4]
- ldr r3, [sp, 0x10]
- lsls r2, r3, 1
- lsrs r0, 14
- adds r2, r0
- ldr r6, =0x00000de2
- adds r1, r6
- adds r1, r2
- ldrh r0, [r1]
- movs r1, 0x7
- bl __udivsi3
- ldr r2, =gFacilityTrainers
- ldr r1, =gBattleFrontierTrainers
- str r1, [r2]
- ldr r5, =0x00000cb2
- lsls r0, 24
- str r0, [sp, 0x20]
- mov r8, r0
-_081A61FA:
- ldr r0, [r4]
- adds r0, r5
- ldrb r1, [r0]
- mov r2, r8
- lsrs r0, r2, 24
- bl sub_8162548
- lsls r0, 16
- lsrs r3, r0, 16
- movs r7, 0
- ldr r1, [r4]
- adds r0, r1, r5
- ldr r6, [sp, 0x10]
- lsls r6, 24
- str r6, [sp, 0x1C]
- ldrh r0, [r0]
- cmp r7, r0
- bge _081A6244
- ldr r2, =0x00000cb4
- adds r0, r1, r2
- ldrh r0, [r0]
- ldr r6, =gSaveBlock2Ptr
- cmp r0, r3
- beq _081A6244
- ldr r1, [r6]
- ldr r6, =0x00000cb2
- adds r0, r1, r6
- ldrh r2, [r0]
- ldr r0, =0x00000cb4
- adds r1, r0
-_081A6236:
- adds r1, 0x2
- adds r7, 0x1
- cmp r7, r2
- bge _081A6244
- ldrh r0, [r1]
- cmp r0, r3
- bne _081A6236
-_081A6244:
- ldr r0, [r4]
- ldr r1, =0x00000cb2
- adds r0, r1
- ldr r6, =gSaveBlock2Ptr
- ldrh r0, [r0]
- cmp r7, r0
- bne _081A61FA
- ldr r0, =gTrainerBattleOpponent_A
- strh r3, [r0]
- ldr r2, [r6]
- adds r1, r2, r1
- ldrh r0, [r1]
- cmp r0, 0x5
- bhi _081A626C
- adds r1, r0, 0
- lsls r1, 1
- ldr r4, =0x00000cb4
- adds r0, r2, r4
- adds r0, r1
- strh r3, [r0]
-_081A626C:
- movs r7, 0
- mov r10, sp
- movs r6, 0
- lsls r6, 1
- str r6, [sp, 0x14]
- add r6, sp
- str r6, [sp, 0x18]
-_081A627A:
- ldr r1, [sp, 0x1C]
- lsrs r0, r1, 24
- ldr r2, [sp, 0x20]
- lsrs r1, r2, 24
- movs r2, 0
- bl sub_81A6EF0
- lsls r0, 16
- lsrs r0, 16
- mov r9, r0
- ldr r4, =gFacilityTrainerMons
- ldr r2, [r4]
- lsls r1, r0, 4
- adds r0, r1, r2
- ldrh r0, [r0]
- cmp r0, 0xC9
- beq _081A636E
- movs r3, 0
- ldr r6, =gSaveBlock2Ptr
- mov r8, r1
- adds r5, r0, 0
- ldr r1, [r6]
-_081A62A6:
- movs r4, 0xE7
- lsls r4, 4
- adds r0, r1, r4
- ldrh r0, [r0]
- lsls r0, 4
- adds r0, r2
- ldrh r0, [r0]
- cmp r5, r0
- beq _081A62C0
- adds r1, 0xC
- adds r3, 0x1
- cmp r3, 0x5
- ble _081A62A6
-_081A62C0:
- cmp r3, 0x6
- bne _081A636E
- ldr r6, [sp, 0x10]
- cmp r6, 0
- bne _081A62D0
- ldr r0, =0x00000351
- cmp r9, r0
- bhi _081A636E
-_081A62D0:
- movs r2, 0
- adds r4, r2, r7
- cmp r2, r4
- bge _081A6302
- ldr r1, [sp, 0x18]
- ldrh r0, [r1]
- cmp r0, r5
- beq _081A6302
- adds r6, r4, 0
- ldr r3, =gFacilityTrainerMons
- mov r12, r3
- mov r5, r8
- ldr r3, [sp, 0x14]
- add r3, sp
-_081A62EC:
- adds r3, 0x2
- adds r2, 0x1
- cmp r2, r6
- bge _081A6302
- mov r1, r12
- ldr r0, [r1]
- adds r0, r5, r0
- ldrh r1, [r3]
- ldrh r0, [r0]
- cmp r1, r0
- bne _081A62EC
-_081A6302:
- cmp r2, r4
- bne _081A636E
- movs r2, 0
- cmp r2, r4
- bge _081A633E
- ldr r3, =gBattleFrontierHeldItems
- mov r12, r3
- add r0, sp, 0x8
- ldr r6, [sp, 0x14]
- adds r3, r0, r6
- mov r0, r8
- str r0, [sp, 0x24]
- adds r5, r4, 0
-_081A631C:
- ldrh r1, [r3]
- cmp r1, 0
- beq _081A6336
- ldr r6, =gFacilityTrainerMons
- ldr r0, [r6]
- ldr r6, [sp, 0x24]
- adds r0, r6, r0
- ldrb r0, [r0, 0xA]
- lsls r0, 1
- add r0, r12
- ldrh r0, [r0]
- cmp r1, r0
- beq _081A633E
-_081A6336:
- adds r3, 0x2
- adds r2, 0x1
- cmp r2, r5
- blt _081A631C
-_081A633E:
- cmp r2, r4
- bne _081A636E
- lsls r4, r7, 1
- ldr r0, =gFacilityTrainerMons
- ldr r1, [r0]
- add r1, r8
- ldrh r0, [r1]
- mov r2, r10
- strh r0, [r2]
- add r2, sp, 0x8
- adds r2, r4
- ldr r3, =gBattleFrontierHeldItems
- ldrb r0, [r1, 0xA]
- lsls r0, 1
- adds r0, r3
- ldrh r0, [r0]
- strh r0, [r2]
- ldr r0, =gUnknown_03006298
- adds r4, r0
- mov r3, r9
- strh r3, [r4]
- movs r4, 0x2
- add r10, r4
- adds r7, 0x1
-_081A636E:
- cmp r7, 0x3
- bne _081A627A
- add sp, 0x28
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A61B0
-
- thumb_func_start sub_81A63B8
-sub_81A63B8: @ 81A63B8
- push {lr}
- ldr r0, =gTrainerBattleOpponent_A
- ldrh r0, [r0]
- movs r1, 0
- bl SetBattleFacilityTrainerGfxId
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A63B8
-
- thumb_func_start sub_81A63CC
-sub_81A63CC: @ 81A63CC
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- 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 _081A63FC
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gBattleFrontierMons
- b _081A6400
- .pool
-_081A63FC:
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gSlateportBattleTentMons
-_081A6400:
- str r0, [r1]
- movs r7, 0
- ldr r2, =gSaveBlock2Ptr
- mov r8, r2
-_081A6408:
- mov r0, r8
- ldr r1, [r0]
- adds r0, r7, 0x3
- lsls r4, r0, 1
- adds r4, r0
- lsls r4, 2
- adds r1, r4
- ldr r0, =gUnknown_03006298
- lsls r6, r7, 1
- adds r6, r0
- ldrh r0, [r6]
- movs r2, 0xE7
- lsls r2, 4
- adds r1, r2
- strh r0, [r1]
- movs r0, 0x64
- adds r5, r7, 0
- muls r5, r0
- ldr r0, =gEnemyParty
- adds r5, r0
- adds r0, r5, 0
- movs r1, 0x28
- movs r2, 0
- bl GetBoxMonData
- mov r2, r8
- ldr r1, [r2]
- adds r1, r4
- ldr r2, =0x00000e78
- adds r1, r2
- strb r0, [r1]
- adds r0, r5, 0
- movs r1, 0
- movs r2, 0
- bl GetMonData
- mov r2, r8
- ldr r1, [r2]
- ldr r2, =0x00000e74
- adds r1, r2
- adds r1, r4
- str r0, [r1]
- adds r0, r5, 0
- movs r1, 0x2E
- movs r2, 0
- bl GetBoxMonData
- mov r2, r8
- ldr r1, [r2]
- adds r1, r4
- ldr r2, =0x00000e79
- adds r1, r2
- strb r0, [r1]
- ldrh r1, [r6]
- ldr r0, =gFacilityTrainerMons
- ldr r0, [r0]
- lsls r1, 4
- adds r1, r0
- ldrb r2, [r1, 0xA]
- lsls r2, 1
- ldr r0, =gBattleFrontierHeldItems
- adds r2, r0
- adds r0, r5, 0
- movs r1, 0xC
- bl SetMonData
- adds r0, r7, 0x1
- lsls r0, 24
- lsrs r7, r0, 24
- cmp r7, 0x2
- bls _081A6408
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A63CC
-
- thumb_func_start sub_81A64C4
-sub_81A64C4: @ 81A64C4
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x24
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldr r1, =0x00000ca9
- adds r2, r0, r1
- ldrb r1, [r2]
- movs r3, 0x3
- adds r0, r3, 0
- ands r0, r1
- cmp r0, 0x2
- bne _081A6500
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gSlateportBattleTentMons
- str r0, [r1]
- movs r2, 0x1E
- str r2, [sp, 0x14]
- b _081A6518
- .pool
-_081A6500:
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gBattleFrontierMons
- str r0, [r1]
- ldrb r1, [r2]
- adds r0, r3, 0
- ands r0, r1
- movs r4, 0x32
- str r4, [sp, 0x14]
- cmp r0, 0
- beq _081A6518
- movs r5, 0x64
- str r5, [sp, 0x14]
-_081A6518:
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- cmp r0, 0x1
- bls _081A6522
- b _081A666C
-_081A6522:
- bl ZeroPlayerPartyMons
- movs r0, 0
- mov r8, r0
- mov r1, sp
- adds r1, 0x12
- str r1, [sp, 0x1C]
- ldr r2, =gFacilityTrainerMons
- mov r9, r2
-_081A6534:
- ldr r4, =gSaveBlock2Ptr
- ldr r2, [r4]
- mov r5, r8
- lsls r5, 1
- mov r10, r5
- mov r3, r10
- add r3, r8
- lsls r3, 2
- adds r1, r2, r3
- movs r4, 0xE7
- lsls r4, 4
- adds r0, r1, r4
- ldrh r7, [r0]
- ldr r5, =0x00000e78
- adds r1, r5
- ldrb r6, [r1]
- movs r1, 0x64
- mov r0, r8
- muls r0, r1
- ldr r1, =gPlayerParty
- adds r0, r1
- mov r4, r9
- ldr r1, [r4]
- lsls r4, r7, 4
- adds r1, r4, r1
- ldrh r1, [r1]
- movs r5, 0x1
- str r5, [sp]
- ldr r5, =0x00000e74
- adds r2, r5
- adds r2, r3
- ldr r2, [r2]
- str r2, [sp, 0x4]
- movs r2, 0
- str r2, [sp, 0x8]
- str r2, [sp, 0xC]
- ldr r2, [sp, 0x14]
- adds r3, r6, 0
- bl CreateMon
- movs r1, 0
- mov r2, r9
- ldr r0, [r2]
- adds r4, r0
- ldrb r4, [r4, 0xB]
- mov r5, r8
- adds r5, 0x1
- str r5, [sp, 0x18]
- movs r5, 0x5
-_081A6596:
- adds r0, r4, 0
- movs r2, 0x1
- ands r0, r2
- cmp r0, 0
- beq _081A65A2
- adds r1, 0x1
-_081A65A2:
- lsrs r4, 1
- subs r5, 0x1
- cmp r5, 0
- bge _081A6596
- movs r0, 0xFF
- lsls r0, 1
- bl __divsi3
- add r1, sp, 0x10
- strh r0, [r1]
- movs r4, 0x1
- movs r5, 0
- lsls r7, 4
- movs r0, 0x64
- mov r6, r8
- muls r6, r0
- ldr r3, =gPlayerParty
-_081A65C4:
- mov r1, r9
- ldr r0, [r1]
- adds r0, r7, r0
- ldrb r0, [r0, 0xB]
- ands r0, r4
- cmp r0, 0
- beq _081A65E2
- adds r1, r5, 0
- adds r1, 0x1A
- adds r0, r6, r3
- add r2, sp, 0x10
- str r3, [sp, 0x20]
- bl SetMonData
- ldr r3, [sp, 0x20]
-_081A65E2:
- lsls r0, r4, 25
- lsrs r4, r0, 24
- adds r5, 0x1
- cmp r5, 0x5
- ble _081A65C4
- movs r2, 0x64
- mov r4, r8
- muls r4, r2
- ldr r5, =gPlayerParty
- adds r0, r4, r5
- bl CalculateMonStats
- movs r0, 0
- ldr r1, [sp, 0x1C]
- strb r0, [r1]
- movs r6, 0
-_081A6602:
- mov r2, r9
- ldr r0, [r2]
- adds r0, r7, r0
- lsls r1, r6, 1
- adds r0, 0x2
- adds r0, r1
- ldrh r1, [r0]
- lsls r2, r6, 24
- lsrs r2, 24
- adds r0, r4, r5
- bl SetMonMoveAvoidReturn
- adds r6, 0x1
- cmp r6, 0x3
- ble _081A6602
- movs r5, 0x64
- mov r4, r8
- muls r4, r5
- ldr r0, =gPlayerParty
- adds r4, r0
- adds r0, r4, 0
- movs r1, 0x20
- ldr r2, [sp, 0x1C]
- bl SetMonData
- mov r1, r9
- 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
- add r2, r8
- lsls r2, 2
- ldr r5, =gSaveBlock2Ptr
- ldr r0, [r5]
- adds r2, r0
- ldr r0, =0x00000e79
- adds r2, r0
- adds r0, r4, 0
- movs r1, 0x2E
- bl SetMonData
- ldr r1, [sp, 0x18]
- mov r8, r1
- cmp r1, 0x2
- bgt _081A666C
- b _081A6534
-_081A666C:
- ldr r0, =gSpecialVar_0x8005
- ldrh r0, [r0]
- cmp r0, 0
- beq _081A667A
- cmp r0, 0x2
- beq _081A667A
- b _081A67AE
-_081A667A:
- movs r2, 0
- mov r8, r2
- ldr r4, =gFacilityTrainerMons
- mov r9, r4
-_081A6682:
- ldr r5, =gSaveBlock2Ptr
- ldr r3, [r5]
- mov r0, r8
- adds r0, 0x3
- lsls r2, r0, 1
- adds r2, r0
- lsls r2, 2
- adds r1, r3, r2
- movs r4, 0xE7
- lsls r4, 4
- adds r0, r1, r4
- ldrh r7, [r0]
- ldr r5, =0x00000e78
- adds r1, r5
- ldrb r6, [r1]
- movs r1, 0x64
- mov r0, r8
- muls r0, r1
- ldr r1, =gEnemyParty
- adds r0, r1
- mov r4, r9
- ldr r1, [r4]
- lsls r4, r7, 4
- adds r1, r4, r1
- ldrh r1, [r1]
- movs r5, 0x1
- str r5, [sp]
- ldr r5, =0x00000e74
- adds r3, r5
- adds r3, r2
- ldr r2, [r3]
- str r2, [sp, 0x4]
- movs r2, 0
- str r2, [sp, 0x8]
- str r2, [sp, 0xC]
- ldr r2, [sp, 0x14]
- adds r3, r6, 0
- bl CreateMon
- movs r1, 0
- mov r2, r9
- ldr r0, [r2]
- adds r4, r0
- ldrb r4, [r4, 0xB]
- mov r5, r8
- lsls r5, 1
- mov r10, r5
- mov r0, r8
- adds r0, 0x1
- str r0, [sp, 0x18]
- movs r5, 0x5
-_081A66E8:
- adds r0, r4, 0
- movs r2, 0x1
- ands r0, r2
- cmp r0, 0
- beq _081A66F4
- adds r1, 0x1
-_081A66F4:
- lsrs r4, 1
- subs r5, 0x1
- cmp r5, 0
- bge _081A66E8
- add r4, sp, 0x10
- movs r0, 0xFF
- lsls r0, 1
- bl __divsi3
- strh r0, [r4]
- movs r4, 0x1
- movs r5, 0
- lsls r7, 4
- movs r0, 0x64
- mov r6, r8
- muls r6, r0
- ldr r3, =gEnemyParty
-_081A6716:
- mov r1, r9
- ldr r0, [r1]
- adds r0, r7, r0
- ldrb r0, [r0, 0xB]
- ands r0, r4
- cmp r0, 0
- beq _081A6734
- adds r1, r5, 0
- adds r1, 0x1A
- adds r0, r6, r3
- add r2, sp, 0x10
- str r3, [sp, 0x20]
- bl SetMonData
- ldr r3, [sp, 0x20]
-_081A6734:
- lsls r0, r4, 25
- lsrs r4, r0, 24
- adds r5, 0x1
- cmp r5, 0x5
- ble _081A6716
- movs r2, 0x64
- mov r4, r8
- muls r4, r2
- ldr r5, =gEnemyParty
- adds r0, r4, r5
- bl CalculateMonStats
- movs r6, 0
-_081A674E:
- mov r1, r9
- ldr r0, [r1]
- adds r0, r7, r0
- lsls r1, r6, 1
- adds r0, 0x2
- adds r0, r1
- ldrh r1, [r0]
- lsls r2, r6, 24
- lsrs r2, 24
- adds r0, r4, r5
- bl SetMonMoveAvoidReturn
- adds r6, 0x1
- cmp r6, 0x3
- ble _081A674E
- movs r2, 0x64
- mov r4, r8
- muls r4, r2
- ldr r0, =gEnemyParty
- adds r4, r0
- mov r5, r9
- ldr r0, [r5]
- 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
- add r2, r8
- lsls r2, 2
- ldr r1, =gSaveBlock2Ptr
- ldr r0, [r1]
- adds r2, r0
- ldr r5, =0x00000e9d
- adds r2, r5
- adds r0, r4, 0
- movs r1, 0x2E
- bl SetMonData
- ldr r0, [sp, 0x18]
- mov r8, r0
- cmp r0, 0x2
- bgt _081A67AE
- b _081A6682
-_081A67AE:
- add sp, 0x24
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A64C4
- thumb_func_start sub_81A67EC
-sub_81A67EC: @ 81A67EC
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4C
- ldr r1, =gFacilityTrainers
- ldr r0, =gBattleFrontierTrainers
- str r0, [r1]
- mov r0, sp
- adds r0, 0xC
- str r0, [sp, 0x38]
- mov r1, sp
- adds r1, 0x18
- str r1, [sp, 0x3C]
- ldr r2, =gSaveBlock2Ptr
- mov r9, r2
- movs r2, 0
- adds r3, r1, 0
- adds r1, r0, 0
- mov r0, sp
- movs r4, 0x5
- mov r8, r4
-_081A681A:
- strh r2, [r0]
- strh r2, [r1]
- strh r2, [r3]
- adds r3, 0x2
- adds r1, 0x2
- adds r0, 0x2
- movs r5, 0x1
- negs r5, r5
- add r8, r5
- mov r4, r8
- cmp r4, 0
- bge _081A681A
- mov r5, r9
- ldr r0, [r5]
- ldr r7, =0x00000ca9
- adds r0, r7
- ldrb r4, [r0]
- lsls r4, 30
- lsrs r4, 30
- ldr r6, =0x000040ce
- adds r0, r6, 0
- bl VarGet
- lsls r0, 24
- ldr r1, [r5]
- lsls r4, 1
- lsrs r0, 22
- adds r4, r0
- ldr r5, =0x00000de2
- adds r1, r5
- adds r1, r4
- ldrh r0, [r1]
- movs r1, 0x7
- bl __udivsi3
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x24]
- adds r0, r6, 0
- bl VarGet
- lsls r0, 16
- lsrs r0, 16
- movs r2, 0
- cmp r0, 0x1
- bne _081A6878
- movs r2, 0x1
-_081A6878:
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gBattleFrontierMons
- str r0, [r1]
- mov r1, r9
- ldr r0, [r1]
- adds r0, r7
- ldrb r1, [r0]
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _081A68B4
- movs r4, 0x1
- str r4, [sp, 0x28]
- b _081A68B8
- .pool
-_081A68B4:
- movs r5, 0
- str r5, [sp, 0x28]
-_081A68B8:
- adds r0, r2, 0
- ldr r1, [sp, 0x28]
- bl sub_81A6F70
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x2C]
- movs r0, 0
- mov r10, r0
- mov r8, r0
- ldr r1, [sp, 0x3C]
- str r1, [sp, 0x40]
- mov r2, sp
- str r2, [sp, 0x44]
- lsls r4, r0, 1
- str r4, [sp, 0x30]
- ldr r5, [sp, 0x38]
- adds r5, r4
- str r5, [sp, 0x34]
-_081A68DE:
- ldr r0, [sp, 0x2C]
- cmp r8, r0
- bge _081A68EC
- ldr r0, [sp, 0x28]
- ldr r1, [sp, 0x24]
- movs r2, 0x1
- b _081A68F2
-_081A68EC:
- ldr r0, [sp, 0x28]
- ldr r1, [sp, 0x24]
- movs r2, 0
-_081A68F2:
- bl sub_81A6EF0
- lsls r0, 16
- lsrs r7, r0, 16
- ldr r0, =gFacilityTrainerMons
- ldr r1, [r0]
- lsls r2, r7, 4
- adds r4, r2, r1
- ldrh r1, [r4]
- mov r9, r2
- cmp r1, 0xC9
- beq _081A69E2
- movs r3, 0
- mov r2, r8
- adds r6, r3, r2
- cmp r3, r6
- bge _081A6950
- ldr r5, [sp, 0x34]
- ldrh r0, [r5]
- cmp r0, r7
- beq _081A6950
- mov r12, r4
- adds r2, r1, 0
- lsls r4, r3, 1
- ldr r1, [sp, 0x30]
- add r1, sp
- str r6, [sp, 0x48]
-_081A6928:
- ldrh r0, [r1]
- cmp r0, r2
- bne _081A693A
- mov r0, r10
- cmp r0, 0
- bne _081A6950
- mov r5, r12
- ldrh r5, [r5]
- mov r10, r5
-_081A693A:
- adds r4, 0x2
- adds r1, 0x2
- adds r3, 0x1
- ldr r0, [sp, 0x48]
- cmp r3, r0
- bge _081A6950
- ldr r5, [sp, 0x38]
- adds r0, r5, r4
- ldrh r0, [r0]
- cmp r0, r7
- bne _081A6928
-_081A6950:
- cmp r3, r6
- bne _081A69E2
- movs r3, 0
- cmp r3, r6
- bge _081A699C
- ldr r0, =gBattleFrontierHeldItems
- mov r12, r0
- ldr r1, [sp, 0x30]
- ldr r2, [sp, 0x3C]
- adds r5, r1, r2
-_081A6964:
- ldrh r4, [r5]
- cmp r4, 0
- beq _081A6994
- ldr r1, =gFacilityTrainerMons
- ldr r0, [r1]
- mov r2, r9
- adds r1, r2, r0
- ldrb r0, [r1, 0xA]
- lsls r0, 1
- add r0, r12
- ldrh r0, [r0]
- cmp r4, r0
- bne _081A6994
- ldrh r0, [r1]
- cmp r0, r10
- bne _081A699C
- movs r4, 0
- mov r10, r4
- b _081A699C
- .pool
-_081A6994:
- adds r5, 0x2
- adds r3, 0x1
- cmp r3, r6
- blt _081A6964
-_081A699C:
- cmp r3, r6
- bne _081A69E2
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- mov r5, r8
- lsls r3, r5, 1
- adds r0, r3, r5
- lsls r0, 2
- adds r1, r0
- movs r0, 0xE7
- lsls r0, 4
- adds r1, r0
- strh r7, [r1]
- ldr r2, =gFacilityTrainerMons
- ldr r1, [r2]
- add r1, r9
- ldrh r0, [r1]
- ldr r4, [sp, 0x44]
- strh r0, [r4]
- ldr r2, =gBattleFrontierHeldItems
- ldrb r0, [r1, 0xA]
- lsls r0, 1
- adds r0, r2
- ldrh r0, [r0]
- ldr r5, [sp, 0x40]
- strh r0, [r5]
- ldr r0, [sp, 0x38]
- adds r3, r0, r3
- strh r7, [r3]
- adds r5, 0x2
- str r5, [sp, 0x40]
- adds r4, 0x2
- str r4, [sp, 0x44]
- movs r1, 0x1
- add r8, r1
-_081A69E2:
- mov r2, r8
- cmp r2, 0x6
- beq _081A69EA
- b _081A68DE
-_081A69EA:
- add sp, 0x4C
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A67EC
-
- thumb_func_start sub_81A6A08
-sub_81A6A08: @ 81A6A08
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x18
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gBattleFrontierMons
- str r0, [r1]
- movs r4, 0
- add r5, sp, 0x14
- ldr r7, =gSpecialVar_Result
- movs r1, 0
-_081A6A1E:
- mov r2, sp
- adds r0, r2, r4
- strb r1, [r0]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x11
- bls _081A6A1E
- movs r4, 0
- ldr r0, =gUnknown_03006298
- mov r8, r0
- ldr r0, =gFacilityTrainerMons
- ldr r6, [r0]
- ldr r1, =gBaseStats
- mov r12, r1
-_081A6A3C:
- lsls r0, r4, 1
- add r0, r8
- ldrh r0, [r0]
- lsls r0, 4
- adds r0, r6
- ldrh r1, [r0]
- lsls r0, r1, 3
- subs r0, r1
- lsls r0, 2
- mov r2, r12
- adds r3, r0, r2
- ldrb r2, [r3, 0x6]
- mov r0, sp
- adds r1, r0, r2
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- ldrb r1, [r3, 0x7]
- cmp r2, r1
- beq _081A6A70
- ldrb r0, [r3, 0x7]
- mov r2, sp
- adds r1, r2, r0
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
-_081A6A70:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x2
- bls _081A6A3C
- movs r0, 0
- strb r0, [r5]
- strb r0, [r5, 0x1]
- movs r4, 0x1
- adds r3, r5, 0
-_081A6A84:
- ldrb r0, [r3]
- add r0, sp
- mov r2, sp
- adds r1, r2, r4
- ldrb r2, [r0]
- ldrb r0, [r1]
- cmp r2, r0
- bcs _081A6AAC
- strb r4, [r5]
- b _081A6AB2
- .pool
-_081A6AAC:
- cmp r2, r0
- bne _081A6AB2
- strb r4, [r3, 0x1]
-_081A6AB2:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x11
- bls _081A6A84
- ldrb r1, [r5]
- mov r4, sp
- adds r0, r4, r1
- ldrb r2, [r0]
- cmp r2, 0
- beq _081A6ADA
- ldrb r3, [r5, 0x1]
- adds r0, r4, r3
- ldrb r0, [r0]
- cmp r2, r0
- bhi _081A6AD6
- cmp r1, r3
- bne _081A6ADA
-_081A6AD6:
- strh r1, [r7]
- b _081A6ADE
-_081A6ADA:
- movs r0, 0x12
- strh r0, [r7]
-_081A6ADE:
- add sp, 0x18
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_81A6A08
-
- thumb_func_start sub_81A6AEC
-sub_81A6AEC: @ 81A6AEC
- push {r4-r7,lr}
- sub sp, 0x8
- movs r7, 0
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gBattleFrontierMons
- str r0, [r1]
- movs r4, 0
- movs r1, 0
-_081A6AFC:
- mov r2, sp
- adds r0, r2, r4
- strb r1, [r0]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x7
- bls _081A6AFC
- movs r4, 0
-_081A6B0E:
- ldr r1, =gUnknown_03006298
- lsls r0, r4, 1
- adds r0, r1
- ldrh r6, [r0]
- movs r5, 0
-_081A6B18:
- ldr r0, =gFacilityTrainerMons
- ldr r1, [r0]
- lsls r0, r6, 4
- adds r0, r1
- lsls r1, r5, 1
- adds r0, 0x2
- adds r0, r1
- ldrh r0, [r0]
- bl sub_81A6BA4
- lsls r0, 24
- lsrs r0, 24
- mov r2, sp
- adds r1, r2, r0
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x3
- bls _081A6B18
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x2
- bls _081A6B0E
- ldr r1, =gSpecialVar_Result
- movs r0, 0
- strh r0, [r1]
- movs r4, 0x1
- adds r5, r1, 0
- ldr r3, =gBattleFactoryStyleRequiredMoveCounts
- adds r2, r5, 0
-_081A6B5C:
- mov r1, sp
- adds r0, r1, r4
- subs r1, r4, 0x1
- adds r1, r3
- ldrb r0, [r0]
- ldrb r1, [r1]
- cmp r0, r1
- bcc _081A6B74
- strh r4, [r2]
- adds r0, r7, 0x1
- lsls r0, 24
- lsrs r7, r0, 24
-_081A6B74:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x7
- bls _081A6B5C
- cmp r7, 0x2
- bls _081A6B86
- movs r0, 0x8
- strh r0, [r5]
-_081A6B86:
- add sp, 0x8
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A6AEC
-
- thumb_func_start sub_81A6BA4
-sub_81A6BA4: @ 81A6BA4
- push {r4-r6,lr}
- lsls r0, 16
- lsrs r5, r0, 16
- movs r2, 0
- ldr r6, =gBattleFactoryStyleMoveListPointers
-_081A6BAE:
- movs r3, 0
- lsls r0, r2, 2
- adds r0, r6
- ldr r1, [r0]
- ldrh r0, [r1]
- adds r4, r2, 0x1
- cmp r0, 0
- beq _081A6BE4
- lsls r0, r4, 24
- lsrs r2, r0, 24
-_081A6BC2:
- lsls r0, r3, 1
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, r5
- bne _081A6BD4
- adds r0, r2, 0
- b _081A6BEE
- .pool
-_081A6BD4:
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- lsls r0, r3, 1
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, 0
- bne _081A6BC2
-_081A6BE4:
- lsls r0, r4, 24
- lsrs r2, r0, 24
- cmp r2, 0x6
- bls _081A6BAE
- movs r0, 0
-_081A6BEE:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_81A6BA4
-
- thumb_func_start sub_81A6BF4
-sub_81A6BF4: @ 81A6BF4
- push {lr}
- movs r2, 0
- ldr r1, =gMapHeader
- ldr r3, =0xfffffea5
- adds r0, r3, 0
- ldrh r1, [r1, 0x12]
- adds r0, r1
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1
- bhi _081A6C0C
- movs r2, 0x1
-_081A6C0C:
- adds r0, r2, 0
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81A6BF4
-
- thumb_func_start sub_81A6C1C
-sub_81A6C1C: @ 81A6C1C
- push {r4,lr}
- 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 _081A6C48
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gBattleFrontierMons
- b _081A6C4C
- .pool
-_081A6C48:
- ldr r1, =gFacilityTrainerMons
- ldr r0, =gSlateportBattleTentMons
-_081A6C4C:
- str r0, [r1]
- movs r4, 0
-_081A6C50:
- movs r0, 0x64
- muls r0, r4
- ldr r1, =gPlayerParty
- adds r0, r1
- ldr r1, =gSaveBlock2Ptr
- ldr r2, [r1]
- lsls r1, r4, 1
- adds r1, r4
- lsls r1, 2
- adds r2, r1
- movs r1, 0xE7
- lsls r1, 4
- adds r2, r1
- ldrh r2, [r2]
- ldr r1, =gFacilityTrainerMons
- ldr r1, [r1]
- lsls r2, 4
- adds r2, r1
- ldrb r2, [r2, 0xA]
- lsls r2, 1
- ldr r1, =gBattleFrontierHeldItems
- adds r2, r1
- movs r1, 0xC
- bl SetMonData
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x2
- bls _081A6C50
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A6C1C
-
- thumb_func_start sub_81A6CA8
-sub_81A6CA8: @ 81A6CA8
- push {lr}
- lsls r0, 24
- lsls r1, 24
- lsrs r1, 24
- negs r2, r1
- orrs r2, r1
- lsrs r2, 31
- lsrs r1, r0, 24
- cmp r1, 0x8
- bls _081A6CBE
- movs r1, 0x7
-_081A6CBE:
- ldr r0, =gUnknown_08612184
- lsls r1, 1
- adds r1, r2, r1
- adds r1, r0
- ldrb r0, [r1]
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81A6CA8
-
- thumb_func_start sub_81A6CD0
-sub_81A6CD0: @ 81A6CD0
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x34
- ldr r4, =gSaveBlock2Ptr
- ldr r0, [r4]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r0, 30
- str r0, [sp, 0x2C]
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 24
- ldr r1, [r4]
- ldr r3, [sp, 0x2C]
- lsls r2, r3, 1
- lsrs r0, 22
- adds r2, r0
- ldr r7, =0x00000de2
- adds r1, r7
- adds r1, r2
- ldrh r0, [r1]
- movs r1, 0x7
- bl __udivsi3
- lsls r0, 24
- lsrs r1, r0, 24
- str r1, [sp, 0x30]
- movs r2, 0x80
- lsls r2, 18
- adds r0, r2
- lsrs r0, 24
- movs r1, 0
- bl sub_81A6CA8
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x24]
- bl SetFacilityPtrsGetLevel
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x20]
- movs r3, 0
- mov r9, r3
- ldr r1, [r4]
- ldrb r4, [r1, 0xA]
- ldrb r0, [r1, 0xB]
- lsls r0, 8
- orrs r4, r0
- ldrb r0, [r1, 0xC]
- lsls r0, 16
- orrs r4, r0
- ldrb r0, [r1, 0xD]
- lsls r0, 24
- orrs r4, r0
- str r4, [sp, 0x28]
-_081A6D4C:
- ldr r0, [sp, 0x2C]
- ldr r1, [sp, 0x30]
- movs r2, 0
- bl sub_81A6EF0
- lsls r0, 16
- lsrs r5, r0, 16
- ldr r7, =gFacilityTrainerMons
- ldr r1, [r7]
- lsls r0, r5, 4
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, 0xC9
- bne _081A6D6A
- b _081A6EB8
-_081A6D6A:
- ldr r0, [sp, 0x20]
- cmp r0, 0x32
- bne _081A6D78
- ldr r0, =0x00000351
- cmp r5, r0
- bls _081A6D78
- b _081A6EB8
-_081A6D78:
- movs r2, 0
- ldr r1, =gSaveBlock2Ptr
- ldr r0, [r1]
- movs r3, 0xE7
- lsls r3, 4
- adds r0, r3
- ldrh r0, [r0]
- cmp r5, r0
- beq _081A6DA2
- adds r4, r1, 0
- movs r1, 0
-_081A6D8E:
- adds r1, 0xC
- adds r2, 0x1
- cmp r2, 0x5
- bgt _081A6DA2
- ldr r0, [r4]
- adds r0, r1
- adds r0, r3
- ldrh r0, [r0]
- cmp r5, r0
- bne _081A6D8E
-_081A6DA2:
- cmp r2, 0x6
- beq _081A6DA8
- b _081A6EB8
-_081A6DA8:
- movs r4, 0
- cmp r4, r9
- bge _081A6DDC
- add r2, sp, 0xC
- ldr r7, =gFacilityTrainerMons
- ldr r0, [r7]
- lsls r1, r5, 4
- adds r0, r1, r0
- ldrh r2, [r2]
- adds r7, r1, 0
- ldrh r0, [r0]
- cmp r2, r0
- beq _081A6DDC
- ldr r6, =gFacilityTrainerMons
- adds r3, r7, 0
- add r2, sp, 0xC
-_081A6DC8:
- adds r2, 0x2
- adds r4, 0x1
- cmp r4, r9
- bge _081A6DDC
- ldr r0, [r6]
- adds r0, r3, r0
- ldrh r1, [r2]
- ldrh r0, [r0]
- cmp r1, r0
- bne _081A6DC8
-_081A6DDC:
- cmp r4, r9
- bne _081A6EB8
- movs r4, 0
- cmp r4, r9
- bge _081A6E0C
- ldr r7, =gBattleFrontierHeldItems
- ldr r6, =gFacilityTrainerMons
- add r2, sp, 0x14
- lsls r3, r5, 4
-_081A6DEE:
- ldrh r1, [r2]
- cmp r1, 0
- beq _081A6E04
- ldr r0, [r6]
- adds r0, r3, r0
- ldrb r0, [r0, 0xA]
- lsls r0, 1
- adds r0, r7
- ldrh r0, [r0]
- cmp r1, r0
- beq _081A6E0C
-_081A6E04:
- adds r2, 0x2
- adds r4, 0x1
- cmp r4, r9
- blt _081A6DEE
-_081A6E0C:
- cmp r4, r9
- bne _081A6EB8
- mov r0, r9
- lsls r2, r0, 1
- mov r1, sp
- adds r1, r2
- adds r1, 0xC
- ldr r3, =gFacilityTrainerMons
- ldr r4, [r3]
- lsls r5, 4
- mov r8, r5
- add r4, r8
- ldrh r0, [r4]
- strh r0, [r1]
- add r1, sp, 0x14
- adds r1, r2
- ldr r2, =gBattleFrontierHeldItems
- ldrb r0, [r4, 0xA]
- lsls r0, 1
- adds r0, r2
- ldrh r0, [r0]
- strh r0, [r1]
- movs r0, 0x64
- mov r5, r9
- muls r5, r0
- ldr r6, =gEnemyParty
- adds r0, r5, r6
- ldrh r1, [r4]
- ldr r7, [sp, 0x20]
- lsls r2, r7, 24
- ldrb r3, [r4, 0xC]
- ldr r7, [sp, 0x24]
- str r7, [sp]
- ldrb r4, [r4, 0xB]
- str r4, [sp, 0x4]
- ldr r4, [sp, 0x28]
- str r4, [sp, 0x8]
- lsrs r2, 24
- bl CreateMonWithEVSpreadPersonalityOTID
- add r0, sp, 0x1C
- movs r7, 0
- strb r7, [r0]
- movs r4, 0
- mov r7, r8
- mov r10, r0
- movs r0, 0x1
- add r0, r9
- mov r8, r0
-_081A6E6E:
- ldr r1, =gFacilityTrainerMons
- ldr r0, [r1]
- adds r0, r7, r0
- lsls r1, r4, 1
- adds r0, 0x2
- adds r0, r1
- ldrh r1, [r0]
- lsls r2, r4, 24
- lsrs r2, 24
- adds r0, r5, r6
- bl SetMonMoveAvoidReturn
- adds r4, 0x1
- cmp r4, 0x3
- ble _081A6E6E
- movs r0, 0x64
- mov r4, r9
- muls r4, r0
- ldr r0, =gEnemyParty
- adds r4, r0
- adds r0, r4, 0
- movs r1, 0x20
- mov r2, r10
- bl SetMonData
- ldr r2, =gFacilityTrainerMons
- ldr r0, [r2]
- 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 r9, r8
-_081A6EB8:
- mov r3, r9
- cmp r3, 0x3
- beq _081A6EC0
- b _081A6D4C
-_081A6EC0:
- add sp, 0x34
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81A6CD0
-
- thumb_func_start sub_81A6EF0
-sub_81A6EF0: @ 81A6EF0
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r3, r1, 24
- lsls r2, 24
- lsrs r2, 24
- movs r4, 0x8
- negs r1, r0
- orrs r1, r0
- asrs r1, 31
- ands r1, r4
- adds r4, r1, 0
- cmp r3, 0x6
- bhi _081A6F2C
- cmp r2, 0
- beq _081A6F20
- ldr r2, =gUnknown_08612194
- adds r1, r3
- adds r1, 0x1
- b _081A6F38
- .pool
-_081A6F20:
- ldr r2, =gUnknown_08612194
- adds r1, r3
- b _081A6F38
- .pool
-_081A6F2C:
- adds r1, r3, 0
- cmp r1, 0x7
- beq _081A6F34
- movs r1, 0x7
-_081A6F34:
- ldr r2, =gUnknown_08612194
- adds r1, r4, r1
-_081A6F38:
- lsls r1, 2
- adds r0, r2, 0x2
- adds r0, r1, r0
- adds r1, r2
- ldrh r0, [r0]
- ldrh r4, [r1]
- 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
- lsls r0, 16
- lsrs r0, 16
- adds r4, r0, r4
- lsls r4, 16
- lsrs r0, r4, 16
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81A6EF0
-
- thumb_func_start sub_81A6F70
-sub_81A6F70: @ 81A6F70
- push {lr}
- lsls r0, 24
- lsls r1, 24
- ldr r2, =gSaveBlock2Ptr
- ldr r2, [r2]
- lsrs r1, 23
- lsrs r0, 22
- adds r1, r0
- ldr r0, =0x00000df2
- adds r2, r0
- adds r2, r1
- ldrb r1, [r2]
- movs r0, 0
- cmp r1, 0xE
- bls _081A6FA8
- movs r0, 0x1
- cmp r1, 0x15
- bls _081A6FA8
- movs r0, 0x2
- cmp r1, 0x1C
- bls _081A6FA8
- movs r0, 0x3
- cmp r1, 0x23
- bls _081A6FA8
- movs r0, 0x5
- cmp r1, 0x2A
- bhi _081A6FA8
- movs r0, 0x4
-_081A6FA8:
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81A6F70
-
- thumb_func_start GetAiScriptsInBattleFactory
-GetAiScriptsInBattleFactory: @ 81A6FB4
- push {r4,r5,lr}
- ldr r5, =gSaveBlock2Ptr
- ldr r0, [r5]
- ldr r1, =0x00000ca9
- adds r0, r1
- ldrb r0, [r0]
- lsls r0, 30
- lsrs r4, r0, 30
- cmp r4, 0x2
- beq _081A6FF8
- ldr r0, =0x000040ce
- bl VarGet
- lsls r0, 16
- ldr r1, [r5]
- lsls r2, r4, 1
- lsrs r0, 14
- adds r2, r0
- ldr r0, =0x00000de2
- adds r1, r0
- adds r1, r2
- ldrh r0, [r1]
- movs r1, 0x7
- bl __udivsi3
- lsls r0, 16
- lsrs r2, r0, 16
- ldr r0, =gTrainerBattleOpponent_A
- ldrh r1, [r0]
- ldr r0, =0x000003fe
- cmp r1, r0
- beq _081A7018
- cmp r2, 0x1
- bgt _081A7014
-_081A6FF8:
- movs r0, 0
- b _081A701E
- .pool
-_081A7014:
- cmp r2, 0x3
- ble _081A701C
-_081A7018:
- movs r0, 0x7
- b _081A701E
-_081A701C:
- movs r0, 0x1
-_081A701E:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end GetAiScriptsInBattleFactory
-
- thumb_func_start SetMonMoveAvoidReturn
-SetMonMoveAvoidReturn: @ 81A7024
- push {lr}
- lsls r1, 16
- lsls r2, 24
- lsrs r2, 24
- lsrs r1, 16
- cmp r1, 0xD8
- bne _081A7034
- movs r1, 0xDA
-_081A7034:
- bl SetMonMoveSlot
- pop {r0}
- bx r0
- thumb_func_end SetMonMoveAvoidReturn
thumb_func_start sub_81A703C
sub_81A703C: @ 81A703C
diff --git a/data/battle_frontier/battle_factory_style_move_lists.inc b/data/battle_frontier/battle_factory_style_move_lists.inc
deleted file mode 100644
index 3ec428525..000000000
--- a/data/battle_frontier/battle_factory_style_move_lists.inc
+++ /dev/null
@@ -1,191 +0,0 @@
- .align 2
-gBattleFactoryStyleRequiredMoveCounts:: @ 8611FC0
- .byte 3
- .byte 3
- .byte 3
- .byte 2
- .byte 2
- .byte 2
- .byte 2
-
- .align 2
-gBattleFactoryStyleMoveList_TotalPreparation:: @ 8611FC8
- .2byte MOVE_SWORDS_DANCE
- .2byte MOVE_GROWTH
- .2byte MOVE_MEDITATE
- .2byte MOVE_AGILITY
- .2byte MOVE_DOUBLE_TEAM
- .2byte MOVE_HARDEN
- .2byte MOVE_MINIMIZE
- .2byte MOVE_WITHDRAW
- .2byte MOVE_DEFENSE_CURL
- .2byte MOVE_BARRIER
- .2byte MOVE_FOCUS_ENERGY
- .2byte MOVE_AMNESIA
- .2byte MOVE_ACID_ARMOR
- .2byte MOVE_SHARPEN
- .2byte MOVE_CONVERSION
- .2byte MOVE_CONVERSION_2
- .2byte MOVE_BELLY_DRUM
- .2byte MOVE_PSYCH_UP
- .2byte MOVE_CHARGE
- .2byte MOVE_SNATCH
- .2byte MOVE_TAIL_GLOW
- .2byte MOVE_COSMIC_POWER
- .2byte MOVE_IRON_DEFENSE
- .2byte MOVE_HOWL
- .2byte MOVE_BULK_UP
- .2byte MOVE_CALM_MIND
- .2byte MOVE_DRAGON_DANCE
- .2byte 0
-
-gBattleFactoryStyleMoveList_ImpossibleToPredict:: @ 8612000
- .2byte MOVE_MIMIC
- .2byte MOVE_METRONOME
- .2byte MOVE_MIRROR_MOVE
- .2byte MOVE_TRANSFORM
- .2byte MOVE_SUBSTITUTE
- .2byte MOVE_SKETCH
- .2byte MOVE_CURSE
- .2byte MOVE_PRESENT
- .2byte MOVE_FOLLOW_ME
- .2byte MOVE_TRICK
- .2byte MOVE_ROLE_PLAY
- .2byte MOVE_ASSIST
- .2byte MOVE_SKILL_SWAP
- .2byte MOVE_CAMOUFLAGE
- .2byte 0
-
-gBattleFactoryStyleMoveList_WeakeningTheFoe:: @ 861201E
- .2byte MOVE_SAND_ATTACK
- .2byte MOVE_TAIL_WHIP
- .2byte MOVE_LEER
- .2byte MOVE_GROWL
- .2byte MOVE_STRING_SHOT
- .2byte MOVE_SCREECH
- .2byte MOVE_SMOKESCREEN
- .2byte MOVE_KINESIS
- .2byte MOVE_FLASH
- .2byte MOVE_COTTON_SPORE
- .2byte MOVE_SPITE
- .2byte MOVE_SCARY_FACE
- .2byte MOVE_CHARM
- .2byte MOVE_KNOCK_OFF
- .2byte MOVE_SWEET_SCENT
- .2byte MOVE_FEATHER_DANCE
- .2byte MOVE_FAKE_TEARS
- .2byte MOVE_METAL_SOUND
- .2byte MOVE_TICKLE
- .2byte 0
-
-gBattleFactoryStyleMoveList_HighRiskHighReturn:: @ 8612046
- .2byte MOVE_GUILLOTINE
- .2byte MOVE_HORN_DRILL
- .2byte MOVE_DOUBLE_EDGE
- .2byte MOVE_HYPER_BEAM
- .2byte MOVE_COUNTER
- .2byte MOVE_FISSURE
- .2byte MOVE_BIDE
- .2byte MOVE_SELF_DESTRUCT
- .2byte MOVE_SKY_ATTACK
- .2byte MOVE_EXPLOSION
- .2byte MOVE_FLAIL
- .2byte MOVE_REVERSAL
- .2byte MOVE_DESTINY_BOND
- .2byte MOVE_PERISH_SONG
- .2byte MOVE_PAIN_SPLIT
- .2byte MOVE_MIRROR_COAT
- .2byte MOVE_MEMENTO
- .2byte MOVE_GRUDGE
- .2byte MOVE_FACADE
- .2byte MOVE_FOCUS_PUNCH
- .2byte MOVE_BLAST_BURN
- .2byte MOVE_HYDRO_CANNON
- .2byte MOVE_OVERHEAT
- .2byte MOVE_FRENZY_PLANT
- .2byte MOVE_PSYCHO_BOOST
- .2byte MOVE_VOLT_TACKLE
- .2byte 0
-
-gBattleFactoryStyleMoveList_Endurance:: @ 861207C
- .2byte MOVE_MIST
- .2byte MOVE_RECOVER
- .2byte MOVE_LIGHT_SCREEN
- .2byte MOVE_HAZE
- .2byte MOVE_REFLECT
- .2byte MOVE_SOFT_BOILED
- .2byte MOVE_REST
- .2byte MOVE_PROTECT
- .2byte MOVE_DETECT
- .2byte MOVE_ENDURE
- .2byte MOVE_MILK_DRINK
- .2byte MOVE_HEAL_BELL
- .2byte MOVE_SAFEGUARD
- .2byte MOVE_BATON_PASS
- .2byte MOVE_MORNING_SUN
- .2byte MOVE_SYNTHESIS
- .2byte MOVE_MOONLIGHT
- .2byte MOVE_SWALLOW
- .2byte MOVE_WISH
- .2byte MOVE_INGRAIN
- .2byte MOVE_MAGIC_COAT
- .2byte MOVE_RECYCLE
- .2byte MOVE_REFRESH
- .2byte MOVE_MUD_SPORT
- .2byte MOVE_SLACK_OFF
- .2byte MOVE_AROMATHERAPY
- .2byte MOVE_WATER_SPORT
- .2byte 0
-
-gBattleFactoryStyleMoveList_SlowAndSteady:: @ 86120B4
- .2byte MOVE_SING
- .2byte MOVE_SUPERSONIC
- .2byte MOVE_DISABLE
- .2byte MOVE_LEECH_SEED
- .2byte MOVE_POISON_POWDER
- .2byte MOVE_STUN_SPORE
- .2byte MOVE_SLEEP_POWDER
- .2byte MOVE_THUNDER_WAVE
- .2byte MOVE_TOXIC
- .2byte MOVE_HYPNOSIS
- .2byte MOVE_CONFUSE_RAY
- .2byte MOVE_GLARE
- .2byte MOVE_POISON_GAS
- .2byte MOVE_LOVELY_KISS
- .2byte MOVE_SPORE
- .2byte MOVE_SPIDER_WEB
- .2byte MOVE_SWEET_KISS
- .2byte MOVE_SPIKES
- .2byte MOVE_SWAGGER
- .2byte MOVE_MEAN_LOOK
- .2byte MOVE_ATTRACT
- .2byte MOVE_ENCORE
- .2byte MOVE_TORMENT
- .2byte MOVE_FLATTER
- .2byte MOVE_WILL_O_WISP
- .2byte MOVE_TAUNT
- .2byte MOVE_YAWN
- .2byte MOVE_IMPRISON
- .2byte MOVE_SNATCH
- .2byte MOVE_TEETER_DANCE
- .2byte MOVE_GRASS_WHISTLE
- .2byte MOVE_BLOCK
- .2byte 0
-
-gBattleFactoryStyleMoveList_DependsOnTheBattlesFlow:: @ 86120F6
- .2byte MOVE_SANDSTORM
- .2byte MOVE_RAIN_DANCE
- .2byte MOVE_SUNNY_DAY
- .2byte MOVE_HAIL
- .2byte MOVE_WEATHER_BALL
- .2byte 0
-
- .align 2
-gBattleFactoryStyleMoveListPointers:: @ 8612104
- .4byte gBattleFactoryStyleMoveList_TotalPreparation
- .4byte gBattleFactoryStyleMoveList_SlowAndSteady
- .4byte gBattleFactoryStyleMoveList_Endurance
- .4byte gBattleFactoryStyleMoveList_HighRiskHighReturn
- .4byte gBattleFactoryStyleMoveList_WeakeningTheFoe
- .4byte gBattleFactoryStyleMoveList_ImpossibleToPredict
- .4byte gBattleFactoryStyleMoveList_DependsOnTheBattlesFlow
diff --git a/data/battle_frontier_2.s b/data/battle_frontier_2.s
index cbd38a119..3d80f1173 100644
--- a/data/battle_frontier_2.s
+++ b/data/battle_frontier_2.s
@@ -136,861 +136,3 @@ gUnknown_08611F4C:: @ 8611F4C
.align 2
gUnknown_08611F5C:: @ 8611F5C
spr_template 0x03e8, 0xffff, gUnknown_08611F24, gUnknown_08611F4C, NULL, gDummySpriteAffineAnimTable, sub_81A5698
-
- .align 2
-gUnknown_08611F74:: @ 8611F74
- obj_tiles gUnknown_08D854E8, 0x0200, 0x03e8
- null_obj_tiles
-
- .align 2
-gUnknown_08611F84:: @ 8611F84
- .4byte sub_81A58B4
- .4byte sub_81A5964
- .4byte sub_81A59FC
- .4byte sub_81A5AC4
- .4byte sub_81A5B08
- .4byte sub_81A5B88
- .4byte sub_81A5BE0
-
- .align 1
-gUnknown_08611FA0:: @ 8611FA0
- .2byte 0x003f, 0x0040, 0x0041, 0x0043, 0x0042, 0x0046
-
- .align 1
-gUnknown_08611FAC:: @ 8611FAC
- .2byte 0x00b3, 0x00b4, 0x00b7, 0x00c8, 0x00b9, 0x00bb, 0x00c4, 0x00c6, 0x00ba, 0x0000
-
-@ 8611FC0
- .include "data/battle_frontier/battle_factory_style_move_lists.inc"
-
- .align 2
-gUnknown_08612120:: @ 8612120
- .4byte sub_81A5E94
- .4byte sub_81A5FA8
- .4byte sub_81A6054
- .4byte sub_81A613C
- .4byte nullsub_75
- .4byte nullsub_123
- .4byte sub_81A6188
- .4byte sub_81A6198
- .4byte sub_81A61A4
- .4byte sub_81A63CC
- .4byte sub_81A64C4
- .4byte sub_81A63B8
- .4byte sub_81A61B0
- .4byte sub_81A67EC
- .4byte sub_81A6A08
- .4byte sub_81A6AEC
- .4byte sub_81A6C1C
-
- .align 2
-gUnknown_08612164:: @ 8612164
- .4byte 0x00000100, 0x00000200, 0x01000000, 0x02000000
-
- .align 2
-gUnknown_08612174:: @ 8612174
- .4byte 0xfffffeff, 0xfffffdff, 0xfeffffff, 0xfdffffff
-
-gUnknown_08612184:: @ 8612184
- .byte 0x03, 0x06, 0x06, 0x09, 0x09, 0x0c, 0x0c, 0x0f, 0x0f, 0x12, 0x15, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f
-
- .align 1
-gUnknown_08612194:: @ 8612194
- .2byte 0x006e, 0x00c7, 0x00a2, 0x010a, 0x010b, 0x0173, 0x0174, 0x01d3, 0x01d4, 0x0233, 0x0234, 0x0293, 0x0294, 0x02f3, 0x0174, 0x0351
- .2byte 0x0174, 0x01d3, 0x01d4, 0x0233, 0x0234, 0x0293, 0x0294, 0x02f3, 0x0174, 0x0371, 0x0174, 0x0371, 0x0174, 0x0371, 0x0174, 0x0371
-
- .align 1
-gUnknown_086121D4:: @ 86121D4
- .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0022, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x0039, 0x016a, 0x0005, 0x0105, 0x00d4
- .2byte 0x005c, 0x0145
-
- .align 1
-gUnknown_086121F8:: @ 86121F8
- .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0022, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x0039, 0x0065, 0x0005, 0x0099, 0x0078
- .2byte 0x0057, 0x005c
-
- .align 1
-gUnknown_0861221C:: @ 861221C
- .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0022, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x0039, 0x0133, 0x0005, 0x0093, 0x004e
- .2byte 0x004d, 0x00ed
-
- .align 1
-gUnknown_08612240:: @ 8612240
- .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0022, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x0039, 0x00ca, 0x0005, 0x0044, 0x00f3
- .2byte 0x00db, 0x00c2
-
- .align 2
-gUnknown_08612264:: @ 8612264
- .4byte gUnknown_086121D4
- .4byte gUnknown_086121F8
- .4byte gUnknown_0861221C
- .4byte gUnknown_08612240
-
- .align 1
-gUnknown_08612274:: @ 8612274
- .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0131, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x003a, 0x016a, 0x0005, 0x0105, 0x00d4
- .2byte 0x005c, 0x003a
-
- .align 1
-gUnknown_08612298:: @ 8612298
- .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0131, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x003a, 0x0065, 0x0005, 0x0099, 0x0078
- .2byte 0x0057, 0x005c
-
- .align 1
-gUnknown_086122BC:: @ 86122BC
- .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0131, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x003a, 0x0133, 0x0005, 0x0093, 0x004e
- .2byte 0x004d, 0x00ed
-
- .align 1
-gUnknown_086122E0:: @ 86122E0
- .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0131, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x003a, 0x00ca, 0x0005, 0x0044, 0x00f3
- .2byte 0x00db, 0x00e3
-
- .align 2
-gUnknown_08612304:: @ 8612304
- .4byte gUnknown_08612274
- .4byte gUnknown_08612298
- .4byte gUnknown_086122BC
- .4byte gUnknown_086122E0
-
- .align 2
-gUnknown_08612314:: @ 8612314
- .4byte gUnknown_08612264
- .4byte gUnknown_08612304
-
- .align 2
-gUnknown_0861231C:: @ 861231C
- .2byte 0x0012
- .byte 0x03, 0x05, 0x06
-
- .align 2
- .2byte 0x0005
- .byte 0x0d, 0x20, 0x25
-
- .align 2
- .2byte 0x0011
- .byte 0x08, 0x0b, 0x0c
-
- .align 2
- .2byte 0x0024
- .byte 0x22, 0x1e, 0x21
-
- .align 2
- .2byte 0x0015
- .byte 0x00, 0x00, 0x00
-
- .align 2
- .2byte 0x001e
- .byte 0x01, 0x01, 0x01
-
- .align 2
- .2byte 0x002c
- .byte 0x16, 0x17, 0x1b
-
- .align 2
- .2byte 0x0037
- .byte 0x08, 0x16, 0x1f
-
- .align 2
- .2byte 0x000e
- .byte 0x0d, 0x27, 0x15
-
- .align 2
- .2byte 0x0014
- .byte 0x02, 0x04, 0x11
-
- .align 2
- .2byte 0x0038
- .byte 0x1e, 0x14, 0x24
-
- .align 2
- .2byte 0x0042
- .byte 0x1c, 0x22, 0x19
-
- .align 2
- .2byte 0x0026
- .byte 0x17, 0x26, 0x1a
-
- .align 2
- .2byte 0x0032
- .byte 0x17, 0x1e, 0x0b
-
- .align 2
- .2byte 0x002f
- .byte 0x0f, 0x13, 0x0e
-
- .align 2
- .2byte 0x0027
- .byte 0x02, 0x1d, 0x1a
-
- .align 2
- .2byte 0x0033
- .byte 0x25, 0x0c, 0x20
-
- .align 2
- .2byte 0x0021
- .byte 0x18, 0x17, 0x26
-
- .align 2
- .2byte 0x0018
- .byte 0x05, 0x16, 0x04
-
- .align 2
- .2byte 0x000b
- .byte 0x29, 0x25, 0x23
-
- .align 2
- .2byte 0x0035
- .byte 0x27, 0x0e, 0x0d
-
- .align 2
- .2byte 0x0030
- .byte 0x0a, 0x07, 0x09
-
- .align 2
- .2byte 0x000c
- .byte 0x28, 0x14, 0x10
-
- .align 2
- .2byte 0x0034
- .byte 0x12, 0x0d, 0x15
-
- .align 2
- .2byte 0x0013
- .byte 0x16, 0x1f, 0x1b
-
- .align 2
-gUnknown_086123E4:: @ 86123E4
- .byte 0x29, 0x0a, 0x30, 0x06, 0x01, 0x0a, 0x0f, 0x14, 0x20, 0x10, 0x0e, 0x27
- .byte 0x2a, 0x0a, 0x1d, 0x08, 0x1b, 0x06, 0x34, 0x10, 0x20, 0x1e, 0x29, 0x0a
- .byte 0x22, 0x1e, 0x31, 0x12, 0x01, 0x0a, 0x18, 0x10, 0x1a, 0x1c, 0x03, 0x0c
- .byte 0x0f, 0x1e, 0x0b, 0x10, 0x39, 0x10, 0x0f, 0x20, 0x2b, 0x10, 0x14, 0x0a
- .byte 0x3b, 0x10, 0x02, 0x0a, 0x1e, 0x16, 0x20, 0x10, 0x3e, 0x14, 0x03, 0x0c
- .byte 0x31, 0x0a, 0x02, 0x0e, 0x15, 0x0e, 0x36, 0x14, 0x37, 0x10, 0x0a, 0x1e
- .byte 0x29, 0x0a, 0x25, 0x10, 0x2a, 0x14, 0x34, 0x10, 0x0f, 0x1e, 0x1b, 0x0a
- .byte 0x01, 0x0a, 0x07, 0x0e, 0x2a, 0x12, 0x0f, 0x1e, 0x1f, 0x06, 0xff, 0xff
- .byte 0x35, 0x1a, 0x36, 0x10, 0x0f, 0x0e, 0x01, 0x0a, 0x21, 0x26, 0x0f, 0x1e
- .byte 0x25, 0x0e, 0x2f, 0x10, 0x2d, 0x06, 0x1e, 0x20, 0x03, 0x0c, 0xff, 0xff
- .byte 0x1d, 0x0c, 0x1d, 0x08, 0x2b, 0x0a, 0x0f, 0x10, 0x02, 0x0a, 0x03, 0x0c
- .byte 0x2a, 0x0a, 0x3e, 0x0a, 0x00, 0x20, 0x27, 0x10, 0x08, 0x1c, 0x04, 0x0c
- .byte 0x01, 0x0a, 0x12, 0x12, 0x01, 0x0a, 0x00, 0x10, 0x2d, 0x06, 0xff, 0xff
- .byte 0x22, 0x1e, 0x31, 0x12, 0x01, 0x0a, 0x18, 0x10, 0x1c, 0x1c, 0x03, 0x0c
- .byte 0x01, 0x0a, 0x0b, 0x06, 0x30, 0x10, 0x28, 0x0a, 0x49, 0x25, 0x24, 0x06
- .byte 0x14, 0x10, 0x2c, 0x0a, 0x15, 0x04, 0x42, 0x16, 0x1b, 0x1e, 0x03, 0x0c
- .byte 0x28, 0x06, 0x0f, 0x1a, 0x0b, 0x10, 0x17, 0x20, 0x00, 0x0c, 0xff, 0xff
- .byte 0x01, 0x0a, 0x15, 0x10, 0x47, 0x16, 0x0f, 0x1e, 0x39, 0x0e, 0x36, 0x0e
- .byte 0x01, 0x0a, 0x17, 0x10, 0x20, 0x16, 0x19, 0x0e, 0x31, 0x0a, 0x38, 0x0c
- .byte 0x1d, 0x0c, 0x1d, 0x08, 0x00, 0x0c, 0x22, 0x10, 0x12, 0x1c, 0x0b, 0x02
- .byte 0x29, 0x10, 0x04, 0x14, 0x2f, 0x10, 0x06, 0x10, 0x28, 0x1e, 0x1c, 0x1c
- .byte 0x29, 0x10, 0x20, 0x0e, 0x28, 0x10, 0x16, 0x1c, 0x29, 0x1e, 0x03, 0x0c
- .byte 0x0f, 0x1e, 0x0b, 0x10, 0x2f, 0x0e, 0x38, 0x06, 0x0c, 0x10, 0xff, 0xff
- .byte 0x29, 0x0a, 0x08, 0x14, 0x2f, 0x10, 0x1e, 0x06, 0x2c, 0x10, 0xff, 0xff
- .byte 0x23, 0x10, 0x0b, 0x10, 0x1d, 0x08, 0x2d, 0x06, 0x37, 0x10, 0x14, 0x0a
- .byte 0x29, 0x0a, 0x22, 0x10, 0x08, 0x14, 0x2f, 0x10, 0x1e, 0x16, 0x29, 0x10
- .byte 0x01, 0x06, 0x2c, 0x10, 0x01, 0x0a, 0x15, 0x10, 0x39, 0x0e, 0x36, 0x0e
- .byte 0x20, 0x10, 0x0b, 0x02, 0x3f, 0x10, 0x12, 0x1c, 0x04, 0x0c, 0xff, 0xff
- .byte 0x18, 0x10, 0x02, 0x0a, 0x3a, 0x10, 0x46, 0x04, 0x0e, 0x02, 0x03, 0x0c
- .byte 0x10, 0x1e, 0x0b, 0x02, 0x0a, 0x1e, 0x0b, 0x10, 0x3a, 0x06, 0xff, 0xff
- .byte 0x02, 0x0a, 0x12, 0x12, 0x0f, 0x1e, 0x0b, 0x10, 0x38, 0x06, 0x03, 0x0c
- .byte 0x22, 0x1e, 0x00, 0x10, 0x1b, 0x16, 0x3f, 0x10, 0x0f, 0x1e, 0x03, 0x0c
- .byte 0x29, 0x0a, 0x1e, 0x0e, 0x25, 0x10, 0x26, 0x1e, 0x00, 0x0c, 0xff, 0xff
- .byte 0x01, 0x0a, 0x1e, 0x0e, 0x36, 0x12, 0x2f, 0x10, 0x0b, 0x12, 0x04, 0x0c
- .byte 0x05, 0x28, 0x0f, 0x1e, 0x1b, 0x0a, 0x0b, 0x10, 0x20, 0x10, 0x3b, 0x06
- .byte 0x01, 0x0a, 0x1f, 0x10, 0x3e, 0x0a, 0x37, 0x10, 0x20, 0x10, 0x28, 0x06
- .byte 0x26, 0x10, 0x31, 0x0a, 0x29, 0x1e, 0x1c, 0x1c, 0x01, 0x0a, 0x12, 0x12
- .byte 0x0a, 0x0c, 0x00, 0x0c, 0x29, 0x10, 0x1c, 0x10, 0x0f, 0x1e, 0x23, 0x0c
- .byte 0x28, 0x0a, 0x0e, 0x02, 0x0f, 0x10, 0x39, 0x10, 0x2a, 0x14, 0x04, 0x0c
- .byte 0x28, 0x0a, 0x0e, 0x02, 0x0f, 0x10, 0x20, 0x06, 0x2f, 0x10, 0x3c, 0x04
- .byte 0x39, 0x0c, 0x39, 0x0c, 0x00, 0x0c, 0x29, 0x0a, 0x17, 0x20, 0x39, 0x0c
- .byte 0x5c, 0x26, 0x0b, 0x10, 0x20, 0x10, 0x30, 0x12, 0x05, 0x1e, 0x0c, 0x10
-
-gUnknown_086125DC:: @ 86125DC
- .byte 0x23, 0x46, 0x23, 0x01, 0x04, 0x09, 0x05, 0x00, 0x15, 0x2a, 0x15, 0x01, 0x1c, 0x38, 0x1c, 0x01, 0x15, 0x2a, 0x15, 0x01, 0x1c, 0x8c, 0x38, 0x01, 0x15, 0x46, 0x23, 0x00
-
- .align 2
-gUnknown_086125F8:: @ 86125F8
- .4byte sub_81A705C
- .4byte sub_81A7140
- .4byte sub_81A7248
- .4byte sub_81A73B8
- .4byte sub_81A7070
- .4byte sub_81A73EC
- .4byte sub_81A7400
- .4byte sub_81A740C
- .4byte sub_81A7418
- .4byte nullsub_76
- .4byte nullsub_124
- .4byte sub_81A7468
- .4byte sub_81A74CC
- .4byte sub_81A74E0
- .4byte sub_81A7508
- .4byte sub_81A7580
- .4byte sub_81A8090
- .4byte sub_81A80DC
- .4byte sub_81A825C
- .4byte sub_81A827C
- .4byte sub_81A84B4
- .4byte sub_81A84EC
- .4byte sub_81A863C
- .4byte sub_81A8658
- .4byte sub_81A869C
- .4byte sub_81A86C0
- .4byte sub_81A8794
- .4byte sub_81A87E8
- .4byte sub_81A8830
-
-gUnknown_0861266C:: @ 861266C
- .byte 0x03, 0x03, 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x04
-
-gUnknown_08612675:: @ 8612675
- .byte 0x02, 0x01, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x01, 0x02, 0x00
-
- .align 2
-gUnknown_08612688:: @ 8612688
- .4byte sub_81A7D8C
- .4byte sub_81A7DE8
-
- .align 2
-gUnknown_08612690:: @ 8612690
- .4byte 0x00000400, 0x00000800
-
-gUnknown_08612698:: @ 8612698
- store_lock_anim
- walk_right
- free_unlock_anim
- step_end
-
-gUnknown_0861269C:: @ 861269C
- store_lock_anim
- walk_down
- free_unlock_anim
- step_end
-
-gUnknown_086126A0:: @ 86126A0
- store_lock_anim
- walk_left
- free_unlock_anim
- step_end
-
-gUnknown_086126A4:: @ 86126A4
- store_lock_anim
- walk_up
- free_unlock_anim
- step_end
-
-gUnknown_086126A8:: @ 86126A8
- face_right
- step_end
-
-gUnknown_086126AA:: @ 86126AA
- face_down
- step_end
-
-gUnknown_086126AC:: @ 86126AC
- face_left
- step_end
-
-gUnknown_086126AE:: @ 86126AE
- face_up
- step_end
-
-@ 86126B0
- .include "data/battle_frontier/battle_pyramid_level_50_wild_mons.inc"
-
-@ 8612E80
- .include "data/battle_frontier/battle_pyramid_open_level_wild_mons.inc"
-
- .align 2
-gUnknown_08613650:: @ 8613650
- .byte 0x07, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x80, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00
- .byte 0x05, 0x03, 0x00, 0x00, 0x78, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x78, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x00, 0x00, 0x00
- .byte 0x04, 0x04, 0x00, 0x01, 0x70, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x02, 0x70, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00
- .byte 0x03, 0x05, 0x00, 0x00, 0x68, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x01, 0x68, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x00, 0x00, 0x00
- .byte 0x04, 0x05, 0x00, 0x02, 0x60, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x04, 0x60, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00
- .byte 0x02, 0x03, 0x00, 0x00, 0x58, 0x0c, 0x0d, 0x0e, 0x0c, 0x0d, 0x0e, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, 0x58, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0x00, 0x00
- .byte 0x03, 0x07, 0x00, 0x00, 0x50, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x50, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x00, 0x00, 0x00
- .byte 0x03, 0x06, 0x00, 0x00, 0x50, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0x50, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00
-
-gUnknown_08613750:: @ 8613750
- .byte 0x28, 0x00, 0x46, 0x01, 0x5a, 0x02, 0x64, 0x03, 0x23, 0x01, 0x37, 0x02, 0x4b, 0x03, 0x5a, 0x04, 0x64, 0x0a, 0x23, 0x02, 0x37, 0x03, 0x4b, 0x04, 0x5a, 0x05, 0x64, 0x0b, 0x23, 0x03, 0x37, 0x04
- .byte 0x4b, 0x05, 0x5a, 0x06, 0x64, 0x0c, 0x23, 0x04, 0x37, 0x05, 0x4b, 0x06, 0x5a, 0x07, 0x64, 0x0d, 0x23, 0x05, 0x37, 0x06, 0x4b, 0x07, 0x5a, 0x08, 0x64, 0x0e, 0x23, 0x06, 0x37, 0x07, 0x4b, 0x08
- .byte 0x5a, 0x09, 0x64, 0x0f
-
-gUnknown_08613794:: @ 8613794
- .byte 0x00, 0x04, 0x09, 0x0e, 0x13, 0x18, 0x1d, 0x00
-
- .align 1
-gUnknown_0861379C:: @ 861379C
- .2byte 0x0015, 0x0051, 0x0085, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x0087, 0x0022, 0x008a, 0x0018
- .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x0088, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
- .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025, 0x0015, 0x004d, 0x0086, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db
- .2byte 0x0019, 0x002d, 0x0015, 0x004e, 0x008d, 0x0022, 0x008a, 0x0018, 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004f, 0x008d, 0x0022
- .2byte 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x0049, 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
- .2byte 0x0015, 0x0051, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x008d, 0x0022, 0x008a, 0x0018
- .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x008d, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
- .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025, 0x0015, 0x004d, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db
- .2byte 0x0019, 0x002d, 0x0015, 0x004e, 0x008d, 0x0022, 0x008a, 0x0018, 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004f, 0x008d, 0x0022
- .2byte 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x0049, 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
- .2byte 0x0015, 0x0051, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x008d, 0x0022, 0x008a, 0x0018
- .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x008d, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
- .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
-
- .align 1
-gUnknown_0861392C:: @ 861392C
- .2byte 0x0015, 0x0051, 0x0085, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x0087, 0x0022, 0x008a, 0x0018
- .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x0088, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
- .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025, 0x0015, 0x004d, 0x0086, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db
- .2byte 0x0019, 0x002d, 0x0015, 0x004e, 0x008d, 0x0022, 0x008a, 0x0018, 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004f, 0x008d, 0x0022
- .2byte 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x0049, 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
- .2byte 0x0015, 0x0051, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x008d, 0x0022, 0x008a, 0x0018
- .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x008d, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
- .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025, 0x0015, 0x004d, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db
- .2byte 0x0019, 0x002d, 0x0015, 0x004e, 0x008d, 0x0022, 0x008a, 0x0018, 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004f, 0x008d, 0x0022
- .2byte 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x0049, 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
- .2byte 0x0015, 0x0051, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x008d, 0x0022, 0x008a, 0x0018
- .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x008d, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
- .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
-
-gUnknown_08613ABC:: @ 8613ABC
- .byte 0x1f, 0x00, 0x2e, 0x01, 0x3d, 0x02, 0x47, 0x03, 0x51, 0x04, 0x5b, 0x05, 0x5e, 0x06, 0x61, 0x07, 0x64, 0x08, 0x0f, 0x00, 0x2e, 0x01, 0x3d, 0x02, 0x47, 0x03, 0x51, 0x04, 0x5b, 0x05, 0x5e, 0x06
- .byte 0x61, 0x08, 0x64, 0x09, 0x0f, 0x00, 0x1e, 0x01, 0x3d, 0x02, 0x47, 0x03, 0x51, 0x04, 0x5b, 0x05, 0x5e, 0x06, 0x61, 0x07, 0x64, 0x08, 0x1c, 0x00, 0x2b, 0x01, 0x3a, 0x02, 0x44, 0x03, 0x4e, 0x04
- .byte 0x58, 0x05, 0x5c, 0x07, 0x60, 0x08, 0x64, 0x09, 0x0f, 0x00, 0x2b, 0x01, 0x3a, 0x02, 0x44, 0x03, 0x4e, 0x04, 0x58, 0x05, 0x5c, 0x06, 0x60, 0x07, 0x64, 0x09, 0x0f, 0x00, 0x1e, 0x01, 0x3a, 0x02
- .byte 0x44, 0x03, 0x4e, 0x04, 0x58, 0x05, 0x5c, 0x06, 0x60, 0x07, 0x64, 0x08, 0x1c, 0x00, 0x2b, 0x01, 0x3a, 0x02, 0x44, 0x03, 0x4e, 0x04, 0x58, 0x05, 0x5c, 0x06, 0x60, 0x08, 0x64, 0x09
-
-gUnknown_08613B3A:: @ 8613B3A
- .byte 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x00, 0x00, 0x00
-
- .align 2
-gUnknown_08613B44:: @ 8613B44
- .byte 0x03, 0x06
-
- .align 2
- .byte 0x0b, 0x06
-
- .align 2
- .byte 0x0d, 0x06
-
- .align 2
- .byte 0x0f, 0x01
-
- .align 2
- .byte 0x2b, 0x04
-
- .align 2
- .byte 0x2d, 0x01
-
- .align 2
- .byte 0x24, 0x09
-
- .align 2
- .byte 0x29, 0x04
-
- .align 2
- .byte 0x05, 0x05
-
- .align 2
- .byte 0x18, 0x04
-
- .align 2
- .byte 0x2f, 0x00
-
- .align 2
- .byte 0x2e, 0x09
-
- .align 2
- .byte 0x11, 0x0c
-
- .align 2
- .byte 0x10, 0x0b
-
- .align 2
- .byte 0x1e, 0x0d
-
- .align 2
- .byte 0x08, 0x01
-
- .align 2
- .byte 0x17, 0x03
-
- .align 2
- .byte 0x0c, 0x04
-
- .align 2
- .byte 0x38, 0x04
-
- .align 2
- .byte 0x1c, 0x03
-
- .align 2
- .byte 0x1a, 0x00
-
- .align 2
- .byte 0x19, 0x0b
-
- .align 2
- .byte 0x09, 0x07
-
- .align 2
- .byte 0x31, 0x07
-
- .align 2
- .byte 0x35, 0x07
-
- .align 2
- .byte 0x36, 0x01
-
- .align 2
- .byte 0x33, 0x00
-
- .align 2
- .byte 0x2a, 0x03
-
- .align 2
- .byte 0x16, 0x0d
-
- .align 2
- .byte 0x0e, 0x03
-
- .align 2
- .byte 0x15, 0x01
-
- .align 2
- .byte 0x14, 0x01
-
- .align 2
- .byte 0x2c, 0x01
-
- .align 2
- .byte 0x1b, 0x02
-
- .align 2
- .byte 0x04, 0x01
-
- .align 2
- .byte 0x07, 0x03
-
- .align 2
- .byte 0x34, 0x05
-
- .align 2
- .byte 0x32, 0x00
-
- .align 2
- .byte 0x37, 0x02
-
- .align 2
- .byte 0x1d, 0x04
-
- .align 2
- .byte 0x22, 0x09
-
- .align 2
- .byte 0x1f, 0x01
-
- .align 2
- .byte 0x25, 0x00
-
- .align 2
- .byte 0x0a, 0x04
-
- .align 2
- .byte 0x28, 0x00
-
- .align 2
- .byte 0x06, 0x05
-
- .align 2
- .byte 0x27, 0x0b
-
- .align 2
- .byte 0x26, 0x00
-
- .align 2
- .byte 0x13, 0x00
-
- .align 2
- .byte 0x12, 0x02
-
- .align 2
- .byte 0x39, 0x08
-
- .align 2
- .byte 0x02, 0x0b
-
- .align 2
- .byte 0x20, 0x01
-
- .align 2
- .byte 0x21, 0x00
-
- .align 2
-gUnknown_08613C1C:: @ 8613C1C
- .byte 0x0d, 0x03, 0x0e, 0x04, 0x10, 0x01, 0x11, 0x00, 0x03, 0x02, 0x12, 0x03, 0x0c, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, 0x02, 0x17, 0x02, 0x07, 0x02, 0x0a, 0x04, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x00
- .byte 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x03, 0x20, 0x04, 0x26, 0x00, 0x27, 0x01, 0x29, 0x04, 0x2a, 0x05, 0x09, 0x04, 0x16, 0x05, 0x2b, 0x00, 0x2d, 0x04, 0x2e, 0x02, 0x30, 0x02, 0x32, 0x02, 0x31, 0x03
- .byte 0x2f, 0x03, 0x33, 0x03, 0x34, 0x02, 0x04, 0x02, 0x35, 0x00, 0x36, 0x03, 0x37, 0x03, 0x38, 0x03, 0x1c, 0x01, 0x3a, 0x02, 0x05, 0x02, 0x42, 0x02, 0x02, 0x03, 0x44, 0x02, 0x45, 0x03, 0x47, 0x03
- .byte 0x43, 0x00, 0x00, 0x04
-
- .align 2
-gUnknown_08613C80:: @ 8613C80
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252D2D
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252D57
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252D81
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252DAB
-
- .align 2
-gUnknown_08613C90:: @ 8613C90
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25330B
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2532CC
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25328B
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253248
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253206
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2531C4
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253183
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253140
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2530FD
-
- .align 2
-gUnknown_08613CB4:: @ 8613CB4
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2544A6
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25445A
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25440B
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2543BA
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25436A
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25431A
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2542CB
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25427A
-
- .align 2
-gUnknown_08613CD4:: @ 8613CD4
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252DD5
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252E03
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252E31
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252E5F
-
- .align 2
-gUnknown_08613CE4:: @ 8613CE4
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25362E
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2535D4
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253578
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25351A
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2534BD
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253460
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253404
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2533A6
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25334D
-
- .align 2
-gUnknown_08613D08:: @ 8613D08
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25471E
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2546CC
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25467C
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25462A
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2545D9
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254588
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254538
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2544E6
-
- .align 2
-gUnknown_08613D28:: @ 8613D28
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252E8D
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252EAA
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252EC7
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252EE4
-
- .align 2
-gUnknown_08613D38:: @ 8613D38
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2539EC
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253980
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253915
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2538A8
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25383C
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2537D0
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253765
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2536F8
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25368B
-
- .align 2
-gUnknown_08613D5C:: @ 8613D5C
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254A0B
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2549AE
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25494D
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2548EB
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25488A
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254829
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2547C9
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254767
-
- .align 2
-gUnknown_08613D7C:: @ 8613D7C
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252F01
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252F3A
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252F73
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252FAC
-
- .align 2
-gUnknown_08613D8C:: @ 8613D8C
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253D3E
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253CE0
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253C87
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253C2C
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253BD2
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253B78
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253B1F
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253AC4
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253A69
-
- .align 2
-gUnknown_08613DB0:: @ 8613DB0
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254C3E
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254BF1
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254BAE
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254B69
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254B25
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254AE1
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254A9E
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254A59
-
- .align 2
-gUnknown_08613DD0:: @ 8613DD0
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252FE5
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253000
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25301B
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253036
-
- .align 2
-gUnknown_08613DE0:: @ 8613DE0
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253F6C
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253F34
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253EFA
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253EBE
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253E83
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253E48
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253E0E
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253DD2
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253D96
-
- .align 2
-gUnknown_08613E04:: @ 8613E04
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254E6E
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254E27
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254DE0
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254D97
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254D4F
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254D07
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254CC0
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254C77
-
- .align 2
-gUnknown_08613E24:: @ 8613E24
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253051
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25307C
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2530A7
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2530D2
-
- .align 2
-gUnknown_08613E34:: @ 8613E34
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25422B
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2541DD
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25418D
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25413B
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2540EA
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254099
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254049
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253FF7
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253FA5
-
- .align 2
-gUnknown_08613E58:: @ 8613E58
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_255068
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25502F
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254FF6
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254FBB
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254F81
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254F47
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254F0E
- .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254ED3
-
- .align 2
-gUnknown_08613E78:: @ 8613E78
- .4byte gUnknown_08613C80
- .4byte gUnknown_08613C90
- .4byte gUnknown_08613CB4
-
- .align 2
-gUnknown_08613E84:: @ 8613E84
- .4byte gUnknown_08613CD4
- .4byte gUnknown_08613CE4
- .4byte gUnknown_08613D08
-
- .align 2
-gUnknown_08613E90:: @ 8613E90
- .4byte gUnknown_08613D28
- .4byte gUnknown_08613D38
- .4byte gUnknown_08613D5C
-
- .align 2
-gUnknown_08613E9C:: @ 8613E9C
- .4byte gUnknown_08613D7C
- .4byte gUnknown_08613D8C
- .4byte gUnknown_08613DB0
-
- .align 2
-gUnknown_08613EA8:: @ 8613EA8
- .4byte gUnknown_08613DD0
- .4byte gUnknown_08613DE0
- .4byte gUnknown_08613E04
-
- .align 2
-gUnknown_08613EB4:: @ 8613EB4
- .4byte gUnknown_08613E24
- .4byte gUnknown_08613E34
- .4byte gUnknown_08613E58
-
- .align 2
-gUnknown_08613EC0:: @ 8613EC0
- .4byte gUnknown_08613E78
- .4byte gUnknown_08613E84
- .4byte gUnknown_08613E90
- .4byte gUnknown_08613E9C
- .4byte gUnknown_08613EA8
- .4byte gUnknown_08613EB4
-
-gUnknown_08613ED8:: @ 8613ED8
- .byte 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x03, 0x04
-
- .align 2
-gUnknown_08613EE0:: @ 8613EE0
- .4byte sub_81A8E9C
- .4byte sub_81A8F38
- .4byte sub_81A9048
- .4byte sub_81A9134
- .4byte sub_81A917C
- .4byte sub_81A91FC
- .4byte sub_81A9254
- .4byte CalculateBattlePyramidItemBallItemId
- .4byte sub_81A93C8
- .4byte sub_81A9414
- .4byte sub_81A9424
- .4byte sub_81A9618
- .4byte sub_81A966C
- .4byte sub_81A9684
- .4byte sub_81A975C
- .4byte sub_81A97C8
- .4byte sub_81A9828
- .4byte sub_81A9834
-
- .align 1
-gUnknown_08613F28:: @ 8613F28
- .2byte 0x003f, 0x0040, 0x0041, 0x0043, 0x0042, 0x0046
-
- .align 2
-gUnknown_08613F34:: @ 8613F34
- .2byte 0x00b3, 0x00b4, 0x00b7, 0x00c8, 0x00b9, 0x00bb, 0x00c4, 0x00c6, 0x00ba
-
-gUnknown_08613F46:: @ 8613F46
- .byte 0x01, 0x04, 0xff, 0xff, 0x00, 0x02, 0x05, 0xff, 0x01, 0x03, 0x06, 0xff, 0x02, 0x07, 0xff, 0xff, 0x00, 0x05, 0x08, 0xff, 0x01, 0x04, 0x06, 0x09, 0x02, 0x05, 0x07, 0x0a, 0x03, 0x06, 0x0b, 0xff
- .byte 0x04, 0x09, 0x0c, 0xff, 0x05, 0x08, 0x0a, 0x0d, 0x06, 0x09, 0x0b, 0x0e, 0x07, 0x0a, 0x0f, 0xff, 0x08, 0x0d, 0xff, 0xff, 0x09, 0x0c, 0x0e, 0xff, 0x0a, 0x0d, 0x0f, 0xff, 0x0b, 0x0e, 0xff, 0xff
-
-gUnknown_08613F86:: @ 8613F86
- .byte 0x1e, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x55, 0x5a, 0x5f, 0x64
-
diff --git a/data/battle_frontier_3.s b/data/battle_frontier_3.s
new file mode 100644
index 000000000..b5837abdf
--- /dev/null
+++ b/data/battle_frontier_3.s
@@ -0,0 +1,803 @@
+#include "constants/moves.h"
+#include "constants/species.h"
+#include "constants/trainers.h"
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .section .rodata
+
+
+ .align 2
+gUnknown_086121D4:: @ 86121D4
+ .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0022, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x0039, 0x016a, 0x0005, 0x0105, 0x00d4
+ .2byte 0x005c, 0x0145
+
+ .align 1
+gUnknown_086121F8:: @ 86121F8
+ .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0022, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x0039, 0x0065, 0x0005, 0x0099, 0x0078
+ .2byte 0x0057, 0x005c
+
+ .align 1
+gUnknown_0861221C:: @ 861221C
+ .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0022, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x0039, 0x0133, 0x0005, 0x0093, 0x004e
+ .2byte 0x004d, 0x00ed
+
+ .align 1
+gUnknown_08612240:: @ 8612240
+ .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0022, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x0039, 0x00ca, 0x0005, 0x0044, 0x00f3
+ .2byte 0x00db, 0x00c2
+
+ .align 2
+gUnknown_08612264:: @ 8612264
+ .4byte gUnknown_086121D4
+ .4byte gUnknown_086121F8
+ .4byte gUnknown_0861221C
+ .4byte gUnknown_08612240
+
+ .align 1
+gUnknown_08612274:: @ 8612274
+ .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0131, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x003a, 0x016a, 0x0005, 0x0105, 0x00d4
+ .2byte 0x005c, 0x003a
+
+ .align 1
+gUnknown_08612298:: @ 8612298
+ .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0131, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x003a, 0x0065, 0x0005, 0x0099, 0x0078
+ .2byte 0x0057, 0x005c
+
+ .align 1
+gUnknown_086122BC:: @ 86122BC
+ .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0131, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x003a, 0x0133, 0x0005, 0x0093, 0x004e
+ .2byte 0x004d, 0x00ed
+
+ .align 1
+gUnknown_086122E0:: @ 86122E0
+ .2byte 0x017b, 0x0004, 0x005c, 0x0089, 0x0131, 0x00bc, 0x0149, 0x0004, 0x005c, 0x005f, 0x0022, 0x003a, 0x00ca, 0x0005, 0x0044, 0x00f3
+ .2byte 0x00db, 0x00e3
+
+ .align 2
+gUnknown_08612304:: @ 8612304
+ .4byte gUnknown_08612274
+ .4byte gUnknown_08612298
+ .4byte gUnknown_086122BC
+ .4byte gUnknown_086122E0
+
+ .align 2
+gUnknown_08612314:: @ 8612314
+ .4byte gUnknown_08612264
+ .4byte gUnknown_08612304
+
+ .align 2
+gUnknown_0861231C:: @ 861231C
+ .2byte 0x0012
+ .byte 0x03, 0x05, 0x06
+
+ .align 2
+ .2byte 0x0005
+ .byte 0x0d, 0x20, 0x25
+
+ .align 2
+ .2byte 0x0011
+ .byte 0x08, 0x0b, 0x0c
+
+ .align 2
+ .2byte 0x0024
+ .byte 0x22, 0x1e, 0x21
+
+ .align 2
+ .2byte 0x0015
+ .byte 0x00, 0x00, 0x00
+
+ .align 2
+ .2byte 0x001e
+ .byte 0x01, 0x01, 0x01
+
+ .align 2
+ .2byte 0x002c
+ .byte 0x16, 0x17, 0x1b
+
+ .align 2
+ .2byte 0x0037
+ .byte 0x08, 0x16, 0x1f
+
+ .align 2
+ .2byte 0x000e
+ .byte 0x0d, 0x27, 0x15
+
+ .align 2
+ .2byte 0x0014
+ .byte 0x02, 0x04, 0x11
+
+ .align 2
+ .2byte 0x0038
+ .byte 0x1e, 0x14, 0x24
+
+ .align 2
+ .2byte 0x0042
+ .byte 0x1c, 0x22, 0x19
+
+ .align 2
+ .2byte 0x0026
+ .byte 0x17, 0x26, 0x1a
+
+ .align 2
+ .2byte 0x0032
+ .byte 0x17, 0x1e, 0x0b
+
+ .align 2
+ .2byte 0x002f
+ .byte 0x0f, 0x13, 0x0e
+
+ .align 2
+ .2byte 0x0027
+ .byte 0x02, 0x1d, 0x1a
+
+ .align 2
+ .2byte 0x0033
+ .byte 0x25, 0x0c, 0x20
+
+ .align 2
+ .2byte 0x0021
+ .byte 0x18, 0x17, 0x26
+
+ .align 2
+ .2byte 0x0018
+ .byte 0x05, 0x16, 0x04
+
+ .align 2
+ .2byte 0x000b
+ .byte 0x29, 0x25, 0x23
+
+ .align 2
+ .2byte 0x0035
+ .byte 0x27, 0x0e, 0x0d
+
+ .align 2
+ .2byte 0x0030
+ .byte 0x0a, 0x07, 0x09
+
+ .align 2
+ .2byte 0x000c
+ .byte 0x28, 0x14, 0x10
+
+ .align 2
+ .2byte 0x0034
+ .byte 0x12, 0x0d, 0x15
+
+ .align 2
+ .2byte 0x0013
+ .byte 0x16, 0x1f, 0x1b
+
+ .align 2
+gUnknown_086123E4:: @ 86123E4
+ .byte 0x29, 0x0a, 0x30, 0x06, 0x01, 0x0a, 0x0f, 0x14, 0x20, 0x10, 0x0e, 0x27
+ .byte 0x2a, 0x0a, 0x1d, 0x08, 0x1b, 0x06, 0x34, 0x10, 0x20, 0x1e, 0x29, 0x0a
+ .byte 0x22, 0x1e, 0x31, 0x12, 0x01, 0x0a, 0x18, 0x10, 0x1a, 0x1c, 0x03, 0x0c
+ .byte 0x0f, 0x1e, 0x0b, 0x10, 0x39, 0x10, 0x0f, 0x20, 0x2b, 0x10, 0x14, 0x0a
+ .byte 0x3b, 0x10, 0x02, 0x0a, 0x1e, 0x16, 0x20, 0x10, 0x3e, 0x14, 0x03, 0x0c
+ .byte 0x31, 0x0a, 0x02, 0x0e, 0x15, 0x0e, 0x36, 0x14, 0x37, 0x10, 0x0a, 0x1e
+ .byte 0x29, 0x0a, 0x25, 0x10, 0x2a, 0x14, 0x34, 0x10, 0x0f, 0x1e, 0x1b, 0x0a
+ .byte 0x01, 0x0a, 0x07, 0x0e, 0x2a, 0x12, 0x0f, 0x1e, 0x1f, 0x06, 0xff, 0xff
+ .byte 0x35, 0x1a, 0x36, 0x10, 0x0f, 0x0e, 0x01, 0x0a, 0x21, 0x26, 0x0f, 0x1e
+ .byte 0x25, 0x0e, 0x2f, 0x10, 0x2d, 0x06, 0x1e, 0x20, 0x03, 0x0c, 0xff, 0xff
+ .byte 0x1d, 0x0c, 0x1d, 0x08, 0x2b, 0x0a, 0x0f, 0x10, 0x02, 0x0a, 0x03, 0x0c
+ .byte 0x2a, 0x0a, 0x3e, 0x0a, 0x00, 0x20, 0x27, 0x10, 0x08, 0x1c, 0x04, 0x0c
+ .byte 0x01, 0x0a, 0x12, 0x12, 0x01, 0x0a, 0x00, 0x10, 0x2d, 0x06, 0xff, 0xff
+ .byte 0x22, 0x1e, 0x31, 0x12, 0x01, 0x0a, 0x18, 0x10, 0x1c, 0x1c, 0x03, 0x0c
+ .byte 0x01, 0x0a, 0x0b, 0x06, 0x30, 0x10, 0x28, 0x0a, 0x49, 0x25, 0x24, 0x06
+ .byte 0x14, 0x10, 0x2c, 0x0a, 0x15, 0x04, 0x42, 0x16, 0x1b, 0x1e, 0x03, 0x0c
+ .byte 0x28, 0x06, 0x0f, 0x1a, 0x0b, 0x10, 0x17, 0x20, 0x00, 0x0c, 0xff, 0xff
+ .byte 0x01, 0x0a, 0x15, 0x10, 0x47, 0x16, 0x0f, 0x1e, 0x39, 0x0e, 0x36, 0x0e
+ .byte 0x01, 0x0a, 0x17, 0x10, 0x20, 0x16, 0x19, 0x0e, 0x31, 0x0a, 0x38, 0x0c
+ .byte 0x1d, 0x0c, 0x1d, 0x08, 0x00, 0x0c, 0x22, 0x10, 0x12, 0x1c, 0x0b, 0x02
+ .byte 0x29, 0x10, 0x04, 0x14, 0x2f, 0x10, 0x06, 0x10, 0x28, 0x1e, 0x1c, 0x1c
+ .byte 0x29, 0x10, 0x20, 0x0e, 0x28, 0x10, 0x16, 0x1c, 0x29, 0x1e, 0x03, 0x0c
+ .byte 0x0f, 0x1e, 0x0b, 0x10, 0x2f, 0x0e, 0x38, 0x06, 0x0c, 0x10, 0xff, 0xff
+ .byte 0x29, 0x0a, 0x08, 0x14, 0x2f, 0x10, 0x1e, 0x06, 0x2c, 0x10, 0xff, 0xff
+ .byte 0x23, 0x10, 0x0b, 0x10, 0x1d, 0x08, 0x2d, 0x06, 0x37, 0x10, 0x14, 0x0a
+ .byte 0x29, 0x0a, 0x22, 0x10, 0x08, 0x14, 0x2f, 0x10, 0x1e, 0x16, 0x29, 0x10
+ .byte 0x01, 0x06, 0x2c, 0x10, 0x01, 0x0a, 0x15, 0x10, 0x39, 0x0e, 0x36, 0x0e
+ .byte 0x20, 0x10, 0x0b, 0x02, 0x3f, 0x10, 0x12, 0x1c, 0x04, 0x0c, 0xff, 0xff
+ .byte 0x18, 0x10, 0x02, 0x0a, 0x3a, 0x10, 0x46, 0x04, 0x0e, 0x02, 0x03, 0x0c
+ .byte 0x10, 0x1e, 0x0b, 0x02, 0x0a, 0x1e, 0x0b, 0x10, 0x3a, 0x06, 0xff, 0xff
+ .byte 0x02, 0x0a, 0x12, 0x12, 0x0f, 0x1e, 0x0b, 0x10, 0x38, 0x06, 0x03, 0x0c
+ .byte 0x22, 0x1e, 0x00, 0x10, 0x1b, 0x16, 0x3f, 0x10, 0x0f, 0x1e, 0x03, 0x0c
+ .byte 0x29, 0x0a, 0x1e, 0x0e, 0x25, 0x10, 0x26, 0x1e, 0x00, 0x0c, 0xff, 0xff
+ .byte 0x01, 0x0a, 0x1e, 0x0e, 0x36, 0x12, 0x2f, 0x10, 0x0b, 0x12, 0x04, 0x0c
+ .byte 0x05, 0x28, 0x0f, 0x1e, 0x1b, 0x0a, 0x0b, 0x10, 0x20, 0x10, 0x3b, 0x06
+ .byte 0x01, 0x0a, 0x1f, 0x10, 0x3e, 0x0a, 0x37, 0x10, 0x20, 0x10, 0x28, 0x06
+ .byte 0x26, 0x10, 0x31, 0x0a, 0x29, 0x1e, 0x1c, 0x1c, 0x01, 0x0a, 0x12, 0x12
+ .byte 0x0a, 0x0c, 0x00, 0x0c, 0x29, 0x10, 0x1c, 0x10, 0x0f, 0x1e, 0x23, 0x0c
+ .byte 0x28, 0x0a, 0x0e, 0x02, 0x0f, 0x10, 0x39, 0x10, 0x2a, 0x14, 0x04, 0x0c
+ .byte 0x28, 0x0a, 0x0e, 0x02, 0x0f, 0x10, 0x20, 0x06, 0x2f, 0x10, 0x3c, 0x04
+ .byte 0x39, 0x0c, 0x39, 0x0c, 0x00, 0x0c, 0x29, 0x0a, 0x17, 0x20, 0x39, 0x0c
+ .byte 0x5c, 0x26, 0x0b, 0x10, 0x20, 0x10, 0x30, 0x12, 0x05, 0x1e, 0x0c, 0x10
+
+gUnknown_086125DC:: @ 86125DC
+ .byte 0x23, 0x46, 0x23, 0x01, 0x04, 0x09, 0x05, 0x00, 0x15, 0x2a, 0x15, 0x01, 0x1c, 0x38, 0x1c, 0x01, 0x15, 0x2a, 0x15, 0x01, 0x1c, 0x8c, 0x38, 0x01, 0x15, 0x46, 0x23, 0x00
+
+ .align 2
+gUnknown_086125F8:: @ 86125F8
+ .4byte sub_81A705C
+ .4byte sub_81A7140
+ .4byte sub_81A7248
+ .4byte sub_81A73B8
+ .4byte sub_81A7070
+ .4byte sub_81A73EC
+ .4byte sub_81A7400
+ .4byte sub_81A740C
+ .4byte sub_81A7418
+ .4byte nullsub_76
+ .4byte nullsub_124
+ .4byte sub_81A7468
+ .4byte sub_81A74CC
+ .4byte sub_81A74E0
+ .4byte sub_81A7508
+ .4byte sub_81A7580
+ .4byte sub_81A8090
+ .4byte sub_81A80DC
+ .4byte sub_81A825C
+ .4byte sub_81A827C
+ .4byte sub_81A84B4
+ .4byte sub_81A84EC
+ .4byte sub_81A863C
+ .4byte sub_81A8658
+ .4byte sub_81A869C
+ .4byte sub_81A86C0
+ .4byte sub_81A8794
+ .4byte sub_81A87E8
+ .4byte sub_81A8830
+
+gUnknown_0861266C:: @ 861266C
+ .byte 0x03, 0x03, 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x04
+
+gUnknown_08612675:: @ 8612675
+ .byte 0x02, 0x01, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x01, 0x02, 0x00
+
+ .align 2
+gUnknown_08612688:: @ 8612688
+ .4byte sub_81A7D8C
+ .4byte sub_81A7DE8
+
+ .align 2
+gUnknown_08612690:: @ 8612690
+ .4byte 0x00000400, 0x00000800
+
+gUnknown_08612698:: @ 8612698
+ store_lock_anim
+ walk_right
+ free_unlock_anim
+ step_end
+
+gUnknown_0861269C:: @ 861269C
+ store_lock_anim
+ walk_down
+ free_unlock_anim
+ step_end
+
+gUnknown_086126A0:: @ 86126A0
+ store_lock_anim
+ walk_left
+ free_unlock_anim
+ step_end
+
+gUnknown_086126A4:: @ 86126A4
+ store_lock_anim
+ walk_up
+ free_unlock_anim
+ step_end
+
+gUnknown_086126A8:: @ 86126A8
+ face_right
+ step_end
+
+gUnknown_086126AA:: @ 86126AA
+ face_down
+ step_end
+
+gUnknown_086126AC:: @ 86126AC
+ face_left
+ step_end
+
+gUnknown_086126AE:: @ 86126AE
+ face_up
+ step_end
+
+@ 86126B0
+ .include "data/battle_frontier/battle_pyramid_level_50_wild_mons.inc"
+
+@ 8612E80
+ .include "data/battle_frontier/battle_pyramid_open_level_wild_mons.inc"
+
+ .align 2
+gUnknown_08613650:: @ 8613650
+ .byte 0x07, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x80, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00
+ .byte 0x05, 0x03, 0x00, 0x00, 0x78, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x78, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x00, 0x00, 0x00
+ .byte 0x04, 0x04, 0x00, 0x01, 0x70, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x02, 0x70, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00
+ .byte 0x03, 0x05, 0x00, 0x00, 0x68, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x01, 0x68, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x00, 0x00, 0x00
+ .byte 0x04, 0x05, 0x00, 0x02, 0x60, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x04, 0x60, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00
+ .byte 0x02, 0x03, 0x00, 0x00, 0x58, 0x0c, 0x0d, 0x0e, 0x0c, 0x0d, 0x0e, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, 0x58, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0x00, 0x00
+ .byte 0x03, 0x07, 0x00, 0x00, 0x50, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x50, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x00, 0x00, 0x00
+ .byte 0x03, 0x06, 0x00, 0x00, 0x50, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0x50, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00
+
+gUnknown_08613750:: @ 8613750
+ .byte 0x28, 0x00, 0x46, 0x01, 0x5a, 0x02, 0x64, 0x03, 0x23, 0x01, 0x37, 0x02, 0x4b, 0x03, 0x5a, 0x04, 0x64, 0x0a, 0x23, 0x02, 0x37, 0x03, 0x4b, 0x04, 0x5a, 0x05, 0x64, 0x0b, 0x23, 0x03, 0x37, 0x04
+ .byte 0x4b, 0x05, 0x5a, 0x06, 0x64, 0x0c, 0x23, 0x04, 0x37, 0x05, 0x4b, 0x06, 0x5a, 0x07, 0x64, 0x0d, 0x23, 0x05, 0x37, 0x06, 0x4b, 0x07, 0x5a, 0x08, 0x64, 0x0e, 0x23, 0x06, 0x37, 0x07, 0x4b, 0x08
+ .byte 0x5a, 0x09, 0x64, 0x0f
+
+gUnknown_08613794:: @ 8613794
+ .byte 0x00, 0x04, 0x09, 0x0e, 0x13, 0x18, 0x1d, 0x00
+
+ .align 1
+gUnknown_0861379C:: @ 861379C
+ .2byte 0x0015, 0x0051, 0x0085, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x0087, 0x0022, 0x008a, 0x0018
+ .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x0088, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
+ .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025, 0x0015, 0x004d, 0x0086, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db
+ .2byte 0x0019, 0x002d, 0x0015, 0x004e, 0x008d, 0x0022, 0x008a, 0x0018, 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004f, 0x008d, 0x0022
+ .2byte 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x0049, 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
+ .2byte 0x0015, 0x0051, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x008d, 0x0022, 0x008a, 0x0018
+ .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x008d, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
+ .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025, 0x0015, 0x004d, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db
+ .2byte 0x0019, 0x002d, 0x0015, 0x004e, 0x008d, 0x0022, 0x008a, 0x0018, 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004f, 0x008d, 0x0022
+ .2byte 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x0049, 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
+ .2byte 0x0015, 0x0051, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x008d, 0x0022, 0x008a, 0x0018
+ .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x008d, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
+ .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
+
+ .align 1
+gUnknown_0861392C:: @ 861392C
+ .2byte 0x0015, 0x0051, 0x0085, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x0087, 0x0022, 0x008a, 0x0018
+ .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x0088, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
+ .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025, 0x0015, 0x004d, 0x0086, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db
+ .2byte 0x0019, 0x002d, 0x0015, 0x004e, 0x008d, 0x0022, 0x008a, 0x0018, 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004f, 0x008d, 0x0022
+ .2byte 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x0049, 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
+ .2byte 0x0015, 0x0051, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x008d, 0x0022, 0x008a, 0x0018
+ .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x008d, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
+ .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025, 0x0015, 0x004d, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db
+ .2byte 0x0019, 0x002d, 0x0015, 0x004e, 0x008d, 0x0022, 0x008a, 0x0018, 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004f, 0x008d, 0x0022
+ .2byte 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x0049, 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
+ .2byte 0x0015, 0x0051, 0x008d, 0x0022, 0x008d, 0x0018, 0x00b3, 0x00db, 0x0019, 0x002d, 0x0015, 0x004a, 0x008d, 0x0022, 0x008a, 0x0018
+ .2byte 0x00c8, 0x00ba, 0x0013, 0x0025, 0x0015, 0x004b, 0x008d, 0x0022, 0x008d, 0x0018, 0x00c6, 0x00c4, 0x0019, 0x002d, 0x0015, 0x004c
+ .2byte 0x008d, 0x0022, 0x008a, 0x0018, 0x00b7, 0x00bb, 0x0013, 0x0025
+
+gUnknown_08613ABC:: @ 8613ABC
+ .byte 0x1f, 0x00, 0x2e, 0x01, 0x3d, 0x02, 0x47, 0x03, 0x51, 0x04, 0x5b, 0x05, 0x5e, 0x06, 0x61, 0x07, 0x64, 0x08, 0x0f, 0x00, 0x2e, 0x01, 0x3d, 0x02, 0x47, 0x03, 0x51, 0x04, 0x5b, 0x05, 0x5e, 0x06
+ .byte 0x61, 0x08, 0x64, 0x09, 0x0f, 0x00, 0x1e, 0x01, 0x3d, 0x02, 0x47, 0x03, 0x51, 0x04, 0x5b, 0x05, 0x5e, 0x06, 0x61, 0x07, 0x64, 0x08, 0x1c, 0x00, 0x2b, 0x01, 0x3a, 0x02, 0x44, 0x03, 0x4e, 0x04
+ .byte 0x58, 0x05, 0x5c, 0x07, 0x60, 0x08, 0x64, 0x09, 0x0f, 0x00, 0x2b, 0x01, 0x3a, 0x02, 0x44, 0x03, 0x4e, 0x04, 0x58, 0x05, 0x5c, 0x06, 0x60, 0x07, 0x64, 0x09, 0x0f, 0x00, 0x1e, 0x01, 0x3a, 0x02
+ .byte 0x44, 0x03, 0x4e, 0x04, 0x58, 0x05, 0x5c, 0x06, 0x60, 0x07, 0x64, 0x08, 0x1c, 0x00, 0x2b, 0x01, 0x3a, 0x02, 0x44, 0x03, 0x4e, 0x04, 0x58, 0x05, 0x5c, 0x06, 0x60, 0x08, 0x64, 0x09
+
+gUnknown_08613B3A:: @ 8613B3A
+ .byte 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x00, 0x00, 0x00
+
+ .align 2
+gUnknown_08613B44:: @ 8613B44
+ .byte 0x03, 0x06
+
+ .align 2
+ .byte 0x0b, 0x06
+
+ .align 2
+ .byte 0x0d, 0x06
+
+ .align 2
+ .byte 0x0f, 0x01
+
+ .align 2
+ .byte 0x2b, 0x04
+
+ .align 2
+ .byte 0x2d, 0x01
+
+ .align 2
+ .byte 0x24, 0x09
+
+ .align 2
+ .byte 0x29, 0x04
+
+ .align 2
+ .byte 0x05, 0x05
+
+ .align 2
+ .byte 0x18, 0x04
+
+ .align 2
+ .byte 0x2f, 0x00
+
+ .align 2
+ .byte 0x2e, 0x09
+
+ .align 2
+ .byte 0x11, 0x0c
+
+ .align 2
+ .byte 0x10, 0x0b
+
+ .align 2
+ .byte 0x1e, 0x0d
+
+ .align 2
+ .byte 0x08, 0x01
+
+ .align 2
+ .byte 0x17, 0x03
+
+ .align 2
+ .byte 0x0c, 0x04
+
+ .align 2
+ .byte 0x38, 0x04
+
+ .align 2
+ .byte 0x1c, 0x03
+
+ .align 2
+ .byte 0x1a, 0x00
+
+ .align 2
+ .byte 0x19, 0x0b
+
+ .align 2
+ .byte 0x09, 0x07
+
+ .align 2
+ .byte 0x31, 0x07
+
+ .align 2
+ .byte 0x35, 0x07
+
+ .align 2
+ .byte 0x36, 0x01
+
+ .align 2
+ .byte 0x33, 0x00
+
+ .align 2
+ .byte 0x2a, 0x03
+
+ .align 2
+ .byte 0x16, 0x0d
+
+ .align 2
+ .byte 0x0e, 0x03
+
+ .align 2
+ .byte 0x15, 0x01
+
+ .align 2
+ .byte 0x14, 0x01
+
+ .align 2
+ .byte 0x2c, 0x01
+
+ .align 2
+ .byte 0x1b, 0x02
+
+ .align 2
+ .byte 0x04, 0x01
+
+ .align 2
+ .byte 0x07, 0x03
+
+ .align 2
+ .byte 0x34, 0x05
+
+ .align 2
+ .byte 0x32, 0x00
+
+ .align 2
+ .byte 0x37, 0x02
+
+ .align 2
+ .byte 0x1d, 0x04
+
+ .align 2
+ .byte 0x22, 0x09
+
+ .align 2
+ .byte 0x1f, 0x01
+
+ .align 2
+ .byte 0x25, 0x00
+
+ .align 2
+ .byte 0x0a, 0x04
+
+ .align 2
+ .byte 0x28, 0x00
+
+ .align 2
+ .byte 0x06, 0x05
+
+ .align 2
+ .byte 0x27, 0x0b
+
+ .align 2
+ .byte 0x26, 0x00
+
+ .align 2
+ .byte 0x13, 0x00
+
+ .align 2
+ .byte 0x12, 0x02
+
+ .align 2
+ .byte 0x39, 0x08
+
+ .align 2
+ .byte 0x02, 0x0b
+
+ .align 2
+ .byte 0x20, 0x01
+
+ .align 2
+ .byte 0x21, 0x00
+
+ .align 2
+gUnknown_08613C1C:: @ 8613C1C
+ .byte 0x0d, 0x03, 0x0e, 0x04, 0x10, 0x01, 0x11, 0x00, 0x03, 0x02, 0x12, 0x03, 0x0c, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, 0x02, 0x17, 0x02, 0x07, 0x02, 0x0a, 0x04, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x00
+ .byte 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x03, 0x20, 0x04, 0x26, 0x00, 0x27, 0x01, 0x29, 0x04, 0x2a, 0x05, 0x09, 0x04, 0x16, 0x05, 0x2b, 0x00, 0x2d, 0x04, 0x2e, 0x02, 0x30, 0x02, 0x32, 0x02, 0x31, 0x03
+ .byte 0x2f, 0x03, 0x33, 0x03, 0x34, 0x02, 0x04, 0x02, 0x35, 0x00, 0x36, 0x03, 0x37, 0x03, 0x38, 0x03, 0x1c, 0x01, 0x3a, 0x02, 0x05, 0x02, 0x42, 0x02, 0x02, 0x03, 0x44, 0x02, 0x45, 0x03, 0x47, 0x03
+ .byte 0x43, 0x00, 0x00, 0x04
+
+ .align 2
+gUnknown_08613C80:: @ 8613C80
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252D2D
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252D57
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252D81
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252DAB
+
+ .align 2
+gUnknown_08613C90:: @ 8613C90
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25330B
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2532CC
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25328B
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253248
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253206
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2531C4
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253183
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253140
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2530FD
+
+ .align 2
+gUnknown_08613CB4:: @ 8613CB4
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2544A6
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25445A
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25440B
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2543BA
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25436A
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25431A
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2542CB
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25427A
+
+ .align 2
+gUnknown_08613CD4:: @ 8613CD4
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252DD5
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252E03
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252E31
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252E5F
+
+ .align 2
+gUnknown_08613CE4:: @ 8613CE4
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25362E
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2535D4
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253578
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25351A
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2534BD
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253460
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253404
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2533A6
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25334D
+
+ .align 2
+gUnknown_08613D08:: @ 8613D08
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25471E
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2546CC
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25467C
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25462A
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2545D9
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254588
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254538
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2544E6
+
+ .align 2
+gUnknown_08613D28:: @ 8613D28
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252E8D
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252EAA
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252EC7
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252EE4
+
+ .align 2
+gUnknown_08613D38:: @ 8613D38
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2539EC
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253980
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253915
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2538A8
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25383C
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2537D0
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253765
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2536F8
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25368B
+
+ .align 2
+gUnknown_08613D5C:: @ 8613D5C
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254A0B
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2549AE
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25494D
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2548EB
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25488A
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254829
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2547C9
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254767
+
+ .align 2
+gUnknown_08613D7C:: @ 8613D7C
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252F01
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252F3A
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252F73
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252FAC
+
+ .align 2
+gUnknown_08613D8C:: @ 8613D8C
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253D3E
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253CE0
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253C87
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253C2C
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253BD2
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253B78
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253B1F
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253AC4
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253A69
+
+ .align 2
+gUnknown_08613DB0:: @ 8613DB0
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254C3E
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254BF1
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254BAE
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254B69
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254B25
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254AE1
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254A9E
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254A59
+
+ .align 2
+gUnknown_08613DD0:: @ 8613DD0
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_252FE5
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253000
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25301B
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253036
+
+ .align 2
+gUnknown_08613DE0:: @ 8613DE0
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253F6C
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253F34
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253EFA
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253EBE
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253E83
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253E48
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253E0E
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253DD2
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253D96
+
+ .align 2
+gUnknown_08613E04:: @ 8613E04
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254E6E
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254E27
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254DE0
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254D97
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254D4F
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254D07
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254CC0
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254C77
+
+ .align 2
+gUnknown_08613E24:: @ 8613E24
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253051
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25307C
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2530A7
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2530D2
+
+ .align 2
+gUnknown_08613E34:: @ 8613E34
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25422B
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2541DD
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25418D
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25413B
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_2540EA
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254099
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254049
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253FF7
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_253FA5
+
+ .align 2
+gUnknown_08613E58:: @ 8613E58
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_255068
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_25502F
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254FF6
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254FBB
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254F81
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254F47
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254F0E
+ .4byte BattleFrontier_BattlePyramidEmptySquare_Text_254ED3
+
+ .align 2
+gUnknown_08613E78:: @ 8613E78
+ .4byte gUnknown_08613C80
+ .4byte gUnknown_08613C90
+ .4byte gUnknown_08613CB4
+
+ .align 2
+gUnknown_08613E84:: @ 8613E84
+ .4byte gUnknown_08613CD4
+ .4byte gUnknown_08613CE4
+ .4byte gUnknown_08613D08
+
+ .align 2
+gUnknown_08613E90:: @ 8613E90
+ .4byte gUnknown_08613D28
+ .4byte gUnknown_08613D38
+ .4byte gUnknown_08613D5C
+
+ .align 2
+gUnknown_08613E9C:: @ 8613E9C
+ .4byte gUnknown_08613D7C
+ .4byte gUnknown_08613D8C
+ .4byte gUnknown_08613DB0
+
+ .align 2
+gUnknown_08613EA8:: @ 8613EA8
+ .4byte gUnknown_08613DD0
+ .4byte gUnknown_08613DE0
+ .4byte gUnknown_08613E04
+
+ .align 2
+gUnknown_08613EB4:: @ 8613EB4
+ .4byte gUnknown_08613E24
+ .4byte gUnknown_08613E34
+ .4byte gUnknown_08613E58
+
+ .align 2
+gUnknown_08613EC0:: @ 8613EC0
+ .4byte gUnknown_08613E78
+ .4byte gUnknown_08613E84
+ .4byte gUnknown_08613E90
+ .4byte gUnknown_08613E9C
+ .4byte gUnknown_08613EA8
+ .4byte gUnknown_08613EB4
+
+gUnknown_08613ED8:: @ 8613ED8
+ .byte 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x03, 0x04
+
+ .align 2
+gUnknown_08613EE0:: @ 8613EE0
+ .4byte sub_81A8E9C
+ .4byte sub_81A8F38
+ .4byte sub_81A9048
+ .4byte sub_81A9134
+ .4byte sub_81A917C
+ .4byte sub_81A91FC
+ .4byte sub_81A9254
+ .4byte CalculateBattlePyramidItemBallItemId
+ .4byte sub_81A93C8
+ .4byte sub_81A9414
+ .4byte sub_81A9424
+ .4byte sub_81A9618
+ .4byte sub_81A966C
+ .4byte sub_81A9684
+ .4byte sub_81A975C
+ .4byte sub_81A97C8
+ .4byte sub_81A9828
+ .4byte sub_81A9834
+
+ .align 1
+gUnknown_08613F28:: @ 8613F28
+ .2byte 0x003f, 0x0040, 0x0041, 0x0043, 0x0042, 0x0046
+
+ .align 2
+gUnknown_08613F34:: @ 8613F34
+ .2byte 0x00b3, 0x00b4, 0x00b7, 0x00c8, 0x00b9, 0x00bb, 0x00c4, 0x00c6, 0x00ba
+
+gUnknown_08613F46:: @ 8613F46
+ .byte 0x01, 0x04, 0xff, 0xff, 0x00, 0x02, 0x05, 0xff, 0x01, 0x03, 0x06, 0xff, 0x02, 0x07, 0xff, 0xff, 0x00, 0x05, 0x08, 0xff, 0x01, 0x04, 0x06, 0x09, 0x02, 0x05, 0x07, 0x0a, 0x03, 0x06, 0x0b, 0xff
+ .byte 0x04, 0x09, 0x0c, 0xff, 0x05, 0x08, 0x0a, 0x0d, 0x06, 0x09, 0x0b, 0x0e, 0x07, 0x0a, 0x0f, 0xff, 0x08, 0x0d, 0xff, 0xff, 0x09, 0x0c, 0x0e, 0xff, 0x0a, 0x0d, 0x0f, 0xff, 0x0b, 0x0e, 0xff, 0xff
+
+gUnknown_08613F86:: @ 8613F86
+ .byte 0x1e, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x55, 0x5a, 0x5f, 0x64
diff --git a/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc
index 69df3aca2..bce2de516 100644
--- a/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc
+++ b/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc
@@ -73,7 +73,7 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_25752E:: @ 825752E
waitse
waitmovement 0
setvar VAR_0x8004, 6
- special sub_81A5238
+ special CallBattleArenaFunction
msgbox BattleFrontier_BattleArenaBattleRoom_Text_257C68, 4
closemessage
applymovement 7, BattleFrontier_BattleArenaBattleRoom_Movement_257BF2
@@ -105,7 +105,7 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_2575DB:: @ 82575DB
waitse
waitmovement 0
setvar VAR_0x8004, 6
- special sub_81A5238
+ special CallBattleArenaFunction
msgbox BattleFrontier_BattleArenaBattleRoom_Text_257CCE, 4
BattleFrontier_BattleArenaBattleRoom_EventScript_257615:: @ 8257615
@@ -266,7 +266,7 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_25789A:: @ 825789A
waitmessage
setvar VAR_0x8004, 3
setvar VAR_0x8005, 2
- special sub_81A5238
+ special CallBattleArenaFunction
playse SE_SAVE
waitse
fadescreen 1
diff --git a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc
index 710dd1ece..19976c855 100644
--- a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc
+++ b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc
@@ -32,11 +32,11 @@ BattleFrontier_BattleArenaLobby_EventScript_255C88:: @ 8255C88
setvar VAR_0x8004, 2
setvar VAR_0x8005, 1
setvar VAR_0x8006, 0
- special sub_81A5238
+ special CallBattleArenaFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 2
setvar VAR_0x8006, 0
- special sub_81A5238
+ special CallBattleArenaFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 0
setvar VAR_0x8006, 0
@@ -78,7 +78,7 @@ BattleFrontier_BattleArenaLobby_EventScript_255D2B:: @ 8255D2B
setvar VAR_0x8004, 2
setvar VAR_0x8005, 2
setvar VAR_0x8006, 0
- special sub_81A5238
+ special CallBattleArenaFunction
call BattleFrontier_BattleArenaLobby_EventScript_255D59
msgbox BattleFrontier_BattleArenaLobby_Text_256A74, 4
closemessage
@@ -93,7 +93,7 @@ BattleFrontier_BattleArenaLobby_EventScript_255D59:: @ 8255D59
special HealPlayerParty
setvar VAR_0x8004, 3
setvar VAR_0x8005, 0
- special sub_81A5238
+ special CallBattleArenaFunction
playse SE_SAVE
waitse
call BattleFrontier_BattleArenaLobby_EventScript_23E8E0
@@ -119,7 +119,7 @@ BattleFrontier_BattleArenaLobby_EventScript_255DC0:: @ 8255DC0
waitmessage
setvar VAR_0x8004, 3
setvar VAR_0x8005, 1
- special sub_81A5238
+ special CallBattleArenaFunction
playse SE_SAVE
waitse
setvar VAR_0x8004, 2
@@ -183,11 +183,11 @@ BattleFrontier_BattleArenaLobby_EventScript_255EE8:: @ 8255EE8
setvar VAR_0x8005, 4
special CallFrontierUtilFunc
setvar VAR_0x8004, 0
- special sub_81A5238
+ special CallBattleArenaFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 2
setvar VAR_0x8006, 1
- special sub_81A5238
+ special CallBattleArenaFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 0
setvar VAR_0x8006, 1
diff --git a/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc
index 6d2350b6f..96d53d42f 100644
--- a/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc
+++ b/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc
@@ -69,7 +69,7 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_25AE67:: @ 825AE67
waitmovement 0
call BattleFrontier_BattleFactoryBattleRoom_EventScript_25B1B4
setvar VAR_0x8004, 11
- special sub_81A5E74
+ special CallBattleFactoryFunction
removeobject 2
setobjectxyperm 2, 7, 1
addobject 2
@@ -109,14 +109,14 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25AEF8:: @ 825AEF8
BattleFrontier_BattleFactoryBattleRoom_EventScript_25AF0F:: @ 825AF0F
setvar VAR_0x8004, 1
setvar VAR_0x8005, 3
- special sub_81A5E74
+ special CallBattleFactoryFunction
compare VAR_RESULT, 9999
goto_eq BattleFrontier_BattleFactoryBattleRoom_EventScript_25AF3E
addvar VAR_RESULT, 1
setorcopyvar VAR_0x8006, VAR_RESULT
setvar VAR_0x8004, 2
setvar VAR_0x8005, 3
- special sub_81A5E74
+ special CallBattleFactoryFunction
BattleFrontier_BattleFactoryBattleRoom_EventScript_25AF3E:: @ 825AF3E
call BattleFrontier_BattleFactoryBattleRoom_EventScript_241EBA
@@ -235,24 +235,24 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_25B0E0:: @ 825B0E0
BattleFrontier_BattleFactoryBattleRoom_EventScript_25B105:: @ 825B105
setvar VAR_0x8004, 1
setvar VAR_0x8005, 3
- special sub_81A5E74
+ special CallBattleFactoryFunction
compare VAR_RESULT, 9999
goto_eq BattleFrontier_BattleFactoryBattleRoom_EventScript_25AF3E
addvar VAR_RESULT, 1
setorcopyvar VAR_0x8006, VAR_RESULT
setvar VAR_0x8004, 2
setvar VAR_0x8005, 3
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 1
setvar VAR_0x8005, 1
- special sub_81A5E74
+ special CallBattleFactoryFunction
compare VAR_RESULT, 9999
goto_eq BattleFrontier_BattleFactoryBattleRoom_EventScript_25AF43
addvar VAR_RESULT, 1
setvar VAR_0x8004, 2
setvar VAR_0x8005, 1
copyvar VAR_0x8006, VAR_RESULT
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 1
setvar VAR_0x8005, 2
special CallFrontierUtilFunc
diff --git a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc
index 1a535c893..6ea24b81f 100644
--- a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc
+++ b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc
@@ -30,19 +30,19 @@ BattleFrontier_BattleFactoryLobby_EventScript_25843A:: @ 825843A
msgbox BattleFrontier_BattleFactoryLobby_Text_258ECA, 4
closemessage
setvar VAR_0x8004, 8
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 3
setvar VAR_0x8006, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 1
setvar VAR_0x8006, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 2
setvar VAR_0x8006, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 0
setvar VAR_0x8006, 0
@@ -77,7 +77,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_2584C6:: @ 82584C6
special LoadPlayerParty
setvar VAR_0x8004, 3
setvar VAR_0x8005, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
playse SE_SAVE
waitse
goto BattleFrontier_BattleFactoryLobby_EventScript_25853B
@@ -93,10 +93,10 @@ BattleFrontier_BattleFactoryLobby_EventScript_258506:: @ 8258506
setvar VAR_0x8004, 2
setvar VAR_0x8005, 2
setvar VAR_0x8006, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 3
setvar VAR_0x8005, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
playse SE_SAVE
waitse
@@ -128,7 +128,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_258592:: @ 8258592
waitmessage
setvar VAR_0x8004, 3
setvar VAR_0x8005, 1
- special sub_81A5E74
+ special CallBattleFactoryFunction
playse SE_SAVE
waitse
setvar VAR_0x8004, 2
@@ -193,7 +193,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_258653:: @ 8258653
BattleFrontier_BattleFactoryLobby_EventScript_2586B9:: @ 82586B9
setvar VAR_TEMP_0, 0
setvar VAR_0x8004, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 0
setvar VAR_0x8006, 1
@@ -201,7 +201,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_2586B9:: @ 82586B9
setvar VAR_0x8004, 2
setvar VAR_0x8005, 2
setvar VAR_0x8006, 1
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 3
setvar VAR_0x8006, 0
diff --git a/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc
index 5764025e0..d99fed1b2 100644
--- a/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc
+++ b/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc
@@ -32,23 +32,23 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259AF9:: @ 8259AF9
compare VAR_0x8006, 2
goto_eq BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259E69
setvar VAR_0x8004, 13
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 12
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 14
- special sub_81A5E74
+ special CallBattleFactoryFunction
setorcopyvar VAR_0x8005, VAR_RESULT
setvar VAR_0x8004, 15
- special sub_81A5E74
+ special CallBattleFactoryFunction
setorcopyvar VAR_0x8006, VAR_RESULT
call BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259E93
call BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A004
msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25A1C8, 4
fadescreen 1
setvar VAR_0x8004, 8
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 6
- special sub_81A5E74
+ special CallBattleFactoryFunction
waitstate
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259B74:: @ 8259B74
@@ -66,9 +66,9 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259B74:: @ 8259B74
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259BA5:: @ 8259BA5
setvar VAR_0x8004, 9
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 16
- special sub_81A5E74
+ special CallBattleFactoryFunction
msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25A22D, 4
playfanfare MUS_ME_ASA
waitfanfare
@@ -165,12 +165,12 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259D66:: @ 8259D66
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259D98:: @ 8259D98
setvar VAR_0x8004, 12
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 14
- special sub_81A5E74
+ special CallBattleFactoryFunction
setorcopyvar VAR_0x8005, VAR_RESULT
setvar VAR_0x8004, 15
- special sub_81A5E74
+ special CallBattleFactoryFunction
setorcopyvar VAR_0x8006, VAR_RESULT
call BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259E93
call BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A004
@@ -183,12 +183,12 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259D98:: @ 8259D98
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259DF2:: @ 8259DF2
fadescreen 1
setvar VAR_0x8004, 7
- special sub_81A5E74
+ special CallBattleFactoryFunction
waitstate
compare VAR_RESULT, 1
goto_eq BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259B74
setvar VAR_0x8004, 8
- special sub_81A5E74
+ special CallBattleFactoryFunction
msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25AB6C, 4
goto BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259B74
@@ -227,7 +227,7 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259E47:: @ 8259E47
waitmessage
setvar VAR_0x8004, 3
setvar VAR_0x8005, 2
- special sub_81A5E74
+ special CallBattleFactoryFunction
playse SE_SAVE
waitse
fadescreen 1
@@ -239,7 +239,7 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_259E69:: @ 8259E69
special SavePlayerParty
setvar VAR_0x8004, 10
setvar VAR_0x8005, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 2
setvar VAR_0x8005, 6
setvar VAR_0x8006, 1
@@ -381,39 +381,39 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A004:: @ 825A004
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A068:: @ 825A068
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25AAE6, 4
+ msgbox Text_StyleUnrestrained, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A071:: @ 825A071
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25A9CE, 4
+ msgbox Text_StyleTotalPreparation, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A07A:: @ 825A07A
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25A8D9, 4
+ msgbox Text_StyleSlowAndSteady, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A083:: @ 825A083
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25A912, 4
+ msgbox Text_StyleEndurance, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A08C:: @ 825A08C
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25A94C, 4
+ msgbox Text_StyleHighRisk, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A095:: @ 825A095
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25AA16, 4
+ msgbox Text_StyleWeakenFoe, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A09E:: @ 825A09E
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25AAA7, 4
+ msgbox Text_StyleImpossibleToPredict, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A0A7:: @ 825A0A7
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25A98C, 4
+ msgbox Text_StyleDependsOnFlow, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A0B0:: @ 825A0B0
- msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_25AA5A, 4
+ msgbox Text_StyleFlexible, 4
return
BattleFrontier_BattleFactoryPreBattleRoom_EventScript_25A0B9:: @ 825A0B9
@@ -642,39 +642,39 @@ BattleFrontier_BattleFactoryPreBattleRoom_Text_25A893: @ 825A893
.string "The TRAINER appears to have no clear\n"
.string "favorites when it comes to type.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25A8D9: @ 825A8D9
+Text_StyleSlowAndSteady: @ 825A8D9
.string "The favorite battle style appears to\n"
.string "be slow and steady.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25A912: @ 825A912
+Text_StyleEndurance: @ 825A912
.string "The favorite battle style appears to\n"
.string "be one of endurance.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25A94C: @ 825A94C
+Text_StyleHighRisk: @ 825A94C
.string "The favorite battle style appears to\n"
.string "be high risk, high return.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25A98C: @ 825A98C
+Text_StyleDependsOnFlow: @ 825A98C
.string "The favorite battle style appears to\n"
.string "depend on the battle’s flow.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25A9CE: @ 825A9CE
+Text_StyleTotalPreparation: @ 825A9CE
.string "The favorite battle style appears to\n"
.string "be one based on total preparation.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25AA16: @ 825AA16
+Text_StyleWeakenFoe: @ 825AA16
.string "The favorite battle style appears\n"
.string "to be weakening the foe to start.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25AA5A: @ 825AA5A
+Text_StyleFlexible: @ 825AA5A
.string "The favorite battle style appears to\n"
.string "be flexibly adaptable to the situation.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25AAA7: @ 825AAA7
+Text_StyleImpossibleToPredict: @ 825AAA7
.string "The favorite battle style appears to\n"
.string "be impossible to predict.$"
-BattleFrontier_BattleFactoryPreBattleRoom_Text_25AAE6: @ 825AAE6
+Text_StyleUnrestrained: @ 825AAE6
.string "The favorite battle style appears to\n"
.string "be free-spirited and unrestrained.$"
diff --git a/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc b/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc
index 6ec39dfd2..8bbcef830 100644
--- a/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc
+++ b/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc
@@ -162,14 +162,14 @@ FallarborTown_BattleTentBattleRoom_EventScript_200AF3:: @ 8200AF3
waitstate
setvar VAR_0x8004, 1
setvar VAR_0x8005, 1
- special sub_81A5238
+ special CallBattleArenaFunction
compare VAR_RESULT, 9999
goto_eq FallarborTown_BattleTentBattleRoom_EventScript_2009B3
addvar VAR_RESULT, 1
setvar VAR_0x8004, 2
setvar VAR_0x8005, 1
copyvar VAR_0x8006, VAR_RESULT
- special sub_81A5238
+ special CallBattleArenaFunction
FallarborTown_BattleTentBattleRoom_EventScript_200B43:: @ 8200B43
message FallarborTown_BattleTentBattleRoom_Text_257D17
diff --git a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc
index 833abdf99..6b63f13f8 100644
--- a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc
+++ b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc
@@ -42,7 +42,7 @@ SlateportCity_BattleTentBattleRoom_EventScript_2099BE:: @ 82099BE
applymovement 3, SlateportCity_BattleTentBattleRoom_Movement_209A99
waitmovement 0
setvar VAR_0x8004, 11
- special sub_81A5E74
+ special CallBattleFactoryFunction
setobjectxyperm 2, 5, 1
removeobject 2
addobject 2
diff --git a/data/maps/SlateportCity_BattleTentCorridor/scripts.inc b/data/maps/SlateportCity_BattleTentCorridor/scripts.inc
index c2ef5e3da..57df51237 100644
--- a/data/maps/SlateportCity_BattleTentCorridor/scripts.inc
+++ b/data/maps/SlateportCity_BattleTentCorridor/scripts.inc
@@ -59,9 +59,9 @@ SlateportCity_BattleTentCorridor_EventScript_208EB4:: @ 8208EB4
SlateportCity_BattleTentCorridor_EventScript_208EEE:: @ 8208EEE
setvar VAR_0x8004, 9
- special sub_81A5E74
+ special CallBattleFactoryFunction
setvar VAR_0x8004, 16
- special sub_81A5E74
+ special CallBattleFactoryFunction
msgbox SlateportCity_BattleTentCorridor_Text_25A22D, 4
playfanfare MUS_ME_ASA
waitfanfare
@@ -143,7 +143,7 @@ SlateportCity_BattleTentCorridor_EventScript_209044:: @ 8209044
special SavePlayerParty
setvar VAR_0x8004, 10
setvar VAR_0x8005, 0
- special sub_81A5E74
+ special CallBattleFactoryFunction
goto SlateportCity_BattleTentCorridor_EventScript_208F0D
SlateportCity_BattleTentCorridor_Movement_209059: @ 8209059
diff --git a/data/specials.inc b/data/specials.inc
index 5c1653d49..680843237 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -248,8 +248,8 @@ gSpecials:: @ 81DBA64
def_special sub_8195960
def_special CopyEReaderTrainerGreeting
def_special DoSpecialTrainerBattle
- def_special sub_81A5238
- def_special sub_81A5E74
+ def_special CallBattleArenaFunction
+ def_special CallBattleFactoryFunction
def_special sub_81A703C
def_special sub_81A8E7C
def_special StopMapMusic
diff --git a/include/battle.h b/include/battle.h
index f34364ea6..5f925b925 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -498,7 +498,9 @@ struct BattleStruct
struct BattleTv tv;
u8 notSureWhatFieldLol[0x28];
u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT];
- u8 field_298[8];
+ s8 field_298[2];
+ s8 field_29A[2];
+ u16 field_29C[2];
u8 field_2A0;
u8 field_2A1;
u8 field_2A2;
diff --git a/include/battle_factory.h b/include/battle_factory.h
index 1b0e44943..b2d3fc10f 100644
--- a/include/battle_factory.h
+++ b/include/battle_factory.h
@@ -1,7 +1,12 @@
#ifndef GUARD_BATTLE_FACTORY_H
#define GUARD_BATTLE_FACTORY_H
-void DoBattleFactorySelectScreen(void);
-void DoBattleFactorySwapScreen(void);
+void CallBattleFactoryFunction(void);
+bool8 sub_81A6BF4(void);
+u8 GetFactoryMonFixedIV(u8 arg0, u8 arg1);
+void FillFactoryBrainParty(void);
+u8 sub_81A6F70(u8 battleMode, u8 lvlMode);
+u32 GetAiScriptsInBattleFactory(void);
+void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 moveArg, u8 moveSlot);
-#endif // GUARD_BATTLE_FACTORY_H
+#endif //GUARD_BATTLE_FACTORY_H
diff --git a/include/battle_factory_screen.h b/include/battle_factory_screen.h
new file mode 100644
index 000000000..86d6177f6
--- /dev/null
+++ b/include/battle_factory_screen.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_BATTLE_FACTORY_SCREEN_H
+#define GUARD_BATTLE_FACTORY_SCREEN_H
+
+void DoBattleFactorySelectScreen(void);
+void DoBattleFactorySwapScreen(void);
+
+#endif // GUARD_BATTLE_FACTORY_SCREEN_H
diff --git a/include/battle_tower.h b/include/battle_tower.h
index 5fe8d1190..90c22c982 100644
--- a/include/battle_tower.h
+++ b/include/battle_tower.h
@@ -21,7 +21,7 @@ struct BattleFrontierTrainer
u16 speechBefore[6];
u16 speechWin[6];
u16 speechLose[6];
- const u16 *bfMonPool;
+ const u16 *monSets;
};
struct FacilityMon
@@ -52,7 +52,7 @@ u8 GetFrontierOpponentClass(u16 trainerId);
void GetFrontierTrainerName(u8 *dst, u16 trainerId);
void FillFrontierTrainerParty(u8 monsCount);
void FillFrontierTrainersParties(u8 monsCount);
-u16 RandomizeFacilityTrainerMonId(u16 trainerId);
+u16 RandomizeFacilityTrainerMonSet(u16 trainerId);
void FrontierSpeechToString(const u16 *words);
void DoSpecialTrainerBattle(void);
void CalcEmeraldBattleTowerChecksum(struct EmeraldBattleTowerRecord *record);
diff --git a/include/frontier_util.h b/include/frontier_util.h
index cfc3a8af4..6b6a2ea39 100644
--- a/include/frontier_util.h
+++ b/include/frontier_util.h
@@ -15,6 +15,7 @@ u8 GetPlayerSymbolCountForFacility(u8 facility);
void ShowRankingHallRecordsWindow(void);
void ScrollRankingHallRecordsWindow(void);
void ClearRankingHallRecords(void);
+void sub_81A4C30(void);
u8 GetFrontierBrainTrainerPicIndex(void);
u8 GetFrontierBrainTrainerClass(void);
void CopyFrontierBrainTrainerName(u8 *dst);
diff --git a/include/pokemon.h b/include/pokemon.h
index 0155f7430..7cf043ba3 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -486,7 +486,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI
void sub_806819C(struct Pokemon *mon, struct UnknownPokemonStruct *src);
void sub_8068338(struct Pokemon *mon, struct UnknownPokemonStruct *src, bool8 lvl50);
void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 monId);
-void CreateMonWithEVSpreadPersonalityOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId);
+void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId);
void sub_80686FC(struct Pokemon *mon, struct UnknownPokemonStruct *dest);
void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId);
bool8 sub_80688F8(u8 caseId, u8 battlerId);
diff --git a/ld_script.txt b/ld_script.txt
index 4177268bf..029dbb0b5 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -262,9 +262,11 @@ SECTIONS {
src/battle_frontier_1.o(.text);
asm/battle_frontier_1.o(.text);
src/menu.o(.text);
- src/battle_factory.o(.text);
+ src/battle_factory_screen.o(.text);
src/apprentice.o(.text);
src/frontier_util.o(.text);
+ src/battle_arena.o(.text);
+ src/battle_factory.o(.text);
asm/battle_frontier_2.o(.text);
src/item_menu.o(.text);
src/list_menu.o(.text);
@@ -566,10 +568,13 @@ SECTIONS {
src/battle_dome.o(.rodata);
data/battle_frontier_1.o(.rodata);
src/menu.o(.rodata);
- src/battle_factory.o(.rodata);
+ src/battle_factory_screen.o(.rodata);
src/apprentice.o(.rodata);
src/frontier_util.o(.rodata);
data/battle_frontier_2.o(.rodata);
+ src/battle_arena.o(.rodata);
+ src/battle_factory.o(.rodata);
+ data/battle_frontier_3.o(.rodata);
src/item_menu.o(.rodata);
src/list_menu.o(.rodata);
src/save_location.o(.rodata);
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index e89d308f5..ab850f4fb 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -4,13 +4,14 @@
#include "battle.h"
#include "battle_setup.h"
#include "recorded_battle.h"
-#include "constants/species.h"
-#include "constants/abilities.h"
#include "random.h"
#include "item.h"
+#include "util.h"
+#include "battle_factory.h"
+#include "constants/species.h"
+#include "constants/abilities.h"
#include "constants/battle_move_effects.h"
#include "constants/moves.h"
-#include "util.h"
#include "constants/battle_ai.h"
#define AI_ACTION_DONE 0x0001
@@ -44,8 +45,6 @@ AI scripts.
extern const u8 *const gBattleAI_ScriptsTable[];
-extern u32 GetAiScriptsInBattleFactory();
-
static u8 ChooseMoveOrAction_Singles(void);
static u8 ChooseMoveOrAction_Doubles(void);
static void RecordLastUsedMoveByTarget(void);
diff --git a/src/battle_arena.c b/src/battle_arena.c
index 968a7e7e4..5ab71965b 100644
--- a/src/battle_arena.c
+++ b/src/battle_arena.c
@@ -9,18 +9,62 @@
#include "bg.h"
#include "sound.h"
#include "m4a.h"
+#include "util.h"
+#include "battle_setup.h"
+#include "overworld.h"
+#include "frontier_util.h"
+#include "random.h"
+#include "item.h"
+#include "battle_tower.h"
#include "constants/songs.h"
+#include "constants/battle_string_ids.h"
+#include "constants/battle_frontier.h"
extern u16 gBattle_WIN0H;
extern u16 gBattle_WIN0V;
-extern void (* const gUnknown_08611F84[])(void);
-extern const struct CompressedSpriteSheet gUnknown_08611F74[];
+extern const u32 gUnknown_08D854E8[];
extern const u16 gUnknown_08D855E8[];
extern const struct SpriteTemplate gUnknown_08611F5C;
+extern const s8 gBattleArenaMoveMindRatings[];
// This file's functions.
-void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler);
+static void sub_81A58B4(void);
+static void sub_81A5964(void);
+static void sub_81A59FC(void);
+static void sub_81A5AC4(void);
+static void sub_81A5B08(void);
+static void sub_81A5B88(void);
+static void sub_81A5BE0(void);
+static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler);
+
+// Const rom data.
+static const struct CompressedSpriteSheet gUnknown_08611F74[] =
+{
+ {gUnknown_08D854E8, 0x200, 0x3E8},
+ {0}
+};
+
+static void (* const gUnknown_08611F84[])(void) =
+{
+ sub_81A58B4,
+ sub_81A5964,
+ sub_81A59FC,
+ sub_81A5AC4,
+ sub_81A5B08,
+ sub_81A5B88,
+ sub_81A5BE0,
+};
+
+static const u16 gUnknown_08611FA0[6] =
+{
+ 0x003f, 0x0040, 0x0041, 0x0043, 0x0042, 0x0046
+};
+
+static const u16 gUnknown_08611FAC[9] =
+{
+ 0x00b3, 0x00b4, 0x00b7, 0x00c8, 0x00b9, 0x00bb, 0x00c4, 0x00c6, 0x00ba
+};
// code
void CallBattleArenaFunction(void)
@@ -153,7 +197,7 @@ u8 sub_81A5258(u8 *state)
return ret;
}
-void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler)
+static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler)
{
s32 animNum = 0;
s32 r6 = 0;
@@ -222,3 +266,243 @@ void sub_81A56B4(void)
ptr3[0] = gBattleMons[0].hp;
ptr3[1] = gBattleMons[1].hp;
}
+
+void sub_81A56E8(u8 battler)
+{
+ s8 *ptr1 = gBattleStruct->field_298;
+
+ ptr1[battler] += gBattleArenaMoveMindRatings[gCurrentMove];
+}
+
+void sub_81A5718(u8 battler)
+{
+ s8 *ptr2 = gBattleStruct->field_29A;
+
+ if (gHitMarker & HITMARKER_OBEYS)
+ {
+ u8 *ptr4 = &gBattleStruct->field_2A2;
+ if (*ptr4 & gBitTable[battler])
+ {
+ *ptr4 &= ~(gBitTable[battler]);
+ ptr2[battler] -= 2;
+ }
+ else if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ {
+ if (!(gMoveResultFlags & MOVE_RESULT_MISSED) || gBattleCommunication[6] != 1)
+ ptr2[battler] -= 2;
+ }
+ else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE && gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
+ {
+ ptr2[battler] += 1;
+ }
+ else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)
+ {
+ ptr2[battler] += 2;
+ }
+ else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
+ {
+ ptr2[battler] -= 1;
+ }
+ else if (!gProtectStructs[battler].protected)
+ {
+ ptr2[battler] += 1;
+ }
+ }
+}
+
+void sub_81A57E4(u8 battler, u16 stringId)
+{
+ s8 *ptr2 = gBattleStruct->field_29A;
+
+ switch (stringId)
+ {
+ case STRINGID_PKMNSXMADEYUSELESS:
+ case STRINGID_PKMNSXMADEITINEFFECTIVE:
+ case STRINGID_PKMNSXPREVENTSFLINCHING:
+ case STRINGID_PKMNSXBLOCKSY2:
+ case STRINGID_PKMNSXPREVENTSYLOSS:
+ case STRINGID_PKMNSXMADEYINEFFECTIVE:
+ case STRINGID_PKMNSXPREVENTSBURNS:
+ case STRINGID_PKMNSXBLOCKSY:
+ case STRINGID_PKMNPROTECTEDBY:
+ case STRINGID_PKMNPREVENTSUSAGE:
+ case STRINGID_PKMNRESTOREDHPUSING:
+ case STRINGID_PKMNPREVENTSPARALYSISWITH:
+ case STRINGID_PKMNPREVENTSROMANCEWITH:
+ case STRINGID_PKMNPREVENTSPOISONINGWITH:
+ case STRINGID_PKMNPREVENTSCONFUSIONWITH:
+ case STRINGID_PKMNRAISEDFIREPOWERWITH:
+ case STRINGID_PKMNANCHORSITSELFWITH:
+ case STRINGID_PKMNPREVENTSSTATLOSSWITH:
+ case STRINGID_PKMNSTAYEDAWAKEUSING:
+ ptr2[battler] -= 3;
+ break;
+ }
+}
+
+void sub_81A586C(u8 battler)
+{
+ u16 *ptr3 = gBattleStruct->field_29C;
+
+ ptr3[battler] = gBattleMons[battler].hp;
+ if (ptr3[BATTLE_OPPOSITE(battler)] > gBattleMons[BATTLE_OPPOSITE(battler)].hp)
+ ptr3[BATTLE_OPPOSITE(battler)] = gBattleMons[BATTLE_OPPOSITE(battler)].hp;
+}
+
+static void sub_81A58B4(void)
+{
+ bool32 isCurrent;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_b = 0;
+ if (lvlMode != FRONTIER_LVL_50)
+ isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x80;
+ else
+ isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x40;
+
+ if (!isCurrent)
+ gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0;
+
+ saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ gTrainerBattleOpponent_A = 0;
+}
+
+static void sub_81A5964(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DD8;
+ break;
+ case 1:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode];
+ break;
+ case 2:
+ if (lvlMode != FRONTIER_LVL_50)
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x80;
+ else
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x40;
+ break;
+ }
+}
+
+static void sub_81A59FC(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ gSaveBlock2Ptr->frontier.field_DD8 = gSpecialVar_0x8006;
+ break;
+ case 1:
+ gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = gSpecialVar_0x8006;
+ break;
+ case 2:
+ if (lvlMode != FRONTIER_LVL_50)
+ {
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= 0x80;
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= ~(0x80);
+ }
+ else
+ {
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= 0x40;
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= ~(0x40);
+ }
+ break;
+ }
+}
+
+static void sub_81A5AC4(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = 1;
+ sub_81A4C30();
+}
+
+static void sub_81A5B08(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] > 41)
+ gSaveBlock2Ptr->frontier.field_DD8 = gUnknown_08611FAC[Random() % ARRAY_COUNT(gUnknown_08611FAC)];
+ else
+ gSaveBlock2Ptr->frontier.field_DD8 = gUnknown_08611FA0[Random() % ARRAY_COUNT(gUnknown_08611FA0)];
+}
+
+static void sub_81A5B88(void)
+{
+ if (AddBagItem(gSaveBlock2Ptr->frontier.field_DD8, 1) == TRUE)
+ {
+ CopyItemName(gSaveBlock2Ptr->frontier.field_DD8, gStringVar1);
+ gSaveBlock2Ptr->frontier.field_DD8 = 0;
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ {
+ gSpecialVar_Result = FALSE;
+ }
+}
+
+static void sub_81A5BE0(void)
+{
+ GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A);
+}
+
+void sub_81A5BF8(void)
+{
+ u8 width = 27;
+ u8 palNum = 7;
+
+ FillBgTilemapBufferRect(0, 0, 254, 14, 1, 6, palNum);
+ FillBgTilemapBufferRect(0, 0, 32, 14, 1, 6, palNum);
+ FillBgTilemapBufferRect(0, 0x31, 0, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x33, 1, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x34, 2, 14, width, 1, palNum);
+ width++;
+ FillBgTilemapBufferRect(0, 0x35, 28, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x36, 29, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x37, 0, 15, 1, 5, palNum);
+ FillBgTilemapBufferRect(0, 0x39, 1, 15, width, 5, palNum);
+ FillBgTilemapBufferRect(0, 0x3A, 29, 15, 1, 5, palNum);
+ FillBgTilemapBufferRect(0, 0x831, 0, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x833, 1, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x834, 2, 19, width - 2, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x835, 28, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x836, 29, 19, 1, 1, palNum);
+}
+
+void sub_81A5D44(void)
+{
+ u8 width;
+ u8 height;
+ u8 palNum = 0;
+
+ FillBgTilemapBufferRect(0, 3, 0, 14, 1, 1, palNum);
+ height = 4;
+ FillBgTilemapBufferRect(0, 4, 1, 14, 1, 1, palNum);
+ width = 27;
+ FillBgTilemapBufferRect(0, 5, 2, 14, width, 1, palNum);
+ FillBgTilemapBufferRect(0, 6, 28, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 7, 29, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 8, 0, 15, 1, height, palNum);
+ FillBgTilemapBufferRect(0, 9, 1, 15, 1, height, palNum);
+ FillBgTilemapBufferRect(0, 0xA, 2, 15, width, height, palNum);
+ FillBgTilemapBufferRect(0, 0xB, 28, 15, 1, height, palNum);
+ FillBgTilemapBufferRect(0, 0xC, 29, 15, 1, height, palNum);
+ FillBgTilemapBufferRect(0, 0xD, 0, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0xE, 1, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0xF, 2, 19, width, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x10, 28, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x11, 29, 19, 1, 1, palNum);
+}
diff --git a/src/battle_dome.c b/src/battle_dome.c
index b39162dda..2a77da180 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -2555,7 +2555,7 @@ static void InitDomeTrainers(void)
s32 species[3];
s32 monTypesBits, monTypesCount;
s32 trainerId;
- s32 monTournamentId;
+ s32 monSetId;
u16 *statSums;
s32 *statValues;
u8 ivs = 0;
@@ -2618,20 +2618,20 @@ static void InitDomeTrainers(void)
// Make sure the mon is valid.
do
{
- monTournamentId = RandomizeFacilityTrainerMonId(trainerId);
+ monSetId = RandomizeFacilityTrainerMonSet(trainerId);
for (k = 0; k < j; k++)
{
- s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonIds[i][k];
- if (checkingMonId == monTournamentId
- || species[0] == gFacilityTrainerMons[monTournamentId].species
- || species[1] == gFacilityTrainerMons[monTournamentId].species
- || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monTournamentId].itemTableId)
+ s32 checkingMonSetId = gSaveBlock2Ptr->frontier.domeMonIds[i][k];
+ if (checkingMonSetId == monSetId
+ || species[0] == gFacilityTrainerMons[monSetId].species
+ || species[1] == gFacilityTrainerMons[monSetId].species
+ || gFacilityTrainerMons[checkingMonSetId].itemTableId == gFacilityTrainerMons[monSetId].itemTableId)
break;
}
} while (k != j);
- gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monTournamentId;
- species[j] = gFacilityTrainerMons[monTournamentId].species;
+ gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monSetId;
+ species[j] = gFacilityTrainerMons[monSetId].species;
}
gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0;
@@ -2828,7 +2828,7 @@ static void CreateDomeMon(u8 monPartyId, u16 tournamentTrainerId, u8 tournamentM
u8 happiness = 0xFF;
u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Should be using trainerId instead of tournamentTrainerId. As a result, all Pokemon have ivs of 3.
u8 level = SetFacilityPtrsGetLevel();
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[monPartyId],
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[monPartyId],
gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].species,
level,
gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].nature,
@@ -6143,7 +6143,7 @@ static void sub_8194F58(void)
s32 species[3];
s32 monTypesBits;
s32 trainerId;
- s32 monTournamentId;
+ s32 monSetId;
u8 lvlMode;
u16 *statSums;
s32 *statValues;
@@ -6190,20 +6190,20 @@ static void sub_8194F58(void)
// Make sure the mon is valid.
do
{
- monTournamentId = RandomizeFacilityTrainerMonId(trainerId);
+ monSetId = RandomizeFacilityTrainerMonSet(trainerId);
for (k = 0; k < j; k++)
{
s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonIds[i][k];
- if (checkingMonId == monTournamentId
- || species[0] == gFacilityTrainerMons[monTournamentId].species
- || species[1] == gFacilityTrainerMons[monTournamentId].species
- || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monTournamentId].itemTableId)
+ if (checkingMonId == monSetId
+ || species[0] == gFacilityTrainerMons[monSetId].species
+ || species[1] == gFacilityTrainerMons[monSetId].species
+ || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monSetId].itemTableId)
break;
}
} while (k != j);
- gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monTournamentId;
- species[j] = gFacilityTrainerMons[monTournamentId].species;
+ gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monSetId;
+ species[j] = gFacilityTrainerMons[monSetId].species;
}
gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0;
gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt = 0;
diff --git a/src/battle_factory.c b/src/battle_factory.c
index d7a2939b3..703887ae5 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -1,4114 +1,861 @@
#include "global.h"
#include "battle_factory.h"
-#include "sprite.h"
+#include "battle_factory_screen.h"
#include "event_data.h"
+#include "battle_setup.h"
#include "overworld.h"
-#include "random.h"
+#include "frontier_util.h"
#include "battle_tower.h"
-#include "text.h"
-#include "palette.h"
-#include "task.h"
-#include "main.h"
-#include "malloc.h"
-#include "bg.h"
-#include "gpu_regs.h"
-#include "string_util.h"
-#include "international_string_util.h"
-#include "window.h"
-#include "data2.h"
-#include "decompress.h"
-#include "pokemon_summary_screen.h"
-#include "sound.h"
-#include "pokedex.h"
-#include "util.h"
-#include "trainer_pokemon_sprites.h"
+#include "random.h"
+#include "constants/species.h"
+#include "constants/battle_ai.h"
#include "constants/battle_frontier.h"
-#include "constants/songs.h"
-#include "constants/rgb.h"
-
-// Select_ refers to the first Pokemon selection screen where you choose 3 Pokemon.
-// Swap_ refers to the consecutive selection screen where you can keep your Pokemon or swap one with beaten trainer's.
-
-#define MENU_SUMMARY 0
-#define MENU_RENT 1
-#define MENU_DESELECT 1
-#define MENU_OTHERS 2
-#define MENU_OPTIONS_COUNT 3
-
-#define SELECTABLE_MONS_COUNT 6
+#include "constants/trainers.h"
+#include "constants/moves.h"
-#define TAG_PAL_BALL_GREY 0x64
-#define TAG_PAL_BALL_SELECTED 0x65
-#define TAG_PAL_66 0x66
-#define TAG_PAL_67 0x67
-
-#define TAG_TILE_64 0x64
-#define TAG_TILE_65 0x65
-#define TAG_TILE_66 0x66
-#define TAG_TILE_67 0x67
-#define TAG_TILE_68 0x68
-#define TAG_TILE_69 0x69
-#define TAG_TILE_6A 0x6A
-#define TAG_TILE_6B 0x6B
-#define TAG_TILE_6C 0x6C
-#define TAG_TILE_6D 0x6D
-
-struct FactorySelecteableMon
-{
- u16 monSetId;
- u16 spriteId;
- u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon
- struct Pokemon monData;
-};
+extern u8 gUnknown_03001288;
+extern u16 gUnknown_03006298[];
-struct UnkFactoryStruct
-{
- u8 field0;
- u8 field1;
-};
-
-struct FactorySelectMonsStruct
-{
- u8 menuCursorPos;
- u8 menuCursor1SpriteId;
- u8 menuCursor2SpriteId;
- u8 cursorPos;
- u8 cursorSpriteId;
- u8 selectingMonsState;
- bool8 fromSummaryScreen;
- u8 yesNoCursorPos;
- u8 unused8;
- struct FactorySelecteableMon mons[SELECTABLE_MONS_COUNT];
- struct UnkFactoryStruct unk294[3];
- bool8 unk2A0;
- u8 fadeSpeciesNameTaskId;
- bool8 unk2A2;
- u16 unk2A4;
- bool8 unk2A6;
- u8 unk2A7;
- u8 unk2A8;
- u8 unk2A9;
-};
-
-// 'Action' refers to the 3 Selectable mons, Cancel, Pknm for swap windows.
-#define ACTIONS_PLAYER_SCREEN 0
-#define ACTIONS_ENEMY_SCREEN 1
-
-struct SwapActionIdAndFunc
-{
- u8 id;
- void (*func)(u8 taskId);
-};
-
-struct FactorySwapMonsStruct
-{
- u8 menuCursorPos;
- u8 menuCursor1SpriteId;
- u8 menuCursor2SpriteId;
- u8 cursorPos;
- u8 cursorSpriteId;
- u8 ballSpriteIds[3];
- u8 unk8[2][3];
- u8 unkE[2][2];
- u8 playerMonId;
- u8 enemyMonId;
- bool8 inEnemyScreen;
- bool8 fromSummaryScreen;
- u8 yesNoCursorPos;
- u8 actionsCount;
- const struct SwapActionIdAndFunc *actionsData;
- u8 unused1C[4];
- bool8 monSwapped;
- u8 fadeSpeciesNameTaskId;
- bool8 unk22;
- u16 unk24;
- bool8 unk26;
- u8 unk27;
- u8 unk28;
- u8 unk29;
- struct UnkFactoryStruct unk2C;
- bool8 unk30;
-};
-
-extern u8 (*gUnknown_030062E8)(void);
-extern u8 gUnknown_0203CF20;
-
-extern const u16 gBattleFrontierHeldItems[];
extern const struct FacilityMon gBattleFrontierMons[];
extern const struct FacilityMon gSlateportBattleTentMons[];
extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
-extern const u32 gUnknown_085B18AC[];
-
-extern void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 move, u8 moveSlot);
-extern u8 sub_81A6F70(u8 battleMode, u8 lvlMode);
-extern u8 sub_81A6CA8(u8 arg0, u8 arg1);
+extern const u16 gBattleFrontierHeldItems[];
// This file's functions.
-static void sub_819A44C(struct Sprite *sprite);
-static void CB2_InitSelectScreen(void);
-static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V);
-static void Select_InitMonsData(void);
-static void Select_InitAllSprites(void);
-static void Select_ShowSummaryMonSprite(void);
-static void Select_PrintSelectMonString(void);
-static void Select_PrintMonSpecies(void);
-static void Select_PrintMonCategory(void);
-static void Select_PrintRentalPkmnString(void);
-static void Select_CopyMonsToPlayerParty(void);
-static void sub_819C4B4(void);
-static void Select_ShowYesNoOptions(void);
-static void sub_819C568(void);
-static void Select_ShowMenuOptions(void);
-static void Select_PrintMenuOptions(void);
-static void Select_PrintYesNoOptions(void);
-static void Task_SelectFadeSpeciesName(u8 taskId);
-static void sub_819C1D0(u8 taskId);
-static void Task_HandleSelectionScreenChooseMons(u8 taskId);
-static void Task_HandleSelectionScreenMenu(u8 taskId);
-static void CreateFrontierFactorySelectableMons(u8 firstMonId);
-static void CreateTentFactorySelectableMons(u8 firstMonId);
-static void Select_SetBallSpritePaletteNum(u8 id);
-static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1);
-static void sub_819B958(u8 windowId);
-static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen);
-static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen);
-static u8 Select_RunMenuOptionFunc(void);
-static u8 sub_819BC9C(void);
-static u8 Select_OptionSummary(void);
-static u8 Select_OptionOthers(void);
-static u8 Select_OptionRentDeselect(void);
-static bool32 Select_AreSpeciesValid(u16 monSetId);
-static void Swap_DestroyAllSprites(void);
-static void Swap_ShowYesNoOptions(void);
-static void sub_819E8EC(void);
-static void sub_819EAC0(void);
-static void Swap_UpdateYesNoCursorPosition(s8 direction);
-static void Swap_UpdateMenuCursorPosition(s8 direction);
-static void sub_819EA64(u8 windowId);
-static void sub_819D770(u8 taskId);
-static void Task_HandleSwapScreenChooseMons(u8 taskId);
-static void sub_819D588(u8 taskId);
-static void sub_819F7B4(u8 taskId);
-static void Swap_PrintOnInfoWindow(const u8 *str);
-static void Swap_ShowMenuOptions(void);
-static void Swap_PrintMenuOptions(void);
-static void Swap_PrintYesNoOptions(void);
-static void Swap_PrintMonSpecies(void);
-static void Swap_PrintMonSpecies2(void);
-static void Swap_PrintMonSpecies3(void);
-static void Swap_PrintMonCategory(void);
-static void Swap_InitAllSprites(void);
-static void Swap_PrintPkmnSwap(void);
-static void sub_819EADC(void);
-static void sub_819EAF8(void);
-static void CB2_InitSwapScreen(void);
-static void Swap_ShowSummaryMonSprite(void);
-static void Swap_UpdateActionCursorPosition(s8 direction);
-static void Swap_UpdateBallCursorPosition(s8 direction);
-static void Swap_RunMenuOptionFunc(u8 taskId);
-static void sub_819F0CC(u8 taskId);
-static void sub_819F114(u8 taskId);
-static void sub_819F134(u8 taskId);
-static void Swap_RunActionFunc(u8 taskId);
-static void sub_819F69C(u8 taskId);
-static void Task_SwapCantHaveSameMons(u8 taskId);
-static void Swap_ShowMonSprite(void);
-static void Swap_PrintActionStrings(void);
-static void Swap_PrintActionStrings2(void);
-static void Swap_PrintOneActionString(u8 which);
-static void Swap_InitActions(u8 id);
-static void sub_819E838(u8 arg0);
-static bool8 Swap_AlreadyHasSameSpecies(u8 monId);
-static void sub_819F600(struct Sprite *sprite);
-static void Swap_ActionMon(u8 taskId);
-static void Swap_ActionCancel(u8 taskId);
-static void Swap_ActionPkmnForSwap(u8 taskId);
-
-// Ewram variables
-static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL;
-static EWRAM_DATA u8 *sSelectMonCardBgTilesetBuffer = NULL;
-static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL;
-static EWRAM_DATA u8 *sSelectMonCardBgTilemapBuffer = NULL;
-static EWRAM_DATA struct Pokemon *sFactorySelectMons = NULL;
-static EWRAM_DATA u8 *sSwapMenuTilesetBuffer = NULL;
-static EWRAM_DATA u8 *sSwapMonCardBgTilesetBuffer = NULL;
-static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL;
-static EWRAM_DATA u8 *sSwapMonCardBgTilemapBuffer = NULL;
-
-// IWRAM bss
-static IWRAM_DATA struct FactorySelectMonsStruct *sFactorySelectScreen;
-static IWRAM_DATA void (*sSwap_CurrentTableFunc)(u8 taskId);
-static IWRAM_DATA struct FactorySwapMonsStruct *sFactorySwapScreen;
+static void sub_81A5E94(void);
+static void sub_81A5FA8(void);
+static void sub_81A6054(void);
+static void sub_81A613C(void);
+static void nullsub_75(void);
+static void nullsub_123(void);
+static void sub_81A6188(void);
+static void sub_81A6198(void);
+static void sub_81A61A4(void);
+static void sub_81A63CC(void);
+static void sub_81A64C4(void);
+static void sub_81A63B8(void);
+static void sub_81A61B0(void);
+static void sub_81A67EC(void);
+static void sub_81A6A08(void);
+static void sub_81A6AEC(void);
+static void sub_81A6C1C(void);
+static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2);
+static u8 GetStyleForMove(u16 move);
// Const rom data.
-static const u16 gUnknown_0860F13C[] = INCBIN_U16("graphics/unknown/unknown_60F13C.gbapal");
-static const u16 gUnknown_0860F15C[] = INCBIN_U16("graphics/unknown/unknown_60F15C.gbapal");
-static const u16 gUnknown_0860F17C[] = INCBIN_U16("graphics/unknown/unknown_60F17C.gbapal");
-static const u8 gUnknown_0860F1BC[] = INCBIN_U8("graphics/unknown/unknown_60F1BC.4bpp");
-static const u8 gUnknown_0860F3BC[] = INCBIN_U8("graphics/unknown/unknown_60F3BC.4bpp");
-static const u8 gUnknown_0860F43C[] = INCBIN_U8("graphics/unknown/unknown_60F43C.4bpp");
-static const u8 gUnknown_0860F53C[] = INCBIN_U8("graphics/unknown/unknown_60F53C.4bpp");
-static const u8 gUnknown_0860F63C[] = INCBIN_U8("graphics/unknown/unknown_60F63C.4bpp");
-static const u8 gUnknown_0860F6BC[] = INCBIN_U8("graphics/unknown/unknown_60F6BC.4bpp");
-static const u8 gUnknown_0860F7BC[] = INCBIN_U8("graphics/unknown/unknown_60F7BC.4bpp");
-static const u8 gUnknown_0860F83C[] = INCBIN_U8("graphics/unknown/unknown_60F83C.4bpp");
-static const u8 gUnknown_0860F93C[] = INCBIN_U8("graphics/unknown/unknown_60F93C.4bpp");
-static const u8 gUnknown_0860FA3C[] = INCBIN_U8("graphics/unknown/unknown_60FA3C.4bpp");
-static const u8 gUnknown_0861023C[] = INCBIN_U8("graphics/unknown/unknown_61023C.bin");
-static const u8 gUnknown_0861033C[] = INCBIN_U8("graphics/unknown/unknown_61033C.4bpp");
-static const u16 gUnknown_0861039C[] = INCBIN_U16("graphics/unknown/unknown_61039C.gbapal");
-
-static const struct SpriteSheet gUnknown_086103BC[] =
-{
- {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65},
- {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66},
- {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67},
- {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D},
- {},
-};
-
-static const struct CompressedSpriteSheet gUnknown_086103E4[] =
-{
- {gUnknown_085B18AC, 0x800, TAG_TILE_64},
- {},
-};
-
-static const struct SpritePalette gUnknown_086103F4[] =
-{
- {gUnknown_0860F13C, TAG_PAL_BALL_GREY},
- {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED},
- {gUnknown_0860F17C, TAG_PAL_66},
- {gUnknown_0861039C, TAG_PAL_67},
- {},
-};
+static const u8 sRequiredMoveCounts[] = {3, 3, 3, 2, 2, 2, 2};
-u8 static (* const sSelect_MenuOptionFuncs[])(void) =
+static const u16 sMoves_TotalPreparation[] =
{
- [MENU_SUMMARY] = Select_OptionSummary,
- [MENU_RENT] /*Or Deselect*/ = Select_OptionRentDeselect,
- [MENU_OTHERS] = Select_OptionOthers
+ MOVE_SWORDS_DANCE, MOVE_GROWTH, MOVE_MEDITATE, MOVE_AGILITY, MOVE_DOUBLE_TEAM, MOVE_HARDEN,
+ MOVE_MINIMIZE, MOVE_WITHDRAW, MOVE_DEFENSE_CURL, MOVE_BARRIER, MOVE_FOCUS_ENERGY, MOVE_AMNESIA,
+ MOVE_ACID_ARMOR, MOVE_SHARPEN, MOVE_CONVERSION, MOVE_CONVERSION_2, MOVE_BELLY_DRUM, MOVE_PSYCH_UP,
+ MOVE_CHARGE, MOVE_SNATCH, MOVE_TAIL_GLOW, MOVE_COSMIC_POWER, MOVE_IRON_DEFENSE, MOVE_HOWL, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DRAGON_DANCE,
+ 0
};
-static const struct BgTemplate sSelect_BgTemplates[] =
+static const u16 sMoves_ImpossibleToPredict[] =
{
- {
- .bg = 0,
- .charBaseIndex = 0,
- .mapBaseIndex = 24,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0
- },
- {
- .bg = 1,
- .charBaseIndex = 1,
- .mapBaseIndex = 25,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 3,
- .baseTile = 0
- },
- {
- .bg = 3,
- .charBaseIndex = 2,
- .mapBaseIndex = 27,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 2,
- .baseTile = 0
- },
+ MOVE_MIMIC, MOVE_METRONOME, MOVE_MIRROR_MOVE, MOVE_TRANSFORM, MOVE_SUBSTITUTE, MOVE_SKETCH, MOVE_CURSE,
+ MOVE_PRESENT, MOVE_FOLLOW_ME, MOVE_TRICK, MOVE_ROLE_PLAY, MOVE_ASSIST, MOVE_SKILL_SWAP, MOVE_CAMOUFLAGE,
+ 0
};
-static const struct WindowTemplate sSelect_WindowTemplates[] =
+static const u16 sMoves_WeakeningTheFoe[] =
{
- {
- .bg = 0,
- .tilemapLeft = 0,
- .tilemapTop = 2,
- .width = 12,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x0001,
- },
- {
- .bg = 0,
- .tilemapLeft = 19,
- .tilemapTop = 2,
- .width = 11,
- .height = 2,
- .paletteNum = 14,
- .baseBlock = 0x0019,
- },
- {
- .bg = 0,
- .tilemapLeft = 0,
- .tilemapTop = 15,
- .width = 20,
- .height = 3,
- .paletteNum = 15,
- .baseBlock = 0x002f,
- },
- {
- .bg = 0,
- .tilemapLeft = 22,
- .tilemapTop = 14,
- .width = 8,
- .height = 6,
- .paletteNum = 15,
- .baseBlock = 0x006b,
- },
- {
- .bg = 0,
- .tilemapLeft = 22,
- .tilemapTop = 14,
- .width = 8,
- .height = 4,
- .paletteNum = 15,
- .baseBlock = 0x009b,
- },
- {
- .bg = 0,
- .tilemapLeft = 15,
- .tilemapTop = 0,
- .width = 15,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x00bb,
- },
- DUMMY_WIN_TEMPLATE,
+ MOVE_SAND_ATTACK, MOVE_TAIL_WHIP, MOVE_LEER, MOVE_GROWL, MOVE_STRING_SHOT, MOVE_SCREECH, MOVE_SMOKESCREEN, MOVE_KINESIS,
+ MOVE_FLASH, MOVE_COTTON_SPORE, MOVE_SPITE, MOVE_SCARY_FACE, MOVE_CHARM, MOVE_KNOCK_OFF, MOVE_SWEET_SCENT, MOVE_FEATHER_DANCE,
+ MOVE_FAKE_TEARS, MOVE_METAL_SOUND, MOVE_TICKLE,
+ 0
};
-static const u16 gUnknown_0861046C[] = INCBIN_U16("graphics/unknown/unknown_61046C.gbapal");
-
-static const u8 gUnknown_08610476[] = {0x00, 0x02, 0x00};
-static const u8 gUnknown_08610479[] = {0x00, 0x04, 0x00};
-
-static const struct OamData gUnknown_0861047C =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 2,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct OamData gUnknown_08610484 =
+static const u16 sMoves_HighRiskHighReturn[] =
{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 1,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
+ MOVE_GUILLOTINE, MOVE_HORN_DRILL, MOVE_DOUBLE_EDGE, MOVE_HYPER_BEAM, MOVE_COUNTER, MOVE_FISSURE,
+ MOVE_BIDE, MOVE_SELF_DESTRUCT, MOVE_SKY_ATTACK, MOVE_EXPLOSION, MOVE_FLAIL, MOVE_REVERSAL, MOVE_DESTINY_BOND,
+ MOVE_PERISH_SONG, MOVE_PAIN_SPLIT, MOVE_MIRROR_COAT, MOVE_MEMENTO, MOVE_GRUDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH,
+ MOVE_BLAST_BURN, MOVE_HYDRO_CANNON, MOVE_OVERHEAT, MOVE_FRENZY_PLANT, MOVE_PSYCHO_BOOST, MOVE_VOLT_TACKLE,
+ 0
};
-static const struct OamData gUnknown_0861048C =
+static const u16 sMoves_Endurance[] =
{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 1,
- .x = 0,
- .matrixNum = 0,
- .size = 2,
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0,
+ MOVE_MIST, MOVE_RECOVER, MOVE_LIGHT_SCREEN, MOVE_HAZE, MOVE_REFLECT, MOVE_SOFT_BOILED, MOVE_REST, MOVE_PROTECT,
+ MOVE_DETECT, MOVE_ENDURE, MOVE_MILK_DRINK, MOVE_HEAL_BELL, MOVE_SAFEGUARD, MOVE_BATON_PASS, MOVE_MORNING_SUN,
+ MOVE_SYNTHESIS, MOVE_MOONLIGHT, MOVE_SWALLOW, MOVE_WISH, MOVE_INGRAIN, MOVE_MAGIC_COAT, MOVE_RECYCLE, MOVE_REFRESH,
+ MOVE_MUD_SPORT, MOVE_SLACK_OFF, MOVE_AROMATHERAPY, MOVE_WATER_SPORT,
+ 0
};
-static const struct OamData gUnknown_08610494 =
+static const u16 sMoves_SlowAndSteady[] =
{
- .y = 0,
- .affineMode = 3,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 0,
- .paletteNum = 0,
- .affineParam = 1,
+ MOVE_SING, MOVE_SUPERSONIC, MOVE_DISABLE, MOVE_LEECH_SEED, MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER,
+ MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_HYPNOSIS, MOVE_CONFUSE_RAY, MOVE_GLARE, MOVE_POISON_GAS, MOVE_LOVELY_KISS, MOVE_SPORE,
+ MOVE_SPIDER_WEB, MOVE_SWEET_KISS, MOVE_SPIKES, MOVE_SWAGGER, MOVE_MEAN_LOOK, MOVE_ATTRACT, MOVE_ENCORE, MOVE_TORMENT,
+ MOVE_FLATTER, MOVE_WILL_O_WISP, MOVE_TAUNT, MOVE_YAWN, MOVE_IMPRISON, MOVE_SNATCH, MOVE_TEETER_DANCE, MOVE_GRASS_WHISTLE, MOVE_BLOCK,
+ 0
};
-static const union AnimCmd gUnknown_0861049C[] =
+static const u16 sMoves_DependsOnTheBattlesFlow[] =
{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
+ MOVE_SANDSTORM, MOVE_RAIN_DANCE, MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_WEATHER_BALL,
+ 0
};
-static const union AnimCmd gUnknown_086104A4[] =
+static const u16 *const sMoveStyles[] =
{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
+ sMoves_TotalPreparation,
+ sMoves_SlowAndSteady,
+ sMoves_Endurance,
+ sMoves_HighRiskHighReturn,
+ sMoves_WeakeningTheFoe,
+ sMoves_ImpossibleToPredict,
+ sMoves_DependsOnTheBattlesFlow,
};
-static const union AnimCmd gUnknown_086104AC[] =
+static void (* const gUnknown_08612120[])(void) =
{
- ANIMCMD_FRAME(0, 30),
- ANIMCMD_END,
+ sub_81A5E94,
+ sub_81A5FA8,
+ sub_81A6054,
+ sub_81A613C,
+ nullsub_75,
+ nullsub_123,
+ sub_81A6188,
+ sub_81A6198,
+ sub_81A61A4,
+ sub_81A63CC,
+ sub_81A64C4,
+ sub_81A63B8,
+ sub_81A61B0,
+ sub_81A67EC,
+ sub_81A6A08,
+ sub_81A6AEC,
+ sub_81A6C1C,
};
-static const union AnimCmd gUnknown_086104B4[] =
+static const u32 gUnknown_08612164[][2] =
{
- ANIMCMD_FRAME(16, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(32, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(16, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(32, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(0, 32),
- ANIMCMD_FRAME(16, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(32, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(16, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(32, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_END,
+ {0x100, 0x200},
+ {0x1000000, 0x2000000},
};
-static const union AnimCmd * const gUnknown_086104FC[] =
+static const u32 gUnknown_08612174[][2] =
{
- gUnknown_0861049C,
+ {0xfffffeff, 0xfffffdff},
+ {0xfeffffff, 0xfdffffff},
};
-static const union AnimCmd * const gUnknown_08610500[] =
+static const u8 sFixedIVTable[][2] =
{
- gUnknown_086104A4,
+ {3, 6},
+ {6, 9},
+ {9, 12},
+ {12, 15},
+ {15, 18},
+ {21, 31},
+ {31, 31},
+ {31, 31},
};
-static const union AnimCmd * const gUnknown_08610504[] =
+static const u16 sMonsToChooseFrom[][2] =
{
- gUnknown_086104AC,
- gUnknown_086104B4,
+ {0x006e, 0x00c7},
+ {0x00a2, 0x010a},
+ {0x010b, 0x0173},
+ {0x0174, 0x01d3},
+ {0x01d4, 0x0233},
+ {0x0234, 0x0293},
+ {0x0294, 0x02f3},
+ {0x0174, 0x0351},
+ {0x0174, 0x01d3},
+ {0x01d4, 0x0233},
+ {0x0234, 0x0293},
+ {0x0294, 0x02f3},
+ {0x0174, 0x0371},
+ {0x0174, 0x0371},
+ {0x0174, 0x0371},
+ {0x0174, 0x0371},
};
-static const union AffineAnimCmd gUnknown_0861050C[] =
-{
- AFFINEANIMCMD_FRAME(5, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(16, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(32, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(64, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(128, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(256, 5, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd gUnknown_0861056C[] =
-{
- AFFINEANIMCMD_FRAME(128, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(64, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(32, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(16, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(5, 5, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd gUnknown_086105BC[] =
-{
- AFFINEANIMCMD_FRAME(256, 256, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd * const gUnknown_086105CC[] =
-{
- gUnknown_0861050C,
- gUnknown_0861056C,
- gUnknown_086105BC,
-};
-
-static const struct SpriteTemplate gUnknown_086105D8 =
-{
- .tileTag = TAG_TILE_64,
- .paletteTag = TAG_PAL_BALL_GREY,
- .oam = &gUnknown_0861047C,
- .anims = gUnknown_08610504,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_819A44C
-};
-
-static const struct SpriteTemplate gUnknown_086105F0 =
-{
- .tileTag = TAG_TILE_65,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_08610484,
- .anims = gUnknown_086104FC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_08610608 =
-{
- .tileTag = TAG_TILE_66,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_0861048C,
- .anims = gUnknown_086104FC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_08610620 =
-{
- .tileTag = TAG_TILE_67,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_0861048C,
- .anims = gUnknown_086104FC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_08610638 =
-{
- .tileTag = TAG_TILE_6D,
- .paletteTag = TAG_PAL_67,
- .oam = &gUnknown_08610494,
- .anims = gUnknown_08610500,
- .images = NULL,
- .affineAnims = gUnknown_086105CC,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteSheet gUnknown_08610650[] =
-{
- {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65},
- {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66},
- {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67},
- {gUnknown_0860F63C, sizeof(gUnknown_0860F63C), TAG_TILE_68},
- {gUnknown_0860F6BC, sizeof(gUnknown_0860F6BC), TAG_TILE_69},
- {gUnknown_0860F7BC, 0x100, TAG_TILE_6A},
- {gUnknown_0860F83C, sizeof(gUnknown_0860F83C), TAG_TILE_6B},
- {gUnknown_0860F93C, sizeof(gUnknown_0860F93C), TAG_TILE_6C},
- {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D},
- {},
-};
-
-static const struct CompressedSpriteSheet gUnknown_086106A0[] =
-{
- {gUnknown_085B18AC, 0x800, TAG_TILE_64},
- {},
-};
-
-static const struct SpritePalette gUnknown_086106B0[] =
-{
- {gUnknown_0860F13C, TAG_PAL_BALL_GREY},
- {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED},
- {gUnknown_0860F17C, TAG_PAL_66},
- {gUnknown_0861039C, TAG_PAL_67},
- {},
-};
-
-static const struct OamData gUnknown_086106D8 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 2,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct OamData gUnknown_086106E0 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 1,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct OamData gUnknown_086106E8 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 1,
- .x = 0,
- .matrixNum = 0,
- .size = 2,
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct OamData gUnknown_086106F0 =
-{
- .y = 0,
- .affineMode = 3,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 0,
- .paletteNum = 0,
- .affineParam = 1,
-};
-
-static const union AnimCmd gUnknown_086106F8[] =
-{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
-};
-
-static const union AnimCmd gUnknown_08610700[] =
-{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
-};
-
-static const union AnimCmd gUnknown_08610708[] =
-{
- ANIMCMD_FRAME(0, 30),
- ANIMCMD_END,
-};
-
-static const union AnimCmd gUnknown_08610710[] =
-{
- ANIMCMD_FRAME(16, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(32, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(16, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(32, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(0, 32),
- ANIMCMD_FRAME(16, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(32, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(16, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(32, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_END,
-};
-
-static const union AnimCmd * const gUnknown_08610758[] =
-{
- gUnknown_086106F8,
-};
-
-static const union AnimCmd * const gUnknown_0861075C[] =
-{
- gUnknown_08610700,
-};
-
-static const union AnimCmd * const gUnknown_08610760[] =
-{
- gUnknown_08610708,
- gUnknown_08610710,
-};
-
-static const union AffineAnimCmd gUnknown_08610768[] =
-{
- AFFINEANIMCMD_FRAME(5, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(16, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(32, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(64, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(128, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(256, 5, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd gUnknown_086107C8[] =
-{
- AFFINEANIMCMD_FRAME(128, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(64, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(32, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(16, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(5, 5, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd gUnknown_08610818[] =
-{
- AFFINEANIMCMD_FRAME(256, 256, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd * const gUnknown_08610828[] =
-{
- gUnknown_08610768,
- gUnknown_086107C8,
- gUnknown_08610818,
-};
-
-static const struct SpriteTemplate gUnknown_08610834 =
-{
- .tileTag = TAG_TILE_64,
- .paletteTag = TAG_PAL_BALL_GREY,
- .oam = &gUnknown_086106D8,
- .anims = gUnknown_08610760,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_819A44C
-};
-
-static const struct SpriteTemplate gUnknown_0861084C =
-{
- .tileTag = TAG_TILE_65,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_086106E0,
- .anims = gUnknown_08610758,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_08610864 =
-{
- .tileTag = TAG_TILE_66,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_086106E8,
- .anims = gUnknown_08610758,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_0861087C =
-{
- .tileTag = TAG_TILE_67,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_086106E8,
- .anims = gUnknown_08610758,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_08610894 =
-{
- .tileTag = TAG_TILE_6D,
- .paletteTag = TAG_PAL_67,
- .oam = &gUnknown_086106F0,
- .anims = gUnknown_0861075C,
- .images = NULL,
- .affineAnims = gUnknown_08610828,
- .callback = SpriteCallbackDummy
-};
-
-void static (* const sSwap_MenuOptionFuncs[])(u8 taskId) =
-{
- sub_819F114,
- sub_819F0CC,
- sub_819F134,
-};
-
-static const struct BgTemplate sSwap_BgTemplates[4] =
-{
- {
- .bg = 0,
- .charBaseIndex = 0,
- .mapBaseIndex = 24,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 1,
- .baseTile = 0
- },
- {
- .bg = 1,
- .charBaseIndex = 1,
- .mapBaseIndex = 25,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 3,
- .baseTile = 0
- },
- {
- .bg = 2,
- .charBaseIndex = 2,
- .mapBaseIndex = 26,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0
- },
- {
- .bg = 3,
- .charBaseIndex = 2,
- .mapBaseIndex = 27,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 2,
- .baseTile = 0
- },
-};
-
-static const struct WindowTemplate sSwap_WindowTemplates[] =
-{
- {
- .bg = 0,
- .tilemapLeft = 0,
- .tilemapTop = 2,
- .width = 12,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x0001,
- },
- {
- .bg = 2,
- .tilemapLeft = 19,
- .tilemapTop = 2,
- .width = 11,
- .height = 2,
- .paletteNum = 14,
- .baseBlock = 0x0019,
- },
- {
- .bg = 0,
- .tilemapLeft = 0,
- .tilemapTop = 15,
- .width = 20,
- .height = 3,
- .paletteNum = 15,
- .baseBlock = 0x002f,
- },
- {
- .bg = 0,
- .tilemapLeft = 21,
- .tilemapTop = 14,
- .width = 9,
- .height = 6,
- .paletteNum = 15,
- .baseBlock = 0x006b,
- },
- {
- .bg = 0,
- .tilemapLeft = 22,
- .tilemapTop = 14,
- .width = 8,
- .height = 4,
- .paletteNum = 15,
- .baseBlock = 0x00a1,
- },
- {
- .bg = 2,
- .tilemapLeft = 21,
- .tilemapTop = 15,
- .width = 9,
- .height = 5,
- .paletteNum = 14,
- .baseBlock = 0x006b,
- },
- {
- .bg = 2,
- .tilemapLeft = 10,
- .tilemapTop = 2,
- .width = 4,
- .height = 2,
- .paletteNum = 14,
- .baseBlock = 0x00c1,
- },
- {
- .bg = 0,
- .tilemapLeft = 19,
- .tilemapTop = 2,
- .width = 11,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x00c9,
- },
- {
- .bg = 0,
- .tilemapLeft = 15,
- .tilemapTop = 0,
- .width = 15,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x00df,
- },
- DUMMY_WIN_TEMPLATE,
-};
-
-static const u16 gUnknown_08610918[] = {RGB_BLACK, RGB_BLACK, RGB_WHITE, RGB_BLACK, RGB_RED}; // Palette.
-static const u8 gUnknown_08610922[] = {0x0, 0x02, 0x0};
-static const u8 gUnknown_08610925[] = {0x0, 0x04, 0x0};
-
-static const struct SwapActionIdAndFunc sSwap_PlayerScreenActions[] =
+// code
+void CallBattleFactoryFunction(void)
{
- {1, Swap_ActionMon},
- {1, Swap_ActionMon},
- {1, Swap_ActionMon},
- {3, Swap_ActionCancel},
-};
+ gUnknown_08612120[gSpecialVar_0x8004]();
+}
-static const struct SwapActionIdAndFunc sSwap_EnemyScreenActions[] =
+static void sub_81A5E94(void)
{
- {1, Swap_ActionMon},
- {1, Swap_ActionMon},
- {1, Swap_ActionMon},
- {2, Swap_ActionPkmnForSwap},
- {3, Swap_ActionCancel},
-};
-
-// gfx
-extern const u8 gFrontierFactorySelectMenu_Gfx[];
-extern const u8 gFrontierFactorySelectMenu_Tilemap[];
-extern const u16 gFrontierFactorySelectMenu_Pal[];
-
-// text
-extern const u8 gText_RentalPkmn2[];
-extern const u8 gText_SelectFirstPkmn[];
-extern const u8 gText_SelectSecondPkmn[];
-extern const u8 gText_SelectThirdPkmn[];
-extern const u8 gText_TheseThreePkmnOkay[];
-extern const u8 gText_CantSelectSamePkmn[];
-extern const u8 gText_Summary[];
-extern const u8 gText_Rechoose[];
-extern const u8 gText_Deselect[];
-extern const u8 gText_Rent[];
-extern const u8 gText_Others2[];
-extern const u8 gText_Yes2[];
-extern const u8 gText_Yes3[];
-extern const u8 gText_No2[];
-extern const u8 gText_No3[];
-extern const u8 gText_QuitSwapping[];
-extern const u8 gText_AcceptThisPkmn[];
-extern const u8 gText_SelectPkmnToAccept[];
-extern const u8 gText_SelectPkmnToSwap[];
-extern const u8 gText_PkmnSwap[];
-extern const u8 gText_Swap[];
-extern const u8 gText_Summary2[];
-extern const u8 gText_PkmnForSwap[];
-extern const u8 gText_SamePkmnInPartyAlready[];
-extern const u8 gText_Cancel3[];
+ u8 i;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
-// code
-static void sub_819A44C(struct Sprite *sprite)
-{
- if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED))
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_b = 0;
+ if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_08612164[battleMode][lvlMode]))
{
- if (sprite->animEnded)
- {
- if (sprite->data[0] != 0)
- {
- sprite->data[0]--;
- }
- else if (Random() % 5 == 0)
- {
- StartSpriteAnim(sprite, 0);
- sprite->data[0] = 32;
- }
- else
- {
- StartSpriteAnim(sprite, 1);
- }
- }
- else
- {
- StartSpriteAnimIfDifferent(sprite, 1);
- }
- }
- else
- {
- StartSpriteAnimIfDifferent(sprite, 0);
+ gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = 0;
+ gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode] = 0;
}
-}
-
-static void Select_CB2(void)
-{
- AnimateSprites();
- BuildOamBuffer();
- RunTextPrinters();
- UpdatePaletteFade();
- RunTasks();
-}
-static void Select_VblankCb(void)
-{
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
-}
+ gUnknown_03001288 = 0;
+ for (i = 0; i < 6; i++)
+ gSaveBlock2Ptr->frontier.field_E70[i].monId |= 0xFFFF;
+ for (i = 0; i < 3; i++)
+ gUnknown_03006298[i] |= 0xFFFF;
-void DoBattleFactorySelectScreen(void)
-{
- sFactorySelectScreen = NULL;
- SetMainCallback2(CB2_InitSelectScreen);
+ saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ gTrainerBattleOpponent_A = 0;
}
-static void CB2_InitSelectScreen(void)
+static void sub_81A5FA8(void)
{
- u8 taskId;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- switch (gMain.state)
+ switch (gSpecialVar_0x8005)
{
- case 0:
- if (sFactorySelectMons != NULL)
- FREE_AND_SET_NULL(sFactorySelectMons);
- SetHBlankCallback(NULL);
- SetVBlankCallback(NULL);
- CpuFill32(0, (void *)VRAM, VRAM_SIZE);
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sSelect_BgTemplates, ARRAY_COUNT(sSelect_BgTemplates));
- InitWindows(sSelect_WindowTemplates);
- DeactivateAllTextPrinters();
- gMain.state++;
- break;
case 1:
- sSelectMenuTilesetBuffer = Alloc(0x440);
- sSelectMonCardBgTilesetBuffer = AllocZeroed(0x440);
- sSelectMenuTilemapBuffer = Alloc(0x800);
- sSelectMonCardBgTilemapBuffer = AllocZeroed(0x800);
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
- ChangeBgX(1, 0, 0);
- ChangeBgY(1, 0, 0);
- ChangeBgX(3, 0, 0);
- ChangeBgY(3, 0, 0);
- SetGpuReg(REG_OFFSET_BLDCNT, 0);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0);
- SetGpuReg(REG_OFFSET_BLDY, 0);
- SetGpuReg(REG_OFFSET_MOSAIC, 0);
- SetGpuReg(REG_OFFSET_WIN0H, 0);
- SetGpuReg(REG_OFFSET_WIN0V, 0);
- SetGpuReg(REG_OFFSET_WIN1H, 0);
- SetGpuReg(REG_OFFSET_WIN1V, 0);
- SetGpuReg(REG_OFFSET_WININ, 0);
- SetGpuReg(REG_OFFSET_WINOUT, 0);
- gMain.state++;
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode];
break;
case 2:
- ResetPaletteFade();
- ResetSpriteData();
- ResetTasks();
- FreeAllSpritePalettes();
- CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSelectMenuTilesetBuffer, 0x440);
- CpuCopy16(gUnknown_0861033C, sSelectMonCardBgTilesetBuffer, 0x60);
- LoadBgTiles(1, sSelectMenuTilesetBuffer, 0x440, 0);
- LoadBgTiles(3, sSelectMonCardBgTilesetBuffer, 0x60, 0);
- CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, 0x800);
- LoadBgTilemap(1, sSelectMenuTilemapBuffer, 0x800, 0);
- LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40);
- LoadPalette(gUnknown_0861046C, 0xF0, 8);
- LoadPalette(gUnknown_0861046C, 0xE0, 10);
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- gPlttBufferUnfaded[228] = sFactorySelectScreen->unk2A4;
- LoadPalette(gUnknown_0861039C, 0x20, 4);
- gMain.state++;
+ gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_08612164[battleMode][lvlMode]) != 0);
break;
case 3:
- SetBgTilemapBuffer(3, sSelectMonCardBgTilemapBuffer);
- CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8);
- CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 2, 4, 8, 8);
- CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 20, 4, 8, 8);
- CopyBgTilemapBufferToVram(3);
- gMain.state++;
- break;
- case 4:
- LoadSpritePalettes(gUnknown_086103F4);
- LoadSpriteSheets(gUnknown_086103BC);
- LoadCompressedObjectPic(gUnknown_086103E4);
- ShowBg(0);
- ShowBg(1);
- SetVBlankCallback(Select_VblankCb);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
- SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP);
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- {
- Select_SetWinRegs(88, 152, 32, 96);
- ShowBg(3);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
- }
- else
- {
- HideBg(3);
- }
- gMain.state++;
- break;
- case 5:
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- sFactorySelectScreen->cursorPos = gUnknown_0203CF20;
- Select_InitMonsData();
- Select_InitAllSprites();
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- Select_ShowSummaryMonSprite();
- gMain.state++;
- break;
- case 6:
- Select_PrintSelectMonString();
- PutWindowTilemap(2);
- gMain.state++;
- break;
- case 7:
- Select_PrintMonCategory();
- PutWindowTilemap(5);
- gMain.state++;
- break;
- case 8:
- Select_PrintMonSpecies();
- PutWindowTilemap(1);
- gMain.state++;
- break;
- case 9:
- Select_PrintRentalPkmnString();
- PutWindowTilemap(0);
- gMain.state++;
- break;
- case 10:
- sFactorySelectScreen->fadeSpeciesNameTaskId = CreateTask(Task_SelectFadeSpeciesName, 0);
- if (!sFactorySelectScreen->fromSummaryScreen)
- {
- gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 0;
- taskId = CreateTask(Task_HandleSelectionScreenChooseMons, 0);
- gTasks[taskId].data[0] = 0;
- }
- else
- {
- gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 1;
- sFactorySelectScreen->unk2A2 = FALSE;
- taskId = CreateTask(Task_HandleSelectionScreenMenu, 0);
- gTasks[taskId].data[0] = 13;
- }
- SetMainCallback2(Select_CB2);
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode];
break;
}
}
-static void Select_InitMonsData(void)
-{
- u8 i;
-
- if (sFactorySelectScreen != NULL)
- return;
-
- sFactorySelectScreen = AllocZeroed(sizeof(*sFactorySelectScreen));
- sFactorySelectScreen->cursorPos = 0;
- sFactorySelectScreen->selectingMonsState = 1;
- sFactorySelectScreen->fromSummaryScreen = FALSE;
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- sFactorySelectScreen->mons[i].selectedId = 0;
-
- if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
- CreateFrontierFactorySelectableMons(0);
- else
- CreateTentFactorySelectableMons(0);
-}
-
-static void Select_InitAllSprites(void)
-{
- u8 i, cursorPos;
- s16 x;
-
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- {
- sFactorySelectScreen->mons[i].spriteId = CreateSprite(&gUnknown_086105D8, (35 * i) + 32, 64, 1);
- gSprites[sFactorySelectScreen->mons[i].spriteId].data[0] = 0;
- Select_SetBallSpritePaletteNum(i);
- }
- cursorPos = sFactorySelectScreen->cursorPos;
- x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x;
- sFactorySelectScreen->cursorSpriteId = CreateSprite(&gUnknown_086105F0, x, 88, 0);
- sFactorySelectScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610608, 176, 112, 0);
- sFactorySelectScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_08610620, 176, 144, 0);
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecY = 0;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecY = 0;
-}
-
-static void Select_DestroyAllSprites(void)
-{
- u8 i;
-
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- DestroySprite(&gSprites[sFactorySelectScreen->mons[i].spriteId]);
-
- DestroySprite(&gSprites[sFactorySelectScreen->cursorSpriteId]);
- DestroySprite(&gSprites[sFactorySelectScreen->menuCursor1SpriteId]);
- DestroySprite(&gSprites[sFactorySelectScreen->menuCursor2SpriteId]);
-}
-
-static void Select_UpdateBallCursorPosition(s8 direction)
-{
- u8 cursorPos;
- if (direction > 0) // Move cursor right.
- {
- if (sFactorySelectScreen->cursorPos != SELECTABLE_MONS_COUNT - 1)
- sFactorySelectScreen->cursorPos++;
- else
- sFactorySelectScreen->cursorPos = 0;
- }
- else // Move cursor left.
- {
- if (sFactorySelectScreen->cursorPos != 0)
- sFactorySelectScreen->cursorPos--;
- else
- sFactorySelectScreen->cursorPos = SELECTABLE_MONS_COUNT - 1;
- }
-
- cursorPos = sFactorySelectScreen->cursorPos;
- gSprites[sFactorySelectScreen->cursorSpriteId].pos1.x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x;
-}
-
-static void Select_UpdateMenuCursorPosition(s8 direction)
-{
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySelectScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1)
- sFactorySelectScreen->menuCursorPos++;
- else
- sFactorySelectScreen->menuCursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySelectScreen->menuCursorPos != 0)
- sFactorySelectScreen->menuCursorPos--;
- else
- sFactorySelectScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1;
- }
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
-}
-
-static void Select_UpdateYesNoCursorPosition(s8 direction)
-{
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySelectScreen->yesNoCursorPos != 1)
- sFactorySelectScreen->yesNoCursorPos++;
- else
- sFactorySelectScreen->yesNoCursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySelectScreen->yesNoCursorPos != 0)
- sFactorySelectScreen->yesNoCursorPos--;
- else
- sFactorySelectScreen->yesNoCursorPos = 1;
- }
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112;
-}
-
-static void Select_HandleMonSelectionChange(void)
-{
- u8 i, paletteNum;
- u8 cursorPos = sFactorySelectScreen->cursorPos;
- if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon.
- {
- paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
- if (sFactorySelectScreen->selectingMonsState == 3 && sFactorySelectScreen->mons[cursorPos].selectedId == 1)
- {
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- {
- if (sFactorySelectScreen->mons[i].selectedId == 2)
- break;
- }
- if (i == SELECTABLE_MONS_COUNT)
- return;
- else
- sFactorySelectScreen->mons[i].selectedId = 1;
- }
- sFactorySelectScreen->mons[cursorPos].selectedId = 0;
- sFactorySelectScreen->selectingMonsState--;
- }
- else // Select a mon.
- {
- paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
- sFactorySelectScreen->mons[cursorPos].selectedId = sFactorySelectScreen->selectingMonsState;
- sFactorySelectScreen->selectingMonsState++;
- }
-
- gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].oam.paletteNum = paletteNum;
-}
-
-static void Select_SetBallSpritePaletteNum(u8 id)
-{
- u8 palNum;
-
- if (sFactorySelectScreen->mons[id].selectedId)
- palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
- else
- palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
-
- gSprites[sFactorySelectScreen->mons[id].spriteId].oam.paletteNum = palNum;
-}
-
-static void Task_FromSelectScreenToSummaryScreen(u8 taskId)
+static void sub_81A6054(void)
{
- u8 i;
- u8 currMonId;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- switch (gTasks[taskId].data[0])
+ switch (gSpecialVar_0x8005)
{
- case 6:
- gPlttBufferUnfaded[228] = gPlttBufferFaded[228];
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- gTasks[taskId].data[0] = 7;
- break;
- case 7:
- if (!gPaletteFade.active)
- {
- DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
- sub_819F444(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0);
- Select_DestroyAllSprites();
- FREE_AND_SET_NULL(sSelectMenuTilesetBuffer);
- FREE_AND_SET_NULL(sSelectMonCardBgTilesetBuffer);
- FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
- FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer);
- FreeAllWindowBuffers();
- gTasks[taskId].data[0] = 8;
- }
- break;
- case 8:
- sFactorySelectScreen->unk2A4 = gPlttBufferUnfaded[228];
- DestroyTask(taskId);
- sFactorySelectScreen->fromSummaryScreen = TRUE;
- currMonId = sFactorySelectScreen->cursorPos;
- sFactorySelectMons = AllocZeroed(sizeof(struct Pokemon) * SELECTABLE_MONS_COUNT);
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- sFactorySelectMons[i] = sFactorySelectScreen->mons[i].monData;
- ShowPokemonSummaryScreen(1, sFactorySelectMons, currMonId, SELECTABLE_MONS_COUNT - 1, CB2_InitSelectScreen);
+ case 1:
+ gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006;
break;
- }
-}
-
-static void Task_CloseSelectionScreen(u8 taskId)
-{
- if (sFactorySelectScreen->unk2A0 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- gTasks[taskId].data[0]++;
- break;
- case 1:
- if (!UpdatePaletteFade())
- {
- Select_CopyMonsToPlayerParty();
- DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
- Select_DestroyAllSprites();
- FREE_AND_SET_NULL(sSelectMenuTilesetBuffer);
- FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
- FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer);
- FREE_AND_SET_NULL(sFactorySelectScreen);
- FreeAllWindowBuffers();
- SetMainCallback2(CB2_ReturnToFieldContinueScript);
- DestroyTask(taskId);
- }
- break;
- }
- }
-}
-
-static void Task_HandleSelectionScreenYesNo(u8 taskId)
-{
- if (sFactorySelectScreen->unk2A0 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 10:
- sub_819C4B4();
- gTasks[taskId].data[0] = 4;
- break;
- case 4:
- Select_ShowYesNoOptions();
- gTasks[taskId].data[0] = 5;
- break;
- case 5:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- if (sFactorySelectScreen->yesNoCursorPos == 0)
- {
- sub_819C568();
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = Task_CloseSelectionScreen;
- }
- else
- {
- sub_819B958(4);
- sub_819BC9C();
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_819B958(4);
- sub_819BC9C();
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- PlaySE(SE_SELECT);
- Select_UpdateYesNoCursorPosition(-1);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- PlaySE(SE_SELECT);
- Select_UpdateYesNoCursorPosition(1);
- }
- break;
- }
- }
-}
-
-static void Task_HandleSelectionScreenMenu(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
case 2:
- if (!sFactorySelectScreen->fromSummaryScreen)
- sub_819F2B4(&sFactorySelectScreen->unk294[1].field1, &sFactorySelectScreen->unk2A0, FALSE);
- gTasks[taskId].data[0] = 9;
- break;
- case 9:
- if (sFactorySelectScreen->unk2A0 != TRUE)
- {
- Select_ShowMenuOptions();
- sFactorySelectScreen->fromSummaryScreen = FALSE;
- gTasks[taskId].data[0] = 3;
- }
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= gUnknown_08612164[battleMode][lvlMode];
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= gUnknown_08612174[battleMode][lvlMode];
break;
case 3:
- if (gMain.newKeys & A_BUTTON)
+ if (gUnknown_03001288 == 1)
{
- u8 retVal;
- PlaySE(SE_SELECT);
- retVal = Select_RunMenuOptionFunc();
- if (retVal == 1)
- {
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- else if (retVal == 2)
- {
- gTasks[taskId].data[0] = 10;
- gTasks[taskId].func = Task_HandleSelectionScreenYesNo;
- }
- else if (retVal == 3)
- {
- gTasks[taskId].data[0] = 11;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- else
- {
- gTasks[taskId].data[0] = 6;
- gTasks[taskId].func = Task_FromSelectScreenToSummaryScreen;
- }
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
- sub_819B958(3);
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- PlaySE(SE_SELECT);
- Select_UpdateMenuCursorPosition(-1);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- PlaySE(SE_SELECT);
- Select_UpdateMenuCursorPosition(1);
+ gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode] = gSpecialVar_0x8006;
+ gUnknown_03001288 = 0;
}
break;
- case 12:
- if (!gPaletteFade.active)
- {
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- {
- gPlttBufferFaded[228] = sFactorySelectScreen->unk2A4;
- gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244];
- }
- sFactorySelectScreen->fromSummaryScreen = FALSE;
- gTasks[taskId].data[0] = 3;
- }
- break;
- case 13:
- Select_ShowMenuOptions();
- gTasks[taskId].data[0] = 12;
- break;
}
}
-static void Task_HandleSelectionScreenChooseMons(u8 taskId)
+static void sub_81A613C(void)
{
- if (sFactorySelectScreen->unk2A0 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 0:
- if (!gPaletteFade.active)
- {
- gTasks[taskId].data[0] = 1;
- sFactorySelectScreen->unk2A2 = TRUE;
- }
- break;
- case 1:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- sFactorySelectScreen->unk2A2 = FALSE;
- gTasks[taskId].data[0] = 2;
- gTasks[taskId].func = Task_HandleSelectionScreenMenu;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
- {
- PlaySE(SE_SELECT);
- Select_UpdateBallCursorPosition(-1);
- Select_PrintMonCategory();
- Select_PrintMonSpecies();
- }
- else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
- {
- PlaySE(SE_SELECT);
- Select_UpdateBallCursorPosition(1);
- Select_PrintMonCategory();
- Select_PrintMonSpecies();
- }
- break;
- case 11:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
- Select_PrintSelectMonString();
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- }
- break;
- }
- }
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = 1;
+ sub_81A4C30();
}
-static void CreateFrontierFactorySelectableMons(u8 firstMonId)
+static void nullsub_75(void)
{
- u8 i, j = 0;
- u8 ivs = 0;
- u8 level = 0;
- u8 happiness = 0;
- u32 otId = 0;
- u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
- u8 var_2C = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
- u8 var_28 = 0;
-
- gFacilityTrainerMons = gBattleFrontierMons;
- if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
- level = 100;
- else
- level = 50;
-
- var_28 = sub_81A6F70(battleMode, lvlMode);
- otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- {
- u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
- sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
- if (i < var_28)
- ivs = sub_81A6CA8(var_2C + 1, 0);
- else
- ivs = sub_81A6CA8(var_2C, 0);
- CreateMonWithEVSpreadPersonalityOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
- gFacilityTrainerMons[monSetId].species,
- level,
- gFacilityTrainerMons[monSetId].nature,
- ivs,
- gFacilityTrainerMons[monSetId].evSpread,
- otId);
- happiness = 0;
- for (j = 0; j < 4; j++)
- SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
- }
}
-static void CreateTentFactorySelectableMons(u8 firstMonId)
+static void nullsub_123(void)
{
- u8 i, j;
- u8 ivs = 0;
- u8 level = 30;
- u8 happiness = 0;
- u32 otId = 0;
-
- gFacilityTrainerMons = gSlateportBattleTentMons;
- otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- {
- u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
- sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
- CreateMonWithEVSpreadPersonalityOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
- gFacilityTrainerMons[monSetId].species,
- level,
- gFacilityTrainerMons[monSetId].nature,
- ivs,
- gFacilityTrainerMons[monSetId].evSpread,
- otId);
- happiness = 0;
- for (j = 0; j < 4; j++)
- SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
- }
}
-static void Select_CopyMonsToPlayerParty(void)
+static void sub_81A6188(void)
{
- u8 i, j;
-
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
- {
- if (sFactorySelectScreen->mons[j].selectedId == i + 1)
- {
- gPlayerParty[i] = sFactorySelectScreen->mons[j].monData;
- gSaveBlock2Ptr->frontier.field_E70[i].monId = sFactorySelectScreen->mons[j].monSetId;
- gSaveBlock2Ptr->frontier.field_E70[i].personality = GetMonData(&gPlayerParty[i].box, MON_DATA_PERSONALITY, NULL);
- gSaveBlock2Ptr->frontier.field_E70[i].abilityBit = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ALT_ABILITY, NULL);
- gSaveBlock2Ptr->frontier.field_E70[i].ivs = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ATK_IV, NULL);
- break;
- }
- }
- }
- CalculatePlayerPartyCount();
+ ZeroPlayerPartyMons();
+ DoBattleFactorySelectScreen();
}
-static void Select_ShowMenuOptions(void)
+static void sub_81A6198(void)
{
- if (!sFactorySelectScreen->fromSummaryScreen)
- sFactorySelectScreen->menuCursorPos = 0;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176;
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE;
-
- Select_PrintMenuOptions();
-}
-
-static void Select_ShowYesNoOptions(void)
-{
- sFactorySelectScreen->yesNoCursorPos = 0;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176;
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = 112;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = 112;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE;
-
- Select_PrintYesNoOptions();
-}
-
-static void sub_819B958(u8 windowId)
-{
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
- FillWindowPixelBuffer(windowId, 0);
- CopyWindowToVram(windowId, 2);
- ClearWindowTilemap(windowId);
-}
-
-static void Select_PrintRentalPkmnString(void)
-{
- FillWindowPixelBuffer(0, 0);
- AddTextPrinterParameterized(0, 1, gText_RentalPkmn2, 2, 1, 0, NULL);
- CopyWindowToVram(0, 3);
-}
-
-static void Select_PrintMonSpecies(void)
-{
- u16 species;
- u8 x;
- u8 monId = sFactorySelectScreen->cursorPos;
-
- FillWindowPixelBuffer(1, 0);
- species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL);
- StringCopy(gStringVar4, gSpeciesNames[species]);
- x = GetStringRightAlignXOffset(1, gStringVar4, 86);
- AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610479, 0, gStringVar4);
- CopyWindowToVram(1, 2);
+ DoBattleFactorySwapScreen();
}
-static void Select_PrintSelectMonString(void)
+static void sub_81A61A4(void)
{
- const u8 *str = NULL;
-
- FillWindowPixelBuffer(2, 0);
- if (sFactorySelectScreen->selectingMonsState == 1)
- str = gText_SelectFirstPkmn;
- else if (sFactorySelectScreen->selectingMonsState == 2)
- str = gText_SelectSecondPkmn;
- else if (sFactorySelectScreen->selectingMonsState == 3)
- str = gText_SelectThirdPkmn;
- else
- str = gText_TheseThreePkmnOkay;
-
- AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL);
- CopyWindowToVram(2, 2);
-}
-
-static void Select_PrintCantSelectSameMon(void)
-{
- FillWindowPixelBuffer(2, 0);
- AddTextPrinterParameterized(2, 1, gText_CantSelectSamePkmn, 2, 5, 0, NULL);
- CopyWindowToVram(2, 2);
-}
-
-static void Select_PrintMenuOptions(void)
-{
- u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
-
- PutWindowTilemap(3);
- FillWindowPixelBuffer(3, 0);
- AddTextPrinterParameterized3(3, 1, 7, 1, gUnknown_08610476, 0, gText_Summary);
- if (selectedId != 0)
- AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Deselect);
- else
- AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Rent);
-
- AddTextPrinterParameterized3(3, 1, 7, 33, gUnknown_08610476, 0, gText_Others2);
- CopyWindowToVram(3, 3);
+ gUnknown_03001288 = 1;
}
-static void Select_PrintYesNoOptions(void)
+static void sub_81A61B0(void)
{
- PutWindowTilemap(4);
- FillWindowPixelBuffer(4, 0);
- AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610476, 0, gText_Yes2);
- AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610476, 0, gText_No2);
- CopyWindowToVram(4, 3);
-}
+ s32 i, j, k;
+ u16 species[3];
+ u16 heldItems[3];
+ s32 firstMonId = 0;
+ u16 trainerId = 0;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u32 winStreak = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode];
+ u32 challengeNum = winStreak / 7;
+ gFacilityTrainers = gBattleFrontierTrainers;
-static u8 Select_RunMenuOptionFunc(void)
-{
- gUnknown_030062E8 = sSelect_MenuOptionFuncs[sFactorySelectScreen->menuCursorPos];
- return gUnknown_030062E8();
-}
-
-static u8 Select_OptionRentDeselect(void)
-{
- u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
- u16 monSetId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monSetId;
- if (selectedId == 0 && !Select_AreSpeciesValid(monSetId))
+ do
{
- Select_PrintCantSelectSameMon();
- sub_819B958(3);
- return 3;
- }
- else
- {
- sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
- Select_HandleMonSelectionChange();
- Select_PrintSelectMonString();
- sub_819B958(3);
- if (sFactorySelectScreen->selectingMonsState > 3)
- return 2;
- else
- return 1;
- }
-}
-
-static u8 sub_819BC9C(void)
-{
- sub_819C568();
- Select_HandleMonSelectionChange();
- Select_PrintSelectMonString();
- sub_819B958(3);
- if (sFactorySelectScreen->selectingMonsState > 3)
- return 2;
- else
- return 1;
-}
-
-static u8 Select_OptionSummary(void)
-{
- return 0;
-}
-
-static u8 Select_OptionOthers(void)
-{
- sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
- sub_819B958(3);
- return 1;
-}
-
-static void Select_PrintMonCategory(void)
-{
- u16 species;
- u8 text[30];
- u8 x;
- u8 monId = sFactorySelectScreen->cursorPos;
- if (monId < SELECTABLE_MONS_COUNT)
- {
- PutWindowTilemap(5);
- FillWindowPixelBuffer(5, 0);
- species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL);
- CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text);
- x = GetStringRightAlignXOffset(1, text, 0x76);
- AddTextPrinterParameterized(5, 1, text, x, 1, 0, NULL);
- CopyWindowToVram(5, 2);
- }
-}
-
-static void Summary_ShowMonSprite(void)
-{
- u8 monId = sFactorySelectScreen->cursorPos;
- struct Pokemon *mon = &sFactorySelectScreen->mons[monId].monData;
- u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
- gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0;
-
- sFactorySelectScreen->unk2A0 = FALSE;
-}
-
-static void sub_819BE20(bool8 arg0)
-{
- sFactorySelectScreen->unk2A0 = arg0;
-}
-
-static void Select_ShowSummaryMonSprite(void)
-{
- struct Pokemon *mon;
- u16 species;
- u32 personality, otId;
-
- sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1);
- StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 2);
-
- mon = &sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monData;
- species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
- gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0;
-
- gSprites[sFactorySelectScreen->unk294[1].field1].invisible = TRUE;
-}
-
-static void Select_ShowChosenMonsSprites(void)
-{
- u8 i, j;
-
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ trainerId = sub_8162548(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
+ for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
{
- if (sFactorySelectScreen->mons[j].selectedId == i + 1)
- {
- struct Pokemon *mon = &sFactorySelectScreen->mons[j].monData;
- u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySelectScreen->unk294[i].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, (i * 72) + 16, 32, i + 13, 0xFFFF);
- gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecY = 0;
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
break;
- }
}
- }
- sFactorySelectScreen->unk2A0 = FALSE;
-}
-
-static void sub_819C040(struct Sprite *sprite)
-{
- u8 taskId;
-
- if (sprite->affineAnimEnded
- && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded
- && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded)
- {
- sprite->invisible = TRUE;
- gSprites[sFactorySelectScreen->unk294[0].field1].invisible = TRUE;
- gSprites[sFactorySelectScreen->unk294[2].field1].invisible = TRUE;
-
- taskId = CreateTask(sub_819C1D0, 1);
- gTasks[taskId].func(taskId);
-
- sprite->callback = SpriteCallbackDummy;
- }
-}
+ } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum);
-static void sub_819C100(struct Sprite *sprite)
-{
- if (sprite->affineAnimEnded
- && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded
- && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded)
- {
- FreeOamMatrix(sprite->oam.matrixNum);
- FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[0].field1].oam.matrixNum);
- FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[2].field1].oam.matrixNum);
-
- sFactorySelectScreen->unk2A0 = FALSE;
+ gTrainerBattleOpponent_A = trainerId;
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6)
+ gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = trainerId;
- DestroySprite(&gSprites[sFactorySelectScreen->unk294[0].field1]);
- DestroySprite(&gSprites[sFactorySelectScreen->unk294[2].field1]);
- DestroySprite(sprite);
- }
-}
-
-static void sub_819C1D0(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- switch (task->data[0])
+ i = 0;
+ while (i != 3)
{
- case 0:
- task->data[3] = 16;
- task->data[24] = 224; // BUG: writing outside the array's bounds.
- task->data[5] = 64;
- task->data[8] = 65;
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
- break;
- case 1:
- ShowBg(3);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
- break;
- case 2:
- task->data[5] -= 4;
- task->data[8] += 4;
- if (task->data[5] <= 32 || task->data[8] >= 96)
- {
- task->data[5] = 32;
- task->data[8] = 96;
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- }
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- if (task->data[5] != 32)
- return;
- break;
- default:
- DestroyTask(taskId);
- Select_ShowChosenMonsSprites();
- return;
- }
- task->data[0]++;
-}
+ u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE);
+ if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ continue;
-static void sub_819C2D4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- switch (task->data[0])
- {
- default:
- HideBg(3);
- gSprites[sFactorySelectScreen->unk294[1].field1].invisible = FALSE;
- gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C100;
- gSprites[sFactorySelectScreen->unk294[0].field1].invisible = FALSE;
- gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy;
- gSprites[sFactorySelectScreen->unk294[2].field1].invisible = FALSE;
- gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy;
- StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 1);
- StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[0].field1], 1);
- StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[2].field1], 1);
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- DestroyTask(taskId);
- break;
- case 0:
- task->data[3] = 16;
- task->data[24] = 224; // BUG: writing outside the array's bounds.
- task->data[5] = 32;
- task->data[8] = 96;
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
- task->data[0]++;
- break;
- case 1:
- task->data[5] += 4;
- task->data[8] -= 4;
- if (task->data[5] >= 64 || task->data[8] <= 65)
+ for (j = 0; j < 6; j++)
{
- task->data[5] = 64;
- task->data[8] = 65;
+ if (gFacilityTrainerMons[monSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[j].monId].species)
+ break;
}
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- if (task->data[5] == 64)
- task->data[0]++;
- break;
- }
-}
+ if (j != 6)
+ continue;
-static void sub_819C4B4(void)
-{
- sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1);
- sFactorySelectScreen->unk294[0].field1 = CreateSprite(&gUnknown_08610638, 44, 64, 1);
- sFactorySelectScreen->unk294[2].field1 = CreateSprite(&gUnknown_08610638, 196, 64, 1);
-
- gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C040;
- gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy;
- gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy;
-
- sFactorySelectScreen->unk2A0 = TRUE;
-}
-
-static void sub_819C568(void)
-{
- u8 taskId;
-
- FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[0].field0);
- FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[1].field0);
- FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[2].field0);
-
- taskId = CreateTask(sub_819C2D4, 1);
- gTasks[taskId].func(taskId);
-
- sFactorySelectScreen->unk2A0 = TRUE;
-}
+ if (lvlMode == FRONTIER_LVL_50 && monSetId > 849)
+ continue;
-static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V)
-{
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(mWin0H, nWin0H));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(mWin0V, nWin0V));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
-}
-
-static bool32 Select_AreSpeciesValid(u16 monSetId)
-{
- u8 i, j;
- u32 species = gFacilityTrainerMons[monSetId].species;
- u8 selectState = sFactorySelectScreen->selectingMonsState;
-
- for (i = 1; i < selectState; i++)
- {
- for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ for (k = firstMonId; k < firstMonId + i; k++)
{
- if (sFactorySelectScreen->mons[j].selectedId == i)
- {
- if (gFacilityTrainerMons[sFactorySelectScreen->mons[j].monSetId].species == species)
- return FALSE;
-
+ if (species[k] == gFacilityTrainerMons[monSetId].species)
break;
- }
}
- }
+ if (k != firstMonId + i)
+ continue;
- return TRUE;
-}
-
-static void Task_SelectFadeSpeciesName(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
- case 0:
- sFactorySelectScreen->unk2A7 = 0;
- sFactorySelectScreen->unk2A8 = 0;
- sFactorySelectScreen->unk2A6 = TRUE;
- gTasks[taskId].data[0] = 1;
- break;
- case 1:
- if (sFactorySelectScreen->unk2A2)
+ for (k = firstMonId; k < firstMonId + i; k++)
{
- if (sFactorySelectScreen->unk2A9)
- {
- gTasks[taskId].data[0] = 2;
- }
- else
- {
- sFactorySelectScreen->unk2A7++;
- if (sFactorySelectScreen->unk2A7 > 6)
- {
- sFactorySelectScreen->unk2A7 = 0;
- if (!sFactorySelectScreen->unk2A6)
- sFactorySelectScreen->unk2A8--;
- else
- sFactorySelectScreen->unk2A8++;
- }
- BlendPalettes(0x4000, sFactorySelectScreen->unk2A8, 0);
- if (sFactorySelectScreen->unk2A8 > 5)
- {
- sFactorySelectScreen->unk2A6 = FALSE;
- }
- else if (sFactorySelectScreen->unk2A8 == 0)
- {
- gTasks[taskId].data[0] = 2;
- sFactorySelectScreen->unk2A6 = TRUE;
- }
- }
- }
- break;
- case 2:
- if (sFactorySelectScreen->unk2A9 > 14)
- {
- sFactorySelectScreen->unk2A9 = 0;
- gTasks[taskId].data[0] = 1;
- }
- else
- {
- sFactorySelectScreen->unk2A9++;
+ if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ break;
}
- break;
- }
-}
-
-// Swap Screen's section begins here.
-
-static void Swap_CB2(void)
-{
- AnimateSprites();
- BuildOamBuffer();
- RunTextPrinters();
- UpdatePaletteFade();
- RunTasks();
-}
+ if (k != firstMonId + i)
+ continue;
-static void Swap_VblankCb(void)
-{
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
-}
-
-static void CopySwappedMonData(void)
-{
- u8 happiness;
-
- gPlayerParty[sFactorySwapScreen->playerMonId] = gEnemyParty[sFactorySwapScreen->enemyMonId];
- happiness = 0;
- SetMonData(&gPlayerParty[sFactorySwapScreen->playerMonId], MON_DATA_FRIENDSHIP, &happiness);
- gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].monId = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].monId;
- gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].ivs = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].ivs;
- gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].personality = GetMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId], MON_DATA_PERSONALITY, NULL);
- gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].abilityBit = GetBoxMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId].box, MON_DATA_ALT_ABILITY, NULL);
-}
-
-static void Task_FromSwapScreenToSummaryScreen(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
- case 6:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- gTasks[taskId].data[0] = 7;
- break;
- case 7:
- if (!gPaletteFade.active)
- {
- DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId);
- sub_819F444(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30);
- Swap_DestroyAllSprites();
- FREE_AND_SET_NULL(sSwapMenuTilesetBuffer);
- FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer);
- FREE_AND_SET_NULL(sSwapMenuTilemapBuffer);
- FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer);
- FreeAllWindowBuffers();
- gTasks[taskId].data[0] = 8;
- }
- break;
- case 8:
- DestroyTask(taskId);
- sFactorySwapScreen->fromSummaryScreen = TRUE;
- sFactorySwapScreen->unk24 = gPlttBufferUnfaded[244];
- ShowPokemonSummaryScreen(0, gPlayerParty, sFactorySwapScreen->cursorPos, 3 - 1, CB2_InitSwapScreen);
- break;
+ species[i] = gFacilityTrainerMons[monSetId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ gUnknown_03006298[i] = monSetId;
+ i++;
}
}
-static void Task_CloseSwapScreen(u8 taskId)
+static void sub_81A63B8(void)
{
- if (sFactorySwapScreen->unk30 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 0:
- if (sFactorySwapScreen->monSwapped == TRUE)
- {
- gTasks[taskId].data[0]++;
- gSpecialVar_Result = 0;
- }
- else
- {
- gTasks[taskId].data[0] = 2;
- gSpecialVar_Result = 1;
- }
- break;
- case 1:
- if (sFactorySwapScreen->monSwapped == TRUE)
- {
- sFactorySwapScreen->enemyMonId = sFactorySwapScreen->cursorPos;
- CopySwappedMonData();
- }
- gTasks[taskId].data[0]++;
- break;
- case 2:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- gTasks[taskId].data[0]++;
- break;
- case 3:
- if (!UpdatePaletteFade())
- {
- DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId);
- Swap_DestroyAllSprites();
- FREE_AND_SET_NULL(sSwapMenuTilesetBuffer);
- FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer);
- FREE_AND_SET_NULL(sSwapMenuTilemapBuffer);
- FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer);
- FREE_AND_SET_NULL(sFactorySwapScreen);
- FreeAllWindowBuffers();
- SetMainCallback2(CB2_ReturnToFieldContinueScript);
- DestroyTask(taskId);
- }
- break;
- }
- }
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
}
-static void Task_HandleSwapScreenYesNo(u8 taskId)
+static void sub_81A63CC(void)
{
- u16 loPtr, hiPtr;
-
- if (sFactorySwapScreen->unk30 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 4:
- Swap_ShowYesNoOptions();
- gTasks[taskId].data[0] = 5;
- break;
- case 5:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- if (sFactorySwapScreen->yesNoCursorPos == 0)
- {
- gTasks[taskId].data[1] = 1;
- hiPtr = gTasks[taskId].data[6];
- loPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
- }
- else
- {
- gTasks[taskId].data[1] = 0;
- sub_819EA64(4);
- hiPtr = gTasks[taskId].data[6];
- loPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
- }
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- gTasks[taskId].data[1] = 0;
- sub_819EA64(4);
- hiPtr = gTasks[taskId].data[6];
- loPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- PlaySE(SE_SELECT);
- Swap_UpdateYesNoCursorPosition(-1);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- PlaySE(SE_SELECT);
- Swap_UpdateYesNoCursorPosition(1);
- }
- break;
- }
- }
-}
+ u8 i;
-static void sub_819CBDC(u8 taskId)
-{
- if (gTasks[taskId].data[1] == 1)
- {
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = Task_CloseSwapScreen;
- }
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
+ gFacilityTrainerMons = gBattleFrontierMons;
else
- {
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
- }
-}
+ gFacilityTrainerMons = gSlateportBattleTentMons;
-static void sub_819CC24(u8 taskId)
-{
- if (gTasks[taskId].data[0] == 0)
+ for (i = 0; i < 3; i++)
{
- Swap_PrintOnInfoWindow(gText_QuitSwapping);
- sFactorySwapScreen->monSwapped = FALSE;
- gTasks[taskId].data[0] = 4;
- gTasks[taskId].data[6] = (u32)(sub_819CBDC) >> 16;
- gTasks[taskId].data[7] = (u32)(sub_819CBDC);
- gTasks[taskId].func = Task_HandleSwapScreenYesNo;
+ gSaveBlock2Ptr->frontier.field_E70[i + 3].monId = gUnknown_03006298[i];
+ gSaveBlock2Ptr->frontier.field_E70[i + 3].ivs = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ATK_IV, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[i + 3].personality = GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[i + 3].abilityBit = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ALT_ABILITY, NULL);
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[gUnknown_03006298[i]].itemTableId]);
}
}
-static void sub_819CC74(u8 taskId)
+static void sub_81A64C4(void)
{
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- if (gTasks[taskId].data[1] == 1)
+ s32 i, j, k;
+ s32 count = 0;
+ u8 bits = 0;
+ u8 monLevel;
+ u16 monSetId;
+ u16 evs;
+ u8 ivs;
+ u8 friendship;
+
+ if (gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_TENT)
{
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = Task_CloseSwapScreen;
+ gFacilityTrainerMons = gSlateportBattleTentMons;
+ monLevel = 30;
}
else
{
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
- }
-}
-
-static void sub_819CCD4(u8 taskId)
-{
- if (gTasks[taskId].data[0] == 0)
- {
- sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
- Swap_PrintOnInfoWindow(gText_AcceptThisPkmn);
- sFactorySwapScreen->monSwapped = TRUE;
- gTasks[taskId].data[0] = 4;
- gTasks[taskId].data[6] = (u32)(sub_819CC74) >> 16;
- gTasks[taskId].data[7] = (u32)(sub_819CC74);
- gTasks[taskId].func = Task_HandleSwapScreenYesNo;
+ gFacilityTrainerMons = gBattleFrontierMons;
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
+ monLevel = 100;
+ else
+ monLevel = 50;
}
-}
-static void Task_HandleSwapScreenMenu(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
+ if (gSpecialVar_0x8005 < 2)
{
- case 2:
- if (!sFactorySwapScreen->fromSummaryScreen)
- sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
- gTasks[taskId].data[0] = 9;
- break;
- case 9:
- if (sFactorySwapScreen->unk30 != TRUE)
+ ZeroPlayerPartyMons();
+ for (i = 0; i < 3; i++)
{
- Swap_ShowMenuOptions();
- gTasks[taskId].data[0] = 3;
- }
- break;
- case 3:
- if (sFactorySwapScreen->unk30 != TRUE)
- {
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- Swap_RunMenuOptionFunc(taskId);
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- sub_819EA64(3);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- Swap_UpdateMenuCursorPosition(-1);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- Swap_UpdateMenuCursorPosition(1);
- }
- }
- break;
- }
-}
+ monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
+ ivs = gSaveBlock2Ptr->frontier.field_E70[i].ivs;
+ CreateMon(&gPlayerParty[i],
+ gFacilityTrainerMons[monSetId].species,
+ monLevel,
+ ivs,
+ TRUE, gSaveBlock2Ptr->frontier.field_E70[i].personality,
+ 0, 0);
-static void Task_HandleSwapScreenChooseMons(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
- case 0:
- if (!gPaletteFade.active)
- {
- sFactorySwapScreen->unk22 = TRUE;
- gTasks[taskId].data[0] = 1;
- }
- break;
- case 1:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- sFactorySwapScreen->unk22 = FALSE;
- Swap_PrintMonSpecies2();
- sub_819EAC0();
- Swap_RunActionFunc(taskId);
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- sFactorySwapScreen->unk22 = FALSE;
- Swap_PrintMonSpecies2();
- sub_819EAC0();
- gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 16;
- gTasks[taskId].data[7] = (u32)(sub_819CC24);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].func = sub_819D588;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
- {
- Swap_UpdateBallCursorPosition(-1);
- Swap_PrintMonCategory();
- Swap_PrintMonSpecies();
- }
- else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
- {
- Swap_UpdateBallCursorPosition(1);
- Swap_PrintMonCategory();
- Swap_PrintMonSpecies();
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- Swap_UpdateActionCursorPosition(1);
- Swap_PrintMonCategory();
- Swap_PrintMonSpecies();
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- Swap_UpdateActionCursorPosition(-1);
- Swap_PrintMonCategory();
- Swap_PrintMonSpecies();
- }
- break;
- }
-}
-
-static void Task_SwapFadeSpeciesName(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
- case 0:
- sFactorySwapScreen->unk27 = 0;
- sFactorySwapScreen->unk28 = 0;
- sFactorySwapScreen->unk26 = TRUE;
- gTasks[taskId].data[0] = 1;
- break;
- case 1:
- if (sFactorySwapScreen->unk22)
- {
- if (sFactorySwapScreen->unk29)
+ count = 0;
+ bits = gFacilityTrainerMons[monSetId].evSpread;
+ for (j = 0; j < NUM_STATS; bits >>= 1, j++)
{
- gTasks[taskId].data[0] = 2;
+ if (bits & 1)
+ count++;
}
- else
+
+ evs = MAX_TOTAL_EVS / count;
+ bits = 1;
+ for (j = 0; j < NUM_STATS; bits <<= 1, j++)
{
- sFactorySwapScreen->unk27++;
- if (sFactorySwapScreen->unk27 > 6)
- {
- sFactorySwapScreen->unk27 = 0;
- if (!sFactorySwapScreen->unk26)
- sFactorySwapScreen->unk28--;
- else
- sFactorySwapScreen->unk28++;
- }
- BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0);
- if (sFactorySwapScreen->unk28 > 5)
- {
- sFactorySwapScreen->unk26 = FALSE;
- }
- else if (sFactorySwapScreen->unk28 == 0)
- {
- gTasks[taskId].data[0] = 2;
- sFactorySwapScreen->unk26 = TRUE;
- }
+ if (gFacilityTrainerMons[monSetId].evSpread & bits)
+ SetMonData(&gPlayerParty[i], MON_DATA_HP_EV + j, &evs);
}
+
+ CalculateMonStats(&gPlayerParty[i]);
+ friendship = 0;
+ for (k = 0; k < 4; k++)
+ SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
+ SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY, &gSaveBlock2Ptr->frontier.field_E70[i].abilityBit);
}
- break;
- case 2:
- if (sFactorySwapScreen->unk29 > 14)
- {
- sFactorySwapScreen->unk29 = 0;
- gTasks[taskId].data[0] = 1;
- }
- else
- {
- sFactorySwapScreen->unk29++;
- }
- break;
}
-}
-static void Task_SwapFadeSpeciesName2(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
+ switch (gSpecialVar_0x8005)
{
case 0:
- sFactorySwapScreen->unk27 = 0;
- gTasks[taskId].data[4] = 0;
- gTasks[taskId].data[0]++;
- break;
- case 1:
- LoadPalette(&gPlttBufferUnfaded[0xF0], 0xE0, 0xA);
- gTasks[taskId].data[0]++;
- break;
case 2:
- if (sFactorySwapScreen->unk28 > 15)
+ for (i = 0; i < 3; i++)
{
- gTasks[taskId].data[4] = 1;
- gTasks[taskId].data[0]++;
- }
- sFactorySwapScreen->unk27++;
- if (sFactorySwapScreen->unk27 > 3)
- {
- sFactorySwapScreen->unk27 = 0;
- gPlttBufferUnfaded[244] = gPlttBufferFaded[228];
- sFactorySwapScreen->unk28++;
- }
- BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0);
- break;
- }
-}
-
-static void sub_819D12C(u8 taskId)
-{
- s8 i;
- u8 var_2C;
- bool8 destroyTask;
+ monSetId = gSaveBlock2Ptr->frontier.field_E70[i + 3].monId;
+ ivs = gSaveBlock2Ptr->frontier.field_E70[i + 3].ivs;
+ CreateMon(&gEnemyParty[i],
+ gFacilityTrainerMons[monSetId].species,
+ monLevel,
+ ivs,
+ TRUE, gSaveBlock2Ptr->frontier.field_E70[i + 3].personality,
+ 0, 0);
- switch (gTasks[taskId].data[0])
- {
- case 0:
- gTasks[taskId].data[1] = 0;
- gTasks[taskId].data[2] = 0;
- gTasks[taskId].data[3] = 0;
- gTasks[taskId].data[0] = 1;
- break;
- case 1:
- var_2C = 0;
- for (i = 2; i >= 0; i--)
- {
- if (i != 2)
- {
- u8 posX = var_2C - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
- if (posX == 16 || gTasks[taskId].data[i + 2] == 1)
- {
- var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10;
- }
- else if (posX > 16)
- {
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[i + 1]].pos1.x - 48;
- }
- }
- else
+ count = 0;
+ bits = gFacilityTrainerMons[monSetId].evSpread;
+ for (j = 0; j < NUM_STATS; bits >>= 1, j++)
{
- var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10;
+ if (bits & 1)
+ count++;
}
- if (gTasks[taskId].data[i + 1] == 1)
+ evs = MAX_TOTAL_EVS / count;
+ bits = 1;
+ for (j = 0; j < NUM_STATS; bits <<= 1, j++)
{
- if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x > (i * 48) + 72)
- {
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = (i * 48) + 72;
- destroyTask = TRUE;
- }
- else if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x == (i * 48) + 72)
- {
- destroyTask = TRUE;
- }
- else
- {
- destroyTask = FALSE;
- }
- }
- else
- {
- destroyTask = FALSE;
+ if (gFacilityTrainerMons[monSetId].evSpread & bits)
+ SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &evs);
}
- if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x - 16 > 240)
- {
- var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = -16;
- if (sFactorySwapScreen->inEnemyScreen == TRUE)
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
- else
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
-
- gTasks[taskId].data[i + 1] = 1;
- }
+ CalculateMonStats(&gEnemyParty[i]);
+ for (k = 0; k < 4; k++)
+ SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY, &gSaveBlock2Ptr->frontier.field_E70[i + 3].abilityBit);
}
- if (destroyTask == TRUE)
- DestroyTask(taskId);
break;
}
}
-static void sub_819D324(u8 taskId)
+static void sub_81A67EC(void)
{
- u8 i, j;
- s32 posX = 0;
- s8 r4 = gTasks[taskId].data[3];
- bool8 r1;
- s16 currPosX;
- u8 taskId2;
-
- if (gTasks[taskId].data[2] == 1)
- r4 *= -1;
+ s32 i, j;
+ u8 firstMonId;
+ u8 battleMode;
+ u8 lvlMode;
+ u8 challengeNum;
+ u8 factoryLvlMode;
+ u8 factoryBattleMode;
+ u8 var_40;
+ u16 monSetId;
+ u16 currSpecies;
+ u16 species[PARTY_SIZE];
+ u16 monIds[PARTY_SIZE];
+ u16 heldItems[PARTY_SIZE];
+
+ gFacilityTrainers = gBattleFrontierTrainers;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ species[i] = 0;
+ monIds[i] = 0;
+ heldItems[i] = 0;
+ }
+ lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
+ if (VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_DOUBLES)
+ factoryBattleMode = FRONTIER_MODE_DOUBLES;
+ else
+ factoryBattleMode = FRONTIER_MODE_SINGLES;
- switch (gTasks[taskId].data[0])
+ gFacilityTrainerMons = gBattleFrontierMons;
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
{
- case 0:
- currPosX = gSprites[sFactorySwapScreen->unk8[0][0]].pos1.x;
- if (!gTasks[taskId].data[2])
- {
- if (currPosX + r4 < 240)
- {
- r1 = TRUE;
- }
- else
- {
- r1 = FALSE;
- posX = 240;
- }
- }
- else
- {
- if (currPosX + r4 > 160)
- {
- r1 = TRUE;
- }
- else
- {
- r1 = FALSE;
- posX = 160;
- }
- }
-
- if (r1 == TRUE)
- {
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 2; j++)
- gSprites[sFactorySwapScreen->unk8[j][i]].pos1.x += r4;
- }
- }
- else
- {
- for (j = 0; j < 2; j++)
- {
- gSprites[sFactorySwapScreen->unk8[j][0]].pos1.x = posX;
- gSprites[sFactorySwapScreen->unk8[j][1]].pos1.x = posX + 16;
- gSprites[sFactorySwapScreen->unk8[j][2]].pos1.x = posX + 48;
- }
- taskId2 = gTasks[taskId].data[1];
- gTasks[taskId2].data[3] = 1;
- DestroyTask(taskId);
- }
- break;
- case 1:
- currPosX = gSprites[sFactorySwapScreen->unkE[0][0]].pos1.x;
- if (!gTasks[taskId].data[2])
- {
- if (currPosX + r4 < 240)
- {
- r1 = TRUE;
- }
- else
- {
- r1 = FALSE;
- posX = 240;
- }
- }
- else
- {
- if (currPosX + r4 > 192)
- {
- r1 = TRUE;
- }
- else
- {
- r1 = FALSE;
- posX = 192;
- }
- }
-
- if (r1 == TRUE)
- {
- for (i = 0; i < 2; i++)
- {
- for (j = 0; j < 2; j++)
- gSprites[sFactorySwapScreen->unkE[j][i]].pos1.x += r4;
- }
- }
- else
- {
- for (j = 0; j < 2; j++)
- {
- gSprites[sFactorySwapScreen->unkE[j][0]].pos1.x = posX;
- gSprites[sFactorySwapScreen->unkE[j][1]].pos1.x = posX + 16;
- }
- taskId2 = gTasks[taskId].data[1];
- gTasks[taskId2].data[4] = 1;
- DestroyTask(taskId);
- }
- break;
+ factoryLvlMode = FRONTIER_LVL_OPEN;
+ firstMonId = 0;
}
-}
-
-static void sub_819D588(u8 taskId)
-{
- u8 anotherTaskId;
- u16 loPtr, hiPtr;
-
- switch (gTasks[taskId].data[0])
+ else
{
- case 0:
- LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
- Swap_PrintActionStrings();
- PutWindowTilemap(5);
- gTasks[taskId].data[0]++;
- break;
- case 1:
- sub_819EA64(3);
- gTasks[taskId].data[0]++;
- break;
- case 2:
- BeginNormalPaletteFade(0x4000, 0, 0, 0x10, gUnknown_0860F13C[37]);
- gTasks[taskId].data[0]++;
- break;
- case 3:
- if (!gPaletteFade.active)
- {
- FillWindowPixelBuffer(5, 0);
- CopyWindowToVram(5, 2);
- if (sFactorySwapScreen->inEnemyScreen == TRUE)
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[3] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 0;
- gTasks[anotherTaskId].data[2] = 0;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[2] = 5;
- gTasks[taskId].data[0]++;
- }
- else
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[3] = 1;
- gTasks[taskId].data[4] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 1;
- gTasks[anotherTaskId].data[2] = 0;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[0] += 2;
- }
- }
- break;
- case 4:
- if (gTasks[taskId].data[2] == 0)
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[4] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 1;
- gTasks[anotherTaskId].data[2] = 0;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[0]++;
- }
- else
- {
- gTasks[taskId].data[2]--;
- }
- break;
- case 5:
- if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1)
- {
- gTasks[taskId].data[0] = gTasks[taskId].data[5];
- loPtr = gTasks[taskId].data[6];
- hiPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr));
- }
- break;
+ factoryLvlMode = FRONTIER_LVL_50;
+ firstMonId = 0;
}
-}
+ var_40 = sub_81A6F70(factoryBattleMode, factoryLvlMode);
-static void sub_819D770(u8 taskId)
-{
- u8 anotherTaskId;
- u16 loPtr, hiPtr;
- if (sFactorySwapScreen->unk30 == TRUE)
- return;
-
- switch (gTasks[taskId].data[0])
+ currSpecies = 0;
+ i = 0;
+ while (i != PARTY_SIZE)
{
- case 0:
- if (sFactorySwapScreen->inEnemyScreen == TRUE)
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[3] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 0;
- gTasks[anotherTaskId].data[2] = 1;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[2] = 10;
- gTasks[taskId].data[0]++;
- }
- else
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[3] = 1;
- gTasks[taskId].data[4] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 1;
- gTasks[anotherTaskId].data[2] = 1;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[0] += 2;
- }
- break;
- case 1:
- if (gTasks[taskId].data[2] == 0)
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[4] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 1;
- gTasks[anotherTaskId].data[2] = 1;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[0]++;
- }
+ if (i < var_40)
+ monSetId = GetMonSetId(factoryLvlMode, challengeNum, TRUE);
else
- {
- gTasks[taskId].data[2]--;
- }
- break;
- case 2:
- if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1)
- {
- gPlttBufferFaded[226] = gUnknown_0860F13C[37];
- Swap_PrintActionStrings();
- PutWindowTilemap(5);
- gTasks[taskId].data[0]++;
- }
- break;
- case 3:
- BeginNormalPaletteFade(0x4000, 0, 0x10, 0, gUnknown_0860F13C[37]);
- gTasks[taskId].data[0]++;
- break;
- case 4:
- if (!gPaletteFade.active)
- {
- Swap_PrintOneActionString(0);
- gTasks[taskId].data[0]++;
- }
- break;
- case 5:
- Swap_PrintOneActionString(1);
- PutWindowTilemap(3);
- gTasks[taskId].data[0]++;
- break;
- case 6:
- FillWindowPixelBuffer(5, 0);
- CopyWindowToVram(5, 2);
- gTasks[taskId].data[0]++;
- break;
- case 7:
- if (!sFactorySwapScreen->inEnemyScreen)
- Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap);
- else
- Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept);
- if (sFactorySwapScreen->cursorPos < 3)
- gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE;
- Swap_PrintMonCategory();
- gTasks[taskId].data[0]++;
- break;
- case 8:
- Swap_PrintMonSpecies3();
- sub_819EADC();
- sFactorySwapScreen->unk22 = TRUE;
- gTasks[taskId].data[0] = gTasks[taskId].data[5];
- loPtr = gTasks[taskId].data[6];
- hiPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr));
- break;
- }
-}
+ monSetId = GetMonSetId(factoryLvlMode, challengeNum, FALSE);
-static void sub_819D9EC(u8 taskId)
-{
- u8 i;
- if (sFactorySwapScreen->unk30 == TRUE)
- return;
+ if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ continue;
- switch (gTasks[taskId].data[0])
- {
- case 0:
- Swap_PrintMonSpecies3();
- gTasks[taskId].data[0]++;
- break;
- case 1:
- sub_819EADC();
- gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE;
- gTasks[taskId].data[0]++;
- break;
- case 2:
- CreateTask(sub_819D12C, 0);
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName2;
- gTasks[taskId].data[0]++;
- break;
- case 3:
- if (!FuncIsActiveTask(sub_819D12C) && gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[4] == 1)
+ // Cannot have two pokemon of the same species.
+ for (j = firstMonId; j < firstMonId + i; j++)
{
- sub_819EAC0();
- if (!sFactorySwapScreen->inEnemyScreen)
- {
- Swap_InitActions(ACTIONS_ENEMY_SCREEN);
- }
- else
+ u16 monId = monIds[j];
+ if (monId == monSetId)
+ break;
+ if (species[j] == gFacilityTrainerMons[monSetId].species)
{
- Swap_InitActions(ACTIONS_PLAYER_SCREEN);
- for (i = 0; i < 3; i++)
- gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ if (currSpecies == 0)
+ currSpecies = gFacilityTrainerMons[monSetId].species;
+ else
+ break;
}
- gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x;
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName;
- sFactorySwapScreen->unk27 = 0;
- sFactorySwapScreen->unk28 = 6;
- sFactorySwapScreen->unk26 = FALSE;
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1;
- gTasks[taskId].data[0]++;
}
- break;
- case 4:
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
- break;
- }
-}
-
-static void Swap_InitStruct(void)
-{
- if (sFactorySwapScreen == NULL)
- {
- sFactorySwapScreen = AllocZeroed(sizeof(*sFactorySwapScreen));
- sFactorySwapScreen->cursorPos = 0;
- sFactorySwapScreen->unk30 = FALSE;
- sFactorySwapScreen->fromSummaryScreen = FALSE;
- }
-}
-
-void DoBattleFactorySwapScreen(void)
-{
- sFactorySwapScreen = NULL;
- SetMainCallback2(CB2_InitSwapScreen);
-}
+ if (j != firstMonId + i)
+ continue;
-static void CB2_InitSwapScreen(void)
-{
- u8 taskId;
-
- switch (gMain.state)
- {
- case 0:
- SetHBlankCallback(NULL);
- SetVBlankCallback(NULL);
- CpuFill32(0, (void *)VRAM, VRAM_SIZE);
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sSwap_BgTemplates, ARRAY_COUNT(sSwap_BgTemplates));
- InitWindows(sSwap_WindowTemplates);
- DeactivateAllTextPrinters();
- gMain.state++;
- break;
- case 1:
- sSwapMenuTilesetBuffer = Alloc(0x440);
- sSwapMonCardBgTilesetBuffer = AllocZeroed(0x440);
- sSwapMenuTilemapBuffer = Alloc(0x800);
- sSwapMonCardBgTilemapBuffer = AllocZeroed(0x800);
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
- ChangeBgX(1, 0, 0);
- ChangeBgY(1, 0, 0);
- ChangeBgX(2, 0, 0);
- ChangeBgY(2, 0, 0);
- ChangeBgX(3, 0, 0);
- ChangeBgY(3, 0, 0);
- SetGpuReg(REG_OFFSET_BLDY, 0);
- SetGpuReg(REG_OFFSET_MOSAIC, 0);
- SetGpuReg(REG_OFFSET_WIN0H, 0);
- SetGpuReg(REG_OFFSET_WIN0V, 0);
- SetGpuReg(REG_OFFSET_WIN1H, 0);
- SetGpuReg(REG_OFFSET_WIN1V, 0);
- SetGpuReg(REG_OFFSET_WININ, 0);
- SetGpuReg(REG_OFFSET_WINOUT, 0);
- gMain.state++;
- break;
- case 2:
- ResetPaletteFade();
- ResetSpriteData();
- ResetTasks();
- FreeAllSpritePalettes();
- ResetAllPicSprites();
- CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSwapMenuTilesetBuffer, 0x440);
- CpuCopy16(gUnknown_0861033C, sSwapMonCardBgTilesetBuffer, 0x60);
- LoadBgTiles(1, sSwapMenuTilesetBuffer, 0x440, 0);
- LoadBgTiles(3, sSwapMonCardBgTilesetBuffer, 0x60, 0);
- CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, 0x800);
- LoadBgTilemap(1, sSwapMenuTilemapBuffer, 0x800, 0);
- LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40);
- LoadPalette(gUnknown_08610918, 0xF0, sizeof(gUnknown_08610918));
- LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
- LoadPalette(gUnknown_0861039C, 0x20, 4);
- gMain.state++;
- break;
- case 3:
- SetBgTilemapBuffer(3, sSwapMonCardBgTilemapBuffer);
- CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8);
- CopyBgTilemapBufferToVram(3);
- gMain.state++;
- break;
- case 4:
- LoadSpritePalettes(gUnknown_086106B0);
- LoadSpriteSheets(gUnknown_08610650);
- LoadCompressedObjectPic(gUnknown_086106A0);
- SetVBlankCallback(Swap_VblankCb);
- gMain.state++;
- break;
- case 5:
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
- sFactorySwapScreen->cursorPos = gUnknown_0203CF20;
- gMain.state++;
- break;
- case 6:
- Swap_InitStruct();
- Swap_InitAllSprites();
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
- Swap_ShowSummaryMonSprite();
- Swap_InitActions(ACTIONS_PLAYER_SCREEN);
- gMain.state++;
- break;
- case 7:
- Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap);
- PutWindowTilemap(2);
- gMain.state++;
- break;
- case 8:
- Swap_PrintMonCategory();
- PutWindowTilemap(8);
- gMain.state++;
- break;
- case 9:
- if (!sFactorySwapScreen->fromSummaryScreen)
- Swap_PrintMonSpecies();
- PutWindowTilemap(1);
- gMain.state++;
- break;
- case 10:
- Swap_PrintPkmnSwap();
- PutWindowTilemap(0);
- gMain.state++;
- break;
- case 11:
- gMain.state++;
- break;
- case 12:
- if (sFactorySwapScreen->fromSummaryScreen)
- Swap_PrintMonSpecies2();
- gMain.state++;
- break;
- case 13:
- Swap_PrintActionStrings2();
- PutWindowTilemap(3);
- gMain.state++;
- break;
- case 14:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
- SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
- ShowBg(0);
- ShowBg(1);
- ShowBg(2);
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ // Cannot have two same held items.
+ for (j = firstMonId; j < firstMonId + i; j++)
{
- ShowBg(3);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
- }
- else
- {
- HideBg(3);
- }
- gMain.state++;
- break;
- case 15:
- sFactorySwapScreen->fadeSpeciesNameTaskId = CreateTask(Task_SwapFadeSpeciesName, 0);
- if (!sFactorySwapScreen->fromSummaryScreen)
- {
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 0;
- taskId = CreateTask(Task_HandleSwapScreenChooseMons, 0);
- gTasks[taskId].data[0] = 0;
- }
- else
- {
- sub_819EAF8();
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1;
- sFactorySwapScreen->unk22 = FALSE;
- taskId = CreateTask(Task_HandleSwapScreenMenu, 0);
- gTasks[taskId].data[0] = 2;
+ if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ {
+ if (gFacilityTrainerMons[monSetId].species == currSpecies)
+ currSpecies = 0;
+ break;
+ }
}
- SetMainCallback2(Swap_CB2);
- break;
+ if (j != firstMonId + i)
+ continue;
+
+ gSaveBlock2Ptr->frontier.field_E70[i].monId = monSetId;
+ species[i] = gFacilityTrainerMons[monSetId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ monIds[i] = monSetId;
+ i++;
}
}
-static void Swap_InitAllSprites(void)
+static void sub_81A6A08(void)
{
u8 i;
- u8 x;
- struct SpriteTemplate spriteTemplate;
-
- spriteTemplate = gUnknown_08610834;
- spriteTemplate.paletteTag = TAG_PAL_BALL_SELECTED;
+ u8 typesCount[18];
+ u8 usedType[2];
+ gFacilityTrainerMons = gBattleFrontierMons;
+ for (i = 0; i < NUMBER_OF_MON_TYPES; i++)
+ typesCount[i] = 0;
for (i = 0; i < 3; i++)
{
- sFactorySwapScreen->ballSpriteIds[i] = CreateSprite(&spriteTemplate, (48 * i) + 72, 64, 1);
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].data[0] = 0;
- }
- sFactorySwapScreen->cursorSpriteId = CreateSprite(&gUnknown_0861084C, gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x, 88, 0);
- sFactorySwapScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610864, 176, 112, 0);
- sFactorySwapScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_0861087C, 176, 144, 0);
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE;
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecY = 0;
-
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
- x = 240;
- else
- x = 192;
-
- spriteTemplate = gUnknown_0861084C;
- spriteTemplate.tileTag = TAG_TILE_68;
- sFactorySwapScreen->unk8[0][0] = CreateSprite(&spriteTemplate, 240, 120, 10);
+ u32 species = gFacilityTrainerMons[gUnknown_03006298[i]].species;
- spriteTemplate = gUnknown_08610864;
- spriteTemplate.tileTag = TAG_TILE_69;
- sFactorySwapScreen->unk8[0][1] = CreateSprite(&spriteTemplate, 256, 120, 10);
- sFactorySwapScreen->unk8[0][2] = CreateSprite(&spriteTemplate, 288, 120, 10);
-
- spriteTemplate = gUnknown_0861084C;
- spriteTemplate.tileTag = TAG_TILE_6A;
- sFactorySwapScreen->unk8[1][0] = CreateSprite(&spriteTemplate, 240, 120, 1);
-
- spriteTemplate = gUnknown_08610864;
- spriteTemplate.tileTag = TAG_TILE_6B;
- sFactorySwapScreen->unk8[1][1] = CreateSprite(&spriteTemplate, 256, 120, 1);
- spriteTemplate.tileTag = TAG_TILE_6C;
- sFactorySwapScreen->unk8[1][2] = CreateSprite(&spriteTemplate, 288, 120, 1);
-
- spriteTemplate = gUnknown_0861084C;
- spriteTemplate.tileTag = TAG_TILE_68;
- sFactorySwapScreen->unkE[0][0] = CreateSprite(&spriteTemplate, x, 144, 10);
-
- spriteTemplate = gUnknown_08610864;
- spriteTemplate.tileTag = TAG_TILE_69;
- sFactorySwapScreen->unkE[0][1] = CreateSprite(&spriteTemplate, x + 16, 144, 10);
-
- spriteTemplate = gUnknown_0861084C;
- spriteTemplate.tileTag = TAG_TILE_6A;
- sFactorySwapScreen->unkE[1][0] = CreateSprite(&spriteTemplate, x, 144, 1);
-
- spriteTemplate = gUnknown_08610864;
- spriteTemplate.tileTag = TAG_TILE_6C;
- sFactorySwapScreen->unkE[1][1] = CreateSprite(&spriteTemplate, x + 16, 144, 1);
-
- for (i = 0; i < 2; i++)
- {
- gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecY = 0;
-
- gSprites[sFactorySwapScreen->unk8[i][0]].invisible = TRUE;
- gSprites[sFactorySwapScreen->unk8[i][1]].invisible = TRUE;
- gSprites[sFactorySwapScreen->unk8[i][2]].invisible = TRUE;
- gSprites[sFactorySwapScreen->unkE[i][0]].invisible = TRUE;
- gSprites[sFactorySwapScreen->unkE[i][1]].invisible = TRUE;
+ typesCount[gBaseStats[species].type1]++;
+ if (gBaseStats[species].type1 != gBaseStats[species].type2)
+ typesCount[gBaseStats[species].type2]++;
}
- gSprites[sFactorySwapScreen->unkE[0][0]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unkE[0][1]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unk8[0][0]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unk8[0][1]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unk8[0][2]].invisible = FALSE;
-}
-
-static void Swap_DestroyAllSprites(void)
-{
- u8 i, j;
-
- for (i = 0; i < 3; i++)
- DestroySprite(&gSprites[sFactorySwapScreen->ballSpriteIds[i]]);
- DestroySprite(&gSprites[sFactorySwapScreen->cursorSpriteId]);
- DestroySprite(&gSprites[sFactorySwapScreen->menuCursor1SpriteId]);
- DestroySprite(&gSprites[sFactorySwapScreen->menuCursor2SpriteId]);
- for (i = 0; i < 2; i++)
- {
- for (j = 0; j < 3; j++)
- DestroySprite(&gSprites[sFactorySwapScreen->unk8[i][j]]);
- }
- for (i = 0; i < 2; i++)
+ usedType[0] = 0;
+ usedType[1] = 0;
+ for (i = 1; i < NUMBER_OF_MON_TYPES; i++)
{
- for (j = 0; j < 2; j++)
- DestroySprite(&gSprites[sFactorySwapScreen->unkE[i][j]]);
+ if (typesCount[usedType[0]] < typesCount[i])
+ usedType[0] = i;
+ else if (typesCount[usedType[0]] == typesCount[i])
+ usedType[1] = i;
}
-}
-static void Swap_HandleActionCursorChange(u8 cursorId)
-{
- if (cursorId < 3)
- {
- gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE;
- sub_819E8EC();
- gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[cursorId]].pos1.x;
- }
+ gSpecialVar_Result = gSpecialVar_Result; // Needed to match. Don't ask me why.
+ if (typesCount[usedType[0]] != 0 && (typesCount[usedType[0]] > typesCount[usedType[1]] || usedType[0] == usedType[1]))
+ gSpecialVar_Result = usedType[0];
else
- {
- gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE;
- sub_819E838(sFactorySwapScreen->actionsData[cursorId].id);
- }
-}
-
-static void Swap_UpdateBallCursorPosition(s8 direction)
-{
- u8 cursorPos;
- PlaySE(SE_SELECT);
- if (direction > 0) // Move cursor right.
- {
- if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount)
- sFactorySwapScreen->cursorPos++;
- else
- sFactorySwapScreen->cursorPos = 0;
- }
- else // Move cursor left.
- {
- if (sFactorySwapScreen->cursorPos != 0)
- sFactorySwapScreen->cursorPos--;
- else
- sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
- }
-
- cursorPos = sFactorySwapScreen->cursorPos;
- Swap_HandleActionCursorChange(cursorPos);
-}
-
-static void Swap_UpdateActionCursorPosition(s8 direction)
-{
- u8 cursorPos;
- PlaySE(SE_SELECT);
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySwapScreen->cursorPos < 3)
- sFactorySwapScreen->cursorPos = 3;
- else if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount)
- sFactorySwapScreen->cursorPos++;
- else
- sFactorySwapScreen->cursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySwapScreen->cursorPos < 3)
- sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
- else if (sFactorySwapScreen->cursorPos != 0)
- sFactorySwapScreen->cursorPos--;
- else
- sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
- }
-
- cursorPos = sFactorySwapScreen->cursorPos;
- Swap_HandleActionCursorChange(cursorPos);
-}
-
-static void Swap_UpdateYesNoCursorPosition(s8 direction)
-{
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySwapScreen->yesNoCursorPos != 1)
- sFactorySwapScreen->yesNoCursorPos++;
- else
- sFactorySwapScreen->yesNoCursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySwapScreen->yesNoCursorPos != 0)
- sFactorySwapScreen->yesNoCursorPos--;
- else
- sFactorySwapScreen->yesNoCursorPos = 1;
- }
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112;
-}
-
-static void Swap_UpdateMenuCursorPosition(s8 direction)
-{
- PlaySE(SE_SELECT);
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySwapScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1)
- sFactorySwapScreen->menuCursorPos++;
- else
- sFactorySwapScreen->menuCursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySwapScreen->menuCursorPos != 0)
- sFactorySwapScreen->menuCursorPos--;
- else
- sFactorySwapScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1;
- }
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+ gSpecialVar_Result = NUMBER_OF_MON_TYPES;
}
-static void sub_819E838(u8 arg0)
+static void sub_81A6AEC(void)
{
- u8 i;
+ u8 i, j, count;
+ u8 stylePoints[8];
+ count = 0;
+ gFacilityTrainerMons = gBattleFrontierMons;
+ for (i = 0; i < 8; i++)
+ stylePoints[i] = 0;
for (i = 0; i < 3; i++)
{
- if (arg0 == 2)
- {
- gSprites[sFactorySwapScreen->unk8[1][i]].invisible = FALSE;
- if (i < 2)
- gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE;
- }
- else if (arg0 == 3)
+ u16 monSetId = gUnknown_03006298[i];
+ for (j = 0; j < 4; j++)
{
- if (i < 2)
- gSprites[sFactorySwapScreen->unkE[1][i]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ u8 id = GetStyleForMove(gFacilityTrainerMons[monSetId].moves[j]);
+ stylePoints[id]++;
}
}
-}
-static void sub_819E8EC(void)
-{
- u8 i;
-
- for (i = 0; i < 3; i++)
+ gSpecialVar_Result = 0;
+ for (i = 1; i < 8; i++)
{
- gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
- if (i < 2)
- gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE;
+ if (stylePoints[i] >= sRequiredMoveCounts[i - 1])
+ {
+ gSpecialVar_Result = i;
+ count++;
+ }
}
+ if (count > 2)
+ gSpecialVar_Result = 8;
}
-static void Swap_ShowMenuOptions(void)
-{
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
- sFactorySwapScreen->fromSummaryScreen = FALSE;
- else
- sFactorySwapScreen->menuCursorPos = 0;
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176;
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE;
-
- Swap_PrintMenuOptions();
-}
-
-static void Swap_ShowYesNoOptions(void)
-{
- sFactorySwapScreen->yesNoCursorPos = 0;
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176;
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = 112;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = 112;
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE;
-
- Swap_PrintYesNoOptions();
-}
-
-static void sub_819EA64(u8 windowId)
-{
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE;
- FillWindowPixelBuffer(windowId, 0);
- CopyWindowToVram(windowId, 2);
- ClearWindowTilemap(windowId);
-}
-
-static void sub_819EAC0(void)
+static u8 GetStyleForMove(u16 move)
{
- PutWindowTilemap(1);
- FillWindowPixelBuffer(1, 0);
- CopyWindowToVram(1, 2);
-}
-
-static void sub_819EADC(void)
-{
- PutWindowTilemap(7);
- FillWindowPixelBuffer(7, 0);
- CopyWindowToVram(7, 2);
-}
-
-static void sub_819EAF8(void)
-{
- sub_819EAC0();
- PutWindowTilemap(5);
- FillWindowPixelBuffer(5, 0);
- CopyWindowToVram(5, 2);
-}
-
-static void Swap_PrintPkmnSwap(void)
-{
- FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParameterized(0, 1, gText_PkmnSwap, 2, 1, 0, NULL);
- CopyWindowToVram(0, 3);
-}
-
-static void Swap_PrintMonSpecies(void)
-{
- u16 species;
- u8 x;
+ const u16 *moves;
+ u8 i, j;
- FillWindowPixelBuffer(1, 0);
- if (sFactorySwapScreen->cursorPos > 2)
+ for (i = 0; i < ARRAY_COUNT(sMoveStyles); i++)
{
- CopyWindowToVram(1, 2);
- }
- else
- {
- u8 monId = sFactorySwapScreen->cursorPos;
- if (!sFactorySwapScreen->inEnemyScreen)
- species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
- else
- species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
- StringCopy(gStringVar4, gSpeciesNames[species]);
- x = GetStringRightAlignXOffset(1, gStringVar4, 86);
- AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
- CopyWindowToVram(1, 3);
+ for (j = 0, moves = sMoveStyles[i]; moves[j] != 0; j++)
+ {
+ if (moves[j] == move)
+ return i + 1;
+ }
}
+ return 0;
}
-static void Swap_PrintOnInfoWindow(const u8 *str)
-{
- FillWindowPixelBuffer(2, 0);
- AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL);
- CopyWindowToVram(2, 2);
-}
-
-static void Swap_PrintMenuOptions(void)
-{
- PutWindowTilemap(3);
- FillWindowPixelBuffer(3, 0);
- AddTextPrinterParameterized3(3, 1, 15, 1, gUnknown_08610922, 0, gText_Summary2);
- AddTextPrinterParameterized3(3, 1, 15, 17, gUnknown_08610922, 0, gText_Swap);
- AddTextPrinterParameterized3(3, 1, 15, 33, gUnknown_08610922, 0, gText_Rechoose);
- CopyWindowToVram(3, 3);
-}
-
-static void Swap_PrintYesNoOptions(void)
-{
- PutWindowTilemap(4);
- FillWindowPixelBuffer(4, 0);
- AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610922, 0, gText_Yes3);
- AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610922, 0, gText_No3);
- CopyWindowToVram(4, 3);
-}
-
-static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId)
+bool8 sub_81A6BF4(void)
{
- s32 x = GetStringRightAlignXOffset(0, str, 0x46);
- AddTextPrinterParameterized3(windowId, 0, x, y, gUnknown_08610922, 0, str);
+ return (gMapHeader.mapLayoutId == 347 || gMapHeader.mapLayoutId == 348);
}
-static void Swap_PrintActionStrings(void)
+static void sub_81A6C1C(void)
{
- FillWindowPixelBuffer(5, 0);
- switch (sFactorySwapScreen->inEnemyScreen)
- {
- case TRUE:
- Swap_PrintActionString(gText_PkmnForSwap, 0, 5);
- case FALSE:
- Swap_PrintActionString(gText_Cancel3, 24, 5);
- break;
- }
- CopyWindowToVram(5, 3);
-}
+ u8 i;
-static void Swap_PrintActionStrings2(void)
-{
- FillWindowPixelBuffer(3, 0);
- switch (sFactorySwapScreen->inEnemyScreen)
- {
- case TRUE:
- Swap_PrintActionString(gText_PkmnForSwap, 8, 3);
- case FALSE:
- Swap_PrintActionString(gText_Cancel3, 32, 3);
- break;
- }
- CopyWindowToVram(3, 3);
-}
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
+ gFacilityTrainerMons = gBattleFrontierMons;
+ else
+ gFacilityTrainerMons = gSlateportBattleTentMons;
-static void Swap_PrintOneActionString(u8 which)
-{
- switch (which)
+ for (i = 0; i < 3; i++)
{
- case 0:
- if (sFactorySwapScreen->inEnemyScreen == TRUE)
- Swap_PrintActionString(gText_PkmnForSwap, 8, 3);
- break;
- case 1:
- Swap_PrintActionString(gText_Cancel3, 32, 3);
- break;
+ SetMonData(&gPlayerParty[i],
+ MON_DATA_HELD_ITEM,
+ &gBattleFrontierHeldItems[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[i].monId].itemTableId]);
}
- CopyWindowToVram(3, 3);
}
-static void Swap_PrintMonSpecies2(void)
+u8 GetFactoryMonFixedIV(u8 arg0, u8 arg1)
{
- u16 species;
- u8 x;
- u16 pal[5];
+ u8 a1;
+ u8 a2 = (arg1 != 0) ? 1 : 0;
- CpuCopy16(gUnknown_08610918, pal, 8);
- if (!sFactorySwapScreen->fromSummaryScreen)
- pal[4] = gPlttBufferFaded[228];
+ if (arg0 > 8)
+ a1 = 7;
else
- pal[4] = sFactorySwapScreen->unk24;
- LoadPalette(pal, 0xF0, 0xA);
+ a1 = arg0;
- PutWindowTilemap(7);
- FillWindowPixelBuffer(7, 0);
- if (sFactorySwapScreen->cursorPos > 2)
- {
- CopyWindowToVram(7, 3);
- }
- else
- {
- u8 monId = sFactorySwapScreen->cursorPos;
- if (!sFactorySwapScreen->inEnemyScreen)
- species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
- else
- species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
- StringCopy(gStringVar4, gSpeciesNames[species]);
- x = GetStringRightAlignXOffset(1, gStringVar4, 86);
- AddTextPrinterParameterized3(7, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
- CopyWindowToVram(7, 3);
- }
+ return sFixedIVTable[a1][a2];
}
-static void Swap_PrintMonSpecies3(void)
+void FillFactoryBrainParty(void)
{
- u16 species;
- u8 x;
+ s32 i, j, k;
+ u16 species[3];
+ u16 heldItems[3];
+ u8 friendship;
+ s32 monLevel;
+ u8 fixedIV;
+ u32 otId;
- LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
- CpuCopy16(gPlttBufferUnfaded + 240, gPlttBufferFaded + 224, 10);
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
+ fixedIV = GetFactoryMonFixedIV(challengeNum + 2, 0);
+ monLevel = SetFacilityPtrsGetLevel();
+ i = 0;
+ otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
- if (sFactorySwapScreen->cursorPos > 2)
+ while (i != 3)
{
- CopyWindowToVram(1, 2);
- }
- else
- {
- u8 monId = sFactorySwapScreen->cursorPos;
- if (!sFactorySwapScreen->inEnemyScreen)
- species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
- else
- species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
- StringCopy(gStringVar4, gSpeciesNames[species]);
- x = GetStringRightAlignXOffset(1, gStringVar4, 86);
- AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
- CopyWindowToVram(1, 3);
- }
-}
-
-static void Swap_PrintMonCategory(void)
-{
- u16 species;
- u8 text[30];
- u8 x;
- u8 monId = sFactorySwapScreen->cursorPos;
+ u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE);
- FillWindowPixelBuffer(8, 0);
- if (monId > 2)
- {
- CopyWindowToVram(8, 2);
- }
- else
- {
- PutWindowTilemap(8);
- if (!sFactorySwapScreen->inEnemyScreen)
- species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
- else
- species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
- CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text);
- x = GetStringRightAlignXOffset(1, text, 0x76);
- AddTextPrinterParameterized(8, 1, text, x, 1, 0, NULL);
- CopyWindowToVram(8, 2);
- }
-}
+ if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ continue;
+ if (monLevel == 50 && monSetId > 849)
+ continue;
-static void Swap_InitActions(u8 id)
-{
- if (sFactorySwapScreen->fromSummaryScreen != TRUE)
- {
- switch (id)
+ for (j = 0; j < 6; j++)
{
- case ACTIONS_PLAYER_SCREEN:
- sFactorySwapScreen->inEnemyScreen = FALSE;
- sFactorySwapScreen->cursorPos = 0;
- sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_PlayerScreenActions);
- sFactorySwapScreen->actionsData = sSwap_PlayerScreenActions;
- break;
- case ACTIONS_ENEMY_SCREEN:
- sFactorySwapScreen->inEnemyScreen = TRUE;
- sFactorySwapScreen->cursorPos = 0;
- sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_EnemyScreenActions);
- sFactorySwapScreen->actionsData = sSwap_EnemyScreenActions;
- break;
+ if (monSetId == gSaveBlock2Ptr->frontier.field_E70[j].monId)
+ break;
}
- }
-}
-
-static void Swap_RunMenuOptionFunc(u8 taskId)
-{
- sSwap_CurrentTableFunc = sSwap_MenuOptionFuncs[sFactorySwapScreen->menuCursorPos];
- sSwap_CurrentTableFunc(taskId);
-}
-
-static void sub_819F0CC(u8 taskId)
-{
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- sFactorySwapScreen->playerMonId = sFactorySwapScreen->cursorPos;
- sub_819EA64(3);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_819D9EC;
-}
+ if (j != 6)
+ continue;
-static void sub_819F114(u8 taskId)
-{
- gTasks[taskId].data[0] = 6;
- gTasks[taskId].func = Task_FromSwapScreenToSummaryScreen;
-}
-
-static void sub_819F134(u8 taskId)
-{
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- sub_819EA64(3);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
-}
-
-static void Swap_RunActionFunc(u8 taskId)
-{
- sSwap_CurrentTableFunc = sFactorySwapScreen->actionsData[sFactorySwapScreen->cursorPos].func;
- sSwap_CurrentTableFunc(taskId);
-}
+ for (k = 0; k < i; k++)
+ {
+ if (species[k] == gFacilityTrainerMons[monSetId].species)
+ break;
+ }
+ if (k != i)
+ continue;
-static void Swap_ActionCancel(u8 taskId)
-{
- gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 0x10;
- gTasks[taskId].data[7] = (u32)(sub_819CC24);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].func = sub_819D588;
-}
+ for (k = 0; k < i; k++)
+ {
+ if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ break;
+ }
+ if (k != i)
+ continue;
-static void Swap_ActionPkmnForSwap(u8 taskId)
-{
- gTasks[taskId].data[6] = (u32)(sub_819D9EC) >> 0x10;
- gTasks[taskId].data[7] = (u32)(sub_819D9EC);
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_819D588;
-}
+ species[i] = gFacilityTrainerMons[monSetId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i],
+ gFacilityTrainerMons[monSetId].species,
+ monLevel,
+ gFacilityTrainerMons[monSetId].nature,
+ fixedIV,
+ gFacilityTrainerMons[monSetId].evSpread,
+ otId);
-static void Swap_ActionMon(u8 taskId)
-{
- if (!sFactorySwapScreen->inEnemyScreen)
- {
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenMenu) >> 0x10;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenMenu);
- gTasks[taskId].data[5] = 2;
- }
- else if (Swap_AlreadyHasSameSpecies(sFactorySwapScreen->cursorPos) == TRUE)
- {
- sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = Task_SwapCantHaveSameMons;
- return;
- }
- else
- {
- gTasks[taskId].data[6] = (u32)(sub_819CCD4) >> 0x10;
- gTasks[taskId].data[7] = (u32)(sub_819CCD4);
- gTasks[taskId].data[5] = 0;
+ friendship = 0;
+ for (k = 0; k < 4; k++)
+ SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
+ SetMonData(&gEnemyParty[i], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ i++;
}
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_819D588;
-}
-
-static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen)
-{
- *arg0 = CreateSprite(&gUnknown_08610894, 120, 64, 1);
- gSprites[*arg0].callback = sub_819F600;
- gSprites[*arg0].data[7] = swapScreen;
- *arg1 = TRUE;
}
-static void Swap_ShowSummaryMonSprite(void)
+static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2)
{
- struct Pokemon *mon;
- u16 species;
- u32 personality, otId;
-
- sFactorySwapScreen->unk2C.field1 = CreateSprite(&gUnknown_08610894, 120, 64, 1);
- StartSpriteAffineAnim(&gSprites[sFactorySwapScreen->unk2C.field1], 2);
-
- mon = &gPlayerParty[sFactorySwapScreen->cursorPos];
- species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); // BUG: otId and personality should be switched.
- gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
-
- gSprites[sFactorySwapScreen->unk2C.field1].invisible = TRUE;
-}
+ u16 range, ret;
+ u16 adder;
-static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen)
-{
- u8 taskId;
-
- FreeAndDestroyMonPicSprite(arg0.field0);
- taskId = CreateTask(sub_819F7B4, 1);
- gTasks[taskId].data[7] = swapScreen;
- gTasks[taskId].data[6] = arg0.field1;
- gTasks[taskId].func(taskId);
- *arg1 = TRUE;
-}
-
-static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1)
-{
- FreeAndDestroyMonPicSprite(arg0.field0);
- FreeOamMatrix(gSprites[arg0.field1].oam.matrixNum);
- DestroySprite(&gSprites[arg0.field1]);
- *arg1 = FALSE;
-}
-
-static void Task_SwapCantHaveSameMons(u8 taskId)
-{
- if (sFactorySwapScreen->unk30 == TRUE)
- return;
+ if (lvlMode == FRONTIER_LVL_50)
+ adder = 0;
+ else
+ adder = 8;
- switch (gTasks[taskId].data[0])
+ if (challengeNum < 7)
{
- case 0:
- Swap_PrintOnInfoWindow(gText_SamePkmnInPartyAlready);
- sFactorySwapScreen->monSwapped = FALSE;
- gTasks[taskId].data[0]++;
- break;
- case 1:
- if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ if (arg2)
{
- PlaySE(SE_SELECT);
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- gTasks[taskId].data[0]++;
+ range = (sMonsToChooseFrom[adder + challengeNum + 1][1] - sMonsToChooseFrom[adder + challengeNum + 1][0]) + 1;
+ ret = Random() % range;
+ ret += sMonsToChooseFrom[adder + challengeNum + 1][0];
}
- break;
- case 2:
- if (sFactorySwapScreen->unk30 != TRUE)
+ else
{
- FillWindowPixelBuffer(5, 0);
- CopyWindowToVram(5, 2);
- gTasks[taskId].data[0]++;
+ range = (sMonsToChooseFrom[adder + challengeNum][1] - sMonsToChooseFrom[adder + challengeNum][0]) + 1;
+ ret = Random() % range;
+ ret += sMonsToChooseFrom[adder + challengeNum][0];
}
- break;
- case 3:
- Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept);
- gTasks[taskId].data[0]++;
- break;
- case 4:
- Swap_PrintMonSpecies3();
- sub_819EADC();
- sFactorySwapScreen->unk22 = TRUE;
- gTasks[taskId].data[0] = gTasks[taskId].data[5];
- gTasks[taskId].func = Task_HandleSwapScreenChooseMons;
- break;
}
-}
-
-static bool8 Swap_AlreadyHasSameSpecies(u8 monId)
-{
- u8 i;
- u16 species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
-
- for (i = 0; i < 3; i++)
+ else
{
- if (i != sFactorySwapScreen->playerMonId && (u16)(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL)) == species)
- return TRUE;
+ u16 num = challengeNum;
+ if (num != 7)
+ num = 7;
+ range = (sMonsToChooseFrom[adder + num][1] - sMonsToChooseFrom[adder + num][0]) + 1;
+ ret = Random() % range;
+ ret += sMonsToChooseFrom[adder + num][0];
}
- return FALSE;
+
+ return ret;
}
-static void sub_819F600(struct Sprite *sprite)
+u8 sub_81A6F70(u8 battleMode, u8 lvlMode)
{
- u8 taskId;
+ u8 ret;
+ u8 rents = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode];
- if (sprite->affineAnimEnded)
- {
- sprite->invisible = TRUE;
- taskId = CreateTask(sub_819F69C, 1);
- gTasks[taskId].data[7] = sprite->data[7];
- gTasks[taskId].func(taskId);
- sprite->callback = SpriteCallbackDummy;
- }
-}
+ if (rents < 15)
+ ret = 0;
+ else if (rents < 22)
+ ret = 1;
+ else if (rents < 29)
+ ret = 2;
+ else if (rents < 36)
+ ret = 3;
+ else if (rents < 43)
+ ret = 4;
+ else
+ ret = 5;
-static void sub_819F654(struct Sprite *sprite)
-{
- if (sprite->affineAnimEnded)
- {
- FreeOamMatrix(sprite->oam.matrixNum);
- if (sprite->data[7] == TRUE)
- sFactorySwapScreen->unk30 = FALSE;
- else
- sub_819BE20(FALSE);
- DestroySprite(sprite);
- }
+ return ret;
}
-static void sub_819F69C(u8 taskId)
+u32 GetAiScriptsInBattleFactory(void)
{
- struct Task *task = &gTasks[taskId];
- switch (task->data[0])
+ s32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ if (lvlMode == FRONTIER_LVL_TENT)
{
- case 0:
- task->data[3] = 88;
- task->data[24] = 152; // BUG: writing outside the array's bounds.
- task->data[5] = 64;
- task->data[8] = 65;
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
- break;
- case 1:
- ShowBg(3);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
- break;
- case 2:
- task->data[5] -= 4;
- task->data[8] += 4;
- if (task->data[5] <= 32 || task->data[8] >= 96)
- {
- task->data[5] = 32;
- task->data[8] = 96;
- }
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- if (task->data[5] != 32)
- return;
- break;
- default:
- DestroyTask(taskId);
- // UB: Should not use the task after it has been deleted.
- if (gTasks[taskId].data[7] == TRUE)
- Swap_ShowMonSprite();
- else
- Summary_ShowMonSprite();
- return;
+ return 0;
}
- task->data[0]++;
-}
-
-static void sub_819F7B4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- switch (task->data[0])
+ else
{
- default:
- HideBg(3);
- gSprites[task->data[6]].data[7] = task->data[7];
- gSprites[task->data[6]].invisible = FALSE;
- gSprites[task->data[6]].callback = sub_819F654;
- StartSpriteAffineAnim(&gSprites[task->data[6]], 1);
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- DestroyTask(taskId);
- break;
- case 0:
- task->data[3] = 88;
- task->data[24] = 152; // BUG: writing outside the array's bounds.
- task->data[5] = 32;
- task->data[8] = 96;
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
- task->data[0]++;
- break;
- case 1:
- task->data[5] += 4;
- task->data[8] -= 4;
- if (task->data[5] >= 64 || task->data[8] <= 65)
- {
- task->data[5] = 64;
- task->data[8] = 65;
- }
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- if (task->data[5] == 64)
- task->data[0]++;
- break;
+ s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ s32 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
+
+ if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
+ return AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY;
+ else if (challengeNum < 2)
+ return 0;
+ else if (challengeNum < 4)
+ return AI_SCRIPT_CHECK_BAD_MOVE;
+ else
+ return AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY;
}
}
-static void Swap_ShowMonSprite(void)
+void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 moveArg, u8 moveSlot)
{
- struct Pokemon *mon;
- u16 species;
- u32 personality, otId;
-
- if (!sFactorySwapScreen->inEnemyScreen)
- mon = &gPlayerParty[sFactorySwapScreen->cursorPos];
- else
- mon = &gEnemyParty[sFactorySwapScreen->cursorPos];
-
- species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
- gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
-
- sFactorySwapScreen->unk30 = FALSE;
+ u16 move = moveArg;
+ if (moveArg == MOVE_RETURN)
+ move = MOVE_FRUSTRATION;
+ SetMonMoveSlot(mon, move, moveSlot);
}
diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c
new file mode 100644
index 000000000..255cf5aa1
--- /dev/null
+++ b/src/battle_factory_screen.c
@@ -0,0 +1,4111 @@
+#include "global.h"
+#include "battle_factory_screen.h"
+#include "battle_factory.h"
+#include "sprite.h"
+#include "event_data.h"
+#include "overworld.h"
+#include "random.h"
+#include "battle_tower.h"
+#include "text.h"
+#include "palette.h"
+#include "task.h"
+#include "main.h"
+#include "malloc.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "string_util.h"
+#include "international_string_util.h"
+#include "window.h"
+#include "data2.h"
+#include "decompress.h"
+#include "pokemon_summary_screen.h"
+#include "sound.h"
+#include "pokedex.h"
+#include "util.h"
+#include "trainer_pokemon_sprites.h"
+#include "constants/battle_frontier.h"
+#include "constants/songs.h"
+#include "constants/rgb.h"
+
+// Select_ refers to the first Pokemon selection screen where you choose 3 Pokemon.
+// Swap_ refers to the consecutive selection screen where you can keep your Pokemon or swap one with beaten trainer's.
+
+#define MENU_SUMMARY 0
+#define MENU_RENT 1
+#define MENU_DESELECT 1
+#define MENU_OTHERS 2
+#define MENU_OPTIONS_COUNT 3
+
+#define SELECTABLE_MONS_COUNT 6
+
+#define TAG_PAL_BALL_GREY 0x64
+#define TAG_PAL_BALL_SELECTED 0x65
+#define TAG_PAL_66 0x66
+#define TAG_PAL_67 0x67
+
+#define TAG_TILE_64 0x64
+#define TAG_TILE_65 0x65
+#define TAG_TILE_66 0x66
+#define TAG_TILE_67 0x67
+#define TAG_TILE_68 0x68
+#define TAG_TILE_69 0x69
+#define TAG_TILE_6A 0x6A
+#define TAG_TILE_6B 0x6B
+#define TAG_TILE_6C 0x6C
+#define TAG_TILE_6D 0x6D
+
+struct FactorySelecteableMon
+{
+ u16 monSetId;
+ u16 spriteId;
+ u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon
+ struct Pokemon monData;
+};
+
+struct UnkFactoryStruct
+{
+ u8 field0;
+ u8 field1;
+};
+
+struct FactorySelectMonsStruct
+{
+ u8 menuCursorPos;
+ u8 menuCursor1SpriteId;
+ u8 menuCursor2SpriteId;
+ u8 cursorPos;
+ u8 cursorSpriteId;
+ u8 selectingMonsState;
+ bool8 fromSummaryScreen;
+ u8 yesNoCursorPos;
+ u8 unused8;
+ struct FactorySelecteableMon mons[SELECTABLE_MONS_COUNT];
+ struct UnkFactoryStruct unk294[3];
+ bool8 unk2A0;
+ u8 fadeSpeciesNameTaskId;
+ bool8 unk2A2;
+ u16 unk2A4;
+ bool8 unk2A6;
+ u8 unk2A7;
+ u8 unk2A8;
+ u8 unk2A9;
+};
+
+// 'Action' refers to the 3 Selectable mons, Cancel, Pknm for swap windows.
+#define ACTIONS_PLAYER_SCREEN 0
+#define ACTIONS_ENEMY_SCREEN 1
+
+struct SwapActionIdAndFunc
+{
+ u8 id;
+ void (*func)(u8 taskId);
+};
+
+struct FactorySwapMonsStruct
+{
+ u8 menuCursorPos;
+ u8 menuCursor1SpriteId;
+ u8 menuCursor2SpriteId;
+ u8 cursorPos;
+ u8 cursorSpriteId;
+ u8 ballSpriteIds[3];
+ u8 unk8[2][3];
+ u8 unkE[2][2];
+ u8 playerMonId;
+ u8 enemyMonId;
+ bool8 inEnemyScreen;
+ bool8 fromSummaryScreen;
+ u8 yesNoCursorPos;
+ u8 actionsCount;
+ const struct SwapActionIdAndFunc *actionsData;
+ u8 unused1C[4];
+ bool8 monSwapped;
+ u8 fadeSpeciesNameTaskId;
+ bool8 unk22;
+ u16 unk24;
+ bool8 unk26;
+ u8 unk27;
+ u8 unk28;
+ u8 unk29;
+ struct UnkFactoryStruct unk2C;
+ bool8 unk30;
+};
+
+extern u8 (*gUnknown_030062E8)(void);
+extern u8 gUnknown_0203CF20;
+
+extern const u16 gBattleFrontierHeldItems[];
+extern const struct FacilityMon gBattleFrontierMons[];
+extern const struct FacilityMon gSlateportBattleTentMons[];
+extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
+extern const u32 gUnknown_085B18AC[];
+
+// This file's functions.
+static void sub_819A44C(struct Sprite *sprite);
+static void CB2_InitSelectScreen(void);
+static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V);
+static void Select_InitMonsData(void);
+static void Select_InitAllSprites(void);
+static void Select_ShowSummaryMonSprite(void);
+static void Select_PrintSelectMonString(void);
+static void Select_PrintMonSpecies(void);
+static void Select_PrintMonCategory(void);
+static void Select_PrintRentalPkmnString(void);
+static void Select_CopyMonsToPlayerParty(void);
+static void sub_819C4B4(void);
+static void Select_ShowYesNoOptions(void);
+static void sub_819C568(void);
+static void Select_ShowMenuOptions(void);
+static void Select_PrintMenuOptions(void);
+static void Select_PrintYesNoOptions(void);
+static void Task_SelectFadeSpeciesName(u8 taskId);
+static void sub_819C1D0(u8 taskId);
+static void Task_HandleSelectionScreenChooseMons(u8 taskId);
+static void Task_HandleSelectionScreenMenu(u8 taskId);
+static void CreateFrontierFactorySelectableMons(u8 firstMonId);
+static void CreateTentFactorySelectableMons(u8 firstMonId);
+static void Select_SetBallSpritePaletteNum(u8 id);
+static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1);
+static void sub_819B958(u8 windowId);
+static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen);
+static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen);
+static u8 Select_RunMenuOptionFunc(void);
+static u8 sub_819BC9C(void);
+static u8 Select_OptionSummary(void);
+static u8 Select_OptionOthers(void);
+static u8 Select_OptionRentDeselect(void);
+static bool32 Select_AreSpeciesValid(u16 monSetId);
+static void Swap_DestroyAllSprites(void);
+static void Swap_ShowYesNoOptions(void);
+static void sub_819E8EC(void);
+static void sub_819EAC0(void);
+static void Swap_UpdateYesNoCursorPosition(s8 direction);
+static void Swap_UpdateMenuCursorPosition(s8 direction);
+static void sub_819EA64(u8 windowId);
+static void sub_819D770(u8 taskId);
+static void Task_HandleSwapScreenChooseMons(u8 taskId);
+static void sub_819D588(u8 taskId);
+static void sub_819F7B4(u8 taskId);
+static void Swap_PrintOnInfoWindow(const u8 *str);
+static void Swap_ShowMenuOptions(void);
+static void Swap_PrintMenuOptions(void);
+static void Swap_PrintYesNoOptions(void);
+static void Swap_PrintMonSpecies(void);
+static void Swap_PrintMonSpecies2(void);
+static void Swap_PrintMonSpecies3(void);
+static void Swap_PrintMonCategory(void);
+static void Swap_InitAllSprites(void);
+static void Swap_PrintPkmnSwap(void);
+static void sub_819EADC(void);
+static void sub_819EAF8(void);
+static void CB2_InitSwapScreen(void);
+static void Swap_ShowSummaryMonSprite(void);
+static void Swap_UpdateActionCursorPosition(s8 direction);
+static void Swap_UpdateBallCursorPosition(s8 direction);
+static void Swap_RunMenuOptionFunc(u8 taskId);
+static void sub_819F0CC(u8 taskId);
+static void sub_819F114(u8 taskId);
+static void sub_819F134(u8 taskId);
+static void Swap_RunActionFunc(u8 taskId);
+static void sub_819F69C(u8 taskId);
+static void Task_SwapCantHaveSameMons(u8 taskId);
+static void Swap_ShowMonSprite(void);
+static void Swap_PrintActionStrings(void);
+static void Swap_PrintActionStrings2(void);
+static void Swap_PrintOneActionString(u8 which);
+static void Swap_InitActions(u8 id);
+static void sub_819E838(u8 arg0);
+static bool8 Swap_AlreadyHasSameSpecies(u8 monId);
+static void sub_819F600(struct Sprite *sprite);
+static void Swap_ActionMon(u8 taskId);
+static void Swap_ActionCancel(u8 taskId);
+static void Swap_ActionPkmnForSwap(u8 taskId);
+
+// Ewram variables
+static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL;
+static EWRAM_DATA u8 *sSelectMonCardBgTilesetBuffer = NULL;
+static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL;
+static EWRAM_DATA u8 *sSelectMonCardBgTilemapBuffer = NULL;
+static EWRAM_DATA struct Pokemon *sFactorySelectMons = NULL;
+static EWRAM_DATA u8 *sSwapMenuTilesetBuffer = NULL;
+static EWRAM_DATA u8 *sSwapMonCardBgTilesetBuffer = NULL;
+static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL;
+static EWRAM_DATA u8 *sSwapMonCardBgTilemapBuffer = NULL;
+
+// IWRAM bss
+static IWRAM_DATA struct FactorySelectMonsStruct *sFactorySelectScreen;
+static IWRAM_DATA void (*sSwap_CurrentTableFunc)(u8 taskId);
+static IWRAM_DATA struct FactorySwapMonsStruct *sFactorySwapScreen;
+
+// Const rom data.
+static const u16 gUnknown_0860F13C[] = INCBIN_U16("graphics/unknown/unknown_60F13C.gbapal");
+static const u16 gUnknown_0860F15C[] = INCBIN_U16("graphics/unknown/unknown_60F15C.gbapal");
+static const u16 gUnknown_0860F17C[] = INCBIN_U16("graphics/unknown/unknown_60F17C.gbapal");
+static const u8 gUnknown_0860F1BC[] = INCBIN_U8("graphics/unknown/unknown_60F1BC.4bpp");
+static const u8 gUnknown_0860F3BC[] = INCBIN_U8("graphics/unknown/unknown_60F3BC.4bpp");
+static const u8 gUnknown_0860F43C[] = INCBIN_U8("graphics/unknown/unknown_60F43C.4bpp");
+static const u8 gUnknown_0860F53C[] = INCBIN_U8("graphics/unknown/unknown_60F53C.4bpp");
+static const u8 gUnknown_0860F63C[] = INCBIN_U8("graphics/unknown/unknown_60F63C.4bpp");
+static const u8 gUnknown_0860F6BC[] = INCBIN_U8("graphics/unknown/unknown_60F6BC.4bpp");
+static const u8 gUnknown_0860F7BC[] = INCBIN_U8("graphics/unknown/unknown_60F7BC.4bpp");
+static const u8 gUnknown_0860F83C[] = INCBIN_U8("graphics/unknown/unknown_60F83C.4bpp");
+static const u8 gUnknown_0860F93C[] = INCBIN_U8("graphics/unknown/unknown_60F93C.4bpp");
+static const u8 gUnknown_0860FA3C[] = INCBIN_U8("graphics/unknown/unknown_60FA3C.4bpp");
+static const u8 gUnknown_0861023C[] = INCBIN_U8("graphics/unknown/unknown_61023C.bin");
+static const u8 gUnknown_0861033C[] = INCBIN_U8("graphics/unknown/unknown_61033C.4bpp");
+static const u16 gUnknown_0861039C[] = INCBIN_U16("graphics/unknown/unknown_61039C.gbapal");
+
+static const struct SpriteSheet gUnknown_086103BC[] =
+{
+ {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65},
+ {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66},
+ {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67},
+ {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D},
+ {},
+};
+
+static const struct CompressedSpriteSheet gUnknown_086103E4[] =
+{
+ {gUnknown_085B18AC, 0x800, TAG_TILE_64},
+ {},
+};
+
+static const struct SpritePalette gUnknown_086103F4[] =
+{
+ {gUnknown_0860F13C, TAG_PAL_BALL_GREY},
+ {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED},
+ {gUnknown_0860F17C, TAG_PAL_66},
+ {gUnknown_0861039C, TAG_PAL_67},
+ {},
+};
+
+u8 static (* const sSelect_MenuOptionFuncs[])(void) =
+{
+ [MENU_SUMMARY] = Select_OptionSummary,
+ [MENU_RENT] /*Or Deselect*/ = Select_OptionRentDeselect,
+ [MENU_OTHERS] = Select_OptionOthers
+};
+
+static const struct BgTemplate sSelect_BgTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 24,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 25,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 27,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+};
+
+static const struct WindowTemplate sSelect_WindowTemplates[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 2,
+ .width = 12,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x0001,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 2,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 14,
+ .baseBlock = 0x0019,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 15,
+ .width = 20,
+ .height = 3,
+ .paletteNum = 15,
+ .baseBlock = 0x002f,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 14,
+ .width = 8,
+ .height = 6,
+ .paletteNum = 15,
+ .baseBlock = 0x006b,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 14,
+ .width = 8,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x009b,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 15,
+ .tilemapTop = 0,
+ .width = 15,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x00bb,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+static const u16 gUnknown_0861046C[] = INCBIN_U16("graphics/unknown/unknown_61046C.gbapal");
+
+static const u8 gUnknown_08610476[] = {0x00, 0x02, 0x00};
+static const u8 gUnknown_08610479[] = {0x00, 0x04, 0x00};
+
+static const struct OamData gUnknown_0861047C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_08610484 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_0861048C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_08610494 =
+{
+ .y = 0,
+ .affineMode = 3,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 1,
+};
+
+static const union AnimCmd gUnknown_0861049C[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_086104A4[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_086104AC[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_086104B4[] =
+{
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd * const gUnknown_086104FC[] =
+{
+ gUnknown_0861049C,
+};
+
+static const union AnimCmd * const gUnknown_08610500[] =
+{
+ gUnknown_086104A4,
+};
+
+static const union AnimCmd * const gUnknown_08610504[] =
+{
+ gUnknown_086104AC,
+ gUnknown_086104B4,
+};
+
+static const union AffineAnimCmd gUnknown_0861050C[] =
+{
+ AFFINEANIMCMD_FRAME(5, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(16, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(64, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(128, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(256, 5, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_0861056C[] =
+{
+ AFFINEANIMCMD_FRAME(128, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(64, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(16, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(5, 5, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_086105BC[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd * const gUnknown_086105CC[] =
+{
+ gUnknown_0861050C,
+ gUnknown_0861056C,
+ gUnknown_086105BC,
+};
+
+static const struct SpriteTemplate gUnknown_086105D8 =
+{
+ .tileTag = TAG_TILE_64,
+ .paletteTag = TAG_PAL_BALL_GREY,
+ .oam = &gUnknown_0861047C,
+ .anims = gUnknown_08610504,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_819A44C
+};
+
+static const struct SpriteTemplate gUnknown_086105F0 =
+{
+ .tileTag = TAG_TILE_65,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_08610484,
+ .anims = gUnknown_086104FC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610608 =
+{
+ .tileTag = TAG_TILE_66,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_0861048C,
+ .anims = gUnknown_086104FC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610620 =
+{
+ .tileTag = TAG_TILE_67,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_0861048C,
+ .anims = gUnknown_086104FC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610638 =
+{
+ .tileTag = TAG_TILE_6D,
+ .paletteTag = TAG_PAL_67,
+ .oam = &gUnknown_08610494,
+ .anims = gUnknown_08610500,
+ .images = NULL,
+ .affineAnims = gUnknown_086105CC,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteSheet gUnknown_08610650[] =
+{
+ {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65},
+ {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66},
+ {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67},
+ {gUnknown_0860F63C, sizeof(gUnknown_0860F63C), TAG_TILE_68},
+ {gUnknown_0860F6BC, sizeof(gUnknown_0860F6BC), TAG_TILE_69},
+ {gUnknown_0860F7BC, 0x100, TAG_TILE_6A},
+ {gUnknown_0860F83C, sizeof(gUnknown_0860F83C), TAG_TILE_6B},
+ {gUnknown_0860F93C, sizeof(gUnknown_0860F93C), TAG_TILE_6C},
+ {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D},
+ {},
+};
+
+static const struct CompressedSpriteSheet gUnknown_086106A0[] =
+{
+ {gUnknown_085B18AC, 0x800, TAG_TILE_64},
+ {},
+};
+
+static const struct SpritePalette gUnknown_086106B0[] =
+{
+ {gUnknown_0860F13C, TAG_PAL_BALL_GREY},
+ {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED},
+ {gUnknown_0860F17C, TAG_PAL_66},
+ {gUnknown_0861039C, TAG_PAL_67},
+ {},
+};
+
+static const struct OamData gUnknown_086106D8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_086106E0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_086106E8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_086106F0 =
+{
+ .y = 0,
+ .affineMode = 3,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 1,
+};
+
+static const union AnimCmd gUnknown_086106F8[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_08610700[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_08610708[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_08610710[] =
+{
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd * const gUnknown_08610758[] =
+{
+ gUnknown_086106F8,
+};
+
+static const union AnimCmd * const gUnknown_0861075C[] =
+{
+ gUnknown_08610700,
+};
+
+static const union AnimCmd * const gUnknown_08610760[] =
+{
+ gUnknown_08610708,
+ gUnknown_08610710,
+};
+
+static const union AffineAnimCmd gUnknown_08610768[] =
+{
+ AFFINEANIMCMD_FRAME(5, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(16, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(64, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(128, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(256, 5, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_086107C8[] =
+{
+ AFFINEANIMCMD_FRAME(128, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(64, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(16, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(5, 5, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_08610818[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd * const gUnknown_08610828[] =
+{
+ gUnknown_08610768,
+ gUnknown_086107C8,
+ gUnknown_08610818,
+};
+
+static const struct SpriteTemplate gUnknown_08610834 =
+{
+ .tileTag = TAG_TILE_64,
+ .paletteTag = TAG_PAL_BALL_GREY,
+ .oam = &gUnknown_086106D8,
+ .anims = gUnknown_08610760,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_819A44C
+};
+
+static const struct SpriteTemplate gUnknown_0861084C =
+{
+ .tileTag = TAG_TILE_65,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_086106E0,
+ .anims = gUnknown_08610758,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610864 =
+{
+ .tileTag = TAG_TILE_66,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_086106E8,
+ .anims = gUnknown_08610758,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0861087C =
+{
+ .tileTag = TAG_TILE_67,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_086106E8,
+ .anims = gUnknown_08610758,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610894 =
+{
+ .tileTag = TAG_TILE_6D,
+ .paletteTag = TAG_PAL_67,
+ .oam = &gUnknown_086106F0,
+ .anims = gUnknown_0861075C,
+ .images = NULL,
+ .affineAnims = gUnknown_08610828,
+ .callback = SpriteCallbackDummy
+};
+
+void static (* const sSwap_MenuOptionFuncs[])(u8 taskId) =
+{
+ sub_819F114,
+ sub_819F0CC,
+ sub_819F134,
+};
+
+static const struct BgTemplate sSwap_BgTemplates[4] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 24,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 25,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 26,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 27,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+};
+
+static const struct WindowTemplate sSwap_WindowTemplates[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 2,
+ .width = 12,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x0001,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 19,
+ .tilemapTop = 2,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 14,
+ .baseBlock = 0x0019,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 15,
+ .width = 20,
+ .height = 3,
+ .paletteNum = 15,
+ .baseBlock = 0x002f,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 14,
+ .width = 9,
+ .height = 6,
+ .paletteNum = 15,
+ .baseBlock = 0x006b,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 14,
+ .width = 8,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x00a1,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 21,
+ .tilemapTop = 15,
+ .width = 9,
+ .height = 5,
+ .paletteNum = 14,
+ .baseBlock = 0x006b,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 10,
+ .tilemapTop = 2,
+ .width = 4,
+ .height = 2,
+ .paletteNum = 14,
+ .baseBlock = 0x00c1,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 2,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x00c9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 15,
+ .tilemapTop = 0,
+ .width = 15,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x00df,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+static const u16 gUnknown_08610918[] = {RGB_BLACK, RGB_BLACK, RGB_WHITE, RGB_BLACK, RGB_RED}; // Palette.
+static const u8 gUnknown_08610922[] = {0x0, 0x02, 0x0};
+static const u8 gUnknown_08610925[] = {0x0, 0x04, 0x0};
+
+static const struct SwapActionIdAndFunc sSwap_PlayerScreenActions[] =
+{
+ {1, Swap_ActionMon},
+ {1, Swap_ActionMon},
+ {1, Swap_ActionMon},
+ {3, Swap_ActionCancel},
+};
+
+static const struct SwapActionIdAndFunc sSwap_EnemyScreenActions[] =
+{
+ {1, Swap_ActionMon},
+ {1, Swap_ActionMon},
+ {1, Swap_ActionMon},
+ {2, Swap_ActionPkmnForSwap},
+ {3, Swap_ActionCancel},
+};
+
+// gfx
+extern const u8 gFrontierFactorySelectMenu_Gfx[];
+extern const u8 gFrontierFactorySelectMenu_Tilemap[];
+extern const u16 gFrontierFactorySelectMenu_Pal[];
+
+// text
+extern const u8 gText_RentalPkmn2[];
+extern const u8 gText_SelectFirstPkmn[];
+extern const u8 gText_SelectSecondPkmn[];
+extern const u8 gText_SelectThirdPkmn[];
+extern const u8 gText_TheseThreePkmnOkay[];
+extern const u8 gText_CantSelectSamePkmn[];
+extern const u8 gText_Summary[];
+extern const u8 gText_Rechoose[];
+extern const u8 gText_Deselect[];
+extern const u8 gText_Rent[];
+extern const u8 gText_Others2[];
+extern const u8 gText_Yes2[];
+extern const u8 gText_Yes3[];
+extern const u8 gText_No2[];
+extern const u8 gText_No3[];
+extern const u8 gText_QuitSwapping[];
+extern const u8 gText_AcceptThisPkmn[];
+extern const u8 gText_SelectPkmnToAccept[];
+extern const u8 gText_SelectPkmnToSwap[];
+extern const u8 gText_PkmnSwap[];
+extern const u8 gText_Swap[];
+extern const u8 gText_Summary2[];
+extern const u8 gText_PkmnForSwap[];
+extern const u8 gText_SamePkmnInPartyAlready[];
+extern const u8 gText_Cancel3[];
+
+// code
+static void sub_819A44C(struct Sprite *sprite)
+{
+ if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED))
+ {
+ if (sprite->animEnded)
+ {
+ if (sprite->data[0] != 0)
+ {
+ sprite->data[0]--;
+ }
+ else if (Random() % 5 == 0)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->data[0] = 32;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ }
+ }
+ else
+ {
+ StartSpriteAnimIfDifferent(sprite, 1);
+ }
+ }
+ else
+ {
+ StartSpriteAnimIfDifferent(sprite, 0);
+ }
+}
+
+static void Select_CB2(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+static void Select_VblankCb(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void DoBattleFactorySelectScreen(void)
+{
+ sFactorySelectScreen = NULL;
+ SetMainCallback2(CB2_InitSelectScreen);
+}
+
+static void CB2_InitSelectScreen(void)
+{
+ u8 taskId;
+
+ switch (gMain.state)
+ {
+ case 0:
+ if (sFactorySelectMons != NULL)
+ FREE_AND_SET_NULL(sFactorySelectMons);
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sSelect_BgTemplates, ARRAY_COUNT(sSelect_BgTemplates));
+ InitWindows(sSelect_WindowTemplates);
+ DeactivateAllTextPrinters();
+ gMain.state++;
+ break;
+ case 1:
+ sSelectMenuTilesetBuffer = Alloc(0x440);
+ sSelectMonCardBgTilesetBuffer = AllocZeroed(0x440);
+ sSelectMenuTilemapBuffer = Alloc(0x800);
+ sSelectMonCardBgTilemapBuffer = AllocZeroed(0x800);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WIN1H, 0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSelectMenuTilesetBuffer, 0x440);
+ CpuCopy16(gUnknown_0861033C, sSelectMonCardBgTilesetBuffer, 0x60);
+ LoadBgTiles(1, sSelectMenuTilesetBuffer, 0x440, 0);
+ LoadBgTiles(3, sSelectMonCardBgTilesetBuffer, 0x60, 0);
+ CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, 0x800);
+ LoadBgTilemap(1, sSelectMenuTilemapBuffer, 0x800, 0);
+ LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40);
+ LoadPalette(gUnknown_0861046C, 0xF0, 8);
+ LoadPalette(gUnknown_0861046C, 0xE0, 10);
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ gPlttBufferUnfaded[228] = sFactorySelectScreen->unk2A4;
+ LoadPalette(gUnknown_0861039C, 0x20, 4);
+ gMain.state++;
+ break;
+ case 3:
+ SetBgTilemapBuffer(3, sSelectMonCardBgTilemapBuffer);
+ CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8);
+ CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 2, 4, 8, 8);
+ CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 20, 4, 8, 8);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ break;
+ case 4:
+ LoadSpritePalettes(gUnknown_086103F4);
+ LoadSpriteSheets(gUnknown_086103BC);
+ LoadCompressedObjectPic(gUnknown_086103E4);
+ ShowBg(0);
+ ShowBg(1);
+ SetVBlankCallback(Select_VblankCb);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP);
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ {
+ Select_SetWinRegs(88, 152, 32, 96);
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ }
+ else
+ {
+ HideBg(3);
+ }
+ gMain.state++;
+ break;
+ case 5:
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ sFactorySelectScreen->cursorPos = gUnknown_0203CF20;
+ Select_InitMonsData();
+ Select_InitAllSprites();
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ Select_ShowSummaryMonSprite();
+ gMain.state++;
+ break;
+ case 6:
+ Select_PrintSelectMonString();
+ PutWindowTilemap(2);
+ gMain.state++;
+ break;
+ case 7:
+ Select_PrintMonCategory();
+ PutWindowTilemap(5);
+ gMain.state++;
+ break;
+ case 8:
+ Select_PrintMonSpecies();
+ PutWindowTilemap(1);
+ gMain.state++;
+ break;
+ case 9:
+ Select_PrintRentalPkmnString();
+ PutWindowTilemap(0);
+ gMain.state++;
+ break;
+ case 10:
+ sFactorySelectScreen->fadeSpeciesNameTaskId = CreateTask(Task_SelectFadeSpeciesName, 0);
+ if (!sFactorySelectScreen->fromSummaryScreen)
+ {
+ gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 0;
+ taskId = CreateTask(Task_HandleSelectionScreenChooseMons, 0);
+ gTasks[taskId].data[0] = 0;
+ }
+ else
+ {
+ gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 1;
+ sFactorySelectScreen->unk2A2 = FALSE;
+ taskId = CreateTask(Task_HandleSelectionScreenMenu, 0);
+ gTasks[taskId].data[0] = 13;
+ }
+ SetMainCallback2(Select_CB2);
+ break;
+ }
+}
+
+static void Select_InitMonsData(void)
+{
+ u8 i;
+
+ if (sFactorySelectScreen != NULL)
+ return;
+
+ sFactorySelectScreen = AllocZeroed(sizeof(*sFactorySelectScreen));
+ sFactorySelectScreen->cursorPos = 0;
+ sFactorySelectScreen->selectingMonsState = 1;
+ sFactorySelectScreen->fromSummaryScreen = FALSE;
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ sFactorySelectScreen->mons[i].selectedId = 0;
+
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
+ CreateFrontierFactorySelectableMons(0);
+ else
+ CreateTentFactorySelectableMons(0);
+}
+
+static void Select_InitAllSprites(void)
+{
+ u8 i, cursorPos;
+ s16 x;
+
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ {
+ sFactorySelectScreen->mons[i].spriteId = CreateSprite(&gUnknown_086105D8, (35 * i) + 32, 64, 1);
+ gSprites[sFactorySelectScreen->mons[i].spriteId].data[0] = 0;
+ Select_SetBallSpritePaletteNum(i);
+ }
+ cursorPos = sFactorySelectScreen->cursorPos;
+ x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x;
+ sFactorySelectScreen->cursorSpriteId = CreateSprite(&gUnknown_086105F0, x, 88, 0);
+ sFactorySelectScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610608, 176, 112, 0);
+ sFactorySelectScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_08610620, 176, 144, 0);
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecY = 0;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecY = 0;
+}
+
+static void Select_DestroyAllSprites(void)
+{
+ u8 i;
+
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ DestroySprite(&gSprites[sFactorySelectScreen->mons[i].spriteId]);
+
+ DestroySprite(&gSprites[sFactorySelectScreen->cursorSpriteId]);
+ DestroySprite(&gSprites[sFactorySelectScreen->menuCursor1SpriteId]);
+ DestroySprite(&gSprites[sFactorySelectScreen->menuCursor2SpriteId]);
+}
+
+static void Select_UpdateBallCursorPosition(s8 direction)
+{
+ u8 cursorPos;
+ if (direction > 0) // Move cursor right.
+ {
+ if (sFactorySelectScreen->cursorPos != SELECTABLE_MONS_COUNT - 1)
+ sFactorySelectScreen->cursorPos++;
+ else
+ sFactorySelectScreen->cursorPos = 0;
+ }
+ else // Move cursor left.
+ {
+ if (sFactorySelectScreen->cursorPos != 0)
+ sFactorySelectScreen->cursorPos--;
+ else
+ sFactorySelectScreen->cursorPos = SELECTABLE_MONS_COUNT - 1;
+ }
+
+ cursorPos = sFactorySelectScreen->cursorPos;
+ gSprites[sFactorySelectScreen->cursorSpriteId].pos1.x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x;
+}
+
+static void Select_UpdateMenuCursorPosition(s8 direction)
+{
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySelectScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1)
+ sFactorySelectScreen->menuCursorPos++;
+ else
+ sFactorySelectScreen->menuCursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySelectScreen->menuCursorPos != 0)
+ sFactorySelectScreen->menuCursorPos--;
+ else
+ sFactorySelectScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1;
+ }
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
+}
+
+static void Select_UpdateYesNoCursorPosition(s8 direction)
+{
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySelectScreen->yesNoCursorPos != 1)
+ sFactorySelectScreen->yesNoCursorPos++;
+ else
+ sFactorySelectScreen->yesNoCursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySelectScreen->yesNoCursorPos != 0)
+ sFactorySelectScreen->yesNoCursorPos--;
+ else
+ sFactorySelectScreen->yesNoCursorPos = 1;
+ }
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112;
+}
+
+static void Select_HandleMonSelectionChange(void)
+{
+ u8 i, paletteNum;
+ u8 cursorPos = sFactorySelectScreen->cursorPos;
+ if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon.
+ {
+ paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
+ if (sFactorySelectScreen->selectingMonsState == 3 && sFactorySelectScreen->mons[cursorPos].selectedId == 1)
+ {
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ {
+ if (sFactorySelectScreen->mons[i].selectedId == 2)
+ break;
+ }
+ if (i == SELECTABLE_MONS_COUNT)
+ return;
+ else
+ sFactorySelectScreen->mons[i].selectedId = 1;
+ }
+ sFactorySelectScreen->mons[cursorPos].selectedId = 0;
+ sFactorySelectScreen->selectingMonsState--;
+ }
+ else // Select a mon.
+ {
+ paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
+ sFactorySelectScreen->mons[cursorPos].selectedId = sFactorySelectScreen->selectingMonsState;
+ sFactorySelectScreen->selectingMonsState++;
+ }
+
+ gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].oam.paletteNum = paletteNum;
+}
+
+static void Select_SetBallSpritePaletteNum(u8 id)
+{
+ u8 palNum;
+
+ if (sFactorySelectScreen->mons[id].selectedId)
+ palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
+ else
+ palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
+
+ gSprites[sFactorySelectScreen->mons[id].spriteId].oam.paletteNum = palNum;
+}
+
+static void Task_FromSelectScreenToSummaryScreen(u8 taskId)
+{
+ u8 i;
+ u8 currMonId;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 6:
+ gPlttBufferUnfaded[228] = gPlttBufferFaded[228];
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].data[0] = 7;
+ break;
+ case 7:
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
+ sub_819F444(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0);
+ Select_DestroyAllSprites();
+ FREE_AND_SET_NULL(sSelectMenuTilesetBuffer);
+ FREE_AND_SET_NULL(sSelectMonCardBgTilesetBuffer);
+ FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
+ FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer);
+ FreeAllWindowBuffers();
+ gTasks[taskId].data[0] = 8;
+ }
+ break;
+ case 8:
+ sFactorySelectScreen->unk2A4 = gPlttBufferUnfaded[228];
+ DestroyTask(taskId);
+ sFactorySelectScreen->fromSummaryScreen = TRUE;
+ currMonId = sFactorySelectScreen->cursorPos;
+ sFactorySelectMons = AllocZeroed(sizeof(struct Pokemon) * SELECTABLE_MONS_COUNT);
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ sFactorySelectMons[i] = sFactorySelectScreen->mons[i].monData;
+ ShowPokemonSummaryScreen(1, sFactorySelectMons, currMonId, SELECTABLE_MONS_COUNT - 1, CB2_InitSelectScreen);
+ break;
+ }
+}
+
+static void Task_CloseSelectionScreen(u8 taskId)
+{
+ if (sFactorySelectScreen->unk2A0 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ Select_CopyMonsToPlayerParty();
+ DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
+ Select_DestroyAllSprites();
+ FREE_AND_SET_NULL(sSelectMenuTilesetBuffer);
+ FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
+ FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer);
+ FREE_AND_SET_NULL(sFactorySelectScreen);
+ FreeAllWindowBuffers();
+ SetMainCallback2(CB2_ReturnToFieldContinueScript);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+ }
+}
+
+static void Task_HandleSelectionScreenYesNo(u8 taskId)
+{
+ if (sFactorySelectScreen->unk2A0 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 10:
+ sub_819C4B4();
+ gTasks[taskId].data[0] = 4;
+ break;
+ case 4:
+ Select_ShowYesNoOptions();
+ gTasks[taskId].data[0] = 5;
+ break;
+ case 5:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (sFactorySelectScreen->yesNoCursorPos == 0)
+ {
+ sub_819C568();
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_CloseSelectionScreen;
+ }
+ else
+ {
+ sub_819B958(4);
+ sub_819BC9C();
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819B958(4);
+ sub_819BC9C();
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateYesNoCursorPosition(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateYesNoCursorPosition(1);
+ }
+ break;
+ }
+ }
+}
+
+static void Task_HandleSelectionScreenMenu(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 2:
+ if (!sFactorySelectScreen->fromSummaryScreen)
+ sub_819F2B4(&sFactorySelectScreen->unk294[1].field1, &sFactorySelectScreen->unk2A0, FALSE);
+ gTasks[taskId].data[0] = 9;
+ break;
+ case 9:
+ if (sFactorySelectScreen->unk2A0 != TRUE)
+ {
+ Select_ShowMenuOptions();
+ sFactorySelectScreen->fromSummaryScreen = FALSE;
+ gTasks[taskId].data[0] = 3;
+ }
+ break;
+ case 3:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ u8 retVal;
+ PlaySE(SE_SELECT);
+ retVal = Select_RunMenuOptionFunc();
+ if (retVal == 1)
+ {
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ else if (retVal == 2)
+ {
+ gTasks[taskId].data[0] = 10;
+ gTasks[taskId].func = Task_HandleSelectionScreenYesNo;
+ }
+ else if (retVal == 3)
+ {
+ gTasks[taskId].data[0] = 11;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 6;
+ gTasks[taskId].func = Task_FromSelectScreenToSummaryScreen;
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
+ sub_819B958(3);
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateMenuCursorPosition(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateMenuCursorPosition(1);
+ }
+ break;
+ case 12:
+ if (!gPaletteFade.active)
+ {
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ {
+ gPlttBufferFaded[228] = sFactorySelectScreen->unk2A4;
+ gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244];
+ }
+ sFactorySelectScreen->fromSummaryScreen = FALSE;
+ gTasks[taskId].data[0] = 3;
+ }
+ break;
+ case 13:
+ Select_ShowMenuOptions();
+ gTasks[taskId].data[0] = 12;
+ break;
+ }
+}
+
+static void Task_HandleSelectionScreenChooseMons(u8 taskId)
+{
+ if (sFactorySelectScreen->unk2A0 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].data[0] = 1;
+ sFactorySelectScreen->unk2A2 = TRUE;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sFactorySelectScreen->unk2A2 = FALSE;
+ gTasks[taskId].data[0] = 2;
+ gTasks[taskId].func = Task_HandleSelectionScreenMenu;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateBallCursorPosition(-1);
+ Select_PrintMonCategory();
+ Select_PrintMonSpecies();
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateBallCursorPosition(1);
+ Select_PrintMonCategory();
+ Select_PrintMonSpecies();
+ }
+ break;
+ case 11:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
+ Select_PrintSelectMonString();
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ }
+ break;
+ }
+ }
+}
+
+static void CreateFrontierFactorySelectableMons(u8 firstMonId)
+{
+ u8 i, j = 0;
+ u8 ivs = 0;
+ u8 level = 0;
+ u8 happiness = 0;
+ u32 otId = 0;
+ u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
+ u8 var_28 = 0;
+
+ gFacilityTrainerMons = gBattleFrontierMons;
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
+ level = 100;
+ else
+ level = 50;
+
+ var_28 = sub_81A6F70(battleMode, lvlMode);
+ otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
+
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ {
+ u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
+ sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
+ if (i < var_28)
+ ivs = GetFactoryMonFixedIV(challengeNum + 1, 0);
+ else
+ ivs = GetFactoryMonFixedIV(challengeNum, 0);
+ CreateMonWithEVSpreadNatureOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
+ gFacilityTrainerMons[monSetId].species,
+ level,
+ gFacilityTrainerMons[monSetId].nature,
+ ivs,
+ gFacilityTrainerMons[monSetId].evSpread,
+ otId);
+ happiness = 0;
+ for (j = 0; j < 4; j++)
+ SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ }
+}
+
+static void CreateTentFactorySelectableMons(u8 firstMonId)
+{
+ u8 i, j;
+ u8 ivs = 0;
+ u8 level = 30;
+ u8 happiness = 0;
+ u32 otId = 0;
+
+ gFacilityTrainerMons = gSlateportBattleTentMons;
+ otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
+
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ {
+ u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
+ sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
+ CreateMonWithEVSpreadNatureOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
+ gFacilityTrainerMons[monSetId].species,
+ level,
+ gFacilityTrainerMons[monSetId].nature,
+ ivs,
+ gFacilityTrainerMons[monSetId].evSpread,
+ otId);
+ happiness = 0;
+ for (j = 0; j < 4; j++)
+ SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ }
+}
+
+static void Select_CopyMonsToPlayerParty(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ {
+ if (sFactorySelectScreen->mons[j].selectedId == i + 1)
+ {
+ gPlayerParty[i] = sFactorySelectScreen->mons[j].monData;
+ gSaveBlock2Ptr->frontier.field_E70[i].monId = sFactorySelectScreen->mons[j].monSetId;
+ gSaveBlock2Ptr->frontier.field_E70[i].personality = GetMonData(&gPlayerParty[i].box, MON_DATA_PERSONALITY, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[i].abilityBit = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ALT_ABILITY, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[i].ivs = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ATK_IV, NULL);
+ break;
+ }
+ }
+ }
+ CalculatePlayerPartyCount();
+}
+
+static void Select_ShowMenuOptions(void)
+{
+ if (!sFactorySelectScreen->fromSummaryScreen)
+ sFactorySelectScreen->menuCursorPos = 0;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176;
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE;
+
+ Select_PrintMenuOptions();
+}
+
+static void Select_ShowYesNoOptions(void)
+{
+ sFactorySelectScreen->yesNoCursorPos = 0;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176;
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = 112;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = 112;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE;
+
+ Select_PrintYesNoOptions();
+}
+
+static void sub_819B958(u8 windowId)
+{
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
+ FillWindowPixelBuffer(windowId, 0);
+ CopyWindowToVram(windowId, 2);
+ ClearWindowTilemap(windowId);
+}
+
+static void Select_PrintRentalPkmnString(void)
+{
+ FillWindowPixelBuffer(0, 0);
+ AddTextPrinterParameterized(0, 1, gText_RentalPkmn2, 2, 1, 0, NULL);
+ CopyWindowToVram(0, 3);
+}
+
+static void Select_PrintMonSpecies(void)
+{
+ u16 species;
+ u8 x;
+ u8 monId = sFactorySelectScreen->cursorPos;
+
+ FillWindowPixelBuffer(1, 0);
+ species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL);
+ StringCopy(gStringVar4, gSpeciesNames[species]);
+ x = GetStringRightAlignXOffset(1, gStringVar4, 86);
+ AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610479, 0, gStringVar4);
+ CopyWindowToVram(1, 2);
+}
+
+static void Select_PrintSelectMonString(void)
+{
+ const u8 *str = NULL;
+
+ FillWindowPixelBuffer(2, 0);
+ if (sFactorySelectScreen->selectingMonsState == 1)
+ str = gText_SelectFirstPkmn;
+ else if (sFactorySelectScreen->selectingMonsState == 2)
+ str = gText_SelectSecondPkmn;
+ else if (sFactorySelectScreen->selectingMonsState == 3)
+ str = gText_SelectThirdPkmn;
+ else
+ str = gText_TheseThreePkmnOkay;
+
+ AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL);
+ CopyWindowToVram(2, 2);
+}
+
+static void Select_PrintCantSelectSameMon(void)
+{
+ FillWindowPixelBuffer(2, 0);
+ AddTextPrinterParameterized(2, 1, gText_CantSelectSamePkmn, 2, 5, 0, NULL);
+ CopyWindowToVram(2, 2);
+}
+
+static void Select_PrintMenuOptions(void)
+{
+ u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
+
+ PutWindowTilemap(3);
+ FillWindowPixelBuffer(3, 0);
+ AddTextPrinterParameterized3(3, 1, 7, 1, gUnknown_08610476, 0, gText_Summary);
+ if (selectedId != 0)
+ AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Deselect);
+ else
+ AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Rent);
+
+ AddTextPrinterParameterized3(3, 1, 7, 33, gUnknown_08610476, 0, gText_Others2);
+ CopyWindowToVram(3, 3);
+}
+
+static void Select_PrintYesNoOptions(void)
+{
+ PutWindowTilemap(4);
+ FillWindowPixelBuffer(4, 0);
+ AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610476, 0, gText_Yes2);
+ AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610476, 0, gText_No2);
+ CopyWindowToVram(4, 3);
+}
+
+static u8 Select_RunMenuOptionFunc(void)
+{
+ gUnknown_030062E8 = sSelect_MenuOptionFuncs[sFactorySelectScreen->menuCursorPos];
+ return gUnknown_030062E8();
+}
+
+static u8 Select_OptionRentDeselect(void)
+{
+ u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
+ u16 monSetId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monSetId;
+ if (selectedId == 0 && !Select_AreSpeciesValid(monSetId))
+ {
+ Select_PrintCantSelectSameMon();
+ sub_819B958(3);
+ return 3;
+ }
+ else
+ {
+ sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
+ Select_HandleMonSelectionChange();
+ Select_PrintSelectMonString();
+ sub_819B958(3);
+ if (sFactorySelectScreen->selectingMonsState > 3)
+ return 2;
+ else
+ return 1;
+ }
+}
+
+static u8 sub_819BC9C(void)
+{
+ sub_819C568();
+ Select_HandleMonSelectionChange();
+ Select_PrintSelectMonString();
+ sub_819B958(3);
+ if (sFactorySelectScreen->selectingMonsState > 3)
+ return 2;
+ else
+ return 1;
+}
+
+static u8 Select_OptionSummary(void)
+{
+ return 0;
+}
+
+static u8 Select_OptionOthers(void)
+{
+ sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
+ sub_819B958(3);
+ return 1;
+}
+
+static void Select_PrintMonCategory(void)
+{
+ u16 species;
+ u8 text[30];
+ u8 x;
+ u8 monId = sFactorySelectScreen->cursorPos;
+ if (monId < SELECTABLE_MONS_COUNT)
+ {
+ PutWindowTilemap(5);
+ FillWindowPixelBuffer(5, 0);
+ species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL);
+ CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text);
+ x = GetStringRightAlignXOffset(1, text, 0x76);
+ AddTextPrinterParameterized(5, 1, text, x, 1, 0, NULL);
+ CopyWindowToVram(5, 2);
+ }
+}
+
+static void Summary_ShowMonSprite(void)
+{
+ u8 monId = sFactorySelectScreen->cursorPos;
+ struct Pokemon *mon = &sFactorySelectScreen->mons[monId].monData;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
+ gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0;
+
+ sFactorySelectScreen->unk2A0 = FALSE;
+}
+
+static void sub_819BE20(bool8 arg0)
+{
+ sFactorySelectScreen->unk2A0 = arg0;
+}
+
+static void Select_ShowSummaryMonSprite(void)
+{
+ struct Pokemon *mon;
+ u16 species;
+ u32 personality, otId;
+
+ sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1);
+ StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 2);
+
+ mon = &sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monData;
+ species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
+ gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0;
+
+ gSprites[sFactorySelectScreen->unk294[1].field1].invisible = TRUE;
+}
+
+static void Select_ShowChosenMonsSprites(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ {
+ if (sFactorySelectScreen->mons[j].selectedId == i + 1)
+ {
+ struct Pokemon *mon = &sFactorySelectScreen->mons[j].monData;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySelectScreen->unk294[i].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, (i * 72) + 16, 32, i + 13, 0xFFFF);
+ gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecY = 0;
+ break;
+ }
+ }
+ }
+ sFactorySelectScreen->unk2A0 = FALSE;
+}
+
+static void sub_819C040(struct Sprite *sprite)
+{
+ u8 taskId;
+
+ if (sprite->affineAnimEnded
+ && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded
+ && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ gSprites[sFactorySelectScreen->unk294[0].field1].invisible = TRUE;
+ gSprites[sFactorySelectScreen->unk294[2].field1].invisible = TRUE;
+
+ taskId = CreateTask(sub_819C1D0, 1);
+ gTasks[taskId].func(taskId);
+
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_819C100(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded
+ && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded
+ && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[0].field1].oam.matrixNum);
+ FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[2].field1].oam.matrixNum);
+
+ sFactorySelectScreen->unk2A0 = FALSE;
+
+ DestroySprite(&gSprites[sFactorySelectScreen->unk294[0].field1]);
+ DestroySprite(&gSprites[sFactorySelectScreen->unk294[2].field1]);
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_819C1D0(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[3] = 16;
+ task->data[24] = 224; // BUG: writing outside the array's bounds.
+ task->data[5] = 64;
+ task->data[8] = 65;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+ break;
+ case 1:
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ break;
+ case 2:
+ task->data[5] -= 4;
+ task->data[8] += 4;
+ if (task->data[5] <= 32 || task->data[8] >= 96)
+ {
+ task->data[5] = 32;
+ task->data[8] = 96;
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ if (task->data[5] != 32)
+ return;
+ break;
+ default:
+ DestroyTask(taskId);
+ Select_ShowChosenMonsSprites();
+ return;
+ }
+ task->data[0]++;
+}
+
+static void sub_819C2D4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ default:
+ HideBg(3);
+ gSprites[sFactorySelectScreen->unk294[1].field1].invisible = FALSE;
+ gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C100;
+ gSprites[sFactorySelectScreen->unk294[0].field1].invisible = FALSE;
+ gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy;
+ gSprites[sFactorySelectScreen->unk294[2].field1].invisible = FALSE;
+ gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy;
+ StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 1);
+ StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[0].field1], 1);
+ StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[2].field1], 1);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ DestroyTask(taskId);
+ break;
+ case 0:
+ task->data[3] = 16;
+ task->data[24] = 224; // BUG: writing outside the array's bounds.
+ task->data[5] = 32;
+ task->data[8] = 96;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[5] += 4;
+ task->data[8] -= 4;
+ if (task->data[5] >= 64 || task->data[8] <= 65)
+ {
+ task->data[5] = 64;
+ task->data[8] = 65;
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ if (task->data[5] == 64)
+ task->data[0]++;
+ break;
+ }
+}
+
+static void sub_819C4B4(void)
+{
+ sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1);
+ sFactorySelectScreen->unk294[0].field1 = CreateSprite(&gUnknown_08610638, 44, 64, 1);
+ sFactorySelectScreen->unk294[2].field1 = CreateSprite(&gUnknown_08610638, 196, 64, 1);
+
+ gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C040;
+ gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy;
+ gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy;
+
+ sFactorySelectScreen->unk2A0 = TRUE;
+}
+
+static void sub_819C568(void)
+{
+ u8 taskId;
+
+ FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[0].field0);
+ FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[1].field0);
+ FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[2].field0);
+
+ taskId = CreateTask(sub_819C2D4, 1);
+ gTasks[taskId].func(taskId);
+
+ sFactorySelectScreen->unk2A0 = TRUE;
+}
+
+static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V)
+{
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(mWin0H, nWin0H));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(mWin0V, nWin0V));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+}
+
+static bool32 Select_AreSpeciesValid(u16 monSetId)
+{
+ u8 i, j;
+ u32 species = gFacilityTrainerMons[monSetId].species;
+ u8 selectState = sFactorySelectScreen->selectingMonsState;
+
+ for (i = 1; i < selectState; i++)
+ {
+ for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ {
+ if (sFactorySelectScreen->mons[j].selectedId == i)
+ {
+ if (gFacilityTrainerMons[sFactorySelectScreen->mons[j].monSetId].species == species)
+ return FALSE;
+
+ break;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+static void Task_SelectFadeSpeciesName(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ sFactorySelectScreen->unk2A7 = 0;
+ sFactorySelectScreen->unk2A8 = 0;
+ sFactorySelectScreen->unk2A6 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 1:
+ if (sFactorySelectScreen->unk2A2)
+ {
+ if (sFactorySelectScreen->unk2A9)
+ {
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ sFactorySelectScreen->unk2A7++;
+ if (sFactorySelectScreen->unk2A7 > 6)
+ {
+ sFactorySelectScreen->unk2A7 = 0;
+ if (!sFactorySelectScreen->unk2A6)
+ sFactorySelectScreen->unk2A8--;
+ else
+ sFactorySelectScreen->unk2A8++;
+ }
+ BlendPalettes(0x4000, sFactorySelectScreen->unk2A8, 0);
+ if (sFactorySelectScreen->unk2A8 > 5)
+ {
+ sFactorySelectScreen->unk2A6 = FALSE;
+ }
+ else if (sFactorySelectScreen->unk2A8 == 0)
+ {
+ gTasks[taskId].data[0] = 2;
+ sFactorySelectScreen->unk2A6 = TRUE;
+ }
+ }
+ }
+ break;
+ case 2:
+ if (sFactorySelectScreen->unk2A9 > 14)
+ {
+ sFactorySelectScreen->unk2A9 = 0;
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ sFactorySelectScreen->unk2A9++;
+ }
+ break;
+ }
+}
+
+// Swap Screen's section begins here.
+
+static void Swap_CB2(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+static void Swap_VblankCb(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void CopySwappedMonData(void)
+{
+ u8 happiness;
+
+ gPlayerParty[sFactorySwapScreen->playerMonId] = gEnemyParty[sFactorySwapScreen->enemyMonId];
+ happiness = 0;
+ SetMonData(&gPlayerParty[sFactorySwapScreen->playerMonId], MON_DATA_FRIENDSHIP, &happiness);
+ gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].monId = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].monId;
+ gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].ivs = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].ivs;
+ gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].personality = GetMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId], MON_DATA_PERSONALITY, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].abilityBit = GetBoxMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId].box, MON_DATA_ALT_ABILITY, NULL);
+}
+
+static void Task_FromSwapScreenToSummaryScreen(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 6:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].data[0] = 7;
+ break;
+ case 7:
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId);
+ sub_819F444(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30);
+ Swap_DestroyAllSprites();
+ FREE_AND_SET_NULL(sSwapMenuTilesetBuffer);
+ FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer);
+ FREE_AND_SET_NULL(sSwapMenuTilemapBuffer);
+ FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer);
+ FreeAllWindowBuffers();
+ gTasks[taskId].data[0] = 8;
+ }
+ break;
+ case 8:
+ DestroyTask(taskId);
+ sFactorySwapScreen->fromSummaryScreen = TRUE;
+ sFactorySwapScreen->unk24 = gPlttBufferUnfaded[244];
+ ShowPokemonSummaryScreen(0, gPlayerParty, sFactorySwapScreen->cursorPos, 3 - 1, CB2_InitSwapScreen);
+ break;
+ }
+}
+
+static void Task_CloseSwapScreen(u8 taskId)
+{
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (sFactorySwapScreen->monSwapped == TRUE)
+ {
+ gTasks[taskId].data[0]++;
+ gSpecialVar_Result = 0;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 2;
+ gSpecialVar_Result = 1;
+ }
+ break;
+ case 1:
+ if (sFactorySwapScreen->monSwapped == TRUE)
+ {
+ sFactorySwapScreen->enemyMonId = sFactorySwapScreen->cursorPos;
+ CopySwappedMonData();
+ }
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (!UpdatePaletteFade())
+ {
+ DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId);
+ Swap_DestroyAllSprites();
+ FREE_AND_SET_NULL(sSwapMenuTilesetBuffer);
+ FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer);
+ FREE_AND_SET_NULL(sSwapMenuTilemapBuffer);
+ FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer);
+ FREE_AND_SET_NULL(sFactorySwapScreen);
+ FreeAllWindowBuffers();
+ SetMainCallback2(CB2_ReturnToFieldContinueScript);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+ }
+}
+
+static void Task_HandleSwapScreenYesNo(u8 taskId)
+{
+ u16 loPtr, hiPtr;
+
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 4:
+ Swap_ShowYesNoOptions();
+ gTasks[taskId].data[0] = 5;
+ break;
+ case 5:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (sFactorySwapScreen->yesNoCursorPos == 0)
+ {
+ gTasks[taskId].data[1] = 1;
+ hiPtr = gTasks[taskId].data[6];
+ loPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
+ }
+ else
+ {
+ gTasks[taskId].data[1] = 0;
+ sub_819EA64(4);
+ hiPtr = gTasks[taskId].data[6];
+ loPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gTasks[taskId].data[1] = 0;
+ sub_819EA64(4);
+ hiPtr = gTasks[taskId].data[6];
+ loPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ Swap_UpdateYesNoCursorPosition(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ Swap_UpdateYesNoCursorPosition(1);
+ }
+ break;
+ }
+ }
+}
+
+static void sub_819CBDC(u8 taskId)
+{
+ if (gTasks[taskId].data[1] == 1)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_CloseSwapScreen;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+ }
+}
+
+static void sub_819CC24(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ Swap_PrintOnInfoWindow(gText_QuitSwapping);
+ sFactorySwapScreen->monSwapped = FALSE;
+ gTasks[taskId].data[0] = 4;
+ gTasks[taskId].data[6] = (u32)(sub_819CBDC) >> 16;
+ gTasks[taskId].data[7] = (u32)(sub_819CBDC);
+ gTasks[taskId].func = Task_HandleSwapScreenYesNo;
+ }
+}
+
+static void sub_819CC74(u8 taskId)
+{
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ if (gTasks[taskId].data[1] == 1)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_CloseSwapScreen;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+ }
+}
+
+static void sub_819CCD4(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
+ Swap_PrintOnInfoWindow(gText_AcceptThisPkmn);
+ sFactorySwapScreen->monSwapped = TRUE;
+ gTasks[taskId].data[0] = 4;
+ gTasks[taskId].data[6] = (u32)(sub_819CC74) >> 16;
+ gTasks[taskId].data[7] = (u32)(sub_819CC74);
+ gTasks[taskId].func = Task_HandleSwapScreenYesNo;
+ }
+}
+
+static void Task_HandleSwapScreenMenu(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 2:
+ if (!sFactorySwapScreen->fromSummaryScreen)
+ sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
+ gTasks[taskId].data[0] = 9;
+ break;
+ case 9:
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ Swap_ShowMenuOptions();
+ gTasks[taskId].data[0] = 3;
+ }
+ break;
+ case 3:
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ Swap_RunMenuOptionFunc(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ sub_819EA64(3);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ Swap_UpdateMenuCursorPosition(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ Swap_UpdateMenuCursorPosition(1);
+ }
+ }
+ break;
+ }
+}
+
+static void Task_HandleSwapScreenChooseMons(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (!gPaletteFade.active)
+ {
+ sFactorySwapScreen->unk22 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sFactorySwapScreen->unk22 = FALSE;
+ Swap_PrintMonSpecies2();
+ sub_819EAC0();
+ Swap_RunActionFunc(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sFactorySwapScreen->unk22 = FALSE;
+ Swap_PrintMonSpecies2();
+ sub_819EAC0();
+ gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 16;
+ gTasks[taskId].data[7] = (u32)(sub_819CC24);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].func = sub_819D588;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ Swap_UpdateBallCursorPosition(-1);
+ Swap_PrintMonCategory();
+ Swap_PrintMonSpecies();
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ Swap_UpdateBallCursorPosition(1);
+ Swap_PrintMonCategory();
+ Swap_PrintMonSpecies();
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ Swap_UpdateActionCursorPosition(1);
+ Swap_PrintMonCategory();
+ Swap_PrintMonSpecies();
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ Swap_UpdateActionCursorPosition(-1);
+ Swap_PrintMonCategory();
+ Swap_PrintMonSpecies();
+ }
+ break;
+ }
+}
+
+static void Task_SwapFadeSpeciesName(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ sFactorySwapScreen->unk27 = 0;
+ sFactorySwapScreen->unk28 = 0;
+ sFactorySwapScreen->unk26 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 1:
+ if (sFactorySwapScreen->unk22)
+ {
+ if (sFactorySwapScreen->unk29)
+ {
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ sFactorySwapScreen->unk27++;
+ if (sFactorySwapScreen->unk27 > 6)
+ {
+ sFactorySwapScreen->unk27 = 0;
+ if (!sFactorySwapScreen->unk26)
+ sFactorySwapScreen->unk28--;
+ else
+ sFactorySwapScreen->unk28++;
+ }
+ BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0);
+ if (sFactorySwapScreen->unk28 > 5)
+ {
+ sFactorySwapScreen->unk26 = FALSE;
+ }
+ else if (sFactorySwapScreen->unk28 == 0)
+ {
+ gTasks[taskId].data[0] = 2;
+ sFactorySwapScreen->unk26 = TRUE;
+ }
+ }
+ }
+ break;
+ case 2:
+ if (sFactorySwapScreen->unk29 > 14)
+ {
+ sFactorySwapScreen->unk29 = 0;
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ sFactorySwapScreen->unk29++;
+ }
+ break;
+ }
+}
+
+static void Task_SwapFadeSpeciesName2(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ sFactorySwapScreen->unk27 = 0;
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ LoadPalette(&gPlttBufferUnfaded[0xF0], 0xE0, 0xA);
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if (sFactorySwapScreen->unk28 > 15)
+ {
+ gTasks[taskId].data[4] = 1;
+ gTasks[taskId].data[0]++;
+ }
+ sFactorySwapScreen->unk27++;
+ if (sFactorySwapScreen->unk27 > 3)
+ {
+ sFactorySwapScreen->unk27 = 0;
+ gPlttBufferUnfaded[244] = gPlttBufferFaded[228];
+ sFactorySwapScreen->unk28++;
+ }
+ BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0);
+ break;
+ }
+}
+
+static void sub_819D12C(u8 taskId)
+{
+ s8 i;
+ u8 var_2C;
+ bool8 destroyTask;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 1:
+ var_2C = 0;
+ for (i = 2; i >= 0; i--)
+ {
+ if (i != 2)
+ {
+ u8 posX = var_2C - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
+ if (posX == 16 || gTasks[taskId].data[i + 2] == 1)
+ {
+ var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10;
+ }
+ else if (posX > 16)
+ {
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[i + 1]].pos1.x - 48;
+ }
+ }
+ else
+ {
+ var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10;
+ }
+
+ if (gTasks[taskId].data[i + 1] == 1)
+ {
+ if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x > (i * 48) + 72)
+ {
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = (i * 48) + 72;
+ destroyTask = TRUE;
+ }
+ else if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x == (i * 48) + 72)
+ {
+ destroyTask = TRUE;
+ }
+ else
+ {
+ destroyTask = FALSE;
+ }
+ }
+ else
+ {
+ destroyTask = FALSE;
+ }
+
+ if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x - 16 > 240)
+ {
+ var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = -16;
+ if (sFactorySwapScreen->inEnemyScreen == TRUE)
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
+ else
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
+
+ gTasks[taskId].data[i + 1] = 1;
+ }
+ }
+ if (destroyTask == TRUE)
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_819D324(u8 taskId)
+{
+ u8 i, j;
+ s32 posX = 0;
+ s8 r4 = gTasks[taskId].data[3];
+ bool8 r1;
+ s16 currPosX;
+ u8 taskId2;
+
+ if (gTasks[taskId].data[2] == 1)
+ r4 *= -1;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ currPosX = gSprites[sFactorySwapScreen->unk8[0][0]].pos1.x;
+ if (!gTasks[taskId].data[2])
+ {
+ if (currPosX + r4 < 240)
+ {
+ r1 = TRUE;
+ }
+ else
+ {
+ r1 = FALSE;
+ posX = 240;
+ }
+ }
+ else
+ {
+ if (currPosX + r4 > 160)
+ {
+ r1 = TRUE;
+ }
+ else
+ {
+ r1 = FALSE;
+ posX = 160;
+ }
+ }
+
+ if (r1 == TRUE)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 2; j++)
+ gSprites[sFactorySwapScreen->unk8[j][i]].pos1.x += r4;
+ }
+ }
+ else
+ {
+ for (j = 0; j < 2; j++)
+ {
+ gSprites[sFactorySwapScreen->unk8[j][0]].pos1.x = posX;
+ gSprites[sFactorySwapScreen->unk8[j][1]].pos1.x = posX + 16;
+ gSprites[sFactorySwapScreen->unk8[j][2]].pos1.x = posX + 48;
+ }
+ taskId2 = gTasks[taskId].data[1];
+ gTasks[taskId2].data[3] = 1;
+ DestroyTask(taskId);
+ }
+ break;
+ case 1:
+ currPosX = gSprites[sFactorySwapScreen->unkE[0][0]].pos1.x;
+ if (!gTasks[taskId].data[2])
+ {
+ if (currPosX + r4 < 240)
+ {
+ r1 = TRUE;
+ }
+ else
+ {
+ r1 = FALSE;
+ posX = 240;
+ }
+ }
+ else
+ {
+ if (currPosX + r4 > 192)
+ {
+ r1 = TRUE;
+ }
+ else
+ {
+ r1 = FALSE;
+ posX = 192;
+ }
+ }
+
+ if (r1 == TRUE)
+ {
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 2; j++)
+ gSprites[sFactorySwapScreen->unkE[j][i]].pos1.x += r4;
+ }
+ }
+ else
+ {
+ for (j = 0; j < 2; j++)
+ {
+ gSprites[sFactorySwapScreen->unkE[j][0]].pos1.x = posX;
+ gSprites[sFactorySwapScreen->unkE[j][1]].pos1.x = posX + 16;
+ }
+ taskId2 = gTasks[taskId].data[1];
+ gTasks[taskId2].data[4] = 1;
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void sub_819D588(u8 taskId)
+{
+ u8 anotherTaskId;
+ u16 loPtr, hiPtr;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
+ Swap_PrintActionStrings();
+ PutWindowTilemap(5);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ sub_819EA64(3);
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ BeginNormalPaletteFade(0x4000, 0, 0, 0x10, gUnknown_0860F13C[37]);
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ FillWindowPixelBuffer(5, 0);
+ CopyWindowToVram(5, 2);
+ if (sFactorySwapScreen->inEnemyScreen == TRUE)
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[3] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 0;
+ gTasks[anotherTaskId].data[2] = 0;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[2] = 5;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[3] = 1;
+ gTasks[taskId].data[4] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 1;
+ gTasks[anotherTaskId].data[2] = 0;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[0] += 2;
+ }
+ }
+ break;
+ case 4:
+ if (gTasks[taskId].data[2] == 0)
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[4] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 1;
+ gTasks[anotherTaskId].data[2] = 0;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ gTasks[taskId].data[2]--;
+ }
+ break;
+ case 5:
+ if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1)
+ {
+ gTasks[taskId].data[0] = gTasks[taskId].data[5];
+ loPtr = gTasks[taskId].data[6];
+ hiPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr));
+ }
+ break;
+ }
+}
+
+static void sub_819D770(u8 taskId)
+{
+ u8 anotherTaskId;
+ u16 loPtr, hiPtr;
+ if (sFactorySwapScreen->unk30 == TRUE)
+ return;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (sFactorySwapScreen->inEnemyScreen == TRUE)
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[3] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 0;
+ gTasks[anotherTaskId].data[2] = 1;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[2] = 10;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[3] = 1;
+ gTasks[taskId].data[4] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 1;
+ gTasks[anotherTaskId].data[2] = 1;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[0] += 2;
+ }
+ break;
+ case 1:
+ if (gTasks[taskId].data[2] == 0)
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[4] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 1;
+ gTasks[anotherTaskId].data[2] = 1;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ gTasks[taskId].data[2]--;
+ }
+ break;
+ case 2:
+ if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1)
+ {
+ gPlttBufferFaded[226] = gUnknown_0860F13C[37];
+ Swap_PrintActionStrings();
+ PutWindowTilemap(5);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ BeginNormalPaletteFade(0x4000, 0, 0x10, 0, gUnknown_0860F13C[37]);
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ Swap_PrintOneActionString(0);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 5:
+ Swap_PrintOneActionString(1);
+ PutWindowTilemap(3);
+ gTasks[taskId].data[0]++;
+ break;
+ case 6:
+ FillWindowPixelBuffer(5, 0);
+ CopyWindowToVram(5, 2);
+ gTasks[taskId].data[0]++;
+ break;
+ case 7:
+ if (!sFactorySwapScreen->inEnemyScreen)
+ Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap);
+ else
+ Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept);
+ if (sFactorySwapScreen->cursorPos < 3)
+ gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE;
+ Swap_PrintMonCategory();
+ gTasks[taskId].data[0]++;
+ break;
+ case 8:
+ Swap_PrintMonSpecies3();
+ sub_819EADC();
+ sFactorySwapScreen->unk22 = TRUE;
+ gTasks[taskId].data[0] = gTasks[taskId].data[5];
+ loPtr = gTasks[taskId].data[6];
+ hiPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr));
+ break;
+ }
+}
+
+static void sub_819D9EC(u8 taskId)
+{
+ u8 i;
+ if (sFactorySwapScreen->unk30 == TRUE)
+ return;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ Swap_PrintMonSpecies3();
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ sub_819EADC();
+ gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE;
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ CreateTask(sub_819D12C, 0);
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName2;
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (!FuncIsActiveTask(sub_819D12C) && gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[4] == 1)
+ {
+ sub_819EAC0();
+ if (!sFactorySwapScreen->inEnemyScreen)
+ {
+ Swap_InitActions(ACTIONS_ENEMY_SCREEN);
+ }
+ else
+ {
+ Swap_InitActions(ACTIONS_PLAYER_SCREEN);
+ for (i = 0; i < 3; i++)
+ gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ }
+ gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x;
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName;
+ sFactorySwapScreen->unk27 = 0;
+ sFactorySwapScreen->unk28 = 6;
+ sFactorySwapScreen->unk26 = FALSE;
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 4:
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+ break;
+ }
+}
+
+static void Swap_InitStruct(void)
+{
+ if (sFactorySwapScreen == NULL)
+ {
+ sFactorySwapScreen = AllocZeroed(sizeof(*sFactorySwapScreen));
+ sFactorySwapScreen->cursorPos = 0;
+ sFactorySwapScreen->unk30 = FALSE;
+ sFactorySwapScreen->fromSummaryScreen = FALSE;
+ }
+}
+
+void DoBattleFactorySwapScreen(void)
+{
+ sFactorySwapScreen = NULL;
+ SetMainCallback2(CB2_InitSwapScreen);
+}
+
+static void CB2_InitSwapScreen(void)
+{
+ u8 taskId;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sSwap_BgTemplates, ARRAY_COUNT(sSwap_BgTemplates));
+ InitWindows(sSwap_WindowTemplates);
+ DeactivateAllTextPrinters();
+ gMain.state++;
+ break;
+ case 1:
+ sSwapMenuTilesetBuffer = Alloc(0x440);
+ sSwapMonCardBgTilesetBuffer = AllocZeroed(0x440);
+ sSwapMenuTilemapBuffer = Alloc(0x800);
+ sSwapMonCardBgTilemapBuffer = AllocZeroed(0x800);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WIN1H, 0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ ResetAllPicSprites();
+ CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSwapMenuTilesetBuffer, 0x440);
+ CpuCopy16(gUnknown_0861033C, sSwapMonCardBgTilesetBuffer, 0x60);
+ LoadBgTiles(1, sSwapMenuTilesetBuffer, 0x440, 0);
+ LoadBgTiles(3, sSwapMonCardBgTilesetBuffer, 0x60, 0);
+ CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, 0x800);
+ LoadBgTilemap(1, sSwapMenuTilemapBuffer, 0x800, 0);
+ LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40);
+ LoadPalette(gUnknown_08610918, 0xF0, sizeof(gUnknown_08610918));
+ LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
+ LoadPalette(gUnknown_0861039C, 0x20, 4);
+ gMain.state++;
+ break;
+ case 3:
+ SetBgTilemapBuffer(3, sSwapMonCardBgTilemapBuffer);
+ CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ break;
+ case 4:
+ LoadSpritePalettes(gUnknown_086106B0);
+ LoadSpriteSheets(gUnknown_08610650);
+ LoadCompressedObjectPic(gUnknown_086106A0);
+ SetVBlankCallback(Swap_VblankCb);
+ gMain.state++;
+ break;
+ case 5:
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ sFactorySwapScreen->cursorPos = gUnknown_0203CF20;
+ gMain.state++;
+ break;
+ case 6:
+ Swap_InitStruct();
+ Swap_InitAllSprites();
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ Swap_ShowSummaryMonSprite();
+ Swap_InitActions(ACTIONS_PLAYER_SCREEN);
+ gMain.state++;
+ break;
+ case 7:
+ Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap);
+ PutWindowTilemap(2);
+ gMain.state++;
+ break;
+ case 8:
+ Swap_PrintMonCategory();
+ PutWindowTilemap(8);
+ gMain.state++;
+ break;
+ case 9:
+ if (!sFactorySwapScreen->fromSummaryScreen)
+ Swap_PrintMonSpecies();
+ PutWindowTilemap(1);
+ gMain.state++;
+ break;
+ case 10:
+ Swap_PrintPkmnSwap();
+ PutWindowTilemap(0);
+ gMain.state++;
+ break;
+ case 11:
+ gMain.state++;
+ break;
+ case 12:
+ if (sFactorySwapScreen->fromSummaryScreen)
+ Swap_PrintMonSpecies2();
+ gMain.state++;
+ break;
+ case 13:
+ Swap_PrintActionStrings2();
+ PutWindowTilemap(3);
+ gMain.state++;
+ break;
+ case 14:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ {
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ }
+ else
+ {
+ HideBg(3);
+ }
+ gMain.state++;
+ break;
+ case 15:
+ sFactorySwapScreen->fadeSpeciesNameTaskId = CreateTask(Task_SwapFadeSpeciesName, 0);
+ if (!sFactorySwapScreen->fromSummaryScreen)
+ {
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 0;
+ taskId = CreateTask(Task_HandleSwapScreenChooseMons, 0);
+ gTasks[taskId].data[0] = 0;
+ }
+ else
+ {
+ sub_819EAF8();
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1;
+ sFactorySwapScreen->unk22 = FALSE;
+ taskId = CreateTask(Task_HandleSwapScreenMenu, 0);
+ gTasks[taskId].data[0] = 2;
+ }
+ SetMainCallback2(Swap_CB2);
+ break;
+ }
+}
+
+static void Swap_InitAllSprites(void)
+{
+ u8 i;
+ u8 x;
+ struct SpriteTemplate spriteTemplate;
+
+ spriteTemplate = gUnknown_08610834;
+ spriteTemplate.paletteTag = TAG_PAL_BALL_SELECTED;
+
+ for (i = 0; i < 3; i++)
+ {
+ sFactorySwapScreen->ballSpriteIds[i] = CreateSprite(&spriteTemplate, (48 * i) + 72, 64, 1);
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].data[0] = 0;
+ }
+ sFactorySwapScreen->cursorSpriteId = CreateSprite(&gUnknown_0861084C, gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x, 88, 0);
+ sFactorySwapScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610864, 176, 112, 0);
+ sFactorySwapScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_0861087C, 176, 144, 0);
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE;
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecY = 0;
+
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ x = 240;
+ else
+ x = 192;
+
+ spriteTemplate = gUnknown_0861084C;
+ spriteTemplate.tileTag = TAG_TILE_68;
+ sFactorySwapScreen->unk8[0][0] = CreateSprite(&spriteTemplate, 240, 120, 10);
+
+ spriteTemplate = gUnknown_08610864;
+ spriteTemplate.tileTag = TAG_TILE_69;
+ sFactorySwapScreen->unk8[0][1] = CreateSprite(&spriteTemplate, 256, 120, 10);
+ sFactorySwapScreen->unk8[0][2] = CreateSprite(&spriteTemplate, 288, 120, 10);
+
+ spriteTemplate = gUnknown_0861084C;
+ spriteTemplate.tileTag = TAG_TILE_6A;
+ sFactorySwapScreen->unk8[1][0] = CreateSprite(&spriteTemplate, 240, 120, 1);
+
+ spriteTemplate = gUnknown_08610864;
+ spriteTemplate.tileTag = TAG_TILE_6B;
+ sFactorySwapScreen->unk8[1][1] = CreateSprite(&spriteTemplate, 256, 120, 1);
+ spriteTemplate.tileTag = TAG_TILE_6C;
+ sFactorySwapScreen->unk8[1][2] = CreateSprite(&spriteTemplate, 288, 120, 1);
+
+ spriteTemplate = gUnknown_0861084C;
+ spriteTemplate.tileTag = TAG_TILE_68;
+ sFactorySwapScreen->unkE[0][0] = CreateSprite(&spriteTemplate, x, 144, 10);
+
+ spriteTemplate = gUnknown_08610864;
+ spriteTemplate.tileTag = TAG_TILE_69;
+ sFactorySwapScreen->unkE[0][1] = CreateSprite(&spriteTemplate, x + 16, 144, 10);
+
+ spriteTemplate = gUnknown_0861084C;
+ spriteTemplate.tileTag = TAG_TILE_6A;
+ sFactorySwapScreen->unkE[1][0] = CreateSprite(&spriteTemplate, x, 144, 1);
+
+ spriteTemplate = gUnknown_08610864;
+ spriteTemplate.tileTag = TAG_TILE_6C;
+ sFactorySwapScreen->unkE[1][1] = CreateSprite(&spriteTemplate, x + 16, 144, 1);
+
+ for (i = 0; i < 2; i++)
+ {
+ gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecY = 0;
+
+ gSprites[sFactorySwapScreen->unk8[i][0]].invisible = TRUE;
+ gSprites[sFactorySwapScreen->unk8[i][1]].invisible = TRUE;
+ gSprites[sFactorySwapScreen->unk8[i][2]].invisible = TRUE;
+ gSprites[sFactorySwapScreen->unkE[i][0]].invisible = TRUE;
+ gSprites[sFactorySwapScreen->unkE[i][1]].invisible = TRUE;
+ }
+
+ gSprites[sFactorySwapScreen->unkE[0][0]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unkE[0][1]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unk8[0][0]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unk8[0][1]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unk8[0][2]].invisible = FALSE;
+}
+
+static void Swap_DestroyAllSprites(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < 3; i++)
+ DestroySprite(&gSprites[sFactorySwapScreen->ballSpriteIds[i]]);
+ DestroySprite(&gSprites[sFactorySwapScreen->cursorSpriteId]);
+ DestroySprite(&gSprites[sFactorySwapScreen->menuCursor1SpriteId]);
+ DestroySprite(&gSprites[sFactorySwapScreen->menuCursor2SpriteId]);
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 3; j++)
+ DestroySprite(&gSprites[sFactorySwapScreen->unk8[i][j]]);
+ }
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 2; j++)
+ DestroySprite(&gSprites[sFactorySwapScreen->unkE[i][j]]);
+ }
+}
+
+static void Swap_HandleActionCursorChange(u8 cursorId)
+{
+ if (cursorId < 3)
+ {
+ gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE;
+ sub_819E8EC();
+ gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[cursorId]].pos1.x;
+ }
+ else
+ {
+ gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE;
+ sub_819E838(sFactorySwapScreen->actionsData[cursorId].id);
+ }
+}
+
+static void Swap_UpdateBallCursorPosition(s8 direction)
+{
+ u8 cursorPos;
+ PlaySE(SE_SELECT);
+ if (direction > 0) // Move cursor right.
+ {
+ if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount)
+ sFactorySwapScreen->cursorPos++;
+ else
+ sFactorySwapScreen->cursorPos = 0;
+ }
+ else // Move cursor left.
+ {
+ if (sFactorySwapScreen->cursorPos != 0)
+ sFactorySwapScreen->cursorPos--;
+ else
+ sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
+ }
+
+ cursorPos = sFactorySwapScreen->cursorPos;
+ Swap_HandleActionCursorChange(cursorPos);
+}
+
+static void Swap_UpdateActionCursorPosition(s8 direction)
+{
+ u8 cursorPos;
+ PlaySE(SE_SELECT);
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySwapScreen->cursorPos < 3)
+ sFactorySwapScreen->cursorPos = 3;
+ else if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount)
+ sFactorySwapScreen->cursorPos++;
+ else
+ sFactorySwapScreen->cursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySwapScreen->cursorPos < 3)
+ sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
+ else if (sFactorySwapScreen->cursorPos != 0)
+ sFactorySwapScreen->cursorPos--;
+ else
+ sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
+ }
+
+ cursorPos = sFactorySwapScreen->cursorPos;
+ Swap_HandleActionCursorChange(cursorPos);
+}
+
+static void Swap_UpdateYesNoCursorPosition(s8 direction)
+{
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySwapScreen->yesNoCursorPos != 1)
+ sFactorySwapScreen->yesNoCursorPos++;
+ else
+ sFactorySwapScreen->yesNoCursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySwapScreen->yesNoCursorPos != 0)
+ sFactorySwapScreen->yesNoCursorPos--;
+ else
+ sFactorySwapScreen->yesNoCursorPos = 1;
+ }
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112;
+}
+
+static void Swap_UpdateMenuCursorPosition(s8 direction)
+{
+ PlaySE(SE_SELECT);
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySwapScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1)
+ sFactorySwapScreen->menuCursorPos++;
+ else
+ sFactorySwapScreen->menuCursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySwapScreen->menuCursorPos != 0)
+ sFactorySwapScreen->menuCursorPos--;
+ else
+ sFactorySwapScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1;
+ }
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+}
+
+static void sub_819E838(u8 arg0)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (arg0 == 2)
+ {
+ gSprites[sFactorySwapScreen->unk8[1][i]].invisible = FALSE;
+ if (i < 2)
+ gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE;
+ }
+ else if (arg0 == 3)
+ {
+ if (i < 2)
+ gSprites[sFactorySwapScreen->unkE[1][i]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ }
+ }
+}
+
+static void sub_819E8EC(void)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ if (i < 2)
+ gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE;
+ }
+}
+
+static void Swap_ShowMenuOptions(void)
+{
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ sFactorySwapScreen->fromSummaryScreen = FALSE;
+ else
+ sFactorySwapScreen->menuCursorPos = 0;
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176;
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE;
+
+ Swap_PrintMenuOptions();
+}
+
+static void Swap_ShowYesNoOptions(void)
+{
+ sFactorySwapScreen->yesNoCursorPos = 0;
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176;
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = 112;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = 112;
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE;
+
+ Swap_PrintYesNoOptions();
+}
+
+static void sub_819EA64(u8 windowId)
+{
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE;
+ FillWindowPixelBuffer(windowId, 0);
+ CopyWindowToVram(windowId, 2);
+ ClearWindowTilemap(windowId);
+}
+
+static void sub_819EAC0(void)
+{
+ PutWindowTilemap(1);
+ FillWindowPixelBuffer(1, 0);
+ CopyWindowToVram(1, 2);
+}
+
+static void sub_819EADC(void)
+{
+ PutWindowTilemap(7);
+ FillWindowPixelBuffer(7, 0);
+ CopyWindowToVram(7, 2);
+}
+
+static void sub_819EAF8(void)
+{
+ sub_819EAC0();
+ PutWindowTilemap(5);
+ FillWindowPixelBuffer(5, 0);
+ CopyWindowToVram(5, 2);
+}
+
+static void Swap_PrintPkmnSwap(void)
+{
+ FillWindowPixelBuffer(0, 0x11);
+ AddTextPrinterParameterized(0, 1, gText_PkmnSwap, 2, 1, 0, NULL);
+ CopyWindowToVram(0, 3);
+}
+
+static void Swap_PrintMonSpecies(void)
+{
+ u16 species;
+ u8 x;
+
+ FillWindowPixelBuffer(1, 0);
+ if (sFactorySwapScreen->cursorPos > 2)
+ {
+ CopyWindowToVram(1, 2);
+ }
+ else
+ {
+ u8 monId = sFactorySwapScreen->cursorPos;
+ if (!sFactorySwapScreen->inEnemyScreen)
+ species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
+ else
+ species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+ StringCopy(gStringVar4, gSpeciesNames[species]);
+ x = GetStringRightAlignXOffset(1, gStringVar4, 86);
+ AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
+ CopyWindowToVram(1, 3);
+ }
+}
+
+static void Swap_PrintOnInfoWindow(const u8 *str)
+{
+ FillWindowPixelBuffer(2, 0);
+ AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL);
+ CopyWindowToVram(2, 2);
+}
+
+static void Swap_PrintMenuOptions(void)
+{
+ PutWindowTilemap(3);
+ FillWindowPixelBuffer(3, 0);
+ AddTextPrinterParameterized3(3, 1, 15, 1, gUnknown_08610922, 0, gText_Summary2);
+ AddTextPrinterParameterized3(3, 1, 15, 17, gUnknown_08610922, 0, gText_Swap);
+ AddTextPrinterParameterized3(3, 1, 15, 33, gUnknown_08610922, 0, gText_Rechoose);
+ CopyWindowToVram(3, 3);
+}
+
+static void Swap_PrintYesNoOptions(void)
+{
+ PutWindowTilemap(4);
+ FillWindowPixelBuffer(4, 0);
+ AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610922, 0, gText_Yes3);
+ AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610922, 0, gText_No3);
+ CopyWindowToVram(4, 3);
+}
+
+static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId)
+{
+ s32 x = GetStringRightAlignXOffset(0, str, 0x46);
+ AddTextPrinterParameterized3(windowId, 0, x, y, gUnknown_08610922, 0, str);
+}
+
+static void Swap_PrintActionStrings(void)
+{
+ FillWindowPixelBuffer(5, 0);
+ switch (sFactorySwapScreen->inEnemyScreen)
+ {
+ case TRUE:
+ Swap_PrintActionString(gText_PkmnForSwap, 0, 5);
+ case FALSE:
+ Swap_PrintActionString(gText_Cancel3, 24, 5);
+ break;
+ }
+ CopyWindowToVram(5, 3);
+}
+
+static void Swap_PrintActionStrings2(void)
+{
+ FillWindowPixelBuffer(3, 0);
+ switch (sFactorySwapScreen->inEnemyScreen)
+ {
+ case TRUE:
+ Swap_PrintActionString(gText_PkmnForSwap, 8, 3);
+ case FALSE:
+ Swap_PrintActionString(gText_Cancel3, 32, 3);
+ break;
+ }
+ CopyWindowToVram(3, 3);
+}
+
+static void Swap_PrintOneActionString(u8 which)
+{
+ switch (which)
+ {
+ case 0:
+ if (sFactorySwapScreen->inEnemyScreen == TRUE)
+ Swap_PrintActionString(gText_PkmnForSwap, 8, 3);
+ break;
+ case 1:
+ Swap_PrintActionString(gText_Cancel3, 32, 3);
+ break;
+ }
+ CopyWindowToVram(3, 3);
+}
+
+static void Swap_PrintMonSpecies2(void)
+{
+ u16 species;
+ u8 x;
+ u16 pal[5];
+
+ CpuCopy16(gUnknown_08610918, pal, 8);
+ if (!sFactorySwapScreen->fromSummaryScreen)
+ pal[4] = gPlttBufferFaded[228];
+ else
+ pal[4] = sFactorySwapScreen->unk24;
+ LoadPalette(pal, 0xF0, 0xA);
+
+ PutWindowTilemap(7);
+ FillWindowPixelBuffer(7, 0);
+ if (sFactorySwapScreen->cursorPos > 2)
+ {
+ CopyWindowToVram(7, 3);
+ }
+ else
+ {
+ u8 monId = sFactorySwapScreen->cursorPos;
+ if (!sFactorySwapScreen->inEnemyScreen)
+ species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
+ else
+ species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+ StringCopy(gStringVar4, gSpeciesNames[species]);
+ x = GetStringRightAlignXOffset(1, gStringVar4, 86);
+ AddTextPrinterParameterized3(7, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
+ CopyWindowToVram(7, 3);
+ }
+}
+
+static void Swap_PrintMonSpecies3(void)
+{
+ u16 species;
+ u8 x;
+
+ LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
+ CpuCopy16(gPlttBufferUnfaded + 240, gPlttBufferFaded + 224, 10);
+
+ if (sFactorySwapScreen->cursorPos > 2)
+ {
+ CopyWindowToVram(1, 2);
+ }
+ else
+ {
+ u8 monId = sFactorySwapScreen->cursorPos;
+ if (!sFactorySwapScreen->inEnemyScreen)
+ species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
+ else
+ species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+ StringCopy(gStringVar4, gSpeciesNames[species]);
+ x = GetStringRightAlignXOffset(1, gStringVar4, 86);
+ AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
+ CopyWindowToVram(1, 3);
+ }
+}
+
+static void Swap_PrintMonCategory(void)
+{
+ u16 species;
+ u8 text[30];
+ u8 x;
+ u8 monId = sFactorySwapScreen->cursorPos;
+
+ FillWindowPixelBuffer(8, 0);
+ if (monId > 2)
+ {
+ CopyWindowToVram(8, 2);
+ }
+ else
+ {
+ PutWindowTilemap(8);
+ if (!sFactorySwapScreen->inEnemyScreen)
+ species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
+ else
+ species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+ CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text);
+ x = GetStringRightAlignXOffset(1, text, 0x76);
+ AddTextPrinterParameterized(8, 1, text, x, 1, 0, NULL);
+ CopyWindowToVram(8, 2);
+ }
+}
+
+static void Swap_InitActions(u8 id)
+{
+ if (sFactorySwapScreen->fromSummaryScreen != TRUE)
+ {
+ switch (id)
+ {
+ case ACTIONS_PLAYER_SCREEN:
+ sFactorySwapScreen->inEnemyScreen = FALSE;
+ sFactorySwapScreen->cursorPos = 0;
+ sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_PlayerScreenActions);
+ sFactorySwapScreen->actionsData = sSwap_PlayerScreenActions;
+ break;
+ case ACTIONS_ENEMY_SCREEN:
+ sFactorySwapScreen->inEnemyScreen = TRUE;
+ sFactorySwapScreen->cursorPos = 0;
+ sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_EnemyScreenActions);
+ sFactorySwapScreen->actionsData = sSwap_EnemyScreenActions;
+ break;
+ }
+ }
+}
+
+static void Swap_RunMenuOptionFunc(u8 taskId)
+{
+ sSwap_CurrentTableFunc = sSwap_MenuOptionFuncs[sFactorySwapScreen->menuCursorPos];
+ sSwap_CurrentTableFunc(taskId);
+}
+
+static void sub_819F0CC(u8 taskId)
+{
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ sFactorySwapScreen->playerMonId = sFactorySwapScreen->cursorPos;
+ sub_819EA64(3);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_819D9EC;
+}
+
+static void sub_819F114(u8 taskId)
+{
+ gTasks[taskId].data[0] = 6;
+ gTasks[taskId].func = Task_FromSwapScreenToSummaryScreen;
+}
+
+static void sub_819F134(u8 taskId)
+{
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ sub_819EA64(3);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+}
+
+static void Swap_RunActionFunc(u8 taskId)
+{
+ sSwap_CurrentTableFunc = sFactorySwapScreen->actionsData[sFactorySwapScreen->cursorPos].func;
+ sSwap_CurrentTableFunc(taskId);
+}
+
+static void Swap_ActionCancel(u8 taskId)
+{
+ gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(sub_819CC24);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].func = sub_819D588;
+}
+
+static void Swap_ActionPkmnForSwap(u8 taskId)
+{
+ gTasks[taskId].data[6] = (u32)(sub_819D9EC) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(sub_819D9EC);
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_819D588;
+}
+
+static void Swap_ActionMon(u8 taskId)
+{
+ if (!sFactorySwapScreen->inEnemyScreen)
+ {
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenMenu) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenMenu);
+ gTasks[taskId].data[5] = 2;
+ }
+ else if (Swap_AlreadyHasSameSpecies(sFactorySwapScreen->cursorPos) == TRUE)
+ {
+ sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = Task_SwapCantHaveSameMons;
+ return;
+ }
+ else
+ {
+ gTasks[taskId].data[6] = (u32)(sub_819CCD4) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(sub_819CCD4);
+ gTasks[taskId].data[5] = 0;
+ }
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_819D588;
+}
+
+static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen)
+{
+ *arg0 = CreateSprite(&gUnknown_08610894, 120, 64, 1);
+ gSprites[*arg0].callback = sub_819F600;
+ gSprites[*arg0].data[7] = swapScreen;
+ *arg1 = TRUE;
+}
+
+static void Swap_ShowSummaryMonSprite(void)
+{
+ struct Pokemon *mon;
+ u16 species;
+ u32 personality, otId;
+
+ sFactorySwapScreen->unk2C.field1 = CreateSprite(&gUnknown_08610894, 120, 64, 1);
+ StartSpriteAffineAnim(&gSprites[sFactorySwapScreen->unk2C.field1], 2);
+
+ mon = &gPlayerParty[sFactorySwapScreen->cursorPos];
+ species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); // BUG: otId and personality should be switched.
+ gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
+
+ gSprites[sFactorySwapScreen->unk2C.field1].invisible = TRUE;
+}
+
+static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen)
+{
+ u8 taskId;
+
+ FreeAndDestroyMonPicSprite(arg0.field0);
+ taskId = CreateTask(sub_819F7B4, 1);
+ gTasks[taskId].data[7] = swapScreen;
+ gTasks[taskId].data[6] = arg0.field1;
+ gTasks[taskId].func(taskId);
+ *arg1 = TRUE;
+}
+
+static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1)
+{
+ FreeAndDestroyMonPicSprite(arg0.field0);
+ FreeOamMatrix(gSprites[arg0.field1].oam.matrixNum);
+ DestroySprite(&gSprites[arg0.field1]);
+ *arg1 = FALSE;
+}
+
+static void Task_SwapCantHaveSameMons(u8 taskId)
+{
+ if (sFactorySwapScreen->unk30 == TRUE)
+ return;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ Swap_PrintOnInfoWindow(gText_SamePkmnInPartyAlready);
+ sFactorySwapScreen->monSwapped = FALSE;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ FillWindowPixelBuffer(5, 0);
+ CopyWindowToVram(5, 2);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept);
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ Swap_PrintMonSpecies3();
+ sub_819EADC();
+ sFactorySwapScreen->unk22 = TRUE;
+ gTasks[taskId].data[0] = gTasks[taskId].data[5];
+ gTasks[taskId].func = Task_HandleSwapScreenChooseMons;
+ break;
+ }
+}
+
+static bool8 Swap_AlreadyHasSameSpecies(u8 monId)
+{
+ u8 i;
+ u16 species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+
+ for (i = 0; i < 3; i++)
+ {
+ if (i != sFactorySwapScreen->playerMonId && (u16)(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL)) == species)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_819F600(struct Sprite *sprite)
+{
+ u8 taskId;
+
+ if (sprite->affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ taskId = CreateTask(sub_819F69C, 1);
+ gTasks[taskId].data[7] = sprite->data[7];
+ gTasks[taskId].func(taskId);
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_819F654(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ if (sprite->data[7] == TRUE)
+ sFactorySwapScreen->unk30 = FALSE;
+ else
+ sub_819BE20(FALSE);
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_819F69C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[3] = 88;
+ task->data[24] = 152; // BUG: writing outside the array's bounds.
+ task->data[5] = 64;
+ task->data[8] = 65;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+ break;
+ case 1:
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ break;
+ case 2:
+ task->data[5] -= 4;
+ task->data[8] += 4;
+ if (task->data[5] <= 32 || task->data[8] >= 96)
+ {
+ task->data[5] = 32;
+ task->data[8] = 96;
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ if (task->data[5] != 32)
+ return;
+ break;
+ default:
+ DestroyTask(taskId);
+ // UB: Should not use the task after it has been deleted.
+ if (gTasks[taskId].data[7] == TRUE)
+ Swap_ShowMonSprite();
+ else
+ Summary_ShowMonSprite();
+ return;
+ }
+ task->data[0]++;
+}
+
+static void sub_819F7B4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ default:
+ HideBg(3);
+ gSprites[task->data[6]].data[7] = task->data[7];
+ gSprites[task->data[6]].invisible = FALSE;
+ gSprites[task->data[6]].callback = sub_819F654;
+ StartSpriteAffineAnim(&gSprites[task->data[6]], 1);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ DestroyTask(taskId);
+ break;
+ case 0:
+ task->data[3] = 88;
+ task->data[24] = 152; // BUG: writing outside the array's bounds.
+ task->data[5] = 32;
+ task->data[8] = 96;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[5] += 4;
+ task->data[8] -= 4;
+ if (task->data[5] >= 64 || task->data[8] <= 65)
+ {
+ task->data[5] = 64;
+ task->data[8] = 65;
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ if (task->data[5] == 64)
+ task->data[0]++;
+ break;
+ }
+}
+
+static void Swap_ShowMonSprite(void)
+{
+ struct Pokemon *mon;
+ u16 species;
+ u32 personality, otId;
+
+ if (!sFactorySwapScreen->inEnemyScreen)
+ mon = &gPlayerParty[sFactorySwapScreen->cursorPos];
+ else
+ mon = &gEnemyParty[sFactorySwapScreen->cursorPos];
+
+ species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
+ gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
+
+ sFactorySwapScreen->unk30 = FALSE;
+}
diff --git a/src/battle_tent.c b/src/battle_tent.c
index f3aec1345..678222ff5 100644
--- a/src/battle_tent.c
+++ b/src/battle_tent.c
@@ -8,7 +8,7 @@
#include "battle_tower.h"
#include "random.h"
#include "item.h"
-#include "battle_factory.h"
+#include "battle_factory_screen.h"
#include "frontier_util.h"
#include "constants/items.h"
#include "constants/region_map_sections.h"
@@ -280,17 +280,17 @@ bool8 sub_81B9E94(void)
&& ((gMapHeader.mapLayoutId == 385) | (gMapHeader.mapLayoutId == 386)));
}
-// This function was written very...oddly.
-#ifdef NONMATCHING
static void sub_81B9EC0(void)
{
s32 i, j;
- u16 currMonId = 0, currSpecies = 0;
+ u8 firstMonId;
+ u16 monSetId;
+ u16 currSpecies;
u16 species[PARTY_SIZE];
u16 monIds[PARTY_SIZE];
u16 heldItems[PARTY_SIZE];
- s32 zero = 0;
+ firstMonId = 0;
gFacilityTrainers = gSlateportBattleTentTrainers;
for (i = 0; i < PARTY_SIZE; i++)
{
@@ -300,250 +300,56 @@ static void sub_81B9EC0(void)
}
gFacilityTrainerMons = gSlateportBattleTentMons;
currSpecies = 0;
- for (i = 0; i != PARTY_SIZE;)
+ i = 0;
+ while (i != PARTY_SIZE)
{
// Cannot have two pokemon of the same species.
- currMonId = Random() % 70;
- for (j = zero; j < i + zero; j++)
+ monSetId = Random() % 70;
+ for (j = firstMonId; j < firstMonId + i; j++)
{
- if (monIds[j] == currMonId)
+ u16 monId = monIds[j];
+ if (monIds[j] == monSetId)
break;
- if (species[j] == gFacilityTrainerMons[currMonId].species)
+ if (species[j] == gFacilityTrainerMons[monSetId].species)
{
if (currSpecies == 0)
- currSpecies = gFacilityTrainerMons[currMonId].species;
+ currSpecies = gFacilityTrainerMons[monSetId].species;
else
break;
}
}
- if (j != i + zero)
+ if (j != i + firstMonId)
continue;
// Cannot have two same held items.
- for (j = zero; j < i + zero; j++)
+ for (j = firstMonId; j < i + firstMonId; j++)
{
- if (heldItems[j] == 0)
- continue;
- if (heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[currMonId].itemTableId])
+ if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
{
- if (gFacilityTrainerMons[currMonId].species == currSpecies)
+ if (gFacilityTrainerMons[monSetId].species == currSpecies)
currSpecies = 0;
- else
- break;
+ break;
}
}
- if (j != i + zero)
+ if (j != i + firstMonId)
continue;
- gSaveBlock2Ptr->frontier.field_E70[i].monId = currMonId;
- species[i] = gFacilityTrainerMons[currMonId].species;
- heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[currMonId].itemTableId];
- monIds[i] = currMonId;
+ gSaveBlock2Ptr->frontier.field_E70[i].monId = monSetId;
+ species[i] = gFacilityTrainerMons[monSetId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ monIds[i] = monSetId;
i++;
}
}
-#else
-NAKED
-static void sub_81B9EC0(void)
-{
- asm_unified("\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x3C\n\
- ldr r1, =gFacilityTrainers\n\
- ldr r0, =gSlateportBattleTentTrainers\n\
- str r0, [r1]\n\
- add r0, sp, 0xC\n\
- mov r9, r0\n\
- mov r1, sp\n\
- adds r1, 0x18\n\
- str r1, [sp, 0x2C]\n\
- ldr r5, =gFacilityTrainerMons\n\
- ldr r4, =gSlateportBattleTentMons\n\
- movs r2, 0\n\
- adds r3, r1, 0\n\
- mov r1, r9\n\
- mov r0, sp\n\
- movs r6, 0x5\n\
- mov r8, r6\n\
-_081B9EEC:\n\
- strh r2, [r0]\n\
- strh r2, [r1]\n\
- strh r2, [r3]\n\
- adds r3, 0x2\n\
- adds r1, 0x2\n\
- adds r0, 0x2\n\
- movs r7, 0x1\n\
- negs r7, r7\n\
- add r8, r7\n\
- mov r6, r8\n\
- cmp r6, 0\n\
- bge _081B9EEC\n\
- str r4, [r5]\n\
- movs r7, 0\n\
- mov r10, r7\n\
- movs r0, 0\n\
- mov r8, r0\n\
- ldr r1, [sp, 0x2C]\n\
- str r1, [sp, 0x30]\n\
- mov r2, sp\n\
- str r2, [sp, 0x34]\n\
- lsls r6, r0, 1\n\
- str r6, [sp, 0x24]\n\
- add r6, r9\n\
- str r6, [sp, 0x28]\n\
-_081B9F1E:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x46\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- movs r2, 0\n\
- mov r7, r8\n\
- adds r6, r2, r7\n\
- cmp r2, r6\n\
- bge _081B9F7C\n\
- ldr r1, [sp, 0x28]\n\
- ldrh r0, [r1]\n\
- cmp r0, r5\n\
- beq _081B9F7C\n\
- ldr r0, =gFacilityTrainerMons\n\
- ldr r1, [r0]\n\
- lsls r0, r5, 4\n\
- adds r4, r0, r1\n\
- ldrh r7, [r4]\n\
- mov r12, r7\n\
- lsls r3, r2, 1\n\
- ldr r1, [sp, 0x24]\n\
- add r1, sp\n\
- str r6, [sp, 0x38]\n\
-_081B9F56:\n\
- ldrh r0, [r1]\n\
- cmp r0, r12\n\
- bne _081B9F66\n\
- mov r0, r10\n\
- cmp r0, 0\n\
- bne _081B9F7C\n\
- ldrh r7, [r4]\n\
- mov r10, r7\n\
-_081B9F66:\n\
- adds r3, 0x2\n\
- adds r1, 0x2\n\
- adds r2, 0x1\n\
- ldr r0, [sp, 0x38]\n\
- cmp r2, r0\n\
- bge _081B9F7C\n\
- mov r7, r9\n\
- adds r0, r7, r3\n\
- ldrh r0, [r0]\n\
- cmp r0, r5\n\
- bne _081B9F56\n\
-_081B9F7C:\n\
- cmp r2, r6\n\
- bne _081BA01C\n\
- movs r2, 0\n\
- cmp r2, r6\n\
- bge _081B9FD4\n\
- ldr r0, =gBattleFrontierHeldItems\n\
- mov r12, r0\n\
- ldr r7, =gFacilityTrainerMons\n\
- ldr r1, [sp, 0x24]\n\
- ldr r0, [sp, 0x2C]\n\
- adds r4, r1, r0\n\
-_081B9F92:\n\
- ldrh r3, [r4]\n\
- cmp r3, 0\n\
- beq _081B9FCC\n\
- ldr r1, [r7]\n\
- lsls r0, r5, 4\n\
- adds r1, r0, r1\n\
- ldrb r0, [r1, 0xA]\n\
- lsls r0, 1\n\
- add r0, r12\n\
- ldrh r0, [r0]\n\
- cmp r3, r0\n\
- bne _081B9FCC\n\
- ldrh r0, [r1]\n\
- cmp r0, r10\n\
- bne _081B9FD4\n\
- movs r1, 0\n\
- mov r10, r1\n\
- b _081B9FD4\n\
- .pool\n\
-_081B9FCC:\n\
- adds r4, 0x2\n\
- adds r2, 0x1\n\
- cmp r2, r6\n\
- blt _081B9F92\n\
-_081B9FD4:\n\
- cmp r2, r6\n\
- bne _081BA01C\n\
- ldr r0, =gSaveBlock2Ptr\n\
- ldr r1, [r0]\n\
- mov r2, r8\n\
- lsls r3, r2, 1\n\
- adds r0, r3, r2\n\
- lsls r0, 2\n\
- adds r1, r0\n\
- movs r6, 0xE7\n\
- lsls r6, 4\n\
- adds r1, r6\n\
- strh r5, [r1]\n\
- ldr r0, =gFacilityTrainerMons\n\
- ldr r0, [r0]\n\
- lsls r1, r5, 4\n\
- adds r1, r0\n\
- ldrh r0, [r1]\n\
- ldr r7, [sp, 0x34]\n\
- strh r0, [r7]\n\
- ldr r2, =gBattleFrontierHeldItems\n\
- ldrb r0, [r1, 0xA]\n\
- lsls r0, 1\n\
- adds r0, r2\n\
- ldrh r0, [r0]\n\
- ldr r1, [sp, 0x30]\n\
- strh r0, [r1]\n\
- add r3, r9\n\
- strh r5, [r3]\n\
- adds r1, 0x2\n\
- str r1, [sp, 0x30]\n\
- adds r2, r7, 0\n\
- adds r2, 0x2\n\
- str r2, [sp, 0x34]\n\
- movs r6, 0x1\n\
- add r8, r6\n\
-_081BA01C:\n\
- mov r7, r8\n\
- cmp r7, 0x6\n\
- beq _081BA024\n\
- b _081B9F1E\n\
-_081BA024:\n\
- add sp, 0x3C\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- ");
-}
-#endif // NONMATCHING
static void sub_81BA040(void)
{
u16 trainerId;
s32 i, j, k;
- register const u16 *monSetsPool asm("r9"); // Fix me. Compiler insists on moving that variable into stack.
+ register const u16 *monSets asm("r9"); // Fix me. Compiler insists on moving that variable into stack.
u16 species[3];
u16 heldItems[3];
- s32 monPoolCount = 0;
+ s32 setsCount = 0;
gFacilityTrainers = gSlateportBattleTentTrainers;
gFacilityTrainerMons = gSlateportBattleTentMons;
@@ -561,21 +367,21 @@ static void sub_81BA040(void)
} while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum);
gTrainerBattleOpponent_A = trainerId;
- while (gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool[monPoolCount] != 0xFFFF)
- monPoolCount++;
- if (monPoolCount > 8)
+ while (gFacilityTrainers[gTrainerBattleOpponent_A].monSets[setsCount] != 0xFFFF)
+ setsCount++;
+ if (setsCount > 8)
break;
- monPoolCount = 0;
+ setsCount = 0;
}
if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 2)
gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
- monSetsPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool;
+ monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
i = 0;
while (i != 3)
{
- sRandMonSetId = monSetsPool[Random() % monPoolCount];
+ sRandMonSetId = monSets[Random() % setsCount];
for (j = 0; j < 6; j++)
{
if (gFacilityTrainerMons[sRandMonSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[j].monId].species)
diff --git a/src/battle_tower.c b/src/battle_tower.c
index e95eaf156..000a03a5b 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -21,6 +21,7 @@
#include "link.h"
#include "field_message_box.h"
#include "tv.h"
+#include "battle_factory.h"
#include "constants/battle_frontier.h"
#include "constants/trainers.h"
#include "constants/event_objects.h"
@@ -29,19 +30,16 @@
extern u16 gUnknown_03006298[];
-extern void sub_81A6CD0(void);
extern void sub_81A4C30(void);
-extern u8 sub_81A6CA8(u8, u8);
-extern void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 move, u8 moveSlot);
extern const u8 *const *const gUnknown_085DD690[];
extern const u16 gBattleFrontierHeldItems[];
extern const u8 sRubyFacilityClassToEmerald[82][2];
extern const u16 gUnknown_085DFA46[];
-extern const struct FacilityMon gBattleFrontierMons[];
extern const struct FacilityMon gSlateportBattleTentMons[];
extern const struct FacilityMon gVerdanturfBattleTentMons[];
extern const struct FacilityMon gFallarborBattleTentMons[];
+extern const struct FacilityMon gBattleFrontierMons[];
extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
extern const struct BattleFrontierTrainer gSlateportBattleTentTrainers[];
extern const struct BattleFrontierTrainer gVerdanturfBattleTentTrainers[];
@@ -983,14 +981,14 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
u8 level = SetFacilityPtrsGetLevel();
u8 fixedIV = 0;
u8 bfMonCount;
- const u16 *bfMonPool = NULL;
+ const u16 *monSets = NULL;
u32 otID = 0;
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
{
// Normal battle frontier trainer.
fixedIV = GetFrontierTrainerFixedIvs(trainerId);
- bfMonPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool;
+ monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
}
else if (trainerId == TRAINER_EREADER)
{
@@ -1028,20 +1026,20 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
// 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++)
+ for (bfMonCount = 0; monSets[bfMonCount] != 0xFFFF; bfMonCount++)
;
i = 0;
otID = Random32();
while (i != monCount)
{
- u16 monPoolId = bfMonPool[Random() % bfMonCount];
- if ((level == 50 || level == 20) && monPoolId > 849)
+ u16 monSetId = monSets[Random() % bfMonCount];
+ if ((level == 50 || level == 20) && monSetId > 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)
+ if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monSetId].species)
break;
}
if (j != i + firstMonId)
@@ -1051,7 +1049,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
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])
+ && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
break;
}
if (j != i + firstMonId)
@@ -1061,34 +1059,34 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
// because the species and held items were already checked directly above.
for (j = 0; j < i; j++)
{
- if (chosenMonIndices[j] == monPoolId)
+ if (chosenMonIndices[j] == monSetId)
break;
}
if (j != i)
continue;
- chosenMonIndices[i] = monPoolId;
+ chosenMonIndices[i] = monSetId;
// Place the chosen pokemon into the trainer's party.
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[i + firstMonId],
- gFacilityTrainerMons[monPoolId].species,
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[monPoolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
fixedIV,
- gFacilityTrainerMons[monPoolId].evSpread,
+ gFacilityTrainerMons[monSetId].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)
+ SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j);
+ if (gFacilityTrainerMons[monSetId].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]);
+ SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
// The pokemon was successfully added to the trainer's party, so it's safe to move on to
// the next party slot.
@@ -1129,27 +1127,27 @@ static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId)
}
}
-u16 RandomizeFacilityTrainerMonId(u16 trainerId)
+u16 RandomizeFacilityTrainerMonSet(u16 trainerId)
{
u8 level = SetFacilityPtrsGetLevel();
- const u16 *bfMonPool = gFacilityTrainers[trainerId].bfMonPool;
+ const u16 *monSets = gFacilityTrainers[trainerId].monSets;
u8 bfMonCount = 0;
- u32 monPoolId = bfMonPool[bfMonCount];
+ u32 monSetId = monSets[bfMonCount];
- while (monPoolId != 0xFFFF)
+ while (monSetId != 0xFFFF)
{
bfMonCount++;
- monPoolId = bfMonPool[bfMonCount];
- if (monPoolId == 0xFFFF)
+ monSetId = monSets[bfMonCount];
+ if (monSetId == 0xFFFF)
break;
}
do
{
- monPoolId = bfMonPool[Random() % bfMonCount];
- } while((level == 50 || level == 20) && monPoolId > 849);
+ monSetId = monSets[Random() % bfMonCount];
+ } while((level == 50 || level == 20) && monSetId > 849);
- return monPoolId;
+ return monSetId;
}
static void FillFactoryTrainerParty(void)
@@ -1175,9 +1173,9 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
u8 challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][0] / 7;
if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6)
- fixedIV = sub_81A6CA8(challengeNum, 0);
+ fixedIV = GetFactoryMonFixedIV(challengeNum, 0);
else
- fixedIV = sub_81A6CA8(challengeNum, 1);
+ fixedIV = GetFactoryMonFixedIV(challengeNum, 1);
}
else if (trainerId == TRAINER_EREADER)
{
@@ -1187,7 +1185,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
}
else if (trainerId == TRAINER_FRONTIER_BRAIN)
{
- sub_81A6CD0();
+ FillFactoryBrainParty();
return;
}
else
@@ -1195,26 +1193,25 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
fixedIV = 31;
}
-
level = SetFacilityPtrsGetLevel();
otID = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
for (i = 0; i < 3; i++)
{
- u16 poolId = gUnknown_03006298[i];
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[firstMonId + i],
- gFacilityTrainerMons[poolId].species,
+ u16 monSetId = gUnknown_03006298[i];
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[firstMonId + i],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[poolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
fixedIV,
- gFacilityTrainerMons[poolId].evSpread,
+ gFacilityTrainerMons[monSetId].evSpread,
otID);
friendship = 0;
for (j = 0; j < 4; j++)
- SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[poolId].moves[j], j);
+ SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j);
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[poolId].itemTableId]);
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
}
}
@@ -1228,25 +1225,25 @@ static void FillFactoryTentTrainerParty(u16 trainerId, u8 firstMonId)
for (i = 0; i < 3; i++)
{
- u16 poolId = gUnknown_03006298[i];
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[firstMonId + i],
- gFacilityTrainerMons[poolId].species,
+ u16 monSetId = gUnknown_03006298[i];
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[firstMonId + i],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[poolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
fixedIV,
- gFacilityTrainerMons[poolId].evSpread,
+ gFacilityTrainerMons[monSetId].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)
+ SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j);
+ if (gFacilityTrainerMons[monSetId].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]);
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
}
}
@@ -1609,7 +1606,7 @@ static void sub_81642A0(void)
u32 spArray[5];
s32 r10;
u16 trainerId;
- u16 monPoolId;
+ u16 monSetId;
u32 lvlMode, battleMode;
s32 challengeNum;
u32 species1, species2;
@@ -1651,24 +1648,24 @@ static void sub_81642A0(void)
{
while (1)
{
- monPoolId = RandomizeFacilityTrainerMonId(trainerId);
- if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[r10 - 1]].itemTableId == gFacilityTrainerMons[monPoolId].itemTableId)
+ monSetId = RandomizeFacilityTrainerMonSet(trainerId);
+ if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[r10 - 1]].itemTableId == gFacilityTrainerMons[monSetId].itemTableId)
continue;
for (k = 8; k < r10; k++)
{
- if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[k]].species == gFacilityTrainerMons[monPoolId].species)
+ if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[k]].species == gFacilityTrainerMons[monSetId].species)
break;
- if (species1 == gFacilityTrainerMons[monPoolId].species)
+ if (species1 == gFacilityTrainerMons[monSetId].species)
break;
- if (species2 == gFacilityTrainerMons[monPoolId].species)
+ if (species2 == gFacilityTrainerMons[monSetId].species)
break;
}
if (k == r10)
break;
}
- gSaveBlock2Ptr->frontier.field_CB4[r10] = monPoolId;
+ gSaveBlock2Ptr->frontier.field_CB4[r10] = monSetId;
r10++;
}
}
@@ -1749,7 +1746,7 @@ static void sub_81642A0(void)
}
}
-static void sub_81646BC(u16 trainerId, u16 monPoolId)
+static void sub_81646BC(u16 trainerId, u16 monSetId)
{
u16 move = 0;
u16 species = 0;
@@ -1759,8 +1756,8 @@ static void sub_81646BC(u16 trainerId, u16 monPoolId)
{
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
{
- move = gFacilityTrainerMons[monPoolId].moves[0];
- species = gFacilityTrainerMons[monPoolId].species;
+ move = gFacilityTrainerMons[monSetId].moves[0];
+ species = gFacilityTrainerMons[monSetId].species;
}
else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE)
{
@@ -1787,7 +1784,7 @@ static void sub_81646BC(u16 trainerId, u16 monPoolId)
static void sub_8164828(void)
{
s32 i, j, arrId;
- s32 monPoolId;
+ s32 monSetId;
s32 level = SetFacilityPtrsGetLevel();
u16 winStreak = GetCurrentFacilityWinStreak();
s32 challengeNum = winStreak / 7;
@@ -1825,12 +1822,12 @@ static void sub_8164828(void)
}
break;
case 1:
- monPoolId = gSaveBlock2Ptr->frontier.field_CB4[8 + k * 2];
- sub_81646BC(trainerId, monPoolId);
+ monSetId = gSaveBlock2Ptr->frontier.field_CB4[8 + k * 2];
+ sub_81646BC(trainerId, monSetId);
break;
case 2:
- monPoolId = gSaveBlock2Ptr->frontier.field_CB4[9 + k * 2];
- sub_81646BC(trainerId, monPoolId);
+ monSetId = gSaveBlock2Ptr->frontier.field_CB4[9 + k * 2];
+ sub_81646BC(trainerId, monSetId);
break;
case 3:
gPartnerTrainerId = trainerId;
@@ -2280,7 +2277,7 @@ static void FillPartnerParty(u16 trainerId)
s32 i, j;
u32 ivs, level;
u32 friendship;
- u16 monPoolId;
+ u16 monSetId;
u32 otID;
u8 trainerName[PLAYER_NAME_LENGTH + 1];
SetFacilityPtrsGetLevel();
@@ -2321,23 +2318,23 @@ static void FillPartnerParty(u16 trainerId)
otID = Random32();
for (i = 0; i < 2; i++)
{
- monPoolId = gSaveBlock2Ptr->frontier.field_CB4[i + 18];
- CreateMonWithEVSpreadPersonalityOTID(&gPlayerParty[3 + i],
- gFacilityTrainerMons[monPoolId].species,
+ monSetId = gSaveBlock2Ptr->frontier.field_CB4[i + 18];
+ CreateMonWithEVSpreadNatureOTID(&gPlayerParty[3 + i],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[monPoolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
ivs,
- gFacilityTrainerMons[monPoolId].evSpread,
+ gFacilityTrainerMons[monSetId].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)
+ SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monSetId].moves[j], j);
+ if (gFacilityTrainerMons[monSetId].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]);
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].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);
@@ -2689,19 +2686,19 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
u8 level = SetTentPtrsGetLevel();
u8 fixedIV = 0;
u8 bfMonCount;
- const u16 *bfMonPool = NULL;
+ const u16 *monSets = NULL;
u32 otID = 0;
- u16 monPoolId;
+ u16 monSetId;
- bfMonPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool;
+ monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
bfMonCount = 0;
- monPoolId = bfMonPool[bfMonCount];
- while (monPoolId != 0xFFFF)
+ monSetId = monSets[bfMonCount];
+ while (monSetId != 0xFFFF)
{
bfMonCount++;
- monPoolId = bfMonPool[bfMonCount];
- if (monPoolId == 0xFFFF)
+ monSetId = monSets[bfMonCount];
+ if (monSetId == 0xFFFF)
break;
}
@@ -2709,12 +2706,12 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
otID = Random32();
while (i != monCount)
{
- u16 monPoolId = bfMonPool[Random() % bfMonCount];
+ u16 monSetId = monSets[Random() % bfMonCount];
// 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)
+ if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monSetId].species)
break;
}
if (j != i + firstMonId)
@@ -2724,7 +2721,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
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])
+ && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
break;
}
if (j != i + firstMonId)
@@ -2734,34 +2731,34 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
// because the species and held items were already checked directly above.
for (j = 0; j < i; j++)
{
- if (chosenMonIndices[j] == monPoolId)
+ if (chosenMonIndices[j] == monSetId)
break;
}
if (j != i)
continue;
- chosenMonIndices[i] = monPoolId;
+ chosenMonIndices[i] = monSetId;
// Place the chosen pokemon into the trainer's party.
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[i + firstMonId],
- gFacilityTrainerMons[monPoolId].species,
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[monPoolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
fixedIV,
- gFacilityTrainerMons[monPoolId].evSpread,
+ gFacilityTrainerMons[monSetId].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)
+ SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j);
+ if (gFacilityTrainerMons[monSetId].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]);
+ SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
// The pokemon was successfully added to the trainer's party, so it's safe to move on to
// the next party slot.
diff --git a/src/frontier_util.c b/src/frontier_util.c
index 39f472a60..a65d14784 100644
--- a/src/frontier_util.c
+++ b/src/frontier_util.c
@@ -336,7 +336,8 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][3] =
},
[FRONTIER_FACILITY_FACTORY] =
{
- // Silver Symbol.
+ // Because Factory's pokemon are random, this facility's Brain also uses random pokemon.
+ // What is interesting, this team is actually the one Steven uses in the multi tag battle alongside the player.
{
{
.species = SPECIES_METANG,
@@ -363,7 +364,6 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][3] =
.moves = {MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW},
},
},
- // Gold Symbol.
{
{
.species = SPECIES_METANG,
diff --git a/src/pokemon.c b/src/pokemon.c
index b858ee925..2a17c8851 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -2904,7 +2904,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m
CalculateMonStats(mon);
}
-void CreateMonWithEVSpreadPersonalityOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId)
+void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId)
{
s32 i;
s32 statCount = 0;
diff --git a/sym_bss.txt b/sym_bss.txt
index 9561418c0..a56ec7555 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -70,7 +70,7 @@ gUnknown_03001204: @ 3001204
.include "src/battle_transition.o"
.include "src/pokemon_animation.o"
.include "src/recorded_battle.o"
- .include "src/battle_factory.o"
+ .include "src/battle_factory_screen.o"
gUnknown_03001288: @ 3001288
.space 0x4
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 85028bc54..484f52d05 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -493,7 +493,7 @@ gUnknown_0203CD88: @ 203CD88
.space 0x4
.include "src/menu.o"
- .include "src/battle_factory.o"
+ .include "src/battle_factory_screen.o"
gUnknown_0203CE50: @ 203CE50
.space 0x4