shithub: pokecrystal

Download patch

ref: acd92eee94f0c8a7e0757ce2a1f486f08a4a9ad7
parent: ecd277204a1e32e923702a57a6212579635a9b4c
author: PikalaxALT <[email protected]>
date: Sun Dec 13 09:15:16 EST 2015

Pack

--- a/audio/sfx.asm
+++ b/audio/sfx.asm
@@ -206,8 +206,8 @@
 	musicheader 1, 8, Sfx_Unknown61_Ch8
 ; f0a22
 
-Sfx_Unknown62: ; f0a22
-	musicheader 1, 8, Sfx_Unknown62_Ch8
+Sfx_SwitchPockets: ; f0a22
+	musicheader 1, 8, Sfx_SwitchPockets_Ch8
 ; f0a25
 
 Sfx_Unknown63: ; f0a25
@@ -5226,7 +5226,7 @@
 	endchannel
 ; f258c
 
-Sfx_Unknown62_Ch8: ; f258c
+Sfx_SwitchPockets_Ch8: ; f258c
 	noise __,  5, $c1, $42
 	endchannel
 ; f2590
--- a/audio/sfx_pointers.asm
+++ b/audio/sfx_pointers.asm
@@ -97,7 +97,7 @@
 	dba Sfx_Unknown5F
 	dba Sfx_Unknown60
 	dba Sfx_Unknown61
-	dba Sfx_Unknown62
+	dba Sfx_SwitchPockets
 	dba Sfx_Unknown63
 	dba Sfx_Burn
 	dba Sfx_TitleScreenEntrance
--- /dev/null
+++ b/battle/ai/redundant.asm
@@ -1,0 +1,198 @@
+AI_Redundant: ; 2c41a
+; Check if move effect c will fail because it's already been used.
+; Return z if the move is a good choice.
+; Return nz if the move is a bad choice.
+	ld a, c
+	ld de, 3
+	ld hl, .Moves
+	call IsInArray
+	jp nc, .NotRedundant
+	inc hl
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+
+.Moves: ; 2c42c
+	dbw EFFECT_DREAM_EATER,  .DreamEater
+	dbw EFFECT_HEAL,         .Heal
+	dbw EFFECT_LIGHT_SCREEN, .LightScreen
+	dbw EFFECT_MIST,         .Mist
+	dbw EFFECT_FOCUS_ENERGY, .FocusEnergy
+	dbw EFFECT_CONFUSE,      .Confuse
+	dbw EFFECT_TRANSFORM,    .Transform
+	dbw EFFECT_REFLECT,      .Reflect
+	dbw EFFECT_SUBSTITUTE,   .Substitute
+	dbw EFFECT_LEECH_SEED,   .LeechSeed
+	dbw EFFECT_DISABLE,      .Disable
+	dbw EFFECT_ENCORE,       .Encore
+	dbw EFFECT_SNORE,        .Snore
+	dbw EFFECT_SLEEP_TALK,   .SleepTalk
+	dbw EFFECT_MEAN_LOOK,    .MeanLook
+	dbw EFFECT_NIGHTMARE,    .Nightmare
+	dbw EFFECT_SPIKES,       .Spikes
+	dbw EFFECT_FORESIGHT,    .Foresight
+	dbw EFFECT_PERISH_SONG,  .PerishSong
+	dbw EFFECT_SANDSTORM,    .Sandstorm
+	dbw EFFECT_ATTRACT,      .Attract
+	dbw EFFECT_SAFEGUARD,    .Safeguard
+	dbw EFFECT_RAIN_DANCE,   .RainDance
+	dbw EFFECT_SUNNY_DAY,    .SunnyDay
+	dbw EFFECT_TELEPORT,     .Teleport
+	dbw EFFECT_MORNING_SUN,  .MorningSun
+	dbw EFFECT_SYNTHESIS,    .Synthesis
+	dbw EFFECT_MOONLIGHT,    .Moonlight
+	dbw EFFECT_SWAGGER,      .Swagger
+	dbw EFFECT_FUTURE_SIGHT, .FutureSight
+	db -1
+
+.LightScreen: ; 2c487
+	ld a, [EnemyScreens]
+	bit SCREENS_LIGHT_SCREEN, a
+	ret
+
+.Mist: ; 2c48d
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_MIST, a
+	ret
+
+.FocusEnergy: ; 2c493
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_FOCUS_ENERGY, a
+	ret
+
+.Confuse: ; 2c499
+	ld a, [PlayerSubStatus3]
+	bit SUBSTATUS_CONFUSED, a
+	ret nz
+	ld a, [PlayerScreens]
+	bit SCREENS_SAFEGUARD, a
+	ret
+
+.Transform: ; 2c4a5
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	ret
+
+.Reflect: ; 2c4ab
+	ld a, [EnemyScreens]
+	bit SCREENS_REFLECT, a
+	ret
+
+.Substitute: ; 2c4b1
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_SUBSTITUTE, a
+	ret
+
+.LeechSeed: ; 2c4b7
+	ld a, [PlayerSubStatus4]
+	bit SUBSTATUS_LEECH_SEED, a
+	ret
+
+.Disable: ; 2c4bd
+	ld a, [PlayerDisableCount]
+	and a
+	ret
+
+.Encore: ; 2c4c2
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_ENCORED, a
+	ret
+
+.Snore:
+.SleepTalk: ; 2c4c8
+	ld a, [EnemyMonStatus]
+	and SLP
+	jr z, .Redundant
+	jr .NotRedundant
+
+.MeanLook: ; 2c4d1
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_CANT_RUN, a
+	ret
+
+.Nightmare: ; 2c4d7
+	ld a, [BattleMonStatus]
+	and a
+	jr z, .Redundant
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_NIGHTMARE, a
+	ret
+
+.Spikes: ; 2c4e3
+	ld a, [PlayerScreens]
+	bit SCREENS_SPIKES, a
+	ret
+
+.Foresight: ; 2c4e9
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_IDENTIFIED, a
+	ret
+
+.PerishSong: ; 2c4ef
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_PERISH, a
+	ret
+
+.Sandstorm: ; 2c4f5
+	ld a, [Weather]
+	cp WEATHER_SANDSTORM
+	jr z, .Redundant
+	jr .NotRedundant
+
+.Attract: ; 2c4fe
+	callba CheckOppositeGender
+	jr c, .Redundant
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_IN_LOVE, a
+	ret
+
+.Safeguard: ; 2c50c
+	ld a, [EnemyScreens]
+	bit SCREENS_SAFEGUARD, a
+	ret
+
+.RainDance: ; 2c512
+	ld a, [Weather]
+	cp WEATHER_RAIN
+	jr z, .Redundant
+	jr .NotRedundant
+
+.SunnyDay: ; 2c51b
+	ld a, [Weather]
+	cp WEATHER_SUN
+	jr z, .Redundant
+	jr .NotRedundant
+
+.DreamEater: ; 2c524
+	ld a, [BattleMonStatus]
+	and SLP
+	jr z, .Redundant
+	jr .NotRedundant
+
+.Swagger: ; 2c52d
+	ld a, [PlayerSubStatus3]
+	bit SUBSTATUS_CONFUSED, a
+	ret
+
+.FutureSight: ; 2c533
+	ld a, [EnemyScreens]
+	bit 5, a
+	ret
+
+.Heal:
+.MorningSun:
+.Synthesis:
+.Moonlight: ; 2c539
+	callba AICheckEnemyMaxHP
+	jr nc, .NotRedundant
+
+.Teleport:
+.Redundant: ; 2c541
+	ld a, 1
+	and a
+	ret
+
+.NotRedundant: ; 2c545
+	xor a
+	ret
--- a/battle/core.asm
+++ b/battle/core.asm
@@ -2412,7 +2412,7 @@
 	ld e, HP_BAR_LENGTH_PX
 	call UpdateHPPal
 	call WaitBGMap
-	callba Function2c012
+	callba EnemySwitch_TrainerHud
 	ld a, [wLinkMode]
 	and a
 	jr z, .not_linked
@@ -4853,7 +4853,7 @@
 	lb bc, 5, 11
 	call ClearBox
 
-	callba DrawPlayerExpBar
+	callba DrawPlayerHUDBorder
 
 	hlcoord 18, 9
 	ld [hl], $73 ; vertical bar
@@ -4995,7 +4995,7 @@
 	lb bc, 4, 11
 	call ClearBox
 
-	callba Function2c0c5
+	callba DrawEnemyHUDBorder
 
 	ld a, [TempEnemyMonSpecies]
 	ld [CurSpecies], a
@@ -9610,7 +9610,7 @@
 	ld d, $0
 	ld e, ANIM_MON_NORMAL
 	predef AnimateFrontpic
-	jr .skip_cry
+	jr .skip_cry ; cry is played during the animation
 
 .cry_no_anim
 	ld a, $0f
@@ -9623,7 +9623,7 @@
 	cp BATTLETYPE_FISH
 	jr nz, .NotFishing
 
-	callba MobileFn_106086
+	callba MobileFn_106086 ; update fishing records?
 
 	ld hl, HookedPokemonAttackedText
 	jr .PlaceBattleStartText
@@ -9639,7 +9639,7 @@
 
 .PlaceBattleStartText
 	push hl
-	callba Function2c000
+	callba BattleStart_TrainerHuds
 	pop hl
 	call StdBattleTextBox
 
--- a/battle/sliding_intro.asm
+++ b/battle/sliding_intro.asm
@@ -62,7 +62,7 @@
 ; 4e9d6
 
 .subfunction3: ; 4e9d6
-	ld hl, Sprites + 1
+	ld hl, Sprites + 1 ; x pixel
 	ld c, $12 ; 18
 	ld de, $4
 .loop3
--- /dev/null
+++ b/battle/trainer_huds.asm
@@ -1,0 +1,275 @@
+wPlaceBallsDirection EQU $d003
+wTrainerHUDTiles     EQU $d004
+wPlaceBallsX         EQU $cfc4
+wPlaceBallsY         EQU $cfc5
+GLOBAL wPlaceBallsDirection, wTrainerHUDTiles, wPlaceBallsX, wPlaceBallsY
+
+BattleStart_TrainerHuds: ; 2c000
+	ld a, $e4
+	ld [rOBP0], a
+	call LoadBallIconGFX
+	call ShowPlayerMonsRemaining
+	ld a, [wBattleMode]
+	dec a
+	ret z
+	jp ShowOTTrainerMonsRemaining
+; 2c012
+
+EnemySwitch_TrainerHud: ; 2c012
+	ld a, $e4
+	ld [rOBP0], a
+	call LoadBallIconGFX
+	jp ShowOTTrainerMonsRemaining
+; 2c01c
+
+ShowPlayerMonsRemaining: ; 2c01c
+	call DrawPlayerPartyIconHUDBorder
+	ld hl, PartyMon1HP
+	ld de, PartyCount
+	call StageBallTilesData
+	; ldpixel wPlaceBallsX, 12, 12
+	ld a, 12 * 8
+	ld hl, wPlaceBallsX
+	ld [hli], a
+	ld [hl], a
+	ld a, 8
+	ld [wPlaceBallsDirection], a
+	ld hl, Sprites
+	jp LoadTrainerHudOAM
+; 2c03a
+
+ShowOTTrainerMonsRemaining: ; 2c03a
+	call DrawEnemyHUDBorder
+	ld hl, OTPartyMon1HP
+	ld de, OTPartyCount
+	call StageBallTilesData
+	; ldpixel wPlaceBallsX, 9, 4
+	ld hl, wPlaceBallsX
+	ld a, 9 * 8
+	ld [hli], a
+	ld [hl], 4 * 8
+	ld a, -8
+	ld [wPlaceBallsDirection], a
+	ld hl, Sprites + PARTY_LENGTH * 4
+	jp LoadTrainerHudOAM
+; 2c059
+
+StageBallTilesData: ; 2c059
+	ld a, [de]
+	push af
+	ld de, Buffer1
+	ld c, PARTY_LENGTH
+	ld a, $34 ; empty slot
+.loop1
+	ld [de], a
+	inc de
+	dec c
+	jr nz, .loop1
+	pop af
+	ld de, Buffer1
+.loop2
+	push af
+	call .GetHUDTile
+	inc de
+	pop af
+	dec a
+	jr nz, .loop2
+	ret
+; 2c075
+
+.GetHUDTile: ; 2c075
+	ld a, [hli]
+	and a
+	jr nz, .got_hp
+	ld a, [hl]
+	and a
+	ld b, $33 ; fainted
+	jr z, .fainted
+
+.got_hp
+rept 3
+	dec hl
+endr
+	ld a, [hl]
+	and a
+	ld b, $32 ; statused
+	jr nz, .load
+	dec b ; normal
+	jr .load
+
+.fainted
+rept 3
+	dec hl
+endr
+
+.load
+	ld a, b
+	ld [de], a
+	ld bc, PARTYMON_STRUCT_LENGTH + MON_HP - MON_STATUS
+	add hl, bc
+	ret
+; 2c095
+
+DrawPlayerHUDBorder: ; 2c095
+	ld hl, .tiles
+	ld de, wTrainerHUDTiles
+	ld bc, 4
+	call CopyBytes
+	hlcoord 18, 10
+	ld de, -1 ; start on right
+	jr PlaceHUDBorderTiles
+
+.tiles
+	db $73 ; right side
+	db $77 ; bottom right
+	db $6f ; bottom left
+	db $76 ; bottom side
+; 2c0ad
+
+DrawPlayerPartyIconHUDBorder: ; 2c0ad
+	ld hl, .tiles
+	ld de, wTrainerHUDTiles
+	ld bc, 4
+	call CopyBytes
+	hlcoord 18, 10
+	ld de, -1 ; start on right
+	jr PlaceHUDBorderTiles
+
+.tiles
+	db $73 ; right side
+	db $5c ; bottom right
+	db $6f ; bottom left
+	db $76 ; bottom side
+; 2c0c5
+
+DrawEnemyHUDBorder: ; 2c0c5
+	ld hl, .tiles
+	ld de, wTrainerHUDTiles
+	ld bc, 4
+	call CopyBytes
+	hlcoord 1, 2
+	ld de, 1 ; start on left
+	call PlaceHUDBorderTiles
+	ld a, [wBattleMode]
+	dec a
+	ret nz
+	ld a, [TempEnemyMonSpecies]
+	dec a
+	call CheckCaughtMon
+	ret z
+	hlcoord 1, 1
+	ld [hl], $5d
+	ret
+
+.tiles
+	db $6d ; left side
+	db $74 ; bottom left
+	db $78 ; bottom right
+	db $76 ; bottom side
+; 2c0f1
+
+PlaceHUDBorderTiles: ; 2c0f1
+	ld a, [wTrainerHUDTiles]
+	ld [hl], a
+	ld bc, SCREEN_WIDTH
+	add hl, bc
+	ld a, [StartFlypoint]
+	ld [hl], a
+	ld b, $8
+.loop
+	add hl, de
+	ld a, [MovementBuffer]
+	ld [hl], a
+	dec b
+	jr nz, .loop
+	add hl, de
+	ld a, [EndFlypoint]
+	ld [hl], a
+	ret
+; 2c10d
+
+LinkBattle_TrainerHuds: ; 2c10d
+	call LoadBallIconGFX
+	ld hl, PartyMon1HP
+	ld de, PartyCount
+	call StageBallTilesData
+	ld hl, wPlaceBallsX
+	ld a, 10 * 8
+	ld [hli], a
+	ld [hl], 8 * 8
+	ld a, $8
+	ld [wPlaceBallsDirection], a
+	ld hl, Sprites
+	call LoadTrainerHudOAM
+
+	ld hl, OTPartyMon1HP
+	ld de, OTPartyCount
+	call StageBallTilesData
+	ld hl, wPlaceBallsX
+	ld a, 10 * 8
+	ld [hli], a
+	ld [hl], 13 * 8
+	ld hl, Sprites + PARTY_LENGTH * 4
+	jp LoadTrainerHudOAM
+; 2c143
+
+LoadTrainerHudOAM: ; 2c143
+	ld de, Buffer1
+	ld c, PARTY_LENGTH
+.loop
+	ld a, [wPlaceBallsY]
+	ld [hli], a
+	ld a, [wPlaceBallsX]
+	ld [hli], a
+	ld a, [de]
+	ld [hli], a
+	ld a, $3
+	ld [hli], a
+	ld a, [wPlaceBallsX]
+	ld b, a
+	ld a, [wPlaceBallsDirection]
+	add b
+	ld [wPlaceBallsX], a
+	inc de
+	dec c
+	jr nz, .loop
+	ret
+; 2c165
+
+LoadBallIconGFX: ; 2c165
+	ld de, .gfx
+	ld hl, VTiles0 tile $31
+	lb bc, BANK(LoadBallIconGFX), 4
+	call Get2bpp_2
+	ret
+; 2c172
+
+.gfx: ; 2c172
+INCBIN "gfx/battle/balls.2bpp"
+; 2c1b2
+
+_ShowLinkBattleParticipants: ; 2c1b2
+	call ClearBGPalettes
+	call LoadFontsExtra
+	hlcoord 2, 3
+	ld b, 9
+	ld c, 14
+	call TextBox
+	hlcoord 4, 5
+	ld de, PlayerName
+	call PlaceString
+	hlcoord 4, 10
+	ld de, OTPlayerName
+	call PlaceString
+	hlcoord 9, 8
+	ld a, $69 ; "V"
+	ld [hli], a
+	ld [hl], $6a ; "S"
+	callba LinkBattle_TrainerHuds ; no need to callba
+	ld b, SCGB_08
+	call GetSGBLayout
+	call SetPalettes
+	ld a, $e4
+	ld [rOBP0], a
+	ret
+; 2c1ef
--- a/constants/sfx_constants.asm
+++ b/constants/sfx_constants.asm
@@ -98,7 +98,7 @@
 	const SFX_UNKNOWN_5F
 	const SFX_UNKNOWN_60
 	const SFX_UNKNOWN_61
-	const SFX_UNKNOWN_62
+	const SFX_SWITCH_POCKETS
 	const SFX_UNKNOWN_63
 	const SFX_BURN
 	const SFX_TITLE_SCREEN_ENTRANCE
--- a/engine/main_menu.asm
+++ b/engine/main_menu.asm
@@ -41,7 +41,7 @@
 	db $80 ; flags
 	db 0 ; items
 	dw MainMenuItems
-	dw Function1f79
+	dw PlaceMenuStrings
 	dw MainMenuText
 ; 49d20
 
--- a/engine/mart.asm
+++ b/engine/mart.asm
@@ -809,9 +809,9 @@
 
 SellMenu: ; 15eb3
 	call DisableSpriteUpdates
-	callba Function106a5
+	callba DepositSellInitPackBuffers
 .asm_15ebc
-	callba Function106be
+	callba DepositSellPack
 	ld a, [wcf66]
 	and a
 	jp z, Function15ece
--- a/engine/pack.asm
+++ b/engine/pack.asm
@@ -1,19 +1,21 @@
+wCurrPocket EQU $cf65
 
+
 Pack: ; 10000
 	ld hl, Options
 	set NO_TEXT_SCROLL, [hl]
-	call Function1068a
+	call InitPackBuffers
 .loop
 	call JoyTextDelay
 	ld a, [wJumptableIndex]
 	bit 7, a
 	jr nz, .done
-	call Function10026
+	call .RunJumptable
 	call DelayFrame
 	jr .loop
 
 .done
-	ld a, [wcf65]
+	ld a, [wCurrPocket]
 	ld [wLastPocket], a
 	ld hl, Options
 	res NO_TEXT_SCROLL, [hl]
@@ -20,48 +22,48 @@
 	ret
 ; 10026
 
-Function10026: ; 10026
+.RunJumptable: ; 10026
 	ld a, [wJumptableIndex]
-	ld hl, Jumptable_10030
-	call Function1086b
+	ld hl, .Jumptable
+	call Pack_GetJumptablePointer
 	jp [hl]
+
 ; 10030
 
+.Jumptable: ; 10030 (4:4030)
+	jumptable_start
+	jumptable .InitGFX            ;  0
+	jumptable .InitItemsPocket    ;  1
+	jumptable .ItemsPocketMenu    ;  2
+	jumptable .InitBallsPocket    ;  3
+	jumptable .BallsPocketMenu    ;  4
+	jumptable .InitKeyItemsPocket ;  5
+	jumptable .KeyItemsPocketMenu ;  6
+	jumptable .InitTMHMPocket     ;  7
+	jumptable .TMHMPocketMenu     ;  8
+	jumptable Pack_QuitNoScript   ;  9
+	jumptable Pack_QuitRunScript  ; 10
 
-Jumptable_10030: ; 10030 (4:4030)
-	dw Function10046
-	dw Function10056
-	dw Function10067
-	dw Function10186
-	dw Function10198
-	dw Function10094
-	dw Function100a6
-	dw Function100d3
-	dw Function100e8
-	dw Function10874
-	dw Function1087e
-
-
-Function10046: ; 10046 (4:4046)
+.InitGFX: ; 10046 (4:4046)
 	xor a
 	ld [hBGMapMode], a
-	call Function10955
+	call Pack_InitGFX
 	ld a, [wcf64]
 	ld [wJumptableIndex], a
-	call Function10a40
+	call Pack_InitColors
 	ret
 
-Function10056: ; 10056 (4:4056)
+.InitItemsPocket: ; 10056 (4:4056)
 	xor a
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	call WaitBGMap_DrawPackGFX
-	call Function10866
+	call Pack_JumptableNext
 	ret
 
-Function10067: ; 10067 (4:4067)
-	ld hl, MenuDataHeader_0x10a4f
+.ItemsPocketMenu: ; 10067 (4:4067)
+	ld hl, ItemsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wItemsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -74,22 +76,22 @@
 	ld [wItemsPocketCursor], a
 	ld b, $7
 	ld c, $3
-	call Function108d4
+	call Pack_InterpretJoypad
 	ret c
-	call Function101c5
+	call .ItemBallsKey_LoadSubmenu
 	ret
 
-Function10094: ; 10094 (4:4094)
+.InitKeyItemsPocket: ; 10094 (4:4094)
 	ld a, $2
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	call WaitBGMap_DrawPackGFX
-	call Function10866
+	call Pack_JumptableNext
 	ret
 
-Function100a6: ; 100a6 (4:40a6)
-	ld hl, MenuDataHeader_0x10a7f
+.KeyItemsPocketMenu: ; 100a6 (4:40a6)
+	ld hl, KeyItemsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wKeyItemsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -102,39 +104,40 @@
 	ld [wKeyItemsPocketCursor], a
 	ld b, $3
 	ld c, $7
-	call Function108d4
+	call Pack_InterpretJoypad
 	ret c
-	call Function101c5
+	call .ItemBallsKey_LoadSubmenu
 	ret
 
-Function100d3: ; 100d3 (4:40d3)
+.InitTMHMPocket: ; 100d3 (4:40d3)
 	ld a, $3
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	xor a
 	ld [hBGMapMode], a
 	call WaitBGMap_DrawPackGFX
-	call Function10866
+	call Pack_JumptableNext
 	ret
 
-Function100e8: ; 100e8 (4:40e8)
-	callba Function2c76f
+.TMHMPocketMenu: ; 100e8 (4:40e8)
+	callba TMHMPocket
 	ld b, $5
 	ld c, $1
-	call Function108d4
+	call Pack_InterpretJoypad
 	ret c
 	callba _CheckTossableItem
 	ld a, [wItemAttributeParamBuffer]
 	and a
-	jr nz, .asm_1010a
-	ld hl, MenuDataHeader_0x1013b
-	ld de, Jumptable_10153
-	jr .asm_10110
-.asm_1010a
-	ld hl, MenuDataHeader_0x10124
-	ld de, Jumptable_10137
-.asm_10110
+	jr nz, .use_quit
+	ld hl, .MenuDataHeader2
+	ld de, .Jumptable2
+	jr .load_jump
+
+.use_quit
+	ld hl, .MenuDataHeader1
+	ld de, .Jumptable1
+.load_jump
 	push de
 	call LoadMenuDataHeader
 	call InterpretMenu2
@@ -143,19 +146,19 @@
 	ret c
 	ld a, [MenuSelection2]
 	dec a
-	call Function1086b
+	call Pack_GetJumptablePointer
 	jp [hl]
-; 10124 (4:4124)
 
-MenuDataHeader_0x10124: ; 0x10124
+; 10124 (4:4124)
+.MenuDataHeader1: ; 0x10124
 	db $40 ; flags
 	db 07, 13 ; start coords
 	db 11, 19 ; end coords
-	dw MenuData2_0x1012c
+	dw .MenuData2_1
 	db 1 ; default option
 ; 0x1012c
 
-MenuData2_0x1012c: ; 0x1012c
+.MenuData2_1: ; 0x1012c
 	db $c0 ; flags
 	db 2 ; items
 	db "USE@"
@@ -162,20 +165,22 @@
 	db "QUIT@"
 ; 0x10137
 
-Jumptable_10137: ; 10137
-	dw Function10159
-	dw QuitItemSubmenu
+.Jumptable1: ; 10137
+	jumptable_start
+	jumptable .UseItem
+	jumptable QuitItemSubmenu
+
 ; 1013b
 
-MenuDataHeader_0x1013b: ; 0x1013b
+.MenuDataHeader2: ; 0x1013b
 	db $40 ; flags
 	db 05, 13 ; start coords
 	db 11, 19 ; end coords
-	dw MenuData2_0x10143
+	dw .MenuData2_2
 	db 1 ; default option
 ; 0x10143
 
-MenuData2_0x10143: ; 0x10143
+.MenuData2_2: ; 0x10143
 	db $c0 ; flags
 	db 3 ; items
 	db "USE@"
@@ -183,43 +188,43 @@
 	db "QUIT@"
 ; 0x10153
 
-Jumptable_10153: ; 10153
-	dw Function10159
+.Jumptable2: ; 10153
+	dw .UseItem
 	dw GiveItem
 	dw QuitItemSubmenu
 ; 10159
 
-Function10159: ; 10159
-	callba Function2c7bf
+.UseItem: ; 10159
+	callba AskTeachTMHM
 	ret c
-	callba Function2c7fb
-	jr c, .asm_10179
+	callba ChooseMonToLearnTMHM
+	jr c, .declined
 	ld hl, Options
 	ld a, [hl]
 	push af
-	res 4, [hl]
-	callba Function2c867
+	res NO_TEXT_SCROLL, [hl]
+	callba TeachTMHM
 	pop af
 	ld [Options], a
-.asm_10179
+.declined
 	xor a
 	ld [hBGMapMode], a
-	call Function10955
+	call Pack_InitGFX
 	call WaitBGMap_DrawPackGFX
-	call Function10a40
+	call Pack_InitColors
 	ret
 
-Function10186: ; 10186 (4:4186)
+.InitBallsPocket: ; 10186 (4:4186)
 	ld a, $1
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	call WaitBGMap_DrawPackGFX
-	call Function10866
+	call Pack_JumptableNext
 	ret
 
-Function10198: ; 10198 (4:4198)
-	ld hl, MenuDataHeader_0x10aaf
+.BallsPocketMenu: ; 10198 (4:4198)
+	ld hl, BallsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wBallsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -232,12 +237,12 @@
 	ld [wBallsPocketCursor], a
 	ld b, $1
 	ld c, $5
-	call Function108d4
+	call Pack_InterpretJoypad
 	ret c
-	call Function101c5
+	call .ItemBallsKey_LoadSubmenu
 	ret
 
-Function101c5: ; 101c5 (4:41c5)
+.ItemBallsKey_LoadSubmenu: ; 101c5 (4:41c5)
 	callba _CheckTossableItem
 	ld a, [wItemAttributeParamBuffer]
 	and a
@@ -268,32 +273,32 @@
 
 .usable
 	ld hl, MenuDataHeader_UsableKeyItem
-	ld de, Jumptable_1026a
+	ld de, Jumptable_UseGiveTossRegisterQuit
 	jr .build_menu
 
 .selectable_usable
 	ld hl, MenuDataHeader_UsableItem
-	ld de, Jumptable_10291
+	ld de, Jumptable_UseGiveTossQuit
 	jr .build_menu
 
 .tossable_selectable
 	ld hl, MenuDataHeader_UnusableItem
-	ld de, Jumptable_102ac
+	ld de, Jumptable_UseQuit
 	jr .build_menu
 
 .tossable_unselectable
 	ld hl, MenuDataHeader_UnusableKeyItem
-	ld de, Jumptable_102c7
+	ld de, Jumptable_UseRegisterQuit
 	jr .build_menu
 
 .unusable
 	ld hl, MenuDataHeader_HoldableKeyItem
-	ld de, Jumptable_102ea
+	ld de, Jumptable_GiveTossRegisterQuit
 	jr .build_menu
 
 .selectable_unusable
 	ld hl, MenuDataHeader_HoldableItem
-	ld de, Jumptable_1030b
+	ld de, Jumptable_GiveTossQuit
 .build_menu
 	push de
 	call LoadMenuDataHeader
@@ -303,10 +308,10 @@
 	ret c
 	ld a, [MenuSelection2]
 	dec a
-	call Function1086b
+	call Pack_GetJumptablePointer
 	jp [hl]
-; 10249 (4:4249)
 
+; 10249 (4:4249)
 MenuDataHeader_UsableKeyItem: ; 0x10249
 	db $40 ; flags
 	db 01, 13 ; start coords
@@ -325,12 +330,13 @@
 	db "QUIT@"
 ; 0x1026a
 
-Jumptable_1026a: ; 1026a
-	dw UseItem
-	dw GiveItem
-	dw TossMenu
-	dw RegisterItem
-	dw QuitItemSubmenu
+Jumptable_UseGiveTossRegisterQuit: ; 1026a
+	jumptable_start
+	jumptable UseItem
+	jumptable GiveItem
+	jumptable TossMenu
+	jumptable RegisterItem
+	jumptable QuitItemSubmenu
 ; 10274
 
 MenuDataHeader_UsableItem: ; 0x10274
@@ -350,11 +356,12 @@
 	db "QUIT@"
 ; 0x10291
 
-Jumptable_10291: ; 10291
-	dw UseItem
-	dw GiveItem
-	dw TossMenu
-	dw QuitItemSubmenu
+Jumptable_UseGiveTossQuit: ; 10291
+	jumptable_start
+	jumptable UseItem
+	jumptable GiveItem
+	jumptable TossMenu
+	jumptable QuitItemSubmenu
 ; 10299
 
 MenuDataHeader_UnusableItem: ; 0x10299
@@ -372,9 +379,10 @@
 	db "QUIT@"
 ; 0x102ac
 
-Jumptable_102ac: ; 102ac
-	dw UseItem
-	dw QuitItemSubmenu
+Jumptable_UseQuit: ; 102ac
+	jumptable_start
+	jumptable UseItem
+	jumptable QuitItemSubmenu
 ; 102b0
 
 MenuDataHeader_UnusableKeyItem: ; 0x102b0
@@ -393,10 +401,11 @@
 	db "QUIT@"
 ; 0x102c7
 
-Jumptable_102c7: ; 102c7
-	dw UseItem
-	dw RegisterItem
-	dw QuitItemSubmenu
+Jumptable_UseRegisterQuit: ; 102c7
+	jumptable_start
+	jumptable UseItem
+	jumptable RegisterItem
+	jumptable QuitItemSubmenu
 ; 102cd
 
 MenuDataHeader_HoldableKeyItem: ; 0x102cd
@@ -416,11 +425,12 @@
 	db "QUIT@"
 ; 0x102ea
 
-Jumptable_102ea: ; 102ea
-	dw GiveItem
-	dw TossMenu
-	dw RegisterItem
-	dw QuitItemSubmenu
+Jumptable_GiveTossRegisterQuit: ; 102ea
+	jumptable_start
+	jumptable GiveItem
+	jumptable TossMenu
+	jumptable RegisterItem
+	jumptable QuitItemSubmenu
 ; 102f2
 
 MenuDataHeader_HoldableItem: ; 0x102f2
@@ -439,10 +449,12 @@
 	db "QUIT@"
 ; 0x1030b
 
-Jumptable_1030b: ; 1030b
-	dw GiveItem
-	dw TossMenu
-	dw QuitItemSubmenu
+Jumptable_GiveTossQuit: ; 1030b
+	jumptable_start
+	jumptable GiveItem
+	jumptable TossMenu
+	jumptable QuitItemSubmenu
+
 ; 10311
 
 UseItem: ; 10311
@@ -454,18 +466,19 @@
 ; 1031f
 
 .jumptable: ; 1031f (4:431f)
-	dw .Oak
-	dw .Oak
-	dw .Oak
-	dw .Oak
-	dw .Current
-	dw .Party
-	dw .Field
+	jumptable_start
+	jumptable .Oak
+	jumptable .Oak
+	jumptable .Oak
+	jumptable .Oak
+	jumptable .Current
+	jumptable .Party
+	jumptable .Field
 ; 1035c
 
 .Oak: ; 1032d (4:432d)
 	ld hl, Text_ThisIsntTheTime
-	call Function10889
+	call Pack_PrintTextNoScroll
 	ret
 
 .Current: ; 10334 (4:4334)
@@ -479,18 +492,19 @@
 	call DoItemEffect
 	xor a
 	ld [hBGMapMode], a
-	call Function10955
+	call Pack_InitGFX
 	call WaitBGMap_DrawPackGFX
-	call Function10a40
+	call Pack_InitColors
 	ret
+
 .NoPokemon
 	ld hl, TextJump_YouDontHaveAPkmn
-	call Function10889
+	call Pack_PrintTextNoScroll
 	ret
 
 .Field: ; 10355 (4:4355)
 	call DoItemEffect
-	ld a, [wd0ec]
+	ld a, [wItemEffectSucceeded]
 	and a
 	jr z, .Oak
 	ld a, $a
@@ -497,10 +511,9 @@
 	ld [wJumptableIndex], a
 	ret
 ; 10364 (4:4364)
-
 TossMenu: ; 10364
 	ld hl, Text_ThrowAwayHowMany
-	call Function10889
+	call Pack_PrintTextNoScroll
 	callba Function24fbf
 	push af
 	call ExitMenu
@@ -519,35 +532,35 @@
 	call TossItem
 	call Pack_GetItemName
 	ld hl, Text_ThrewAway
-	call Function10889
-
+	call Pack_PrintTextNoScroll
 .finish
 	ret
 ; 1039d
 
 Function1039d: ; 1039d
-	ld a, [wcf65]
+; unreferenced
+	ld a, [wCurrPocket]
 	and a
-	jr z, .asm_103b2
+	jr z, .items
 	dec a
-	jr z, .asm_103aa
+	jr z, .balls
 	dec a
-	jr z, .asm_103ba
+	jr z, .key
 	ret
 
-.asm_103aa
+.balls
 	xor a
 	ld [wBallsPocketCursor], a
 	ld [wBallsPocketScrollPosition], a
 	ret
 
-.asm_103b2
+.items
 	xor a
 	ld [wItemsPocketCursor], a
 	ld [wItemsPocketScrollPosition], a
 	ret
 
-.asm_103ba
+.key
 	xor a
 	ld [wKeyItemsPocketCursor], a
 	ld [wKeyItemsPocketScrollPosition], a
@@ -558,8 +571,8 @@
 	callba CheckSelectableItem
 	ld a, [wItemAttributeParamBuffer]
 	and a
-	jr nz, .asm_103f6
-	ld a, [wcf65]
+	jr nz, .cant_register
+	ld a, [wCurrPocket]
 	rrca
 	rrca
 	and $c0
@@ -575,12 +588,12 @@
 	ld de, SFX_FULL_HEAL
 	call WaitPlaySFX
 	ld hl, Text_RegisteredItem
-	call Function10889
+	call Pack_PrintTextNoScroll
 	ret
 
-.asm_103f6
+.cant_register
 	ld hl, Text_CantRegister
-	call Function10889
+	call Pack_PrintTextNoScroll
 	ret
 ; 103fd
 
@@ -587,10 +600,10 @@
 GiveItem: ; 103fd
 	ld a, [PartyCount]
 	and a
-	jp z, Function10486
+	jp z, .NoPokemon
 	ld a, [Options]
 	push af
-	res 4, a
+	res NO_TEXT_SCROLL, a
 	ld [Options], a
 	ld a, $8
 	ld [PartyMenuActionText], a
@@ -598,7 +611,7 @@
 	callba LoadPartyMenuGFX
 	callba InitPartyMenuWithCancel
 	callba InitPartyMenuGFX
-.asm_10427
+.loop
 	callba WritePartyMenuTilemap
 	callba PrintPartyMenuText
 	call WaitBGMap
@@ -605,17 +618,15 @@
 	call SetPalettes
 	call DelayFrame
 	callba PartyMenuSelect
-	jr c, .asm_10475
-
+	jr c, .finish
 	ld a, [CurPartySpecies]
 	cp EGG
-	jr nz, .asm_10453
-
-	ld hl, TextJump_AnEGGCantHoldAnItem
+	jr nz, .give
+	ld hl, .Egg
 	call PrintText
-	jr .asm_10427
+	jr .loop
 
-.asm_10453
+.give
 	ld a, [wJumptableIndex]
 	push af
 	ld a, [wcf64]
@@ -622,31 +633,30 @@
 	push af
 	call GetCurNick
 	ld hl, StringBuffer1
-	ld de, wd050
+	ld de, wd050_MonNick
 	ld bc, PKMN_NAME_LENGTH
 	call CopyBytes
-	call Function12bd9
+	call TryGiveItemToPartymon
 	pop af
 	ld [wcf64], a
 	pop af
 	ld [wJumptableIndex], a
-.asm_10475
+.finish
 	pop af
 	ld [Options], a
 	xor a
 	ld [hBGMapMode], a
-	call Function10955
+	call Pack_InitGFX
 	call WaitBGMap_DrawPackGFX
-	call Function10a40
+	call Pack_InitColors
 	ret
 
-Function10486: ; 10486 (4:4486)
+.NoPokemon: ; 10486 (4:4486)
 	ld hl, TextJump_YouDontHaveAPkmn
-	call Function10889
+	call Pack_PrintTextNoScroll
 	ret
 ; 1048d (4:448d)
-
-TextJump_AnEGGCantHoldAnItem: ; 0x1048d
+.Egg: ; 0x1048d
 	; An EGG can't hold an item.
 	text_jump Text_AnEGGCantHoldAnItem
 	db "@"
@@ -656,70 +666,69 @@
 	ret
 ; 10493
 
-
 BattlePack: ; 10493
 	ld hl, Options
-	set 4, [hl]
-	call Function1068a
+	set NO_TEXT_SCROLL, [hl]
+	call InitPackBuffers
 .loop
 	call JoyTextDelay
 	ld a, [wJumptableIndex]
 	bit 7, a
 	jr nz, .end
-	call Function104b9
+	call .RunJumptable
 	call DelayFrame
 	jr .loop
 
 .end
-	ld a, [wcf65]
+	ld a, [wCurrPocket]
 	ld [wLastPocket], a
 	ld hl, Options
-	res 4, [hl]
+	res NO_TEXT_SCROLL, [hl]
 	ret
 ; 104b9
 
-Function104b9: ; 104b9
+.RunJumptable: ; 104b9
 	ld a, [wJumptableIndex]
-	ld hl, Jumptable_104c3
-	call Function1086b
+	ld hl, .Jumptable
+	call Pack_GetJumptablePointer
 	jp [hl]
+
 ; 104c3
 
+.Jumptable: ; 104c3 (4:44c3)
+	jumptable_start
+	jumptable .InitGFX            ;  0
+	jumptable .InitItemsPocket    ;  1
+	jumptable .ItemsPocketMenu    ;  2
+	jumptable .InitBallsPocket    ;  3
+	jumptable .BallsPocketMenu    ;  4
+	jumptable .InitKeyItemsPocket ;  5
+	jumptable .KeyItemsPocketMenu ;  6
+	jumptable .InitTMHMPocket     ;  7
+	jumptable .TMHMPocketMenu     ;  8
+	jumptable Pack_QuitNoScript   ;  9
+	jumptable Pack_QuitRunScript  ; 10
 
-Jumptable_104c3: ; 104c3 (4:44c3)
-	dw Function104d9
-	dw Function104e9
-	dw Function104fa
-	dw Function10594
-	dw Function105a6
-	dw Function10527
-	dw Function10539
-	dw Function10566
-	dw Function10581
-	dw Function10874
-	dw Function1087e
-
-
-Function104d9: ; 104d9 (4:44d9)
+.InitGFX: ; 104d9 (4:44d9)
 	xor a
 	ld [hBGMapMode], a
-	call Function10955
+	call Pack_InitGFX
 	ld a, [wcf64]
 	ld [wJumptableIndex], a
-	call Function10a40
+	call Pack_InitColors
 	ret
 
-Function104e9: ; 104e9 (4:44e9)
+.InitItemsPocket: ; 104e9 (4:44e9)
 	xor a
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	call WaitBGMap_DrawPackGFX
-	call Function10866
+	call Pack_JumptableNext
 	ret
 
-Function104fa: ; 104fa (4:44fa)
-	ld hl, MenuDataHeader_0x10a4f
+.ItemsPocketMenu: ; 104fa (4:44fa)
+	ld hl, ItemsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wItemsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -732,22 +741,22 @@
 	ld [wItemsPocketCursor], a
 	ld b, $7
 	ld c, $3
-	call Function108d4
+	call Pack_InterpretJoypad
 	ret c
-	call Function105d3
+	call ItemSubmenu
 	ret
 
-Function10527: ; 10527 (4:4527)
+.InitKeyItemsPocket: ; 10527 (4:4527)
 	ld a, $2
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	call WaitBGMap_DrawPackGFX
-	call Function10866
+	call Pack_JumptableNext
 	ret
 
-Function10539: ; 10539 (4:4539)
-	ld hl, MenuDataHeader_0x10a7f
+.KeyItemsPocketMenu: ; 10539 (4:4539)
+	ld hl, KeyItemsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wKeyItemsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -760,14 +769,14 @@
 	ld [wKeyItemsPocketCursor], a
 	ld b, $3
 	ld c, $7
-	call Function108d4
+	call Pack_InterpretJoypad
 	ret c
-	call Function105d3
+	call ItemSubmenu
 	ret
 
-Function10566: ; 10566 (4:4566)
+.InitTMHMPocket: ; 10566 (4:4566)
 	ld a, $3
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	xor a
@@ -774,31 +783,31 @@
 	ld [hBGMapMode], a
 	call WaitBGMap_DrawPackGFX
 	ld hl, Text_PackEmptyString
-	call Function10889
-	call Function10866
+	call Pack_PrintTextNoScroll
+	call Pack_JumptableNext
 	ret
 
-Function10581: ; 10581 (4:4581)
-	callba Function2c76f
+.TMHMPocketMenu: ; 10581 (4:4581)
+	callba TMHMPocket
 	ld b, $5
 	ld c, $1
-	call Function108d4
+	call Pack_InterpretJoypad
 	ret c
 	xor a
-	call Function105dc
+	call TMHMSubmenu
 	ret
 
-Function10594: ; 10594 (4:4594)
+.InitBallsPocket: ; 10594 (4:4594)
 	ld a, $1
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	call WaitBGMap_DrawPackGFX
-	call Function10866
+	call Pack_JumptableNext
 	ret
 
-Function105a6: ; 105a6 (4:45a6)
-	ld hl, MenuDataHeader_0x10aaf
+.BallsPocketMenu: ; 105a6 (4:45a6)
+	ld hl, BallsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wBallsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -811,21 +820,21 @@
 	ld [wBallsPocketCursor], a
 	ld b, $1
 	ld c, $5
-	call Function108d4
+	call Pack_InterpretJoypad
 	ret c
-	call Function105d3
+	call ItemSubmenu
 	ret
 
-Function105d3: ; 105d3 (4:45d3)
+ItemSubmenu: ; 105d3 (4:45d3)
 	callba CheckItemContext
 	ld a, [wItemAttributeParamBuffer]
-
-Function105dc: ; 105dc (4:45dc)
+TMHMSubmenu: ; 105dc (4:45dc)
 	and a
 	jr z, .NoUse
 	ld hl, .UsableMenuDataHeader
 	ld de, .UsableJumptable
 	jr .proceed
+
 .NoUse
 	ld hl, .UnusableMenuDataHeader
 	ld de, .UnusableJumptable
@@ -838,10 +847,10 @@
 	ret c
 	ld a, [MenuSelection2]
 	dec a
-	call Function1086b
+	call Pack_GetJumptablePointer
 	jp [hl]
-; 10601 (4:4601)
 
+; 10601 (4:4601)
 .UsableMenuDataHeader: ; 0x10601
 	db $40 ; flags
 	db 07, 13 ; start coords
@@ -858,8 +867,9 @@
 ; 0x10614
 
 .UsableJumptable: ; 10614
-	dw .Use
-	dw .Quit
+	jumptable_start
+	jumptable .Use
+	jumptable .Quit
 ; 10618
 
 .UnusableMenuDataHeader: ; 0x10618
@@ -877,7 +887,8 @@
 ; 0x10627
 
 .UnusableJumptable: ; 10627
-	dw .Quit
+	jumptable_start
+	jumptable .Quit
 ; 10629
 
 .Use: ; 10629
@@ -888,72 +899,70 @@
 	ret
 
 .ItemFunctionJumptable: ; 10637 (4:4637)
-	dw .Oak
-	dw .Oak
-	dw .Oak
-	dw .Oak
-	dw .Unused
-	dw .BattleField
-	dw .BattleOnly
+	jumptable_start
+	jumptable .Oak
+	jumptable .Oak
+	jumptable .Oak
+	jumptable .Oak
+	jumptable .Unused
+	jumptable .BattleField
+	jumptable .BattleOnly
 
-
 .Oak: ; 10645 (4:4645)
 	ld hl, Text_ThisIsntTheTime
-	call Function10889
+	call Pack_PrintTextNoScroll
 	ret
 
 .Unused: ; 1064c (4:464c)
 	call DoItemEffect
-	ld a, [wd0ec]
+	ld a, [wItemEffectSucceeded]
 	and a
-	jr nz, .asm_1066c
+	jr nz, .ReturnToBattle
 	ret
 
 .BattleField: ; 10656 (4:4656)
 	call DoItemEffect
-	ld a, [wd0ec]
+	ld a, [wItemEffectSucceeded]
 	and a
-	jr nz, .asm_1067e
+	jr nz, .quit_run_script
 	xor a
 	ld [hBGMapMode], a
-	call Function10955
+	call Pack_InitGFX
 	call WaitBGMap_DrawPackGFX
-	call Function10a40
+	call Pack_InitColors
 	ret
 
-.asm_1066c: ; 1066c (4:466c)
+.ReturnToBattle: ; 1066c (4:466c)
 	call ClearBGPalettes
-	jr .asm_1067e
+	jr .quit_run_script
 
 .BattleOnly: ; 10671 (4:4671)
 	call DoItemEffect
-	ld a, [wd0ec]
+	ld a, [wItemEffectSucceeded]
 	and a
 	jr z, .Oak
 	cp $2
-	jr z, .asm_10684
-.asm_1067e: ; 1067e (4:467e)
-	ld a, $a
+	jr z, .didnt_use_item
+.quit_run_script: ; 1067e (4:467e)
+	ld a, Pack_QuitRunScriptTableIndex
 	ld [wJumptableIndex], a
 	ret
 
-.asm_10684: ; 10684 (4:4684)
+.didnt_use_item: ; 10684 (4:4684)
 	xor a
-	ld [wd0ec], a
+	ld [wItemEffectSucceeded], a
 	ret
 ; 10689 (4:4689)
-
 .Quit: ; 10689
 	ret
 ; 1068a
 
-
-Function1068a: ; 1068a
+InitPackBuffers: ; 1068a
 	xor a
 	ld [wJumptableIndex], a
 	ld a, [wLastPocket]
 	and $3
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	inc a
 	add a
 	dec a
@@ -961,50 +970,49 @@
 	xor a
 	ld [wcf66], a
 	xor a
-	ld [wd0e3], a
+	ld [wSwitchItem], a
 	ret
 ; 106a5
 
-Function106a5: ; 106a5
+DepositSellInitPackBuffers: ; 106a5
 	xor a
 	ld [hBGMapMode], a
 	ld [wJumptableIndex], a
 	ld [wcf64], a
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	ld [wcf66], a
-	ld [wd0e3], a
-	call Function10955
-	call Function10a40
+	ld [wSwitchItem], a
+	call Pack_InitGFX
+	call Pack_InitColors
 	ret
 ; 106be
 
-Function106be: ; 106be
-.asm_106be
-	call Function106c7
-	call Function1076f
-	jr c, .asm_106be
+DepositSellPack: ; 106be
+.loop
+	call .RunJumptable
+	call DepositSellTutorial_InterpretJoypad
+	jr c, .loop
 	ret
 ; 106c7
 
-Function106c7: ; 106c7
+.RunJumptable: ; 106c7
 	ld a, [wJumptableIndex]
-	ld hl, Jumptable_106d1
-	call Function1086b
+	ld hl, .Jumptable
+	call Pack_GetJumptablePointer
 	jp [hl]
+
 ; 106d1
 
-
-Jumptable_106d1: ; 106d1 (4:46d1)
-	dw .ItemsPocket
-	dw .BallsPocket
-	dw .KeyItemsPocket
-	dw .TMHMPocket
-
-
+.Jumptable: ; 106d1 (4:46d1)
+	jumptable_start
+	jumptable .ItemsPocket
+	jumptable .BallsPocket
+	jumptable .KeyItemsPocket
+	jumptable .TMHMPocket
 .ItemsPocket: ; 106d9 (4:46d9)
 	xor a
 	call InitPocket
-	ld hl, MenuDataHeader_0x10a67
+	ld hl, PC_Mart_ItemsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wItemsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -1020,7 +1028,7 @@
 .KeyItemsPocket: ; 106ff (4:46ff)
 	ld a, 2
 	call InitPocket
-	ld hl, MenuDataHeader_0x10a97
+	ld hl, PC_Mart_KeyItemsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wKeyItemsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -1037,7 +1045,7 @@
 	ld a, 3
 	call InitPocket
 	call WaitBGMap_DrawPackGFX
-	callba Function2c76f
+	callba TMHMPocket
 	ld a, [CurItem]
 	ld [CurItem], a
 	ret
@@ -1045,7 +1053,7 @@
 .BallsPocket: ; 1073b (4:473b)
 	ld a, 1
 	call InitPocket
-	ld hl, MenuDataHeader_0x10ac7
+	ld hl, PC_Mart_BallsPocketMenuDataHeader
 	call CopyMenuDataHeader
 	ld a, [wBallsPocketCursor]
 	ld [wMenuCursorBuffer], a
@@ -1059,61 +1067,60 @@
 	ret
 
 InitPocket: ; 10762 (4:4762)
-	ld [wcf65], a
+	ld [wCurrPocket], a
 	call ClearPocketList
 	call DrawPocketName
 	call WaitBGMap_DrawPackGFX
 	ret
 
-
-Function1076f: ; 1076f
-	ld hl, wcf73
+DepositSellTutorial_InterpretJoypad: ; 1076f
+	ld hl, wMenuJoypad
 	ld a, [hl]
-	and $1
-	jr nz, .asm_10788
+	and A_BUTTON
+	jr nz, .a_button
 	ld a, [hl]
-	and $2
-	jr nz, .asm_1078f
+	and B_BUTTON
+	jr nz, .b_button
 	ld a, [hl]
-	and $20
-	jr nz, .asm_10795
+	and D_LEFT
+	jr nz, .d_left
 	ld a, [hl]
-	and $10
-	jr nz, .asm_107a8
+	and D_RIGHT
+	jr nz, .d_right
 	scf
 	ret
 
-.asm_10788
-	ld a, $1
+.a_button
+	ld a, TRUE
 	ld [wcf66], a
 	and a
 	ret
 
-.asm_1078f
+.b_button
 	xor a
 	ld [wcf66], a
 	and a
 	ret
 
-.asm_10795
+.d_left
 	ld a, [wJumptableIndex]
 	dec a
 	and $3
 	ld [wJumptableIndex], a
 	push de
-	ld de, SFX_UNKNOWN_62
+	ld de, SFX_SWITCH_POCKETS
 	call PlaySFX
 	pop de
 	scf
 	ret
 
-.asm_107a8
+.d_right
 	ld a, [wJumptableIndex]
 	inc a
 	and $3
 	ld [wJumptableIndex], a
 	push de
-	ld de, SFX_UNKNOWN_62
+	ld de, SFX_SWITCH_POCKETS
 	call PlaySFX
 	pop de
 	scf
@@ -1121,15 +1128,14 @@
 ; 107bb
 
 TutorialPack: ; 107bb
-	call Function106a5
+	call DepositSellInitPackBuffers
 	ld a, [InputType]
 	or a
 	jr z, .loop
 	callba _DudeAutoInput_RightA
-
 .loop
-	call Function107d7
-	call Function1076f
+	call .RunJumptable
+	call DepositSellTutorial_InterpretJoypad
 	jr c, .loop
 	xor a
 	ld [wcf66], a
@@ -1136,103 +1142,103 @@
 	ret
 ; 107d7
 
-Function107d7: ; 107d7
+.RunJumptable: ; 107d7
 	ld a, [wJumptableIndex]
 	ld hl, .jumptable
-	call Function1086b
+	call Pack_GetJumptablePointer
 	jp [hl]
+
 ; 107e1
 
-
 .jumptable: ; 107e1 (4:47e1)
-	dw Function107e9
-	dw Function1083b
-	dw Function10807
-	dw Function10826
+	jumptable_start
+	jumptable .Items
+	jumptable .Balls
+	jumptable .KeyItems
+	jumptable .TMHM
 
-
-Function107e9: ; 107e9 (4:47e9)
+.Items: ; 107e9 (4:47e9)
 	xor a
-	ld hl, MenuDataHeader_0x107ef
-	jr Function1085a
-; 107ef (4:47ef)
+	ld hl, .ItemsMenuDataHeader
+	jr .DisplayPocket
 
-MenuDataHeader_0x107ef: ; 0x107ef
+; 107ef (4:47ef)
+.ItemsMenuDataHeader: ; 0x107ef
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw .MenuData2
+	dw .ItemsMenuData2
 	db 1 ; default option
 ; 0x107f7
 
-.MenuData2: ; 0x107f7
+.ItemsMenuData2: ; 0x107f7
 	db $ae ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
-	dbw 0, OTPartyMons
+	dbw 0, wDudeNumItems
 	dba PlaceMenuItemName
 	dba PlaceMenuItemQuantity
 	dba UpdateItemDescription
 ; 10807
 
-Function10807: ; 10807 (4:4807)
+.KeyItems: ; 10807 (4:4807)
 	ld a, 2
-	ld hl, MenuDataHeader_0x1080e
-	jr Function1085a
-; 1080e (4:480e)
+	ld hl, .KeyItemsMenuDataHeader
+	jr .DisplayPocket
 
-MenuDataHeader_0x1080e: ; 0x1080e
+; 1080e (4:480e)
+.KeyItemsMenuDataHeader: ; 0x1080e
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw .MenuData2
+	dw .KeyItemsMenuData2
 	db 1 ; default option
 ; 0x10816
 
-.MenuData2: ; 0x10816
+.KeyItemsMenuData2: ; 0x10816
 	db $ae ; flags
 	db 5, 8 ; rows, columns
 	db 1 ; horizontal spacing
-	dbw 0, OTPartyMon1Exp + 2
+	dbw 0, wDudeNumKeyItems
 	dba PlaceMenuItemName
 	dba PlaceMenuItemQuantity
 	dba UpdateItemDescription
 ; 10826
 
-Function10826: ; 10826 (4:4826)
+.TMHM: ; 10826 (4:4826)
 	ld a, 3
 	call InitPocket
 	call WaitBGMap_DrawPackGFX
-	callba Function2c76f
+	callba TMHMPocket
 	ld a, [CurItem]
 	ld [CurItem], a
 	ret
 
-Function1083b: ; 1083b (4:483b)
+.Balls: ; 1083b (4:483b)
 	ld a, 1
-	ld hl, MenuDataHeader_0x10842
-	jr Function1085a
-; 10842 (4:4842)
+	ld hl, .BallsMenuDataHeader
+	jr .DisplayPocket
 
-MenuDataHeader_0x10842: ; 0x10842
+; 10842 (4:4842)
+.BallsMenuDataHeader: ; 0x10842
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw .MenuData2
+	dw .BallsMenuData2
 	db 1 ; default option
 ; 0x1084a
 
-.MenuData2: ; 0x1084a
+.BallsMenuData2: ; 0x1084a
 	db $ae ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
-	dbw 0, OTPartyMon1CaughtGender
+	dbw 0, wDudeNumBalls
 	dba PlaceMenuItemName
 	dba PlaceMenuItemQuantity
 	dba UpdateItemDescription
 ; 1085a
 
-Function1085a: ; 1085a (4:485a)
+.DisplayPocket: ; 1085a (4:485a)
 	push hl
 	call InitPocket
 	pop hl
@@ -1240,12 +1246,12 @@
 	call HandleScrollingMenu
 	ret
 
-Function10866: ; 10866 (4:4866)
+Pack_JumptableNext: ; 10866 (4:4866)
 	ld hl, wJumptableIndex
 	inc [hl]
 	ret
 
-Function1086b: ; 1086b
+Pack_GetJumptablePointer: ; 1086b
 	ld e, a
 	ld d, 0
 rept 2
@@ -1257,7 +1263,7 @@
 	ret
 ; 10874
 
-Function10874: ; 10874 (4:4874)
+Pack_QuitNoScript: ; 10874 (4:4874)
 	ld hl, wJumptableIndex
 	set 7, [hl]
 	xor a
@@ -1264,17 +1270,17 @@
 	ld [wcf66], a
 	ret
 
-Function1087e: ; 1087e (4:487e)
+Pack_QuitRunScript: ; 1087e (4:487e)
 	ld hl, wJumptableIndex
 	set 7, [hl]
-	ld a, $1
+	ld a, TRUE
 	ld [wcf66], a
 	ret
 
-Function10889: ; 10889 (4:4889)
+Pack_PrintTextNoScroll: ; 10889 (4:4889)
 	ld a, [Options]
 	push af
-	set 4, a
+	set NO_TEXT_SCROLL, a
 	ld [Options], a
 	call PrintText
 	pop af
@@ -1283,10 +1289,8 @@
 
 WaitBGMap_DrawPackGFX: ; 1089a (4:489a)
 	call WaitBGMap
-
-
 DrawPackGFX: ; 1089d
-	ld a, [wcf65]
+	ld a, [wCurrPocket]
 	and $3
 	ld e, a
 	ld d, $0
@@ -1296,7 +1300,6 @@
 	ld a, [PlayerGender]
 	bit 0, a
 	jr nz, .female
-
 .male_dude
 	ld hl, PackGFXPointers
 rept 2
@@ -1322,85 +1325,91 @@
 	dw PackGFX + $f0 * 2
 ; 108d4
 
-Function108d4: ; 108d4 (4:48d4)
-	ld hl, wcf73
-	ld a, [wd0e3]
+Pack_InterpretJoypad: ; 108d4 (4:48d4)
+	ld hl, wMenuJoypad
+	ld a, [wSwitchItem]
 	and a
-	jr nz, .asm_10931
+	jr nz, .switching_item
 	ld a, [hl]
-	and $1
-	jr nz, .asm_108f8
+	and A_BUTTON
+	jr nz, .a_button
 	ld a, [hl]
-	and $2
-	jr nz, .asm_108fa
+	and B_BUTTON
+	jr nz, .b_button
 	ld a, [hl]
-	and $20
-	jr nz, .asm_10901
+	and D_LEFT
+	jr nz, .d_left
 	ld a, [hl]
-	and $10
-	jr nz, .asm_10912
+	and D_RIGHT
+	jr nz, .d_right
 	ld a, [hl]
-	and $4
-	jr nz, .asm_10923
+	and SELECT
+	jr nz, .select
 	scf
 	ret
-.asm_108f8
+
+.a_button
 	and a
 	ret
-.asm_108fa
-	ld a, $9
+
+.b_button
+	ld a, Pack_QuitNoScriptTableIndex
 	ld [wJumptableIndex], a
 	scf
 	ret
-.asm_10901
+
+.d_left
 	ld a, b
 	ld [wJumptableIndex], a
 	ld [wcf64], a
 	push de
-	ld de, SFX_UNKNOWN_62
+	ld de, SFX_SWITCH_POCKETS
 	call PlaySFX
 	pop de
 	scf
 	ret
-.asm_10912
+
+.d_right
 	ld a, c
 	ld [wJumptableIndex], a
 	ld [wcf64], a
 	push de
-	ld de, SFX_UNKNOWN_62
+	ld de, SFX_SWITCH_POCKETS
 	call PlaySFX
 	pop de
 	scf
 	ret
-.asm_10923
-	callba Function2490c
+
+.select
+	callba SwitchItemsInBag
 	ld hl, Text_MoveItemWhere
-	call Function10889
+	call Pack_PrintTextNoScroll
 	scf
 	ret
-.asm_10931
+
+.switching_item
 	ld a, [hl]
-	and $5
-	jr nz, .asm_1093d
+	and A_BUTTON | SELECT
+	jr nz, .place_insert
 	ld a, [hl]
-	and $2
-	jr nz, .asm_1094f
+	and B_BUTTON
+	jr nz, .end_switch
 	scf
 	ret
-.asm_1093d
-	callba Function2490c
+
+.place_insert
+	callba SwitchItemsInBag
 	ld de, SFX_SWITCH_POKEMON
 	call WaitPlaySFX
 	ld de, SFX_SWITCH_POKEMON
 	call WaitPlaySFX
-.asm_1094f
+.end_switch
 	xor a
-	ld [wd0e3], a
+	ld [wSwitchItem], a
 	scf
 	ret
 
-
-Function10955: ; 10955
+Pack_InitGFX: ; 10955
 	call ClearBGPalettes
 	call ClearTileMap
 	call ClearSprites
@@ -1410,18 +1419,15 @@
 	ld bc, $60 tiles
 	ld a, BANK(PackMenuGFX)
 	call FarCopyBytes
-
 ; Background (blue if male, pink if female)
 	hlcoord 0, 1
 	ld bc, 11 * SCREEN_WIDTH
 	ld a, $24
 	call ByteFill
-
 ; This is where the items themselves will be listed.
 	hlcoord 5, 1
 	lb bc, 11, 15
 	call ClearBox
-
 ; ◀▶ POCKET       ▼▲ ITEMS
 	hlcoord 0, 0
 	ld a, $28
@@ -1431,10 +1437,8 @@
 	inc a
 	dec c
 	jr nz, .loop
-
 	call DrawPocketName
 	call PlacePackGFX
-
 ; Place the textbox for displaying the item description
 	hlcoord 0, SCREEN_HEIGHT - 4 - 2
 	lb bc, 4, SCREEN_WIDTH - 2
@@ -1463,13 +1467,11 @@
 ; 109bb
 
 DrawPocketName: ; 109bb
-	ld a, [wcf65]
-
+	ld a, [wCurrPocket]
 	; * 15
 	ld d, a
 	swap a
 	sub d
-
 	ld d, 0
 	ld e, a
 	ld hl, .tilemap
@@ -1499,15 +1501,12 @@
 	db $00, $04, $04, $04, $01 ; top border
 	db $06, $07, $08, $09, $0a ; Items
 	db $02, $05, $05, $05, $03 ; bottom border
-
 	db $00, $04, $04, $04, $01 ; top border
 	db $15, $16, $17, $18, $19 ; Balls
 	db $02, $05, $05, $05, $03 ; bottom border
-
 	db $00, $04, $04, $04, $01 ; top border
 	db $0b, $0c, $0d, $0e, $0f ; Key Items
 	db $02, $05, $05, $05, $03 ; bottom border
-
 	db $00, $04, $04, $04, $01 ; top border
 	db $10, $11, $12, $13, $14 ; TM/HM
 	db $02, $05, $05, $05, $03 ; bottom border
@@ -1536,10 +1535,9 @@
 	call ClearBox
 	ret
 
-
-Function10a40: ; 10a40
+Pack_InitColors: ; 10a40
 	call WaitBGMap
-	ld b, SCREEN_WIDTH
+	ld b, SCGB_14
 	call GetSGBLayout
 	call SetPalettes
 	call DelayFrame
@@ -1546,15 +1544,15 @@
 	ret
 ; 10a4f
 
-MenuDataHeader_0x10a4f: ; 0x10a4f
+ItemsPocketMenuDataHeader: ; 0x10a4f
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw MenuData2_0x10a57
+	dw .MenuData2
 	db 1 ; default option
 ; 0x10a57
 
-MenuData2_0x10a57: ; 0x10a57
+.MenuData2: ; 0x10a57
 	db $ae ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
@@ -1564,15 +1562,15 @@
 	dba UpdateItemDescription
 ; 10a67
 
-MenuDataHeader_0x10a67: ; 0x10a67
+PC_Mart_ItemsPocketMenuDataHeader: ; 0x10a67
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw MenuData2_0x10a6f
+	dw .MenuData2
 	db 1 ; default option
 ; 0x10a6f
 
-MenuData2_0x10a6f: ; 0x10a6f
+.MenuData2: ; 0x10a6f
 	db $2e ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
@@ -1582,15 +1580,15 @@
 	dba UpdateItemDescription
 ; 10a7f
 
-MenuDataHeader_0x10a7f: ; 0x10a7f
+KeyItemsPocketMenuDataHeader: ; 0x10a7f
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw MenuData2_0x10a87
+	dw .MenuData2
 	db 1 ; default option
 ; 0x10a87
 
-MenuData2_0x10a87: ; 0x10a87
+.MenuData2: ; 0x10a87
 	db $ae ; flags
 	db 5, 8 ; rows, columns
 	db 1 ; horizontal spacing
@@ -1600,15 +1598,15 @@
 	dba UpdateItemDescription
 ; 10a97
 
-MenuDataHeader_0x10a97: ; 0x10a97
+PC_Mart_KeyItemsPocketMenuDataHeader: ; 0x10a97
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw MenuData2_0x10a9f
+	dw .MenuData2
 	db 1 ; default option
 ; 0x10a9f
 
-MenuData2_0x10a9f: ; 0x10a9f
+.MenuData2: ; 0x10a9f
 	db $2e ; flags
 	db 5, 8 ; rows, columns
 	db 1 ; horizontal spacing
@@ -1618,15 +1616,15 @@
 	dba UpdateItemDescription
 ; 10aaf
 
-MenuDataHeader_0x10aaf: ; 0x10aaf
+BallsPocketMenuDataHeader: ; 0x10aaf
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw MenuData2_0x10ab7
+	dw .MenuData2
 	db 1 ; default option
 ; 0x10ab7
 
-MenuData2_0x10ab7: ; 0x10ab7
+.MenuData2: ; 0x10ab7
 	db $ae ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
@@ -1636,15 +1634,15 @@
 	dba UpdateItemDescription
 ; 10ac7
 
-MenuDataHeader_0x10ac7: ; 0x10ac7
+PC_Mart_BallsPocketMenuDataHeader: ; 0x10ac7
 	db $40 ; flags
 	db 01, 07 ; start coords
 	db 11, 19 ; end coords
-	dw MenuData2_0x10acf
+	dw .MenuData2
 	db 1 ; default option
 ; 0x10acf
 
-MenuData2_0x10acf: ; 0x10acf
+.MenuData2: ; 0x10acf
 	db $2e ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
@@ -1723,6 +1721,5 @@
 
 PackMenuGFX:
 INCBIN "gfx/misc/pack_menu.2bpp"
-
 PackGFX:
 INCBIN "gfx/misc/pack.2bpp"
--- a/engine/pokecenter_pc.asm
+++ b/engine/pokecenter_pc.asm
@@ -431,9 +431,9 @@
 	jr c, .asm_158b6
 	call DisableSpriteUpdates
 	call LoadStandardMenuDataHeader
-	callba Function106a5
+	callba DepositSellInitPackBuffers
 .asm_1589c
-	callba Function106be
+	callba DepositSellPack
 	ld a, [wcf66]
 	and a
 	jr z, .asm_158b3
@@ -629,7 +629,7 @@
 	call Function156c7
 
 .asm_159f2
-	callba Function2490c
+	callba SwitchItemsInBag
 
 .asm_159f8
 	jp .asm_15989
--- a/engine/startmenu.asm
+++ b/engine/startmenu.asm
@@ -795,26 +795,26 @@
 ; Eggs can't hold items!
 	ld a, [CurPartySpecies]
 	cp EGG
-	jr z, .asm_12ba6
+	jr z, .cancel
 
 	ld hl, GiveTakeItemMenuData
 	call LoadMenuDataHeader
 	call InterpretMenu2
 	call ExitMenu
-	jr c, .asm_12ba6
+	jr c, .cancel
 
 	call GetCurNick
 	ld hl, StringBuffer1
-	ld de, wd050
-	ld bc, $b
+	ld de, wd050_MonNick
+	ld bc, PKMN_NAME_LENGTH
 	call CopyBytes
 	ld a, [MenuSelection2]
 	cp 1
-	jr nz, .asm_12ba0
+	jr nz, .take
 
 	call LoadStandardMenuDataHeader
 	call ClearPalettes
-	call Function12ba9
+	call .GiveItem
 	call ClearPalettes
 	call LoadFontsBattleExtra
 	call ExitMenu
@@ -821,23 +821,23 @@
 	ld a, 0
 	ret
 
-.asm_12ba0
+.take
 	call TakePartyItem
 	ld a, 3
 	ret
 
-.asm_12ba6
+.cancel
 	ld a, 3
 	ret
 ; 12ba9
 
 
-Function12ba9: ; 12ba9
+.GiveItem: ; 12ba9
 
-	callba Function106a5
+	callba DepositSellInitPackBuffers
 
 .loop
-	callba Function106be
+	callba DepositSellPack
 
 	ld a, [wcf66]
 	and a
@@ -852,7 +852,7 @@
 	and a
 	jr nz, .next
 
-	call Function12bd9
+	call TryGiveItemToPartymon
 	jr .quit
 
 .next
@@ -865,7 +865,7 @@
 ; 12bd9
 
 
-Function12bd9: ; 12bd9
+TryGiveItemToPartymon: ; 12bd9
 
 	call SpeechTextBox
 	call PartyMonItemName
@@ -872,17 +872,17 @@
 	call GetPartyItemLocation
 	ld a, [hl]
 	and a
-	jr z, .asm_12bf4
+	jr z, .give_item_to_mon
 
 	push hl
 	ld d, a
 	callba ItemIsMail
 	pop hl
-	jr c, .asm_12c01
+	jr c, .please_remove_mail
 	ld a, [hl]
-	jr .asm_12c08
+	jr .already_holding_item
 
-.asm_12bf4
+.give_item_to_mon
 	call GiveItemToPokemon
 	ld hl, MadeHoldText
 	call MenuTextBoxBackup
@@ -889,17 +889,17 @@
 	call GivePartyItem
 	ret
 
-.asm_12c01
+.please_remove_mail
 	ld hl, PleaseRemoveMailText
 	call MenuTextBoxBackup
 	ret
 
-.asm_12c08
+.already_holding_item
 	ld [wd265], a
 	call GetItemName
 	ld hl, SwitchAlreadyHoldingText
 	call StartMenuYesNo
-	jr c, .asm_12c4b
+	jr c, .abort
 
 	call GiveItemToPokemon
 	ld a, [wd265]
@@ -909,7 +909,7 @@
 	pop af
 	ld [CurItem], a
 	call ReceiveItemFromPokemon
-	jr nc, .asm_12c3c
+	jr nc, .bag_full
 
 	ld hl, TookAndMadeHoldText
 	call MenuTextBoxBackup
@@ -918,7 +918,7 @@
 	call GivePartyItem
 	ret
 
-.asm_12c3c
+.bag_full
 	ld a, [wd265]
 	ld [CurItem], a
 	call ReceiveItemFromPokemon
@@ -925,7 +925,7 @@
 	ld hl, ItemStorageIsFullText
 	call MenuTextBoxBackup
 
-.asm_12c4b
+.abort
 	ret
 ; 12c4c
 
--- /dev/null
+++ b/engine/switch_items.asm
@@ -1,0 +1,274 @@
+SwitchItemsInBag: ; 2490c (9:490c)
+	ld a, [wSwitchItem]
+	and a
+	jr z, .init
+	ld b, a
+	ld a, [wCurrPocketCursorPosition]
+	inc a
+	cp b
+	jr z, .trivial
+	ld a, [wCurrPocketCursorPosition]
+	call Function24a5c
+	ld a, [hl]
+	cp $ff
+	ret z
+	ld a, [wSwitchItem]
+	dec a
+	ld [wSwitchItem], a
+	call Function249a7
+	jp c, Function249d1
+	ld a, [wCurrPocketCursorPosition]
+	ld c, a
+	ld a, [wSwitchItem]
+	cp c
+	jr c, .asm_2497a
+	jr .asm_2494a
+
+.init
+	ld a, [wCurrPocketCursorPosition]
+	inc a
+	ld [wSwitchItem], a
+	ret
+
+.trivial
+	xor a
+	ld [wSwitchItem], a
+	ret
+
+.asm_2494a
+	ld a, [wSwitchItem]
+	call Function24a40
+	ld a, [wCurrPocketCursorPosition]
+	ld d, a
+	ld a, [wSwitchItem]
+	ld e, a
+	call Function24a6c
+	push bc
+	ld a, [wSwitchItem]
+	call Function24a5c
+	dec hl
+	push hl
+	call Function24a80
+	add hl, bc
+	ld d, h
+	ld e, l
+	pop hl
+	pop bc
+	call Function24aab
+	ld a, [wCurrPocketCursorPosition]
+	call Function24a4d
+	xor a
+	ld [wSwitchItem], a
+	ret
+
+.asm_2497a
+	ld a, [wSwitchItem]
+	call Function24a40
+	ld a, [wCurrPocketCursorPosition]
+	ld d, a
+	ld a, [wSwitchItem]
+	ld e, a
+	call Function24a6c
+	push bc
+	ld a, [wSwitchItem]
+	call Function24a5c
+	ld d, h
+	ld e, l
+	call Function24a80
+	add hl, bc
+	pop bc
+	call CopyBytes
+	ld a, [wCurrPocketCursorPosition]
+	call Function24a4d
+	xor a
+	ld [wSwitchItem], a
+	ret
+
+Function249a7: ; 249a7 (9:49a7)
+	ld a, [wSwitchItem]
+	call Function24a5c
+	ld d, h
+	ld e, l
+	ld a, [wCurrPocketCursorPosition]
+	call Function24a5c
+	ld a, [de]
+	cp [hl]
+	jr nz, .asm_249cd
+	ld a, [wCurrPocketCursorPosition]
+	call Function24a97
+	cp 99
+	jr z, .asm_249cd
+	ld a, [wSwitchItem]
+	call Function24a97
+	cp 99
+	jr nz, .asm_249cf
+.asm_249cd
+	and a
+	ret
+
+.asm_249cf
+	scf
+	ret
+
+Function249d1: ; 249d1 (9:49d1)
+	ld a, [wSwitchItem]
+	call Function24a5c
+	inc hl
+	push hl
+	ld a, [wCurrPocketCursorPosition]
+	call Function24a5c
+	inc hl
+	ld a, [hl]
+	pop hl
+	add [hl]
+	cp 100
+	jr c, .asm_24a01
+	sub 99
+	push af
+	ld a, [wCurrPocketCursorPosition]
+	call Function24a5c
+	inc hl
+	ld [hl], 99
+	ld a, [wSwitchItem]
+	call Function24a5c
+	inc hl
+	pop af
+	ld [hl], a
+	xor a
+	ld [wSwitchItem], a
+	ret
+
+.asm_24a01
+	push af
+	ld a, [wCurrPocketCursorPosition]
+	call Function24a5c
+	inc hl
+	pop af
+	ld [hl], a
+	ld hl, wMenuData2Addr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [wSwitchItem]
+	cp [hl]
+	jr nz, .asm_24a25
+	dec [hl]
+	ld a, [wSwitchItem]
+	call Function24a5c
+	ld [hl], $ff
+	xor a
+	ld [wSwitchItem], a
+	ret
+
+.asm_24a25
+	dec [hl]
+	call Function24a80
+	push bc
+	ld a, [wSwitchItem]
+	call Function24a5c
+	pop bc
+	push hl
+	add hl, bc
+	pop de
+.asm_24a34
+	ld a, [hli]
+	ld [de], a
+	inc de
+	cp $ff
+	jr nz, .asm_24a34
+	xor a
+	ld [wSwitchItem], a
+	ret
+
+Function24a40: ; 24a40 (9:4a40)
+	call Function24a5c
+	ld de, wd002
+	call Function24a80
+	call CopyBytes
+	ret
+
+Function24a4d: ; 24a4d (9:4a4d)
+	call Function24a5c
+	ld d, h
+	ld e, l
+	ld hl, wd002
+	call Function24a80
+	call CopyBytes
+	ret
+
+Function24a5c: ; 24a5c (9:4a5c)
+	push af
+	call Function24a80
+	ld hl, wMenuData2Addr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	inc hl
+	pop af
+	call AddNTimes
+	ret
+
+Function24a6c: ; 24a6c (9:4a6c)
+	push hl
+	call Function24a80
+	ld a, d
+	sub e
+	jr nc, .asm_24a76
+	dec a
+	cpl
+.asm_24a76
+	ld hl, 0
+	call AddNTimes
+	ld b, h
+	ld c, l
+	pop hl
+	ret
+
+Function24a80: ; 24a80 (9:4a80)
+	push hl
+	ld a, [wcf94]
+	ld c, a
+	ld b, 0
+	ld hl, Unknown_24a91
+rept 2
+	add hl, bc
+endr
+	ld c, [hl]
+	inc hl
+	ld b, [hl]
+	pop hl
+	ret
+
+; 24a91 (9:4a91)
+
+Unknown_24a91: ; 24a91
+	dw 0, 1, 2
+; 24a97
+
+Function24a97: ; 24a97 (9:4a97)
+	push af
+	call Function24a80
+	ld a, c
+	cp $2
+	jr nz, .asm_24aa7
+	pop af
+	call Function24a5c
+	inc hl
+	ld a, [hl]
+	ret
+
+.asm_24aa7
+	pop af
+	ld a, $1
+	ret
+
+Function24aab: ; 24aab (9:4aab)
+.loop
+	ld a, [hld]
+	ld [de], a
+	dec de
+	dec bc
+	ld a, b
+	or c
+	jr nz, .loop
+	ret
--- /dev/null
+++ b/engine/tmhm2.asm
@@ -1,0 +1,592 @@
+TMHMPocket: ; 2c76f (b:476f)
+	ld a, $1
+	ld [hInMenu], a
+	call TMHM_PocketLoop
+	ld a, $0
+	ld [hInMenu], a
+	ret nc
+	call Function1bee
+	call WaitBGMap
+	ld a, [CurItem]
+	dec a
+	ld [ItemCountBuffer], a
+	ld hl, TMsHMs
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	ld [wItemQuantityBuffer], a
+	call .ConvertItemToTMHMNumber
+	scf
+	ret
+
+.ConvertItemToTMHMNumber: ; 2c798 (b:4798)
+	ld a, [CurItem]
+	ld c, a
+	callab GetNumberedTMHM
+	ld a, c
+	ld [CurItem], a
+	ret
+
+ConvertCurItemIntoCurTMHM: ; 2c7a7 (b:47a7)
+	ld a, [CurItem]
+	ld c, a
+	callab GetTMHMNumber
+	ld a, c
+	ld [wCurTMHM], a
+	ret
+
+GetTMHMItemMove: ; 2c7b6 (b:47b6)
+	call ConvertCurItemIntoCurTMHM
+	predef GetTMHMMove
+	ret
+
+AskTeachTMHM: ; 2c7bf (b:47bf)
+	ld hl, Options
+	ld a, [hl]
+	push af
+	res NO_TEXT_SCROLL, [hl]
+	ld a, [CurItem]
+	cp TM01
+	jr c, .NotTMHM
+	call GetTMHMItemMove
+	ld a, [wCurTMHM]
+	ld [wPutativeTMHMMove], a
+	call GetMoveName
+	call CopyName1
+	ld hl, Text_BootedTM ; Booted up a TM
+	ld a, [CurItem]
+	cp HM01
+	jr c, .TM
+	ld hl, Text_BootedHM ; Booted up an HM
+.TM
+	call PrintText
+	ld hl, Text_ItContained
+	call PrintText
+	call YesNoBox
+.NotTMHM
+	pop bc
+	ld a, b
+	ld [Options], a
+	ret
+
+ChooseMonToLearnTMHM: ; 2c7fb
+	ld hl, StringBuffer2
+	ld de, wd066
+	ld bc, 12
+	call CopyBytes
+	call ClearBGPalettes
+ChooseMonToLearnTMHM_NoRefresh: ; 2c80a
+	callba LoadPartyMenuGFX
+	callba InitPartyMenuWithCancel
+	callba InitPartyMenuGFX
+	ld a, $3
+	ld [PartyMenuActionText], a
+.loopback
+	callba WritePartyMenuTilemap
+	callba PrintPartyMenuText
+	call WaitBGMap
+	call SetPalettes
+	call DelayFrame
+	callba PartyMenuSelect
+	push af
+	ld a, [CurPartySpecies]
+	cp EGG
+	pop bc ; now contains the former contents of af
+	jr z, .egg
+	push bc
+	ld hl, wd066
+	ld de, StringBuffer2
+	ld bc, 12
+	call CopyBytes
+	pop af ; now contains the original contents of af
+	ret
+
+.egg
+	push hl
+	push de
+	push bc
+	push af
+	ld de, SFX_WRONG
+	call PlaySFX
+	call WaitSFX
+	pop af
+	pop bc
+	pop de
+	pop hl
+	jr .loopback
+; 2c867
+
+TeachTMHM: ; 2c867
+	predef CanLearnTMHMMove
+
+	push bc
+	ld a, [CurPartyMon]
+	ld hl, PartyMonNicknames
+	call GetNick
+	pop bc
+
+	ld a, c
+	and a
+	jr nz, .compatible
+	push de
+	ld de, SFX_WRONG
+	call PlaySFX
+	pop de
+	ld hl, Text_TMHMNotCompatible
+	call PrintText
+	jr .nope
+
+.compatible
+	callab KnowsMove
+	jr c, .nope
+
+	predef LearnMove
+	ld a, b
+	and a
+	jr z, .nope
+
+	callba MobileFn_106049
+	ld a, [CurItem]
+	call IsHM
+	ret c
+
+	ld c, HAPPINESS_LEARNMOVE
+	callab ChangeHappiness
+	call ConsumeTM
+	jr .learned_move
+
+.nope
+	and a
+	ret
+
+.unused
+	ld a, 2
+	ld [wItemEffectSucceeded], a
+.learned_move
+	scf
+	ret
+; 2c8bf (b:48bf)
+
+Text_BootedTM: ; 0x2c8bf
+	; Booted up a TM.
+	text_jump UnknownText_0x1c0373
+	db "@"
+; 0x2c8c4
+
+Text_BootedHM: ; 0x2c8c4
+	; Booted up an HM.
+	text_jump UnknownText_0x1c0384
+	db "@"
+; 0x2c8c9
+
+Text_ItContained: ; 0x2c8c9
+	; It contained @ . Teach @ to a #MON?
+	text_jump UnknownText_0x1c0396
+	db "@"
+; 0x2c8ce
+
+Text_TMHMNotCompatible: ; 0x2c8ce
+	; is not compatible with @ . It can't learn @ .
+	text_jump UnknownText_0x1c03c2
+	db "@"
+; 0x2c8d3
+
+TMHM_PocketLoop: ; 2c8d3 (b:48d3)
+	xor a
+	ld [hBGMapMode], a
+	call TMHM_DisplayPocketItems
+	ld a, $2
+	ld [wcfa1], a
+	ld a, $7
+	ld [wcfa2], a
+	ld a, $1
+	ld [wcfa4], a
+	ld a, $5
+	sub d
+	inc a
+	cp $6
+	jr nz, .okay
+	dec a
+.okay
+	ld [wcfa3], a
+	ld a, $c
+	ld [wcfa5], a
+	xor a
+	ld [wcfa6], a
+	ld a, $20
+	ld [wcfa7], a
+	ld a, $f3
+	ld [wcfa8], a
+	ld a, [wTMHMPocketCursor]
+	inc a
+	ld [MenuSelection2], a
+	ld a, $1
+	ld [wcfaa], a
+	jr TMHM_ShowTMMoveDescription
+
+TMHM_JoypadLoop: ; 2c915 (b:4915)
+	call TMHM_DisplayPocketItems
+	call Function1bc9
+	ld b, a
+	ld a, [MenuSelection2]
+	dec a
+	ld [wTMHMPocketCursor], a
+	xor a
+	ld [hBGMapMode], a
+	ld a, [wcfa6]
+	bit 7, a
+	jp nz, TMHM_ScrollPocket
+	ld a, b
+	ld [wMenuJoypad], a
+	bit A_BUTTON_F, a
+	jp nz, TMHM_ChooseTMorHM
+	bit B_BUTTON_F, a
+	jp nz, TMHM_ExitPack
+	bit D_RIGHT_F, a
+	jp nz, TMHM_ExitPocket
+	bit D_LEFT_F, a
+	jp nz, TMHM_ExitPocket
+TMHM_ShowTMMoveDescription: ; 2c946 (b:4946)
+	call TMHM_CheckHoveringOverCancel
+	jp nc, TMHM_ExitPocket
+	hlcoord 0, 12
+	ld b, 4
+	ld c, SCREEN_WIDTH - 2
+	call TextBox
+	ld a, [CurItem]
+	cp NUM_TMS + NUM_HMS + 1
+	jr nc, TMHM_JoypadLoop
+	ld [wd265], a
+	predef GetTMHMMove
+	ld a, [wd265]
+	ld [CurSpecies], a
+	hlcoord 1, 14
+	call PrintMoveDesc
+	jp TMHM_JoypadLoop
+
+TMHM_ChooseTMorHM: ; 2c974 (b:4974)
+	call TMHM_PlaySFX_ReadText2
+	call CountTMsHMs ; This stores the count to wd265.
+	ld a, [MenuSelection2]
+	dec a
+	ld b, a
+	ld a, [wTMHMPocketScrollPosition]
+	add b
+	ld b, a
+	ld a, [wd265]
+	cp b
+	jr z, _TMHM_ExitPack ; our cursor was hovering over CANCEL
+TMHM_CheckHoveringOverCancel: ; 2c98a (b:498a)
+	call TMHM_GetCurrentPocketPosition
+	ld a, [MenuSelection2]
+	ld b, a
+.loop
+	inc c
+	ld a, c
+	cp NUM_TMS + NUM_HMS + 1
+	jr nc, .okay
+	ld a, [hli]
+	and a
+	jr z, .loop
+	dec b
+	jr nz, .loop
+	ld a, c
+.okay
+	ld [CurItem], a
+	cp -1
+	ret
+
+TMHM_ExitPack: ; 2c9a5 (b:49a5)
+	call TMHM_PlaySFX_ReadText2
+_TMHM_ExitPack: ; 2c9a8 (b:49a8)
+	ld a, $2
+	ld [wMenuJoypad], a
+	and a
+	ret
+
+TMHM_ExitPocket: ; 2c9af (b:49af)
+	and a
+	ret
+
+TMHM_ScrollPocket: ; 2c9b1 (b:49b1)
+	ld a, b
+	bit 7, a
+	jr nz, .skip
+	ld hl, wTMHMPocketScrollPosition
+	ld a, [hl]
+	and a
+	jp z, TMHM_JoypadLoop
+	dec [hl]
+	call TMHM_DisplayPocketItems
+	jp TMHM_ShowTMMoveDescription
+
+.skip
+	call TMHM_GetCurrentPocketPosition
+	ld b, 5
+.loop
+	inc c
+	ld a, c
+	cp NUM_TMS + NUM_HMS + 1
+	jp nc, TMHM_JoypadLoop
+	ld a, [hli]
+	and a
+	jr z, .loop
+	dec b
+	jr nz, .loop
+	ld hl, wTMHMPocketScrollPosition
+	inc [hl]
+	call TMHM_DisplayPocketItems
+	jp TMHM_ShowTMMoveDescription
+
+TMHM_DisplayPocketItems: ; 2c9e2 (b:49e2)
+	ld a, [BattleType]
+	cp BATTLETYPE_TUTORIAL
+	jp z, Tutorial_TMHMPocket
+
+	hlcoord 5, 2
+	lb bc, 10, 15
+	ld a, " "
+	call ClearBox
+	call TMHM_GetCurrentPocketPosition
+	ld d, $5
+.loop2
+	inc c
+	ld a, c
+	cp NUM_TMS + NUM_HMS + 1
+	jr nc, .NotTMHM
+	ld a, [hli]
+	and a
+	jr z, .loop2
+	ld b, a
+	ld a, c
+	ld [wd265], a
+	push hl
+	push de
+	push bc
+	call TMHMPocket_GetCurrentLineCoord
+	push hl
+	ld a, [wd265]
+	cp NUM_TMS + 1
+	jr nc, .HM
+	ld de, wd265
+	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+	call PrintNum
+	jr .okay
+
+.HM
+	push af
+	sub NUM_TMS
+	ld [wd265], a
+	ld [hl], "H"
+	inc hl
+	ld de, wd265
+	lb bc, PRINTNUM_RIGHTALIGN | 1, 2
+	call PrintNum
+	pop af
+	ld [wd265], a
+.okay
+	predef GetTMHMMove
+	ld a, [wd265]
+	ld [wPutativeTMHMMove], a
+	call GetMoveName
+	pop hl
+	ld bc, 3
+	add hl, bc
+	push hl
+	call PlaceString
+	pop hl
+	pop bc
+	ld a, c
+	push bc
+	cp NUM_TMS + 1
+	jr nc, .hm2
+	ld bc, SCREEN_WIDTH + 9
+	add hl, bc
+	ld [hl], "×"
+	inc hl
+	ld a, "0" ; why are we doing this?
+	pop bc
+	push bc
+	ld a, b
+	ld [wd265], a
+	ld de, wd265
+	lb bc, 1, 2
+	call PrintNum
+.hm2
+	pop bc
+	pop de
+	pop hl
+	dec d
+	jr nz, .loop2
+	jr .done
+
+.NotTMHM
+	call TMHMPocket_GetCurrentLineCoord
+rept 3
+	inc hl
+endr
+	push de
+	ld de, TMHM_String_Cancel
+	call PlaceString
+	pop de
+.done
+	ret
+
+TMHMPocket_GetCurrentLineCoord: ; 2ca86 (b:4a86)
+	hlcoord 5, 0
+	ld bc, 2 * SCREEN_WIDTH
+	ld a, 6
+	sub d
+	ld e, a
+	; AddNTimes
+.loop
+	add hl, bc
+	dec e
+	jr nz, .loop
+	ret
+; 2ca95 (b:4a95)
+
+Function2ca95: ; 2ca95
+; unreferenced
+	pop hl
+	ld bc, 3
+	add hl, bc
+	predef GetTMHMMove
+	ld a, [wd265]
+	ld [wPutativeTMHMMove], a
+	call GetMoveName
+	push hl
+	call PlaceString
+	pop hl
+	ret
+; 2caae
+
+TMHM_String_Cancel: ; 2caae
+	db "CANCEL@"
+; 2cab5
+
+TMHM_GetCurrentPocketPosition: ; 2cab5 (b:4ab5)
+	ld hl, TMsHMs
+	ld a, [wTMHMPocketScrollPosition]
+	ld b, a
+	inc b
+	ld c, 0
+.loop
+	inc c
+	ld a, [hli]
+	and a
+	jr z, .loop
+	dec b
+	jr nz, .loop
+	dec hl
+	dec c
+	ret
+
+Tutorial_TMHMPocket: ; 2caca (b:4aca)
+	hlcoord 9, 3
+	push de
+	ld de, TMHM_String_Cancel
+	call PlaceString
+	pop de
+	ret
+
+TMHM_PlaySFX_ReadText2: ; 2cad6 (b:4ad6)
+	push de
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	pop de
+	ret
+; 2cadf (b:4adf)
+
+Function2cadf: ; 2cadf
+; unreferenced
+	call ConvertCurItemIntoCurTMHM
+	call .CheckHaveRoomForTMHM
+	ld hl, .NoRoomText
+	jr nc, .print
+	ld hl, .ReceivedText
+.print
+	jp PrintText
+; 2caf0
+
+.NoRoomText: ; 0x2caf0
+	; You have no room for any more @ S.
+	text_jump UnknownText_0x1c03fa
+	db "@"
+; 0x2caf5
+
+.ReceivedText: ; 0x2caf5
+	; You received @ !
+	text_jump UnknownText_0x1c0421
+	db "@"
+; 0x2cafa
+
+.CheckHaveRoomForTMHM: ; 2cafa
+	ld a, [wd265]
+	dec a
+	ld hl, TMsHMs
+	ld b, 0
+	ld c, a
+	add hl, bc
+	ld a, [hl]
+	inc a
+	cp NUM_TMS * 2
+	ret nc
+	ld [hl], a
+	ret
+; 2cb0c
+
+ConsumeTM: ; 2cb0c (b:4b0c)
+	call ConvertCurItemIntoCurTMHM
+	ld a, [wd265]
+	dec a
+	ld hl, TMsHMs
+	ld b, 0
+	ld c, a
+	add hl, bc
+	ld a, [hl]
+	and a
+	ret z
+	dec a
+	ld [hl], a
+	ret nz
+	ld a, [wTMHMPocketScrollPosition]
+	and a
+	ret z
+	dec a
+	ld [wTMHMPocketScrollPosition], a
+	ret
+
+CountTMsHMs: ; 2cb2a (b:4b2a)
+	ld b, 0
+	ld c, NUM_TMS + NUM_HMS
+	ld hl, TMsHMs
+.loop
+	ld a, [hli]
+	and a
+	jr z, .skip
+	inc b
+.skip
+	dec c
+	jr nz, .loop
+	ld a, b
+	ld [wd265], a
+	ret
+
+PrintMoveDesc: ; 2cb3e
+	push hl
+	ld hl, MoveDescriptions
+	ld a, [CurSpecies]
+	dec a
+	ld c, a
+	ld b, 0
+rept 2
+	add hl, bc
+endr
+	ld a, [hli]
+	ld e, a
+	ld d, [hl]
+	pop hl
+	jp PlaceString
+; 2cb52
--- a/home/menu.asm
+++ b/home/menu.asm
@@ -28,7 +28,8 @@
 	jp PrintText
 ; 1d57
 
-Function1d57:: ; 1d57
+ret_1d57:: ; 1d57
+; unreferenced
 	ret
 ; 1d58
 
@@ -423,9 +424,9 @@
 	ret
 ; 1f79
 
-Function1f79:: ; 1f79
+PlaceMenuStrings:: ; 1f79
 	push de
-	ld hl, wcf97
+	ld hl, wMenuData2PointerTableAddr
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
@@ -441,7 +442,7 @@
 PlaceNthMenuStrings:: ; 1f8d
 	push de
 	ld a, [MenuSelection]
-	call Function1fb1
+	call GetMenuDataPointerTableEntry
 rept 2
 	inc hl
 endr
@@ -454,7 +455,8 @@
 ; 1f9e
 
 Function1f9e:: ; 1f9e
-	call Function1fb1
+; unreferenced
+	call GetMenuDataPointerTableEntry
 rept 2
 	inc hl
 endr
@@ -466,7 +468,7 @@
 
 MenuJumptable:: ; 1fa7
 	ld a, [MenuSelection]
-	call Function1fb1
+	call GetMenuDataPointerTableEntry
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
@@ -473,10 +475,10 @@
 	jp [hl]
 ; 1fb1
 
-Function1fb1:: ; 1fb1
+GetMenuDataPointerTableEntry:: ; 1fb1
 	ld e, a
 	ld d, $0
-	ld hl, wcf97
+	ld hl, wMenuData2PointerTableAddr
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
--- a/items/item_effects.asm
+++ b/items/item_effects.asm
@@ -4,7 +4,7 @@
 	call GetItemName
 	call CopyName1
 	ld a, 1
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	ld a, [CurItem]
 	dec a
 	ld hl, ItemEffects
@@ -1220,7 +1220,7 @@
 
 .DecidedNotToUse
 	xor a
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	ret
 ; ee3d
 
@@ -1293,7 +1293,7 @@
 
 RareCandy_StatBooster_ExitMenu: ; ee9f
 	xor a
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	jp ClearPalettes
 ; eea6
 
@@ -1930,7 +1930,7 @@
 
 StatusHealer_ExitMenu: ; f29e (3:729e)
 	xor a
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 StatusHealer_ClearPalettes: ; f2a2 (3:72a2)
 	call ClearPalettes
 	ret
@@ -2233,10 +2233,10 @@
 
 EscapeRope: ; f44f
 	xor a
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	callba EscapeRopeFunction
 
-	ld a, [wPlayerAction]
+	ld a, [wItemEffectSucceeded]
 	cp 1
 	call z, UseDisposableItem
 	ret
@@ -2298,7 +2298,7 @@
 
 .asm_f4a6
 	xor a
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	ret
 ; f4ab
 
@@ -2701,7 +2701,7 @@
 PPRestoreItem_Cancel: ; f6e0
 	call ClearPalettes
 	xor a
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	ret
 ; f6e8
 
@@ -2802,7 +2802,7 @@
 
 SacredAsh: ; f753
 	callba _SacredAsh
-	ld a, [wPlayerAction]
+	ld a, [wItemEffectSucceeded]
 	cp $1
 	ret nz
 	call UseDisposableItem
@@ -2973,7 +2973,7 @@
 
 	; Item wasn't used.
 	ld a, $2
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	ret
 ; f7d6
 
@@ -2988,7 +2988,7 @@
 
 	; Item wasn't used.
 	ld a, $2
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	ret
 ; f7e8
 
@@ -3018,7 +3018,7 @@
 CantUseItemMessage: ; f804
 ; Item couldn't be used.
 	xor a
-	ld [wPlayerAction], a
+	ld [wItemEffectSucceeded], a
 	jp PrintText
 ; f80b
 
--- a/main.asm
+++ b/main.asm
@@ -1,9 +1,7 @@
 INCLUDE "includes.asm"
 
-
 SECTION "bank1", ROMX, BANK[$1]
 
-
 PlaceWaitingText:: ; 4000
 	hlcoord 3, 10
 	ld b, 1
@@ -55,7 +53,6 @@
 PushOAMEnd
 ; 4049
 
-
 INCLUDE "engine/map_objects.asm"
 
 INCLUDE "engine/intro_menu.asm"
@@ -248,7 +245,6 @@
 	db -1 ; end
 ; 66de
 
-
 INCLUDE "engine/math.asm"
 
 ItemAttributes: ; 67c1
@@ -256,7 +252,6 @@
 ; 6ec1
 INCLUDE "engine/npc_movement.asm"
 
-
 GetFirstPokemonHappiness: ; 718d
 	ld hl, PartyMon1Happiness
 	ld bc, PARTYMON_STRUCT_LENGTH
@@ -291,7 +286,6 @@
 	jp CopyPokemonName_Buffer1_Buffer3
 ; 71c2
 
-
 ChangeHappiness: ; 71c2
 ; Perform happiness action c on CurPartyMon
 
@@ -387,7 +381,6 @@
 	db +10,  +6,  +4 ; Gained a level in the place where it was caught
 ; 725a
 
-
 StepHappiness:: ; 725a
 ; Raise the party's happiness by 1 point every other step cycle.
 
@@ -424,7 +417,6 @@
 	ret
 ; 7282
 
-
 DaycareStep:: ; 7282
 
 	ld a, [wDaycareMan]
@@ -505,7 +497,6 @@
 	ret
 ; 7305
 
-
 SpecialGiveShuckle: ; 7305
 
 ; Adding to the party.
@@ -579,7 +570,6 @@
 	db "SHUCKIE@"
 ; 737e
 
-
 SpecialReturnShuckle: ; 737e
 	callba SelectMonFromParty
 	jr c, .refused
@@ -752,7 +742,6 @@
 	ret
 ; 747b
 
-
 SECTION "bank2", ROMX, BANK[$2]
 
 Function8000: ; 8000
@@ -844,7 +833,6 @@
 	ret
 ; 80a1
 
-
 WritePersonXY:: ; 80a1
 	ld a, b
 	call CheckObjectVisibility
@@ -892,7 +880,6 @@
 	ret
 ; 80e7
 
-
 CopyObjectStruct:: ; 80e7
 	call CheckObjectMask
 	and a
@@ -1188,7 +1175,6 @@
 	ret
 ; 8286
 
-
 CopyTempObjectToObjectStruct: ; 8286
 	ld a, [wTempObjectCopyMapObjectIndex]
 	ld hl, OBJECT_MAP_OBJECT_INDEX
@@ -1390,7 +1376,6 @@
 	slow_step_right
 ; 839e
 
-
 FollowNotExact:: ; 839e
 	push bc
 	ld a, c
@@ -1703,13 +1688,10 @@
 	sine_wave $100
 ; 854b
 
-
 INCLUDE "engine/predef.asm"
 
-
 INCLUDE "engine/color.asm"
 
-
 SECTION "bank3", ROMX, BANK[$3]
 
 CheckTime:: ; c000
@@ -1734,10 +1716,8 @@
 	db -1
 ; c01b
 
-
 INCLUDE "engine/specials.asm"
 
-
 _PrintNum:: ; c4c7
 ; Print c digits of the b-byte value from de to hl.
 ; Allows 2 to 7 digits. For 1-digit numbers, add
@@ -2042,7 +2022,6 @@
 	ret
 ; c658
 
-
 HealParty: ; c658
 	xor a
 	ld [CurPartyMon], a
@@ -2157,7 +2136,6 @@
 	ret
 ; c6ea
 
-
 ClearBuffer1: ; c6ea
 	xor a
 	ld hl, Buffer1
@@ -2181,7 +2159,6 @@
 	ret
 ; c706
 
-
 GetPartyNick: ; c706
 ; write CurPartyMon nickname to StringBuffer1-3
 	ld hl, PartyMonNicknames
@@ -2197,7 +2174,6 @@
 	ret
 ; c721
 
-
 CheckEngineFlag: ; c721
 ; Check engine flag de
 ; Return carry if flag is not set
@@ -2231,7 +2207,6 @@
 	db "@"
 ; c742
 
-
 CheckPartyMove: ; c742
 ; Check if a monster in your party has move d.
 
@@ -2277,7 +2252,6 @@
 	ret
 ; c779
 
-
 FieldMoveFailed: ; c779
 	ld hl, UnknownText_0xc780
 	call MenuTextBoxBackup
@@ -2300,13 +2274,11 @@
 	ret
 ; c796
 
-
 .Jumptable: ; c796 (3:4796)
 	dw .CheckAble
 	dw .DoCut
 	dw .FailCut
 
-
 .CheckAble: ; c79c (3:479c)
 	ld de, ENGINE_HIVEBADGE
 	call CheckBadge
@@ -2570,7 +2542,6 @@
 	ret
 ; c91a
 
-
 .Jumptable: ; c91a (3:491a)
 	dw .TrySurf
 	dw .DoSurf
@@ -2577,7 +2548,6 @@
 	dw .FailSurf
 	dw .AlreadySurfing
 
-
 .TrySurf: ; c922 (3:4922)
 	ld de, ENGINE_FOGBADGE
 	call CheckBadge
@@ -2673,7 +2643,6 @@
 	db "@"
 ; c9b8
 
-
 GetSurfType: ; c9b8
 ; Surfing on Pikachu uses an alternate sprite.
 ; This is done by using a separate movement type.
@@ -2692,7 +2661,6 @@
 	ret
 ; c9cb
 
-
 CheckDirection: ; c9cb
 ; Return carry if a tile permission prevents you
 ; from moving in the direction you're facing.
@@ -2725,7 +2693,6 @@
 	db FACE_RIGHT
 ; c9e7
 
-
 TrySurfOW:: ; c9e7
 ; Checking a tile in the overworld.
 ; Return carry if surfing is allowed.
@@ -2775,7 +2742,6 @@
 	ret
 ; ca2c
 
-
 AskSurfScript: ; ca2c
 	opentext
 	writetext AskSurfText
@@ -2790,7 +2756,6 @@
 	db "@"              ; Want to SURF?
 ; ca3b
 
-
 FlyFunction: ; ca3b
 	call ClearBuffer1
 .asm_ca3e
@@ -2808,7 +2773,6 @@
  	dw .FailFly
 ; ca52
 
-
 .TryFly: ; ca52
 ; Fly
 	ld de, ENGINE_STORMBADGE
@@ -3015,7 +2979,6 @@
 	db "@"
 ; 0xcb95
 
-
 EscapeRopeFunction: ; cb95
 	call ClearBuffer1
 	ld a, $1
@@ -3568,7 +3531,6 @@
 	db "@"
 ; 0xce7d
 
-
 HeadbuttFunction: ; ce7d
 	call TryHeadbuttFromMenu
 	and $7f
@@ -3661,7 +3623,6 @@
 	db "@"
 ; 0xceeb
 
-
 RockSmashFunction: ; ceeb
 	call TryRockSmashFromMenu
 	and $7f
@@ -3783,7 +3744,6 @@
 	ld [ScriptVar], a
 	ret
 
-
 FishFunction: ; cf8e
 	ld a, e
 	push af
@@ -4161,7 +4121,6 @@
 	db "@"
 ; 0xd186
 
-
 TryCutOW:: ; d186
 	ld d, CUT
 	call CheckPartyMove
@@ -4221,7 +4180,6 @@
 	db "@"
 ; 0xd1d5
 
-
 _ReceiveItem:: ; d1d5
 	call DoesHLEqualNumItems
 	jp nz, PutItemInPocket
@@ -4268,7 +4226,6 @@
 	jp ReceiveTMHM
 ; d20d
 
-
 _TossItem:: ; d20d
 	call DoesHLEqualNumItems
 	jr nz, .remove
@@ -4652,8 +4609,6 @@
 	ret
 ; d3c4
 
-
-
 ReceiveTMHM: ; d3c4
 	dec c
 	ld b, 0
@@ -4712,8 +4667,6 @@
 	ret
 ; d407
 
-
-
 GetTMHMNumber:: ; d407
 ; Return the number of a TM/HM by item id c.
 
@@ -4735,7 +4688,6 @@
 	ret
 ; d417
 
-
 GetNumberedTMHM: ; d417
 ; Return the item id of a TM/HM by number c.
 
@@ -4758,7 +4710,6 @@
 	ret
 ; d427
 
-
 _CheckTossableItem:: ; d427
 ; Return 1 in wItemAttributeParamBuffer and carry if CurItem can't be removed from the bag.
 	ld a, ITEMATTR_PERMISSIONS
@@ -4841,7 +4792,6 @@
 	ret
 ; d486
 
-
 GetItemPrice: ; d486
 ; Return the price of CurItem in de.
 	push hl
@@ -4857,7 +4807,6 @@
 	ret
 ; d497
 
-
 Functiond497:: ; d497 (3:5497)
 	ld a, [wPlayerStepFlags]
 	and a
@@ -4928,7 +4877,6 @@
 	dw .fail1
 	dw .fail1
 
-
 .fail1: ; d508 (3:5508)
 	ret
 
@@ -5557,7 +5505,6 @@
 	ret
 ; d88c
 
-
 TryAddMonToParty: ; d88c
 ; Check if to copy wild Pkmn or generate new Pkmn
 	; Whose is it?
@@ -5881,7 +5828,6 @@
 	ret
 ; da6d
 
-
 FillPP: ; da6d
 	push bc
 	ld b, NUM_MOVES
@@ -5997,7 +5943,6 @@
 	and a
 	ret
 
-
 SentGetPkmnIntoFromBox: ; db3f
 ; Sents/Gets Pkmn into/from Box depending on Parameter
 ; wPokemonWithdrawDepositParameter == 0: get Pkmn into Party
@@ -6233,7 +6178,6 @@
 	ret
 ; dcb6
 
-
 Functiondcb6: ; dcb6
 	ld a, b
 	ld hl, sBoxMons
@@ -6299,7 +6243,6 @@
 	ret
 ; dd21
 
-
 Functiondd21: ; dd21
 	ld a, [wBreedMon1Species]
 	ld [CurPartySpecies], a
@@ -6472,7 +6415,6 @@
 	ld bc, BOXMON_STRUCT_LENGTH
 	jp CopyBytes
 
-
 SentPkmnIntoBox: ; de6e
 ; Sents the Pkmn into one of Bills Boxes
 ; the data comes mainly from 'EnemyMon:'
@@ -6601,7 +6543,6 @@
 	ret
 ; df42
 
-
 Functiondf42: ; df42
 	call CloseSRAM
 	and a
@@ -7348,7 +7289,6 @@
 	ret
 ; e3d9
 
-
 TextJump_WasSentToBillsPC: ; 0xe3d9
 	; was sent to BILL's PC.
 	text_jump Text_WasSentToBillsPC
@@ -7459,7 +7399,7 @@
 	db $80 ; flags
 	db 0 ; items
 	dw .items
-	dw Function1f79
+	dw PlaceMenuStrings
 	dw .strings
 ; 0xe47f
 
@@ -7564,7 +7504,6 @@
 	db "@"
 ; 0xe538
 
-
 CheckCurPartyMonFainted: ; e538
 	ld hl, PartyMon1HP
 	ld de, PARTYMON_STRUCT_LENGTH
@@ -7595,7 +7534,6 @@
 	ret
 ; e559
 
-
 BillsPC_WithdrawMenu: ; e559 (3:6559)
 	call LoadStandardMenuDataHeader
 	callba _WithdrawPKMN
@@ -7815,7 +7753,6 @@
 	ret
 ; e6ce
 
-
 BugContest_SetCaughtContestMon: ; e6ce
 	ld a, [wContestMon]
 	and a
@@ -7858,10 +7795,8 @@
 	db "@"
 ; 0xe722
 
-
 INCLUDE "items/item_effects.asm"
 
-
 GetPokeBallWobble: ; f971 (3:7971)
 ; Returns whether a Poke Ball will wobble in the catch animation.
 ; Whether a Pokemon is caught is determined beforehand.
@@ -7952,7 +7887,6 @@
 	db 255, 255
 ; f9ea
 
-
 KnowsMove: ; f9ea
 	ld a, MON_MOVES
 	call GetPartyParamLocation
@@ -7981,7 +7915,6 @@
 	db "@"
 ; 0xfa0b
 
-
 SECTION "bank4", ROMX, BANK[$4]
 
 INCLUDE "engine/pack.asm"
@@ -8116,7 +8049,6 @@
 	call EventFlagAction
 	ret
 
-
 CheckFacingTileForStd:: ; 1365b
 ; Checks to see if the tile you're facing has a std script associated with it.  If so, executes the script and returns carry.
 	ld a, c
@@ -8227,10 +8159,8 @@
 	endr
 ; 13d96
 
-
 SECTION "bank5", ROMX, BANK[$5]
 
-
 StopRTC: ; Unreferenced???
 	ld a, SRAM_ENABLE
 	ld [MBC3SRamEnable], a
@@ -8257,7 +8187,6 @@
 	ret
 ; 14032
 
-
 GetTimeOfDay:: ; 14032
 ; get time of day based on the current hour
 	ld a, [hHours] ; hour
@@ -8300,7 +8229,6 @@
 	db -1, 0
 ; 14056
 
-
 StageRTCTimeForSave: ; 14056
 	call UpdateTime
 	ld hl, wRTC
@@ -8331,8 +8259,6 @@
 	ret
 ; 14089
 
-
-
 StartClock:: ; 14089
 	call GetClock
 	call Function1409b
@@ -8400,8 +8326,6 @@
 	ret
 ; 140ed
 
-
-
 Function140ed:: ; 140ed
 	call GetClock
 	call FixDays
@@ -8584,18 +8508,14 @@
 
 INCLUDE "tilesets/data_1.asm"
 
-
 SECTION "Roofs", ROMX, BANK[ROOFS]
 
 INCLUDE "tilesets/roofs.asm"
 
-
 SECTION "Tileset Data 2", ROMX, BANK[TILESETS_2]
 
 INCLUDE "tilesets/data_2.asm"
 
-
-
 SECTION "bank8", ROMX, BANK[$8]
 
 INCLUDE "engine/clock_reset.asm"
@@ -8604,7 +8524,6 @@
 
 INCLUDE "tilesets/data_3.asm"
 
-
 SECTION "bank9", ROMX, BANK[$9]
 
 StringBufferPointers:: ; 24000
@@ -8761,7 +8680,6 @@
 	ret
 ; 24423
 
-
 Function24423: ; 24423
 	ld a, [VramState]
 	bit 0, a
@@ -8875,7 +8793,6 @@
 	ret
 ; 244c3
 
-
 UpdateItemDescription: ; 0x244c3
 	ld a, [MenuSelection]
 	ld [CurSpecies], a
@@ -9015,7 +8932,6 @@
 	xor a
 	ret
 
-
 Function245af:: ; 245af
 	xor a
 	ld [wcf73], a
@@ -9108,7 +9024,6 @@
 	ret
 ; 24644
 
-
 .a_button: ; 24644
 	call Function1bee
 	ld a, [MenuSelection2]
@@ -9243,12 +9158,12 @@
 	ret
 
 ClearObjectStructsa: ; 2471a
-; Get the value of (wcf95):(wcf96,wcf97) and store it in wd144.
-	ld hl, wcf96
+; Get the value of (wMenuData2Bank):(wMenuData2Addr) and store it in wd144.
+	ld hl, wMenuData2Addr
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
-	ld a, [wcf95]
+	ld a, [wMenuData2Bank]
 	call GetFarByte
 	ld [wd144], a
 ; if ([wd144] + 1) < [wMenuData2Items] + [wMenuScrollPosition]: [wMenuScrollPosition] = max(([wd144] + 1) - [wMenuData2Items], 0)
@@ -9537,7 +9452,7 @@
 	add e
 	ld e, a
 	ld d, $0
-	ld hl, wcf96
+	ld hl, wMenuData2Addr
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
@@ -9553,12 +9468,12 @@
 
 .asm_248f2
 	add hl, de
-	ld a, [wcf95]
+	ld a, [wMenuData2Bank]
 	call GetFarByte
 	ld [MenuSelection], a
 	ld [CurItem], a
 	inc hl
-	ld a, [wcf95]
+	ld a, [wMenuData2Bank]
 	call GetFarByte
 	ld [wcf75], a
 	pop hl
@@ -9566,272 +9481,8 @@
 	ret
 ; 2490c
 
+INCLUDE "engine/switch_items.asm"
 
-Function2490c: ; 2490c (9:490c)
-	ld a, [wd0e3]
-	and a
-	jr z, .asm_2493d
-	ld b, a
-	ld a, [wcf77]
-	inc a
-	cp b
-	jr z, .asm_24945
-	ld a, [wcf77]
-	call Function24a5c
-	ld a, [hl]
-	cp $ff
-	ret z
-	ld a, [wd0e3]
-	dec a
-	ld [wd0e3], a
-	call Function249a7
-	jp c, Function249d1
-	ld a, [wcf77]
-	ld c, a
-	ld a, [wd0e3]
-	cp c
-	jr c, .asm_2497a
-	jr .asm_2494a
-.asm_2493d
-	ld a, [wcf77]
-	inc a
-	ld [wd0e3], a
-	ret
-.asm_24945
-	xor a
-	ld [wd0e3], a
-	ret
-.asm_2494a
-	ld a, [wd0e3]
-	call Function24a40
-	ld a, [wcf77]
-	ld d, a
-	ld a, [wd0e3]
-	ld e, a
-	call Function24a6c
-	push bc
-	ld a, [wd0e3]
-	call Function24a5c
-	dec hl
-	push hl
-	call Function24a80
-	add hl, bc
-	ld d, h
-	ld e, l
-	pop hl
-	pop bc
-	call Function24aab
-	ld a, [wcf77]
-	call Function24a4d
-	xor a
-	ld [wd0e3], a
-	ret
-.asm_2497a
-	ld a, [wd0e3]
-	call Function24a40
-	ld a, [wcf77]
-	ld d, a
-	ld a, [wd0e3]
-	ld e, a
-	call Function24a6c
-	push bc
-	ld a, [wd0e3]
-	call Function24a5c
-	ld d, h
-	ld e, l
-	call Function24a80
-	add hl, bc
-	pop bc
-	call CopyBytes
-	ld a, [wcf77]
-	call Function24a4d
-	xor a
-	ld [wd0e3], a
-	ret
-
-Function249a7: ; 249a7 (9:49a7)
-	ld a, [wd0e3]
-	call Function24a5c
-	ld d, h
-	ld e, l
-	ld a, [wcf77]
-	call Function24a5c
-	ld a, [de]
-	cp [hl]
-	jr nz, .asm_249cd
-	ld a, [wcf77]
-	call Function24a97
-	cp $63
-	jr z, .asm_249cd
-	ld a, [wd0e3]
-	call Function24a97
-	cp $63
-	jr nz, .asm_249cf
-.asm_249cd
-	and a
-	ret
-.asm_249cf
-	scf
-	ret
-
-Function249d1: ; 249d1 (9:49d1)
-	ld a, [wd0e3]
-	call Function24a5c
-	inc hl
-	push hl
-	ld a, [wcf77]
-	call Function24a5c
-	inc hl
-	ld a, [hl]
-	pop hl
-	add [hl]
-	cp $64
-	jr c, .asm_24a01
-	sub $63
-	push af
-	ld a, [wcf77]
-	call Function24a5c
-	inc hl
-	ld [hl], $63
-	ld a, [wd0e3]
-	call Function24a5c
-	inc hl
-	pop af
-	ld [hl], a
-	xor a
-	ld [wd0e3], a
-	ret
-.asm_24a01
-	push af
-	ld a, [wcf77]
-	call Function24a5c
-	inc hl
-	pop af
-	ld [hl], a
-	ld hl, wcf96
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [wd0e3]
-	cp [hl]
-	jr nz, .asm_24a25
-	dec [hl]
-	ld a, [wd0e3]
-	call Function24a5c
-	ld [hl], $ff
-	xor a
-	ld [wd0e3], a
-	ret
-.asm_24a25
-	dec [hl]
-	call Function24a80
-	push bc
-	ld a, [wd0e3]
-	call Function24a5c
-	pop bc
-	push hl
-	add hl, bc
-	pop de
-.asm_24a34
-	ld a, [hli]
-	ld [de], a
-	inc de
-	cp $ff
-	jr nz, .asm_24a34
-	xor a
-	ld [wd0e3], a
-	ret
-
-Function24a40: ; 24a40 (9:4a40)
-	call Function24a5c
-	ld de, wd002
-	call Function24a80
-	call CopyBytes
-	ret
-
-Function24a4d: ; 24a4d (9:4a4d)
-	call Function24a5c
-	ld d, h
-	ld e, l
-	ld hl, wd002
-	call Function24a80
-	call CopyBytes
-	ret
-
-Function24a5c: ; 24a5c (9:4a5c)
-	push af
-	call Function24a80
-	ld hl, wcf96
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	inc hl
-	pop af
-	call AddNTimes
-	ret
-
-Function24a6c: ; 24a6c (9:4a6c)
-	push hl
-	call Function24a80
-	ld a, d
-	sub e
-	jr nc, .asm_24a76
-	dec a
-	cpl
-.asm_24a76
-	ld hl, 0
-	call AddNTimes
-	ld b, h
-	ld c, l
-	pop hl
-	ret
-
-Function24a80: ; 24a80 (9:4a80)
-	push hl
-	ld a, [wcf94]
-	ld c, a
-	ld b, 0
-	ld hl, Unknown_24a91
-rept 2
-	add hl, bc
-endr
-	ld c, [hl]
-	inc hl
-	ld b, [hl]
-	pop hl
-	ret
-; 24a91 (9:4a91)
-
-Unknown_24a91: ; 24a91
-	dw 0, 1, 2
-; 24a97
-
-Function24a97: ; 24a97 (9:4a97)
-	push af
-	call Function24a80
-	ld a, c
-	cp $2
-	jr nz, .asm_24aa7
-	pop af
-	call Function24a5c
-	inc hl
-	ld a, [hl]
-	ret
-.asm_24aa7
-	pop af
-	ld a, $1
-	ret
-
-Function24aab: ; 24aab (9:4aab)
-	ld a, [hld]
-	ld [de], a
-	dec de
-	dec bc
-	ld a, b
-	or c
-	jr nz, Function24aab
-	ret
-
 PlaceMenuItemName: ; 0x24ab4
 	push de
 	ld a, [MenuSelection]
@@ -10054,7 +9705,6 @@
 	db "LEVEL@"
 ; 24c64
 
-
 FindApricornsInBag: ; 24c64
 ; Checks the bag for Apricorns.
 	ld hl, Buffer1
@@ -10114,7 +9764,6 @@
 	db -1
 ; 24caf
 
-
 MonMenuOptionStrings: ; 24caf
 	db "STATS@"
 	db "SWITCH@"
@@ -10460,7 +10109,6 @@
 	db "CANCEL@"
 ; 24ef2
 
-
 LoadBattleMenu: ; 24ef2
 	ld hl, BattleMenuDataHeader
 	call LoadMenuDataHeader
@@ -10473,7 +10121,6 @@
 	ret
 ; 24f0b
 
-
 SafariBattleMenu: ; 24f0b
 ; untranslated
 	ld hl, MenuDataHeader_0x24f4e
@@ -10496,7 +10143,6 @@
 	ret
 ; 24f2c
 
-
 BattleMenuDataHeader: ; 24f2c
 	db $40 ; flags
 	db 12, 08 ; start coords
@@ -10520,7 +10166,6 @@
 	db "RUN@"
 ; 24f4e
 
-
 MenuDataHeader_0x24f4e: ; 24f4e
 	db $40 ; flags
 	db 12, 00 ; start coords
@@ -10552,7 +10197,6 @@
 	ret
 ; 24f89
 
-
 MenuDataHeader_0x24f89: ; 24f89
 	db $40 ; flags
 	db 12, 02 ; start coords
@@ -10584,7 +10228,6 @@
 	ret
 ; 24fbf
 
-
 Function24fbf: ; 24fbf
 	ld hl, MenuDataHeader_0x250ed
 	call LoadMenuDataHeader
@@ -10592,7 +10235,6 @@
 	ret
 ; 24fc9
 
-
 Function24fc9: ; 24fc9
 	callba GetItemPrice
 Function24fcf: ; 24fcf
@@ -10735,7 +10377,6 @@
 	ret
 ; 25097
 
-
 Function25097: ; 25097
 	ret
 ; 25098
@@ -11121,7 +10762,6 @@
 	ret
 ; 2709e
 
-
 LevelUpHappinessMod: ; 2709e
 	ld a, [CurPartyMon]
 	ld hl, PartyMon1CaughtLocation
@@ -11263,7 +10903,6 @@
 	ret
 ; 27a2d
 
-
 SECTION "bankA", ROMX, BANK[$A]
 
 INCLUDE "engine/link.asm"
@@ -11450,7 +11089,6 @@
 	ret
 ; 2ba1a
 
-
 ChrisBackpic: ; 2ba1a
 INCBIN "gfx/misc/player.6x6.2bpp.lz"
 ; 2bbaa
@@ -11459,1158 +11097,25 @@
 INCBIN "gfx/misc/dude.6x6.2bpp.lz"
 ; 2bcea
 
-
 SECTION "bankB", ROMX, BANK[$B]
 
-Function2c000: ; 2c000
-	ld a, $e4
-	ld [rOBP0], a
-	call Function2c165
-	call Function2c01c
-	ld a, [wBattleMode]
-	dec a
-	ret z
-	jp Function2c03a
-; 2c012
+INCLUDE "battle/trainer_huds.asm"
 
-
-
-Function2c012: ; 2c012
-	ld a, $e4
-	ld [rOBP0], a
-	call Function2c165
-	jp Function2c03a
-; 2c01c
-
-Function2c01c: ; 2c01c
-	call Function2c0ad
-	ld hl, PartyMon1HP
-	ld de, PartyCount
-	call Function2c059
-	ld a, $60
-	ld hl, wcfc4
-	ld [hli], a
-	ld [hl], a
-	ld a, $8
-	ld [wd003], a
-	ld hl, Sprites
-	jp Function2c143
-; 2c03a
-
-
-
-Function2c03a: ; 2c03a
-	call Function2c0c5
-	ld hl, OTPartyMon1HP
-	ld de, OTPartyCount
-	call Function2c059
-	ld hl, wcfc4
-	ld a, $48
-	ld [hli], a
-	ld [hl], $20
-	ld a, $f8
-	ld [wd003], a
-	ld hl, Sprites + $18
-	jp Function2c143
-; 2c059
-
-
-Function2c059: ; 2c059
-	ld a, [de]
-	push af
-	ld de, Buffer1
-	ld c, $6
-	ld a, $34
-.asm_2c062
-	ld [de], a
-	inc de
-	dec c
-	jr nz, .asm_2c062
-	pop af
-	ld de, Buffer1
-.asm_2c06b
-	push af
-	call Function2c075
-	inc de
-	pop af
-	dec a
-	jr nz, .asm_2c06b
-	ret
-; 2c075
-
-Function2c075: ; 2c075
-	ld a, [hli]
-	and a
-	jr nz, .asm_2c07f
-	ld a, [hl]
-	and a
-	ld b, $33
-	jr z, .asm_2c08b
-
-.asm_2c07f
-rept 3
-	dec hl
-endr
-	ld a, [hl]
-	and a
-	ld b, $32
-	jr nz, .asm_2c08e
-	dec b
-	jr .asm_2c08e
-
-.asm_2c08b
-rept 3
-	dec hl
-endr
-
-.asm_2c08e
-	ld a, b
-	ld [de], a
-	ld bc, $32
-	add hl, bc
-	ret
-; 2c095
-
-DrawPlayerExpBar: ; 2c095
-	ld hl, .data_2c0a9
-	ld de, wd004
-	ld bc, 4
-	call CopyBytes
-	hlcoord 18, 10
-	ld de, -1
-	jr Function2c0f1
-
-.data_2c0a9
-	db $73
-	db $77
-	db $6f
-	db $76
-; 2c0ad
-
-Function2c0ad: ; 2c0ad
-	ld hl, .data_2c0c1
-	ld de, wd004
-	ld bc, 4
-	call CopyBytes
-	hlcoord 18, 10
-	ld de, -1
-	jr Function2c0f1
-
-.data_2c0c1
-	db $73, $5c, $6f, $76
-; 2c0c5
-
-Function2c0c5: ; 2c0c5
-	ld hl, .data_2c0ed
-	ld de, wd004
-	ld bc, 4
-	call CopyBytes
-	hlcoord 1, 2
-	ld de, 1
-	call Function2c0f1
-	ld a, [wBattleMode]
-	dec a
-	ret nz
-	ld a, [TempEnemyMonSpecies]
-	dec a
-	call CheckCaughtMon
-	ret z
-	hlcoord 1, 1
-	ld [hl], $5d
-	ret
-
-.data_2c0ed
-	db $6d
-	db $74
-	db $78
-	db $76
-; 2c0f1
-
-Function2c0f1: ; 2c0f1
-	ld a, [wd004]
-	ld [hl], a
-	ld bc, SCREEN_WIDTH
-	add hl, bc
-	ld a, [StartFlypoint]
-	ld [hl], a
-	ld b, $8
-.asm_2c0ff
-	add hl, de
-	ld a, [MovementBuffer]
-	ld [hl], a
-	dec b
-	jr nz, .asm_2c0ff
-	add hl, de
-	ld a, [EndFlypoint]
-	ld [hl], a
-	ret
-; 2c10d
-
-
-Function2c10d: ; 2c10d
-	call Function2c165
-	ld hl, PartyMon1HP
-	ld de, PartyCount
-	call Function2c059
-	ld hl, wcfc4
-	ld a, $50
-	ld [hli], a
-	ld [hl], $40
-	ld a, $8
-	ld [wd003], a
-	ld hl, Sprites
-	call Function2c143
-	ld hl, OTPartyMon1HP
-	ld de, OTPartyCount
-	call Function2c059
-	ld hl, wcfc4
-	ld a, "@"
-	ld [hli], a
-	ld [hl], $68
-	ld hl, Sprites + $18
-	jp Function2c143
-; 2c143
-
-Function2c143: ; 2c143
-	ld de, Buffer1
-	ld c, $6
-.loop
-	ld a, [wcfc5]
-	ld [hli], a
-	ld a, [wcfc4]
-	ld [hli], a
-	ld a, [de]
-	ld [hli], a
-	ld a, $3
-	ld [hli], a
-	ld a, [wcfc4]
-	ld b, a
-	ld a, [wd003]
-	add b
-	ld [wcfc4], a
-	inc de
-	dec c
-	jr nz, .loop
-	ret
-; 2c165
-
-Function2c165: ; 2c165
-	ld de, GFX_2c172
-	ld hl, VTiles0 tile $31
-	lb bc, BANK(GFX_2c172), 4
-	call Get2bpp_2
-	ret
-; 2c172
-
-GFX_2c172: ; 2c172
-INCBIN "gfx/battle/balls.2bpp"
-; 2c1b2
-
-_ShowLinkBattleParticipants: ; 2c1b2
-	call ClearBGPalettes
-	call LoadFontsExtra
-	hlcoord 2, 3
-	ld b, 9
-	ld c, 14
-	call TextBox
-	hlcoord 4, 5
-	ld de, PlayerName
-	call PlaceString
-	hlcoord 4, 10
-	ld de, OTPlayerName
-	call PlaceString
-	hlcoord 9, 8
-	ld a, $69
-	ld [hli], a
-	ld [hl], $6a
-	callba Function2c10d ; no need to callba
-	ld b, SCGB_08
-	call GetSGBLayout
-	call SetPalettes
-	ld a, $e4
-	ld [rOBP0], a
-	ret
-; 2c1ef
-
-
 TrainerClassNames:: ; 2c1ef
-	db "LEADER@"
-	db "LEADER@"
-	db "LEADER@"
-	db "LEADER@"
-	db "LEADER@"
-	db "LEADER@"
-	db "LEADER@"
-	db "LEADER@"
-	db "RIVAL@"
-	db "#MON PROF.@"
-	db "ELITE FOUR@"
-	db "<PKMN> TRAINER@"
-	db "ELITE FOUR@"
-	db "ELITE FOUR@"
-	db "ELITE FOUR@"
-	db "CHAMPION@"
-	db "LEADER@"
-	db "LEADER@"
-	db "LEADER@"
-	db "SCIENTIST@"
-	db "LEADER@"
-	db "YOUNGSTER@"
-	db "SCHOOLBOY@"
-	db "BIRD KEEPER@"
-	db "LASS@"
-	db "LEADER@"
-	db "COOLTRAINER@"
-	db "COOLTRAINER@"
-	db "BEAUTY@"
-	db "#MANIAC@"
-	db "ROCKET@"
-	db "GENTLEMAN@"
-	db "SKIER@"
-	db "TEACHER@"
-	db "LEADER@"
-	db "BUG CATCHER@"
-	db "FISHER@"
-	db "SWIMMER♂@"
-	db "SWIMMER♀@"
-	db "SAILOR@"
-	db "SUPER NERD@"
-	db "RIVAL@"
-	db "GUITARIST@"
-	db "HIKER@"
-	db "BIKER@"
-	db "LEADER@"
-	db "BURGLAR@"
-	db "FIREBREATHER@"
-	db "JUGGLER@"
-	db "BLACKBELT@"
-	db "ROCKET@"
-	db "PSYCHIC@"
-	db "PICNICKER@"
-	db "CAMPER@"
-	db "ROCKET@"
-	db "SAGE@"
-	db "MEDIUM@"
-	db "BOARDER@"
-	db "#FAN@"
-	db "KIMONO GIRL@"
-	db "TWINS@"
-	db "#FAN@"
-	db "<PKMN> TRAINER@"
-	db "LEADER@"
-	db "OFFICER@"
-	db "ROCKET@"
-	db "MYSTICALMAN@"
+INCLUDE "text/trainer_class_names.asm"
 
+INCLUDE "battle/ai/redundant.asm"
 
-
-AI_Redundant: ; 2c41a
-; Check if move effect c will fail because it's already been used.
-; Return z if the move is a good choice.
-; Return nz if the move is a bad choice.
-	ld a, c
-	ld de, 3
-	ld hl, .Moves
-	call IsInArray
-	jp nc, .NotRedundant
-	inc hl
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp [hl]
-
-.Moves: ; 2c42c
-	dbw EFFECT_DREAM_EATER,  .DreamEater
-	dbw EFFECT_HEAL,         .Heal
-	dbw EFFECT_LIGHT_SCREEN, .LightScreen
-	dbw EFFECT_MIST,         .Mist
-	dbw EFFECT_FOCUS_ENERGY, .FocusEnergy
-	dbw EFFECT_CONFUSE,      .Confuse
-	dbw EFFECT_TRANSFORM,    .Transform
-	dbw EFFECT_REFLECT,      .Reflect
-	dbw EFFECT_SUBSTITUTE,   .Substitute
-	dbw EFFECT_LEECH_SEED,   .LeechSeed
-	dbw EFFECT_DISABLE,      .Disable
-	dbw EFFECT_ENCORE,       .Encore
-	dbw EFFECT_SNORE,        .Snore
-	dbw EFFECT_SLEEP_TALK,   .SleepTalk
-	dbw EFFECT_MEAN_LOOK,    .MeanLook
-	dbw EFFECT_NIGHTMARE,    .Nightmare
-	dbw EFFECT_SPIKES,       .Spikes
-	dbw EFFECT_FORESIGHT,    .Foresight
-	dbw EFFECT_PERISH_SONG,  .PerishSong
-	dbw EFFECT_SANDSTORM,    .Sandstorm
-	dbw EFFECT_ATTRACT,      .Attract
-	dbw EFFECT_SAFEGUARD,    .Safeguard
-	dbw EFFECT_RAIN_DANCE,   .RainDance
-	dbw EFFECT_SUNNY_DAY,    .SunnyDay
-	dbw EFFECT_TELEPORT,     .Teleport
-	dbw EFFECT_MORNING_SUN,  .MorningSun
-	dbw EFFECT_SYNTHESIS,    .Synthesis
-	dbw EFFECT_MOONLIGHT,    .Moonlight
-	dbw EFFECT_SWAGGER,      .Swagger
-	dbw EFFECT_FUTURE_SIGHT, .FutureSight
-	db -1
-
-.LightScreen: ; 2c487
-	ld a, [EnemyScreens]
-	bit SCREENS_LIGHT_SCREEN, a
-	ret
-
-.Mist: ; 2c48d
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_MIST, a
-	ret
-
-.FocusEnergy: ; 2c493
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_FOCUS_ENERGY, a
-	ret
-
-.Confuse: ; 2c499
-	ld a, [PlayerSubStatus3]
-	bit SUBSTATUS_CONFUSED, a
-	ret nz
-	ld a, [PlayerScreens]
-	bit SCREENS_SAFEGUARD, a
-	ret
-
-.Transform: ; 2c4a5
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	ret
-
-.Reflect: ; 2c4ab
-	ld a, [EnemyScreens]
-	bit SCREENS_REFLECT, a
-	ret
-
-.Substitute: ; 2c4b1
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_SUBSTITUTE, a
-	ret
-
-.LeechSeed: ; 2c4b7
-	ld a, [PlayerSubStatus4]
-	bit SUBSTATUS_LEECH_SEED, a
-	ret
-
-.Disable: ; 2c4bd
-	ld a, [PlayerDisableCount]
-	and a
-	ret
-
-.Encore: ; 2c4c2
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_ENCORED, a
-	ret
-
-.Snore:
-.SleepTalk: ; 2c4c8
-	ld a, [EnemyMonStatus]
-	and SLP
-	jr z, .Redundant
-	jr .NotRedundant
-
-.MeanLook: ; 2c4d1
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_CANT_RUN, a
-	ret
-
-.Nightmare: ; 2c4d7
-	ld a, [BattleMonStatus]
-	and a
-	jr z, .Redundant
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_NIGHTMARE, a
-	ret
-
-.Spikes: ; 2c4e3
-	ld a, [PlayerScreens]
-	bit SCREENS_SPIKES, a
-	ret
-
-.Foresight: ; 2c4e9
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_IDENTIFIED, a
-	ret
-
-.PerishSong: ; 2c4ef
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_PERISH, a
-	ret
-
-.Sandstorm: ; 2c4f5
-	ld a, [Weather]
-	cp WEATHER_SANDSTORM
-	jr z, .Redundant
-	jr .NotRedundant
-
-.Attract: ; 2c4fe
-	callba CheckOppositeGender
-	jr c, .Redundant
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_IN_LOVE, a
-	ret
-
-.Safeguard: ; 2c50c
-	ld a, [EnemyScreens]
-	bit SCREENS_SAFEGUARD, a
-	ret
-
-.RainDance: ; 2c512
-	ld a, [Weather]
-	cp WEATHER_RAIN
-	jr z, .Redundant
-	jr .NotRedundant
-
-.SunnyDay: ; 2c51b
-	ld a, [Weather]
-	cp WEATHER_SUN
-	jr z, .Redundant
-	jr .NotRedundant
-
-.DreamEater: ; 2c524
-	ld a, [BattleMonStatus]
-	and SLP
-	jr z, .Redundant
-	jr .NotRedundant
-
-.Swagger: ; 2c52d
-	ld a, [PlayerSubStatus3]
-	bit SUBSTATUS_CONFUSED, a
-	ret
-
-.FutureSight: ; 2c533
-	ld a, [EnemyScreens]
-	bit 5, a
-	ret
-
-.Heal:
-.MorningSun:
-.Synthesis:
-.Moonlight: ; 2c539
-	callba AICheckEnemyMaxHP
-	jr nc, .NotRedundant
-
-.Teleport:
-.Redundant: ; 2c541
-	ld a, 1
-	and a
-	ret
-
-.NotRedundant: ; 2c545
-	xor a
-	ret
-
-
 INCLUDE "event/move_deleter.asm"
 
 INCLUDE "engine/mysterygift2.asm"
 
-Function2c76f: ; 2c76f (b:476f)
-	ld a, $1
-	ld [hInMenu], a
-	call Function2c8d3
-	ld a, $0
-	ld [hInMenu], a
-	ret nc
-	call Function1bee
-	call WaitBGMap
-	ld a, [CurItem]
-	dec a
-	ld [wd107], a
-	ld hl, TMsHMs
-	ld c, a
-	ld b, $0
-	add hl, bc
-	ld a, [hl]
-	ld [wItemQuantityBuffer], a
-	call Function2c798
-	scf
-	ret
+INCLUDE "engine/tmhm2.asm"
 
-Function2c798: ; 2c798 (b:4798)
-	ld a, [CurItem]
-	ld c, a
-	callab GetNumberedTMHM
-	ld a, c
-	ld [CurItem], a
-	ret
-
-ConvertCurItemIntoCurTMHM: ; 2c7a7 (b:47a7)
-	ld a, [CurItem]
-	ld c, a
-	callab GetTMHMNumber
-	ld a, c
-	ld [wCurTMHM], a
-	ret
-
-GetTMHMItemMove: ; 2c7b6 (b:47b6)
-	call ConvertCurItemIntoCurTMHM
-	predef GetTMHMMove
-	ret
-
-Function2c7bf: ; 2c7bf (b:47bf)
-	ld hl, Options
-	ld a, [hl]
-	push af
-	res 4, [hl]
-	ld a, [CurItem]
-	cp TM01
-	jr c, .NotTMHM
-	call GetTMHMItemMove
-	ld a, [wCurTMHM]
-	ld [wPutativeTMHMMove], a
-	call GetMoveName
-	call CopyName1
-	ld hl, UnknownText_0x2c8bf ; Booted up a TM
-	ld a, [CurItem]
-	cp HM01
-	jr c, .TM
-	ld hl, UnknownText_0x2c8c4 ; Booted up an HM
-.TM
-	call PrintText
-	ld hl, UnknownText_0x2c8c9
-	call PrintText
-	call YesNoBox
-.NotTMHM
-	pop bc
-	ld a, b
-	ld [Options], a
-	ret
-
-
-Function2c7fb: ; 2c7fb
-	ld hl, StringBuffer2
-	ld de, wd066
-	ld bc, $c
-	call CopyBytes
-	call ClearBGPalettes
-
-Function2c80a: ; 2c80a
-	callba LoadPartyMenuGFX
-	callba InitPartyMenuWithCancel
-	callba InitPartyMenuGFX
-	ld a, $3
-	ld [PartyMenuActionText], a
-.loopback
-	callba WritePartyMenuTilemap
-	callba PrintPartyMenuText
-	call WaitBGMap
-	call SetPalettes
-	call DelayFrame
-	callba PartyMenuSelect
-	push af
-	ld a, [CurPartySpecies]
-	cp EGG
-	pop bc ; now contains the former contents of af
-	jr z, .egg
-	push bc
-	ld hl, wd066
-	ld de, StringBuffer2
-	ld bc, $c
-	call CopyBytes
-	pop af ; now contains the original contents of af
-	ret
-
-.egg
-	push hl
-	push de
-	push bc
-	push af
-	ld de, SFX_WRONG
-	call PlaySFX
-	call WaitSFX
-	pop af
-	pop bc
-	pop de
-	pop hl
-	jr .loopback
-; 2c867
-
-Function2c867: ; 2c867
-	predef CanLearnTMHMMove
-
-	push bc
-	ld a, [CurPartyMon]
-	ld hl, PartyMonNicknames
-	call GetNick
-	pop bc
-
-	ld a, c
-	and a
-	jr nz, .compatible
-	push de
-	ld de, SFX_WRONG
-	call PlaySFX
-	pop de
-	ld hl, UnknownText_0x2c8ce
-	call PrintText
-	jr .nope
-
-.compatible
-	callab KnowsMove
-	jr c, .nope
-
-	predef LearnMove
-	ld a, b
-	and a
-	jr z, .nope
-
-	callba MobileFn_106049
-	ld a, [CurItem]
-	call IsHM
-	ret c
-
-	ld c, HAPPINESS_LEARNMOVE
-	callab ChangeHappiness
-	call Function2cb0c
-	jr .asm_2c8bd
-
-.nope
-	and a
-	ret
-
-.asm_2c8b8
-	ld a, $2
-	ld [wd0ec], a
-
-.asm_2c8bd
-	scf
-	ret
-; 2c8bf (b:48bf)
-
-UnknownText_0x2c8bf: ; 0x2c8bf
-	; Booted up a TM.
-	text_jump UnknownText_0x1c0373
-	db "@"
-; 0x2c8c4
-
-UnknownText_0x2c8c4: ; 0x2c8c4
-	; Booted up an HM.
-	text_jump UnknownText_0x1c0384
-	db "@"
-; 0x2c8c9
-
-UnknownText_0x2c8c9: ; 0x2c8c9
-	; It contained @ . Teach @ to a #MON?
-	text_jump UnknownText_0x1c0396
-	db "@"
-; 0x2c8ce
-
-UnknownText_0x2c8ce: ; 0x2c8ce
-	; is not compatible with @ . It can't learn @ .
-	text_jump UnknownText_0x1c03c2
-	db "@"
-; 0x2c8d3
-
-Function2c8d3: ; 2c8d3 (b:48d3)
-	xor a
-	ld [hBGMapMode], a
-	call Function2c9e2
-	ld a, $2
-	ld [wcfa1], a
-	ld a, $7
-	ld [wcfa2], a
-	ld a, $1
-	ld [wcfa4], a
-	ld a, $5
-	sub d
-	inc a
-	cp $6
-	jr nz, .asm_2c8f1
-	dec a
-.asm_2c8f1
-	ld [wcfa3], a
-	ld a, $c
-	ld [wcfa5], a
-	xor a
-	ld [wcfa6], a
-	ld a, $20
-	ld [wcfa7], a
-	ld a, $f3
-	ld [wcfa8], a
-	ld a, [wTMHMPocketCursor]
-	inc a
-	ld [MenuSelection2], a
-	ld a, $1
-	ld [wcfaa], a
-	jr Function2c946
-
-Function2c915: ; 2c915 (b:4915)
-	call Function2c9e2
-	call Function1bc9
-	ld b, a
-	ld a, [MenuSelection2]
-	dec a
-	ld [wTMHMPocketCursor], a
-	xor a
-	ld [hBGMapMode], a
-	ld a, [wcfa6]
-	bit 7, a
-	jp nz, Function2c9b1
-	ld a, b
-	ld [wcf73], a
-	bit 0, a
-	jp nz, Function2c974
-	bit 1, a
-	jp nz, Function2c9a5
-	bit 4, a
-	jp nz, Function2c9af
-	bit 5, a
-	jp nz, Function2c9af
-
-Function2c946: ; 2c946 (b:4946)
-	call Function2c98a
-	jp nc, Function2c9af
-	hlcoord 0, 12
-	ld b, $4
-	ld c, $12
-	call TextBox
-	ld a, [CurItem]
-	cp $3a
-	jr nc, Function2c915
-	ld [wd265], a
-	predef GetTMHMMove
-	ld a, [wd265]
-	ld [CurSpecies], a
-	hlcoord 1, 14
-	call PrintMoveDesc
-	jp Function2c915
-
-Function2c974: ; 2c974 (b:4974)
-	call Function2cad6
-	call Function2cb2a
-	ld a, [MenuSelection2]
-	dec a
-	ld b, a
-	ld a, [wTMHMPocketScrollPosition]
-	add b
-	ld b, a
-	ld a, [wd265]
-	cp b
-	jr z, asm_2c9a8
-
-Function2c98a: ; 2c98a (b:498a)
-	call Function2cab5
-	ld a, [MenuSelection2]
-	ld b, a
-.asm_2c991
-	inc c
-	ld a, c
-	cp $3a
-	jr nc, .asm_2c99f
-	ld a, [hli]
-	and a
-	jr z, .asm_2c991
-	dec b
-	jr nz, .asm_2c991
-	ld a, c
-.asm_2c99f
-	ld [CurItem], a
-	cp $ff
-	ret
-
-Function2c9a5: ; 2c9a5 (b:49a5)
-	call Function2cad6
-
-asm_2c9a8: ; 2c9a8 (b:49a8)
-	ld a, $2
-	ld [wcf73], a
-	and a
-	ret
-
-Function2c9af: ; 2c9af (b:49af)
-	and a
-	ret
-
-Function2c9b1: ; 2c9b1 (b:49b1)
-	ld a, b
-	bit 7, a
-	jr nz, .skip
-	ld hl, wTMHMPocketScrollPosition
-	ld a, [hl]
-	and a
-	jp z, Function2c915
-	dec [hl]
-	call Function2c9e2
-	jp Function2c946
-
-.skip
-	call Function2cab5
-	ld b, $5
-.loop
-	inc c
-	ld a, c
-	cp NUM_TMS + NUM_HMS + 1
-	jp nc, Function2c915
-	ld a, [hli]
-	and a
-	jr z, .loop
-	dec b
-	jr nz, .loop
-	ld hl, wTMHMPocketScrollPosition
-	inc [hl]
-	call Function2c9e2
-	jp Function2c946
-
-Function2c9e2: ; 2c9e2 (b:49e2)
-	ld a, [BattleType]
-	cp BATTLETYPE_TUTORIAL
-	jp z, Function2caca
-
-	hlcoord 5, 2
-	lb bc, 10, 15
-	ld a, " "
-	call ClearBox
-	call Function2cab5
-	ld d, $5
-.loop2
-	inc c
-	ld a, c
-	cp NUM_TMS + NUM_HMS + 1
-	jr nc, .NotTMHM
-	ld a, [hli]
-	and a
-	jr z, .loop2
-	ld b, a
-	ld a, c
-	ld [wd265], a
-	push hl
-	push de
-	push bc
-	call Function2ca86
-	push hl
-	ld a, [wd265]
-	cp NUM_TMS + 1
-	jr nc, .HM
-	ld de, wd265
-	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
-	call PrintNum
-	jr .okay
-
-.HM
-	push af
-	sub NUM_TMS
-	ld [wd265], a
-	ld [hl], "H"
-	inc hl
-	ld de, wd265
-	lb bc, PRINTNUM_RIGHTALIGN | 1, 2
-	call PrintNum
-	pop af
-	ld [wd265], a
-.okay
-	predef GetTMHMMove
-	ld a, [wd265]
-	ld [wPutativeTMHMMove], a
-	call GetMoveName
-	pop hl
-	ld bc, $3
-	add hl, bc
-	push hl
-	call PlaceString
-	pop hl
-	pop bc
-	ld a, c
-	push bc
-	cp NUM_TMS + 1
-	jr nc, .hm2
-	ld bc, $1d
-	add hl, bc
-	ld [hl], $f1
-	inc hl
-	ld a, "0" ; why are we doing this?
-	pop bc
-	push bc
-	ld a, b
-	ld [wd265], a
-	ld de, wd265
-	lb bc, 1, 2
-	call PrintNum
-.hm2
-	pop bc
-	pop de
-	pop hl
-	dec d
-	jr nz, .loop2
-	jr .done
-
-.NotTMHM
-	call Function2ca86
-rept 3
-	inc hl
-endr
-	push de
-	ld de, String_2caae
-	call PlaceString
-	pop de
-.done
-	ret
-
-Function2ca86: ; 2ca86 (b:4a86)
-	hlcoord 5, 0
-	ld bc, $28
-	ld a, 6
-	sub d
-	ld e, a
-.loop
-	add hl, bc
-	dec e
-	jr nz, .loop
-	ret
-; 2ca95 (b:4a95)
-
-Function2ca95: ; 2ca95
-	pop hl
-	ld bc, 3
-	add hl, bc
-	predef GetTMHMMove
-	ld a, [wd265]
-	ld [wPutativeTMHMMove], a
-	call GetMoveName
-	push hl
-	call PlaceString
-	pop hl
-	ret
-; 2caae
-
-String_2caae: ; 2caae
-	db "CANCEL@"
-; 2cab5
-
-Function2cab5: ; 2cab5 (b:4ab5)
-	ld hl, TMsHMs
-	ld a, [wTMHMPocketScrollPosition]
-	ld b, a
-	inc b
-	ld c, 0
-.loop
-	inc c
-	ld a, [hli]
-	and a
-	jr z, .loop
-	dec b
-	jr nz, .loop
-	dec hl
-	dec c
-	ret
-
-Function2caca: ; 2caca (b:4aca)
-	hlcoord 9, 3
-	push de
-	ld de, String_2caae
-	call PlaceString
-	pop de
-	ret
-
-Function2cad6: ; 2cad6 (b:4ad6)
-	push de
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	pop de
-	ret
-; 2cadf (b:4adf)
-
-Function2cadf: ; 2cadf
-	call ConvertCurItemIntoCurTMHM
-	call Function2cafa
-	ld hl, UnknownText_0x2caf0
-	jr nc, .asm_2caed
-	ld hl, UnknownText_0x2caf5
-
-.asm_2caed
-	jp PrintText
-; 2caf0
-
-UnknownText_0x2caf0: ; 0x2caf0
-	; You have no room for any more @ S.
-	text_jump UnknownText_0x1c03fa
-	db "@"
-; 0x2caf5
-
-UnknownText_0x2caf5: ; 0x2caf5
-	; You received @ !
-	text_jump UnknownText_0x1c0421
-	db "@"
-; 0x2cafa
-
-Function2cafa: ; 2cafa
-	ld a, [wd265]
-	dec a
-	ld hl, TMsHMs
-	ld b, 0
-	ld c, a
-	add hl, bc
-	ld a, [hl]
-	inc a
-	cp NUM_TMS * 2
-	ret nc
-	ld [hl], a
-	ret
-; 2cb0c
-
-Function2cb0c: ; 2cb0c (b:4b0c)
-	call ConvertCurItemIntoCurTMHM
-	ld a, [wd265]
-	dec a
-	ld hl, TMsHMs
-	ld b, 0
-	ld c, a
-	add hl, bc
-	ld a, [hl]
-	and a
-	ret z
-	dec a
-	ld [hl], a
-	ret nz
-	ld a, [wTMHMPocketScrollPosition]
-	and a
-	ret z
-	dec a
-	ld [wTMHMPocketScrollPosition], a
-	ret
-
-Function2cb2a: ; 2cb2a (b:4b2a)
-	ld b, $0
-	ld c, $39
-	ld hl, TMsHMs
-.asm_2cb31
-	ld a, [hli]
-	and a
-	jr z, .asm_2cb36
-	inc b
-.asm_2cb36
-	dec c
-	jr nz, .asm_2cb31
-	ld a, b
-	ld [wd265], a
-	ret
-
-
-PrintMoveDesc: ; 2cb3e
-	push hl
-	ld hl, MoveDescriptions
-	ld a, [CurSpecies]
-	dec a
-	ld c, a
-	ld b, 0
-rept 2
-	add hl, bc
-endr
-	ld a, [hli]
-	ld e, a
-	ld d, [hl]
-	pop hl
-	jp PlaceString
-; 2cb52
-
 MoveDescriptions:: ; 2cb52
 INCLUDE "battle/moves/move_descriptions.asm"
 ; 2ed44
 
-
 Function2ed44: ; 2ed44
 	call ConvertBerriesToBerryJuice
 	ld hl, PartyMon1PokerusStatus
@@ -12780,7 +11285,6 @@
 	ret
 ; 2ee2f
 
-
 FindFirstAliveMon: ; 2ee2f
 	xor a
 	ld [hMapAnims], a
@@ -12816,7 +11320,6 @@
 	ret
 ; 2ee6c
 
-
 PlayBattleMusic: ; 2ee6c
 
 	push hl
@@ -12919,7 +11422,6 @@
 	ret
 ; 2ef18
 
-
 ClearBattleRAM: ; 2ef18
 	xor a
 	ld [wd0ec], a
@@ -12971,7 +11473,6 @@
 	ret
 ; 2ef6e
 
-
 FillBox: ; 2ef6e
 ; Fill wc2c6-aligned box width b height c
 ; with iterating tile starting from hFillBox at hl.
@@ -13030,17 +11531,14 @@
 	ret
 ; 2ef9f
 
-
 SECTION "Tileset Data 4", ROMX, BANK[TILESETS_4]
 
 INCLUDE "tilesets/data_4.asm"
 
-
 SECTION "Effect Commands", ROMX, BANK[$D]
 
 INCLUDE "battle/effect_commands.asm"
 
-
 SECTION "Enemy Trainers", ROMX, BANK[$E]
 
 INCLUDE "battle/ai/items.asm"
@@ -13048,7 +11546,6 @@
 AIScoring: ; 38591
 INCLUDE "battle/ai/scoring.asm"
 
-
 GetTrainerClassName: ; 3952d
 	ld hl, RivalName
 	ld a, c
@@ -13125,7 +11622,6 @@
 
 INCLUDE "trainers/trainers.asm"
 
-
 SECTION "Battle Core", ROMX, BANK[$F]
 
 INCLUDE "battle/core.asm"
@@ -13132,10 +11628,8 @@
 
 INCLUDE "battle/effect_command_pointers.asm"
 
-
 SECTION "bank10", ROMX, BANK[$10]
 
-
 INCLUDE "engine/pokedex.asm"
 
 INCLUDE "battle/moves/moves.asm"
@@ -13190,7 +11684,6 @@
 	db -2
 ; 44207
 
-
 DoDexSearchSlowpokeFrame: ; 44207
 	ld a, [wDexSearchSlowpokeFrame]
 	ld hl, .SpriteData
@@ -13447,7 +11940,6 @@
 	ret
 ; 44378
 
-
 PokedexDataPointerTable: ; 0x44378
 INCLUDE "data/pokedex/entry_pointers.asm"
 
@@ -13571,7 +12063,6 @@
 GFX_48e71: ; 48e71
 INCBIN "gfx/unknown/048e71.2bpp"
 
-
 DrawKrisPackGFX: ; 48e81
 	ld hl, PackFGFXPointers
 rept 2
@@ -13606,54 +12097,52 @@
 	call GetSGBLayout
 	xor a
 	ld [wItemAttributeParamBuffer], a
-	call Function492a5
+	call .GetMoveTutorMove
 	ld [wd265], a
 	ld [wPutativeTMHMMove], a
 	call GetMoveName
 	call CopyName1
-	callba Function2c7fb
-	jr c, .asm_4929c
-	jr .asm_49291
+	callba ChooseMonToLearnTMHM
+	jr c, .cancel
+	jr .enter_loop
 
-.asm_49289
-	callba Function2c80a
-	jr c, .asm_4929c
-
-.asm_49291
-	call Function492b9
-	jr nc, .asm_49289
+.loop
+	callba ChooseMonToLearnTMHM_NoRefresh
+	jr c, .cancel
+.enter_loop
+	call CheckCanLearnMoveTutorMove
+	jr nc, .loop
 	xor a
 	ld [ScriptVar], a
-	jr .asm_492a1
+	jr .quit
 
-.asm_4929c
-	ld a, $ff
+.cancel
+	ld a, -1
 	ld [ScriptVar], a
-
-.asm_492a1
+.quit
 	call CloseSubmenu
 	ret
 ; 492a5
 
-Function492a5: ; 492a5
+.GetMoveTutorMove: ; 492a5
 	ld a, [ScriptVar]
-	cp $1
-	jr z, .asm_492b3
-	cp $2
-	jr z, .asm_492b6
+	cp 1
+	jr z, .flamethrower
+	cp 2
+	jr z, .thunderbolt
 	ld a, ICE_BEAM
 	ret
 
-.asm_492b3
+.flamethrower
 	ld a, FLAMETHROWER
 	ret
 
-.asm_492b6
+.thunderbolt
 	ld a, THUNDERBOLT
 	ret
 ; 492b9
 
-Function492b9: ; 492b9
+CheckCanLearnMoveTutorMove: ; 492b9
 	ld hl, MenuDataHeader_0x4930a
 	call LoadMenuDataHeader
 
@@ -13672,12 +12161,12 @@
 	ld de, SFX_WRONG
 	call PlaySFX
 	pop de
-	ld a, BANK(UnknownText_0x2c8ce)
-	ld hl, UnknownText_0x2c8ce
+	ld a, BANK(Text_TMHMNotCompatible)
+	ld hl, Text_TMHMNotCompatible
 	call FarPrintText
 	jr .didnt_learn
-.can_learn
 
+.can_learn
 	callab KnowsMove
 	jr c, .didnt_learn
 
@@ -13754,7 +12243,6 @@
 	ret
 ; 49346
 
-
 Function49346: ; 49346 (12:5346)
 	hlcoord 0, 0, AttrMap
 	ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
@@ -13848,7 +12336,6 @@
 	RGB 00, 00, 00
 ; 49409
 
-
 Function49409:: ; 49409
 	ld hl, Palette_49418
 	ld de, UnknBGPals + 8 * 7
@@ -14401,7 +12888,6 @@
 	ret
 ; 4ae78
 
-
 SECTION "bank13", ROMX, BANK[$13]
 
 SwapTextboxPalettes:: ; 4c000
@@ -14493,10 +12979,8 @@
 	ret
 ; 4c075
 
-
 INCLUDE "tilesets/palette_maps.asm"
 
-
 TileCollisionTable:: ; 4ce1f
 ; 00 land
 ; 01 water
@@ -14563,7 +13047,6 @@
 	ret
 ; 4cf45
 
-
 SaveMenu_LoadEDTile: ; 4cf45 (13:4f45)
 	ld a, [hCGB]
 	and a
@@ -14642,7 +13125,6 @@
 	ld sp, hl
 	ret
 
-
 CheckSave:: ; 4cffe
 	ld a, BANK(s1_a008)
 	call GetSRAMBank
@@ -14665,10 +13147,8 @@
 	ret
 ; 4d01e
 
-
 INCLUDE "engine/map_triggers.asm"
 
-
 Function4d15b:: ; 4d15b
 	ld hl, wc608
 	ld a, [wd196]
@@ -14824,7 +13304,6 @@
 	ret
 ; 4d35b
 
-
 Function4d35b: ; 4d35b
 	ld h, d
 	ld l, e
@@ -15219,7 +13698,6 @@
 Tilesets::
 INCLUDE "tilesets/tileset_headers.asm"
 
-
 FlagPredef: ; 4d7c1
 ; Perform action b on flag c in flag array hl.
 ; If checking a flag, check flag array d:hl unless d is 0.
@@ -15749,7 +14227,6 @@
 	ret
 ; 4db3b
 
-
 GiveANickname_YesNo: ; 4db3b
 	ld hl, TextJump_GiveANickname
 	call PrintText
@@ -15762,7 +14239,6 @@
 	db "@"
 ; 0x4db49
 
-
 SetCaughtData: ; 4db49
 	ld a, [PartyCount]
 	dec a
@@ -15839,7 +14315,6 @@
 	ret
 ; 4dbb8
 
-
 SetEggMonCaughtData: ; 4dbb8 (13:5bb8)
 	ld a, [CurPartyMon]
 	ld hl, PartyMon1CaughtLevel
@@ -15996,7 +14471,6 @@
 	jr .loop
 ; 4dc7b
 
-
 INCLUDE "engine/stats_screen.asm"
 
 CatchTutorial:: ; 4e554
@@ -16056,26 +14530,26 @@
 	ret
 
 .LoadDudeData: ; 4e5b7 (13:65b7)
-	ld hl, OTPartyMon1
-	ld [hl], BULBASAUR
+	ld hl, wDudeNumItems
+	ld [hl], 1
 	inc hl
 	ld [hl], POTION
 	inc hl
-	ld [hl], POUND
+	ld [hl], 1
 	inc hl
-	ld [hl], $ff
-	ld hl, OTPartyMon1Exp + 2
-	ld [hl], $0
+	ld [hl], -1
+	ld hl, wDudeNumKeyItems
+	ld [hl], 0
 	inc hl
-	ld [hl], $ff
-	ld hl, OTPartyMon1CaughtGender
-	ld a, $1
+	ld [hl], -1
+	ld hl, wDudeNumBalls
+	ld a, 1
 	ld [hli], a
-	ld a, $5
+	ld a, POKE_BALL ; 5
 rept 2
 	ld [hli], a
 endr
-	ld [hl], $ff
+	ld [hl], -1
 	ret
 ; 4e5da (13:65da)
 
@@ -16121,7 +14595,6 @@
 	db "@"
 ; 0x4e8c2
 
-
 Function4e8c2: ; 4e8c2
 	call ClearBGPalettes
 	call ClearTileMap
@@ -16174,7 +14647,6 @@
 	ret
 ; 4e929
 
-
 Function4e929: ; mobile function
 	ld h, b
 	ld l, c
@@ -16265,10 +14737,8 @@
 FemaleTrainersEnd:
 ; 4e980
 
-
 INCLUDE "battle/sliding_intro.asm"
 
-
 Function4ea0a: ; 4ea0a
 	ld a, c
 	push af
@@ -16301,8 +14771,6 @@
 	ret
 ; 4ea44
 
-
-
 CheckBattleScene: ; 4ea44
 ; Return carry if battle scene is turned off.
 
@@ -16352,12 +14820,10 @@
 	ret
 ; 4ea82
 
-
 INCLUDE "misc/gbc_only.asm"
 
 INCLUDE "event/poke_seer.asm"
 
-
 SECTION "bank14", ROMX, BANK[$14]
 
 INCLUDE "engine/party_menu.asm"
@@ -16403,7 +14869,6 @@
 	ret
 ; 5088b
 
-
 Function5088b: ; 5088b
 	ld bc, wd018_Mon
 	jr Function50893
@@ -16504,10 +14969,8 @@
 	ret
 ; 5090d
 
-
 INCLUDE "text/types.asm"
 
-
 Function50a28: ; 50a28
 	ld hl, Strings50a42
 	ld a, [TrainerClass]
@@ -16604,7 +15067,6 @@
 .CooltrainerF db "エりート♀@"
 ; 50b0a
 
-
 DrawPlayerHP: ; 50b0a
 	ld a, $1
 	jr DrawHP
@@ -16689,7 +15151,6 @@
 	ret
 ; 50b7b
 
-
 PrintTempMonStats: ; 50b7b
 ; Print TempMon's stats at hl, with spacing bc.
 	push bc
@@ -16732,7 +15193,6 @@
 	next "@"
 ; 50bdd
 
-
 GetGender: ; 50bdd
 ; Return the gender of a given monster (CurPartyMon/CurOTMon/CurWildMon).
 ; When calling this function, a should be set to an appropriate MonType value.
@@ -16745,7 +15205,6 @@
 ; This is determined by comparing the Attack and Speed DVs
 ; with the species' gender ratio.
 
-
 ; Figure out what type of monster struct we're looking at.
 
 ; 0: PartyMon
@@ -16775,7 +15234,6 @@
 	ld hl, EnemyMonDVs
 	jr .DVs
 
-
 ; Get our place in the party/box.
 
 .PartyMon
@@ -16783,7 +15241,6 @@
 	ld a, [CurPartyMon]
 	call AddNTimes
 
-
 .DVs
 
 ; sBoxMon data is read directly from SRAM.
@@ -16810,7 +15267,6 @@
 	cp BOXMON
 	call z, CloseSRAM
 
-
 ; We need the gender ratio to do anything with this.
 	push bc
 	ld a, [CurPartySpecies]
@@ -16823,7 +15279,6 @@
 	ld a, BANK(BaseData)
 	call GetFarByte
 
-
 ; The higher the ratio, the more likely the monster is to be female.
 
 	cp $ff
@@ -16985,7 +15440,6 @@
 	ret
 ; 50d0a
 
-
 PlaceStatusString: ; 50d0a
 	push de
 rept 2
@@ -17171,7 +15625,6 @@
 	ret
 ; 50e1b
 
-
 CalcLevel: ; 50e1b
 	ld a, [TempMonSpecies]
 	ld [CurSpecies], a
@@ -17205,8 +15658,6 @@
 	ret
 ; 50e47
 
-
-
 CalcExpAtLevel: ; 50e47
 ; (a/b)*n**3 + c*n**2 + d*n - e
 	ld a, [BaseGrowthRate]
@@ -17557,7 +16008,6 @@
 	ret
 ; 51077
 
-
 GetFrontpic: ; 51077
 	ld a, [CurPartySpecies]
 	ld [CurSpecies], a
@@ -17765,7 +16215,6 @@
 	ret
 ; 511c5
 
-
 FixPicBank: ; 511c5
 ; This is a thing for some reason.
 	push hl
@@ -17827,7 +16276,6 @@
 	ret
 ; 0x5120d
 
-
 GetTrainerPic: ; 5120d
 	ld a, [TrainerClass]
 	and a
@@ -17871,8 +16319,6 @@
 	ret
 ; 5125d
 
-
-
 DecompressPredef: ; 5125d
 ; Decompress lz data from b:hl to scratch space at 6:d000, then copy it to address de.
 
@@ -17898,7 +16344,6 @@
 	ret
 ; 5127c
 
-
 Function5127c: ; 5127c
 	push de
 	push bc
@@ -18182,16 +16627,12 @@
 INCBIN "gfx/misc/unknown_egg.5x5.2bpp.lz"
 ; 53e2e
 
-
 SECTION "bank19", ROMX, BANK[$19]
 
 INCLUDE "text/phone/extra.asm"
 
-
-
 SECTION "bank20", ROMX, BANK[$20]
 
-
 DoPlayerMovement:: ; 80000
 
 	call GetMovementInput
@@ -18206,7 +16647,6 @@
 	ret
 ; 80017
 
-
 GetMovementInput: ; 80017
 
 	ld a, [hJoyDown]
@@ -18228,7 +16668,6 @@
 	ret
 ; 8002d
 
-
 GetPlayerMovement: ; 8002d
 
 	ld a, [PlayerState]
@@ -18312,7 +16751,6 @@
 	ret
 ; 800b7
 
-
 CheckTileMovement: ; 800b7
 ; Tiles such as waterfalls and warps move the player
 ; in a given direction, overriding input.
@@ -18428,7 +16866,6 @@
 	ret
 ; 80147
 
-
 CheckTurning: ; 80147
 ; If the player is turning, change direction first. This also lets
 ; the player change facing without moving by tapping a direction.
@@ -18459,7 +16896,6 @@
 	ret
 ; 8016b
 
-
 TryStep: ; 8016b
 
 ; Surfing actually calls TrySurfStep directly instead of passing through here.
@@ -18526,7 +16962,6 @@
 	ret
 ; 801c0
 
-
 TrySurfStep: ; 801c0
 
 	call CheckWaterPermissions
@@ -18563,7 +16998,6 @@
 	ret
 ; 801f3
 
-
 TryJumpLedge: ; 801f3
 	ld a, [PlayerNextTile]
 	ld e, a
@@ -18604,7 +17038,6 @@
 	db FACE_UP | FACE_LEFT
 ; 80226
 
-
 CheckEdgeWarp: ; 80226
 
 ; Bug: Since no case is made for STANDING here, it will check
@@ -18650,7 +17083,6 @@
 	db $70, $78, $76, $7e
 ; 8025f
 
-
 DoStep: ; 8025f
 	ld e, a
 	ld d, 0
@@ -18731,7 +17163,6 @@
 	db $80 + movement_turn_head_right
 ; 802b3
 
-
 StandInPlace: ; 802b3
 	ld a, 0
 	ld [wd04e], a
@@ -18741,7 +17172,6 @@
 	ret
 ; 802bf
 
-
 WalkInPlace: ; 802bf
 	ld a, 0
 	ld [wd04e], a
@@ -18751,7 +17181,6 @@
 	ret
 ; 802cb
 
-
 CheckForcedMovementInput: ; 802cb
 ; When sliding on ice, input is forced to remain in the same direction.
 
@@ -18777,7 +17206,6 @@
 	db D_DOWN, D_UP, D_LEFT, D_RIGHT
 ; 802ec
 
-
 GetMovementAction: ; 802ec
 ; Poll player input and update movement info.
 
@@ -18837,7 +17265,6 @@
 	dw TileDown
 ; 80341
 
-
 IsNPCInFront: ; 80341
 ; Returns 0 if there is an NPC in front that you can't move
 ; Returns 1 if there is no NPC in front
@@ -18876,7 +17303,6 @@
 	ret
 ; 8036f
 
-
 Function8036f: ; 8036f
 
 	ld hl, BikeFlags
@@ -18915,7 +17341,6 @@
 	ret
 ; 8039e
 
-
 CheckLandPermissions: ; 8039e
 ; Return 0 if walking onto land and tile permissions allow it.
 ; Otherwise, return carry.
@@ -18960,7 +17385,6 @@
 	ret
 ; 803ca
 
-
 CheckRiding: ; 803ca
 
 	ld a, [PlayerState]
@@ -18970,7 +17394,6 @@
 	ret
 ; 803d3
 
-
 CheckWalkable: ; 803d3
 ; Return 0 if tile a is land. Otherwise, return carry.
 
@@ -18981,7 +17404,6 @@
 	ret
 ; 803da
 
-
 CheckSurfable: ; 803da
 ; Return 0 if tile a is water, or 1 if land.
 ; Otherwise, return carry.
@@ -19010,7 +17432,6 @@
 	ret
 ; 803ee
 
-
 PlayBump: ; 803ee
 
 	call CheckSFX
@@ -19020,7 +17441,6 @@
 	ret
 ; 803f9
 
-
 WaterToLandSprite: ; 803f9
 	push bc
 	ld a, PLAYER_NORMAL
@@ -19030,7 +17450,6 @@
 	ret
 ; 80404
 
-
 CheckStandingOnIce:: ; 80404
 	ld a, [wd04e]
 	cp 0
@@ -19053,7 +17472,6 @@
 	ret
 ; 80422
 
-
 Function80422:: ; 80422
 	ld hl, wc2de
 	ld a, movement_step_sleep_1
@@ -19066,8 +17484,6 @@
 	ret
 ; 80430
 
-
-
 INCLUDE "engine/engine_flags.asm"
 ; 80648
 
@@ -19272,7 +17688,6 @@
 INCBIN "gfx/misc/trainer_card.2bpp"
 ; 88825
 
-
 GetPlayerBackpic: ; 88825
 	ld a, [PlayerGender]
 	bit 0, a
@@ -19319,8 +17734,6 @@
 	ret
 ; 88874
 
-
-
 DrawIntroPlayerPic: ; 88874
 ; Draw the player pic at (6,4).
 
@@ -19355,7 +17768,6 @@
 	ret
 ; 888a9
 
-
 ChrisPic: ; 888a9
 INCBIN "gfx/misc/chris.7x7.2bpp"
 ; 88bb9
@@ -19364,7 +17776,6 @@
 INCBIN "gfx/misc/kris.7x7.2bpp"
 ; 88ec9
 
-
 GetKrisBackpic: ; 88ec9
 ; Kris's backpic is uncompressed.
 	ld de, KrisBackpic
@@ -19378,7 +17789,6 @@
 INCBIN "gfx/misc/kris_back.6x6.2bpp"
 ; 89116
 
-
 String_89116:
 	db "-----@"
 ; 8911c
@@ -19390,7 +17800,6 @@
 INCLUDE "event/battle_tower.asm"
 INCLUDE "misc/mobile_22_2.asm"
 
-
 SECTION "bank23", ROMX, BANK[$23]
 
 Predef35: ; 8c000
@@ -19398,7 +17807,6 @@
 	ret
 ; 8c001
 
-
 INCLUDE "engine/timeofdaypals.asm"
 INCLUDE "engine/battle_start.asm"
 
@@ -19432,13 +17840,11 @@
 INCLUDE "data/wild/fish.asm"
 INCLUDE "engine/slot_machine.asm"
 
-
 SECTION "Phone Engine", ROMX, BANK[$28]
 
 INCLUDE "engine/more_phone_scripts.asm"
 INCLUDE "engine/buena_phone_scripts.asm"
 
-
 SECTION "Phone Text", ROMX, BANK[$29]
 
 INCLUDE "text/phone/anthony_overworld.asm"
@@ -19463,7 +17869,6 @@
 
 INCLUDE "tilesets/data_5.asm"
 
-
 SECTION "bank2E", ROMX, BANK[$2E]
 
 INCLUDE "engine/events_3.asm"
@@ -19513,8 +17918,6 @@
 	scripttalkafter
 ; 0xbe699
 
-
-
 SECTION "bank30", ROMX, BANK[$30]
 
 INCLUDE "gfx/overworld/sprites_1.asm"
@@ -19523,7 +17926,6 @@
 
 INCLUDE "gfx/overworld/sprites_2.asm"
 
-
 SECTION "bank32", ROMX, BANK[$32]
 
 INCLUDE "battle/bg_effects.asm"
@@ -19585,7 +17987,6 @@
 INCBIN "gfx/credits/theend.2bpp"
 ; cbe2e
 
-
 SECTION "bank33", ROMX, BANK[$33]
 
 DisplayCaughtContestMonStats: ; cc000
@@ -19702,12 +18103,10 @@
 	ret
 ; cc0d6
 
-
 INCLUDE "battle/anim_commands.asm"
 
 INCLUDE "battle/anim_objects.asm"
 
-
 SECTION "Pic Animations 1", ROMX, BANK[$34]
 
 INCLUDE "gfx/pics/animation.asm"
@@ -19748,18 +18147,15 @@
 INCLUDE "gfx/pics/unown_bitmask_pointers.asm"
 INCLUDE "gfx/pics/unown_bitmasks.asm"
 
-
 SECTION "Pic Animations 2", ROMX, BANK[$35]
 
 INCLUDE "gfx/pics/frame_pointers.asm"
 INCLUDE "gfx/pics/kanto_frames.asm"
 
-
 SECTION "bank36", ROMX, BANK[$36]
 
 FontInversed: INCBIN "gfx/misc/font_inversed.1bpp"
 
-
 SECTION "Pic Animations 3", ROMX, BANK[$36]
 
 INCLUDE "gfx/pics/johto_frames.asm"
@@ -19766,12 +18162,10 @@
 INCLUDE "gfx/pics/unown_frame_pointers.asm"
 INCLUDE "gfx/pics/unown_frames.asm"
 
-
 SECTION "Tileset Data 6", ROMX, BANK[TILESETS_6]
 
 INCLUDE "tilesets/data_6.asm"
 
-
 SECTION "bank38", ROMX, BANK[$38]
 
 Functione0000: ; e0000
@@ -19936,7 +18330,6 @@
 
 INCLUDE "misc/mobile_40.asm"
 
-
 SECTION "bank41", ROMX, BANK[$41]
 
 INCLUDE "misc/gfx_41.asm"
@@ -19951,7 +18344,6 @@
 
 INCLUDE "misc/mobile_42.asm"
 
-
 SECTION "Intro Logo", ROMX, BANK[$42]
 
 IntroLogoGFX: ; 109407
@@ -19958,13 +18350,10 @@
 INCBIN "gfx/intro/logo.2bpp.lz"
 ; 109847
 
-
 INCLUDE "misc/unused_title.asm"
 
-
 INCLUDE "engine/title.asm"
 
-
 INCLUDE "misc/mobile_45.asm"
 INCLUDE "misc/mobile_46.asm"
 
@@ -19984,7 +18373,6 @@
 
 INCLUDE "text/phone/extra3.asm"
 
-
 SECTION "bank5E", ROMX, BANK[$5E]
 
 _UpdateBattleHUDs:
@@ -19998,10 +18386,8 @@
 	ret
 ; 17801f (5e:401f)
 
-
 INCLUDE "misc/mobile_5f.asm"
 
-
 SECTION "Common Text 1", ROMX, BANK[$6C]
 
 INCLUDE "text/common.asm"
@@ -20024,23 +18410,18 @@
 INCLUDE "text/phone/elm.asm"
 INCLUDE "text/phone/trainers1.asm"
 
-
-
 SECTION "Common Text 2", ROMX, BANK[$6F]
 
 INCLUDE "text/common_2.asm"
 
-
 SECTION "Common Text 3", ROMX, BANK[$70]
 
 INCLUDE "text/common_3.asm"
 
-
 SECTION "Common Text 4", ROMX, BANK[$71]
 
 INCLUDE "text/common_4.asm"
 
-
 SECTION "bank72", ROMX, BANK[$72]
 
 ItemNames::
@@ -20053,13 +18434,10 @@
 
 INCLUDE "engine/landmarks.asm"
 
-
 SECTION "bank75", ROMX, BANK[$75]
 
-
 SECTION "bank76", ROMX, BANK[$76]
 
-
 SECTION "bank77", ROMX, BANK[$77]
 
 UnownFont: ; 1dc000
@@ -20074,14 +18452,10 @@
 MobileLvIcon: ; 1dc599
 INCBIN "gfx/mobile/lv.1bpp"
 
-
-
 SECTION "Tileset Data 7", ROMX, BANK[TILESETS_7]
 
 INCLUDE "tilesets/data_7.asm"
 
-
-
 SECTION "bank77_2", ROMX, BANK[$77]
 
 Function1dd6a9: ; 1dd6a9
@@ -20151,10 +18525,8 @@
 String_PM: db "PM@" ; 1dd6ff
 ; 1dd702
 
-
 INCLUDE "engine/diploma.asm"
 
-
 LoadSGBPokedexGFX: ; 1ddf1c
 	ld hl, LZ_1ddf33
 	ld de, VTiles2 tile $31
@@ -20326,8 +18698,6 @@
 	ret
 ; 1de28a
 
-
-
 _DudeAutoInput_A:: ; 1de28a
 	ld hl, DudeAutoInput_A
 	jr _DudeAutoInput
@@ -20349,7 +18719,6 @@
 	ret
 ; 1de29f
 
-
 DudeAutoInputs:
 
 DudeAutoInput_A: ; 1de29f
@@ -20380,7 +18749,6 @@
 	db NO_INPUT, $ff ; end
 ; 1de2c5
 
-
 Function1de2c5: ; 1de2c5
 	ld hl, StringBuffer1
 .loop
@@ -20542,28 +18910,22 @@
 	ret
 ; 1df238
 
-
 SECTION "Tileset Data 8", ROMX, BANK[TILESETS_8]
 
 INCLUDE "tilesets/data_8.asm"
 
-
 SECTION "bank79", ROMX, BANK[$79]
 
-
 SECTION "bank7A", ROMX, BANK[$7A]
 
-
 SECTION "bank7B", ROMX, BANK[$7B]
 
 INCLUDE "text/battle_tower.asm"
 
-
 SECTION "bank7C", ROMX, BANK[$7C]
 
 INCLUDE "data/battle_tower_2.asm"
 
-
 SECTION "bank7D", ROMX, BANK[$7D]
 
 	db $cc, $6b, $1e ; XXX
@@ -20610,15 +18972,12 @@
 Unknown_1f5db4:
 INCBIN "unknown/1f5db4.bin"
 
-
 SECTION "bank7E", ROMX, BANK[$7E]
 
 INCLUDE "data/battle_tower.asm"
 INCLUDE "data/odd_eggs.asm"
 
-
 SECTION "bank7F", ROMX, BANK[$7F]
-
 
 SECTION "stadium2", ROMX[$8000-$220], BANK[$7F]
 
--- a/misc/mobile_22.asm
+++ b/misc/mobile_22.asm
@@ -1694,7 +1694,7 @@
 
 Function89a8a: ; 89a8a
 	push af
-	ld de, SFX_UNKNOWN_62
+	ld de, SFX_SWITCH_POCKETS
 	call PlaySFX
 	pop af
 	ret
--- /dev/null
+++ b/text/trainer_class_names.asm
@@ -1,0 +1,67 @@
+	db "LEADER@"
+	db "LEADER@"
+	db "LEADER@"
+	db "LEADER@"
+	db "LEADER@"
+	db "LEADER@"
+	db "LEADER@"
+	db "LEADER@"
+	db "RIVAL@"
+	db "#MON PROF.@"
+	db "ELITE FOUR@"
+	db "<PKMN> TRAINER@"
+	db "ELITE FOUR@"
+	db "ELITE FOUR@"
+	db "ELITE FOUR@"
+	db "CHAMPION@"
+	db "LEADER@"
+	db "LEADER@"
+	db "LEADER@"
+	db "SCIENTIST@"
+	db "LEADER@"
+	db "YOUNGSTER@"
+	db "SCHOOLBOY@"
+	db "BIRD KEEPER@"
+	db "LASS@"
+	db "LEADER@"
+	db "COOLTRAINER@"
+	db "COOLTRAINER@"
+	db "BEAUTY@"
+	db "#MANIAC@"
+	db "ROCKET@"
+	db "GENTLEMAN@"
+	db "SKIER@"
+	db "TEACHER@"
+	db "LEADER@"
+	db "BUG CATCHER@"
+	db "FISHER@"
+	db "SWIMMER♂@"
+	db "SWIMMER♀@"
+	db "SAILOR@"
+	db "SUPER NERD@"
+	db "RIVAL@"
+	db "GUITARIST@"
+	db "HIKER@"
+	db "BIKER@"
+	db "LEADER@"
+	db "BURGLAR@"
+	db "FIREBREATHER@"
+	db "JUGGLER@"
+	db "BLACKBELT@"
+	db "ROCKET@"
+	db "PSYCHIC@"
+	db "PICNICKER@"
+	db "CAMPER@"
+	db "ROCKET@"
+	db "SAGE@"
+	db "MEDIUM@"
+	db "BOARDER@"
+	db "#FAN@"
+	db "KIMONO GIRL@"
+	db "TWINS@"
+	db "#FAN@"
+	db "<PKMN> TRAINER@"
+	db "LEADER@"
+	db "OFFICER@"
+	db "ROCKET@"
+	db "MYSTICALMAN@"
\ No newline at end of file
--- a/wram.asm
+++ b/wram.asm
@@ -1471,6 +1471,7 @@
 ; something to do with menu
 wcf71:: ds 1
 wcf72:: ds 1
+wMenuJoypad::
 wcf73:: ds 1
 MenuSelection:: ; cf74
 	ds 1
@@ -1477,6 +1478,7 @@
 
 wcf75:: ds 1
 wcf76:: ds 1
+wCurrPocketCursorPosition::
 wcf77:: ds 1
 wcf78:: ds 9
 
@@ -1506,10 +1508,15 @@
 ; bit 0: ????
 
 wMenuData2Items:: ds 1
+wMenuData2IndicesPointer::
 wcf93:: ds 1
 wcf94:: ds 1
+wMenuData2DisplayFunctionPointer::
+wMenuData2Bank::
 wcf95:: ds 1 ; bank
+wMenuData2Addr::
 wcf96:: ds 1 ; addr lo
+wMenuData2PointerTableAddr::
 wcf97:: ds 1 ; addr hi
 wcf98:: ds 3
 wcf9b:: ds 3
@@ -1622,7 +1629,7 @@
 wHoursSince:: ds 1
 wDaysSince:: ds 1
 
-	ds 40
+wRAM0End:: ; cfc0
 
 
 SECTION "WRAM 1", WRAMX, BANK [1]
@@ -1851,6 +1858,7 @@
 wTMHMPocketScrollPosition:: ds 1
 wMoveSwapBuffer::
 wSwitchMon::
+wSwitchItem::
 wd0e3:: ds 1
 wMenuScrollPosition:: ds 4
 wQueuedScriptBank:: ds 1
@@ -1858,6 +1866,7 @@
 wNumMoves::
 wd0eb:: ds 1
 wFieldMoveSucceeded::
+wItemEffectSucceeded::
 wPlayerAction::
 ; 0 - use move
 ; 1 - use item
@@ -2284,6 +2293,21 @@
 OTPartyCount::   ds 1 ; d280
 OTPartySpecies:: ds PARTY_LENGTH ; d281
 OTPartyEnd::     ds 1
+
+wDudeBag:: ; d288
+wDudeNumItems:: ds 1
+wDudeItems:: ds 2 * 4
+wDudeItemsEnd:: ds 1
+
+wDudeNumKeyItems:: ds 1 ; d292
+wDudeKeyItems:: ds 18
+wDudeKeyItemsEnd:: ds 1
+
+wDudeNumBalls:: ds 1 ; d2a6
+wDudeBalls:: ds 2 * 4
+wDudeBallsEnd:: ds 1
+wDudeBagEnd::
+	ds wDudeBag - @
 
 OTPartyMons::
 OTPartyMon1:: party_struct OTPartyMon1 ; d288