shithub: pokecrystal

Download patch

ref: 6d47be8d8c02317a963c6ff5266a50a8674d285d
parent: bc1870e3f499973fd656d37d134e3f9e4757c980
author: PikalaxALT <[email protected]>
date: Wed Nov 18 05:42:42 EST 2015

Fruit tree constants, more mail engine

--- a/constants/map_constants.asm
+++ b/constants/map_constants.asm
@@ -665,3 +665,36 @@
 	const PERSONTYPE_4
 	const PERSONTYPE_5
 	const PERSONTYPE_6
+
+; fruit trees
+const_value SET 1
+	const FRUITTREE_ROUTE_29
+	const FRUITTREE_ROUTE_30_1
+	const FRUITTREE_ROUTE_38
+	const FRUITTREE_ROUTE_46_1
+	const FRUITTREE_ROUTE_30_2
+	const FRUITTREE_ROUTE_33
+	const FRUITTREE_ROUTE_31
+	const FRUITTREE_ROUTE_43
+	const FRUITTREE_VIOLET_CITY
+	const FRUITTREE_ROUTE_46_2
+	const FRUITTREE_ROUTE_35
+	const FRUITTREE_ROUTE_45
+	const FRUITTREE_ROUTE_36
+	const FRUITTREE_ROUTE_26
+	const FRUITTREE_ROUTE_39
+	const FRUITTREE_ROUTE_44
+	const FRUITTREE_ROUTE_37_1
+	const FRUITTREE_ROUTE_37_2
+	const FRUITTREE_ROUTE_37_3
+	const FRUITTREE_AZALEA_TOWN
+	const FRUITTREE_ROUTE_42_1
+	const FRUITTREE_ROUTE_42_2
+	const FRUITTREE_ROUTE_42_3
+	const FRUITTREE_ROUTE_11
+	const FRUITTREE_ROUTE_2
+	const FRUITTREE_ROUTE_1
+	const FRUITTREE_ROUTE_8
+	const FRUITTREE_PEWTER_CITY_1
+	const FRUITTREE_PEWTER_CITY_2
+	const FRUITTREE_FUCHSIA_CITY
--- a/constants/misc_constants.asm
+++ b/constants/misc_constants.asm
@@ -35,6 +35,7 @@
 ; mail
 MAIL_STRUCT_LENGTH EQU $2f
 MAILBOX_CAPACITY   EQU 10
+MAIL_MSG_LENGTH    EQU $20
 
 ; hall of fame
 HOF_MON_LENGTH = 1 + 2 + 2 + 1 + (PKMN_NAME_LENGTH +- 1) ; species, id, dvs, level, nick
--- a/engine/mail.asm
+++ b/engine/mail.asm
@@ -39,7 +39,8 @@
 	ret
 ; 445c0
 
-Function445c0: ; 445c0 (11:45c0)
+DeleteMailFromPC: ; 445c0 (11:45c0)
+; Shift all mail messages in the mailbox
 	ld a, BANK(sMailboxCount)
 	call GetSRAMBank
 	ld a, b
@@ -53,7 +54,7 @@
 	pop bc
 .loop
 	ld a, b
-	cp $9
+	cp MAILBOX_CAPACITY - 1
 	jr z, .done
 	push bc
 	ld bc, MAIL_STRUCT_LENGTH
@@ -82,7 +83,7 @@
 	callba ReadAnyMail
 	ret
 
-Function44607: ; 44607
+MoveMailFromPCToParty: ; 44607
 	ld a, BANK(sMailboxCount)
 	call GetSRAMBank
 	push bc
@@ -112,7 +113,7 @@
 	ld [hl], d
 	call CloseSRAM
 	pop bc
-	jp Function445c0
+	jp DeleteMailFromPC
 ; 44648 (11:4648)
 
 GetMailboxCount: ; 44648
@@ -123,12 +124,13 @@
 	jp CloseSRAM
 ; 44654
 
-Function44654:: ; 44654
+CheckPokeItem:: ; 44654
 	push bc
 	push de
 	callba SelectMonFromParty
 	ld a, $2
-	jr c, .asm_446c6
+	jr c, .pop_return
+
 	ld a, [CurPartyMon]
 	ld hl, PartyMon1Item
 	ld bc, PARTYMON_STRUCT_LENGTH
@@ -136,7 +138,8 @@
 	ld d, [hl]
 	callba ItemIsMail
 	ld a, $3
-	jr nc, .asm_446c6
+	jr nc, .pop_return
+
 	ld a, BANK(sPartyMail)
 	call GetSRAMBank
 	ld a, [CurPartyMon]
@@ -148,43 +151,437 @@
 	pop hl
 	pop bc
 
-	ld a, $20
+; Compare the mail message, byte for byte, with the expected message.
+	ld a, MAIL_MSG_LENGTH
 	ld [wd265], a
-.asm_44691
+.loop
 	ld a, [de]
 	ld c, a
 	ld a, b
 	call GetFarByte
 	cp "@"
-	jr z, .asm_446ab
+	jr z, .done
 	cp c
 	ld a, $0
-	jr nz, .asm_446c1
+	jr nz, .close_sram_return
 	inc hl
 	inc de
 	ld a, [wd265]
 	dec a
 	ld [wd265], a
-	jr nz, .asm_44691
+	jr nz, .loop
 
-.asm_446ab
+.done
 	callba CheckCurPartyMonFainted
 	ld a, $4
-	jr c, .asm_446c1
+	jr c, .close_sram_return
 	xor a
 	ld [wPokemonWithdrawDepositParameter], a
 	callba Functione039
 	ld a, $1
 
-.asm_446c1
+.close_sram_return
 	call CloseSRAM
-	jr .asm_446c8
+	jr .return
 
-.asm_446c6
+.pop_return
 	pop de
 	pop bc
 
-.asm_446c8
+.return
 	ld [ScriptVar], a
 	ret
 ; 446cc
+
+
+GivePokeItem:: ; 446cc
+	ld a, [PartyCount]
+	dec a
+	push af
+	push bc
+	ld hl, PartyMon1Item
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	pop bc
+	ld [hl], b
+	pop af
+	push bc
+	push af
+	ld hl, sPartyMail
+	ld bc, $2f
+	call AddNTimes
+	ld d, h
+	ld e, l
+	ld hl, wd002
+	ld bc, $21
+	ld a, BANK(sPartyMail)
+	call GetSRAMBank
+	call CopyBytes
+	pop af
+	push af
+	ld hl, PartyMonOT
+	ld bc, NAME_LENGTH
+	call AddNTimes
+	ld bc, $a
+	call CopyBytes
+	pop af
+	ld hl, PartyMon1ID
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	ld [de], a
+	inc de
+	ld a, [CurPartySpecies]
+	ld [de], a
+	inc de
+	pop bc
+	ld a, b
+	ld [de], a
+	jp CloseSRAM
+; 44725
+
+
+BackupPartyMonMail: ; 44725
+	ld a, BANK(sPartyMail)
+	call GetSRAMBank
+	ld hl, sPartyMail
+	ld de, sPartyMailBackup
+	ld bc, 6 * MAIL_STRUCT_LENGTH
+	call CopyBytes
+	ld hl, sMailboxCount
+	ld de, sMailboxCountBackup
+	ld bc, 1 + 10 * MAIL_STRUCT_LENGTH
+	call CopyBytes
+	jp CloseSRAM
+; 44745
+
+RestorePartyMonMail: ; 44745 (11:4745)
+	ld a, BANK(sPartyMail)
+	call GetSRAMBank
+	ld hl, sPartyMailBackup
+	ld de, sPartyMail
+	ld bc, 6 * MAIL_STRUCT_LENGTH
+	call CopyBytes
+	ld hl, sMailboxCountBackup
+	ld de, sMailboxCount
+	ld bc, 1 + 10 * MAIL_STRUCT_LENGTH
+	call CopyBytes
+	jp CloseSRAM
+
+DeletePartyMonMail: ; 44765 (11:4765)
+	ld a, BANK(sPartyMail)
+	call GetSRAMBank
+	xor a
+	ld hl, sPartyMail
+	ld bc, 6 * MAIL_STRUCT_LENGTH
+	call ByteFill
+	xor a
+	ld hl, sMailboxCount
+	ld bc, 1 + 10 * MAIL_STRUCT_LENGTH
+	call ByteFill
+	jp CloseSRAM
+; 44781 (11:4781)
+
+
+Function44781: ; 44781
+	ld a, [PartyCount]
+	and a
+	jr z, .asm_4479e
+	ld e, a
+	ld hl, PartyMon1Item
+.asm_4478b
+	ld d, [hl]
+	push hl
+	push de
+	callba ItemIsMail
+	pop de
+	pop hl
+	ret c
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	dec e
+	jr nz, .asm_4478b
+
+.asm_4479e
+	and a
+	ret
+; 447a0
+
+_KrisMailBoxMenu: ; 0x447a0
+	call InitMail
+	jr z, .nomail
+	call LoadStandardMenuDataHeader
+	call MailboxPC
+	jp WriteBackup
+
+.nomail
+	ld hl, .EmptyMailboxText
+	jp MenuTextBoxBackup
+; 0x447b4
+
+.EmptyMailboxText ; 0x447b4
+	text_jump _EmptyMailboxText
+	db "@"
+
+InitMail: ; 0x447b9
+; initialize wd0f2 and beyond with incrementing values, one per mail
+; set z if no mail
+	ld a, BANK(sMailboxCount)
+	call GetSRAMBank
+	ld a, [sMailboxCount]
+	call CloseSRAM
+	ld hl, wd0f2
+	ld [hli], a
+	and a
+
+	jr z, .done ; if no mail, we're done
+
+	; load values in memory with incrementing values starting at wd0f2
+	ld b, a
+	ld a, $1
+.loop
+	ld [hli], a
+	inc a
+	dec b
+	jr nz, .loop
+.done
+	ld [hl], $ff ; terminate
+
+	ld a, [wd0f2]
+	and a
+	ret
+; 0x447da
+
+Function447da: ; 0x447da
+	dec a
+	ld hl, sMailbox1Author
+	ld bc, MAIL_STRUCT_LENGTH
+	call AddNTimes
+	ld a, BANK(sMailboxCount)
+	call GetSRAMBank
+	ld de, StringBuffer2
+	push de
+	ld bc, NAME_LENGTH - 1
+	call CopyBytes
+	ld a, "@"
+	ld [de], a
+	call CloseSRAM
+	pop de
+	ret
+; 0x447fb
+
+Function447fb: ; 0x447fb
+	push de
+	ld a, [MenuSelection]
+	call Function447da
+	pop hl
+	jp PlaceString
+; 0x44806
+
+MailboxPC: ; 0x44806
+	xor a
+	ld [OBPals + 8 * 6], a
+	ld a, $1
+	ld [wd0f1], a
+.loop
+	call InitMail
+	ld hl, MenuData4494c
+	call CopyMenuDataHeader
+	xor a
+	ld [hBGMapMode], a
+	call InitScrollingMenu
+	call UpdateSprites
+	ld a, [wd0f1]
+	ld [wMenuCursorBuffer], a
+	ld a, [OBPals + 8 * 6]
+	ld [wd0e4], a
+	call HandleScrollingMenu
+	ld a, [wd0e4]
+	ld [OBPals + 8 * 6], a
+	ld a, [MenuSelection2]
+	ld [wd0f1], a
+	ld a, [wcf73]
+	cp $2
+	jr z, .exit
+	call Function4484a
+	jr .loop
+
+.exit
+	xor a
+	ret
+; 0x4484a
+
+Function4484a: ; 0x4484a
+	ld hl, MenuData44964
+	call LoadMenuDataHeader
+	call InterpretMenu2
+	call ExitMenu
+	jr c, .exit
+	ld a, [MenuSelection2]
+	dec a
+	ld hl, .JumpTable
+	rst JumpTable
+
+.exit
+	ret
+; 0x44861
+
+.JumpTable
+	dw .ReadMail
+	dw .PutInPack
+	dw .AttachMail
+	dw .Cancel
+
+.ReadMail ; 0x44869
+	call FadeToMenu
+	ld a, [MenuSelection]
+	dec a
+	ld b, a
+	call ReadMailMessage
+	jp ReturnToCallingMenu
+; 0x44877
+
+.PutInPack ; 0x44877
+	ld hl, .MessageLostText
+	call MenuTextBox
+	call YesNoBox
+	call ExitMenu
+	ret c
+	ld a, [MenuSelection]
+	dec a
+	call .GetMailType
+	ld a, $1
+	ld [wItemQuantityChangeBuffer], a
+	ld hl, NumItems
+	call ReceiveItem
+	jr c, .put_in_bag
+	ld hl, .PackFullText
+	jp MenuTextBoxBackup
+
+.put_in_bag
+	ld a, [MenuSelection]
+	dec a
+	ld b, a
+	call DeleteMailFromPC
+	ld hl, .PutAwayText
+	jp MenuTextBoxBackup
+; 0x448ac
+
+.PutAwayText ; 0x448ac
+	text_jump ClearedMailPutAwayText
+	db "@"
+
+.PackFullText ; 0x448b1
+	text_jump MailPackFullText
+	db "@"
+
+.MessageLostText ; 0x448b6
+	text_jump MailMessageLostText
+	db "@"
+
+.GetMailType: ; 0x448bb
+	push af
+	ld a, BANK(sMailboxCount)
+	call GetSRAMBank
+	pop af
+	ld hl, sMailbox1MailType
+	ld bc, MAIL_STRUCT_LENGTH
+	call AddNTimes
+	ld a, [hl]
+	ld [CurItem], a
+	jp CloseSRAM
+; 0x448d2
+
+.AttachMail ; 0x448d2
+	call FadeToMenu
+	xor a
+	ld [PartyMenuActionText], a
+	call ClearBGPalettes
+.try_again
+	callba Function5004f
+	callba Function50405
+	callba Function503e0
+	callba WritePartyMenuTilemap
+	callba PrintPartyMenuText
+	call WaitBGMap
+	call SetPalettes
+	call DelayFrame
+	callba PartyMenuSelect
+	jr c, .exit2
+	ld a, [CurPartySpecies]
+	cp EGG
+	jr z, .egg
+	ld a, MON_ITEM
+	call GetPartyParamLocation
+	ld a, [hl]
+	and a
+	jr z, .attach_mail
+	ld hl, .HoldingMailText
+	call PrintText
+	jr .try_again
+
+.egg
+	ld hl, .EggText
+	call PrintText
+	jr .try_again
+
+.attach_mail
+	ld a, [MenuSelection]
+	dec a
+	ld b, a
+	call MoveMailFromPCToParty
+	ld hl, .MailMovedText
+	call PrintText
+
+.exit2
+	jp ReturnToCallingMenu
+; 0x4493c
+
+.HoldingMailText ; 0x4493c
+	text_jump MailAlreadyHoldingItemText
+	db "@"
+
+.EggText ; 0x44941
+	text_jump MailEggText
+	db "@"
+
+.MailMovedText ; 0x44946
+	text_jump MailMovedFromBoxText
+	db "@"
+
+.Cancel
+	ret
+
+MenuData4494c: ; 0x4494c
+	db %01000000 ; flags
+	db 1, 8 ; start coords
+	db $a, $12 ; end coords
+	dw .MenuData2
+	db 1 ; default option
+
+.MenuData2
+	db %00010000 ; flags
+	db 4, 0 ; rows/columns?
+	db 1 ; horizontal spacing?
+	dbw 0,wd0f2 ; text pointer
+	dba Function447fb
+	dbw 0,0
+	dbw 0,0
+
+MenuData44964: ; 0x44964
+	db %01000000 ; flags
+	db 0, 0 ; start coords
+	db 9, $d ; end coords
+	dw .MenuData2
+	db 1 ; default option
+
+.MenuData2
+	db %10000000 ; flags
+	db 4 ; items
+	db "READ MAIL@"
+	db "PUT IN PACK@"
+	db "ATTACH MAIL@"
+	db "CANCEL@"
--- a/engine/scripting.asm
+++ b/engine/scripting.asm
@@ -2341,7 +2341,7 @@
 	ld d, a
 	ld a, [ScriptBank]
 	ld b, a
-	callba Function44654
+	callba CheckPokeItem
 	ret
 ; 977ca
 
--- a/main.asm
+++ b/main.asm
@@ -11329,9 +11329,9 @@
 	ld a, [StringBuffer2 + 3]
 	sub [hl]
 	dec hl
-	jr nc, .asm_14102
+	jr nc, .okay_secs
 	add 60
-.asm_14102
+.okay_secs
 	ld [de], a
 	dec de
 
@@ -11338,9 +11338,9 @@
 	ld a, [StringBuffer2 + 2]
 	sbc [hl]
 	dec hl
-	jr nc, .asm_1410d
+	jr nc, .okay_mins
 	add 60
-.asm_1410d
+.okay_mins
 	ld [de], a
 	dec de
 
@@ -11347,9 +11347,9 @@
 	ld a, [StringBuffer2 + 1]
 	sbc [hl]
 	dec hl
-	jr nc, .asm_14118
+	jr nc, .okay_hrs
 	add 24
-.asm_14118
+.okay_hrs
 	ld [de], a
 	dec de
 
@@ -11356,12 +11356,12 @@
 	ld a, [StringBuffer2]
 	sbc [hl]
 	dec hl
-	jr nc, .asm_14128
+	jr nc, .okay_days
 	add 140
 	ld c, 7
 	call SimpleDivide
 
-.asm_14128
+.okay_days
 	ld [de], a
 	ret
 ; 1412a
@@ -11371,16 +11371,16 @@
 Function1499a:: ; 1499a
 	ld a, [PlayerNextTile]
 	cp $60
-	jr z, .asm_149ad
+	jr z, .warp
 	cp $68
-	jr z, .asm_149ad
+	jr z, .warp
 	and $f0
 	cp $70
-	jr z, .asm_149ad
+	jr z, .warp
 	and a
 	ret
 
-.asm_149ad
+.warp
 	scf
 	ret
 ; 149af
@@ -11388,17 +11388,17 @@
 Function149af:: ; 149af
 	ld a, [PlayerNextTile]
 	cp $70
-	jr z, .asm_149c4
+	jr z, .not_warp
 	cp $76
-	jr z, .asm_149c4
+	jr z, .not_warp
 	cp $78
-	jr z, .asm_149c4
+	jr z, .not_warp
 	cp $7e
-	jr z, .asm_149c4
+	jr z, .not_warp
 	scf
 	ret
 
-.asm_149c4
+.not_warp
 	xor a
 	ret
 ; 149c6
@@ -17958,399 +17958,6 @@
 INCLUDE "data/pokedex/entry_pointers.asm"
 
 INCLUDE "engine/mail.asm"
-
-GivePokeItem:: ; 446cc
-	ld a, [PartyCount]
-	dec a
-	push af
-	push bc
-	ld hl, PartyMon1Item
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	pop bc
-	ld [hl], b
-	pop af
-	push bc
-	push af
-	ld hl, sPartyMail
-	ld bc, $2f
-	call AddNTimes
-	ld d, h
-	ld e, l
-	ld hl, wd002
-	ld bc, $21
-	ld a, BANK(sPartyMail)
-	call GetSRAMBank
-	call CopyBytes
-	pop af
-	push af
-	ld hl, PartyMonOT
-	ld bc, NAME_LENGTH
-	call AddNTimes
-	ld bc, $a
-	call CopyBytes
-	pop af
-	ld hl, PartyMon1ID
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hl]
-	ld [de], a
-	inc de
-	ld a, [CurPartySpecies]
-	ld [de], a
-	inc de
-	pop bc
-	ld a, b
-	ld [de], a
-	jp CloseSRAM
-; 44725
-
-
-BackupPartyMonMail: ; 44725
-	ld a, BANK(sPartyMail)
-	call GetSRAMBank
-	ld hl, sPartyMail
-	ld de, sPartyMailBackup
-	ld bc, 6 * MAIL_STRUCT_LENGTH
-	call CopyBytes
-	ld hl, sMailboxCount
-	ld de, sMailboxCountBackup
-	ld bc, 1 + 10 * MAIL_STRUCT_LENGTH
-	call CopyBytes
-	jp CloseSRAM
-; 44745
-
-RestorePartyMonMail: ; 44745 (11:4745)
-	ld a, BANK(sPartyMail)
-	call GetSRAMBank
-	ld hl, sPartyMailBackup
-	ld de, sPartyMail
-	ld bc, 6 * MAIL_STRUCT_LENGTH
-	call CopyBytes
-	ld hl, sMailboxCountBackup
-	ld de, sMailboxCount
-	ld bc, 1 + 10 * MAIL_STRUCT_LENGTH
-	call CopyBytes
-	jp CloseSRAM
-
-DeletePartyMonMail: ; 44765 (11:4765)
-	ld a, BANK(sPartyMail)
-	call GetSRAMBank
-	xor a
-	ld hl, sPartyMail
-	ld bc, 6 * MAIL_STRUCT_LENGTH
-	call ByteFill
-	xor a
-	ld hl, sMailboxCount
-	ld bc, 1 + 10 * MAIL_STRUCT_LENGTH
-	call ByteFill
-	jp CloseSRAM
-; 44781 (11:4781)
-
-
-Function44781: ; 44781
-	ld a, [PartyCount]
-	and a
-	jr z, .asm_4479e
-	ld e, a
-	ld hl, PartyMon1Item
-.asm_4478b
-	ld d, [hl]
-	push hl
-	push de
-	callba ItemIsMail
-	pop de
-	pop hl
-	ret c
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	dec e
-	jr nz, .asm_4478b
-
-.asm_4479e
-	and a
-	ret
-; 447a0
-
-_KrisMailBoxMenu: ; 0x447a0
-	call InitMail
-	jr z, .nomail
-	call LoadStandardMenuDataHeader
-	call Function44806
-	jp WriteBackup
-
-.nomail
-	ld hl, .EmptyMailboxText
-	jp MenuTextBoxBackup
-; 0x447b4
-
-.EmptyMailboxText ; 0x447b4
-	text_jump _EmptyMailboxText
-	db "@"
-
-InitMail: ; 0x447b9
-; initialize wd0f2 and beyond with incrementing values, one per mail
-; set z if no mail
-	ld a, BANK(sMailboxCount)
-	call GetSRAMBank
-	ld a, [sMailboxCount]
-	call CloseSRAM
-	ld hl, wd0f2
-	ld [hli], a
-	and a
-
-	jr z, .done ; if no mail, we're done
-
-	; load values in memory with incrementing values starting at wd0f2
-	ld b, a
-	ld a, $1
-.loop
-	ld [hli], a
-	inc a
-	dec b
-	jr nz, .loop
-.done
-	ld [hl], $ff ; terminate
-
-	ld a, [wd0f2]
-	and a
-	ret
-; 0x447da
-
-Function447da: ; 0x447da
-	dec a
-	ld hl, sMailbox + MON_HP - 1
-	ld bc, MAIL_STRUCT_LENGTH
-	call AddNTimes
-	ld a, BANK(sMailboxCount)
-	call GetSRAMBank
-	ld de, StringBuffer2
-	push de
-	ld bc, NAME_LENGTH - 1
-	call CopyBytes
-	ld a, "@"
-	ld [de], a
-	call CloseSRAM
-	pop de
-	ret
-; 0x447fb
-
-Function447fb: ; 0x447fb
-	push de
-	ld a, [MenuSelection]
-	call Function447da
-	pop hl
-	jp PlaceString
-; 0x44806
-
-Function44806: ; 0x44806
-	xor a
-	ld [OBPals + 8 * 6], a
-	ld a, $1
-	ld [wd0f1], a
-.asm_4480f
-	call InitMail
-	ld hl, MenuData4494c
-	call CopyMenuDataHeader
-	xor a
-	ld [hBGMapMode], a
-	call InitScrollingMenu
-	call UpdateSprites
-	ld a, [wd0f1]
-	ld [wMenuCursorBuffer], a
-	ld a, [OBPals + 8 * 6]
-	ld [wd0e4], a
-	call HandleScrollingMenu
-	ld a, [wd0e4]
-	ld [OBPals + 8 * 6], a
-	ld a, [MenuSelection2]
-	ld [wd0f1], a
-	ld a, [wcf73]
-	cp $2
-	jr z, .asm_44848
-	call Function4484a
-	jr .asm_4480f
-
-.asm_44848
-	xor a
-	ret
-; 0x4484a
-
-Function4484a: ; 0x4484a
-	ld hl, MenuData44964
-	call LoadMenuDataHeader
-	call InterpretMenu2
-	call ExitMenu
-	jr c, .asm_44860
-	ld a, [MenuSelection2]
-	dec a
-	ld hl, .JumpTable
-	rst JumpTable
-
-.asm_44860
-	ret
-; 0x44861
-
-.JumpTable
-	dw .ReadMail
-	dw .PutInPack
-	dw .AttachMail
-	dw .Cancel
-
-.ReadMail ; 0x44869
-	call FadeToMenu
-	ld a, [MenuSelection]
-	dec a
-	ld b, a
-	call ReadMailMessage
-	jp ReturnToCallingMenu
-; 0x44877
-
-.PutInPack ; 0x44877
-	ld hl, .MessageLostText
-	call MenuTextBox
-	call YesNoBox
-	call ExitMenu
-	ret c
-	ld a, [MenuSelection]
-	dec a
-	call .Function448bb
-	ld a, $1
-	ld [wItemQuantityChangeBuffer], a
-	ld hl, NumItems
-	call ReceiveItem
-	jr c, .asm_4489e
-	ld hl, .PackFullText
-	jp MenuTextBoxBackup
-
-.asm_4489e
-	ld a, [MenuSelection]
-	dec a
-	ld b, a
-	call Function445c0
-	ld hl, .PutAwayText
-	jp MenuTextBoxBackup
-; 0x448ac
-
-.PutAwayText ; 0x448ac
-	text_jump ClearedMailPutAwayText
-	db "@"
-
-.PackFullText ; 0x448b1
-	text_jump MailPackFullText
-	db "@"
-
-.MessageLostText ; 0x448b6
-	text_jump MailMessageLostText
-	db "@"
-
-.Function448bb: ; 0x448bb
-	push af
-	ld a, BANK(sMailboxCount)
-	call GetSRAMBank
-	pop af
-	ld hl, sMailbox + $2e
-	ld bc, $2f
-	call AddNTimes
-	ld a, [hl]
-	ld [CurItem], a
-	jp CloseSRAM
-; 0x448d2
-
-.AttachMail ; 0x448d2
-	call FadeToMenu
-	xor a
-	ld [PartyMenuActionText], a
-	call ClearBGPalettes
-.try_again
-	callba Function5004f
-	callba Function50405
-	callba Function503e0
-	callba WritePartyMenuTilemap
-	callba PrintPartyMenuText
-	call WaitBGMap
-	call SetPalettes
-	call DelayFrame
-	callba PartyMenuSelect
-	jr c, .exit
-	ld a, [CurPartySpecies]
-	cp EGG
-	jr z, .egg
-	ld a, MON_ITEM
-	call GetPartyParamLocation
-	ld a, [hl]
-	and a
-	jr z, .attach_mail
-	ld hl, .HoldingMailText
-	call PrintText
-	jr .try_again
-
-.egg
-	ld hl, .EggText
-	call PrintText
-	jr .try_again
-
-.attach_mail
-	ld a, [MenuSelection]
-	dec a
-	ld b, a
-	call Function44607
-	ld hl, .MailMovedText
-	call PrintText
-
-.exit
-	jp ReturnToCallingMenu
-; 0x4493c
-
-.HoldingMailText ; 0x4493c
-	text_jump MailAlreadyHoldingItemText
-	db "@"
-
-.EggText ; 0x44941
-	text_jump MailEggText
-	db "@"
-
-.MailMovedText ; 0x44946
-	text_jump MailMovedFromBoxText
-	db "@"
-
-.Cancel
-	ret
-
-MenuData4494c: ; 0x4494c
-	db %01000000 ; flags
-	db 1, 8 ; start coords
-	db $a, $12 ; end coords
-	dw .MenuData2
-	db 1 ; default option
-
-.MenuData2
-	db %00010000 ; flags
-	db 4, 0 ; rows/columns?
-	db 1 ; horizontal spacing?
-	dbw 0,wd0f2 ; text pointer
-	dba Function447fb
-	dbw 0,0
-	dbw 0,0
-
-MenuData44964: ; 0x44964
-	db %01000000 ; flags
-	db 0, 0 ; start coords
-	db 9, $d ; end coords
-	dw .MenuData2
-	db 1 ; default option
-
-.MenuData2
-	db %10000000 ; flags
-	db 4 ; items
-	db "READ MAIL@"
-	db "PUT IN PACK@"
-	db "ATTACH MAIL@"
-	db "CANCEL@"
-
 
 SECTION "bank12", ROMX, BANK[$12]
 
--- a/maps/AzaleaTown.asm
+++ b/maps/AzaleaTown.asm
@@ -198,7 +198,7 @@
 	jumpstd martsign
 
 WhiteApricornTree:
-	fruittree $14
+	fruittree FRUITTREE_AZALEA_TOWN
 
 MapAzaleaTownSignpostItem8:
 	dwb EVENT_AZALEA_TOWN_HIDDEN_FULL_HEAL, FULL_HEAL
--- a/maps/FuchsiaCity.asm
+++ b/maps/FuchsiaCity.asm
@@ -46,7 +46,7 @@
 	jumpstd martsign
 
 FruitTreeScript_0x194b43:
-	fruittree $1e
+	fruittree FRUITTREE_FUCHSIA_CITY
 
 UnknownText_0x194b45:
 	text "One of the ELITE"
--- a/maps/PewterCity.asm
+++ b/maps/PewterCity.asm
@@ -58,10 +58,10 @@
 	jumpstd martsign
 
 FruitTreeScript_0x18c03e:
-	fruittree $1c
+	fruittree FRUITTREE_PEWTER_CITY_1
 
 FruitTreeScript_0x18c040:
-	fruittree $1d
+	fruittree FRUITTREE_PEWTER_CITY_2
 
 UnknownText_0x18c042:
 	text "Have you visited"
--- a/maps/Route1.asm
+++ b/maps/Route1.asm
@@ -31,7 +31,7 @@
 	jumptext UnknownText_0x1ac675
 
 FruitTreeScript_0x1ac581:
-	fruittree $1a
+	fruittree FRUITTREE_ROUTE_1
 
 SchoolboyDannySeenText:
 	text "If trainers meet,"
--- a/maps/Route11.asm
+++ b/maps/Route11.asm
@@ -53,7 +53,7 @@
 	jumptext UnknownText_0x68238
 
 FruitTreeScript_0x68055:
-	fruittree $18
+	fruittree FRUITTREE_ROUTE_11
 
 MapRoute11SignpostItem1:
 	dwb EVENT_ROUTE_11_HIDDEN_REVIVE, REVIVE
--- a/maps/Route2.asm
+++ b/maps/Route2.asm
@@ -57,7 +57,7 @@
 	db ELIXER, 1
 
 FruitTreeScript_0x1ac306:
-	fruittree $19
+	fruittree FRUITTREE_ROUTE_2
 
 MapRoute2SignpostItem2:
 	dwb EVENT_ROUTE_2_HIDDEN_MAX_ETHER, MAX_ETHER
--- a/maps/Route26.asm
+++ b/maps/Route26.asm
@@ -239,7 +239,7 @@
 	jumptext UnknownText_0x1a5364
 
 FruitTreeScript_0x1a4ec2:
-	fruittree $e
+	fruittree FRUITTREE_ROUTE_26
 
 ItemFragment_0x1a4ec4:
 	db MAX_ELIXER, 1
--- a/maps/Route29.asm
+++ b/maps/Route29.asm
@@ -204,7 +204,7 @@
 	jumptext UnknownText_0x1a15b9
 
 FruitTreeScript_0x1a1089:
-	fruittree $1
+	fruittree FRUITTREE_ROUTE_29
 
 ItemFragment_0x1a108b:
 	db POTION, 1
--- a/maps/Route30.asm
+++ b/maps/Route30.asm
@@ -229,10 +229,10 @@
 	db ANTIDOTE, 1
 
 FruitTreeScript_0x1a17f7:
-	fruittree $2
+	fruittree FRUITTREE_ROUTE_30_1
 
 FruitTreeScript_0x1a17f9:
-	fruittree $5
+	fruittree FRUITTREE_ROUTE_30_2
 
 MapRoute30SignpostItem4:
 	dwb EVENT_ROUTE_30_HIDDEN_POTION, POTION
--- a/maps/Route31.asm
+++ b/maps/Route31.asm
@@ -7,14 +7,14 @@
 
 	; callbacks
 
-	dbw 5, UnknownScript_0x1a543c
+	dbw 5, .CheckMomCall
 
-UnknownScript_0x1a543c:
+.CheckMomCall:
 	checkevent EVENT_TALKED_TO_MOM_AFTER_MYSTERY_EGG_QUEST
-	iffalse UnknownScript_0x1a5443
+	iffalse .DoMomCall
 	return
 
-UnknownScript_0x1a5443:
+.DoMomCall:
 	specialphonecall SPECIALCALL_WORRIED
 	return
 
@@ -26,31 +26,31 @@
 	talkaftercancel
 	loadfont
 	checkflag ENGINE_WADE
-	iftrue UnknownScript_0x1a5493
+	iftrue .WadeRematch
 	checkflag ENGINE_WADE_HAS_ITEM
-	iftrue UnknownScript_0x1a5507
+	iftrue .WadeItem
 	checkcellnum PHONE_BUG_CATCHER_WADE
-	iftrue UnknownScript_0x1a5558
+	iftrue .AcceptedNumberSTD
 	checkevent EVENT_WADE_ASKED_FOR_PHONE_NUMBER
-	iftrue UnknownScript_0x1a547c
+	iftrue .AskAgain
 	writetext UnknownText_0x1a5671
 	closetext
 	setevent EVENT_WADE_ASKED_FOR_PHONE_NUMBER
-	scall UnknownScript_0x1a554c
-	jump UnknownScript_0x1a547f
+	scall .AskPhoneNumberSTD
+	jump .Continue
 
-UnknownScript_0x1a547c:
-	scall UnknownScript_0x1a5550
-UnknownScript_0x1a547f:
+.AskAgain:
+	scall .AskAgainSTD
+.Continue:
 	askforphonenumber PHONE_BUG_CATCHER_WADE
-	if_equal $1, UnknownScript_0x1a5560
-	if_equal $2, UnknownScript_0x1a555c
+	if_equal $1, .PhoneFullSTD
+	if_equal $2, .DeclinedNumberSTD
 	trainertotext BUG_CATCHER, WADE1, $0
-	scall UnknownScript_0x1a5554
-	jump UnknownScript_0x1a5558
+	scall .RegisterNumberSTD
+	jump .AcceptedNumberSTD
 
-UnknownScript_0x1a5493:
-	scall UnknownScript_0x1a5564
+.WadeRematch:
+	scall .RematchSTD
 	winlosstext Bug_catcherWade1BeatenText, 0
 	copybytetovar wWadeFightCount
 	if_equal 4, .Fight4
@@ -109,8 +109,8 @@
 	clearflag ENGINE_WADE
 	end
 
-UnknownScript_0x1a5507:
-	scall UnknownScript_0x1a5568
+.WadeItem:
+	scall .ItemSTD
 	checkevent EVENT_WADE_HAS_BERRY
 	iftrue .Berry
 	checkevent EVENT_WADE_HAS_PSNCUREBERRY
@@ -136,43 +136,43 @@
 	iffalse .PackFull
 .Done
 	clearflag ENGINE_WADE_HAS_ITEM
-	jump UnknownScript_0x1a5558
+	jump .AcceptedNumberSTD
 .PackFull
-	jump UnknownScript_0x1a556c
+	jump .PackFullSTD
 
-UnknownScript_0x1a554c:
+.AskPhoneNumberSTD:
 	jumpstd asknumber1m
 	end
 
-UnknownScript_0x1a5550:
+.AskAgainSTD:
 	jumpstd asknumber2m
 	end
 
-UnknownScript_0x1a5554:
+.RegisterNumberSTD:
 	jumpstd registerednumberm
 	end
 
-UnknownScript_0x1a5558:
+.AcceptedNumberSTD:
 	jumpstd numberacceptedm
 	end
 
-UnknownScript_0x1a555c:
+.DeclinedNumberSTD:
 	jumpstd numberdeclinedm
 	end
 
-UnknownScript_0x1a5560:
+.PhoneFullSTD:
 	jumpstd phonefullm
 	end
 
-UnknownScript_0x1a5564:
+.RematchSTD:
 	jumpstd rematchm
 	end
 
-UnknownScript_0x1a5568:
+.ItemSTD:
 	jumpstd giftm
 	end
 
-UnknownScript_0x1a556c:
+.PackFullSTD:
 	jumpstd packfullm
 	end
 
@@ -180,22 +180,22 @@
 	faceplayer
 	loadfont
 	checkevent EVENT_GOT_TM50_NIGHTMARE
-	iftrue UnknownScript_0x1a55af
+	iftrue .DescribeNightmare
 	checkevent EVENT_GOT_KENYA
-	iftrue UnknownScript_0x1a5584
+	iftrue .TryGiveKenya
 	writetext UnknownText_0x1a56d9
 	closetext
 	loadmovesprites
 	end
 
-UnknownScript_0x1a5584:
+.TryGiveKenya:
 	writetext UnknownText_0x1a5761
 	keeptextopen
 	checkpokeitem ReceivedSpearowMailText
-	if_equal $0, UnknownScript_0x1a55b5
-	if_equal $2, UnknownScript_0x1a55c1
-	if_equal $3, UnknownScript_0x1a55bb
-	if_equal $4, UnknownScript_0x1a55c7
+	if_equal $0, .WrongMail
+	if_equal $2, .Refused
+	if_equal $3, .NoMail
+	if_equal $4, .LastMon
 	writetext UnknownText_0x1a5790
 	keeptextopen
 	writetext UnknownText_0x1a57ba
@@ -202,34 +202,34 @@
 	keeptextopen
 	setevent EVENT_GAVE_KENYA
 	verbosegiveitem TM_NIGHTMARE
-	iffalse UnknownScript_0x1a55b3
+	iffalse .NoRoomForItems
 	setevent EVENT_GOT_TM50_NIGHTMARE
-UnknownScript_0x1a55af:
+.DescribeNightmare:
 	writetext UnknownText_0x1a5896
 	closetext
-UnknownScript_0x1a55b3:
+.NoRoomForItems:
 	loadmovesprites
 	end
 
-UnknownScript_0x1a55b5:
+.WrongMail:
 	writetext UnknownText_0x1a5921
 	closetext
 	loadmovesprites
 	end
 
-UnknownScript_0x1a55bb:
+.NoMail:
 	writetext UnknownText_0x1a5939
 	closetext
 	loadmovesprites
 	end
 
-UnknownScript_0x1a55c1:
+.Refused:
 	writetext UnknownText_0x1a5972
 	closetext
 	loadmovesprites
 	end
 
-UnknownScript_0x1a55c7:
+.LastMon:
 	writetext UnknownText_0x1a5991
 	closetext
 	loadmovesprites
@@ -236,8 +236,8 @@
 	end
 
 ReceivedSpearowMailText:
-	db "DARK CAVE leads", $4E
-	db "to another road@"
+	db   "DARK CAVE leads"
+	next "to another road@"
 
 YoungsterScript_0x1a55ed:
 	jumptextfaceplayer UnknownText_0x1a59d5
@@ -252,7 +252,7 @@
 	jumptextfaceplayer UnknownText_0x1a55ff
 
 FruitTreeScript_0x1a55f9:
-	fruittree $7
+	fruittree FRUITTREE_ROUTE_31
 
 ItemFragment_0x1a55fb:
 	db POTION, 1
--- a/maps/Route33.asm
+++ b/maps/Route33.asm
@@ -137,7 +137,7 @@
 	jumptext UnknownText_0x1ac279
 
 FruitTreeScript_0x1ac0ea:
-	fruittree $6
+	fruittree FRUITTREE_ROUTE_33
 
 HikerAnthony2SeenText:
 	text "I came through the"
--- a/maps/Route35.asm
+++ b/maps/Route35.asm
@@ -261,7 +261,7 @@
 	db TM_ROLLOUT, 1
 
 FruitTreeScript_0x19ca7e:
-	fruittree $b
+	fruittree FRUITTREE_ROUTE_35
 
 CamperIvanSeenText:
 	text "I've been getting"
--- a/maps/Route36.asm
+++ b/maps/Route36.asm
@@ -359,7 +359,7 @@
 	jumptext UnknownText_0x1949ee
 
 FruitTreeScript_0x194247:
-	fruittree $d
+	fruittree FRUITTREE_ROUTE_36
 
 MovementData_0x194249:
 	db $56 ; movement
--- a/maps/Route37.asm
+++ b/maps/Route37.asm
@@ -99,13 +99,13 @@
 	jumptext UnknownText_0x1a9197
 
 FruitTreeScript_0x1a8e09:
-	fruittree $11
+	fruittree FRUITTREE_ROUTE_37_1
 
 FruitTreeScript_0x1a8e0b:
-	fruittree $12
+	fruittree FRUITTREE_ROUTE_37_2
 
 FruitTreeScript_0x1a8e0d:
-	fruittree $13
+	fruittree FRUITTREE_ROUTE_37_3
 
 MapRoute37SignpostItem1:
 	dwb EVENT_ROUTE_37_HIDDEN_ETHER, ETHER
--- a/maps/Route38.asm
+++ b/maps/Route38.asm
@@ -311,7 +311,7 @@
 	jumptext UnknownText_0x1a2324
 
 FruitTreeScript_0x1a1f33:
-	fruittree $3
+	fruittree FRUITTREE_ROUTE_38
 
 Bird_keeperTobySeenText:
 	text "Fly high into the"
--- a/maps/Route39.asm
+++ b/maps/Route39.asm
@@ -165,7 +165,7 @@
 	jumptext UnknownText_0x1a6036
 
 FruitTreeScript_0x1a5bf4:
-	fruittree $f
+	fruittree FRUITTREE_ROUTE_39
 
 MapRoute39SignpostItem3:
 	dwb EVENT_ROUTE_39_HIDDEN_NUGGET, NUGGET
--- a/maps/Route42.asm
+++ b/maps/Route42.asm
@@ -194,13 +194,13 @@
 	db SUPER_POTION, 1
 
 FruitTreeScript_0x1a934d:
-	fruittree $15
+	fruittree FRUITTREE_ROUTE_42_1
 
 FruitTreeScript_0x1a934f:
-	fruittree $16
+	fruittree FRUITTREE_ROUTE_42_2
 
 FruitTreeScript_0x1a9351:
-	fruittree $17
+	fruittree FRUITTREE_ROUTE_42_3
 
 MapRoute42SignpostItem4:
 	dwb EVENT_ROUTE_42_HIDDEN_MAX_POTION, MAX_POTION
--- a/maps/Route43.asm
+++ b/maps/Route43.asm
@@ -312,7 +312,7 @@
 	jumptext UnknownText_0x19d6c9
 
 FruitTreeScript_0x19d266:
-	fruittree $8
+	fruittree FRUITTREE_ROUTE_43
 
 ItemFragment_0x19d268:
 	db MAX_ETHER, 1
--- a/maps/Route44.asm
+++ b/maps/Route44.asm
@@ -293,7 +293,7 @@
 	jumptext UnknownText_0x19dfcc
 
 FruitTreeScript_0x19da40:
-	fruittree $10
+	fruittree FRUITTREE_ROUTE_44
 
 ItemFragment_0x19da42:
 	db MAX_REVIVE, 1
--- a/maps/Route45.asm
+++ b/maps/Route45.asm
@@ -282,7 +282,7 @@
 	jumptext UnknownText_0x19e8fe
 
 FruitTreeScript_0x19e294:
-	fruittree $c
+	fruittree FRUITTREE_ROUTE_45
 
 ItemFragment_0x19e296:
 	db NUGGET, 1
--- a/maps/Route46.asm
+++ b/maps/Route46.asm
@@ -157,10 +157,10 @@
 	db X_SPEED, 1
 
 FruitTreeScript_0x1a978f:
-	fruittree $4
+	fruittree FRUITTREE_ROUTE_46_1
 
 FruitTreeScript_0x1a9791:
-	fruittree $a
+	fruittree FRUITTREE_ROUTE_46_2
 
 HikerBaileySeenText:
 	text "Awright! I'll show"
--- a/maps/Route8.asm
+++ b/maps/Route8.asm
@@ -67,7 +67,7 @@
 	jumptext UnknownText_0x6c2b7
 
 FruitTreeScript_0x6c06c:
-	fruittree $1b
+	fruittree FRUITTREE_ROUTE_8
 
 BikerDwayneSeenText:
 	text "We're the KANTO"
--- a/maps/VioletCity.asm
+++ b/maps/VioletCity.asm
@@ -87,7 +87,7 @@
 	db RARE_CANDY, 1
 
 FruitTreeScript_0x1a8425:
-	fruittree $9
+	fruittree FRUITTREE_VIOLET_CITY
 
 MapVioletCitySignpostItem6:
 	dwb EVENT_VIOLET_CITY_HIDDEN_HYPER_POTION, HYPER_POTION
--- a/misc/battle_tower_5c.asm
+++ b/misc/battle_tower_5c.asm
@@ -323,99 +323,3 @@
 BT_ChrisName: ; 170426
 	db "CHRIS@"
 ; 17042c
-
-Function17042c: ; 17042c
-	ld hl, BT_TrainerTextIndex + $be
-	ld a, 7
-.loop
-	push af
-	push hl
-	ld c, 18
-.loop2
-	ld a, [hli]
-	ld b, a
-	ld a, [hli]
-	and a
-	jr z, .skip
-	cp $f
-	jr nc, .exit_inner_loop
-	push hl
-	ld hl, Unknown_170470
-	dec a
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld a, [hl]
-	pop hl
-	cp b
-	jr c, .exit_inner_loop
-	jr z, .exit_inner_loop
-	jr .asm_170456
-
-.skip
-	ld a, b
-	cp $fc
-	jr nc, .exit_inner_loop
-
-.asm_170456
-	dec c
-	jr nz, .loop2
-	jr .dont_copy
-
-.exit_inner_loop
-	pop de
-	push de
-	ld hl, Unknown_17047e
-	ld bc, BATTLETOWER_TRAINERDATALENGTH
-	call CopyBytes
-
-.dont_copy
-	pop hl
-	ld de, $00e0
-	add hl, de
-	pop af
-	dec a
-	jr nz, .loop
-	ret
-; 170470
-
-Unknown_170470:
-	db $12, $24, $45, $45, $42, $42, $45, $42, $27, $27, $45, $27, $42, $24
-
-Unknown_17047e:
-	db $03, $04, $05, $08
-	db $03, $05, $0e, $06
-	db $03, $02, $00, $00
-	db $39, $07, $07, $04
-	db $00, $05, $04, $07
-	db $01, $05, $00, $00
-	db $0f, $05, $14, $07
-	db $05, $05, $11, $0c
-	db $0c, $06, $06, $04
-
-
-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, $3 ; BANK(BT_OTTrainer)
-	ld [rSVBK], a
-
-	ld hl, BT_OTTrainer ; $d100
-	ld de, wBT_OTTemp ; $c608
-	ld bc, BATTLE_TOWER_STRUCT_LENGTH
-	call CopyBytes
-
-	pop af
-	ld [rSVBK], a
-
-	ld a, BANK(sSaveType)
-	call GetSRAMBank
-	ld a, $2
-	ld [sSaveType], a
-	ld hl, sNrOfBeatenBattleTowerTrainers
-	inc [hl]
-	call CloseSRAM
-SkipBattleTowerTrainer: ; 1704c9
-	ret
-; 1704ca
--- a/misc/mobile_5c.asm
+++ b/misc/mobile_5c.asm
@@ -90,6 +90,7 @@
 	push af
 	ld a, $3
 	ld [rSVBK], a
+
 	call Function17042c
 	ld a, $5
 	call GetSRAMBank
@@ -244,14 +245,112 @@
 	inc de
 	and a
 	ret z
-.asm_170210
+
+.loop
 	add hl, bc
 	dec a
-	jr nz, .asm_170210
+	jr nz, .loop
 	ret
 ; 170215
 
 INCLUDE "misc/battle_tower_5c.asm"
+
+
+Function17042c: ; 17042c
+	ld hl, w3_d2be
+	ld a, 7
+.loop
+	push af
+	push hl
+	ld c, 18
+.loop2
+	ld a, [hli]
+	ld b, a
+	ld a, [hli]
+	and a
+	jr z, .empty
+	cp $f
+	jr nc, .exit_inner_loop
+	push hl
+	ld hl, Unknown_170470
+	dec a
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld a, [hl]
+	pop hl
+	cp b
+	jr c, .exit_inner_loop
+	jr z, .exit_inner_loop
+	jr .next_iteration
+
+.empty
+	ld a, b
+	cp $fc
+	jr nc, .exit_inner_loop
+
+.next_iteration
+	dec c
+	jr nz, .loop2
+	jr .dont_copy
+
+.exit_inner_loop
+	pop de
+	push de
+	ld hl, Unknown_17047e
+	ld bc, BATTLETOWER_TRAINERDATALENGTH
+	call CopyBytes
+
+.dont_copy
+	pop hl
+	ld de, $00e0
+	add hl, de
+	pop af
+	dec a
+	jr nz, .loop
+	ret
+; 170470
+
+Unknown_170470:
+	db $12, $24, $45, $45, $42, $42, $45, $42, $27, $27, $45, $27, $42, $24
+
+Unknown_17047e:
+	db $03, $04, $05, $08
+	db $03, $05, $0e, $06
+	db $03, $02, $00, $00
+	db $39, $07, $07, $04
+	db $00, $05, $04, $07
+	db $01, $05, $00, $00
+	db $0f, $05, $14, $07
+	db $05, $05, $11, $0c
+	db $0c, $06, $06, $04
+
+
+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, $3 ; BANK(BT_OTTrainer)
+	ld [rSVBK], a
+
+	ld hl, BT_OTTrainer ; $d100
+	ld de, wBT_OTTemp ; $c608
+	ld bc, BATTLE_TOWER_STRUCT_LENGTH
+	call CopyBytes
+
+	pop af
+	ld [rSVBK], a
+
+	ld a, BANK(sSaveType)
+	call GetSRAMBank
+	ld a, $2
+	ld [sSaveType], a
+	ld hl, sNrOfBeatenBattleTowerTrainers
+	inc [hl]
+	call CloseSRAM
+SkipBattleTowerTrainer: ; 1704c9
+	ret
+; 1704ca
 
 Function1704ca: ; 1704ca
 	ld a, [$be46]
--- a/sram.asm
+++ b/sram.asm
@@ -10,9 +10,10 @@
 SECTION "SRAM Bank 0", SRAM [$a600], BANK [0]
 
 mailmsg: MACRO
-\1Message:: ds $20
+\1Message:: ds MAIL_MSG_LENGTH
+\1MessageEnd:: ds 1
 \1Author:: ds NAME_LENGTH
-	ds 3
+\1AuthorID:: ds 2
 \1MailType:: ds 1
 endm
 ; a600
--- a/wram.asm
+++ b/wram.asm
@@ -2881,8 +2881,11 @@
 BT_OTTrainer:: battle_tower_struct BT_OT
 ; d1e0	
 	ds $20
+; d200
 BT_TrainerTextIndex::
-	ds $600
+	ds $be
+w3_d2be::
+	ds $542
 
 wBTChoiceOfLvlGroup::
 w3_d800:: ds $400