shithub: pokecrystal

Download patch

ref: 630d789c70fcd2b87336caf4762be2012790d4a8
parent: 047effba941ca96bf0b3d16fc2ddef964e4f17d8
author: PikalaxALT <PikalaxALT@gmail.com>
date: Mon Dec 21 09:10:16 EST 2015

More link trade shenanigans

--- a/battle/core.asm
+++ b/battle/core.asm
@@ -5700,7 +5700,7 @@
 	xor a
 	ld [w2DMenuFlags2], a
 	ld a, $10
-	ld [w2DMenuFlags3], a
+	ld [w2DMenuCursorOffsets], a
 .menu_loop
 	ld a, [wMoveSelectionMenuType]
 	and a
@@ -6531,7 +6531,7 @@
 	ld [EnemyMonLevel], a
 ; Fill stats
 	ld de, EnemyMonMaxHP
-	ld b, $00
+	ld b, FALSE
 	ld hl, LinkBattleRNs + 7 ; ?
 	predef CalcPkmnStats
 
@@ -7529,7 +7529,7 @@
 	push bc
 	call LoadTileMapToTempTileMap
 	pop bc
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	ld d, [hl]
 	ld a, [hQuotient + 2]
@@ -7562,7 +7562,7 @@
 	ld d, MAX_LEVEL
 	callab CalcExpAtLevel
 	pop bc
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	push bc
 	ld a, [hQuotient]
@@ -7621,10 +7621,10 @@
 	add hl, bc
 	ld d, h
 	ld e, l
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	push bc
-	ld b, $1
+	ld b, TRUE
 	predef CalcPkmnStats
 	pop bc
 	pop de
--- a/engine/breeding/egg.asm
+++ b/engine/breeding/egg.asm
@@ -286,7 +286,7 @@
 	ld [hl], a
 	pop hl
 	push hl
-	ld bc, MON_EXP + 2
+	ld bc, MON_STAT_EXP - 1
 	add hl, bc
 	ld b, $0
 	predef CalcPkmnStats
--- a/engine/learn.asm
+++ b/engine/learn.asm
@@ -164,7 +164,7 @@
 	xor a
 	ld [w2DMenuFlags2], a
 	ld a, $20
-	ld [w2DMenuFlags3], a
+	ld [w2DMenuCursorOffsets], a
 	call StaticMenuJoypad
 	push af
 	call Call_LoadTempTileMapToTileMap
--- a/engine/link.asm
+++ b/engine/link.asm
@@ -44,7 +44,7 @@
 	call Function87d
 	ld a, [hLinkPlayerNumber]
 	cp $2
-	jr nz, .asm_28091
+	jr nz, .player_1
 	ld c, $3
 	call DelayFrames
 	xor a
@@ -61,7 +61,7 @@
 	ld a, $81
 	ld [rSC], a
 
-.asm_28091
+.player_1
 	ld de, MUSIC_NONE
 	call PlayMusic
 	ld c, $3
@@ -78,13 +78,13 @@
 	ld [de], a
 	ld hl, wLinkData
 	ld de, OTPlayerName
-	ld bc, 9 + NAME_LENGTH + 1 + PARTY_LENGTH + 1 + PARTY_LENGTH * REDMON_STRUCT_LENGTH + 2 * (PARTY_LENGTH * NAME_LENGTH) ; $1a8
+	ld bc, $1a8
 	call Function75f
 	ld a, $fe
 	ld [de], a
-	ld hl, wc608
+	ld hl, wMisc
 	ld de, wPlayerTrademonSpecies
-	ld bc, wPlayerTrademonSpecies - wc608
+	ld bc, wPlayerTrademonSpecies - wMisc
 	call Function75f
 	xor a
 	ld [rIF], a
@@ -91,8 +91,8 @@
 	ld a, $1d
 	ld [rIE], a
 	call Function287ab
-	ld hl, wd26b
-	call Function287ca
+	ld hl, OTPlayerName
+	call Link_FindFirstNonControlCharacter_SkipZero
 	push hl
 	ld bc, NAME_LENGTH
 	add hl, bc
@@ -104,21 +104,21 @@
 	jp nc, Function28b22
 	ld de, wLinkData
 	ld bc, $1a2
-	call Function2879e
+	call Link_CopyOTData
 	ld de, wPlayerTrademonSpecies
-	ld hl, wc813
+	ld hl, wTimeCapsulePartyMon1Species
 	ld c, $2
-.asm_280fe
+.loop
 	ld a, [de]
 	inc de
 	and a
-	jr z, .asm_280fe
+	jr z, .loop
 	cp $fd
-	jr z, .asm_280fe
+	jr z, .loop
 	cp $fe
-	jr z, .asm_280fe
+	jr z, .loop
 	cp $ff
-	jr z, .asm_2811d
+	jr z, .next
 	push hl
 	push bc
 	ld b, $0
@@ -129,14 +129,14 @@
 	ld [hl], a
 	pop bc
 	pop hl
-	jr .asm_280fe
+	jr .loop
 
-.asm_2811d
+.next
 	ld hl, wc90f
 	dec c
-	jr nz, .asm_280fe
-	ld hl, wLinkData
-	ld de, wd26b
+	jr nz, .loop
+	ld hl, wLinkPlayerName
+	ld de, OTPlayerName
 	ld bc, NAME_LENGTH
 	call CopyBytes
 	ld de, OTPartyCount
@@ -143,10 +143,10 @@
 	ld a, [hli]
 	ld [de], a
 	inc de
-.asm_28135
+.party_loop
 	ld a, [hli]
-	cp $ff
-	jr z, .asm_2814e
+	cp -1
+	jr z, .done_party
 	ld [wd265], a
 	push hl
 	push de
@@ -156,11 +156,11 @@
 	ld a, [wd265]
 	ld [de], a
 	inc de
-	jr .asm_28135
+	jr .party_loop
 
-.asm_2814e
+.done_party
 	ld [de], a
-	ld hl, wc813
+	ld hl, wTimeCapsulePartyMon1Species
 	call Function2868a
 	ld a, OTPartyMonOT % $100
 	ld [wd102], a
@@ -174,7 +174,7 @@
 	call z, DelayFrames
 	ld de, MUSIC_ROUTE_30
 	call PlayMusic
-	jp Function287e3
+	jp InitTradeMenuDisplay
 ; 28177
 
 Gen2ToGen2LinkComms: ; 28177
@@ -220,12 +220,12 @@
 	ld a, $fe
 	ld [de], a
 	ld hl, wLinkData
-	ld de, wd26b
+	ld de, OTPlayerName
 	ld bc, $1c2
 	call Function75f
 	ld a, $fe
 	ld [de], a
-	ld hl, wc608
+	ld hl, wMisc
 	ld de, wPlayerTrademonSpecies
 	ld bc, $c8
 	call Function75f
@@ -245,13 +245,13 @@
 	ld de, MUSIC_NONE
 	call PlayMusic
 	call Function287ab
-	ld hl, wd26b
-	call Function287ca
+	ld hl, OTPlayerName
+	call Link_FindFirstNonControlCharacter_SkipZero
 	ld de, wLinkData
 	ld bc, $1b9
-	call Function2879e
+	call Link_CopyOTData
 	ld de, wPlayerTrademonSpecies
-	ld hl, wc813
+	ld hl, wLinkPlayerPartyMon1Species
 	ld c, $2
 .asm_28224
 	ld a, [de]
@@ -392,7 +392,7 @@
 
 .asm_282fe
 	ld hl, wLinkData
-	ld de, wd26b
+	ld de, OTPlayerName
 	ld bc, NAME_LENGTH
 	call CopyBytes
 	ld de, OTPartyCount
@@ -427,7 +427,7 @@
 	and $20
 	or $3
 	ld [hl], a
-	ld hl, wd26b
+	ld hl, OTPlayerName
 	ld de, OTName
 	ld bc, NAME_LENGTH
 	call CopyBytes
@@ -466,7 +466,7 @@
 .asm_283a9
 	ld de, MUSIC_ROUTE_30
 	call PlayMusic
-	jp Function287e3
+	jp InitTradeMenuDisplay
 ; 283b2
 
 Function283b2: ; 283b2
@@ -561,20 +561,20 @@
 Function28434: ; 28434
 	ld hl, wd1f3
 	ld a, $fd
-	ld b, $7
-.asm_2843b
+	ld b,  7
+.loop1
 	ld [hli], a
 	dec b
-	jr nz, .asm_2843b
-	ld b, $a
-.asm_28441
+	jr nz, .loop1
+	ld b, 10
+.loop2
 	call Random
 	cp $fd
-	jr nc, .asm_28441
+	jr nc, .loop2
 	ld [hli], a
 	dec b
-	jr nz, .asm_28441
-	ld hl, wc608
+	jr nz, .loop2
+	ld hl, wMisc
 	ld a, $fd
 rept 3
 	ld [hli], a
@@ -581,53 +581,53 @@
 endr
 	ld b, $c8
 	xor a
-.asm_28457
+.loop3
 	ld [hli], a
 	dec b
-	jr nz, .asm_28457
+	jr nz, .loop3
 	ld hl, wc818
-	ld de, wc608 + 10
-	ld bc, 0
-.asm_28464
+	ld de, wMisc + 10
+	lb bc, 0, 0
+.loop4
 	inc c
 	ld a, c
 	cp $fd
-	jr z, .asm_2848c
+	jr z, .next1
 	ld a, b
 	dec a
-	jr nz, .asm_2847f
+	jr nz, .next2
 	push bc
 	ld a, [wLinkMode]
 	cp LINK_TIMECAPSULE
 	ld b, $d
-	jr z, .asm_2847a
+	jr z, .got_value
 	ld b, $27
 
-.asm_2847a
+.got_value
 	ld a, c
 	cp b
 	pop bc
-	jr z, .asm_28495
+	jr z, .done
 
-.asm_2847f
+.next2
 	inc hl
 	ld a, [hl]
 	cp $fe
-	jr nz, .asm_28464
+	jr nz, .loop4
 	ld a, c
 	ld [de], a
 	inc de
 	ld [hl], $ff
-	jr .asm_28464
+	jr .loop4
 
-.asm_2848c
+.next1
 	ld a, $ff
 	ld [de], a
 	inc de
 	lb bc, 1, 0
-	jr .asm_28464
+	jr .loop4
 
-.asm_28495
+.done
 	ld a, $ff
 	ld [de], a
 	ret
@@ -636,7 +636,7 @@
 Link_PrepPartyData_Gen1: ; 28499
 	ld de, wLinkData
 	ld a, $fd
-	ld b, $6
+	ld b, 6
 .loop1
 	ld [de], a
 	inc de
@@ -781,7 +781,7 @@
 	ld [BaseSpecialAttack], a
 	pop bc
 
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	ld c, STAT_SATK
 	ld b, TRUE
@@ -960,7 +960,7 @@
 	push hl
 	ld d, h
 	ld e, l
-	ld bc, wcbea
+	ld bc, wLinkOTPartyMonTypes
 	ld hl, wcbe8
 	ld a, c
 	ld [hli], a
@@ -969,12 +969,12 @@
 	ld c, PARTY_LENGTH
 .loop
 	push bc
-	call Function286ba
+	call .ConvertToGen2
 	pop bc
 	dec c
 	jr nz, .loop
 	pop hl
-	lb bc, 1, 8
+	ld bc, PARTY_LENGTH * REDMON_STRUCT_LENGTH
 	add hl, bc
 	ld de, OTPartyMonOT
 	ld bc, PARTY_LENGTH * NAME_LENGTH
@@ -984,7 +984,7 @@
 	jp CopyBytes
 ; 286ba
 
-Function286ba: ; 286ba
+.ConvertToGen2: ; 286ba
 	ld b, h
 	ld c, l
 	ld a, [de]
@@ -1007,7 +1007,7 @@
 	inc de
 	ld [hl], a
 	inc de
-	ld hl, $20
+	ld hl, MON_STATUS
 	add hl, bc
 	ld a, [de]
 	inc de
@@ -1025,9 +1025,9 @@
 	ld a, l
 	ld [wcbe8], a
 	ld a, h
-	ld [wcbe9], a
+	ld [wcbe8 + 1], a
 	push bc
-	ld hl, $1
+	ld hl, MON_ITEM
 	add hl, bc
 	push hl
 	ld h, d
@@ -1036,7 +1036,7 @@
 	push bc
 	ld a, [hli]
 	ld b, a
-	call Function28771
+	call TimeCapsule_ReplaceTeruSama
 	ld a, b
 	ld [de], a
 	inc de
@@ -1067,7 +1067,7 @@
 	push bc
 	ld d, h
 	ld e, l
-	ld hl, $a
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	ld c, STAT_SATK
 	ld b, TRUE
@@ -1080,7 +1080,7 @@
 	ld [hli], a
 	push hl
 	push bc
-	ld hl, $a
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	ld c, STAT_SDEF
 	ld b, TRUE
@@ -1108,7 +1108,7 @@
 	ret
 ; 28771
 
-Function28771: ; 28771
+TimeCapsule_ReplaceTeruSama: ; 28771
 	ld a, b
 	and a
 	ret z
@@ -1145,11 +1145,11 @@
 	db ITEM_C3, BERRY
 	db ITEM_DC, BERRY
 	db HM_08,   BERRY
-	db $ff,     BERRY
-	db $00
+	db -1,      BERRY
+	db  0
 ; 2879e
 
-Function2879e: ; 2879e
+Link_CopyOTData: ; 2879e
 .loop
 	ld a, [hli]
 	cp $fe
@@ -1168,9 +1168,9 @@
 	cp $2
 	ret z
 	ld hl, EnemyMonSpecies
-	call Function287d8
+	call Link_FindFirstNonControlCharacter_AllowZero
 	ld de, LinkBattleRNs
-	ld c, $a
+	ld c, 10
 .loop
 	ld a, [hli]
 	cp $fe
@@ -1184,7 +1184,7 @@
 	ret
 ; 287ca
 
-Function287ca: ; 287ca
+Link_FindFirstNonControlCharacter_SkipZero: ; 287ca
 .loop
 	ld a, [hli]
 	and a
@@ -1197,7 +1197,7 @@
 	ret
 ; 287d8
 
-Function287d8: ; 287d8
+Link_FindFirstNonControlCharacter_AllowZero: ; 287d8
 .loop
 	ld a, [hli]
 	cp $fd
@@ -1208,10 +1208,10 @@
 	ret
 ; 287e3
 
-Function287e3: ; 287e3
+InitTradeMenuDisplay: ; 287e3
 	call ClearScreen
-	call Function28ef8
-	callba Function16d673
+	call LoadTradeScreenBorder
+	callba InitTradeSpeciesList
 	xor a
 	ld hl, wOtherPlayerLinkMode
 rept 3
@@ -1218,14 +1218,14 @@
 	ld [hli], a
 endr
 	ld [hl], a
-	ld a, $1
+	ld a, 1
 	ld [wMenuCursorY], a
 	inc a
 	ld [wPlayerLinkAction], a
-	jp Function2888b
+	jp LinkTrade_PlayerPartyMenu
 ; 28803
 
-Function28803: ; 28803
+LinkTrade_OTPartyMenu: ; 28803
 	ld a, OTPARTYMON
 	ld [MonType], a
 	ld a, A_BUTTON | D_UP | D_DOWN
@@ -1240,35 +1240,35 @@
 	ld [w2DMenuCursorInitX], a
 	ld a, 1
 	ld [wMenuCursorX], a
-	ld a, $10
-	ld [w2DMenuFlags3], a
+	ln a, 1, 0
+	ld [w2DMenuCursorOffsets], a
 	ld a, $20
 	ld [w2DMenuFlags1], a
 	xor a
 	ld [w2DMenuFlags2], a
 
-Function28835: ; 28835
-	callba Function16d70c
+LinkTradeOTPartymonMenuLoop: ; 28835
+	callba LinkTradeMenu
 	ld a, d
 	and a
-	jp z, Function2891c
-	bit 0, a
-	jr z, .asm_2885b
+	jp z, LinkTradePartiesMenuMasterLoop
+	bit A_BUTTON_F, a
+	jr z, .not_a_button
 	ld a, $1
 	ld [wd263], a
 	callab Function50db9
 	ld hl, OTPartyMon1Species
 	callba LinkMonStatsScreen
-	jp Function2891c
+	jp LinkTradePartiesMenuMasterLoop
 
-.asm_2885b
-	bit 6, a
-	jr z, .asm_28883
+.not_a_button
+	bit D_UP_F, a
+	jr z, .not_d_up
 	ld a, [wMenuCursorY]
 	ld b, a
 	ld a, [OTPartyCount]
 	cp b
-	jp nz, Function2891c
+	jp nz, LinkTradePartiesMenuMasterLoop
 	xor a
 	ld [MonType], a
 	call HideCursor
@@ -1281,16 +1281,16 @@
 	pop hl
 	ld a, [PartyCount]
 	ld [wMenuCursorY], a
-	jr Function2888b
+	jr LinkTrade_PlayerPartyMenu
 
-.asm_28883
-	bit 7, a
-	jp z, Function2891c
+.not_d_up
+	bit D_DOWN_F, a
+	jp z, LinkTradePartiesMenuMasterLoop
 	jp Function28ac9
 ; 2888b
 
-Function2888b: ; 2888b
-	callba Function49856
+LinkTrade_PlayerPartyMenu: ; 2888b
+	callba InitMG_Mobile_LinkTradePalMap
 	xor a
 	ld [MonType], a
 	ld a, A_BUTTON | D_UP | D_DOWN
@@ -1305,8 +1305,8 @@
 	ld [w2DMenuCursorInitX], a
 	ld a, 1
 	ld [wMenuCursorX], a
-	ld a, $10
-	ld [w2DMenuFlags3], a
+	ln a, 1, 0
+	ld [w2DMenuCursorOffsets], a
 	ld a, $20
 	ld [w2DMenuFlags1], a
 	xor a
@@ -1313,25 +1313,25 @@
 	ld [w2DMenuFlags2], a
 	call WaitBGMap2
 
-Function288c5: ; 288c5
-	callba Function16d70c
+LinkTradePartymonMenuLoop: ; 288c5
+	callba LinkTradeMenu
 	ld a, d
 	and a
-	jr nz, .asm_288d2
-	jp Function2891c
+	jr nz, .check_joypad
+	jp LinkTradePartiesMenuMasterLoop
 
-.asm_288d2
-	bit 0, a
-	jr z, .asm_288d9
+.check_joypad
+	bit A_BUTTON_F, a
+	jr z, .not_a_button
 	jp Function28926
 
-.asm_288d9
-	bit 7, a
-	jr z, .asm_288fe
+.not_a_button
+	bit D_DOWN_F, a
+	jr z, .not_d_down
 	ld a, [wMenuCursorY]
 	dec a
-	jp nz, Function2891c
-	ld a, $1
+	jp nz, LinkTradePartiesMenuMasterLoop
+	ld a, OTPARTYMON
 	ld [MonType], a
 	call HideCursor
 	push hl
@@ -1338,37 +1338,37 @@
 	push bc
 	ld bc, NAME_LENGTH
 	add hl, bc
-	ld [hl], $7f
+	ld [hl], " "
 	pop bc
 	pop hl
-	ld a, $1
+	ld a, 1
 	ld [wMenuCursorY], a
-	jp Function28803
+	jp LinkTrade_OTPartyMenu
 
-.asm_288fe
-	bit 6, a
-	jr z, Function2891c
+.not_d_down
+	bit D_UP_F, a
+	jr z, LinkTradePartiesMenuMasterLoop
 	ld a, [wMenuCursorY]
 	ld b, a
 	ld a, [PartyCount]
 	cp b
-	jr nz, Function2891c
+	jr nz, LinkTradePartiesMenuMasterLoop
 	call HideCursor
 	push hl
 	push bc
 	ld bc, NAME_LENGTH
 	add hl, bc
-	ld [hl], $7f
+	ld [hl], " "
 	pop bc
 	pop hl
 	jp Function28ade
 ; 2891c
 
-Function2891c: ; 2891c
+LinkTradePartiesMenuMasterLoop: ; 2891c
 	ld a, [MonType]
 	and a
-	jp z, Function288c5
-	jp Function28835
+	jp z, LinkTradePartymonMenuLoop ; PARTYMON
+	jp LinkTradeOTPartymonMenuLoop  ; OTPARTYMON
 ; 28926
 
 Function28926: ; 28926
@@ -1380,11 +1380,11 @@
 	ld c, 18
 	call Predef_LinkTextbox
 	hlcoord 2, 16
-	ld de, String28ab4
+	ld de, .String_Stats_Trade
 	call PlaceString
 	callba Function4d354
 
-.asm_28946
+.joy_loop
 	ld a, " "
 	ldcoord_a 11, 16
 	ld a, A_BUTTON | B_BUTTON | D_RIGHT
@@ -1400,23 +1400,23 @@
 	ld a, 1
 	ld [wMenuCursorY], a
 	ld [wMenuCursorX], a
-	ld a, $20
-	ld [w2DMenuFlags3], a
+	ln a, 2, 0
+	ld [w2DMenuCursorOffsets], a
 	xor a
 	ld [w2DMenuFlags1], a
 	ld [w2DMenuFlags2], a
 	call ScrollingMenuJoypad
 	bit D_RIGHT_F, a
-	jr nz, .asm_2898d
+	jr nz, .d_right
 	bit B_BUTTON_F, a
-	jr z, .asm_289cd
-.asm_28983
+	jr z, .show_stats
+.b_button
 	pop af
 	ld [wMenuCursorY], a
 	call Call_LoadTempTileMapToTileMap
-	jp Function2888b
+	jp LinkTrade_PlayerPartyMenu
 
-.asm_2898d
+.d_right
 	ld a, " "
 	ldcoord_a 1, 16
 	ld a, A_BUTTON | B_BUTTON | D_LEFT
@@ -1432,19 +1432,19 @@
 	ld a, 1
 	ld [wMenuCursorY], a
 	ld [wMenuCursorX], a
-	ld a, $20
-	ld [w2DMenuFlags3], a
+	ln a, 2, 0
+	ld [w2DMenuCursorOffsets], a
 	xor a
 	ld [w2DMenuFlags1], a
 	ld [w2DMenuFlags2], a
 	call ScrollingMenuJoypad
 	bit D_LEFT_F, a
-	jp nz, .asm_28946
+	jp nz, .joy_loop
 	bit B_BUTTON_F, a
-	jr nz, .asm_28983
-	jr .asm_289fe
+	jr nz, .b_button
+	jr .try_trade
 
-.asm_289cd
+.show_stats
 	pop af
 	ld [wMenuCursorY], a
 	ld a, $4
@@ -1455,14 +1455,14 @@
 	hlcoord 6, 1
 	lb bc, 6, 1
 	ld a, " "
-	call Function28b77
+	call LinkEngine_FillBox
 	hlcoord 17, 1
 	lb bc, 6, 1
 	ld a, " "
-	call Function28b77
-	jp Function2888b
+	call LinkEngine_FillBox
+	jp LinkTrade_PlayerPartyMenu
 
-.asm_289fe
+.try_trade
 	call PlaceHollowCursor
 	pop af
 	ld [wMenuCursorY], a
@@ -1472,15 +1472,15 @@
 	callba Function16d6ce
 	ld a, [wOtherPlayerLinkMode]
 	cp $f
-	jp z, Function287e3
+	jp z, InitTradeMenuDisplay
 	ld [wd003], a
 	call Function28b68
-	ld c, $64
+	ld c, 100
 	call DelayFrames
-	callba Functionfb57e
-	jr c, .asm_28a58
+	callba ValidateOTTrademon
+	jr c, .abnormal
 	callba Functionfb5dd
-	jp nc, Function28b87
+	jp nc, LinkTrade
 	xor a
 	ld [wcf57], a
 	ld [wOtherPlayerLinkAction], a
@@ -1489,12 +1489,12 @@
 	ld c, 18
 	call Predef_LinkTextbox
 	callba Function4d354
-	ld hl, UnknownText_0x28aaf
+	ld hl, .Text_CantTradeLastMon
 	bccoord 1, 14
 	call PlaceWholeStringInBoxAtOnce
-	jr .asm_28a89
+	jr .cancel_trade
 
-.asm_28a58
+.abnormal
 	xor a
 	ld [wcf57], a
 	ld [wOtherPlayerLinkAction], a
@@ -1507,21 +1507,21 @@
 	ld [wd265], a
 	call GetPokemonName
 	hlcoord 0, 12
-	ld b, $4
-	ld c, $12
+	ld b, 4
+	ld c, 18
 	call Predef_LinkTextbox
 	callba Function4d354
-	ld hl, UnknownText_0x28ac4
+	ld hl, .Text_Abnormal
 	bccoord 1, 14
 	call PlaceWholeStringInBoxAtOnce
 
-.asm_28a89
+.cancel_trade
 	hlcoord 0, 12
 	ld b, 4
 	ld c, 18
 	call Predef_LinkTextbox
 	hlcoord 1, 14
-	ld de, String28ece
+	ld de, String_TooBadTheTradeWasCanceled
 	call PlaceString
 	ld a, $1
 	ld [wPlayerLinkAction], a
@@ -1528,20 +1528,20 @@
 	callba Function16d6ce
 	ld c, 100
 	call DelayFrames
-	jp Function287e3
+	jp InitTradeMenuDisplay
 ; 28aaf
 
 
-UnknownText_0x28aaf: ; 0x28aaf
+.Text_CantTradeLastMon: ; 0x28aaf
 	; If you trade that #MON, you won't be able to battle.
 	text_jump UnknownText_0x1c41b1
 	db "@"
 ; 0x28ab4
 
-String28ab4: ; 28ab4
+.String_Stats_Trade: ; 28ab4
 	db "STATS     TRADE@"
 
-UnknownText_0x28ac4: ; 0x28ac4
+.Text_Abnormal: ; 0x28ac4
 	; Your friend's @  appears to be abnormal!
 	text_jump UnknownText_0x1c41e6
 	db "@"
@@ -1550,8 +1550,8 @@
 
 Function28ac9: ; 28ac9
 	ld a, [wMenuCursorY]
-	cp $1
-	jp nz, Function2891c
+	cp 1
+	jp nz, LinkTradePartiesMenuMasterLoop
 	call HideCursor
 	push hl
 	push bc
@@ -1560,7 +1560,6 @@
 	ld [hl], " "
 	pop bc
 	pop hl
-
 Function28ade: ; 28ade
 .loop1
 	ld a, "▶"
@@ -1580,12 +1579,12 @@
 	jr z, .d_up
 	ld a, [OTPartyCount]
 	ld [wMenuCursorY], a
-	jp Function28803
+	jp LinkTrade_OTPartyMenu
 
 .d_up
 	ld a, $1
 	ld [wMenuCursorY], a
-	jp Function2888b
+	jp LinkTrade_PlayerPartyMenu
 
 .a_button
 	ld a, "▷"
@@ -1596,7 +1595,6 @@
 	ld a, [wOtherPlayerLinkMode]
 	cp $f
 	jr nz, .loop1
-
 Function28b22: ; 28b22
 	call RotateThreePalettesRight
 	call ClearScreen
@@ -1616,6 +1614,7 @@
 ; 28b42
 
 Function28b42: ; 28b42
+; unreferenced
 	hlcoord 0, 16
 	ld a, "┘"
 	ld bc, 2 * SCREEN_WIDTH
@@ -1625,11 +1624,11 @@
 	ld bc, SCREEN_WIDTH - 2
 	call ByteFill
 	hlcoord 2, 16
-	ld de, String_28b61
+	ld de, .Cancel
 	jp PlaceString
 ; 28b61
 
-String_28b61: ; 28b61
+.Cancel: ; 28b61
 	db "CANCEL@"
 ; 28b68
 
@@ -1638,28 +1637,28 @@
 	hlcoord 6, 9
 	ld bc, SCREEN_WIDTH
 	call AddNTimes
-	ld [hl], $ec
+	ld [hl], "▷"
 	ret
 ; 28b77
 
-Function28b77: ; 28b77
-.asm_28b77
+LinkEngine_FillBox: ; 28b77
+.row
 	push bc
 	push hl
-.asm_28b79
+.col
 	ld [hli], a
 	dec c
-	jr nz, .asm_28b79
+	jr nz, .col
 	pop hl
 	ld bc, SCREEN_WIDTH
 	add hl, bc
 	pop bc
 	dec b
-	jr nz, .asm_28b77
+	jr nz, .row
 	ret
 ; 28b87
 
-Function28b87: ; 28b87
+LinkTrade: ; 28b87
 	xor a
 	ld [wcf57], a
 	ld [wOtherPlayerLinkAction], a
@@ -1711,7 +1710,7 @@
 	ld [w2DMenuFlags1], a
 	ld [w2DMenuFlags2], a
 	ld a, $20
-	ld [w2DMenuFlags3], a
+	ld [w2DMenuCursorOffsets], a
 	ld a, A_BUTTON | B_BUTTON
 	ld [wMenuJoypadFilter], a
 	ld a, 1
@@ -1737,7 +1736,7 @@
 	ld c, 18
 	call Predef_LinkTextbox
 	hlcoord 1, 14
-	ld de, String28ece
+	ld de, String_TooBadTheTradeWasCanceled
 	call PlaceString
 	callba Function16d6ce
 	jp Function28ea3
@@ -1754,7 +1753,7 @@
 	ld c, 18
 	call Predef_LinkTextbox
 	hlcoord 1, 14
-	ld de, String28ece
+	ld de, String_TooBadTheTradeWasCanceled
 	call PlaceString
 	jp Function28ea3
 
@@ -1837,7 +1836,7 @@
 	callba GetCaughtGender
 	ld a, c
 	ld [wPlayerTrademonCaughtData], a
-	ld hl, wd26b
+	ld hl, OTPlayerName
 	ld de, wOTTrademonSenderName
 	ld bc, NAME_LENGTH
 	call CopyBytes
@@ -1937,7 +1936,7 @@
 	ld [CurPartyMon], a
 	callab EvolvePokemon
 	call ClearScreen
-	call Function28ef8
+	call LoadTradeScreenBorder
 	call Function28eff
 	callba Function4d354
 	ld b, $1
@@ -1998,7 +1997,7 @@
 Function28ea3: ; 28ea3
 	ld c, 100
 	call DelayFrames
-	jp Function287e3
+	jp InitTradeMenuDisplay
 ; 28eab
 
 String28eab: ; 28eab
@@ -2014,7 +2013,7 @@
 String28ebd: ; 28ebd
 	db   "Trade completed!@"
 
-String28ece: ; 28ece
+String_TooBadTheTradeWasCanceled: ; 28ece
 	db   "Too bad! The trade"
 	next "was canceled!@"
 
@@ -2026,8 +2025,8 @@
 	ret
 ; 28ef8
 
-Function28ef8: ; 28ef8
-	callba Function16d696
+LoadTradeScreenBorder: ; 28ef8
+	callba _LoadTradeScreenBorder
 	ret
 ; 28eff
 
@@ -2038,6 +2037,7 @@
 ; 28f09
 
 Function28f09: ; 28f09
+; unreferenced
 	hlcoord 0, 0
 	ld b, 6
 	ld c, 18
@@ -2046,7 +2046,7 @@
 	ld b, 6
 	ld c, 18
 	call Predef_LinkTextbox
-	callba Functionfb60d
+	callba PlaceTradePartnerNamesAndParty
 	ret
 ; 28f24
 
@@ -2064,7 +2064,7 @@
 	ld b, PARTY_LENGTH ; 6
 .loop
 	ld a, [hli]
-	cp $ff
+	cp -1
 	jr z, .checkitem
 	cp CHIKORITA ; MEW + 1 ; 151 + 1
 	jr nc, .mon_too_new
--- /dev/null
+++ b/engine/link_trade.asm
@@ -1,0 +1,359 @@
+__LoadTradeScreenBorder: ; 16d421
+	ld de, GFX_16cfc1
+	ld hl, VTiles2
+	lb bc, BANK(GFX_16cfc1), 70
+	call Get2bpp
+	ret
+; 16d42e
+
+Function16d42e: ; 16d42e
+	ld hl, Tilemap_16d465
+	decoord 0, 0
+	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+	call CopyBytes
+	ret
+; 16d43b
+
+Function16d43b: ; 16d43b
+	call LoadStandardMenuDataHeader
+	call ClearBGPalettes
+	call ClearTileMap
+	call ClearSprites
+	callba __LoadTradeScreenBorder ; useless to farcall
+	callba Function16d42e ; useless to farcall
+	ld b, SCGB_08
+	call GetSGBLayout
+	call SetPalettes
+	call WaitBGMap
+	call JoyWaitAorB
+	call Call_ExitMenu
+	ret
+; 16d465
+
+Tilemap_16d465:
+INCBIN "gfx/unknown/16d465.tilemap"
+
+Tilemap_16d5cd:
+INCBIN "gfx/unknown/16d5cd.tilemap"
+
+Tilemap_16d5f5:
+INCBIN "gfx/unknown/16d5f5.tilemap"
+
+_LinkTextbox: ; 16d61d
+	ld h, d
+	ld l, e
+	push bc
+	push hl
+	call .draw_border
+	pop hl
+	pop bc
+
+	ld de, AttrMap - TileMap
+	add hl, de
+	inc b
+	inc b
+	inc c
+	inc c
+	ld a, $7
+.loop
+	push bc
+	push hl
+.loop2
+	ld [hli], a
+	dec c
+	jr nz, .loop2
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+	pop bc
+	dec b
+	jr nz, .loop
+	ret
+; 16d640
+
+.draw_border: ; 16d640
+	push hl
+	ld a, $30
+	ld [hli], a
+	inc a
+	call .fill_row
+	inc a
+	ld [hl], a
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+.loop3
+	push hl
+	ld a, $33
+	ld [hli], a
+	ld a, " "
+	call .fill_row
+	ld [hl], $34
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+	dec b
+	jr nz, .loop3
+
+	ld a, $35
+	ld [hli], a
+	ld a, $36
+	call .fill_row
+	ld [hl], $37
+	ret
+; 16d66d
+
+.fill_row: ; 16d66d
+	ld d, c
+.loop4
+	ld [hli], a
+	dec d
+	jr nz, .loop4
+	ret
+; 16d673
+
+InitTradeSpeciesList: ; 16d673
+	call _LoadTradeScreenBorder
+	call Function16d6ae
+	callba InitMG_Mobile_LinkTradePalMap
+	callba PlaceTradePartnerNamesAndParty
+	hlcoord 10, 17
+	ld de, .CANCEL
+	call PlaceString
+	ret
+; 16d68f
+
+.CANCEL: ; 16d68f
+	db "CANCEL@"
+; 16d696
+
+_LoadTradeScreenBorder: ; 16d696
+	call __LoadTradeScreenBorder
+	ret
+; 16d69a
+
+
+Function16d69a: ; 16d69a
+	ld de, GFX_16cfc1 + $300
+	ld hl, VTiles2 tile $76
+	lb bc, BANK(GFX_16cfc1), 8
+	call Get2bpp
+	ret
+; 16d6a7
+
+Function16d6a7: ; 16d6a7
+	callba Function49811
+	ret
+; 16d6ae
+
+Function16d6ae: ; 16d6ae
+	call Function16d42e
+	ld hl, Tilemap_16d5cd
+	decoord 0, 0
+	ld bc, 2 * SCREEN_WIDTH
+	call CopyBytes
+	ld hl, Tilemap_16d5f5
+	decoord 0, 16
+	ld bc, 2 * SCREEN_WIDTH
+	call CopyBytes
+	ret
+; 16d6ca
+
+LinkTextbox: ; 16d6ca
+	call _LinkTextbox
+	ret
+; 16d6ce
+
+Function16d6ce: ; 16d6ce
+	call LoadStandardMenuDataHeader
+	call Function16d6e1
+	callba Function87d
+	call Call_ExitMenu
+	call WaitBGMap2
+	ret
+; 16d6e1
+
+Function16d6e1: ; 16d6e1
+	hlcoord 4, 10
+	ld b, 1
+	ld c, 10
+	predef Predef_LinkTextbox
+	hlcoord 5, 11
+	ld de, .Waiting
+	call PlaceString
+	call WaitBGMap
+	call WaitBGMap2
+	ld c, 50
+	jp DelayFrames
+; 16d701
+
+.Waiting: ; 16d701
+	db "WAITING..!@"
+; 16d70c
+
+LinkTradeMenu: ; 16d70c
+	call .MenuAction
+	call .GetJoypad
+	ret
+; 16d713
+
+.GetJoypad: ; 16d713
+	push bc
+	push af
+	ld a, [hJoyLast]
+	and D_PAD
+	ld b, a
+	ld a, [hJoyPressed]
+	and BUTTONS
+	or b
+	ld b, a
+	pop af
+	ld a, b
+	pop bc
+	ld d, a
+	ret
+; 16d725
+
+.MenuAction: ; 16d725
+	ld hl, w2DMenuFlags2
+	res 7, [hl]
+	ld a, [hBGMapMode]
+	push af
+	call .loop
+	pop af
+	ld [hBGMapMode], a
+	ret
+
+.loop
+	call .UpdateCursor
+	call .UpdateBGMapAndOAM
+	call .loop2
+	jr nc, .done
+	callba _2DMenuInterpretJoypad
+	jr c, .done
+	ld a, [w2DMenuFlags1]
+	bit 7, a
+	jr nz, .done
+	call .GetJoypad
+	ld b, a
+	ld a, [wMenuJoypadFilter]
+	and b
+	jr z, .loop
+
+.done
+	ret
+; 16d759
+
+.UpdateBGMapAndOAM: ; 16d759
+	ld a, [hOAMUpdate]
+	push af
+	ld a, $1
+	ld [hOAMUpdate], a
+	call WaitBGMap
+	pop af
+	ld [hOAMUpdate], a
+	xor a
+	ld [hBGMapMode], a
+	ret
+
+.loop2
+	call RTC
+	call .TryAnims
+	ret c
+	ld a, [w2DMenuFlags1]
+	bit 7, a
+	jr z, .loop2
+	and a
+	ret
+; 16d77a
+
+.UpdateCursor: ; 16d77a
+	ld hl, wCursorCurrentTile
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [hl]
+	cp $1f
+	jr nz, .not_currently_selected
+	ld a, [wCursorOffCharacter]
+	ld [hl], a
+	push hl
+	push bc
+	ld bc, PKMN_NAME_LENGTH
+	add hl, bc
+	ld [hl], a
+	pop bc
+	pop hl
+
+.not_currently_selected
+	ld a, [w2DMenuCursorInitY]
+	ld b, a
+	ld a, [w2DMenuCursorInitX]
+	ld c, a
+	call Coord2Tile
+	ld a, [w2DMenuCursorOffsets]
+	swap a
+	and $f
+	ld c, a
+	ld a, [wMenuCursorY]
+	ld b, a
+	xor a
+	dec b
+	jr z, .skip
+.loop3
+	add c
+	dec b
+	jr nz, .loop3
+
+.skip
+	ld c, SCREEN_WIDTH
+	call AddNTimes
+	ld a, [w2DMenuCursorOffsets]
+	and $f
+	ld c, a
+	ld a, [wMenuCursorX]
+	ld b, a
+	xor a
+	dec b
+	jr z, .skip2
+.loop4
+	add c
+	dec b
+	jr nz, .loop4
+
+.skip2
+	ld c, a
+	add hl, bc
+	ld a, [hl]
+	cp $1f
+	jr z, .cursor_already_there
+	ld [wCursorOffCharacter], a
+	ld [hl], $1f
+	push hl
+	push bc
+	ld bc, PKMN_NAME_LENGTH
+	add hl, bc
+	ld [hl], $1f
+	pop bc
+	pop hl
+.cursor_already_there
+	ld a, l
+	ld [wCursorCurrentTile], a
+	ld a, h
+	ld [wCursorCurrentTile + 1], a
+	ret
+; 16d7e7
+
+.TryAnims: ; 16d7e7
+	ld a, [w2DMenuFlags1]
+	bit 6, a
+	jr z, .skip_anims
+	callba PlaySpriteAnimationsAndDelayFrame
+.skip_anims
+	call JoyTextDelay
+	call .GetJoypad
+	and a
+	ret z
+	scf
+	ret
+; 16d7fe
--- a/engine/menu.asm
+++ b/engine/menu.asm
@@ -239,8 +239,8 @@
 
 .InitFlags_b: ; 2418a
 	ld a, [wMenuData2Spacing]
-	or %00100000
-	ld [w2DMenuFlags3], a
+	or $20
+	ld [w2DMenuCursorOffsets], a
 	ret
 ; 24193
 
@@ -536,7 +536,7 @@
 	ld a, [w2DMenuCursorInitX]
 	ld c, a
 	call Coord2Tile
-	ld a, [w2DMenuFlags3]
+	ld a, [w2DMenuCursorOffsets]
 	swap a
 	and $f
 	ld c, a
@@ -553,7 +553,7 @@
 .got_row
 	ld c, SCREEN_WIDTH
 	call AddNTimes
-	ld a, [w2DMenuFlags3]
+	ld a, [w2DMenuCursorOffsets]
 	and $f
 	ld c, a
 	ld a, [wMenuCursorX]
@@ -809,8 +809,8 @@
 ; w2DMenuFlags2
 	xor a
 	ld [hli], a
-; w2DMenuFlags3
-	ld a, %00100000
+; w2DMenuCursorOffsets
+	ln a, 2, 0
 	ld [hli], a
 ; wMenuJoypadFilter
 	ld a, A_BUTTON
--- a/engine/scrolling_menu.asm
+++ b/engine/scrolling_menu.asm
@@ -309,7 +309,7 @@
 	xor a
 	ld [w2DMenuFlags2], a
 	ld a, $20
-	ld [w2DMenuFlags3], a
+	ld [w2DMenuCursorOffsets], a
 	ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN
 	bit 7, c
 	jr z, .disallow_select
--- a/engine/stats_screen.asm
+++ b/engine/stats_screen.asm
@@ -474,22 +474,22 @@
 	ret
 
 Function4dfb6: ; 4dfb6 (13:5fb6)
-	ld a, [CurBaseData] ; wd236 (aliases: BaseDexNo)
+	ld a, [BaseDexNo] ; wd236 (aliases: BaseDexNo)
 	ld [wd265], a
 	ld [CurSpecies], a
 	xor a
 	ld [hBGMapMode], a
 	call Function4dfda
-	call Function4e002
+	call DrawStatsScreenPage
 	call Function4dfed
 	ld hl, wcf64
 	bit 4, [hl]
-	jr nz, .asm_4dfd6
+	jr nz, .place_frontpic
 	call SetPalettes
 	ret
 
-.asm_4dfd6
-	call Function4e226
+.place_frontpic
+	call StatsScreen_PlaceFrontpic
 	ret
 
 Function4dfda: ; 4dfda (13:5fda)
@@ -512,87 +512,88 @@
 	set 5, [hl]
 	ret
 
-Function4e002: ; 4e002 (13:6002)
+DrawStatsScreenPage: ; 4e002 (13:6002)
 	ld a, [wcf64]
 	and $3
 	dec a
-	ld hl, Jumptable_4e00d
+	ld hl, .Jumptable
 	rst JumpTable
 	ret
 
-Jumptable_4e00d: ; 4e00d (13:600d)
-	dw Function4e013
-	dw Function4e147
-	dw Function4e1ae
+.Jumptable: ; 4e00d (13:600d)
+	jumptable_start
+	jumptable .PinkPage
+	jumptable .GreenPage
+	jumptable .BluePage
 
 
-Function4e013: ; 4e013 (13:6013)
+.PinkPage: ; 4e013 (13:6013)
 	hlcoord 0, 9
 	ld b, $0
 	predef DrawPlayerHP
 	hlcoord 8, 9
 	ld [hl], $41
-	ld de, String_4e119
+	ld de, .Status_Type
 	hlcoord 0, 12
 	call PlaceString
 	ld a, [TempMonPokerusStatus]
 	ld b, a
 	and $f
-	jr nz, .asm_4e055
+	jr nz, .HasPokerus
 	ld a, b
 	and $f0
-	jr z, .asm_4e03d
+	jr z, .NotImmuneToPkrs
 	hlcoord 8, 8
-	ld [hl], $e8
-.asm_4e03d
+	ld [hl], "."
+.NotImmuneToPkrs
 	ld a, [MonType]
-	cp $2
-	jr z, .asm_4e060
+	cp BOXMON
+	jr z, .StatusOK
 	hlcoord 6, 13
 	push hl
 	ld de, TempMonStatus
 	predef PlaceStatusString
 	pop hl
-	jr nz, .asm_4e066
-	jr .asm_4e060
-.asm_4e055
-	ld de, String_4e142
+	jr nz, .done_status
+	jr .StatusOK
+.HasPokerus
+	ld de, .PkrsStr
 	hlcoord 1, 13
 	call PlaceString
-	jr .asm_4e066
-.asm_4e060
-	ld de, String_4e127
+	jr .done_status
+.StatusOK
+	ld de, .OK_str
 	call PlaceString
-.asm_4e066
+.done_status
 	hlcoord 1, 15
 	predef PrintMonTypes
 	hlcoord 9, 8
-	ld de, $14
-	ld b, $a
+	ld de, SCREEN_WIDTH
+	ld b, 10
 	ld a, $31
-.asm_4e078
+.vertical_divider
 	ld [hl], a
 	add hl, de
 	dec b
-	jr nz, .asm_4e078
-	ld de, String_4e12b
+	jr nz, .vertical_divider
+	ld de, .ExpPointStr
 	hlcoord 10, 9
 	call PlaceString
 	hlcoord 17, 14
-	call Function4e0d3
+	call .PrintNextLevel
 	hlcoord 13, 10
 	lb bc, 3, 7
 	ld de, TempMonExp
 	call PrintNum
-	call Function4e0e7
+	call .CalcExpToNextLevel
 	hlcoord 13, 13
 	lb bc, 3, 7
 	ld de, Buffer1 ; wd1ea (aliases: MagikarpLength)
 	call PrintNum
-	ld de, String_4e136
+	ld de, .LevelUpStr
 	hlcoord 10, 12
 	call PlaceString
-	ld de, String_4e13f
+	ld de, .ToStr
 	hlcoord 14, 14
 	call PlaceString
 	hlcoord 11, 16
@@ -606,23 +607,23 @@
 	ld [hl], $41
 	ret
 
-Function4e0d3: ; 4e0d3 (13:60d3)
+.PrintNextLevel: ; 4e0d3 (13:60d3)
 	ld a, [TempMonLevel]
 	push af
 	cp MAX_LEVEL
-	jr z, .asm_4e0df
+	jr z, .AtMaxLevel
 	inc a
 	ld [TempMonLevel], a
-.asm_4e0df
+.AtMaxLevel
 	call PrintLevel
 	pop af
 	ld [TempMonLevel], a
 	ret
 
-Function4e0e7: ; 4e0e7 (13:60e7)
+.CalcExpToNextLevel: ; 4e0e7 (13:60e7)
 	ld a, [TempMonLevel]
 	cp MAX_LEVEL
-	jr z, .asm_4e111
+	jr z, .AlreadyAtMaxLevel
 	inc a
 	ld d, a
 	callba CalcExpAtLevel
@@ -629,11 +630,11 @@
 rept 2
 	ld hl, TempMonExp + 2
 endr
-	ld a, [$ffb6]
+	ld a, [hQuotient + 2]
 	sub [hl]
 	dec hl
-	ld [wd1ec], a
-	ld a, [$ffb5]
+	ld [Buffer3], a
+	ld a, [hQuotient + 1]
 	sbc [hl]
 	dec hl
 	ld [Buffer2], a ; wd1eb (aliases: MovementType)
@@ -641,7 +642,8 @@
 	sbc [hl]
 	ld [Buffer1], a ; wd1ea (aliases: MagikarpLength)
 	ret
-.asm_4e111
+
+.AlreadyAtMaxLevel
 	ld hl, Buffer1 ; wd1ea (aliases: MagikarpLength)
 	xor a
 rept 2
@@ -651,39 +653,39 @@
 	ret
 ; 4e119 (13:6119)
 
-String_4e119: ; 4e119
+.Status_Type: ; 4e119
 	db   "STATUS/"
 	next "TYPE/@"
 ; 4e127
 
-String_4e127: ; 4e127
+.OK_str: ; 4e127
 	db "OK @"
 ; 4e12b
 
-String_4e12b: ; 4e12b
+.ExpPointStr: ; 4e12b
 	db "EXP POINTS@"
 ; 4e136
 
-String_4e136: ; 4e136
+.LevelUpStr: ; 4e136
 	db "LEVEL UP@"
 ; 4e13f
 
-String_4e13f: ; 4e13f
+.ToStr: ; 4e13f
 	db "TO@"
 ; 4e142
 
-String_4e142: ; 4e142
+.PkrsStr: ; 4e142
 	db "#RUS@"
 ; 4e147
 
-Function4e147: ; 4e147 (13:6147)
-	ld de, String_4e1a0
+.GreenPage: ; 4e147 (13:6147)
+	ld de, .Item
 	hlcoord 0, 8
 	call PlaceString
-	call Function4e189
+	call .GetItemName
 	hlcoord 8, 8
 	call PlaceString
-	ld de, String_4e1a9
+	ld de, .Move
 	hlcoord 0, 10
 	call PlaceString
 	ld hl, TempMonMoves
@@ -695,18 +697,18 @@
 	ld [Buffer1], a
 	predef ListMoves
 	hlcoord 12, 11
-	ld a, $28
+	ld a, SCREEN_WIDTH * 2
 	ld [Buffer1], a
 	predef ListMovePP
 	ret
 
-Function4e189: ; 4e189 (13:6189)
-	ld de, String_4e1a5
+.GetItemName: ; 4e189 (13:6189)
+	ld de, .ThreeDashes
 	ld a, [TempMonItem]
 	and a
 	ret z
 	ld b, a
-	callba Function28771
+	callba TimeCapsule_ReplaceTeruSama
 	ld a, b
 	ld [wd265], a
 	call GetItemName
@@ -713,35 +715,35 @@
 	ret
 ; 4e1a0 (13:61a0)
 
-String_4e1a0: ; 4e1a0
+.Item: ; 4e1a0
 	db "ITEM@"
 ; 4e1a5
 
-String_4e1a5: ; 4e1a5
+.ThreeDashes: ; 4e1a5
 	db "---@"
 ; 4e1a9
 
-String_4e1a9: ; 4e1a9
+.Move: ; 4e1a9
 	db "MOVE@"
 ; 4e1ae
 
-Function4e1ae: ; 4e1ae (13:61ae)
-	call Function4e1cc
+.BluePage: ; 4e1ae (13:61ae)
+	call .PlaceOTInfo
 	hlcoord 10, 8
-	ld de, $14
-	ld b, $a
+	ld de, SCREEN_WIDTH
+	ld b, 10
 	ld a, $31
-.asm_4e1bb
+.BluePageVerticalDivider
 	ld [hl], a
 	add hl, de
 	dec b
-	jr nz, .asm_4e1bb
+	jr nz, .BluePageVerticalDivider
 	hlcoord 11, 8
-	ld bc, $6
+	ld bc, 6
 	predef PrintTempMonStats
 	ret
 
-Function4e1cc: ; 4e1cc (13:61cc)
+.PlaceOTInfo: ; 4e1cc (13:61cc)
 	ld de, IDNoString
 	hlcoord 0, 9
 	call PlaceString
@@ -752,7 +754,7 @@
 	lb bc, PRINTNUM_LEADINGZEROS | 2, 5
 	ld de, TempMonID
 	call PrintNum
-	ld hl, Unknown_4e216
+	ld hl, .OTNamePointers
 	call Function4e528
 	call Function4e505
 	callba CheckNickErrors
@@ -760,29 +762,29 @@
 	call PlaceString
 	ld a, [TempMonCaughtGender]
 	and a
-	jr z, .asm_4e215
+	jr z, .done
 	cp $7f
-	jr z, .asm_4e215
+	jr z, .done
 	and $80
 	ld a, "♂"
-	jr z, .asm_4e211
+	jr z, .got_gender
 	ld a, "♀"
-.asm_4e211
+.got_gender
 	hlcoord 9, 13
 	ld [hl], a
-.asm_4e215
+.done
 	ret
 ; 4e216 (13:6216)
 
-Unknown_4e216: ; 4e216
+.OTNamePointers: ; 4e216
 	dw PartyMonOT
 	dw OTPartyMonOT
 	dw sBoxMonOT
-	dw wd00d
+	dw wBufferMonOT
 ; 4e21e
 
 IDNoString: ; 4e21e
-	db $73, "№.@"
+	db "<ID>№.@"
 
 OTString: ; 4e222
 	db "OT/@"
@@ -789,23 +791,26 @@
 ; 4e226
 
 
-Function4e226: ; 4e226 (13:6226)
+StatsScreen_PlaceFrontpic: ; 4e226 (13:6226)
 	ld hl, TempMonDVs
 	predef GetUnownLetter
-	call Function4e2ad
-	jr c, .asm_4e238
+	call StatsScreen_GetAnimationParam
+	jr c, .egg
 	and a
-	jr z, .asm_4e23f
-	jr .asm_4e246
-.asm_4e238
+	jr z, .no_cry
+	jr .cry
+
+.egg
 	call Function4e271
 	call SetPalettes
 	ret
-.asm_4e23f
+
+.no_cry
 	call Function4e253
 	call SetPalettes
 	ret
-.asm_4e246
+
+.cry
 	call SetPalettes
 	call Function4e253
 	ld a, [CurPartySpecies]
@@ -817,11 +822,12 @@
 	set 5, [hl]
 	ld a, [CurPartySpecies]
 	cp UNOWN
-	jr z, .asm_4e266
+	jr z, .unown
 	hlcoord 0, 0
 	call PrepMonFrontpic
 	ret
-.asm_4e266
+
+.unown
 	xor a
 	ld [wBoxAlignment], a
 	hlcoord 0, 0
@@ -831,12 +837,13 @@
 Function4e271: ; 4e271 (13:6271)
 	ld a, [CurPartySpecies]
 	cp UNOWN
-	jr z, .asm_4e281
+	jr z, .unown
 	ld a, $1
 	ld [wBoxAlignment], a
 	call Function4e289
 	ret
-.asm_4e281
+
+.unown
 	xor a
 	ld [wBoxAlignment], a
 	call Function4e289
@@ -857,7 +864,7 @@
 	set 6, [hl]
 	ret
 
-Function4e2ad: ; 4e2ad (13:62ad)
+StatsScreen_GetAnimationParam: ; 4e2ad (13:62ad)
 	ld a, [MonType]
 	ld hl, .Jumptable
 	rst JumpTable
@@ -864,14 +871,14 @@
 	ret
 
 .Jumptable: ; 4e2b5 (13:62b5)
-	dw Function4e2bf
-	dw Function4e2cf
-	dw Function4e2d1
-	dw Function4e2ed
-	dw Function4e301
+	dw .PartyMon
+	dw .OTPartyMon
+	dw .BoxMon
+	dw .Tempmon
+	dw .Wildmon
 
 
-Function4e2bf: ; 4e2bf (13:62bf)
+.PartyMon: ; 4e2bf (13:62bf)
 	ld a, [CurPartyMon]
 	ld hl, PartyMons ; wdcdf (aliases: PartyMon1, PartyMon1Species)
 	ld bc, PARTYMON_STRUCT_LENGTH
@@ -878,13 +885,13 @@
 	call AddNTimes
 	ld b, h
 	ld c, l
-	jr Function4e2f2
+	jr .CheckEggFaintedFrzSlp
 
-Function4e2cf: ; 4e2cf (13:62cf)
+.OTPartyMon: ; 4e2cf (13:62cf)
 	xor a
 	ret
 
-Function4e2d1: ; 4e2d1 (13:62d1)
+.BoxMon: ; 4e2d1 (13:62d1)
 	ld hl, sBoxMons
 	ld bc, PARTYMON_STRUCT_LENGTH
 	ld a, [CurPartyMon]
@@ -893,32 +900,33 @@
 	ld c, l
 	ld a, BANK(sBoxMons)
 	call GetSRAMBank
-	call Function4e2f2
+	call .CheckEggFaintedFrzSlp
 	push af
 	call CloseSRAM
 	pop af
 	ret
 
-Function4e2ed: ; 4e2ed (13:62ed)
+.Tempmon: ; 4e2ed (13:62ed)
 	ld bc, TempMonSpecies ; wd10e (aliases: TempMon)
-	jr Function4e2f2 ; utterly pointless
+	jr .CheckEggFaintedFrzSlp ; utterly pointless
 
-Function4e2f2: ; 4e2f2 (13:62f2)
+.CheckEggFaintedFrzSlp: ; 4e2f2 (13:62f2)
 	ld a, [CurPartySpecies]
 	cp EGG
 	jr z, .egg
 	call CheckFaintedFrzSlp
-	jr c, Function4e305
+	jr c, .FaintedFrzSlp
 .egg
 	xor a
 	scf
 	ret
 
-Function4e301: ; 4e301 (13:6301)
+.Wildmon: ; 4e301 (13:6301)
 	ld a, $1
 	and a
 	ret
-Function4e305: ; 4e305 (13:6305)
+
+.FaintedFrzSlp: ; 4e305 (13:6305)
 	xor a
 	ret
 
@@ -995,7 +1003,7 @@
 	hlcoord 0, 0
 	call PrepMonFrontpic
 	callba Function10402d
-	call Function4e497
+	call StatsScreen_AnimateEgg
 
 	ld a, [TempMonHappiness]
 	cp 6
@@ -1034,18 +1042,19 @@
 ; 0x4e497
 
 
-Function4e497: ; 4e497 (13:6497)
-	call Function4e2ad
+StatsScreen_AnimateEgg: ; 4e497 (13:6497)
+	call StatsScreen_GetAnimationParam
 	ret nc
 	ld a, [TempMonHappiness]
 	ld e, $7
-	cp $6
-	jr c, .asm_4e4ab
+	cp 6
+	jr c, .animate
 	ld e, $8
-	cp $b
-	jr c, .asm_4e4ab
+	cp 11
+	jr c, .animate
 	ret
-.asm_4e4ab
+
+.animate
 	push de
 	ld a, $1
 	ld [wBoxAlignment], a
--- a/engine/time_capsule/conversion.asm
+++ b/engine/time_capsule/conversion.asm
@@ -1,6 +1,6 @@
 ; These functions seem to be related to backwards compatibility
 
-Functionfb57e: ; fb57e
+ValidateOTTrademon: ; fb57e
 	ld a, [wd003]
 	ld hl, OTPartyMon1Species
 	call GetPartyLocation
@@ -14,21 +14,21 @@
 	ld a, [hl]
 	pop hl
 	cp EGG
-	jr z, .asm_fb59c
+	jr z, .matching_or_egg
 	cp [hl]
-	jr nz, .asm_fb5db
+	jr nz, .abnormal
 
-.asm_fb59c
+.matching_or_egg
 	ld b, h
 	ld c, l
 	ld hl, MON_LEVEL
 	add hl, bc
 	ld a, [hl]
-	cp 101
-	jr nc, .asm_fb5db
+	cp MAX_LEVEL + 1
+	jr nc, .abnormal
 	ld a, [wLinkMode]
 	cp LINK_TIMECAPSULE
-	jr nz, .asm_fb5d9
+	jr nz, .normal
 	ld hl, OTPartySpecies
 	ld a, [wd003]
 	ld c, a
@@ -39,29 +39,29 @@
 	; Magnemite and Magneton's types changed
 	; from Electric to Electric/Steel.
 	cp MAGNEMITE
-	jr z, .asm_fb5d9
+	jr z, .normal
 	cp MAGNETON
-	jr z, .asm_fb5d9
+	jr z, .normal
 
 	ld [CurSpecies], a
 	call GetBaseData
-	ld hl, wcbea
+	ld hl, wLinkOTPartyMonTypes
 rept 2
 	add hl, bc
 endr
 	ld a, [BaseType1]
 	cp [hl]
-	jr nz, .asm_fb5db
+	jr nz, .abnormal
 	inc hl
 	ld a, [BaseType2]
 	cp [hl]
-	jr nz, .asm_fb5db
+	jr nz, .abnormal
 
-.asm_fb5d9
+.normal
 	and a
 	ret
 
-.asm_fb5db
+.abnormal
 	scf
 	ret
 ; fb5dd
@@ -72,10 +72,10 @@
 	ld a, [PartyCount]
 	ld b, a
 	ld c, $0
-.asm_fb5e7
+.loop
 	ld a, c
 	cp d
-	jr z, .asm_fb5f8
+	jr z, .next
 	push bc
 	ld a, c
 	ld hl, PartyMon1HP
@@ -83,27 +83,27 @@
 	pop bc
 	ld a, [hli]
 	or [hl]
-	jr nz, .asm_fb60b
+	jr nz, .done
 
-.asm_fb5f8
+.next
 	inc c
 	dec b
-	jr nz, .asm_fb5e7
+	jr nz, .loop
 	ld a, [wd003]
 	ld hl, OTPartyMon1HP
 	call GetPartyLocation
 	ld a, [hli]
 	or [hl]
-	jr nz, .asm_fb60b
+	jr nz, .done
 	scf
 	ret
 
-.asm_fb60b
+.done
 	and a
 	ret
 ; fb60d
 
-Functionfb60d: ; fb60d
+PlaceTradePartnerNamesAndParty: ; fb60d
 	hlcoord 4, 0
 	ld de, PlayerName
 	call PlaceString
@@ -110,21 +110,20 @@
 	ld a, $14
 	ld [bc], a
 	hlcoord 4, 8
-	ld de, wd26b
+	ld de, OTPlayerName
 	call PlaceString
 	ld a, $14
 	ld [bc], a
 	hlcoord 7, 1
 	ld de, PartySpecies
-	call Functionfb634
+	call .PlaceSpeciesNames
 	hlcoord 7, 9
 	ld de, OTPartySpecies
-
-Functionfb634: ; fb634
+.PlaceSpeciesNames: ; fb634
 	ld c, $0
-.asm_fb636
+.loop
 	ld a, [de]
-	cp $ff
+	cp -1
 	ret z
 	ld [wd265], a
 	push bc
@@ -143,7 +142,7 @@
 	add hl, bc
 	pop bc
 	inc c
-	jr .asm_fb636
+	jr .loop
 ; fb656
 
 KantoMonSpecials: ; fb656
--- a/engine/tmhm2.asm
+++ b/engine/tmhm2.asm
@@ -215,7 +215,7 @@
 	xor a
 	ld [w2DMenuFlags2], a
 	ld a, $20
-	ld [w2DMenuFlags3], a
+	ld [w2DMenuCursorOffsets], a
 	ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN | D_LEFT | D_RIGHT
 	ld [wMenuJoypadFilter], a
 	ld a, [wTMHMPocketCursor]
--- a/items/item_effects.asm
+++ b/items/item_effects.asm
@@ -1285,7 +1285,7 @@
 	call GetPartyParamLocation
 	ld d, h
 	ld e, l
-	ld a, MON_EXP + 2
+	ld a, MON_STAT_EXP - 1
 	call GetPartyParamLocation
 	ld b, $1
 	predef_jump CalcPkmnStats
--- a/main.asm
+++ b/main.asm
@@ -5326,7 +5326,7 @@
 	add hl, bc
 	ld a, $1
 	ld c, a
-	ld b, $0
+	ld b, FALSE
 	call CalcPkmnStatC
 	ld a, [hProduct + 2]
 	ld [de], a
@@ -5716,7 +5716,7 @@
 	add hl, bc
 	ld d, h
 	ld e, l
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 
 	push bc
@@ -6461,7 +6461,7 @@
 	ld d, h
 	ld e, l
 	push de
-	ld a, MON_EXP + 2
+	ld a, MON_STAT_EXP - 1
 	call GetPartyParamLocation
 	ld b, $1
 	call CalcPkmnStats
@@ -6478,8 +6478,9 @@
 
 CalcPkmnStats: ; e167
 ; Calculates all 6 Stats of a Pkmn
-; b = 0 or 1
+; b: Take into account stat EXP if TRUE
 ; 'c' counts from 1-6 and points with 'BaseStats' to the base value
+; hl is the path to the Stat EXP
 ; results in $ffb5 and $ffb6 are saved in [de]
 
 	ld c, $0
@@ -10274,9 +10275,9 @@
 	call ClearScreen
 	call ClearBGPalettes
 	call MaxVolume
-	callba Function28ef8
+	callba LoadTradeScreenBorder
 	callba Function4d354
-	callba Function16d673
+	callba InitTradeSpeciesList
 	callba Function28eff
 	call WaitBGMap2
 	ret
@@ -11869,7 +11870,7 @@
 	add hl, bc
 	ld d, h
 	ld e, l
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	push bc
 	ld b, $1
@@ -15345,6 +15346,7 @@
 SECTION "bank5B", ROMX, BANK[$5B]
 
 INCLUDE "misc/mobile_5b.asm"
+INCLUDE "engine/link_trade.asm"
 
 SECTION "bank5C", ROMX, BANK[$5C]
 
--- a/misc/battle_tower_5c.asm
+++ b/misc/battle_tower_5c.asm
@@ -482,7 +482,7 @@
 	ld e, l
 	push hl
 	push de
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	ld b, $1
 	predef CalcPkmnStats
--- a/misc/mobile_12_2.asm
+++ b/misc/mobile_12_2.asm
@@ -490,7 +490,7 @@
 	ld a, $fb
 	ld [wMenuJoypadFilter], a
 	ld a, $26
-	ld [w2DMenuFlags3], a
+	ld [w2DMenuCursorOffsets], a
 	ld a, $2
 	ld [w2DMenuNumCols], a
 	call Function4adf7
--- a/misc/mobile_40.asm
+++ b/misc/mobile_40.asm
@@ -6830,7 +6830,7 @@
 	ld hl, VTiles0
 	lb bc, BANK(GFX_1032a2), 4
 	call Get2bpp
-	callba Function16d421
+	callba __LoadTradeScreenBorder
 	call EnableLCD
 	ret
 ; 102dec
@@ -6889,7 +6889,7 @@
 
 Function102e4f: ; 102e4f
 	callba Function16d42e
-	callba Function49797
+	callba _InitMG_Mobile_LinkTradePalMap
 	ld de, PlayerName
 	hlcoord 4, 0
 	call PlaceString
--- a/misc/mobile_46.asm
+++ b/misc/mobile_46.asm
@@ -7278,7 +7278,7 @@
 	ld hl, MON_MAXHP
 	add hl, de
 	push hl
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, de
 	pop de
 	push de
--- a/misc/mobile_5b.asm
+++ b/misc/mobile_5b.asm
@@ -866,371 +866,3 @@
 
 GFX_16cfc1:
 INCBIN "gfx/unknown/16cfc1.2bpp"
-
-Function16d421: ; 16d421
-	ld de, GFX_16cfc1
-	ld hl, VTiles2
-	lb bc, BANK(GFX_16cfc1), $46
-	call Get2bpp
-	ret
-; 16d42e
-
-Function16d42e: ; 16d42e
-	ld hl, Tilemap_16d465
-	decoord 0, 0
-	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
-	call CopyBytes
-	ret
-; 16d43b
-
-Function16d43b: ; 16d43b
-	call LoadStandardMenuDataHeader
-	call ClearBGPalettes
-	call ClearTileMap
-	call ClearSprites
-	callba Function16d421
-	callba Function16d42e
-	ld b, SCGB_08
-	call GetSGBLayout
-	call SetPalettes
-	call WaitBGMap
-	call JoyWaitAorB
-	call Call_ExitMenu
-	ret
-; 16d465
-
-Tilemap_16d465:
-INCBIN "gfx/unknown/16d465.tilemap"
-
-Tilemap_16d5cd:
-INCBIN "gfx/unknown/16d5cd.tilemap"
-
-Tilemap_16d5f5:
-INCBIN "gfx/unknown/16d5f5.tilemap"
-
-_LinkTextbox: ; 16d61d
-	ld h, d
-	ld l, e
-	push bc
-	push hl
-	call .draw_border
-	pop hl
-	pop bc
-
-	ld de, AttrMap - TileMap
-	add hl, de
-	inc b
-	inc b
-	inc c
-	inc c
-	ld a, $7
-.loop
-	push bc
-	push hl
-.loop2
-	ld [hli], a
-	dec c
-	jr nz, .loop2
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-	pop bc
-	dec b
-	jr nz, .loop
-	ret
-; 16d640
-
-.draw_border: ; 16d640
-	push hl
-	ld a, $30
-	ld [hli], a
-	inc a
-	call .fill_row
-	inc a
-	ld [hl], a
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-.loop3
-	push hl
-	ld a, $33
-	ld [hli], a
-	ld a, " "
-	call .fill_row
-	ld [hl], $34
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-	dec b
-	jr nz, .loop3
-
-	ld a, $35
-	ld [hli], a
-	ld a, $36
-	call .fill_row
-	ld [hl], $37
-	ret
-; 16d66d
-
-.fill_row: ; 16d66d
-	ld d, c
-.loop4
-	ld [hli], a
-	dec d
-	jr nz, .loop4
-	ret
-; 16d673
-
-Function16d673: ; 16d673
-	call Function16d696
-	call Function16d6ae
-	callba Function49856
-	callba Functionfb60d
-	hlcoord 10, 17
-	ld de, String_16d68f
-	call PlaceString
-	ret
-; 16d68f
-
-String_16d68f: ; 16d68f
-	db "CANCEL@"
-; 16d696
-
-Function16d696: ; 16d696
-	call Function16d421
-	ret
-; 16d69a
-
-
-Function16d69a: ; 16d69a
-	ld de, GFX_16cfc1 + $300
-	ld hl, VTiles2 tile $76
-	lb bc, BANK(GFX_16cfc1), 8
-	call Get2bpp
-	ret
-; 16d6a7
-
-Function16d6a7: ; 16d6a7
-	callba Function49811
-	ret
-; 16d6ae
-
-Function16d6ae: ; 16d6ae
-	call Function16d42e
-	ld hl, Tilemap_16d5cd
-	decoord 0, 0
-	ld bc, $0028
-	call CopyBytes
-	ld hl, Tilemap_16d5f5
-	decoord 0, 16
-	ld bc, $0028
-	call CopyBytes
-	ret
-; 16d6ca
-
-LinkTextbox: ; 16d6ca
-	call _LinkTextbox
-	ret
-; 16d6ce
-
-Function16d6ce: ; 16d6ce
-	call LoadStandardMenuDataHeader
-	call Function16d6e1
-	callba Function87d
-	call Call_ExitMenu
-	call WaitBGMap2
-	ret
-; 16d6e1
-
-Function16d6e1: ; 16d6e1
-	hlcoord 4, 10
-	ld b, 1
-	ld c, 10
-	predef Predef_LinkTextbox
-	hlcoord 5, 11
-	ld de, .Waiting
-	call PlaceString
-	call WaitBGMap
-	call WaitBGMap2
-	ld c, $32
-	jp DelayFrames
-; 16d701
-
-.Waiting: ; 16d701
-	db "WAITING..!@"
-; 16d70c
-
-Function16d70c: ; 16d70c
-	call Function16d725
-	call Function16d713
-	ret
-; 16d713
-
-Function16d713: ; 16d713
-	push bc
-	push af
-	ld a, [hJoyLast]
-	and $f0
-	ld b, a
-	ld a, [hJoyPressed]
-	and $f
-	or b
-	ld b, a
-	pop af
-	ld a, b
-	pop bc
-	ld d, a
-	ret
-; 16d725
-
-Function16d725: ; 16d725
-	ld hl, w2DMenuFlags2
-	res 7, [hl]
-	ld a, [hBGMapMode]
-	push af
-	call Function16d734
-	pop af
-	ld [hBGMapMode], a
-	ret
-; 16d734
-
-Function16d734: ; 16d734
-.asm_16d734
-	call Function16d77a
-	call Function16d759
-	call Function16d76a
-	jr nc, .asm_16d758
-	callba _2DMenuInterpretJoypad
-	jr c, .asm_16d758
-	ld a, [w2DMenuFlags1]
-	bit 7, a
-	jr nz, .asm_16d758
-	call Function16d713
-	ld b, a
-	ld a, [wMenuJoypadFilter]
-	and b
-	jr z, .asm_16d734
-
-.asm_16d758
-	ret
-; 16d759
-
-Function16d759: ; 16d759
-	ld a, [hOAMUpdate]
-	push af
-	ld a, $1
-	ld [hOAMUpdate], a
-	call WaitBGMap
-	pop af
-	ld [hOAMUpdate], a
-	xor a
-	ld [hBGMapMode], a
-	ret
-; 16d76a
-
-Function16d76a: ; 16d76a
-.asm_16d76a
-	call RTC
-	call Function16d7e7
-	ret c
-	ld a, [w2DMenuFlags1]
-	bit 7, a
-	jr z, .asm_16d76a
-	and a
-	ret
-; 16d77a
-
-Function16d77a: ; 16d77a
-	ld hl, wCursorCurrentTile
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [hl]
-	cp $1f
-	jr nz, .asm_16d792
-	ld a, [wCursorOffCharacter]
-	ld [hl], a
-	push hl
-	push bc
-	ld bc, $000b
-	add hl, bc
-	ld [hl], a
-	pop bc
-	pop hl
-
-.asm_16d792
-	ld a, [w2DMenuCursorInitY]
-	ld b, a
-	ld a, [w2DMenuCursorInitX]
-	ld c, a
-	call Coord2Tile
-	ld a, [w2DMenuFlags3]
-	swap a
-	and $f
-	ld c, a
-	ld a, [wMenuCursorY]
-	ld b, a
-	xor a
-	dec b
-	jr z, .asm_16d7b1
-.asm_16d7ad
-	add c
-	dec b
-	jr nz, .asm_16d7ad
-
-.asm_16d7b1
-	ld c, $14
-	call AddNTimes
-	ld a, [w2DMenuFlags3]
-	and $f
-	ld c, a
-	ld a, [wMenuCursorX]
-	ld b, a
-	xor a
-	dec b
-	jr z, .asm_16d7c8
-.asm_16d7c4
-	add c
-	dec b
-	jr nz, .asm_16d7c4
-
-.asm_16d7c8
-	ld c, a
-	add hl, bc
-	ld a, [hl]
-	cp $1f
-	jr z, .asm_16d7de
-	ld [wCursorOffCharacter], a
-	ld [hl], $1f
-	push hl
-	push bc
-	ld bc, $000b
-	add hl, bc
-	ld [hl], $1f
-	pop bc
-	pop hl
-
-.asm_16d7de
-	ld a, l
-	ld [wCursorCurrentTile], a
-	ld a, h
-	ld [wCursorCurrentTile + 1], a
-	ret
-; 16d7e7
-
-Function16d7e7: ; 16d7e7
-	ld a, [w2DMenuFlags1]
-	bit 6, a
-	jr z, .asm_16d7f4
-	callba PlaySpriteAnimationsAndDelayFrame
-
-.asm_16d7f4
-	call JoyTextDelay
-	call Function16d713
-	and a
-	ret z
-	scf
-	ret
-; 16d7fe
-
-
--- a/misc/mobile_menu.asm
+++ b/misc/mobile_menu.asm
@@ -153,7 +153,7 @@
 	inc hl
 	xor a ; w2DMenuFlags2
 	ld [hli], a
-	ld a, $20 ; w2DMenuFlags3
+	ld a, $20 ; w2DMenuCursorOffsets
 	ld [hli], a
 	; this is a stupid way to load $c3
 	ld a, A_BUTTON
--- a/predef/crystal.asm
+++ b/predef/crystal.asm
@@ -514,7 +514,7 @@
 	RGB 31, 31, 31
 ; 49797
 
-Function49797: ; 49797
+_InitMG_Mobile_LinkTradePalMap: ; 49797
 	hlcoord 0, 0, AttrMap
 	lb bc, 16, 2
 	ld a, $4
@@ -608,7 +608,7 @@
 	RGB 31, 31, 31
 ; 49856
 
-Function49856: ; 49856
-	call Function49797
+InitMG_Mobile_LinkTradePalMap: ; 49856
+	call _InitMG_Mobile_LinkTradePalMap
 	ret
 ; 4985a
--- a/unknown/013a47.asm
+++ b/unknown/013a47.asm
@@ -87,7 +87,7 @@
 	add hl, bc
 	ld d, h
 	ld e, l
-	ld hl, MON_EXP + 2
+	ld hl, MON_STAT_EXP - 1
 	add hl, bc
 	ld b, $1
 	predef CalcPkmnStats
--- a/wram.asm
+++ b/wram.asm
@@ -1170,7 +1170,6 @@
 wMysteryGiftStaging::
 
 wLinkData:: ; ds $514
-	ds 6
 wLinkPlayerName:: ds NAME_LENGTH
 wLinkPartyCount:: ds 1
 wLinkPartySpecies:: ds PARTY_LENGTH
@@ -1197,9 +1196,9 @@
 wLinkPlayerPartyMon6:: party_struct wLinkPlayerPartyMon6
 wLinkPlayerPartyMonOTNames:: ds PARTY_LENGTH * NAME_LENGTH
 wLinkPlayerPartyMonNicks:: ds PARTY_LENGTH * PKMN_NAME_LENGTH
+wLinkPlayerDataEnd::
+	ds $35d
 
-	ds $357
-
 wLinkDataEnd::
 	ds wLinkData - @
 
@@ -1342,9 +1341,10 @@
 wcb6d:: ds 1
 wcb6e:: ds 22
 wcb84:: ds 100
-wcbe8:: ds 1
-wcbe9:: ds 1
-wcbea:: ds 14
+wcbe8:: dw
+wLinkOTPartyMonTypes::
+	ds 2 * PARTY_LENGTH
+	ds 2
 
 wcbf8:: ds 2
 wcbfa:: ds 1
@@ -1625,7 +1625,7 @@
 w2DMenuNumCols:: ds 1
 w2DMenuFlags1:: ds 1
 w2DMenuFlags2:: ds 1
-w2DMenuFlags3:: ds 1
+w2DMenuCursorOffsets:: ds 1
 wMenuJoypadFilter:: ds 1
 wMenuData3End::
 
@@ -1632,7 +1632,7 @@
 wMenuCursorY:: ds 1
 wMenuCursorX:: ds 1
 wCursorOffCharacter:: ds 1
-wCursorCurrentTile:: ds 2
+wCursorCurrentTile:: ds 2 ; cfac
 	ds 3
 
 OverworldDelay:: ; cfb1