summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorRemy Oukaour <remy.oukaour@gmail.com>2018-01-06 18:53:30 -0500
committerRemy Oukaour <remy.oukaour@gmail.com>2018-01-06 18:53:30 -0500
commitbdd3a55333d0acd1d764327dcebb4a14d9586f05 (patch)
tree3e8f7bb7e6707f111f247c682b1e268600dfd64c /engine
parent9069a395db48fad1975f6ff153c12a736dfacb2f (diff)
Organize mobile/battle_tower_*.asm data and code
Diffstat (limited to 'engine')
-rwxr-xr-xengine/events/battle_tower/battle_tower.asm1671
-rw-r--r--engine/events/battle_tower/get_trainer_class.asm46
-rw-r--r--engine/events/battle_tower/load_trainer.asm (renamed from engine/events/battle_tower.asm)2
-rw-r--r--engine/events/battle_tower/rules.asm (renamed from engine/events/battle_tower_rules.asm)0
-rwxr-xr-xengine/events/battle_tower/trainer_text.asm718
5 files changed, 2436 insertions, 1 deletions
diff --git a/engine/events/battle_tower/battle_tower.asm b/engine/events/battle_tower/battle_tower.asm
new file mode 100755
index 000000000..ca2ddd142
--- /dev/null
+++ b/engine/events/battle_tower/battle_tower.asm
@@ -0,0 +1,1671 @@
+BattleTowerRoomMenu: ; 1700b0
+; special
+ call InitBattleTowerChallengeRAM
+ farcall _BattleTowerRoomMenu
+ ret
+; 1700ba
+
+Function1700ba: ; 1700ba
+ call InitBattleTowerChallengeRAM
+ farcall Function11811a
+ ret
+; 1700c4
+
+Function1700c4: ; 1700c4
+ ld a, [rSVBK]
+ push af
+ ld a, $3
+ ld [rSVBK], a
+
+ call Function17042c
+
+ ld a, $5
+ call GetSRAMBank
+ ld a, $1
+ ld [$be45], a
+ xor a
+ ld [$be46], a
+ ld hl, w3_dffc
+ ld de, $aa41
+ ld bc, 4
+ call CopyBytes
+ ld hl, w3_d202Name
+ ld de, $aa8e
+ ld bc, 7 * $cc ; length of battle tower struct from japanese games?
+ call CopyBytes
+ ld hl, $aa5d ; some sort of count
+ ld a, [hl]
+ inc [hl]
+ inc hl
+ sla a
+ sla a
+ ld e, a
+ ld d, $0
+ add hl, de
+ ld e, l
+ ld d, h
+ ld hl, w3_dffc
+ ld bc, 4
+ call CopyBytes
+ call CloseSRAM
+ pop af
+ ld [rSVBK], a
+ ret
+; 170114
+
+Function170114: ; 170114
+ call InitBattleTowerChallengeRAM
+ call .Function170121
+ farcall Function11805f
+ ret
+; 170121
+
+.Function170121: ; 170121
+ ld a, $5
+ call GetSRAMBank
+ ld hl, $a948
+ ld de, wMisc
+ ld bc, $f6 ; 246
+ call CopyBytes
+ call CloseSRAM
+ call Function170c8b
+ ret
+; 170139
+
+Function170139: ; 170139
+; Convert the 4-digit decimal number at 5:aa41 into binary
+ ld a, $5
+ call GetSRAMBank
+ ld de, $aa41
+ ld h, $0
+ ld l, h
+ ld bc, 1000
+ call .DecToBin
+ ld bc, 100
+ call .DecToBin
+ ld bc, 10
+ call .DecToBin
+ ld a, [de]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ call CloseSRAM
+; Store that number in wMisc
+ ld a, h
+ ld [wMisc], a
+ ld a, l
+ ld [wMisc + 1], a
+ ld hl, wBT_OTTempPkmn1DVs
+ ld a, [PlayerID]
+ ld [hli], a
+ ld a, [PlayerID + 1]
+ ld [hli], a
+ ld a, [wSecretID]
+ ld [hli], a
+ ld a, [wSecretID + 1]
+ ld [hli], a
+ ld e, l
+ ld d, h
+ ld hl, PlayerName
+ ld bc, NAME_LENGTH_JAPANESE - 1
+ call CopyBytes
+ ld bc, PlayerID
+ ld de, wPlayerGender
+ farcall GetMobileOTTrainerClass
+ ld de, wBT_OTTempPkmn1CaughtGender
+ ld a, c
+ ld [de], a
+ inc de
+ ld a, LOW(PartyMons)
+ ld [wcd49], a
+ ld a, HIGH(PartyMons)
+ ld [wcd4a], a
+ ld a, LOW(PartyMonNicknames)
+ ld [wcd4b], a
+ ld a, HIGH(PartyMonNicknames)
+ ld [wcd4c], a
+ ld a, 3
+.CopyLoop:
+ push af
+ ld a, [wcd49]
+ ld l, a
+ ld a, [wcd4a]
+ ld h, a
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call CopyBytes
+ ld a, l
+ ld [wcd49], a
+ ld a, h
+ ld [wcd4a], a
+ ld a, [wcd4b]
+ ld l, a
+ ld a, [wcd4c]
+ ld h, a
+ ld bc, $0006
+ call CopyBytes
+ ld a, l
+ ld [wcd4b], a
+ ld a, h
+ ld [wcd4c], a
+ pop af
+ dec a
+ jr nz, .CopyLoop
+ ld a, $4
+ call GetSRAMBank
+ ld hl, $a013
+ ld bc, $24
+ call CopyBytes
+ call CloseSRAM
+ ld a, $5
+ call GetSRAMBank
+ ld hl, $a894
+ ld bc, NAME_LENGTH_JAPANESE
+ call CopyBytes
+ ld hl, wMisc
+ ld de, $a948
+ ld bc, $f6
+ call CopyBytes
+ call CloseSRAM
+ ret
+; 17020c
+
+.DecToBin: ; 17020c
+ ld a, [de]
+ inc de
+ and a
+ ret z
+
+.digit_loop
+ add hl, bc
+ dec a
+ jr nz, .digit_loop
+ ret
+; 170215
+
+BattleTowerBattle: ; 170215
+ xor a
+ ld [wBattleTowerBattleEnded], a
+ call _BattleTowerBattle
+ ret
+; 17021d
+
+EmptySpecial_17021d: ; 17021d
+ ret
+; 17021e
+
+InitBattleTowerChallengeRAM: ; 17021e
+ xor a
+ ld [wBattleTowerBattleEnded], a
+ ld [wNrOfBeatenBattleTowerTrainers], a
+ ld [wcf65], a
+ ld [wcf66], a
+ ret
+; 17022c
+
+_BattleTowerBattle: ; 17022c
+.loop
+ call .do_dw
+ call DelayFrame
+ ld a, [wBattleTowerBattleEnded]
+ cp $1
+ jr nz, .loop
+ ret
+; 17023a
+
+.do_dw ; 17023a
+ ld a, [wBattleTowerBattleEnded]
+ ld e, a
+ ld d, 0
+ ld hl, .dw
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+; 170249
+
+.dw ; 170249
+ dw RunBattleTowerTrainer
+ dw SkipBattleTowerTrainer
+; 17024d
+
+RunBattleTowerTrainer: ; 17024d
+ ld a, [Options]
+ push af
+ ld hl, Options
+ set BATTLE_SHIFT, [hl] ; SET MODE
+
+ ld a, [InBattleTowerBattle]
+ push af
+ or $1
+ ld [InBattleTowerBattle], a
+
+ xor a
+ ld [wLinkMode], a
+ farcall TrainerRankings_Healings
+ farcall HealParty
+ call ReadBTTrainerParty
+ call Clears5_a89a
+
+ predef StartBattle
+
+ farcall LoadPokemonData
+ farcall HealParty
+ ld a, [wBattleResult]
+ ld [ScriptVar], a
+ and a
+ jr nz, .lost
+ ld a, BANK(sNrOfBeatenBattleTowerTrainers)
+ call GetSRAMBank
+ ld a, [sNrOfBeatenBattleTowerTrainers]
+ ld [wNrOfBeatenBattleTowerTrainers], a
+ call CloseSRAM
+ ld hl, StringBuffer3
+ ld a, [wNrOfBeatenBattleTowerTrainers]
+ add "1"
+ ld [hli], a
+ ld a, "@"
+ ld [hl], a
+
+.lost
+ pop af
+ ld [InBattleTowerBattle], a
+ pop af
+ ld [Options], a
+ ld a, $1
+ ld [wBattleTowerBattleEnded], a
+ ret
+
+
+ReadBTTrainerParty: ; 1702b7
+; Initialise the BattleTower-Trainer and his Pkmn
+ call CopyBTTrainer_FromBT_OT_TowBT_OTTemp
+
+; Check the nicknames for illegal characters, and replace bad nicknames
+; with their species names.
+ ld de, wBT_OTTempPkmn1Name ; $c643
+ ld c, PKMN_NAME_LENGTH
+ farcall CheckStringForErrors
+ jr nc, .skip_mon_1
+
+ ld a, [wBT_OTTempPkmn1]
+ ld [wNamedObjectIndexBuffer], a
+ call GetPokemonName
+ ld l, e
+ ld h, d
+ ld de, wBT_OTTempPkmn1Name ; $c643
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+
+.skip_mon_1
+ ld de, wBT_OTTempPkmn2Name ; $c67e
+ ld c, PKMN_NAME_LENGTH
+ farcall CheckStringForErrors
+ jr nc, .skip_mon_2
+ ld a, [wBT_OTTempPkmn2] ; [$c64e]
+ ld [wNamedObjectIndexBuffer], a
+ call GetPokemonName
+ ld l, e
+ ld h, d
+ ld de, wBT_OTTempPkmn2Name ; $c67e
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+
+.skip_mon_2
+ ld de, wBT_OTTempPkmn3Name ; $c686 + 51 = $c6b9
+ ld c, PKMN_NAME_LENGTH
+ farcall CheckStringForErrors
+ jr nc, .skip_mon_3
+ ld a, [wBT_OTTempPkmn3] ; [$c689]
+ ld [wNamedObjectIndexBuffer], a
+ call GetPokemonName
+ ld l, e
+ ld h, d
+ ld de, wBT_OTTempPkmn3Name ; $c686 + 51 = $c6b9
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+
+.skip_mon_3
+; Add the terminator character to each of these names
+ ld a, "@"
+ ld [wBT_OTTempPkmn1NameEnd - 1], a ; $c64d
+ ld [wBT_OTTempPkmn2NameEnd - 1], a ; $c688
+ ld [wBT_OTTempPkmn3NameEnd - 1], a ; $c68a + 57 = $c6c3
+; Fix errors in the movesets
+ call CheckBTMonMovesForErrors
+; Repair the trainer name if needed, then copy it to OTPlayerName
+ ld de, wBT_OTTempName
+ ld c, NAME_LENGTH - 1
+ farcall CheckStringForErrors
+ jr nc, .trainer_name_okay
+ ld hl, BT_ChrisName
+ jr .done_trainer_name
+
+.trainer_name_okay
+ ld hl, wBT_OTTempName ; 0xc608
+
+.done_trainer_name
+ ld de, OTPlayerName
+ ld bc, NAME_LENGTH - 1
+ call CopyBytes
+ ld a, "@"
+ ld [de], a
+
+ ld hl, wBT_OTTempTrainerClass
+ ld a, [hli]
+ ld [OtherTrainerClass], a
+ ld a, LOW(OTPartyMonNicknames)
+ ld [BGMapBuffer], a
+ ld a, HIGH(OTPartyMonNicknames)
+ ld [BGMapBuffer + 1], a
+
+ ; Copy Pkmn into Memory from the address in hl
+ ld de, OTPartyMon1Species
+ ld bc, OTPartyCount
+ ld a, BATTLETOWER_NROFPKMNS ; Number of Pkmn the BattleTower-Trainer has
+ ld [bc], a
+ inc bc
+.otpartymon_loop
+ push af
+ ld a, [hl]
+ ld [bc], a
+ inc bc
+ push bc
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call CopyBytes
+ push de
+ ld a, [BGMapBuffer]
+ ld e, a
+ ld a, [BGMapBuffer + 1]
+ ld d, a
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+ ld a, e
+ ld [BGMapBuffer], a
+ ld a, d
+ ld [BGMapBuffer + 1], a
+ pop de
+ pop bc
+ pop af
+ dec a
+ and a
+ jr nz, .otpartymon_loop
+ ld a, -1
+ ld [bc], a
+ ret
+; 170394
+
+ValidateBTParty: ; 170394
+; Check for and fix errors in party data
+ ld hl, wBT_OTTempPkmn1Species
+ ld d, BATTLETOWER_NROFPKMNS
+.pkmn_loop
+ push de
+ push hl
+ ld b, h
+ ld c, l
+ ld a, [hl]
+ and a
+idx = $ff
+rept ($ff +- NUM_POKEMON)
+ jr z, .invalid
+ cp idx
+idx = idx +- 1
+endr
+ jr nz, .valid
+
+.invalid
+ ld a, SMEARGLE
+ ld [hl], a
+
+.valid
+ ld [CurSpecies], a
+ call GetBaseData
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$b2fb] ; s5_b2fb ; max level?
+ call CloseSRAM
+ ld e, a
+ ld hl, MON_LEVEL
+ add hl, bc
+ ld a, [hl]
+ cp MIN_LEVEL
+ ld a, MIN_LEVEL
+ jr c, .load
+ ld a, [hl]
+ cp e
+ jr c, .dont_load
+ ld a, e
+
+.load
+ ld [hl], a
+
+.dont_load
+ ld [CurPartyLevel], a
+ ld hl, MON_MOVES
+ add hl, bc
+ ld d, NUM_MOVES - 1
+ ld a, [hli]
+ and a
+ jr z, .not_move
+ cp NUM_ATTACKS + 1
+ jr nc, .not_move
+ jr .valid_move
+
+.not_move
+ dec hl
+ ld a, POUND
+ ld [hli], a
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ jr .done_moves
+
+.valid_move
+ ld a, [hl]
+ cp NUM_ATTACKS + 1
+ jr c, .next
+ ld [hl], $0
+
+.next
+ inc hl
+ dec d
+ jr nz, .valid_move
+
+.done_moves
+ ld hl, MON_MAXHP
+ add hl, bc
+ ld d, h
+ ld e, l
+ push hl
+ push de
+ ld hl, MON_STAT_EXP - 1
+ add hl, bc
+ ld b, $1
+ predef CalcPkmnStats
+ pop de
+ pop hl
+ dec de
+ dec de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ pop hl
+ ld bc, PARTYMON_STRUCT_LENGTH + PKMN_NAME_LENGTH
+ add hl, bc
+ pop de
+ dec d
+ jp nz, .pkmn_loop
+ ret
+; 170426
+
+BT_ChrisName: ; 170426
+ db "CHRIS@"
+; 17042c
+
+Function17042c: ; 17042c
+ ld hl, w3_d202TrainerData
+ ld a, BATTLETOWER_NROFTRAINERS
+.loop
+ push af
+ push hl
+ ld c, BATTLETOWER_TRAINERDATALENGTH / 2
+.loop2
+ ; First byte is a comparison value.
+ ld a, [hli]
+ ld b, a
+ ; Second byte is a lookup index.
+ ld a, [hli]
+ and a
+ jr z, .empty
+ cp 15
+ jr nc, .copy_data
+
+ push hl
+ ld hl, Unknown_170470
+ dec a
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ pop hl
+
+ ; If Unknown_170470[a-1] <= b, overwrite the current trainer's data
+ ; with Unknown17047e, and exit the inner loop.
+ cp b
+ jr c, .copy_data
+ jr z, .copy_data
+ jr .next_iteration
+
+.empty
+ ; If a == 0 and b >= $fc, overwrite the current trainer's data with
+ ; Unknown17047e, and exit the inner loop.
+ ld a, b
+ cp $fc
+ jr nc, .copy_data
+
+.next_iteration
+ dec c
+ jr nz, .loop2
+ jr .next_trainer
+
+.copy_data
+ pop de
+ push de
+ ld hl, Unknown_17047e
+ ld bc, BATTLETOWER_TRAINERDATALENGTH
+ call CopyBytes
+
+.next_trainer
+ pop hl
+ ld de, BATTLE_TOWER_STRUCT_LENGTH
+ add hl, de
+ pop af
+ dec a
+ jr nz, .loop
+ ret
+; 170470
+
+INCLUDE "data/battle_tower/unknown_levels.asm"
+
+
+CopyBTTrainer_FromBT_OT_TowBT_OTTemp: ; 1704a2
+; copy the BattleTower-Trainer data that lies at 'BT_OTTrainer' to 'wBT_OTTemp'
+ ld a, [rSVBK]
+ push af
+ ld a, BANK(BT_OTTrainer)
+ ld [rSVBK], a
+
+ ld hl, BT_OTTrainer
+ ld de, wBT_OTTemp
+ ld bc, BATTLE_TOWER_STRUCT_LENGTH
+ call CopyBytes
+
+ pop af
+ ld [rSVBK], a
+
+ ld a, BANK(sBattleTowerChallengeState)
+ call GetSRAMBank
+ ld a, BATTLETOWER_CHALLENGE_IN_PROGESS
+ ld [sBattleTowerChallengeState], a
+ ld hl, sNrOfBeatenBattleTowerTrainers
+ inc [hl]
+ call CloseSRAM
+SkipBattleTowerTrainer: ; 1704c9
+ ret
+; 1704ca
+
+Function1704ca: ; 1704ca
+; unreferenced mobile function
+ ld a, [$be46]
+ cp $7
+ jr c, .asm_1704d3
+ ld a, $6
+
+.asm_1704d3
+ ld hl, $afce
+ ld de, -$e0
+.asm_1704d9
+ and a
+ jr z, .asm_1704e0
+ add hl, de
+ dec a
+ jr .asm_1704d9
+
+.asm_1704e0
+ ret
+; 1704e1
+
+Function1704e1: ; 1704e1
+; unreferenced special
+ call SpeechTextBox
+ call FadeToMenu
+ call InitBattleTowerChallengeRAM
+ call .JumptableLoop
+ call CloseSubmenu
+ ret
+; 1704f1
+
+.JumptableLoop: ; 1704f1
+ call ClearBGPalettes
+ call ClearSprites
+ call ClearScreen
+.loop
+ call JoyTextDelay
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .done
+ call .DoJumptable
+ farcall ReloadMapPart
+ jr .loop
+
+.done
+ ret
+; 170510
+
+.DoJumptable: ; 170510
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, .dw
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+; 17051f
+
+.dw ; 17051f
+ dw .Jumptable_0
+ dw .Jumptable_1
+ dw .Jumptable_2
+; 170525
+
+.Jumptable_0: ; 170525
+ ld a, $5
+ call GetSRAMBank
+
+ ld hl, $a89c
+ ld de, StringBuffer3
+ ld bc, $16
+ call CopyBytes
+
+ ld hl, $a8b2
+ ld de, wMisc
+ ld bc, $0096
+ call CopyBytes
+
+ call CloseSRAM
+ hlcoord 1, 1
+ ld de, StringBuffer3
+ call PlaceString
+ hlcoord 1, 3
+ ld de, .String_Mail
+ call PlaceString
+ hlcoord 4, 3
+ ld de, StringBuffer4
+ call PlaceString
+ hlcoord 8, 3
+ ld de, .String_PastReaders
+ call PlaceString
+ call .DrawBorder
+ call .PlaceTextItems
+ jr .NextJumptableFunction
+
+
+.Jumptable_1:
+ call SetPalettes
+ call .NextJumptableFunction
+
+
+.Jumptable_2:
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .pressed_a_or_b
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .pressed_a_or_b
+ ld a, [hl]
+ and D_UP
+ jr nz, .pressed_up
+ ld a, [hl]
+ and D_DOWN
+ jr nz, .pressed_down
+ ret
+
+.pressed_up
+ ld a, [wNrOfBeatenBattleTowerTrainers]
+ and a
+ ret z
+ sub 15
+ ld [wNrOfBeatenBattleTowerTrainers], a
+ call .PlaceTextItems
+ ret
+
+.pressed_down
+ ld a, [wNrOfBeatenBattleTowerTrainers]
+ cp 60
+ ret z
+ add 15
+ ld [wNrOfBeatenBattleTowerTrainers], a
+ call .PlaceTextItems
+ ret
+
+.pressed_a_or_b
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+.NextJumptableFunction:
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+; 1705b7
+
+.DrawBorder: ; 1705b7
+ hlcoord 0, 4
+ ld a, $79
+ ld [hli], a
+ ld c, SCREEN_WIDTH - 2
+.top_border_loop
+ ld a, $7a
+ ld [hli], a
+ dec c
+ jr nz, .top_border_loop
+ ld a, $7b
+ ld [hli], a
+ ld de, SCREEN_WIDTH
+ ld c, 12
+.left_border_loop
+ ld a, $7c
+ ld [hl], a
+ add hl, de
+ dec c
+ jr nz, .left_border_loop
+ ld a, $7d
+ ld [hli], a
+ ld c, SCREEN_WIDTH - 2
+.bottom_border_loop
+ ld a, $7a
+ ld [hli], a
+ dec c
+ jr nz, .bottom_border_loop
+ ld a, $7e
+ ld [hl], a
+ ld de, -SCREEN_WIDTH
+ add hl, de
+ ld c, 12
+.right_border_loop
+ ld a, $7c
+ ld [hl], a
+ add hl, de
+ dec c
+ jr nz, .right_border_loop
+ ret
+; 1705f0
+
+.PlaceTextItems: ; 1705f0
+ call .ClearBox
+ call .PlaceUpDownArrows
+ ld a, $50
+ ld [wcd4e], a
+ ld hl, wMisc
+ ld a, [wNrOfBeatenBattleTowerTrainers]
+ ld c, a
+ xor a
+ ld b, a
+ add hl, bc
+ push hl
+ pop bc
+ hlcoord 1, 6
+ ld a, 6
+.loop1
+ push af
+ push hl
+ ld a, 3
+.loop2
+ push af
+ ld de, wcd49
+ ld a, [bc]
+ and a
+ jr z, .fill_with_e3
+; .copy
+ ld a, 5
+.loop3a
+ push af
+ ld a, [bc]
+ ld [de], a
+ inc bc
+ inc de
+ pop af
+ dec a
+ jr nz, .loop3a
+ jr .rejoin
+
+.fill_with_e3
+ ld a, 5
+.loop3b
+ push af
+ ld a, $e3
+ ld [de], a
+ inc de
+ inc bc
+ pop af
+ dec a
+ jr nz, .loop3b
+
+.rejoin
+ ld de, wcd49
+ push bc
+ call PlaceString
+ ld de, NAME_LENGTH_JAPANESE
+ add hl, de
+ pop bc
+ pop af
+ dec a
+ jr nz, .loop2
+ pop hl
+ ld de, $28
+ add hl, de
+ pop af
+ dec a
+ jr nz, .loop1
+ ret
+; 17064b
+
+.ClearBox: ; 17064b
+ hlcoord 1, 5
+ xor a
+ ld b, 12
+.clearbox_row
+ ld c, SCREEN_WIDTH - 2
+.clearbox_column
+ ld [hli], a
+ dec c
+ jr nz, .clearbox_column
+ inc hl
+ inc hl
+ dec b
+ jr nz, .clearbox_row
+ ret
+; 17065d
+
+.PlaceUpDownArrows: ; 17065d
+ ld a, [wNrOfBeatenBattleTowerTrainers]
+ and a
+ jr z, .nope
+ hlcoord 18, 5
+ ld a, "▲"
+ ld [hl], a
+
+.nope
+ ld a, [wNrOfBeatenBattleTowerTrainers]
+ cp 60
+ ret z
+ hlcoord 18, 16
+ ld a, "▼"
+ ld [hl], a
+ ret
+; 170676
+
+.String_Mail: ; 170676
+ db "ルーム@"
+; 17067a
+
+.String_PastReaders: ; 17067a
+ db "れきだいりーダーいちらん@"
+; 170687
+
+BattleTowerAction: ; 170687
+ ld a, [ScriptVar]
+ ld e, a
+ ld d, 0
+ ld hl, .dw
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+; 170696
+
+
+.dw ; 170696 (5c:4696)
+ dw BattleTowerAction_CheckExplanationRead ; 0x00
+ dw BattleTowerAction_SetExplanationRead ; 0x01
+ dw BattleTowerAction_GetChallengeState ; 0x02
+ dw BattleTowerAction_SetByteToQuickSaveChallenge ; 0x03
+ dw BattleTowerAction_SetByteToCancelChallenge ; 0x04
+ dw Function1707ac ; 0x05
+ dw Function1707f4 ; 0x06
+ dw SaveBattleTowerLevelGroup ; 0x07
+ dw LoadBattleTowerLevelGroup ; 0x08
+ dw BattleTower_CheckSaveFileExistsAndIsYours ; 0x09
+ dw Function1708b1 ; 0x0a
+ dw CheckMobileEventIndex ; 0x0b
+ dw Function1708c8 ; 0x0c
+ dw Function1708f0 ; 0x0d
+ dw BattleTowerAction_EggTicket ; 0x0e
+ dw Function1709aa ; 0x0f
+ dw Function1709bb ; 0x10
+ dw Function170a9c ; 0x11
+ dw Function170aa0 ; 0x12
+ dw Function170aaf ; 0x13
+ dw Function170abe ; 0x14
+ dw Function170ad7 ; 0x15
+ dw Function170807 ; 0x16
+ dw Function17081d ; 0x17
+ dw BattleTowerAction_LevelCheck ; 0x18
+ dw BattleTowerAction_UbersCheck ; 0x19
+ dw ResetBattleTowerTrainersSRAM ; 0x1a
+ dw BattleTower_GiveReward ; 0x1b
+ dw Function17071b ; 0x1c
+ dw Function170729 ; 0x1d
+ dw BattleTower_RandomlyChooseReward ; 0x1e
+ dw BattleTower_SaveOptions ; 0x1f
+
+
+; Reset the save memory for BattleTower-Trainers (Counter and all 7 TrainerBytes)
+ResetBattleTowerTrainersSRAM: ; 1706d6 (5c:46d6) BattleTowerAction $1a
+ ld a, BANK(sBTTrainers)
+ call GetSRAMBank
+
+ ld a, $ff
+ ld hl, sBTTrainers
+ ld bc, BATTLETOWER_NROFTRAINERS
+ call ByteFill
+
+ xor a
+ ld [sNrOfBeatenBattleTowerTrainers], a
+
+ call CloseSRAM
+
+ ret
+
+BattleTower_GiveReward: ; 1706ee (5c:46ee) BattleTowerAction $1b
+ ld a, BANK(sBattleTowerReward)
+ call GetSRAMBank
+
+ ld a, [sBattleTowerReward]
+ call CloseSRAM
+ ld [ScriptVar], a
+ ld hl, NumItems
+ ld a, [hli]
+ cp MAX_ITEMS
+ ret c
+ ld b, MAX_ITEMS
+ ld a, [ScriptVar]
+ ld c, a
+.loop
+ ld a, [hli]
+ cp c
+ jr nz, .next
+ ld a, [hl]
+ cp 95
+ ret c
+.next
+ inc hl
+ dec b
+ jr nz, .loop
+ ld a, POTION
+ ld [ScriptVar], a
+ ret
+
+Function17071b: ; 17071b (5c:471b) BattleTowerAction $1c
+ ld a, BANK(sBattleTowerChallengeState)
+ call GetSRAMBank
+ ld a, BATTLETOWER_WON_CHALLENGE
+ ld [sBattleTowerChallengeState], a
+ call CloseSRAM
+ ret
+
+Function170729: ; 170729 (5c:4729) BattleTowerAction $1d
+ ld a, BANK(sBattleTowerChallengeState)
+ call GetSRAMBank
+ ld a, BATTLETOWER_RECEIVED_REWARD
+ ld [sBattleTowerChallengeState], a
+ call CloseSRAM
+ ret
+
+BattleTower_SaveOptions: ; 170737 (5c:4737) BattleTowerAction $1f
+ farcall SaveOptions
+ ret
+
+BattleTower_RandomlyChooseReward: ; 17073e (5c:473e) BattleTowerAction $1e
+; Generate a random stat boosting item.
+.loop
+ call Random
+ ld a, [hRandomAdd]
+ and $7
+ cp 6
+ jr c, .okay
+ sub 6
+.okay
+ add HP_UP
+ cp LUCKY_PUNCH
+ jr z, .loop
+ push af
+ ld a, BANK(sBattleTowerReward)
+ call GetSRAMBank
+ pop af
+ ld [sBattleTowerReward], a
+ call CloseSRAM
+ ret
+
+BattleTowerAction_CheckExplanationRead: ; 17075f (5c:475f) BattleTowerAction $00
+ call BattleTower_CheckSaveFileExistsAndIsYours
+ ld a, [ScriptVar]
+ and a
+ ret z
+
+ ld a, BANK(sBattleTowerSaveFileFlags)
+ call GetSRAMBank
+ ld a, [sBattleTowerSaveFileFlags]
+ and $2
+ ld [ScriptVar], a
+ call CloseSRAM
+ ret
+
+BattleTowerAction_GetChallengeState: ; 170778 (5c:4778) BattleTowerAction $02
+ ld hl, sBattleTowerChallengeState
+ ld a, BANK(sBattleTowerChallengeState)
+ call GetSRAMBank
+ ld a, [hl]
+ ld [ScriptVar], a
+ call CloseSRAM
+ ret
+
+BattleTowerAction_SetExplanationRead: ; 170788 (5c:4788) BattleTowerAction $01
+ ld a, BANK(sBattleTowerSaveFileFlags)
+ call GetSRAMBank
+ ld a, [sBattleTowerSaveFileFlags]
+ or $2
+ ld [sBattleTowerSaveFileFlags], a
+ call CloseSRAM
+ ret
+
+BattleTowerAction_SetByteToQuickSaveChallenge: ; 170799 (5c:4799) BattleTowerAction $03
+ ld c, BATTLETOWER_SAVED_AND_LEFT
+ jr asm_17079f
+
+BattleTowerAction_SetByteToCancelChallenge: ; 17079d (5c:479d) BattleTowerAction $04
+ ld c, BATTLETOWER_NO_CHALLENGE
+asm_17079f: ; 17079f (5c:479f)
+ ld a, BANK(sBattleTowerChallengeState)
+ call GetSRAMBank
+ ld a, c
+ ld [sBattleTowerChallengeState], a
+ call CloseSRAM
+ ret
+
+Function1707ac: ; 1707ac (5c:47ac) BattleTowerAction $05
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$aa8c]
+ ld b, a
+ ld a, [$be46]
+ ld [ScriptVar], a
+ call CloseSRAM
+ and a
+ ret z
+ ld a, b
+ cp $2
+ jr nc, .asm_1707ef
+ push bc
+ call UpdateTime
+ pop bc
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$aa8b]
+ call CloseSRAM
+ ld c, a
+ ld a, [CurDay]
+ sub c
+ jr c, .asm_1707e5
+ cp $8
+ jr nc, .asm_1707ef
+ ld a, b
+ and a
+ jr nz, .asm_1707ef
+ ret
+.asm_1707e5
+ ld hl, CurDay
+ ld a, $8c
+ sub c
+ add [hl]
+ cp $8
+ ret c
+.asm_1707ef
+ ld a, $8
+ ld [ScriptVar], a
+
+Function1707f4: ; 1707f4 (5c:47f4) BattleTowerAction $06
+ ld a, $5
+ call GetSRAMBank
+ xor a
+ ld [$be46], a
+ ld [$aa8b], a
+ ld [$aa8c], a
+ call CloseSRAM
+ ret
+
+Function170807: ; 170807 (5c:4807) BattleTowerAction $16
+ call UpdateTime
+ ld a, $5
+ call GetSRAMBank
+ ld a, [CurDay]
+ ld [$b2f9], a
+ xor a
+ ld [$b2fa], a
+ call CloseSRAM
+ ret
+
+Function17081d: ; 17081d (5c:481d) BattleTowerAction $17
+ xor a
+ ld [ScriptVar], a
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$b2f9]
+ ld c, a
+ ld a, [$b2fa]
+ ld b, a
+ call CloseSRAM
+ cp $2
+ jr nc, .asm_170853
+ push bc
+ call UpdateTime
+ pop bc
+ ld a, [CurDay]
+ sub c
+ jr c, .asm_170849
+ cp $b
+ jr nc, .asm_170853
+ ld a, b
+ and a
+ jr nz, .asm_170853
+ ret
+
+.asm_170849
+ ld hl, CurDay
+ ld a, 140
+ sub c
+ add [hl]
+ cp $b
+ ret c
+.asm_170853
+ ld a, $1
+ ld [ScriptVar], a
+ ld a, $5
+ call GetSRAMBank
+ xor a
+ ld [$b2f9], a
+ ld [$b2fa], a
+ call CloseSRAM
+ ret
+
+SaveBattleTowerLevelGroup: ; 170868 (5c:4868) BattleTowerAction $07
+ ld a, BANK(sBTChoiceOfLevelGroup)
+ call GetSRAMBank
+ ld a, [rSVBK]
+ push af
+ ld a, $3
+ ld [rSVBK], a
+ ld a, [wBTChoiceOfLvlGroup]
+ ld [sBTChoiceOfLevelGroup], a
+ pop af
+ ld [rSVBK], a
+ call CloseSRAM
+ ret
+
+LoadBattleTowerLevelGroup: ; 170881 (5c:4881) BattleTowerAction $08 ; Load level group choice
+ ld a, BANK(sBTChoiceOfLevelGroup)
+ call GetSRAMBank
+ ld a, [rSVBK]
+ push af
+ ld a, $3
+ ld [rSVBK], a
+ ld a, [sBTChoiceOfLevelGroup]
+ ld [wBTChoiceOfLvlGroup], a
+ pop af
+ ld [rSVBK], a
+ call CloseSRAM
+ ret
+
+BattleTower_CheckSaveFileExistsAndIsYours: ; 17089a BattleTowerAction $09
+ ld a, [wSaveFileExists]
+ and a
+ jr z, .nope
+ farcall CompareLoadedAndSavedPlayerID
+ jr z, .yes
+ xor a
+ jr .nope
+
+.yes
+ ld a, $1
+
+.nope
+ ld [ScriptVar], a
+ ret
+; 1708b1
+
+
+Function1708b1: ; 1708b1 (5c:48b1) BattleTowerAction $0a
+ xor a
+ ld [MusicFade], a
+ call MaxVolume
+ ret
+
+CheckMobileEventIndex: ; 1708b9 (5c:48b9) BattleTowerAction $0b something to do with GS Ball
+ ld a, BANK(sMobileEventIndex)
+ call GetSRAMBank
+ ld a, [sMobileEventIndex]
+ ld [ScriptVar], a
+ call CloseSRAM
+ ret
+
+Function1708c8: ; 1708c8 (5c:48c8) BattleTowerAction $0c
+ call UpdateTime
+ ld a, $5
+ call GetSRAMBank
+ ld a, [CurDay]
+ ld [$aa8b], a
+ xor a
+ ld [$aa8c], a
+ ld a, [$aa5d]
+ cp $2
+ jr nc, .asm_1708ec
+ ld a, [CurDay]
+ ld [$aa48], a
+ ld a, $1
+ ld [$aa47], a
+.asm_1708ec
+ call CloseSRAM
+ ret
+
+Function1708f0: ; 1708f0 (5c:48f0) BattleTowerAction $0d
+ xor a
+ ld [ScriptVar], a
+ call UpdateTime
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$aa48]
+ ld c, a
+ ld a, [$aa47]
+ call CloseSRAM
+ and a
+ ret z
+ ld hl, CurDay
+ ld a, c
+ cp [hl]
+ jr nz, Function170923
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$aa5d]
+ call CloseSRAM
+ cp $5
+ ret c
+ ld a, $1
+ ld [ScriptVar], a
+ ret
+
+
+Function170923: ; 170923
+ ld a, $5
+ call GetSRAMBank
+ xor a
+ ld [$aa48], a
+ ld [$aa47], a
+ ld hl, $aa5d
+ ld bc, $0011
+ call ByteFill
+ call CloseSRAM
+ ret
+; 17093c
+
+
+BattleTowerAction_EggTicket: ; 17093c (5c:493c) BattleTowerAction $0e
+ xor a
+ ld [ScriptVar], a
+ ld a, EGG_TICKET
+ ld [CurItem], a
+ ld hl, NumItems
+ call CheckItem
+ ret nc
+ ld a, [PartyCount]
+ ld b, 0
+ ld c, a
+ ld hl, PartySpecies
+.loop
+ ld a, [hli]
+ cp EGG
+ jr nz, .not_egg
+ push hl
+ ld hl, PartyMonOT
+ ld de, NAME_LENGTH_JAPANESE
+ ld a, b
+ and a
+ jr z, .skip
+.loop2
+ add hl, de
+ dec a
+ jr nz, .loop2
+.skip
+ ld de, String_1709a4
+ ld a, NAME_LENGTH_JAPANESE
+.compare_loop
+ push af
+ ld a, [de]
+ inc de
+ cp [hl]
+ inc hl
+ jr nz, .different
+ pop af
+ dec a
+ jr nz, .compare_loop
+rept 4
+ dec hl
+endr
+ ld a, "@"
+ ld [hli], a
+ ld [hli], a
+ pop hl
+ ld a, EGG_TICKET
+ ld [CurItem], a
+ ld a, 1
+ ld [wItemQuantityChangeBuffer], a
+ ld a, -1
+ ld [CurItemQuantity], a
+ ld hl, NumItems
+ call TossItem
+ ld a, $1
+ ld [ScriptVar], a
+ ret
+
+.different
+ pop af
+ pop hl
+.not_egg
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+; 1709a4 (5c:49a4)
+
+String_1709a4: ; 1709a4
+ db "なぞナゾ@@"
+
+Function1709aa: ; 1709aa (5c:49aa) BattleTowerAction $0f
+ ld a, [rSVBK]
+ push af
+ ld a, BANK(w3_d090)
+ ld [rSVBK], a
+ ld a, [w3_d090]
+ ld [ScriptVar], a
+ pop af
+ ld [rSVBK], a
+ ret
+
+Function1709bb: ; 1709bb (5c:49bb) BattleTowerAction $10
+ xor a
+ ld [ScriptVar], a
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$a800]
+ call CloseSRAM
+ cp 6
+ jr nc, .invalid
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_1709e7
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.invalid
+ ld a, $5
+ call GetSRAMBank
+ xor a
+ ld [$a800], a
+ call CloseSRAM
+ ret
+; 1709e7 (5c:49e7)
+
+Jumptable_1709e7: ; 1709e7
+ dw .NoAction
+ dw .NoAction
+ dw .DoAction1
+ dw .DoAction1
+ dw .Action4
+ dw .Action5
+; 1709f3
+
+.DoAction1: ; 1709f3
+ ld a, $5
+ call GetSRAMBank
+ ld a, $1
+ ld [$a800], a
+ call CloseSRAM
+
+.NoAction: ; 170a00
+ ret
+; 170a01
+
+.Action4: ; 170a01
+ ld a, $5
+ call GetSRAMBank
+ ld hl, $b023
+ ld de, wMisc
+ ld bc, $0069
+ call CopyBytes
+ ld a, [$a825]
+ ld [wcd30], a
+ ld a, [$a826]
+ ld [wcd31], a
+ call CloseSRAM
+ farcall Function11b6b4
+ farcall Function17d0f3
+ ld a, $1
+ ld [ScriptVar], a
+ ret
+; 170a33
+
+.Action5: ; 170a33
+ ld a, $0
+ call GetSRAMBank
+ ld hl, wRTC
+ ld de, wMisc
+ ld bc, $0004
+ call CopyBytes
+ call CloseSRAM
+ ld a, $5
+ call GetSRAMBank
+ ld hl, $b08c
+ ld de, wMisc
+ ld c, $4
+.compare_loop
+ ld a, [de]
+ inc de
+ cp [hl]
+ jr nz, .different
+ inc hl
+ dec c
+ jr nz, .compare_loop
+ call CloseSRAM
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+ call GetMapSceneID
+ ld a, d
+ or e
+ jr z, .no_scene
+ ld a, [de]
+ and a
+ ret nz
+
+.no_scene
+ ld a, $1
+ ld [ScriptVar], a
+ ret
+
+.different
+ call CloseSRAM
+ ld a, $5
+ call GetSRAMBank
+ xor a
+ ld [$a800], a
+ call CloseSRAM
+ ld [ScriptVar], a
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+ call GetMapSceneID
+ ld a, d
+ or e
+ jr z, .no_scene_2
+ xor a
+ ld [de], a
+
+.no_scene_2
+ ret
+; 170a9c
+
+Function170a9c: ; 170a9c (5c:4a9c) BattleTowerAction $11
+ ld c, $0
+ jr asm_170aa2
+
+Function170aa0: ; 170aa0 (5c:4aa0) BattleTowerAction $12
+ ld c, $1
+asm_170aa2: ; 170aa2 (5c:4aa2)
+ ld a, $5
+ call GetSRAMBank
+ ld a, c
+ ld [$aa8d], a
+ call CloseSRAM
+ ret
+
+Function170aaf: ; 170aaf (5c:4aaf) BattleTowerAction $13
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$aa8d]
+ ld [ScriptVar], a
+ call CloseSRAM
+ ret
+
+Function170abe: ; 170abe (5c:4abe) BattleTowerAction $14
+ call BattleTower_CheckSaveFileExistsAndIsYours
+ ld a, [ScriptVar]
+ and a
+ ret z
+
+ ld a, BANK(sBattleTowerSaveFileFlags)
+ call GetSRAMBank
+ ld a, [sBattleTowerSaveFileFlags]
+ and $1
+ ld [ScriptVar], a
+ call CloseSRAM
+ ret
+
+Function170ad7: ; 170ad7 (5c:4ad7) BattleTowerAction $15
+ ld a, BANK(sBattleTowerSaveFileFlags)
+ call GetSRAMBank
+ ld a, [sBattleTowerSaveFileFlags]
+ or $1
+ ld [sBattleTowerSaveFileFlags], a
+ call CloseSRAM
+ ret
+
+BattleTowerAction_LevelCheck: ; 170ae8 (5c:4ae8) BattleTowerAction $18
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$b2fb]
+ call CloseSRAM
+ ld c, 10
+ call SimpleDivide
+ ld a, b
+ ld [wcd4f], a
+ xor a
+ ld [ScriptVar], a
+ farcall BattleTower_LevelCheck ; level check
+ ret nc
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$b2fb]
+ call CloseSRAM
+ ld [ScriptVar], a
+ ret
+
+BattleTowerAction_UbersCheck: ; 170b16 (5c:4b16) BattleTowerAction $19
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$b2fb]
+ call CloseSRAM
+ ld c, 10
+ call SimpleDivide
+ ld a, b
+ ld [wcd4f], a
+ xor a
+ ld [ScriptVar], a
+ farcall BattleTower_UbersCheck
+ ret nc
+ ld a, $5
+ call GetSRAMBank
+ ld a, [$b2fb]
+ call CloseSRAM
+ ld [ScriptVar], a
+ ret
+
+Function_LoadOpponentTrainerAndPokemonsWithOTSprite: ; 0x170b44
+ farcall Function_LoadOpponentTrainerAndPokemons
+ ld a, [rSVBK]
+ push af
+ ld a, $3
+ ld [rSVBK], a
+ ld hl, BT_OTTrainerClass
+ ld a, [hl]
+ dec a
+ ld c, a
+ ld b, $0
+ pop af
+ ld [rSVBK], a
+ ld hl, BTTrainerClassSprites
+ add hl, bc
+ ld a, [hl]
+ ld [wBTTempOTSprite], a
+
+; Load sprite of the opponent trainer
+; because s/he is chosen randomly and appears out of nowhere
+ ld a, [ScriptVar]
+ dec a
+ sla a
+ ld e, a
+ sla a
+ sla a
+ sla a
+ ld c, a
+ ld b, 0
+ ld d, 0
+ ld hl, MapObjects
+ add hl, bc
+ inc hl
+ ld a, [wBTTempOTSprite]
+ ld [hl], a
+ ld hl, UsedSprites
+ add hl, de
+ ld [hli], a
+ ld [hUsedSpriteIndex], a
+ ld a, [hl]
+ ld [hUsedSpriteTile], a
+ farcall GetUsedSprite
+ ret
+; 170b90
+
+INCLUDE "data/trainers/sprites.asm"
+
+ret_170bd2: ; 170bd2
+ ret
+; 170bd3
+
+SpecialCheckForBattleTowerRules: ; 170bd3
+ farcall CheckForBattleTowerRules
+ jr c, .asm_170bde
+ xor a
+ jr .asm_170be0
+
+.asm_170bde
+ ld a, $1
+
+.asm_170be0
+ ld [ScriptVar], a
+ ret
+; 170be4
diff --git a/engine/events/battle_tower/get_trainer_class.asm b/engine/events/battle_tower/get_trainer_class.asm
new file mode 100644
index 000000000..37fe91c56
--- /dev/null
+++ b/engine/events/battle_tower/get_trainer_class.asm
@@ -0,0 +1,46 @@
+GetMobileOTTrainerClass: ; mobile function
+ ld h, b
+ ld l, c
+ call .GetMobileOTTrainerClass
+ ld c, a
+ ret
+
+.GetMobileOTTrainerClass: ; 4e930
+ ld a, [hli]
+ xor [hl]
+ ld c, a
+ jr z, .skip_male_trainers
+ srl c
+ srl c
+.male_trainer_loop
+ srl c
+ ld a, c
+ cp MaleTrainersEnd - MaleTrainers - 1
+ jr nc, .male_trainer_loop
+ inc c
+
+.skip_male_trainers
+ ld a, [de]
+ cp $1
+ ld hl, MaleTrainers
+ jr nz, .finished
+
+ ld hl, FemaleTrainers
+ ld a, c
+ and a
+ jr z, .finished
+
+.female_trainer_loop
+ srl c
+ ld a, c
+ cp FemaleTrainersEnd - FemaleTrainers - 1
+ jr nc, .female_trainer_loop
+ inc c
+
+.finished
+ ld b, $0
+ add hl, bc
+ ld a, [hl]
+ ret
+
+INCLUDE "data/trainers/gendered_trainers.asm"
diff --git a/engine/events/battle_tower.asm b/engine/events/battle_tower/load_trainer.asm
index a0de6ee84..5d8c06166 100644
--- a/engine/events/battle_tower.asm
+++ b/engine/events/battle_tower/load_trainer.asm
@@ -207,4 +207,4 @@ Function_LoadRandomBattleTowerPkmn: ; 1f8081
ret
; 1f814e
-INCLUDE "data/battle_tower.asm"
+INCLUDE "data/battle_tower/parties.asm"
diff --git a/engine/events/battle_tower_rules.asm b/engine/events/battle_tower/rules.asm
index de6022145..de6022145 100644
--- a/engine/events/battle_tower_rules.asm
+++ b/engine/events/battle_tower/rules.asm
diff --git a/engine/events/battle_tower/trainer_text.asm b/engine/events/battle_tower/trainer_text.asm
new file mode 100755
index 000000000..21704ff2d
--- /dev/null
+++ b/engine/events/battle_tower/trainer_text.asm
@@ -0,0 +1,718 @@
+BattleTowerText:: ; 11c000
+; Print text c for trainer [BT_OTTrainerClass]
+; 1: Intro text
+; 2: Player lost
+; 3: Player won
+ ld a, [rSVBK]
+ push af
+ ld a, BANK(BT_OTTrainerClass)
+ ld [rSVBK], a
+if DEF(CRYSTAL11)
+ ld hl, BT_OTTrainerClass
+else
+; BUG ALERT
+; Instead of loading the Trainer Class, this routine
+; loads the 6th character in the Trainer's name, then
+; uses it to get the gender of the trainer.
+; As a consequence, the enemy trainer's dialog will
+; always be sampled from the female array.
+ ld hl, BT_OTName + 5
+endc
+ ld a, [hl]
+ dec a
+ ld e, a
+ ld d, 0
+ ld hl, BTTrainerClassGenders
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .female
+ ; generate a random number between 0 and 24
+ ld a, [hRandomAdd]
+ and $1f
+ cp 25
+ jr c, .okay0
+ sub 25
+
+.okay0
+ ld hl, BTMaleTrainerTexts
+ jr .proceed
+
+.female
+ ; generate a random number between 0 and 14
+ ld a, [hRandomAdd]
+ and $f
+ cp 15
+ jr c, .okay1
+ sub 15
+
+.okay1
+ ld hl, BTFemaleTrainerTexts
+
+.proceed
+ ld b, 0
+ dec c
+ jr nz, .restore
+ ld [BT_TrainerTextIndex], a
+ jr .okay2
+
+.restore
+ ld a, [BT_TrainerTextIndex]
+
+.okay2
+ push af
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld c, a
+ ld a, [hl]
+ ld h, a
+ ld l, c
+ pop af
+ ld c, a
+ ld b, 0
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld c, a
+ ld a, [hl]
+ ld l, c
+ ld h, a
+ bccoord 1, 14
+ pop af
+ ld [rSVBK], a
+ call PlaceHLTextAtBC
+ ret
+; 11c05d
+
+INCLUDE "mobile/fixed_words.asm"
+
+INCLUDE "data/trainers/genders.asm"
+
+
+BTMaleTrainerTexts: ; 11f332
+ dw .Greetings
+ dw .PlayerLost
+ dw .PlayerWon
+
+.Greetings: ; 11f338
+ dw BTGreetingM1
+ dw BTGreetingM2
+ dw BTGreetingM3
+ dw BTGreetingM4
+ dw BTGreetingM5
+ dw BTGreetingM6
+ dw BTGreetingM7
+ dw BTGreetingM8
+ dw BTGreetingM9
+ dw BTGreetingM10
+ dw BTGreetingM11
+ dw BTGreetingM12
+ dw BTGreetingM13
+ dw BTGreetingM14
+ dw BTGreetingM15
+ dw BTGreetingM16
+ dw BTGreetingM17
+ dw BTGreetingM18
+ dw BTGreetingM19
+ dw BTGreetingM20
+ dw BTGreetingM21
+ dw BTGreetingM22
+ dw BTGreetingM23
+ dw BTGreetingM24
+ dw BTGreetingM25
+
+.PlayerLost: ; 11f36a
+ dw BTLossM1
+ dw BTLossM2
+ dw BTLossM3
+ dw BTLossM4
+ dw BTLossM5
+ dw BTLossM6
+ dw BTLossM7
+ dw BTLossM8
+ dw BTLossM9
+ dw BTLossM10
+ dw BTLossM11
+ dw BTLossM12
+ dw BTLossM13
+ dw BTLossM14
+ dw BTLossM15
+ dw BTLossM16
+ dw BTLossM17
+ dw BTLossM18
+ dw BTLossM19
+ dw BTLossM20
+ dw BTLossM21
+ dw BTLossM22
+ dw BTLossM23
+ dw BTLossM24
+ dw BTLossM25
+
+.PlayerWon: ; 11f39c
+ dw BTWinM1
+ dw BTWinM2
+ dw BTWinM3
+ dw BTWinM4
+ dw BTWinM5
+ dw BTWinM6
+ dw BTWinM7
+ dw BTWinM8
+ dw BTWinM9
+ dw BTWinM10
+ dw BTWinM11
+ dw BTWinM12
+ dw BTWinM13
+ dw BTWinM14
+ dw BTWinM15
+ dw BTWinM16
+ dw BTWinM17
+ dw BTWinM18
+ dw BTWinM19
+ dw BTWinM20
+ dw BTWinM21
+ dw BTWinM22
+ dw BTWinM23
+ dw BTWinM24
+ dw BTWinM25
+
+
+BTFemaleTrainerTexts:
+ dw .Greetings
+ dw .PlayerLost
+ dw .PlayerWon
+
+.Greetings: ; 11f3d4
+ dw BTGreetingF1
+ dw BTGreetingF2
+ dw BTGreetingF3
+ dw BTGreetingF4
+ dw BTGreetingF5
+ dw BTGreetingF6
+ dw BTGreetingF7
+ dw BTGreetingF8
+ dw BTGreetingF9
+ dw BTGreetingF10
+ dw BTGreetingF11
+ dw BTGreetingF12
+ dw BTGreetingF13
+ dw BTGreetingF14
+ dw BTGreetingF15
+
+.PlayerLost: ; 11f3f2
+ dw BTLossF1
+ dw BTLossF2
+ dw BTLossF3
+ dw BTLossF4
+ dw BTLossF5
+ dw BTLossF6
+ dw BTLossF7
+ dw BTLossF8
+ dw BTLossF9
+ dw BTLossF10
+ dw BTLossF11
+ dw BTLossF12
+ dw BTLossF13
+ dw BTLossF14
+ dw BTLossF15
+
+.PlayerWon: ; 11f410
+ dw BTWinF1
+ dw BTWinF2
+ dw BTWinF3
+ dw BTWinF4
+ dw BTWinF5
+ dw BTWinF6
+ dw BTWinF7
+ dw BTWinF8
+ dw BTWinF9
+ dw BTWinF10
+ dw BTWinF11
+ dw BTWinF12
+ dw BTWinF13
+ dw BTWinF14
+ dw BTWinF15
+
+
+BTGreetingM1: ; 0x11f42e
+ text_jump BattleTowerText_0x1ec000
+ db "@"
+
+BTLossM1: ; 0x11f433
+ text_jump BattleTowerText_0x1ec03b
+ db "@"
+
+BTWinM1: ; 0x11f438
+ text_jump UnknownText_0x1ec060
+ db "@"
+
+BTGreetingM2: ; 0x11f43d
+ text_jump BattleTowerText_0x1ec080
+ db "@"
+
+BTLossM2: ; 0x11f442
+ text_jump UnknownText_0x1ec0a3
+ db "@"
+
+BTWinM2: ; 0x11f447
+ text_jump UnknownText_0x1ec0c4
+ db "@"
+
+BTGreetingM3: ; 0x11f44c
+ text_jump UnknownText_0x1ec0e1
+ db "@"
+
+BTLossM3: ; 0x11f451
+ text_jump UnknownText_0x1ec108
+ db "@"
+
+BTWinM3: ; 0x11f456
+ text_jump UnknownText_0x1ec12a
+ db "@"
+
+BTGreetingM4: ; 0x11f45b
+ text_jump UnknownText_0x1ec14d
+ db "@"
+
+BTLossM4: ; 0x11f460
+ text_jump UnknownText_0x1ec16f
+ db "@"
+
+BTWinM4: ; 0x11f465
+ text_jump UnknownText_0x1ec190
+ db "@"
+
+BTGreetingM5: ; 0x11f46a
+ text_jump UnknownText_0x1ec1ae
+ db "@"
+
+BTLossM5: ; 0x11f46f
+ text_jump UnknownText_0x1ec1d0
+ db "@"
+
+BTWinM5: ; 0x11f474
+ text_jump UnknownText_0x1ec1f4
+ db "@"
+
+BTGreetingM6: ; 0x11f479
+ text_jump UnknownText_0x1ec216
+ db "@"
+
+BTLossM6: ; 0x11f47e
+ text_jump UnknownText_0x1ec238
+ db "@"
+
+BTWinM6: ; 0x11f483
+ text_jump UnknownText_0x1ec259
+ db "@"
+
+BTGreetingM7: ; 0x11f488
+ text_jump UnknownText_0x1ec27b
+ db "@"
+
+BTLossM7: ; 0x11f48d
+ text_jump UnknownText_0x1ec2a0
+ db "@"
+
+BTWinM7: ; 0x11f492
+ text_jump UnknownText_0x1ec2c0
+ db "@"
+
+BTGreetingM8: ; 0x11f497
+ text_jump UnknownText_0x1ec2d9
+ db "@"
+
+BTLossM8: ; 0x11f49c
+ text_jump UnknownText_0x1ec2fe
+ db "@"
+
+BTWinM8: ; 0x11f4a1
+ text_jump UnknownText_0x1ec320
+ db "@"
+
+BTGreetingM9: ; 0x11f4a6
+ text_jump UnknownText_0x1ec33f
+ db "@"
+
+BTLossM9: ; 0x11f4ab
+ text_jump UnknownText_0x1ec36c
+ db "@"
+
+BTWinM9: ; 0x11f4b0
+ text_jump UnknownText_0x1ec389
+ db "@"
+
+BTGreetingM10: ; 0x11f4b5
+ text_jump UnknownText_0x1ec3ad
+ db "@"
+
+BTLossM10: ; 0x11f4ba
+ text_jump UnknownText_0x1ec3c5
+ db "@"
+
+BTWinM10: ; 0x11f4bf
+ text_jump UnknownText_0x1ec3e5
+ db "@"
+
+BTGreetingM11: ; 0x11f4c4
+ text_jump UnknownText_0x1ec402
+ db "@"
+
+BTLossM11: ; 0x11f4c9
+ text_jump UnknownText_0x1ec411
+ db "@"
+
+BTWinM11: ; 0x11f4ce
+ text_jump UnknownText_0x1ec41f
+ db "@"
+
+BTGreetingM12: ; 0x11f4d3
+ text_jump UnknownText_0x1ec42e
+ db "@"
+
+BTLossM12: ; 0x11f4d8
+ text_jump UnknownText_0x1ec461
+ db "@"
+
+BTWinM12: ; 0x11f4dd
+ text_jump UnknownText_0x1ec4a0
+ db "@"
+
+BTGreetingM13: ; 0x11f4e2
+ text_jump UnknownText_0x1ec4d6
+ db "@"
+
+BTLossM13: ; 0x11f4e7
+ text_jump UnknownText_0x1ec4f5
+ db "@"
+
+BTWinM13: ; 0x11f4ec
+ text_jump UnknownText_0x1ec512
+ db "@"
+
+BTGreetingM14: ; 0x11f4f1
+ text_jump UnknownText_0x1ec532
+ db "@"
+
+BTLossM14: ; 0x11f4f6
+ text_jump UnknownText_0x1ec54b
+ db "@"
+
+BTWinM14: ; 0x11f4fb
+ text_jump UnknownText_0x1ec565
+ db "@"
+
+BTGreetingM15: ; 0x11f500
+ text_jump UnknownText_0x1ec580
+ db "@"
+
+BTLossM15: ; 0x11f505
+ text_jump UnknownText_0x1ec59d
+ db "@"
+
+BTWinM15: ; 0x11f50a
+ text_jump UnknownText_0x1ec5b5
+ db "@"
+
+BTGreetingM16: ; 0x11f50f
+ text_jump UnknownText_0x1ec5d3
+ db "@"
+
+BTLossM16: ; 0x11f514
+ text_jump UnknownText_0x1ec5ee
+ db "@"
+
+BTWinM16: ; 0x11f519
+ text_jump UnknownText_0x1ec60d
+ db "@"
+
+BTGreetingM17: ; 0x11f51e
+ text_jump UnknownText_0x1ec631
+ db "@"
+
+BTLossM17: ; 0x11f523
+ text_jump UnknownText_0x1ec651
+ db "@"
+
+BTWinM17: ; 0x11f528
+ text_jump UnknownText_0x1ec68f
+ db "@"
+
+BTGreetingM18: ; 0x11f52d
+ text_jump UnknownText_0x1ec6b1
+ db "@"
+
+BTLossM18: ; 0x11f532
+ text_jump UnknownText_0x1ec6d0
+ db "@"
+
+BTWinM18: ; 0x11f537
+ text_jump UnknownText_0x1ec708
+ db "@"
+
+BTGreetingM19: ; 0x11f53c
+ text_jump UnknownText_0x1ec720
+ db "@"
+
+BTLossM19: ; 0x11f541
+ text_jump UnknownText_0x1ec73e
+ db "@"
+
+BTWinM19: ; 0x11f546
+ text_jump UnknownText_0x1ec75b
+ db "@"
+
+BTGreetingM20: ; 0x11f54b
+ text_jump UnknownText_0x1ec77f
+ db "@"
+
+BTLossM20: ; 0x11f550
+ text_jump UnknownText_0x1ec798
+ db "@"
+
+BTWinM20: ; 0x11f555
+ text_jump UnknownText_0x1ec7bb
+ db "@"
+
+BTGreetingM21: ; 0x11f55a
+ text_jump UnknownText_0x1ec7d8
+ db "@"
+
+BTLossM21: ; 0x11f55f
+ text_jump UnknownText_0x1ec818
+ db "@"
+
+BTWinM21: ; 0x11f564
+ text_jump UnknownText_0x1ec837
+ db "@"
+
+BTGreetingM22: ; 0x11f569
+ text_jump UnknownText_0x1ec858
+ db "@"
+
+BTLossM22: ; 0x11f56e
+ text_jump UnknownText_0x1ec876
+ db "@"
+
+BTWinM22: ; 0x11f573
+ text_jump UnknownText_0x1ec898
+ db "@"
+
+BTGreetingM23: ; 0x11f578
+ text_jump UnknownText_0x1ec8b1
+ db "@"
+
+BTLossM23: ; 0x11f57d
+ text_jump UnknownText_0x1ec8d5
+ db "@"
+
+BTWinM23: ; 0x11f582
+ text_jump UnknownText_0x1ec8f0
+ db "@"
+
+BTGreetingM24: ; 0x11f587
+ text_jump UnknownText_0x1ec911
+ db "@"
+
+BTLossM24: ; 0x11f58c
+ text_jump UnknownText_0x1ec928
+ db "@"
+
+BTWinM24: ; 0x11f591
+ text_jump UnknownText_0x1ec949
+ db "@"
+
+BTGreetingM25: ; 0x11f596
+ text_jump UnknownText_0x1ec969
+ db "@"
+
+BTLossM25: ; 0x11f59b
+ text_jump UnknownText_0x1ec986
+ db "@"
+
+BTWinM25: ; 0x11f5a0
+ text_jump UnknownText_0x1ec99b
+ db "@"
+
+
+
+
+BTGreetingF1: ; 0x11f5a5
+ text_jump UnknownText_0x1ec9bd
+ db "@"
+
+BTLossF1: ; 0x11f5aa
+ text_jump UnknownText_0x1ec9d9
+ db "@"
+
+BTWinF1: ; 0x11f5af
+ text_jump UnknownText_0x1ec9f7
+ db "@"
+
+BTGreetingF2: ; 0x11f5b4
+ text_jump UnknownText_0x1eca0a
+ db "@"
+
+BTLossF2: ; 0x11f5b9
+ text_jump UnknownText_0x1eca2a
+ db "@"
+
+BTWinF2: ; 0x11f5be
+ text_jump UnknownText_0x1eca47
+ db "@"
+
+BTGreetingF3: ; 0x11f5c3
+ text_jump UnknownText_0x1eca64
+ db "@"
+
+BTLossF3: ; 0x11f5c8
+ text_jump UnknownText_0x1eca82
+ db "@"
+
+BTWinF3: ; 0x11f5cd
+ text_jump UnknownText_0x1eca9d
+ db "@"
+
+BTGreetingF4: ; 0x11f5d2
+ text_jump UnknownText_0x1ecabf
+ db "@"
+
+BTLossF4: ; 0x11f5d7
+ text_jump UnknownText_0x1ecade
+ db "@"
+
+BTWinF4: ; 0x11f5dc
+ text_jump UnknownText_0x1ecafa
+ db "@"
+
+BTGreetingF5: ; 0x11f5e1
+ text_jump UnknownText_0x1ecb19
+ db "@"
+
+BTLossF5: ; 0x11f5e6
+ text_jump UnknownText_0x1ecb37
+ db "@"
+
+BTWinF5: ; 0x11f5eb
+ text_jump UnknownText_0x1ecb55
+ db "@"
+
+BTGreetingF6: ; 0x11f5f0
+ text_jump UnknownText_0x1ecb70
+ db "@"
+
+BTLossF6: ; 0x11f5f5
+ text_jump UnknownText_0x1ecb92
+ db "@"
+
+BTWinF6: ; 0x11f5fa
+ text_jump UnknownText_0x1ecbb6
+ db "@"
+
+BTGreetingF7: ; 0x11f5ff
+ text_jump UnknownText_0x1ecbd9
+ db "@"
+
+BTLossF7: ; 0x11f604
+ text_jump UnknownText_0x1ecbf3
+ db "@"
+
+BTWinF7: ; 0x11f609
+ text_jump UnknownText_0x1ecc15
+ db "@"
+
+BTGreetingF8: ; 0x11f60e
+ text_jump UnknownText_0x1ecc39
+ db "@"
+
+BTLossF8: ; 0x11f613
+ text_jump UnknownText_0x1ecc55
+ db "@"
+
+BTWinF8: ; 0x11f618
+ text_jump UnknownText_0x1ecc75
+ db "@"
+
+BTGreetingF9: ; 0x11f61d
+ text_jump UnknownText_0x1ecc92
+ db "@"
+
+BTLossF9: ; 0x11f622
+ text_jump UnknownText_0x1ecca7
+ db "@"
+
+BTWinF9: ; 0x11f627
+ text_jump UnknownText_0x1eccc1
+ db "@"
+
+BTGreetingF10: ; 0x11f62c
+ text_jump UnknownText_0x1eccd7
+ db "@"
+
+BTLossF10: ; 0x11f631
+ text_jump UnknownText_0x1eccef
+ db "@"
+
+BTWinF10: ; 0x11f636
+ text_jump UnknownText_0x1ecd0e
+ db "@"
+
+BTGreetingF11: ; 0x11f63b
+ text_jump UnknownText_0x1ecd2b
+ db "@"
+
+BTLossF11: ; 0x11f640
+ text_jump UnknownText_0x1ecd4d
+ db "@"
+
+BTWinF11: ; 0x11f645
+ text_jump UnknownText_0x1ecd6b
+ db "@"
+
+BTGreetingF12: ; 0x11f64a
+ text_jump UnknownText_0x1ecd8d
+ db "@"
+
+BTLossF12: ; 0x11f64f
+ text_jump UnknownText_0x1ecdaf
+ db "@"
+
+BTWinF12: ; 0x11f654
+ text_jump UnknownText_0x1ecdcf
+ db "@"
+
+BTGreetingF13: ; 0x11f659
+ text_jump UnknownText_0x1ecded
+ db "@"
+
+BTLossF13: ; 0x11f65e
+ text_jump UnknownText_0x1ece0d
+ db "@"
+
+BTWinF13: ; 0x11f663
+ text_jump UnknownText_0x1ece2a
+ db "@"
+
+BTGreetingF14: ; 0x11f668
+ text_jump UnknownText_0x1ece4b
+ db "@"
+
+BTLossF14: ; 0x11f66d
+ text_jump UnknownText_0x1ece70
+ db "@"
+
+BTWinF14: ; 0x11f672
+ text_jump UnknownText_0x1ece8a
+ db "@"
+
+BTGreetingF15: ; 0x11f677
+ text_jump UnknownText_0x1ecea8
+ db "@"
+
+BTLossF15: ; 0x11f67c
+ text_jump UnknownText_0x1ecec9
+ db "@"
+
+BTWinF15: ; 0x11f681
+ text_jump UnknownText_0x1ecee8
+ db "@"