shithub: pokecrystal

Download patch

ref: 259c155187fc84c5d884442555e7324edde8f0be
parent: acd92eee94f0c8a7e0757ce2a1f486f08a4a9ad7
author: PikalaxALT <PikalaxALT@gmail.com>
date: Sun Dec 13 12:11:58 EST 2015

Pack; buy, sell, toss

--- /dev/null
+++ b/battle/menu.asm
@@ -1,0 +1,118 @@
+LoadBattleMenu: ; 24ef2
+	ld hl, BattleMenuDataHeader
+	call LoadMenuDataHeader
+	ld a, [wd0d2]
+	ld [wMenuCursorBuffer], a
+	call Function2039
+	ld a, [wMenuCursorBuffer]
+	ld [wd0d2], a
+	call ExitMenu
+	ret
+; 24f0b
+
+SafariBattleMenu: ; 24f0b
+; untranslated
+	ld hl, MenuDataHeader_0x24f4e
+	call LoadMenuDataHeader
+	jr Function24f19
+; 24f13
+
+ContestBattleMenu: ; 24f13
+	ld hl, MenuDataHeader_0x24f89
+	call LoadMenuDataHeader
+; 24f19
+
+Function24f19: ; 24f19
+	ld a, [wd0d2]
+	ld [wMenuCursorBuffer], a
+	call InterpretMenu
+	ld a, [wMenuCursorBuffer]
+	ld [wd0d2], a
+	call ExitMenu
+	ret
+; 24f2c
+
+BattleMenuDataHeader: ; 24f2c
+	db $40 ; flags
+	db 12, 08 ; start coords
+	db 17, 19 ; end coords
+	dw MenuData_0x24f34
+	db 1 ; default option
+; 24f34
+
+MenuData_0x24f34: ; 0x24f34
+	db $81 ; flags
+	dn 2, 2 ; rows, columns
+	db 6 ; spacing
+	dba Strings24f3d
+	dbw BANK(MenuData_0x24f34), 0
+; 0x24f3d
+
+Strings24f3d: ; 0x24f3d
+	db "FIGHT@"
+	db "<PKMN>@"
+	db "PACK@"
+	db "RUN@"
+; 24f4e
+
+MenuDataHeader_0x24f4e: ; 24f4e
+	db $40 ; flags
+	db 12, 00 ; start coords
+	db 17, 19 ; end coords
+	dw MenuData_0x24f56
+	db 1 ; default option
+; 24f56
+
+MenuData_0x24f56: ; 24f56
+	db $81 ; flags
+	dn 2, 2 ; rows, columns
+	db 11 ; spacing
+	dba Strings24f5f
+	dba Function24f7c
+; 24f5f
+
+Strings24f5f: ; 24f5f
+	db "サファりボール×  @" ; "SAFARI BALL×  @"
+	db "エサをなげる@" ; "THROW BAIT"
+	db "いしをなげる@" ; "THROW ROCK"
+	db "にげる@" ; "RUN"
+; 24f7c
+
+Function24f7c: ; 24f7c
+	hlcoord 17, 13
+	ld de, wSafariBallsRemaining
+	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+	call PrintNum
+	ret
+; 24f89
+
+MenuDataHeader_0x24f89: ; 24f89
+	db $40 ; flags
+	db 12, 02 ; start coords
+	db 17, 19 ; end coords
+	dw MenuData_0x24f91
+	db 1 ; default option
+; 24f91
+
+MenuData_0x24f91: ; 24f91
+	db $81 ; flags
+	dn 2, 2 ; rows, columns
+	db 12 ; spacing
+	dba Strings24f9a
+	dba Function24fb2
+; 24f9a
+
+Strings24f9a: ; 24f9a
+	db "FIGHT@"
+	db "<PKMN>", "@"
+	db "PARKBALL×  @"
+	db "RUN@"
+; 24fb2
+
+Function24fb2: ; 24fb2
+	hlcoord 13, 16
+	ld de, wParkBallsRemaining
+	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+	call PrintNum
+	ret
+; 24fbf
--- /dev/null
+++ b/engine/buy_sell_toss.asm
@@ -1,0 +1,238 @@
+SelectQuantityToToss: ; 24fbf
+	ld hl, TossItem_MenuDataHeader
+	call LoadMenuDataHeader
+	call Toss_Sell_Loop
+	ret
+; 24fc9
+
+SelectQuantityToBuy: ; 24fc9
+	callba GetItemPrice
+RooftopSale_SelectQuantityToBuy: ; 24fcf
+	ld a, d
+	ld [Buffer1], a
+	ld a, e
+	ld [Buffer2], a
+	ld hl, BuyItem_MenuDataHeader
+	call LoadMenuDataHeader
+	call Toss_Sell_Loop
+	ret
+; 24fe1
+
+SelectQuantityToSell: ; 24fe1
+	callba GetItemPrice
+	ld a, d
+	ld [Buffer1], a
+	ld a, e
+	ld [Buffer2], a
+	ld hl, SellItem_MenuDataHeader
+	call LoadMenuDataHeader
+	call Toss_Sell_Loop
+	ret
+; 24ff9
+
+Toss_Sell_Loop: ; 24ff9
+	ld a, 1
+	ld [wItemQuantityChangeBuffer], a
+.loop
+	call BuySellToss_UpdateQuantityDisplay ; update display
+	call BuySellToss_InterpretJoypad       ; joy action
+	jr nc, .loop
+	cp -1
+	jr nz, .nope ; pressed B
+	scf
+	ret
+
+.nope
+	and a
+	ret
+; 2500e
+
+BuySellToss_InterpretJoypad: ; 2500e
+	call Function354b ; get joypad
+	bit B_BUTTON_F, c
+	jr nz, .b
+	bit A_BUTTON_F, c
+	jr nz, .a
+	bit D_DOWN_F, c
+	jr nz, .down
+	bit D_UP_F, c
+	jr nz, .up
+	bit D_LEFT_F, c
+	jr nz, .left
+	bit D_RIGHT_F, c
+	jr nz, .right
+	and a
+	ret
+
+.b
+	ld a, -1
+	scf
+	ret
+
+.a
+	ld a, 0
+	scf
+	ret
+
+.down
+	ld hl, wItemQuantityChangeBuffer
+	dec [hl]
+	jr nz, .finish_down
+	ld a, [wItemQuantityBuffer]
+	ld [hl], a
+
+.finish_down
+	and a
+	ret
+
+.up
+	ld hl, wItemQuantityChangeBuffer
+	inc [hl]
+	ld a, [wItemQuantityBuffer]
+	cp [hl]
+	jr nc, .finish_up
+	ld [hl], 1
+
+.finish_up
+	and a
+	ret
+
+.left
+	ld a, [wItemQuantityChangeBuffer]
+	sub 10
+	jr c, .load_1
+	jr z, .load_1
+	jr .finish_left
+
+.load_1
+	ld a, 1
+
+.finish_left
+	ld [wItemQuantityChangeBuffer], a
+	and a
+	ret
+
+.right
+	ld a, [wItemQuantityChangeBuffer]
+	add $a
+	ld b, a
+	ld a, [wItemQuantityBuffer]
+	cp b
+	jr nc, .finish_right
+	ld b, a
+
+.finish_right
+	ld a, b
+	ld [wItemQuantityChangeBuffer], a
+	and a
+	ret
+; 25072
+
+BuySellToss_UpdateQuantityDisplay: ; 25072
+	call MenuBox
+	call MenuBoxCoord2Tile
+	ld de, SCREEN_WIDTH + 1
+	add hl, de
+	ld [hl], "×"
+	inc hl
+	ld de, wItemQuantityChangeBuffer
+	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+	call PrintNum
+	ld a, [wMenuData2Pointer]
+	ld e, a
+	ld a, [wMenuData2Pointer + 1]
+	ld d, a
+	ld a, [wMenuDataBank]
+	call FarCall_de
+	ret
+; 25097
+
+ret_25097: ; 25097
+	ret
+; 25098
+
+DisplayPurchasePrice: ; 25098
+	call BuySell_MultiplyPrice
+	call BuySell_DisplaySubtotal
+	ret
+; 2509f
+
+DisplaySellingPrice: ; 2509f
+	call BuySell_MultiplyPrice
+	call Sell_HalvePrice
+	call BuySell_DisplaySubtotal
+	ret
+; 250a9
+
+BuySell_MultiplyPrice: ; 250a9
+	xor a
+	ld [hMultiplicand + 0], a
+	ld a, [Buffer1]
+	ld [hMultiplicand + 1], a
+	ld a, [Buffer2]
+	ld [hMultiplicand + 2], a
+	ld a, [wItemQuantityChangeBuffer]
+	ld [hMultiplier], a
+	push hl
+	call Multiply
+	pop hl
+	ret
+; 250c1
+
+Sell_HalvePrice: ; 250c1
+	push hl
+	ld hl, hProduct + 1
+	ld a, [hl]
+	srl a
+	ld [hli], a
+	ld a, [hl]
+	rra
+	ld [hli], a
+	ld a, [hl]
+	rra
+	ld [hl], a
+	pop hl
+	ret
+; 250d1
+
+BuySell_DisplaySubtotal: ; 250d1
+	push hl
+	ld hl, hMoneyTemp
+	ld a, [hProduct + 1]
+	ld [hli], a
+	ld a, [hProduct + 2]
+	ld [hli], a
+	ld a, [hProduct + 3]
+	ld [hl], a
+	pop hl
+	inc hl
+	ld de, hMoneyTemp
+	lb bc, PRINTNUM_MONEY | 3, 6
+	call PrintNum
+	call WaitBGMap
+	ret
+; 250ed
+
+TossItem_MenuDataHeader: ; 0x250ed
+	db $40 ; flags
+	db 09, 15 ; start coords
+	db 11, 19 ; end coords
+	dw ret_25097
+	db 0 ; default option
+; 0x250f5
+
+BuyItem_MenuDataHeader: ; 0x250f5
+	db $40 ; flags
+	db 15, 07 ; start coords
+	db 17, 19 ; end coords
+	dw DisplayPurchasePrice
+	db -1 ; default option
+; 0x250fd
+
+SellItem_MenuDataHeader: ; 0x250fd
+	db $40 ; flags
+	db 15, 07 ; start coords
+	db 17, 19 ; end coords
+	dw DisplaySellingPrice
+	db 0 ; default option
+; 0x25105
--- a/engine/mart.asm
+++ b/engine/mart.asm
@@ -546,7 +546,7 @@
 	ld [wItemQuantityBuffer], a
 	ld a, MARTTEXT_HOW_MANY
 	call LoadBuyMenuText
-	callba Function24fc9
+	callba SelectQuantityToBuy
 	call ExitMenu
 	ret
 ; 15d97
@@ -606,7 +606,7 @@
 	call .GetSalePrice
 	ld a, 99
 	ld [wItemQuantityBuffer], a
-	callba Function24fcf
+	callba RooftopSale_SelectQuantityToBuy
 	call ExitMenu
 	ret
 ; 15df9
@@ -876,7 +876,7 @@
 	ld hl, Text_Mart_SellHowMany
 	call PrintText
 	callba PlaceMoneyTopRightMenu
-	callba Function24fe1
+	callba SelectQuantityToSell
 	call ExitMenu
 	jr c, .declined
 	hlcoord 1, 14
--- /dev/null
+++ b/engine/mon_menu.asm
@@ -1,0 +1,344 @@
+MonMenuOptionStrings: ; 24caf
+	db "STATS@"
+	db "SWITCH@"
+	db "ITEM@"
+	db "CANCEL@"
+	db "MOVE@"
+	db "MAIL@"
+	db "ERROR!@"
+; 24cd9
+
+MonMenuOptions: ; 24cd9
+
+; Moves
+	db MONMENU_FIELD_MOVE, MONMENU_CUT,        CUT
+	db MONMENU_FIELD_MOVE, MONMENU_FLY,        FLY
+	db MONMENU_FIELD_MOVE, MONMENU_SURF,       SURF
+	db MONMENU_FIELD_MOVE, MONMENU_STRENGTH,   STRENGTH
+	db MONMENU_FIELD_MOVE, MONMENU_FLASH,      FLASH
+	db MONMENU_FIELD_MOVE, MONMENU_WATERFALL,  WATERFALL
+	db MONMENU_FIELD_MOVE, MONMENU_WHIRLPOOL,  WHIRLPOOL
+	db MONMENU_FIELD_MOVE, MONMENU_DIG,        DIG
+	db MONMENU_FIELD_MOVE, MONMENU_TELEPORT,   TELEPORT
+	db MONMENU_FIELD_MOVE, MONMENU_SOFTBOILED, SOFTBOILED
+	db MONMENU_FIELD_MOVE, MONMENU_HEADBUTT,   HEADBUTT
+	db MONMENU_FIELD_MOVE, MONMENU_ROCKSMASH,  ROCK_SMASH
+	db MONMENU_FIELD_MOVE, MONMENU_MILKDRINK,  MILK_DRINK
+	db MONMENU_FIELD_MOVE, MONMENU_SWEETSCENT, SWEET_SCENT
+
+; Options
+	db MONMENU_MENUOPTION, MONMENU_STATS,      1 ; STATS
+	db MONMENU_MENUOPTION, MONMENU_SWITCH,     2 ; SWITCH
+	db MONMENU_MENUOPTION, MONMENU_ITEM,       3 ; ITEM
+	db MONMENU_MENUOPTION, MONMENU_CANCEL,     4 ; CANCEL
+	db MONMENU_MENUOPTION, MONMENU_MOVE,       5 ; MOVE
+	db MONMENU_MENUOPTION, MONMENU_MAIL,       6 ; MAIL
+	db MONMENU_MENUOPTION, MONMENU_ERROR,      7 ; ERROR!
+
+	db -1
+; 24d19
+
+MonSubmenu: ; 24d19
+	xor a
+	ld [hBGMapMode], a
+	call GetMonSubmenuItems
+	callba FreezeMonIcons
+	ld hl, .MenuDataHeader
+	call LoadMenuDataHeader
+	call .GetTopCoord
+	call PopulateMonMenu
+
+	ld a, 1
+	ld [hBGMapMode], a
+	call MonMenuLoop
+	ld [MenuSelection], a
+
+	call ExitMenu
+	ret
+; 24d3f
+
+.MenuDataHeader: ; 24d3f
+	db $40 ; tile backup
+	db 00, 06 ; start coords
+	db 17, 19 ; end coords
+	dw 0
+	db 1 ; default option
+; 24d47
+
+.GetTopCoord: ; 24d47
+; TopCoord = 1 + BottomCoord - 2 * (NumSubmenuItems + 1)
+	ld a, [Buffer1]
+	inc a
+	add a
+	ld b, a
+	ld a, [wMenuBorderBottomCoord]
+	sub b
+	inc a
+	ld [wMenuBorderTopCoord], a
+	call MenuBox
+	ret
+; 24d59
+
+MonMenuLoop: ; 24d59
+.loop
+	ld a, $a0 ; flags
+	ld [wMenuData2Flags], a
+	ld a, [Buffer1] ; items
+	ld [wMenuData2Items], a
+	call Function1c10
+	ld hl, wcfa5
+	set 6, [hl]
+	call Function1bc9
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	ld a, [hJoyPressed]
+	bit 0, a ; A
+	jr nz, .select
+	bit 1, a ; B
+	jr nz, .cancel
+	jr .loop
+
+.cancel
+	ld a, MONMENU_CANCEL ; CANCEL
+	ret
+
+.select
+	ld a, [MenuSelection2]
+	dec a
+	ld c, a
+	ld b, 0
+	ld hl, Buffer2
+	add hl, bc
+	ld a, [hl]
+	ret
+; 24d91
+
+PopulateMonMenu: ; 24d91
+	call MenuBoxCoord2Tile
+	ld bc, $2a ; 42
+	add hl, bc
+	ld de, Buffer2
+.loop
+	ld a, [de]
+	inc de
+	cp -1
+	ret z
+	push de
+	push hl
+	call GetMonMenuString
+	pop hl
+	call PlaceString
+	ld bc, $28 ; 40
+	add hl, bc
+	pop de
+	jr .loop
+; 24db0
+
+GetMonMenuString: ; 24db0
+	ld hl, MonMenuOptions + 1
+	ld de, 3
+	call IsInArray
+	dec hl
+	ld a, [hli]
+	cp 1
+	jr z, .NotMove
+	inc hl
+	ld a, [hl]
+	ld [wd265], a
+	call GetMoveName
+	ret
+
+.NotMove
+	inc hl
+	ld a, [hl]
+	dec a
+	ld hl, MonMenuOptionStrings
+	call GetNthString
+	ld d, h
+	ld e, l
+	ret
+; 24dd4
+
+GetMonSubmenuItems: ; 24dd4
+	call ResetMonSubmenu
+	ld a, [CurPartySpecies]
+	cp EGG
+	jr z, .egg
+	ld a, [wLinkMode]
+	and a
+	jr nz, .skip_moves
+	ld a, MON_MOVES
+	call GetPartyParamLocation
+	ld d, h
+	ld e, l
+	ld c, NUM_MOVES
+.loop
+	push bc
+	push de
+	ld a, [de]
+	and a
+	jr z, .next
+	push hl
+	call IsFieldMove
+	pop hl
+	jr nc, .next
+	call AddMonMenuItem
+
+.next
+	pop de
+	inc de
+	pop bc
+	dec c
+	jr nz, .loop
+
+.skip_moves
+	ld a, MONMENU_STATS
+	call AddMonMenuItem
+	ld a, MONMENU_SWITCH
+	call AddMonMenuItem
+	ld a, MONMENU_MOVE
+	call AddMonMenuItem
+	ld a, [wLinkMode]
+	and a
+	jr nz, .skip2
+	push hl
+	ld a, MON_ITEM
+	call GetPartyParamLocation
+	ld d, [hl]
+	callba ItemIsMail
+	pop hl
+	ld a, MONMENU_MAIL
+	jr c, .ok
+	ld a, MONMENU_ITEM
+
+.ok
+	call AddMonMenuItem
+
+.skip2
+	ld a, [Buffer1]
+	cp NUM_MON_SUBMENU_ITEMS
+	jr z, .ok2
+	ld a, MONMENU_CANCEL
+	call AddMonMenuItem
+
+.ok2
+	call TerminateMonSubmenu
+	ret
+
+.egg
+	ld a, MONMENU_STATS
+	call AddMonMenuItem
+	ld a, MONMENU_SWITCH
+	call AddMonMenuItem
+	ld a, MONMENU_CANCEL
+	call AddMonMenuItem
+	call TerminateMonSubmenu
+	ret
+; 24e52
+
+IsFieldMove: ; 24e52
+	ld b, a
+	ld hl, MonMenuOptions
+.next
+	ld a, [hli]
+	cp -1
+	jr z, .nope
+	cp MONMENU_MENUOPTION
+	jr z, .nope
+	ld d, [hl]
+	inc hl
+	ld a, [hli]
+	cp b
+	jr nz, .next
+	ld a, d
+	scf
+
+.nope
+	ret
+; 24e68
+
+ResetMonSubmenu: ; 24e68
+	xor a
+	ld [Buffer1], a
+	ld hl, Buffer2
+	ld bc, NUM_MON_SUBMENU_ITEMS + 1
+	call ByteFill
+	ret
+; 24e76
+
+TerminateMonSubmenu: ; 24e76
+	ld a, [Buffer1]
+	ld e, a
+	ld d, $0
+	ld hl, Buffer2
+	add hl, de
+	ld [hl], -1
+	ret
+; 24e83
+
+AddMonMenuItem: ; 24e83
+	push hl
+	push de
+	push af
+	ld a, [Buffer1]
+	ld e, a
+	inc a
+	ld [Buffer1], a
+	ld d, $0
+	ld hl, Buffer2
+	add hl, de
+	pop af
+	ld [hl], a
+	pop de
+	pop hl
+	ret
+; 24e99
+
+BattleMonMenu: ; 24e99
+	ld hl, MenuDataHeader_0x24ed4
+	call CopyMenuDataHeader
+	xor a
+	ld [hBGMapMode], a
+	call MenuBox
+	call UpdateSprites
+	call Function1c89
+	call WaitBGMap
+	call CopyMenuData2
+	ld a, [wMenuData2Flags]
+	bit 7, a
+	jr z, .set_carry
+	call Function1c10
+	ld hl, wcfa5
+	set 6, [hl]
+	call Function1bc9
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	ld a, [hJoyPressed]
+	bit B_BUTTON_F, a
+	jr z, .clear_carry
+	ret z
+
+.set_carry
+	scf
+	ret
+
+.clear_carry
+	and a
+	ret
+; 24ed4
+
+MenuDataHeader_0x24ed4: ; 24ed4
+	db $00 ; flags
+	db 11, 11 ; start coords
+	db 17, 19 ; end coords
+	dw MenuData2_0x24edc
+	db 1 ; default option
+; 24edc
+
+MenuData2_0x24edc: ; 24edc
+	db $c0 ; flags
+	db 3 ; items
+	db "SWITCH@"
+	db "STATS@"
+	db "CANCEL@"
+; 24ef2
--- a/engine/pack.asm
+++ b/engine/pack.asm
@@ -514,7 +514,7 @@
 TossMenu: ; 10364
 	ld hl, Text_ThrowAwayHowMany
 	call Pack_PrintTextNoScroll
-	callba Function24fbf
+	callba SelectQuantityToToss
 	push af
 	call ExitMenu
 	pop af
--- a/engine/pokecenter_pc.asm
+++ b/engine/pokecenter_pc.asm
@@ -343,7 +343,7 @@
 .askquantity
 	ld hl, .HowManyText
 	call MenuTextBox
-	callba Function24fbf
+	callba SelectQuantityToToss
 	call ExitMenu
 	call ExitMenu
 	jr c, .done
@@ -516,7 +516,7 @@
 .asm_1591d
 	ld hl, .HowManyText
 	call MenuTextBox
-	callba Function24fbf
+	callba SelectQuantityToToss
 	push af
 	call ExitMenu
 	call ExitMenu
--- a/engine/startmenu.asm
+++ b/engine/startmenu.asm
@@ -602,7 +602,7 @@
 	jr nz, .asm_12a3f
 	ld hl, UnknownText_0x12a45
 	call MenuTextBox
-	callba Function24fbf
+	callba SelectQuantityToToss
 	push af
 	call WriteBackup
 	call ExitMenu
--- a/event/halloffame.asm
+++ b/event/halloffame.asm
@@ -618,7 +618,7 @@
 	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
 	call PrintNum
 	call WaitBGMap
-	callba Function26601
+	callba ProfOaksPCRating
 	ret
 ; 868ed
 
--- a/main.asm
+++ b/main.asm
@@ -9764,709 +9764,9 @@
 	db -1
 ; 24caf
 
-MonMenuOptionStrings: ; 24caf
-	db "STATS@"
-	db "SWITCH@"
-	db "ITEM@"
-	db "CANCEL@"
-	db "MOVE@"
-	db "MAIL@"
-	db "ERROR!@"
-; 24cd9
-
-MonMenuOptions: ; 24cd9
-
-; Moves
-	db MONMENU_FIELD_MOVE, MONMENU_CUT,        CUT
-	db MONMENU_FIELD_MOVE, MONMENU_FLY,        FLY
-	db MONMENU_FIELD_MOVE, MONMENU_SURF,       SURF
-	db MONMENU_FIELD_MOVE, MONMENU_STRENGTH,   STRENGTH
-	db MONMENU_FIELD_MOVE, MONMENU_FLASH,      FLASH
-	db MONMENU_FIELD_MOVE, MONMENU_WATERFALL,  WATERFALL
-	db MONMENU_FIELD_MOVE, MONMENU_WHIRLPOOL,  WHIRLPOOL
-	db MONMENU_FIELD_MOVE, MONMENU_DIG,        DIG
-	db MONMENU_FIELD_MOVE, MONMENU_TELEPORT,   TELEPORT
-	db MONMENU_FIELD_MOVE, MONMENU_SOFTBOILED, SOFTBOILED
-	db MONMENU_FIELD_MOVE, MONMENU_HEADBUTT,   HEADBUTT
-	db MONMENU_FIELD_MOVE, MONMENU_ROCKSMASH,  ROCK_SMASH
-	db MONMENU_FIELD_MOVE, MONMENU_MILKDRINK,  MILK_DRINK
-	db MONMENU_FIELD_MOVE, MONMENU_SWEETSCENT, SWEET_SCENT
-
-; Options
-	db MONMENU_MENUOPTION, MONMENU_STATS,      1 ; STATS
-	db MONMENU_MENUOPTION, MONMENU_SWITCH,     2 ; SWITCH
-	db MONMENU_MENUOPTION, MONMENU_ITEM,       3 ; ITEM
-	db MONMENU_MENUOPTION, MONMENU_CANCEL,     4 ; CANCEL
-	db MONMENU_MENUOPTION, MONMENU_MOVE,       5 ; MOVE
-	db MONMENU_MENUOPTION, MONMENU_MAIL,       6 ; MAIL
-	db MONMENU_MENUOPTION, MONMENU_ERROR,      7 ; ERROR!
-
-	db -1
-; 24d19
-
-MonSubmenu: ; 24d19
-	xor a
-	ld [hBGMapMode], a
-	call GetMonSubmenuItems
-	callba FreezeMonIcons
-	ld hl, .MenuDataHeader
-	call LoadMenuDataHeader
-	call .GetTopCoord
-	call PopulateMonMenu
-
-	ld a, 1
-	ld [hBGMapMode], a
-	call MonMenuLoop
-	ld [MenuSelection], a
-
-	call ExitMenu
-	ret
-; 24d3f
-
-.MenuDataHeader: ; 24d3f
-	db $40 ; tile backup
-	db 00, 06 ; start coords
-	db 17, 19 ; end coords
-	dw 0
-	db 1 ; default option
-; 24d47
-
-.GetTopCoord: ; 24d47
-; TopCoord = 1 + BottomCoord - 2 * (NumSubmenuItems + 1)
-	ld a, [Buffer1]
-	inc a
-	add a
-	ld b, a
-	ld a, [wMenuBorderBottomCoord]
-	sub b
-	inc a
-	ld [wMenuBorderTopCoord], a
-	call MenuBox
-	ret
-; 24d59
-
-MonMenuLoop: ; 24d59
-.loop
-	ld a, $a0 ; flags
-	ld [wMenuData2Flags], a
-	ld a, [Buffer1] ; items
-	ld [wMenuData2Items], a
-	call Function1c10
-	ld hl, wcfa5
-	set 6, [hl]
-	call Function1bc9
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	ld a, [hJoyPressed]
-	bit 0, a ; A
-	jr nz, .select
-	bit 1, a ; B
-	jr nz, .cancel
-	jr .loop
-
-.cancel
-	ld a, MONMENU_CANCEL ; CANCEL
-	ret
-
-.select
-	ld a, [MenuSelection2]
-	dec a
-	ld c, a
-	ld b, 0
-	ld hl, Buffer2
-	add hl, bc
-	ld a, [hl]
-	ret
-; 24d91
-
-PopulateMonMenu: ; 24d91
-	call MenuBoxCoord2Tile
-	ld bc, $2a ; 42
-	add hl, bc
-	ld de, Buffer2
-.loop
-	ld a, [de]
-	inc de
-	cp -1
-	ret z
-	push de
-	push hl
-	call GetMonMenuString
-	pop hl
-	call PlaceString
-	ld bc, $28 ; 40
-	add hl, bc
-	pop de
-	jr .loop
-; 24db0
-
-GetMonMenuString: ; 24db0
-	ld hl, MonMenuOptions + 1
-	ld de, 3
-	call IsInArray
-	dec hl
-	ld a, [hli]
-	cp 1
-	jr z, .NotMove
-	inc hl
-	ld a, [hl]
-	ld [wd265], a
-	call GetMoveName
-	ret
-
-.NotMove
-	inc hl
-	ld a, [hl]
-	dec a
-	ld hl, MonMenuOptionStrings
-	call GetNthString
-	ld d, h
-	ld e, l
-	ret
-; 24dd4
-
-GetMonSubmenuItems: ; 24dd4
-	call ResetMonSubmenu
-	ld a, [CurPartySpecies]
-	cp EGG
-	jr z, .egg
-	ld a, [wLinkMode]
-	and a
-	jr nz, .skip_moves
-	ld a, MON_MOVES
-	call GetPartyParamLocation
-	ld d, h
-	ld e, l
-	ld c, NUM_MOVES
-.loop
-	push bc
-	push de
-	ld a, [de]
-	and a
-	jr z, .next
-	push hl
-	call IsFieldMove
-	pop hl
-	jr nc, .next
-	call AddMonMenuItem
-
-.next
-	pop de
-	inc de
-	pop bc
-	dec c
-	jr nz, .loop
-
-.skip_moves
-	ld a, MONMENU_STATS
-	call AddMonMenuItem
-	ld a, MONMENU_SWITCH
-	call AddMonMenuItem
-	ld a, MONMENU_MOVE
-	call AddMonMenuItem
-	ld a, [wLinkMode]
-	and a
-	jr nz, .skip2
-	push hl
-	ld a, MON_ITEM
-	call GetPartyParamLocation
-	ld d, [hl]
-	callba ItemIsMail
-	pop hl
-	ld a, MONMENU_MAIL
-	jr c, .ok
-	ld a, MONMENU_ITEM
-
-.ok
-	call AddMonMenuItem
-
-.skip2
-	ld a, [Buffer1]
-	cp NUM_MON_SUBMENU_ITEMS
-	jr z, .ok2
-	ld a, MONMENU_CANCEL
-	call AddMonMenuItem
-
-.ok2
-	call TerminateMonSubmenu
-	ret
-
-.egg
-	ld a, MONMENU_STATS
-	call AddMonMenuItem
-	ld a, MONMENU_SWITCH
-	call AddMonMenuItem
-	ld a, MONMENU_CANCEL
-	call AddMonMenuItem
-	call TerminateMonSubmenu
-	ret
-; 24e52
-
-IsFieldMove: ; 24e52
-	ld b, a
-	ld hl, MonMenuOptions
-.next
-	ld a, [hli]
-	cp -1
-	jr z, .nope
-	cp MONMENU_MENUOPTION
-	jr z, .nope
-	ld d, [hl]
-	inc hl
-	ld a, [hli]
-	cp b
-	jr nz, .next
-	ld a, d
-	scf
-
-.nope
-	ret
-; 24e68
-
-ResetMonSubmenu: ; 24e68
-	xor a
-	ld [Buffer1], a
-	ld hl, Buffer2
-	ld bc, NUM_MON_SUBMENU_ITEMS + 1
-	call ByteFill
-	ret
-; 24e76
-
-TerminateMonSubmenu: ; 24e76
-	ld a, [Buffer1]
-	ld e, a
-	ld d, $0
-	ld hl, Buffer2
-	add hl, de
-	ld [hl], -1
-	ret
-; 24e83
-
-AddMonMenuItem: ; 24e83
-	push hl
-	push de
-	push af
-	ld a, [Buffer1]
-	ld e, a
-	inc a
-	ld [Buffer1], a
-	ld d, $0
-	ld hl, Buffer2
-	add hl, de
-	pop af
-	ld [hl], a
-	pop de
-	pop hl
-	ret
-; 24e99
-
-BattleMonMenu: ; 24e99
-	ld hl, MenuDataHeader_0x24ed4
-	call CopyMenuDataHeader
-	xor a
-	ld [hBGMapMode], a
-	call MenuBox
-	call UpdateSprites
-	call Function1c89
-	call WaitBGMap
-	call CopyMenuData2
-	ld a, [wMenuData2Flags]
-	bit 7, a
-	jr z, .set_carry
-	call Function1c10
-	ld hl, wcfa5
-	set 6, [hl]
-	call Function1bc9
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	ld a, [hJoyPressed]
-	bit B_BUTTON_F, a
-	jr z, .clear_carry
-	ret z
-
-.set_carry
-	scf
-	ret
-
-.clear_carry
-	and a
-	ret
-; 24ed4
-
-MenuDataHeader_0x24ed4: ; 24ed4
-	db $00 ; flags
-	db 11, 11 ; start coords
-	db 17, 19 ; end coords
-	dw MenuData2_0x24edc
-	db 1 ; default option
-; 24edc
-
-MenuData2_0x24edc: ; 24edc
-	db $c0 ; flags
-	db 3 ; items
-	db "SWITCH@"
-	db "STATS@"
-	db "CANCEL@"
-; 24ef2
-
-LoadBattleMenu: ; 24ef2
-	ld hl, BattleMenuDataHeader
-	call LoadMenuDataHeader
-	ld a, [wd0d2]
-	ld [wMenuCursorBuffer], a
-	call Function2039
-	ld a, [wMenuCursorBuffer]
-	ld [wd0d2], a
-	call ExitMenu
-	ret
-; 24f0b
-
-SafariBattleMenu: ; 24f0b
-; untranslated
-	ld hl, MenuDataHeader_0x24f4e
-	call LoadMenuDataHeader
-	jr Function24f19
-; 24f13
-
-ContestBattleMenu: ; 24f13
-	ld hl, MenuDataHeader_0x24f89
-	call LoadMenuDataHeader
-; 24f19
-
-Function24f19: ; 24f19
-	ld a, [wd0d2]
-	ld [wMenuCursorBuffer], a
-	call InterpretMenu
-	ld a, [wMenuCursorBuffer]
-	ld [wd0d2], a
-	call ExitMenu
-	ret
-; 24f2c
-
-BattleMenuDataHeader: ; 24f2c
-	db $40 ; flags
-	db 12, 08 ; start coords
-	db 17, 19 ; end coords
-	dw MenuData_0x24f34
-	db 1 ; default option
-; 24f34
-
-MenuData_0x24f34: ; 0x24f34
-	db $81 ; flags
-	dn 2, 2 ; rows, columns
-	db 6 ; spacing
-	dba Strings24f3d
-	dbw BANK(MenuData_0x24f34), 0
-; 0x24f3d
-
-Strings24f3d: ; 0x24f3d
-	db "FIGHT@"
-	db "<PKMN>@"
-	db "PACK@"
-	db "RUN@"
-; 24f4e
-
-MenuDataHeader_0x24f4e: ; 24f4e
-	db $40 ; flags
-	db 12, 00 ; start coords
-	db 17, 19 ; end coords
-	dw MenuData_0x24f56
-	db 1 ; default option
-; 24f56
-
-MenuData_0x24f56: ; 24f56
-	db $81 ; flags
-	dn 2, 2 ; rows, columns
-	db 11 ; spacing
-	dba Strings24f5f
-	dba Function24f7c
-; 24f5f
-
-Strings24f5f: ; 24f5f
-	db "サファりボール×  @" ; "SAFARI BALL×  @"
-	db "エサをなげる@" ; "THROW BAIT"
-	db "いしをなげる@" ; "THROW ROCK"
-	db "にげる@" ; "RUN"
-; 24f7c
-
-Function24f7c: ; 24f7c
-	hlcoord 17, 13
-	ld de, wSafariBallsRemaining
-	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
-	call PrintNum
-	ret
-; 24f89
-
-MenuDataHeader_0x24f89: ; 24f89
-	db $40 ; flags
-	db 12, 02 ; start coords
-	db 17, 19 ; end coords
-	dw MenuData_0x24f91
-	db 1 ; default option
-; 24f91
-
-MenuData_0x24f91: ; 24f91
-	db $81 ; flags
-	dn 2, 2 ; rows, columns
-	db 12 ; spacing
-	dba Strings24f9a
-	dba Function24fb2
-; 24f9a
-
-Strings24f9a: ; 24f9a
-	db "FIGHT@"
-	db "<PKMN>", "@"
-	db "PARKBALL×  @"
-	db "RUN@"
-; 24fb2
-
-Function24fb2: ; 24fb2
-	hlcoord 13, 16
-	ld de, wParkBallsRemaining
-	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
-	call PrintNum
-	ret
-; 24fbf
-
-Function24fbf: ; 24fbf
-	ld hl, MenuDataHeader_0x250ed
-	call LoadMenuDataHeader
-	call Function24ff9
-	ret
-; 24fc9
-
-Function24fc9: ; 24fc9
-	callba GetItemPrice
-Function24fcf: ; 24fcf
-	ld a, d
-	ld [Buffer1], a
-	ld a, e
-	ld [Buffer2], a
-	ld hl, MenuDataHeader_0x250f5
-	call LoadMenuDataHeader
-	call Function24ff9
-	ret
-; 24fe1
-
-Function24fe1: ; 24fe1
-	callba GetItemPrice
-	ld a, d
-	ld [Buffer1], a
-	ld a, e
-	ld [Buffer2], a
-	ld hl, MenuDataHeader_0x250fd
-	call LoadMenuDataHeader
-	call Function24ff9
-	ret
-; 24ff9
-
-Function24ff9: ; 24ff9
-	ld a, $1
-	ld [wItemQuantityChangeBuffer], a
-.loop
-	call Function25072 ; update display
-	call Function2500e ; joy action
-	jr nc, .loop
-	cp -1
-	jr nz, .nope
-	scf
-	ret
-
-.nope
-	and a
-	ret
-; 2500e
-
-Function2500e: ; 2500e
-	call Function354b ; get joypad
-	bit B_BUTTON_F, c
-	jr nz, .b
-	bit A_BUTTON_F, c
-	jr nz, .a
-	bit D_DOWN_F, c
-	jr nz, .down
-	bit D_UP_F, c
-	jr nz, .up
-	bit D_LEFT_F, c
-	jr nz, .left
-	bit D_RIGHT_F, c
-	jr nz, .right
-	and a
-	ret
-
-.b
-	ld a, -1
-	scf
-	ret
-
-.a
-	ld a, 0
-	scf
-	ret
-
-.down
-	ld hl, wItemQuantityChangeBuffer
-	dec [hl]
-	jr nz, .finish_down
-	ld a, [wItemQuantityBuffer]
-	ld [hl], a
-
-.finish_down
-	and a
-	ret
-
-.up
-	ld hl, wItemQuantityChangeBuffer
-	inc [hl]
-	ld a, [wItemQuantityBuffer]
-	cp [hl]
-	jr nc, .finish_up
-	ld [hl], $1
-
-.finish_up
-	and a
-	ret
-
-.left
-	ld a, [wItemQuantityChangeBuffer]
-	sub $a
-	jr c, .load_1
-	jr z, .load_1
-	jr .finish_left
-
-.load_1
-	ld a, $1
-
-.finish_left
-	ld [wItemQuantityChangeBuffer], a
-	and a
-	ret
-
-.right
-	ld a, [wItemQuantityChangeBuffer]
-	add $a
-	ld b, a
-	ld a, [wItemQuantityBuffer]
-	cp b
-	jr nc, .finish_right
-	ld b, a
-
-.finish_right
-	ld a, b
-	ld [wItemQuantityChangeBuffer], a
-	and a
-	ret
-; 25072
-
-Function25072: ; 25072
-	call MenuBox
-	call MenuBoxCoord2Tile
-	ld de, $15
-	add hl, de
-	ld [hl], $f1
-	inc hl
-	ld de, wItemQuantityChangeBuffer
-	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
-	call PrintNum
-	ld a, [wMenuData2Pointer]
-	ld e, a
-	ld a, [wMenuData2Pointer + 1]
-	ld d, a
-	ld a, [wMenuDataBank]
-	call FarCall_de
-	ret
-; 25097
-
-Function25097: ; 25097
-	ret
-; 25098
-
-Function25098: ; 25098
-	call Function250a9
-	call Function250d1
-	ret
-; 2509f
-
-Function2509f: ; 2509f
-	call Function250a9
-	call Function250c1
-	call Function250d1
-	ret
-; 250a9
-
-Function250a9: ; 250a9
-	xor a
-	ld [hMultiplicand + 0], a
-	ld a, [Buffer1]
-	ld [hMultiplicand + 1], a
-	ld a, [Buffer2]
-	ld [hMultiplicand + 2], a
-	ld a, [wItemQuantityChangeBuffer]
-	ld [hMultiplier], a
-	push hl
-	call Multiply
-	pop hl
-	ret
-; 250c1
-
-Function250c1: ; 250c1
-	push hl
-	ld hl, hMultiplicand
-	ld a, [hl]
-	srl a
-	ld [hli], a
-	ld a, [hl]
-	rra
-	ld [hli], a
-	ld a, [hl]
-	rra
-	ld [hl], a
-	pop hl
-	ret
-; 250d1
-
-Function250d1: ; 250d1
-	push hl
-	ld hl, hMoneyTemp
-	ld a, [hMultiplicand]
-	ld [hli], a
-	ld a, [$ffb5]
-	ld [hli], a
-	ld a, [$ffb6]
-	ld [hl], a
-	pop hl
-	inc hl
-	ld de, hMoneyTemp
-	lb bc, PRINTNUM_MONEY | 3, 6
-	call PrintNum
-	call WaitBGMap
-	ret
-; 250ed
-
-MenuDataHeader_0x250ed: ; 0x250ed
-	db $40 ; flags
-	db 09, 15 ; start coords
-	db 11, 19 ; end coords
-	dw Function25097
-	db 0 ; default option
-; 0x250f5
-
-MenuDataHeader_0x250f5: ; 0x250f5
-	db $40 ; flags
-	db 15, 07 ; start coords
-	db 17, 19 ; end coords
-	dw Function25098
-	db -1 ; default option
-; 0x250fd
-
-MenuDataHeader_0x250fd: ; 0x250fd
-	db $40 ; flags
-	db 15, 07 ; start coords
-	db 17, 19 ; end coords
-	dw Function2509f
-	db 0 ; default option
-; 0x25105
-
+INCLUDE "engine/mon_menu.asm"
+INCLUDE "battle/menu.asm"
+INCLUDE "engine/buy_sell_toss.asm"
 INCLUDE "engine/trainer_card.asm"
 
 ProfOaksPC: ; 0x265d3
@@ -10493,7 +9793,7 @@
 	ret
 ; 0x26601
 
-Function26601: ; 0x26601
+ProfOaksPCRating: ; 0x26601
 	call Rate
 	push de
 	ld de, MUSIC_NONE
@@ -10517,7 +9817,7 @@
 	ld [wd003], a
 
 ; print appropriate rating
-	call ClearOakRatingBuffers
+	call .UpdateRatingBuffers
 	ld hl, OakPCText3
 	call PrintText
 	call JoyWaitAorB
@@ -10530,17 +9830,17 @@
 	ret
 ; 0x26647
 
-ClearOakRatingBuffers: ; 0x26647
+.UpdateRatingBuffers: ; 0x26647
 	ld hl, StringBuffer3
 	ld de, wd002
-	call ClearOakRatingBuffer
+	call .UpdateRatingBuffer
 	ld hl, StringBuffer4
 	ld de, wd003
-	call ClearOakRatingBuffer
+	call .UpdateRatingBuffer
 	ret
 ; 0x2665a
 
-ClearOakRatingBuffer: ; 0x2665a
+.UpdateRatingBuffer: ; 0x2665a
 	push hl
 	ld a, "@"
 	ld bc, ITEM_NAME_LENGTH
@@ -10577,86 +9877,32 @@
 ; 0x2667f
 
 OakRatings: ; 0x2667f
-; db count (if number caught ≤ this number, then this entry is used)
-; dw sound effect
-; dw text pointer
+oakrating: MACRO
+	db \1
+	dw \2, \3
+endm
 
-	db 9
-	dw SFX_DEX_FANFARE_LESS_THAN_20
-	dw OakRating01
+; if you caught at most this many, play this sound, load this text
+	oakrating   9, SFX_DEX_FANFARE_LESS_THAN_20, OakRating01
+	oakrating  19, SFX_DEX_FANFARE_LESS_THAN_20, OakRating02
+	oakrating  34, SFX_DEX_FANFARE_20_49,        OakRating03
+	oakrating  49, SFX_DEX_FANFARE_20_49,        OakRating04
+	oakrating  64, SFX_DEX_FANFARE_50_79,        OakRating05
+	oakrating  79, SFX_DEX_FANFARE_50_79,        OakRating06
+	oakrating  94, SFX_DEX_FANFARE_80_109,       OakRating07
+	oakrating 109, SFX_DEX_FANFARE_80_109,       OakRating08
+	oakrating 124, SFX_CAUGHT_MON,               OakRating09
+	oakrating 139, SFX_CAUGHT_MON,               OakRating10
+	oakrating 154, SFX_DEX_FANFARE_140_169,      OakRating11
+	oakrating 169, SFX_DEX_FANFARE_140_169,      OakRating12
+	oakrating 184, SFX_DEX_FANFARE_170_199,      OakRating13
+	oakrating 199, SFX_DEX_FANFARE_170_199,      OakRating14
+	oakrating 214, SFX_DEX_FANFARE_200_229,      OakRating15
+	oakrating 229, SFX_DEX_FANFARE_200_229,      OakRating16
+	oakrating 239, SFX_DEX_FANFARE_230_PLUS,     OakRating17
+	oakrating 248, SFX_DEX_FANFARE_230_PLUS,     OakRating18
+	oakrating 255, SFX_DEX_FANFARE_230_PLUS,     OakRating19
 
-	db 19
-	dw SFX_DEX_FANFARE_LESS_THAN_20
-	dw OakRating02
-
-	db 34
-	dw SFX_DEX_FANFARE_20_49
-	dw OakRating03
-
-	db 49
-	dw SFX_DEX_FANFARE_20_49
-	dw OakRating04
-
-	db 64
-	dw SFX_DEX_FANFARE_50_79
-	dw OakRating05
-
-	db 79
-	dw SFX_DEX_FANFARE_50_79
-	dw OakRating06
-
-	db 94
-	dw SFX_DEX_FANFARE_80_109
-	dw OakRating07
-
-	db 109
-	dw SFX_DEX_FANFARE_80_109
-	dw OakRating08
-
-	db 124
-	dw SFX_CAUGHT_MON
-	dw OakRating09
-
-	db 139
-	dw SFX_CAUGHT_MON
-	dw OakRating10
-
-	db 154
-	dw SFX_DEX_FANFARE_140_169
-	dw OakRating11
-
-	db 169
-	dw SFX_DEX_FANFARE_140_169
-	dw OakRating12
-
-	db 184
-	dw SFX_DEX_FANFARE_170_199
-	dw OakRating13
-
-	db 199
-	dw SFX_DEX_FANFARE_170_199
-	dw OakRating14
-
-	db 214
-	dw SFX_DEX_FANFARE_200_229
-	dw OakRating15
-
-	db 229
-	dw SFX_DEX_FANFARE_200_229
-	dw OakRating16
-
-	db 239
-	dw SFX_DEX_FANFARE_230_PLUS
-	dw OakRating17
-
-	db 248
-	dw SFX_DEX_FANFARE_230_PLUS
-	dw OakRating18
-
-	db 255
-	dw SFX_DEX_FANFARE_230_PLUS
-	dw OakRating19
-
 OakPCText1: ; 0x266de
 	text_jump _OakPCText1
 	db "@"
@@ -10797,7 +10043,6 @@
 
 .gettutorialbackpic
 	callba GetTrainerBackpic
-
 .continue
 	callba GetMonFrontpic
 	callba _LoadBattleFontsHPBar
@@ -10898,7 +10143,7 @@
 INCLUDE "battle/moves/move_effects.asm"
 
 Function27a28: ; 27a28
-	call Function2500e
+	call BuySellToss_InterpretJoypad
 	ld b, a
 	ret
 ; 27a2d