shithub: pokecrystal

Download patch

ref: 14c8cf5b4817d1cb5446349bd04949186f73093c
parent: dfcca93b451cecb6857f8b6bc6b9f67e997b09c9
parent: d38ed29a4679936cb97bd95833e49700fee80030
author: Remy Oukaour <[email protected]>
date: Sun Jan 14 18:43:51 EST 2018

Merge branch 'master' of https://github.com/mid-kid/pokecrystal (resolve PR #452)

# Conflicts:
#	data/player_names.asm
#	engine/battle/menu.asm
#	engine/billspc.asm
#	engine/billspctop.asm
#	engine/buy_sell_toss.asm
#	engine/decorations.asm
#	engine/delete_save_change_clock.asm
#	engine/events/buena.asm
#	engine/events/elevator.asm
#	engine/events/kurt.asm
#	engine/events/mom.asm
#	engine/events/move_tutor.asm
#	engine/events/pokecenter_pc.asm
#	engine/events/pokepic.asm
#	engine/events/std_scripts.asm
#	engine/events/unown_walls.asm
#	engine/init_gender.asm
#	engine/intro_menu.asm
#	engine/mail.asm
#	engine/main_menu.asm
#	engine/mart.asm
#	engine/menu_2.asm
#	engine/mon_menu.asm
#	engine/pack.asm
#	engine/slot_machine.asm
#	engine/start_menu.asm
#	home/menu.asm
#	maps/CeladonDeptStore6F.asm
#	maps/CeladonGameCornerPrizeRoom.asm
#	maps/DragonShrine.asm
#	maps/EarlsPokemonAcademy.asm
#	maps/GoldenrodCity.asm
#	maps/GoldenrodDeptStore6F.asm
#	maps/GoldenrodGameCorner.asm
#	maps/GoldenrodPokeComCenter2FMobile.asm
#	mobile/mobile_12.asm
#	mobile/mobile_12_2.asm
#	mobile/mobile_22.asm
#	mobile/mobile_22_2.asm
#	mobile/mobile_40.asm
#	mobile/mobile_45.asm
#	mobile/mobile_45_sprite_engine.asm
#	mobile/mobile_46.asm
#	mobile/mobile_5c.asm
#	mobile/mobile_5f.asm
#	mobile/mobile_menu.asm

--- a/constants.asm
+++ b/constants.asm
@@ -49,3 +49,4 @@
 INCLUDE "constants/cry_constants.asm"
 INCLUDE "constants/audio_constants.asm"
 INCLUDE "constants/printer_constants.asm"
+INCLUDE "constants/menu_constants.asm"
--- /dev/null
+++ b/constants/menu_constants.asm
@@ -1,0 +1,33 @@
+; MenuDataHeader flags
+	const_def
+	shift_const MENU_RESTORE_TILES ; Will be set if MENU_BACKUP_TILES(_2) is set.
+	shift_const MENU_UNUSED_1
+	shift_const MENU_UNUSED_2
+	shift_const MENU_NO_CLICK_SFX
+	shift_const MENU_SPRITE_ANIMS
+	shift_const MENU_UNUSED_3
+	shift_const MENU_BACKUP_TILES
+	shift_const MENU_BACKUP_TILES_2
+
+; VerticalMenu/DoNthMenu/SetUpMenu/_2DMenu MenuDataHeader2 flags
+; Per flag the comment specifies which menus actually implement it
+	const_def
+	shift_const STATICMENU_DISABLE_B ; VerticalMenu/_2DMenu
+	shift_const STATICMENU_ENABLE_SELECT ; VerticalMenu/_2DMenu
+	shift_const STATICMENU_ENABLE_LEFT_RIGHT ; DoNthMenu/SetUpMenu
+	shift_const STATICMENU_ENABLE_START ; DoNthMenu/SetUpMenu
+	shift_const STATICMENU_PLACE_TITLE ; VerticalMenu
+	shift_const STATICMENU_WRAP ; All
+	shift_const STATICMENU_NO_TOP_SPACING ; VerticalMenu/_2DMenu
+	shift_const STATICMENU_CURSOR ; VerticalMenu/_2DMenu
+
+; ScrollingMenu MenuDataHeader2 flags
+	const_def
+	shift_const SCROLLINGMENU_CALL_FUNCTION1_CANCEL
+	shift_const SCROLLINGMENU_CALL_FUNCTION3_NO_SWITCH
+	shift_const SCROLLINGMENU_ENABLE_LEFT
+	shift_const SCROLLINGMENU_ENABLE_RIGHT
+	shift_const SCROLLINGMENU_DISPLAY_ARROWS
+	shift_const SCROLLINGMENU_ENABLE_FUNCTION3
+	shift_const SCROLLINGMENU_ENABLE_START
+	shift_const SCROLLINGMENU_ENABLE_SELECT
--- a/data/player_names.asm
+++ b/data/player_names.asm
@@ -1,5 +1,5 @@
 ChrisNameMenuHeader: ; 882b5
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 10, TEXTBOX_Y - 1
 	dw .MaleNames
 	db 1 ; ????
@@ -6,7 +6,7 @@
 	db 0 ; default option
 
 .MaleNames: ; 882be
-	db $91 ; flags
+	db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B ; flags
 	db 5 ; items
 	db "NEW NAME@"
 MalePlayerNameArray: ; 882c9
@@ -18,7 +18,7 @@
 	db " NAME @" ; title
 
 KrisNameMenuHeader: ; 882e5
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 10, TEXTBOX_Y - 1
 	dw .FemaleNames
 	db 1 ; ????
@@ -25,7 +25,7 @@
 	db 0 ; default option
 
 .FemaleNames: ; 882ee
-	db $91 ; flags
+	db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B ; flags
 	db 5 ; items
 	db "NEW NAME@"
 FemalePlayerNameArray: ; 882f9
--- a/data/unown_walls.asm
+++ b/data/unown_walls.asm
@@ -40,15 +40,15 @@
 
 MenuDataHeaders_UnownWalls: ; 0x8aed5
 ; UNOWNWORDS_ESCAPE
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 3, 4, 16, 9
 ; UNOWNWORDS_LIGHT
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 4, 4, 15, 9
 ; UNOWNWORDS_WATER
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 4, 4, 15, 9
 ; UNOWNWORDS_HO_OH
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 4, 4, 15, 9
 ; 8aee9
--- /dev/null
+++ b/docs/menu.md
@@ -1,0 +1,269 @@
+### Everything you've ever wanted to know about menus*
+
+##### *but were afraid to ask
+
+## Contents
+
+- [ScrollingMenu](#scrollingmenu)
+- [\_2DMenu](#_2dmenu)
+- [DoNthMenu/SetUpMenu](#donthmenusetupmenu)
+- [VerticalMenu](#verticalmenu)
+- [Misc/Generic](#miscgeneric)
+
+## ScrollingMenu
+
+This is the only menu that does scrolling. It doesn't draw any TextBox around the menu.
+
+Structure:
+```
+.MenuDataHeader:
+	db MENU_BACKUP_TILES ; flags
+	menu_coords 2, 4, SCREEN_WIDTH - 1, 13
+	dw .MenuData2
+	db 1 ; default option
+
+.MenuData2:
+	db 0 ; flags
+	db 5, 0 ; rows, columns
+	db 1 ; horizontal spacing
+	dba Items
+	dba Function1
+	dba Function2
+	dba Function3
+```
+
+wMenuData2Flags:
+```
+7: Select is functional
+6: Start is functional
+5: Call Function3
+4: Show arrows on the right-hand side
+3: D-Left is functional
+2: D-Right is functional
+1: Call Function3 only if [wSwitchItem] is 0
+0: Call Function1 to display the cancel entry
+```
+
+If the columns entry in MenuDataHeader2 of a scrolling menu is 0, Function2 isn't called either. It doesn't affect the position of the arrows.
+
+Call state for functions in MenuDataHeader2 of ScrollingMenu:
+```
+All of them:
+[MenuSelection] = Current item. -1 is the CANCEL item.
+[MenuSelectionQuantity] = Quantity of the current item.
+
+Function1: Called to display a menu entry.
+de = Cursor position in TileMap
+
+Function2: Called to display the quantity of a menu entry.
+de = Cursor position in TileMap + columns
+
+Function3: Called to display anything else, whenever the cursor is moved.
+```
+There is no register of importance that should be preserved in any of these functions.
+
+The `; horizontal spacing` item in each MenuData2 is a misnomer. It changes how the Items struct looks.
+If it's 1:
+```
+db entries not including cancel
+db entry1
+db entry2
+db -1 ; cancel
+...
+```
+If it's 2:
+```
+db entries not including cancel
+db entry1, quantity1
+db entry2, quantity2
+db -1 ; cancel
+...
+```
+In case it's 1, [MenuSelectionQuantity] will simply contain the next entry.
+
+## \_2DMenu
+
+This, like is implied by the name, is a 2-dimensional menu, where you can move your cursor in all 4 directions. It's only used for the battle menus as well as earl's academy.
+
+Structure:
+```
+.MenuDataHeader:
+	db MENU_BACKUP_TILES ; flags
+	db 12, 08 ; start coords
+	db 17, 19 ; end coords
+	dw .MenuData2
+	db 1 ; default option
+
+.MenuData2:
+	db STATICMENU_CURSOR ; flags
+	dn 2, 2 ; rows, columns
+	db 6 ; spacing
+	dba Strings
+	dba Function
+```
+
+wMenuData2Flags:
+```
+7: Leave one tile of spacing between the left textbox border and the text, enabling the cursor.
+6: Don't leave one tile of spacing between the top textbox border and the text
+5: Set bits 4 and 5 in w2DMenuFlags1 (Wrap around horizontally and vertically)
+4: Unused
+3: Unused
+2: Unused
+1: Select is functional
+0: Disable B button
+```
+
+The bank for the Strings is generated when you call `_2DMenu`, and as such it doesn't really matter what bank you specify there (unless you callba `_2DMenu_` directly, of course).
+`; spacing` is not a misnomer here, it's used to define how much space there is between columns.
+`Function` is called after printing all the strings. `hl` will be pointed at the row below the last in the menu in TileMap. We don't know of its purpose, since it's never actually used anywhere. Only the bank number is always set to the same bank as the menu, but not used otherwise, since the address is 0.
+
+## DoNthMenu/SetUpMenu
+
+These are like the regular VerticalMenu, except they allow for creating slightly more "dynamic" menus, where the options aren't predefined, much like the ScrollingMenu.
+
+Structure:
+```
+.MenuDataHeader:
+	db MENU_BACKUP_TILES ; flags
+	menu_coords 0, 0, 10, 7
+	dw .MenuData2
+	db 1 ; default option
+
+.MenuData2:
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
+	db 0 ; items
+	dw Items
+	dw DisplayFunction
+	dw StringPointers
+```
+
+wMenuData2Flags:
+```
+7: Unused
+6: Unused
+5: Set bit 5 in w2DMenuFlags1 (Wrap around vertically)
+4: Unused
+3: Start is functional
+2: D-left and D-right are functional
+1: Unused
+0: Unused
+```
+
+The `; items` entry should be left empty, as it's autogenerated with the `Items` array in `GetMenuIndexSet`.
+The bottom coord (`07` in the example) is autogenerated regardless of what you specify when building the MenuBox in `AutomaticGetMenuBottomCoord`, which also calculates the `bc` passed to MenuBox, which is useless because it's calculated again by MenuBox in `GetMenuBoxDims`.
+[wWhichIndexSet] decides which menu is used through `GetMenuIndexSet`. You can define multiple menus at the Items pointer as such:
+```
+Items:
+db entries not including cancel
+db entry1, entry2, entry3
+db -1 ; cancel
+db entries not including cancel for 2nd menu
+db entry1, entry2, entry3, entry4
+db -1 ; cancel
+```
+This is actively used in MainMenu.
+
+StringPointers isn't handled by DoNthMenu internally. It's handled by different `DisplayFunction`s.
+A custom one could choose to completely ignore it.
+
+StringPointers struct handled through `PlaceNthMenuStrings` as DisplayFunction and `MenuJumptable`:
+```
+StringPointers:
+dw FunctionToCall, PointerToString ; index 1
+dw FunctionToCall, PointerToString ; index 2
+...
+```
+
+StringPointers struct handled through `PlaceMenuStrings`:
+```
+StringPointers:
+db "STRING1@"
+db "STRING2@"
+...
+```
+
+Call state for DisplayFunction:
+```
+[MenuSelection] = Current item. -1 is the CANCEL item.
+de = Cursor position in TileMap
+```
+
+## VerticalMenu
+
+This is the simplest menu. Like, the most boring. Nothing special. Just normal. ...nooooooormal...
+
+Structure:
+```
+.MenuDataHeader:
+	db MENU_SPRITE_ANIMS | MENU_BACKUP_TILES ; flags
+	menu_coords 12, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+	dw .MenuData2
+	db 1 ; default option
+
+.MenuData2:
+	db STATICMENU_CURSOR ; flags
+	db 2 ; # items
+	db "GIVE@"
+	db "TAKE@"
+```
+
+wMenuData2Flags:
+```
+7: Leave one tile of spacing between the left textbox border and the text
+6: Don't leave one tile of spacing between the top textbox border and the text
+5: Set bit 5 in w2DMenuFlags1 (Wrap around vertically)
+4: Place menubox "title". See notes.
+3: Unused
+2: Unused
+1: Select is functional
+0: Disable B button
+```
+
+If bit 4 is set, a string at the end of the items array will be put at an offset from the start coord of the menu box. This string is defined like this:
+```
+	db 2 ; # items
+	db "GIVE@"
+	db "TAKE@"
+	db 2 ; x offset
+	db "TEST@"
+```
+This is used in the menu for selecting the character's name.
+
+## Misc/Generic
+
+MenuDataHeader flags (wMenuFlags):
+```
+7: Save a backup of the tiles
+6: Save a backup of the tiles
+5: Unused
+4: Set bit 6 in w2DMenuFlags1 (Enable sprite animations)
+3: Disable click sound
+2: Unused
+1: Unused
+0: Call RestoreTileBackup when exiting the menu. This bit depends on whether bit 6 or 7 are set.
+```
+
+w2DMenuFlags1:
+```
+7: Disable checking of wMenuJoypadFilter
+6: Enable sprite animations
+5: Wrap around vertically
+4: Wrap around horizontally
+3: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 5 is disabled and we tried to go too far down
+2: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 5 is disabled and we tried to go too far up
+1: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 4 is disabled and we tried to go too far left
+0: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 4 is disabled and we tried to go too far right
+```
+
+w2DMenuFlags2:
+```
+7: ?????
+6: ?????
+5: ?????
+4: ?????
+3: ?????
+2: ?????
+1: ?????
+0: ?????
+```
--- a/engine/battle/menu.asm
+++ b/engine/battle/menu.asm
@@ -33,7 +33,7 @@
 ; 24f2c
 
 BattleMenuDataHeader: ; 24f2c
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 8, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw MenuData_0x24f34
 	db 1 ; default option
@@ -40,7 +40,7 @@
 ; 24f34
 
 MenuData_0x24f34: ; 0x24f34
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	dn 2, 2 ; rows, columns
 	db 6 ; spacing
 	dba Strings24f3d
@@ -55,7 +55,7 @@
 ; 24f4e
 
 MenuDataHeader_0x24f4e: ; 24f4e
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw MenuData_0x24f56
 	db 1 ; default option
@@ -62,7 +62,7 @@
 ; 24f56
 
 MenuData_0x24f56: ; 24f56
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	dn 2, 2 ; rows, columns
 	db 11 ; spacing
 	dba Strings24f5f
@@ -85,7 +85,7 @@
 ; 24f89
 
 MenuDataHeader_0x24f89: ; 24f89
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 2, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw MenuData_0x24f91
 	db 1 ; default option
@@ -92,7 +92,7 @@
 ; 24f91
 
 MenuData_0x24f91: ; 24f91
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	dn 2, 2 ; rows, columns
 	db 12 ; spacing
 	dba Strings24f9a
--- a/engine/billspc.asm
+++ b/engine/billspc.asm
@@ -229,7 +229,7 @@
 ; e253d (38:653d)
 
 BillsPCDepositMenuDataHeader: ; 0xe253d (38:653d)
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 9, 4, SCREEN_WIDTH - 1, 13
 	dw .MenuData2
 	db 1 ; default option
@@ -236,7 +236,7 @@
 ; 0xe2545
 
 .MenuData2: ; 0xe2545 (38:6545)
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "DEPOSIT@"
 	db "STATS@"
@@ -488,7 +488,7 @@
 ; e2731 (38:6731)
 
 .MenuDataHeader: ; 0xe2731
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 9, 4, SCREEN_WIDTH - 1, 13
 	dw .MenuData
 	db 1 ; default option
@@ -495,7 +495,7 @@
 ; 0xe2739
 
 .MenuData: ; 0xe2739
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "WITHDRAW@"
 	db "STATS@"
@@ -711,7 +711,7 @@
 ; e28c3
 
 .MenuDataHeader: ; 0xe28c3
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 9, 4, SCREEN_WIDTH - 1, 13
 	dw .MenuData2
 	db 1 ; default option
@@ -718,7 +718,7 @@
 ; 0xe28cb
 
 .MenuData2: ; 0xe28cb
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 3 ; items
 	db "MOVE@"
 	db "STATS@"
@@ -2329,7 +2329,7 @@
 ; e35f1 (38:75f1)
 
 _ChangeBox_menudataheader: ; 0xe35f1
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 1, 5, 9, 12
 	dw .menudata2
 	db 1 ; default option
@@ -2336,7 +2336,7 @@
 ; 0xe35f9
 
 .menudata2 ; 0xe35f9
-	db $22 ; flags
+	db MENU_UNUSED_1 | MENU_UNUSED_3 ; flags
 	db 4, 0
 	db 1
 	dba .boxes
@@ -2557,7 +2557,7 @@
 	hlcoord 11, 7 ; unused
 
 .MenuDataHeader: ; 0xe377b
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 4, SCREEN_WIDTH - 1, 13
 	dw .MenuData2
 	db 1 ; default option
@@ -2564,7 +2564,7 @@
 ; 0xe3783
 
 .MenuData2: ; 0xe3783
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "SWITCH@"
 	db "NAME@"
--- a/engine/billspctop.asm
+++ b/engine/billspctop.asm
@@ -69,13 +69,13 @@
 	ret
 
 .MenuDataHeader: ; 0xe46f
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2: ; 0xe477
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 0 ; items
 	dw .items
 	dw PlaceMenuStrings
--- a/engine/buy_sell_toss.asm
+++ b/engine/buy_sell_toss.asm
@@ -214,7 +214,7 @@
 ; 250ed
 
 TossItem_MenuDataHeader: ; 0x250ed
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 15, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw ret_25097
 	db 0 ; default option
@@ -221,7 +221,7 @@
 ; 0x250f5
 
 BuyItem_MenuDataHeader: ; 0x250f5
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw DisplayPurchasePrice
 	db -1 ; default option
@@ -228,7 +228,7 @@
 ; 0x250fd
 
 SellItem_MenuDataHeader: ; 0x250fd
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw DisplaySellingPrice
 	db 0 ; default option
--- a/engine/decorations.asm
+++ b/engine/decorations.asm
@@ -37,7 +37,7 @@
 ; 0x2679a
 
 .MenuDataHeader: ; 0x2679a
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 5, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -44,7 +44,7 @@
 ; 0x267a2
 
 .MenuData2: ; 0x267a2
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 0 ; items
 	dw wd002
 	dw PlaceNthMenuStrings
@@ -422,7 +422,7 @@
 ; 0x269b5
 
 .NonscrollingMenuDataHeader: ; 0x269b5
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw .NonscrollingMenuData2
 	db 1 ; default option
@@ -429,7 +429,7 @@
 ; 0x269bd
 
 .NonscrollingMenuData2: ; 0x269bd
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 0 ; items
 	dw wd002
 	dw DecorationMenuFunction
@@ -437,7 +437,7 @@
 ; 0x269c5
 
 .ScrollingMenuDataHeader: ; 0x269c5
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 1, 1, SCREEN_WIDTH - 2, SCREEN_HEIGHT - 2
 	dw .ScrollingMenuData2
 	db 1 ; default option
@@ -444,7 +444,7 @@
 ; 0x269cd
 
 .ScrollingMenuData2: ; 0x269cd
-	db $10 ; flags
+	db SCROLLINGMENU_DISPLAY_ARROWS ; flags
 	db 8, 0 ; rows, columns
 	db 1 ; horizontal spacing
 	dbw 0, wd002 ; text pointer
@@ -948,7 +948,7 @@
 ; 26eab
 
 MenuDataHeader_0x26eab: ; 0x26eab
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 13, 7
 	dw MenuData2_0x26eb3
 	db 1 ; default option
@@ -955,7 +955,7 @@
 ; 0x26eb3
 
 MenuData2_0x26eb3: ; 0x26eb3
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 3 ; items
 	db "RIGHT SIDE@"
 	db "LEFT SIDE@"
--- a/engine/delete_save_change_clock.asm
+++ b/engine/delete_save_change_clock.asm
@@ -47,13 +47,13 @@
 	db "@"
 
 .NoYes_MenuDataHeader: ; 0x4d40d
-	db $00 ; flags
+	db 0 ; flags
 	menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .NoYes_MenuData2
 	db 1 ; default option
 
 .NoYes_MenuData2: ; 0x4d415
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2 ; items
 	db "NO@"
 	db "YES@"
@@ -284,13 +284,13 @@
 	db "@"
 
 .NoYesMenuDataHeader: ; 0x4d585
-	db $00 ; flags
+	db 0 ; flags
 	menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2: ; 0x4d58d
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2 ; items
 	db "NO@"
 	db "YES@"
--- a/engine/events/buena.asm
+++ b/engine/events/buena.asm
@@ -29,7 +29,7 @@
 ; 8afa9
 
 .MenuDataHeader: ; 0x8afa9
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 10, 7
 	dw .MenuData2
 	db 1 ; default option
@@ -38,7 +38,7 @@
 	db 0
 
 .MenuData2: ; 0x8afb2
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	db 0 ; items
 	dw .PasswordIndices
 	dw .PlacePasswordChoices
@@ -46,7 +46,11 @@
 
 .PasswordIndices: ; 8afb8
 	db NUM_PASSWORDS_PER_CATEGORY
-	db 0, 1, 2
+x = 0
+rept NUM_PASSWORDS_PER_CATEGORY
+	db x
+x = x + 1
+endr
 	db -1
 
 .PlacePasswordChoices: ; 8afbd
@@ -224,7 +228,7 @@
 ; 8b0d1
 
 BlueCardBalanceMenuDataHeader: ; 0x8b0d1
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 11, 11, 13
 ; 8b0d6
 
@@ -235,7 +239,7 @@
 ; 8b0dd
 
 .menudataheader ; 0x8b0dd
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 17, TEXTBOX_Y - 1
 ; 8b0e2
 
@@ -267,7 +271,7 @@
 ; 8b113
 
 .MenuDataHeader: ; 0x8b113
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 1, 1, 16, 9
 	dw .MenuData2
 	db 1 ; default option
@@ -276,7 +280,7 @@
 	db 0
 
 .MenuData2: ; 0x8b11c
-	db $10 ; flags
+	db SCROLLINGMENU_DISPLAY_ARROWS ; flags
 	db 4, 13 ; rows, columns
 	db 1 ; spacing
 	dba .indices
--- a/engine/events/elevator.asm
+++ b/engine/events/elevator.asm
@@ -188,7 +188,7 @@
 ; 13550
 
 Elevator_MenuDataHeader: ; 0x13550
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 12, 1, 18, 9
 	dw Elevator_MenuData2
 	db 1 ; default option
@@ -195,7 +195,7 @@
 ; 0x13558
 
 Elevator_MenuData2: ; 0x13558
-	db $10 ; flags
+	db SCROLLINGMENU_DISPLAY_ARROWS ; flags
 	db 4, 0 ; rows, columns
 	db 1 ; horizontal spacing
 	dbw 0, CurElevator
--- a/engine/events/kurt.asm
+++ b/engine/events/kurt.asm
@@ -84,7 +84,7 @@
 ; 88086
 
 .MenuDataHeader: ; 0x88086
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 1, 1, 13, 10
 	dw .MenuData2
 	db 1 ; default option
@@ -93,7 +93,7 @@
 	db 0 ; XXX
 
 .MenuData2: ; 0x8808f
-	db $10 ; flags
+	db SCROLLINGMENU_DISPLAY_ARROWS ; flags
 	db 4, 7
 	db 1
 	dbw 0, Buffer1
@@ -158,12 +158,10 @@
 ; 8810d
 
 .MenuDataHeader: ; 0x8810d
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 6, 9, SCREEN_WIDTH - 1, 12
-
-	; unused
-	dw 0
-	db -1
+	dw NULL
+	db -1 ; default option
 	db 0
 
 .PlaceApricornName: ; 88116
--- a/engine/events/mom.asm
+++ b/engine/events/mom.asm
@@ -728,7 +728,7 @@
 ; 166b5
 
 MenuDataHeader_0x166b5: ; 0x166b5
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 10, 10
 	dw MenuData2_0x166bd
 	db 1 ; default option
@@ -735,7 +735,7 @@
 ; 0x166bd
 
 MenuData2_0x166bd: ; 0x166bd
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "GET@"
 	db "SAVE@"
--- a/engine/events/move_tutor.asm
+++ b/engine/events/move_tutor.asm
@@ -99,5 +99,5 @@
 	ret
 
 .MenuDataHeader: ; 0x4930a
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
--- a/engine/events/pokecenter_pc.asm
+++ b/engine/events/pokecenter_pc.asm
@@ -27,13 +27,13 @@
 	ret
 
 .TopMenu:
-	db $48 ; flags
+	db MENU_BACKUP_TILES | MENU_NO_CLICK_SFX ; flags
 	menu_coords 0, 0, 15, 12
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 0 ; items
 	dw .WhichPC
 	dw PlaceNthMenuStrings
@@ -231,7 +231,7 @@
 ; 15736
 
 KrissPCMenuData: ; 0x15736
-	db %01000000
+	db MENU_BACKUP_TILES ; flags
 	db  0,  0 ; top left corner coords (y, x)
 	db 12, 15 ; bottom right corner coords (y, x)
 	dw .KrissPCMenuData2
@@ -238,7 +238,7 @@
 	db 1 ; default selected option
 
 .KrissPCMenuData2:
-	db %10100000 ; bit7
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 0 ; # items?
 	dw .KrissPCMenuList1
 	dw PlaceNthMenuStrings
@@ -619,13 +619,13 @@
 	ret
 
 .PCItemsMenuData:
-	db %01000000
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 4, 1, 18, 10
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db %10110000
+	db SCROLLINGMENU_ENABLE_SELECT | SCROLLINGMENU_ENABLE_FUNCTION3 | SCROLLINGMENU_DISPLAY_ARROWS ; flags
 	db 4, 8 ; rows/cols?
 	db 2 ; horizontal spacing?
 	dbw 0, PCItems
--- a/engine/events/pokepic.asm
+++ b/engine/events/pokepic.asm
@@ -42,7 +42,7 @@
 	ret
 
 PokepicMenuDataHeader: ; 0x24547
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 6, 4, 14, 13
 	dw NULL
 	db 1 ; default option
--- a/engine/events/std_scripts.asm
+++ b/engine/events/std_scripts.asm
@@ -1870,13 +1870,13 @@
 
 
 .MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 4, 15, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 3 ; items
 	db " 50 :  ¥1000@"
 	db "500 : ¥10000@"
--- a/engine/init_gender.asm
+++ b/engine/init_gender.asm
@@ -44,7 +44,7 @@
 ; 48dfc (12:4dfc)
 
 .MenuDataHeader: ; 0x48dfc
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 6, 4, 12, 9
 	dw .MenuData2
 	db 1 ; default option
@@ -51,7 +51,7 @@
 ; 0x48e04
 
 .MenuData2: ; 0x48e04
-	db $a1 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_DISABLE_B ; flags
 	db 2 ; items
 	db "Boy@"
 	db "Girl@"
--- a/engine/intro_menu.asm
+++ b/engine/intro_menu.asm
@@ -553,7 +553,7 @@
 ; 5ed9
 
 .MenuDataHeader_Dex: ; 5ed9
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 15, 9
 	dw .MenuData2_Dex
 	db 1 ; default option
@@ -560,7 +560,7 @@
 ; 5ee1
 
 .MenuData2_Dex: ; 5ee1
-	db $00 ; flags
+	db 0 ; flags
 	db 4 ; items
 	db "PLAYER@"
 	db "BADGES@"
@@ -569,7 +569,7 @@
 ; 5efb
 
 .MenuDataHeader_NoDex: ; 5efb
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 15, 9
 	dw .MenuData2_NoDex
 	db 1 ; default option
@@ -576,7 +576,7 @@
 ; 5f03
 
 .MenuData2_NoDex: ; 5f03
-	db $00 ; flags
+	db 0 ; flags
 	db 4 ; items
 	db "PLAYER <PLAYER>@"
 	db "BADGES@"
--- a/engine/mail.asm
+++ b/engine/mail.asm
@@ -558,13 +558,13 @@
 	ret
 
 .TopMenuDataHeader: ; 0x4494c
-	db %01000000 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 8, 1, SCREEN_WIDTH - 2, 10
 	dw .TopMenuData2
 	db 1 ; default option
 
 .TopMenuData2:
-	db %00010000 ; flags
+	db SCROLLINGMENU_DISPLAY_ARROWS ; flags
 	db 4, 0 ; rows/columns?
 	db 1 ; horizontal spacing?
 	dbw 0, wMailboxCount ; text pointer
@@ -573,13 +573,13 @@
 	dba NULL
 
 .SubMenuDataHeader: ; 0x44964
-	db %01000000 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 13, 9
 	dw .SubMenuData2
 	db 1 ; default option
 
 .SubMenuData2:
-	db %10000000 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "READ MAIL@"
 	db "PUT IN PACK@"
--- a/engine/main_menu.asm
+++ b/engine/main_menu.asm
@@ -30,7 +30,7 @@
 ; 49d14
 
 .MenuDataHeader: ; 49d14
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 16, 7
 	dw .MenuData2
 	db 1 ; default option
@@ -37,7 +37,7 @@
 ; 49d1c
 
 .MenuData2: ; 49d1c
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 0 ; items
 	dw MainMenuItems
 	dw PlaceMenuStrings
--- a/engine/mart.asm
+++ b/engine/mart.asm
@@ -617,7 +617,7 @@
 ; 0x15e18
 
 MenuDataHeader_Buy: ; 0x15e18
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 1, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .menudata2
 	db 1 ; default option
@@ -624,7 +624,7 @@
 ; 0x15e20
 
 .menudata2 ; 0x15e20
-	db $30 ; pointers
+	db SCROLLINGMENU_DISPLAY_ARROWS | SCROLLINGMENU_ENABLE_FUNCTION3 ; flags
 	db 4, 8 ; rows, columns
 	db 1 ; horizontal spacing
 	dbw 0, CurMart
@@ -901,7 +901,7 @@
 ; 0x15f88
 
 MenuDataHeader_BuySell: ; 0x15f88
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 7, 8
 	dw .menudata2
 	db 1 ; default option
@@ -908,7 +908,7 @@
 ; 0x15f90
 
 .menudata2 ; 0x15f90
-	db $80 ; strings
+	db STATICMENU_CURSOR ; strings
 	db 3 ; items
 	db "BUY@"
 	db "SELL@"
--- a/engine/menu.asm
+++ b/engine/menu.asm
@@ -110,14 +110,14 @@
 	ret
 ; 240cd
 
-GetMenuNumberOfColumns: ; 240cd
-	ld a, [wMenuData2Items]
+Get2DMenuNumberOfColumns: ; 240cd
+	ld a, [wMenuData2_2DMenuDimensions]
 	and $f
 	ret
 ; 240d3
 
-GetMenuNumberOfRows: ; 240d3
-	ld a, [wMenuData2Items]
+Get2DMenuNumberOfRows: ; 240d3
+	ld a, [wMenuData2_2DMenuDimensions]
 	swap a
 	and $f
 	ret
@@ -130,12 +130,12 @@
 	ld d, [hl]
 	call GetMenuTextStartCoord
 	call Coord2Tile
-	call GetMenuNumberOfRows
+	call Get2DMenuNumberOfRows
 	ld b, a
 .row
 	push bc
 	push hl
-	call GetMenuNumberOfColumns
+	call Get2DMenuNumberOfColumns
 	ld c, a
 .col
 	push bc
@@ -142,7 +142,7 @@
 	ld a, [wMenuData2_2DMenuItemStringsBank]
 	call Place2DMenuItemName
 	inc de
-	ld a, [wMenuData2Spacing]
+	ld a, [wMenuData2_2DMenuSpacing]
 	ld c, a
 	ld b, 0
 	add hl, bc
@@ -174,9 +174,9 @@
 	dec c
 	ld a, c
 	ld [w2DMenuCursorInitX], a
-	call GetMenuNumberOfRows
+	call Get2DMenuNumberOfRows
 	ld [w2DMenuNumRows], a
-	call GetMenuNumberOfColumns
+	call Get2DMenuNumberOfColumns
 	ld [w2DMenuNumCols], a
 	call .InitFlags_a
 	call .InitFlags_b
@@ -238,7 +238,7 @@
 ; 2418a
 
 .InitFlags_b: ; 2418a
-	ld a, [wMenuData2Spacing]
+	ld a, [wMenuData2_2DMenuSpacing]
 	or $20
 	ld [w2DMenuCursorOffsets], a
 	ret
--- a/engine/menu_2.asm
+++ b/engine/menu_2.asm
@@ -53,13 +53,13 @@
 	ret
 
 MenuDataHeader_0x24b15: ; 0x24b15
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 0, SCREEN_WIDTH - 1, 2
 	dw NULL
 	db 1 ; default option
 
 MenuDataHeader_0x24b1d: ; 0x24b1d
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 11, 8, 13
 	dw NULL
 	db 1 ; default option
--- a/engine/mon_menu.asm
+++ b/engine/mon_menu.asm
@@ -55,7 +55,7 @@
 ; 24d3f
 
 .MenuDataHeader: ; 24d3f
-	db $40 ; tile backup
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 6, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw 0
 	db 1 ; default option
@@ -77,7 +77,7 @@
 
 MonMenuLoop: ; 24d59
 .loop
-	ld a, $a0 ; flags
+	ld a, MENU_UNUSED_3 | MENU_BACKUP_TILES_2 ; flags
 	ld [wMenuData2Flags], a
 	ld a, [Buffer1] ; items
 	ld [wMenuData2Items], a
@@ -324,7 +324,7 @@
 ; 24ed4
 
 MenuDataHeader_0x24ed4: ; 24ed4
-	db $00 ; flags
+	db 0 ; flags
 	menu_coords 11, 11, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw MenuData2_0x24edc
 	db 1 ; default option
@@ -331,7 +331,7 @@
 ; 24edc
 
 MenuData2_0x24edc: ; 24edc
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 3 ; items
 	db "SWITCH@"
 	db "STATS@"
--- a/engine/pack.asm
+++ b/engine/pack.asm
@@ -162,7 +162,7 @@
 
 ; 10124 (4:4124)
 .MenuDataHeader1: ; 0x10124
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2_1
 	db 1 ; default option
@@ -169,7 +169,7 @@
 ; 0x1012c
 
 .MenuData2_1: ; 0x1012c
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2 ; items
 	db "USE@"
 	db "QUIT@"
@@ -182,7 +182,7 @@
 ; 1013b
 
 .MenuDataHeader2: ; 0x1013b
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2_2
 	db 1 ; default option
@@ -189,7 +189,7 @@
 ; 0x10143
 
 .MenuData2_2: ; 0x10143
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 3 ; items
 	db "USE@"
 	db "GIVE@"
@@ -321,7 +321,7 @@
 
 ; 10249 (4:4249)
 MenuDataHeader_UsableKeyItem: ; 0x10249
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -328,7 +328,7 @@
 ; 0x10251
 
 .MenuData2: ; 0x10251
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 5 ; items
 	db "USE@"
 	db "GIVE@"
@@ -346,7 +346,7 @@
 ; 10274
 
 MenuDataHeader_UsableItem: ; 0x10274
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -353,7 +353,7 @@
 ; 0x1027c
 
 .MenuData2: ; 0x1027c
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 4 ; items
 	db "USE@"
 	db "GIVE@"
@@ -369,7 +369,7 @@
 ; 10299
 
 MenuDataHeader_UnusableItem: ; 0x10299
-	db %01000000 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -376,7 +376,7 @@
 ; 0x102a1
 
 .MenuData2: ; 0x102a1
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2 ; items
 	db "USE@"
 	db "QUIT@"
@@ -388,7 +388,7 @@
 ; 102b0
 
 MenuDataHeader_UnusableKeyItem: ; 0x102b0
-	db %01000000 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -395,7 +395,7 @@
 ; 0x102b8
 
 .MenuData2: ; 0x102b8
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 3 ; items
 	db "USE@"
 	db "SEL@"
@@ -409,7 +409,7 @@
 ; 102cd
 
 MenuDataHeader_HoldableKeyItem: ; 0x102cd
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -416,7 +416,7 @@
 ; 0x102d5
 
 .MenuData2: ; 0x102d5
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 4 ; items
 	db "GIVE@"
 	db "TOSS@"
@@ -432,7 +432,7 @@
 ; 102f2
 
 MenuDataHeader_HoldableItem: ; 0x102f2
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -439,7 +439,7 @@
 ; 0x102fa
 
 .MenuData2: ; 0x102fa
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 3 ; items
 	db "GIVE@"
 	db "TOSS@"
@@ -848,7 +848,7 @@
 
 ; 10601 (4:4601)
 .UsableMenuDataHeader: ; 0x10601
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .UsableMenuData2
 	db 1 ; default option
@@ -855,7 +855,7 @@
 ; 0x10609
 
 .UsableMenuData2: ; 0x10609
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2 ; items
 	db "USE@"
 	db "QUIT@"
@@ -867,7 +867,7 @@
 ; 10618
 
 .UnusableMenuDataHeader: ; 0x10618
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .UnusableMenuData2
 	db 1 ; default option
@@ -874,7 +874,7 @@
 ; 0x10620
 
 .UnusableMenuData2: ; 0x10620
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 1 ; items
 	db "QUIT@"
 ; 0x10627
@@ -1158,7 +1158,7 @@
 
 ; 107ef (4:47ef)
 .ItemsMenuDataHeader: ; 0x107ef
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .ItemsMenuData2
 	db 1 ; default option
@@ -1165,7 +1165,7 @@
 ; 0x107f7
 
 .ItemsMenuData2: ; 0x107f7
-	db $ae ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
 	dbw 0, wDudeNumItems
@@ -1181,7 +1181,7 @@
 
 ; 1080e (4:480e)
 .KeyItemsMenuDataHeader: ; 0x1080e
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .KeyItemsMenuData2
 	db 1 ; default option
@@ -1188,7 +1188,7 @@
 ; 0x10816
 
 .KeyItemsMenuData2: ; 0x10816
-	db $ae ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags
 	db 5, 8 ; rows, columns
 	db 1 ; horizontal spacing
 	dbw 0, wDudeNumKeyItems
@@ -1213,7 +1213,7 @@
 
 ; 10842 (4:4842)
 .BallsMenuDataHeader: ; 0x10842
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .BallsMenuData2
 	db 1 ; default option
@@ -1220,7 +1220,7 @@
 ; 0x1084a
 
 .BallsMenuData2: ; 0x1084a
-	db $ae ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
 	dbw 0, wDudeNumBalls
@@ -1537,7 +1537,7 @@
 ; 10a4f
 
 ItemsPocketMenuDataHeader: ; 0x10a4f
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -1544,7 +1544,7 @@
 ; 0x10a57
 
 .MenuData2: ; 0x10a57
-	db $ae ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
 	dbw 0, NumItems
@@ -1554,7 +1554,7 @@
 ; 10a67
 
 PC_Mart_ItemsPocketMenuDataHeader: ; 0x10a67
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -1561,7 +1561,7 @@
 ; 0x10a6f
 
 .MenuData2: ; 0x10a6f
-	db $2e ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
 	dbw 0, NumItems
@@ -1571,7 +1571,7 @@
 ; 10a7f
 
 KeyItemsPocketMenuDataHeader: ; 0x10a7f
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -1578,7 +1578,7 @@
 ; 0x10a87
 
 .MenuData2: ; 0x10a87
-	db $ae ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags
 	db 5, 8 ; rows, columns
 	db 1 ; horizontal spacing
 	dbw 0, NumKeyItems
@@ -1588,7 +1588,7 @@
 ; 10a97
 
 PC_Mart_KeyItemsPocketMenuDataHeader: ; 0x10a97
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -1595,7 +1595,7 @@
 ; 0x10a9f
 
 .MenuData2: ; 0x10a9f
-	db $2e ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags
 	db 5, 8 ; rows, columns
 	db 1 ; horizontal spacing
 	dbw 0, NumKeyItems
@@ -1605,7 +1605,7 @@
 ; 10aaf
 
 BallsPocketMenuDataHeader: ; 0x10aaf
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -1612,7 +1612,7 @@
 ; 0x10ab7
 
 .MenuData2: ; 0x10ab7
-	db $ae ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
 	dbw 0, NumBalls
@@ -1622,7 +1622,7 @@
 ; 10ac7
 
 PC_Mart_BallsPocketMenuDataHeader: ; 0x10ac7
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -1629,7 +1629,7 @@
 ; 0x10acf
 
 .MenuData2: ; 0x10acf
-	db $2e ; flags
+	db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags
 	db 5, 8 ; rows, columns
 	db 2 ; horizontal spacing
 	dbw 0, NumBalls
--- a/engine/slot_machine.asm
+++ b/engine/slot_machine.asm
@@ -1868,7 +1868,7 @@
 ; 0x930d6
 
 .MenuDataHeader: ; 0x930d6
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -1875,7 +1875,7 @@
 ; 0x930de
 
 .MenuData2: ; 0x930de
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 3 ; items
 	db " 3@"
 	db " 2@"
--- a/engine/start_menu.asm
+++ b/engine/start_menu.asm
@@ -152,19 +152,19 @@
 
 
 .MenuDataHeader:
-	db $40 ; tile backup
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw .MenuData
 	db 1 ; default selection
 
 .ContestMenuDataHeader:
-	db $40 ; tile backup
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 2, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw .MenuData
 	db 1 ; default selection
 
 .MenuData:
-	db %10101000 ; x padding, wrap around, start can close
+	db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_ENABLE_START ; flags
 	dn 0, 0 ; rows, columns
 	dw MenuItemsList
 	dw .MenuString
@@ -974,13 +974,13 @@
 
 
 GiveTakeItemMenuData: ; 12c9b
-	db %01010000
+	db MENU_SPRITE_ANIMS | MENU_BACKUP_TILES ; flags
 	menu_coords 12, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw .Items
 	db 1 ; default option
 
 .Items:
-	db %10000000 ; x padding
+	db STATICMENU_CURSOR ; flags
 	db 2 ; # items
 	db "GIVE@"
 	db "TAKE@"
@@ -1162,7 +1162,7 @@
 
 
 .MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 12, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw .MenuData2
 	db 1 ; default option
@@ -1169,7 +1169,7 @@
 ; 0x12dd1
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 3 ; items
 	db "READ@"
 	db "TAKE@"
--- a/home/menu.asm
+++ b/home/menu.asm
@@ -39,7 +39,7 @@
 ; 1d5f
 
 .MenuDataHeader: ; 1d5f
-	db $40 ; tile backup
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw vTiles0
 	db 0 ; default option
@@ -58,7 +58,7 @@
 ; 1d75
 
 .MenuDataHeader: ; 1d75
-	db $40 ; tile backup
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw 0
 	db 1 ; default option
@@ -180,7 +180,7 @@
 ; 1e1d
 
 YesNoMenuDataHeader:: ; 1e1d
-	db $40 ; tile backup
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 5, 15, 9
 	dw .MenuData2
 	db 1 ; default option
@@ -187,7 +187,7 @@
 ; 1e25
 
 .MenuData2: ; 1e25
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2
 	db "YES@"
 	db "NO@"
--- a/maps/CeladonDeptStore6F.asm
+++ b/maps/CeladonDeptStore6F.asm
@@ -80,13 +80,13 @@
 	jump .Start
 
 .MenuData:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "FRESH WATER  ¥200@"
 	db "SODA POP     ¥300@"
--- a/maps/CeladonGameCornerPrizeRoom.asm
+++ b/maps/CeladonGameCornerPrizeRoom.asm
@@ -103,13 +103,13 @@
 	end
 
 CeladonPrizeRoom_TMMenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, 15, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "TM32    1500@"
 	db "TM29    3500@"
@@ -189,13 +189,13 @@
 	jump .loop
 
 .MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, 17, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "PIKACHU    2222@"
 	db "PORYGON    5555@"
--- a/maps/DragonShrine.asm
+++ b/maps/DragonShrine.asm
@@ -266,13 +266,13 @@
 	end
 
 DragonShrineQuestion1_MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 8, 4, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	db 3 ; items
 	db "Pal@"
 	db "Underling@"
@@ -279,13 +279,13 @@
 	db "Friend@"
 
 DragonShrineQuestion2_MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 9, 4, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	db 3 ; items
 	db "Strategy@"
 	db "Raising@"
@@ -292,13 +292,13 @@
 	db "Cheating@"
 
 DragonShrineQuestion3_MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 5, 4, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	db 3 ; items
 	db "Weak person@"
 	db "Tough person@"
@@ -305,13 +305,13 @@
 	db "Anybody@"
 
 DragonShrineQuestion4_MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 8, 4, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	db 3 ; items
 	db "Love@"
 	db "Violence@"
@@ -318,13 +318,13 @@
 	db "Knowledge@"
 
 DragonShrineQuestion5_MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 12, 4, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $81 ; flags
+	db STATICMENU_CURSOR | STATICMENU_DISABLE_B ; flags
 	db 3 ; items
 	db "Tough@"
 	db "Both@"
--- a/maps/EarlsPokemonAcademy.asm
+++ b/maps/EarlsPokemonAcademy.asm
@@ -103,13 +103,13 @@
 	jump .Loop
 
 .BlackboardMenuData:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 11, 8
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	dn 3, 2 ; rows, columns
 	db 5 ; spacing
 	dba .Text
--- a/maps/GoldenrodCity.asm
+++ b/maps/GoldenrodCity.asm
@@ -95,13 +95,13 @@
 	jump .Incompatible
 
 .MoveMenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, 15, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "FLAMETHROWER@"
 	db "THUNDERBOLT@"
--- a/maps/GoldenrodDeptStore6F.asm
+++ b/maps/GoldenrodDeptStore6F.asm
@@ -69,13 +69,13 @@
 	jump .Start
 
 .MenuData:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "FRESH WATER  ¥200@"
 	db "SODA POP     ¥300@"
--- a/maps/GoldenrodGameCorner.asm
+++ b/maps/GoldenrodGameCorner.asm
@@ -139,13 +139,13 @@
 	end
 
 GoldenrodGameCornerTMVendorMenuData:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, 15, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "TM25    5500@"
 	db "TM14    5500@"
@@ -225,13 +225,13 @@
 	jump .loop
 
 .MenuDataHeader:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, 17, TEXTBOX_Y - 1
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 4 ; items
 	db "ABRA        100@"
 	db "CUBONE      800@"
--- a/maps/GoldenrodPokeComCenter2FMobile.asm
+++ b/maps/GoldenrodPokeComCenter2FMobile.asm
@@ -49,13 +49,13 @@
 	end
 
 MenuDataHeader_0x62602:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 15, 8
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 3 ; items
 	db "# つうしん クラブ@" ; # COM CLUB
 	db "モバイルセンター@" ; MOBILE CENTER
@@ -91,13 +91,13 @@
 	end
 
 MenuDataHeader_0x6264c:
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 15, 8
 	dw .MenuData2
 	db 1 ; default option
 
 .MenuData2:
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 3 ; items
 	db "でんわ", $1f,"つかうとき@" ; Use phone
 	db "でんわ", $4a,"つながらないとき@" ; Don't use phone
--- a/mobile/mobile_12.asm
+++ b/mobile/mobile_12.asm
@@ -563,7 +563,7 @@
 ; 484f1
 
 MenuDataHeader_0x484f1: ; 0x484f1
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 2, SCREEN_WIDTH - 1, 7
 	dw MenuData2_0x484f9
 	db 1 ; default option
@@ -570,7 +570,7 @@
 ; 0x484f9
 
 MenuData2_0x484f9: ; 0x484f9
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 2 ; items
 Strings_484fb:
 String_484fb: db "Boy@"
@@ -578,19 +578,19 @@
 ; 0x48504
 
 MenuDataHeader_0x48504: ; 0x48504
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 
 MenuDataHeader_0x48509: ; 0x48509
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 5, SCREEN_WIDTH - 1, 7
 
 MenuDataHeader_0x4850e: ; 0x4850e
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 
 MenuDataHeader_0x48513: ; 0x48513
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 1, 18, 12
 	dw MenuData2_0x4851b
 	db 1 ; default option
@@ -597,7 +597,7 @@
 ; 0x4851b
 
 MenuData2_0x4851b: ; 0x4851b
-	db $1d ; flags
+	db SCROLLINGMENU_DISPLAY_ARROWS | SCROLLINGMENU_ENABLE_RIGHT | SCROLLINGMENU_ENABLE_LEFT | SCROLLINGMENU_CALL_FUNCTION1_CANCEL ; flags
 	db 6 ; items
 
 Unknown_4851d: ; 4851d
@@ -723,7 +723,7 @@
 .got_num_rows_2
 	ld a, 1
 	ld [hli], a ; num cols
-	ld [hl], $0 ; flags 1
+	ld [hl], 0 ; flags 1
 	set 5, [hl]
 	inc hl
 	xor a
@@ -789,7 +789,7 @@
 	ld [hli], a ; num rows
 	ld a, 1
 	ld [hli], a ; num cols
-	ld [hl], $0 ; flags 1
+	ld [hl], 0 ; flags 1
 	set 5, [hl]
 	inc hl
 	xor a
@@ -1272,7 +1272,7 @@
 ; 48a9c (12:4a9c)
 
 MenuDataHeader_0x48a9c: ; 0x48a9c
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 8, SCREEN_WIDTH - 1, 13
 
 String_48aa1: ; 48aa1
--- a/mobile/mobile_12_2.asm
+++ b/mobile/mobile_12_2.asm
@@ -715,7 +715,7 @@
 ; 4aca2
 
 MenuDataHeader_0x4aca2: ; 0x4aca2
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 9, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw NULL
 	db 1 ; default option
--- a/mobile/mobile_22.asm
+++ b/mobile/mobile_22.asm
@@ -277,7 +277,7 @@
 ; 892a3
 
 MenuDataHeader_0x892a3: ; 0x892a3
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 5, 15, 9
 	dw MenuData2_0x892ab
 	db 1 ; default option
@@ -284,7 +284,7 @@
 ; 0x892ab
 
 MenuData2_0x892ab: ; 0x892ab
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2 ; items
 	db "はい@"
 	db "いいえ@"
@@ -2831,7 +2831,7 @@
 ; 8a176 (22:6176)
 
 MenuDataHeader_0x8a176: ; 0x8a176
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 0, SCREEN_WIDTH - 1, 6
 ; 8a17b
 
@@ -2853,7 +2853,7 @@
 ; 8a19a (22:619a)
 
 MenuDataHeader_0x8a19a: ; 0x8a19a
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 0, SCREEN_WIDTH - 1, 6
 	dw MenuData2_0x8a1a2
 	db 1 ; default option
@@ -2860,7 +2860,7 @@
 ; 0x8a1a2
 
 MenuData2_0x8a1a2: ; 0x8a1a2
-	db $e0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING | STATICMENU_WRAP ; flags
 	db 3 ; items
 	db "ひらく@"
 	db "すてる@"
@@ -3012,7 +3012,7 @@
 ; 8a2ef (22:62ef)
 
 MenuDataHeader_0x8a2ef: ; 0x8a2ef
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 ; 8a2f4
 
@@ -3173,7 +3173,7 @@
 Unknown_8a40b: db 1, 2, 3, -1
 
 MenuDataHeader_0x8a40f: ; 0x8a40f
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, 10, TEXTBOX_Y - 1
 	dw MenuData2_0x8a417
 	db 1 ; default option
@@ -3180,7 +3180,7 @@
 ; 0x8a417
 
 MenuData2_0x8a417: ; 0x8a417
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 4 ; items
 	db "めいしりスト@"
 	db "じぶんの めいし@"
@@ -3189,7 +3189,7 @@
 ; 0x8a435
 
 MenuDataHeader_0x8a435: ; 0x8a435
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 2, 10, 9
 	dw MenuData2_0x8a43d
 	db 1 ; default option
@@ -3196,7 +3196,7 @@
 ; 0x8a43d
 
 MenuData2_0x8a43d: ; 0x8a43d
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 3 ; items
 	db "めいしりスト@"
 	db "じぶんの めいし@"
@@ -3914,7 +3914,7 @@
 ; 8a9c9 (22:69c9)
 
 MenuDataHeader_0x8a9c9: ; 0x8a9c9
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 4, 18, TEXTBOX_Y - 1
 ; 8a9ce
 
@@ -3943,7 +3943,7 @@
 ; 8a9f2 (22:69f2)
 
 MenuDataHeader_0x8a9f2: ; 0x8a9f2
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 4, 18, TEXTBOX_Y - 1
 	dw MenuData2_0x8a9fa
 	db 1 ; default option
@@ -3950,7 +3950,7 @@
 ; 0x8a9fa
 
 MenuData2_0x8a9fa: ; 0x8a9fa
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 3 ; items
 	db "へんしゅう@"
 	db "みる@"
--- a/mobile/mobile_22_2.asm
+++ b/mobile/mobile_22_2.asm
@@ -910,7 +910,7 @@
 ; 8b867
 
 MenuDataHeader_0x8b867: ; 0x8b867
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 1, 3, 18, 13
 	dw MenuData2_0x8b870
 	db 1 ; default option
@@ -919,7 +919,7 @@
 	db 0
 
 MenuData2_0x8b870: ; 0x8b870
-	db $3c ; flags
+	db SCROLLINGMENU_ENABLE_FUNCTION3 | SCROLLINGMENU_DISPLAY_ARROWS | SCROLLINGMENU_ENABLE_RIGHT | SCROLLINGMENU_ENABLE_LEFT ; flags
 	db 5 ; items
 	db 3, 1
 	dbw 0, wd002
@@ -1082,11 +1082,11 @@
 ; 8b9ac
 
 MenuDataHeader_0x8b9ac: ; 0x8b9ac
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 0, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 
 MenuDataHeader_0x8b9b1: ; 0x8b9b1
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 0, SCREEN_WIDTH - 1, 7
 	dw MenuData2_0x8b9b9
 	db 1 ; default option
@@ -1093,7 +1093,7 @@
 ; 0x8b9b9
 
 MenuData2_0x8b9b9: ; 0x8b9b9
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 3 ; items
 	db "へんしゅう@" ; EDIT
 	db "いれかえ@"   ; REPLACE
@@ -1101,7 +1101,7 @@
 ; 0x8b9ca
 
 MenuDataHeader_0x8b9ca: ; 0x8b9ca
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 11, 0, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw MenuData2_0x8b9d2
 	db 1 ; default option
@@ -1108,7 +1108,7 @@
 ; 0x8b9d2
 
 MenuData2_0x8b9d2: ; 0x8b9d2
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 5 ; items
 	db "みる@"       ; VIEW
 	db "へんしゅう@" ; EDIT
--- a/mobile/mobile_40.asm
+++ b/mobile/mobile_40.asm
@@ -924,7 +924,7 @@
 ; 1005b2
 
 MenuDataHeader_1005b2: ; 1005b2
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	db 6, 14
 	db 10, 19
 	dw MenuData2_1005ba
@@ -931,7 +931,7 @@
 	db 1 ; default option
 
 MenuData2_1005ba:
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2
 	db "はい@"
 	db "いいえ@"
@@ -975,7 +975,7 @@
 ; 1005fc
 
 MenuDataHeader_1005fc: ; 1005fc
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	db 6, 14
 	db 10, 19
 	dw MenuData2_100604
@@ -982,7 +982,7 @@
 	db 1 ; default option
 
 MenuData2_100604: ; 100604
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 2
 	db "かける@"
 	db "まつ@"
@@ -2125,7 +2125,7 @@
 	db 1 ; default option
 
 .MenuData2: ; 100d90
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 3
 	db "いれかえる@"  ; TRADE
 	db "つよさをみる@" ; STATS
@@ -6286,7 +6286,7 @@
 ; 1029bb
 
 MenuDataHeader_1029bb: ; 1029bb
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 3, 10, 15, 12
 	dw NULL
 	db 1 ; default option
@@ -7783,13 +7783,13 @@
 ; 103640
 
 MenuDataHeader_103640: ; 103640
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 6, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw MenuData2_103648
 	db 1 ; default option
 
 MenuData2_103648: ; 103648
-	db $80 ; flags
+	db STATICMENU_CURSOR ; flags
 	db 2
 	db "モバイル@"
 	db "ケーブル@"
@@ -7937,13 +7937,13 @@
 ; 103747
 
 MenuDataHeader_103747: ; 103747
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw MenuData2_10374f
 	db 1 ; default option
 
 MenuData2_10374f: ; 10374f
-	db $c0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
 	db 3
 	db "はい@"
 	db "やめる@"
--- a/mobile/mobile_45.asm
+++ b/mobile/mobile_45.asm
@@ -7298,7 +7298,7 @@
 ; 1179b5 (45:79b5)
 
 MenuDataHeader_1179b5: ; 1179b5
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw NULL
 	db 0 ; default option
@@ -7305,7 +7305,7 @@
 ; 1179bd
 
 MenuDataHeader_1179bd: ; 1179bd
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw NULL
 	db 0 ; default option
@@ -7657,13 +7657,13 @@
 	ret
 
 MenuDataHeader_117cbc: ; 0x117cbc
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw NULL
 	db 0 ; default option
 
 MenuDataHeader_117cc4: ; 0x117cc4
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw NULL
 	db 0 ; default item
--- a/mobile/mobile_45_sprite_engine.asm
+++ b/mobile/mobile_45_sprite_engine.asm
@@ -507,7 +507,7 @@
 ; 11628c
 
 MenuDataHeader_11628c: ; 11628c
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 6, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw NULL
 	db 0 ; default option
--- a/mobile/mobile_46.asm
+++ b/mobile/mobile_46.asm
@@ -3954,7 +3954,7 @@
 ; 119cf7
 
 MenuDataHeader_119cf7: ; 119cf7
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 12, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw NULL
 	db 0 ; default option
@@ -3961,7 +3961,7 @@
 ; 119cff
 
 MenuData_119cff: ; 119cff
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 15, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw NULL
 	db 0 ; default option
@@ -4754,7 +4754,7 @@
 ; 11a2d6
 
 MenuDataHeader_11a2d6: ; 11a2d6
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 6, SCREEN_WIDTH - 1, 10
 	dw NULL
 	db 0 ; default option
@@ -4761,7 +4761,7 @@
 ; 11a2de
 
 MenuDataHeader_11a2de: ; 11a2de
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw NULL
 	db 0 ; default option
@@ -5324,7 +5324,7 @@
 ; 11a804
 
 MenuDataHeader_11a804: ; 11a804
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, SCREEN_WIDTH - 1, 5
 	dw NULL
 	db 0 ; default option
@@ -5995,7 +5995,7 @@
 ; 11ae38
 
 MenuDataHeader_11ae38: ; 11ae38
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 10, 10, 17, SCREEN_HEIGHT - 1
 	dw NULL
 	db 0 ; default option
@@ -6241,7 +6241,7 @@
 ; 11afe8
 
 MenuDataHeader_11afe8: ; 11afe8
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 9, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw NULL
 	db 0 ; default option
@@ -6258,7 +6258,7 @@
 ; 11b013
 
 MenuDataHeader_11b013: ; 11b013
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw NULL
 	db 1 ; default option
--- a/mobile/mobile_5c.asm
+++ b/mobile/mobile_5c.asm
@@ -672,7 +672,7 @@
 ; 171c6b (5c:5c6b)
 
 MenuDataHeader_171c6b: ; 171c6b
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
 	dw NULL
 	db 0 ; default option
--- a/mobile/mobile_5f.asm
+++ b/mobile/mobile_5f.asm
@@ -483,13 +483,13 @@
 ; 17d26a
 
 MenuDataHeader_17d26a: ; 17d26a
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 14, 9
 	dw MenuData2_17d272
 	db 1 ; default option
 
 MenuData2_17d272: ; 17d272
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 4
 	db "ニュース¯よみこむ@"
 	db "ニュース¯みる@"
@@ -498,13 +498,13 @@
 ; 17d28f
 
 MenuDataHeader_ChallengeExplanationCancel: ; 17d28f
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 0, 0, 14, 7
 	dw MenuData2_ChallengeExplanationCancel
 	db 1 ; default option
 
 MenuData2_ChallengeExplanationCancel: ; 17d297
-	db $a0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_WRAP ; flags
 	db 3
 	db "Challenge@"
 	db "Explanation@"
@@ -1941,7 +1941,7 @@
 ; 17dc96
 
 MenuData2_17dc96:
-	db $e0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING | STATICMENU_WRAP ; flags
 	db 2
 	db "はい@"
 	db "いいえ@"
--- a/mobile/mobile_menu.asm
+++ b/mobile/mobile_menu.asm
@@ -461,7 +461,7 @@
 ; 4a346 (12:6346)
 
 MenuDataHeader_0x4a346: ; 0x4a346
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 12, 0, SCREEN_WIDTH - 1, 6
 
 String_4a34b: ; 4a34b
@@ -483,7 +483,7 @@
 ; 0x4a362
 
 DeletePassword_YesNo_MenuDataHeader: ; 0x4a362
-	db $40 ; flags
+	db MENU_BACKUP_TILES ; flags
 	menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
 	dw MenuData2_0x4a36a
 	db 2 ; default option
@@ -490,7 +490,7 @@
 ; 0x4a36a
 
 MenuData2_0x4a36a: ; 0x4a36a
-	db $e0 ; flags
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING | STATICMENU_WRAP ; flags
 	db 2 ; items
 	db "はい@"
 	db "いいえ@"
--- a/wram.asm
+++ b/wram.asm
@@ -1418,37 +1418,28 @@
 wMenuDataHeaderEnd::
 
 wMenuData2::
-UNION ; cf91
 ; MenuData2
-wMenuData2Flags:: ; cf91
-; bit 7: When set, start printing text one tile to the right of the border
-;        In scrolling menus, SELECT is functional
-; bit 6: When set, start printing text one tile below the border
-;        In scrolling menus, START is functional
-; bit 5: ????
-; bit 4: ????
-; bit 3: ????
-; bit 2: ????
-; bit 1: Enable Select button
-; bit 0: Disable B button
-	db
+
+wMenuData2Flags:: db ; cf91
+
+UNION ; cf92
+; Vertical Menu/DoNthMenu/SetUpMenu
 wMenuData2Items:: db ; cf92
 wMenuData2IndicesPointer:: dw ; cf94
 wMenuData2DisplayFunctionPointer:: dw ; cf96
 wMenuData2PointerTableAddr:: dw ; cf97
 
-NEXTU ; cf91
-; 2D menu
-	ds 2 ; cf91
-wMenuData2Spacing:: db ; cf93
+NEXTU ; cf92
+; 2D Menu
+wMenuData2_2DMenuDimensions:: db ; cf92
+wMenuData2_2DMenuSpacing:: db ; cf93
 wMenuData2_2DMenuItemStringsBank:: db ; cf94
 wMenuData2_2DMenuItemStringsAddr:: dw ; cf96
 wMenuData2_2DMenuFunctionBank:: db ; cf97
 wMenuData2_2DMenuFunctionAddr:: dw ; cf98
 
-NEXTU ; cf91
-; scrolling menu
-	ds 1 ; cf91
+NEXTU ; cf92
+; Scrolling Menu
 wMenuData2_ScrollingMenuHeight:: db ; cf92
 wMenuData2_ScrollingMenuWidth:: db ; cf93
 wMenuData2_ScrollingMenuSpacing:: db ; cf94
@@ -1465,7 +1456,16 @@
 w2DMenuCursorInitX:: db ; cfa2
 w2DMenuNumRows:: db ; cfa3
 w2DMenuNumCols:: db ; cfa4
-w2DMenuFlags1:: db ; cfa5
+w2DMenuFlags1:: ; cfa5
+; bit 7: Disable checking of wMenuJoypadFilter
+; bit 6: Enable sprite animations
+; bit 5: Wrap around vertically
+; bit 4: Wrap around horizontally
+; bit 3: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 5 is disabled and we tried to go too far down
+; bit 2: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 5 is disabled and we tried to go too far up
+; bit 1: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 4 is disabled and we tried to go too far left
+; bit 0: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 4 is disabled and we tried to go too far right
+	db
 w2DMenuFlags2:: db ; cfa6
 w2DMenuCursorOffsets:: db ; cfa7
 wMenuJoypadFilter:: db ; cfa8