shithub: pokecrystal

Download patch

ref: d596a0c83bfbb97bff5cdb5b3bba925d3f798fa1
parent: 53bcd8f46ca4f78381af70f55d03f3180be277de
parent: c7bb2d15cfb32a5e965933b90e0acb497c7bf7b2
author: yenatch <yenatch@gmail.com>
date: Sun Jun 3 20:47:16 EDT 2018

Merge pull request #514 from Rangi42/master

[Ready to merge] Named constants for sprite movement data bit flags + other minor fixes

--- a/audio/engine.asm
+++ b/audio/engine.asm
@@ -1775,7 +1775,7 @@
 	swap a
 	srl a ; halve
 	ld e, a
-	adc a, 0; round up
+	adc 0 ; round up
 	swap a
 	or e
 	ld [hl], a
--- a/constants/map_constants.asm
+++ b/constants/map_constants.asm
@@ -5,8 +5,8 @@
 
 map_const: MACRO
 ;\1: map id
-;\2: height: in blocks
-;\3: width: in blocks
+;\2: width: in blocks
+;\3: height: in blocks
 GROUP_\1 EQU const_value
 	enum MAP_\1
 \1_WIDTH EQU \2
--- a/constants/map_object_constants.asm
+++ b/constants/map_object_constants.asm
@@ -44,17 +44,55 @@
 OW_RIGHT EQU RIGHT << 2
 
 ; object_struct OBJECT_FLAGS1 bit flags
-INVISIBLE    EQU 0
-FIXED_FACING EQU 2
-SLIDING      EQU 3
-EMOTE_OBJECT EQU 7
+	const_def
+	const INVISIBLE_F     ; 0
+	const WONT_DELETE_F   ; 1
+	const FIXED_FACING_F  ; 2
+	const SLIDING_F       ; 3
+	const NOCLIP_TILES_F  ; 4
+	const MOVE_ANYWHERE_F ; 5
+	const NOCLIP_OBJS_F   ; 6
+	const EMOTE_OBJECT_F  ; 7
 
+INVISIBLE     EQU 1 << INVISIBLE_F
+WONT_DELETE   EQU 1 << WONT_DELETE_F
+FIXED_FACING  EQU 1 << FIXED_FACING_F
+SLIDING       EQU 1 << SLIDING_F
+NOCLIP_TILES  EQU 1 << NOCLIP_TILES_F
+MOVE_ANYWHERE EQU 1 << MOVE_ANYWHERE_F
+NOCLIP_OBJS   EQU 1 << NOCLIP_OBJS_F
+EMOTE_OBJECT  EQU 1 << EMOTE_OBJECT_F
+
 ; object_struct OBJECT_FLAGS2 bit flags
-LOW_PRIORITY  EQU 0
-HIGH_PRIORITY EQU 1
-OVERHEAD      EQU 3
+	const_def
+	const LOW_PRIORITY_F  ; 0
+	const HIGH_PRIORITY_F ; 1
+	const OBJ_FLAGS2_2    ; 2
+	const OVERHEAD_F      ; 3
+	const USE_OBP1_F      ; 4
 
+LOW_PRIORITY  EQU 1 << LOW_PRIORITY_F
+HIGH_PRIORITY EQU 1 << HIGH_PRIORITY_F
+OVERHEAD      EQU 1 << OVERHEAD_F
+USE_OBP1      EQU 1 << USE_OBP1_F
 
+; object_struct OBJECT_PALETTE bit flags
+	const_def 5
+	const SWIMMING_F         ; 5
+	const STRENGTH_BOULDER_F ; 6
+	const BIG_OBJECT_F       ; 7
+
+SWIMMING         EQU 1 << SWIMMING_F
+STRENGTH_BOULDER EQU 1 << STRENGTH_BOULDER_F
+BIG_OBJECT       EQU 1 << BIG_OBJECT_F
+
+; facing attribute bit flags
+RELATIVE_ATTRIBUTES_F EQU 1
+ABSOLUTE_TILE_ID_F    EQU 2
+
+RELATIVE_ATTRIBUTES EQU 1 << RELATIVE_ATTRIBUTES_F
+ABSOLUTE_TILE_ID    EQU 1 << ABSOLUTE_TILE_ID_F
+
 ; map_object struct members (see macros/wram.asm)
 	const_def
 	const MAPOBJECT_OBJECT_STRUCT_ID ; 0
@@ -75,10 +113,20 @@
 	const MAPOBJECT_F ; unused
 OBJECT_LENGTH EQU const_value
 
-MAPOBJECT_SCREEN_HEIGHT EQU 11
-MAPOBJECT_SCREEN_WIDTH EQU 12
+; SpriteMovementData struct members (see data/sprites/map_objects.asm)
+	const_def
+	const SPRITEMOVEATTR_MOVEMENT ; 0
+	const SPRITEMOVEATTR_FACING   ; 1
+	const SPRITEMOVEATTR_ACTION   ; 2
+	const SPRITEMOVEATTR_FLAGS1   ; 3
+	const SPRITEMOVEATTR_FLAGS2   ; 4
+	const SPRITEMOVEATTR_PALFLAGS ; 5
+NUM_SPRITEMOVEDATA_FIELDS EQU const_value
 
+MAPOBJECT_SCREEN_WIDTH  EQU (SCREEN_WIDTH / 2) + 2
+MAPOBJECT_SCREEN_HEIGHT EQU (SCREEN_HEIGHT / 2) + 2
 
+
 ; SpriteMovementData indexes (see data/sprites/map_objects.asm)
 	const_def
 	const SPRITEMOVEDATA_00                   ; 00
@@ -119,7 +167,6 @@
 	const SPRITEMOVEDATA_GRASS                ; 23
 	const SPRITEMOVEDATA_SWIM_WANDER          ; 24
 NUM_SPRITEMOVEDATA EQU const_value
-SPRITEMOVEDATA_FIELDS EQU 6
 
 ; MapObjectMovementPattern.Pointers indexes (see engine/overworld/map_objects.asm)
 	const_def
--- a/constants/scgb_constants.asm
+++ b/constants/scgb_constants.asm
@@ -15,9 +15,9 @@
 	const SCGB_GS_TITLE_SCREEN
 	const SCGB_0D
 	const SCGB_MOVE_LIST
-	const SCGB_0F
+	const SCGB_BETA_PIKACHU_MINIGAME
 	const SCGB_POKEDEX_SEARCH_OPTION
-	const SCGB_11
+	const SCGB_BETA_POKER
 	const SCGB_POKEPIC
 	const SCGB_13
 	const SCGB_PACKPALS
@@ -75,40 +75,40 @@
 	const PREDEFPAL_RB_PINKMON
 	const PREDEFPAL_RB_YELLOWMON
 	const PREDEFPAL_CGB_BADGE ; RB_GREYMON
-	const PREDEFPAL_MEWMON_NITE
-	const PREDEFPAL_BLUEMON_NITE
-	const PREDEFPAL_REDMON_NITE
-	const PREDEFPAL_CYANMON_NITE
-	const PREDEFPAL_PURPLEMON_NITE
-	const PREDEFPAL_BROWNMON_NITE
-	const PREDEFPAL_GREENMON_NITE
-	const PREDEFPAL_PINKMON_NITE
-	const PREDEFPAL_YELLOWMON_NITE
-	const PREDEFPAL_PARTY_ICON ; GREYMON_NITE
+	const PREDEFPAL_BETA_SHINY_MEWMON
+	const PREDEFPAL_BETA_SHINY_BLUEMON
+	const PREDEFPAL_BETA_SHINY_REDMON
+	const PREDEFPAL_BETA_SHINY_CYANMON
+	const PREDEFPAL_BETA_SHINY_PURPLEMON
+	const PREDEFPAL_BETA_SHINY_BROWNMON
+	const PREDEFPAL_BETA_SHINY_GREENMON
+	const PREDEFPAL_BETA_SHINY_PINKMON
+	const PREDEFPAL_BETA_SHINY_YELLOWMON
+	const PREDEFPAL_PARTY_ICON ; BETA_SHINY_GREYMON
 	const PREDEFPAL_HP_GREEN
 	const PREDEFPAL_HP_YELLOW
 	const PREDEFPAL_HP_RED
 	const PREDEFPAL_POKEGEAR
-	const PREDEFPAL_33
-	const PREDEFPAL_34
+	const PREDEFPAL_BETA_LOGO_1
+	const PREDEFPAL_BETA_LOGO_2
 	const PREDEFPAL_GS_INTRO_GAMEFREAK_LOGO
 	const PREDEFPAL_GS_INTRO_SHELLDER_LAPRAS
-	const PREDEFPAL_37
+	const PREDEFPAL_BETA_INTRO_LAPRAS
 	const PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_BG
 	const PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_OB
 	const PREDEFPAL_GS_INTRO_STARTERS_TRANSITION
-	const PREDEFPAL_3B
+	const PREDEFPAL_BETA_INTRO_VENUSAUR
 	const PREDEFPAL_PACK ; GS_INTRO_CHARIZARD
 	const PREDEFPAL_SLOT_MACHINE_0
 	const PREDEFPAL_SLOT_MACHINE_1
 	const PREDEFPAL_SLOT_MACHINE_2
 	const PREDEFPAL_SLOT_MACHINE_3
-	const PREDEFPAL_SCGB_11_0
-	const PREDEFPAL_SCGB_11_1
-	const PREDEFPAL_SCGB_11_2
-	const PREDEFPAL_SCGB_11_3
-	const PREDEFPAL_45
-	const PREDEFPAL_46
+	const PREDEFPAL_BETA_POKER_0
+	const PREDEFPAL_BETA_POKER_1
+	const PREDEFPAL_BETA_POKER_2
+	const PREDEFPAL_BETA_POKER_3
+	const PREDEFPAL_BETA_RADIO
+	const PREDEFPAL_BETA_POKEGEAR
 	const PREDEFPAL_47
 	const PREDEFPAL_GS_TITLE_SCREEN_0
 	const PREDEFPAL_GS_TITLE_SCREEN_1
--- a/data/battle_anims/object_gfx.asm
+++ b/data/battle_anims/object_gfx.asm
@@ -1,6 +1,6 @@
 anim_obj_gfx: MACRO
 ; # tiles, label
-	db  \1
+	db \1
 	dba \2
 ENDM
 
--- a/data/events/collision_stdscripts.asm
+++ b/data/events/collision_stdscripts.asm
@@ -10,4 +10,4 @@
 	dbw COLL_TV,             tv
 	dbw COLL_WINDOW,         window
 	dbw COLL_INCENSE_BURNER, incenseburner
-	db   -1 ; end
+	db -1 ; end
--- a/data/items/catch_rate_items.asm
+++ b/data/items/catch_rate_items.asm
@@ -15,5 +15,5 @@
 	db ITEM_DC, BERRY
 	db ITEM_FA, BERRY
 	db -1,      BERRY
-	db  0 ; end
+	db 0 ; end
 ; 2879e
--- a/data/sprites/facings.asm
+++ b/data/sprites/facings.asm
@@ -50,8 +50,8 @@
 	db 4 ; #
 	db  0,  0, 0, $00
 	db  0,  8, 0, $01
-	db  8,  0, 2, $02
-	db  8,  8, 2, $03
+	db  8,  0, RELATIVE_ATTRIBUTES, $02
+	db  8,  8, RELATIVE_ATTRIBUTES, $03
 ; 409c
 
 FacingStepDown1: ; walking down 1
@@ -58,8 +58,8 @@
 	db 4 ; #
 	db  0,  0, 0, $80
 	db  0,  8, 0, $81
-	db  8,  0, 2, $82
-	db  8,  8, 2, $83
+	db  8,  0, RELATIVE_ATTRIBUTES, $82
+	db  8,  8, RELATIVE_ATTRIBUTES, $83
 ; 40ad
 
 FacingStepDown3: ; walking down 2
@@ -66,8 +66,8 @@
 	db 4 ; #
 	db  0,  8, X_FLIP, $80
 	db  0,  0, X_FLIP, $81
-	db  8,  8, 2 | X_FLIP, $82
-	db  8,  0, 2 | X_FLIP, $83
+	db  8,  8, RELATIVE_ATTRIBUTES | X_FLIP, $82
+	db  8,  0, RELATIVE_ATTRIBUTES | X_FLIP, $83
 ; 40be
 
 FacingStepUp0:
@@ -75,8 +75,8 @@
 	db 4 ; #
 	db  0,  0, 0, $04
 	db  0,  8, 0, $05
-	db  8,  0, 2, $06
-	db  8,  8, 2, $07
+	db  8,  0, RELATIVE_ATTRIBUTES, $06
+	db  8,  8, RELATIVE_ATTRIBUTES, $07
 ; 40cf
 
 FacingStepUp1: ; walking up 1
@@ -83,8 +83,8 @@
 	db 4 ; #
 	db  0,  0, 0, $84
 	db  0,  8, 0, $85
-	db  8,  0, 2, $86
-	db  8,  8, 2, $87
+	db  8,  0, RELATIVE_ATTRIBUTES, $86
+	db  8,  8, RELATIVE_ATTRIBUTES, $87
 ; 40e0
 
 FacingStepUp3: ; walking up 2
@@ -91,8 +91,8 @@
 	db 4 ; #
 	db  0,  8, X_FLIP, $84
 	db  0,  0, X_FLIP, $85
-	db  8,  8, 2 | X_FLIP, $86
-	db  8,  0, 2 | X_FLIP, $87
+	db  8,  8, RELATIVE_ATTRIBUTES | X_FLIP, $86
+	db  8,  0, RELATIVE_ATTRIBUTES | X_FLIP, $87
 ; 40f1
 
 FacingStepLeft0:
@@ -100,8 +100,8 @@
 	db 4 ; #
 	db  0,  0, 0, $08
 	db  0,  8, 0, $09
-	db  8,  0, 2, $0a
-	db  8,  8, 2, $0b
+	db  8,  0, RELATIVE_ATTRIBUTES, $0a
+	db  8,  8, RELATIVE_ATTRIBUTES, $0b
 ; 4102
 
 FacingStepRight0:
@@ -109,8 +109,8 @@
 	db 4 ; #
 	db  0,  8, X_FLIP, $08
 	db  0,  0, X_FLIP, $09
-	db  8,  8, 2 | X_FLIP, $0a
-	db  8,  0, 2 | X_FLIP, $0b
+	db  8,  8, RELATIVE_ATTRIBUTES | X_FLIP, $0a
+	db  8,  0, RELATIVE_ATTRIBUTES | X_FLIP, $0b
 ; 4113
 
 FacingStepLeft1:
@@ -118,8 +118,8 @@
 	db 4 ; #
 	db  0,  0, 0, $88
 	db  0,  8, 0, $89
-	db  8,  0, 2, $8a
-	db  8,  8, 2, $8b
+	db  8,  0, RELATIVE_ATTRIBUTES, $8a
+	db  8,  8, RELATIVE_ATTRIBUTES, $8b
 ; 4124
 
 FacingStepRight1:
@@ -127,8 +127,8 @@
 	db 4 ; #
 	db  0,  8, X_FLIP, $88
 	db  0,  0, X_FLIP, $89
-	db  8,  8, 2 | X_FLIP, $8a
-	db  8,  0, 2 | X_FLIP, $8b
+	db  8,  8, RELATIVE_ATTRIBUTES | X_FLIP, $8a
+	db  8,  0, RELATIVE_ATTRIBUTES | X_FLIP, $8b
 ; 4135
 
 FacingFishDown: ; fishing down
@@ -135,9 +135,9 @@
 	db 5 ; #
 	db  0,  0, 0, $00
 	db  0,  8, 0, $01
-	db  8,  0, 2, $02
-	db  8,  8, 2, $03
-	db 16,  0, 4, $fc
+	db  8,  0, RELATIVE_ATTRIBUTES, $02
+	db  8,  8, RELATIVE_ATTRIBUTES, $03
+	db 16,  0, ABSOLUTE_TILE_ID, $fc
 ; 414a
 
 FacingFishUp: ; fishing up
@@ -144,9 +144,9 @@
 	db 5 ; #
 	db  0,  0, 0, $04
 	db  0,  8, 0, $05
-	db  8,  0, 2, $06
-	db  8,  8, 2, $07
-	db -8,  0, 4, $fc
+	db  8,  0, RELATIVE_ATTRIBUTES, $06
+	db  8,  8, RELATIVE_ATTRIBUTES, $07
+	db -8,  0, ABSOLUTE_TILE_ID, $fc
 ; 415f
 
 FacingFishLeft: ; fishing left
@@ -153,9 +153,9 @@
 	db 5 ; #
 	db  0,  0, 0, $08
 	db  0,  8, 0, $09
-	db  8,  0, 2, $0a
-	db  8,  8, 2, $0b
-	db  5, -8, 4 | X_FLIP, $fd
+	db  8,  0, RELATIVE_ATTRIBUTES, $0a
+	db  8,  8, RELATIVE_ATTRIBUTES, $0b
+	db  5, -8, ABSOLUTE_TILE_ID | X_FLIP, $fd
 ; 4174
 
 FacingFishRight: ; fishing right
@@ -162,23 +162,23 @@
 	db 5 ; #
 	db  0,  8, X_FLIP, $08
 	db  0,  0, X_FLIP, $09
-	db  8,  8, 2 | X_FLIP, $0a
-	db  8,  0, 2 | X_FLIP, $0b
-	db  5, 16, 4, $fd
+	db  8,  8, RELATIVE_ATTRIBUTES | X_FLIP, $0a
+	db  8,  0, RELATIVE_ATTRIBUTES | X_FLIP, $0b
+	db  5, 16, ABSOLUTE_TILE_ID, $fd
 ; 4189
 
 FacingEmote: ; emote
 	db 4 ; #
-	db  0,  0, 4, $f8
-	db  0,  8, 4, $f9
-	db  8,  0, 4, $fa
-	db  8,  8, 4, $fb
+	db  0,  0, ABSOLUTE_TILE_ID, $f8
+	db  0,  8, ABSOLUTE_TILE_ID, $f9
+	db  8,  0, ABSOLUTE_TILE_ID, $fa
+	db  8,  8, ABSOLUTE_TILE_ID, $fb
 ; 419a
 
 FacingShadow: ; shadow
 	db 2 ; #
-	db  0,  0, 4, $fc
-	db  0,  8, 4 | X_FLIP, $fc
+	db  0,  0, ABSOLUTE_TILE_ID, $fc
+	db  0,  8, ABSOLUTE_TILE_ID | X_FLIP, $fc
 ; 41a3
 
 FacingBigDollSymmetric: ; big snorlax or lapras doll
@@ -237,28 +237,28 @@
 
 FacingBoulderDust1: ; boulder dust 1
 	db 4 ; #
-	db  0,  0, 4, $fe
-	db  0,  8, 4, $fe
-	db  8,  0, 4, $fe
-	db  8,  8, 4, $fe
+	db  0,  0, ABSOLUTE_TILE_ID, $fe
+	db  0,  8, ABSOLUTE_TILE_ID, $fe
+	db  8,  0, ABSOLUTE_TILE_ID, $fe
+	db  8,  8, ABSOLUTE_TILE_ID, $fe
 ; 4250
 
 FacingBoulderDust2: ; boulder dust 2
 	db 4 ; #
-	db  0,  0, 4, $ff
-	db  0,  8, 4, $ff
-	db  8,  0, 4, $ff
-	db  8,  8, 4, $ff
+	db  0,  0, ABSOLUTE_TILE_ID, $ff
+	db  0,  8, ABSOLUTE_TILE_ID, $ff
+	db  8,  0, ABSOLUTE_TILE_ID, $ff
+	db  8,  8, ABSOLUTE_TILE_ID, $ff
 ; 4261
 
 FacingGrass1: ; 4261
 	db 2 ; #
-	db  8,  0, 4, $fe
-	db  8,  8, 4 | X_FLIP, $fe
+	db  8,  0, ABSOLUTE_TILE_ID, $fe
+	db  8,  8, ABSOLUTE_TILE_ID | X_FLIP, $fe
 ; 426a
 
 FacingGrass2: ; 426a
 	db 2 ; #
-	db  9, -1, 4, $fe
-	db  9,  9, 4 | X_FLIP, $fe
+	db  9, -1, ABSOLUTE_TILE_ID, $fe
+	db  9,  9, ABSOLUTE_TILE_ID | X_FLIP, $fe
 ; 4273
--- a/data/sprites/map_objects.asm
+++ b/data/sprites/map_objects.asm
@@ -5,304 +5,304 @@
 	db SPRITEMOVEFN_00 ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STILL
 	db SPRITEMOVEFN_STANDING ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00001100 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db FIXED_FACING | SLIDING ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_WANDER
 	db SPRITEMOVEFN_RANDOM_WALK_XY ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SPINRANDOM_SLOW
 	db SPRITEMOVEFN_SLOW_RANDOM_SPIN ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_WALK_UP_DOWN
 	db SPRITEMOVEFN_RANDOM_WALK_Y ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_WALK_LEFT_RIGHT
 	db SPRITEMOVEFN_RANDOM_WALK_X ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STANDING_DOWN
 	db SPRITEMOVEFN_STANDING ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STANDING_UP
 	db SPRITEMOVEFN_STANDING ; movement function
 	db UP ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STANDING_LEFT
 	db SPRITEMOVEFN_STANDING ; movement function
 	db LEFT ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STANDING_RIGHT
 	db SPRITEMOVEFN_STANDING ; movement function
 	db RIGHT ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SPINRANDOM_FAST
 	db SPRITEMOVEFN_FAST_RANDOM_SPIN ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_PLAYER
 	db SPRITEMOVEFN_OBEY_DPAD ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_0C
 	db SPRITEMOVEFN_08 ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_0D
 	db SPRITEMOVEFN_09 ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_0E
 	db SPRITEMOVEFN_0A ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_0F
 	db SPRITEMOVEFN_0B ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_10
 	db SPRITEMOVEFN_0C ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_11
 	db SPRITEMOVEFN_0D ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_12
 	db SPRITEMOVEFN_0E ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_FOLLOWING
 	db SPRITEMOVEFN_FOLLOW ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SCRIPTED
 	db SPRITEMOVEFN_SCRIPTED ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_BIGDOLLSYM
 	db SPRITEMOVEFN_BIG_SNORLAX ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BIG_DOLL_SYM ; action
-	db %00101110 ; flags1
-	db %00000001 ; flags2
-	db %11000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | MOVE_ANYWHERE ; flags1
+	db LOW_PRIORITY ; flags2
+	db STRENGTH_BOULDER | BIG_OBJECT ; palette flags
 
 ; SPRITEMOVEDATA_POKEMON
 	db SPRITEMOVEFN_BOUNCE ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BOUNCE ; action
-	db %00101110 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | MOVE_ANYWHERE ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SUDOWOODO
 	db SPRITEMOVEFN_STANDING ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00001100 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db FIXED_FACING | SLIDING ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SMASHABLE_ROCK
 	db SPRITEMOVEFN_STANDING ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00101110 ; flags1
-	db %00010000 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | MOVE_ANYWHERE ; flags1
+	db USE_OBP1 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_STRENGTH_BOULDER
 	db SPRITEMOVEFN_STRENGTH ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00101110 ; flags1
-	db %00000000 ; flags2
-	db %01000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | MOVE_ANYWHERE ; flags1
+	db 0 ; flags2
+	db STRENGTH_BOULDER ; palette flags
 
 ; SPRITEMOVEDATA_FOLLOWNOTEXACT
 	db SPRITEMOVEFN_FOLLOWNOTEXACT ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SHADOW
 	db SPRITEMOVEFN_SHADOW ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_00 ; action
-	db %10001110 ; flags1
-	db %00000001 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | EMOTE_OBJECT ; flags1
+	db LOW_PRIORITY ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_EMOTE
 	db SPRITEMOVEFN_EMOTE ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_EMOTE ; action
-	db %10001110 ; flags1
-	db %00000010 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | EMOTE_OBJECT ; flags1
+	db HIGH_PRIORITY ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SCREENSHAKE
 	db SPRITEMOVEFN_SCREENSHAKE ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_00 ; action
-	db %10000010 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE | EMOTE_OBJECT ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SPINCOUNTERCLOCKWISE
 	db SPRITEMOVEFN_SPIN_COUNTERCLOCKWISE ; movement function
 	db LEFT ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SPINCLOCKWISE
 	db SPRITEMOVEFN_SPIN_CLOCKWISE ; movement function
 	db RIGHT ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_BIGDOLLASYM
 	db SPRITEMOVEFN_STRENGTH ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BIG_DOLL_ASYM ; action
-	db %00101110 ; flags1
-	db %00000001 ; flags2
-	db %11000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | MOVE_ANYWHERE ; flags1
+	db LOW_PRIORITY ; flags2
+	db STRENGTH_BOULDER | BIG_OBJECT ; palette flags
 
 ; SPRITEMOVEDATA_BIGDOLL
 	db SPRITEMOVEFN_STRENGTH ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BIG_DOLL ; action
-	db %00101110 ; flags1
-	db %00000001 ; flags2
-	db %11000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | MOVE_ANYWHERE ; flags1
+	db LOW_PRIORITY ; flags2
+	db STRENGTH_BOULDER | BIG_OBJECT ; palette flags
 
 ; SPRITEMOVEDATA_BOULDERDUST
 	db SPRITEMOVEFN_BOULDERDUST ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_BOULDER_DUST ; action
-	db %10001110 ; flags1
-	db %00000001 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | EMOTE_OBJECT ; flags1
+	db LOW_PRIORITY ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_GRASS
 	db SPRITEMOVEFN_GRASS ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_GRASS_SHAKE ; action
-	db %10001110 ; flags1
-	db %00000010 ; flags2
-	db %00000000 ; palette flags
+	db WONT_DELETE | FIXED_FACING | SLIDING | EMOTE_OBJECT ; flags1
+	db HIGH_PRIORITY ; flags2
+	db 0 ; palette flags
 
 ; SPRITEMOVEDATA_SWIM_WANDER
 	db SPRITEMOVEFN_RANDOM_WALK_XY ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00100000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db SWIMMING ; palette flags
 
 ; 25
 	db SPRITEMOVEFN_00 ; movement function
 	db DOWN ; facing
 	db OBJECT_ACTION_STAND ; action
-	db %00000000 ; flags1
-	db %00000000 ; flags2
-	db %00000000 ; palette flags
+	db 0 ; flags1
+	db 0 ; flags2
+	db 0 ; palette flags
 
 ; 4357
--- a/data/types/type_matchups.asm
+++ b/data/types/type_matchups.asm
@@ -109,11 +109,11 @@
 	db STEEL,     ROCK,      SUPER_EFFECTIVE
 	db STEEL,     STEEL,     NOT_VERY_EFFECTIVE
 
-	db -2 ; end
+	db -2 ; end (with Foresight)
 
 ; Foresight removes Ghost's immunities.
 	db NORMAL,    GHOST,     NO_EFFECT
 	db FIGHTING,  GHOST,     NO_EFFECT
 
-	db -1 ; end (with Foresight)
+	db -1 ; end
 ; 34cfd
--- a/data/wild/treemon_maps.asm
+++ b/data/wild/treemon_maps.asm
@@ -1,6 +1,6 @@
 treemon_map: MACRO
 	map_id \1
-	db  \2 ; treemon set
+	db \2 ; treemon set
 ENDM
 
 TreeMonMaps: ; b825e
--- a/docs/bugs_and_glitches.md
+++ b/docs/bugs_and_glitches.md
@@ -44,7 +44,7 @@
 - [Two tiles in the `port` tileset are drawn incorrectly](#two-tiles-in-the-port-tileset-are-drawn-incorrectly)
 - [`LoadMetatiles` wraps around past 128 blocks](#loadmetatiles-wraps-around-past-128-blocks)
 - [Surfing directly across a map connection does not load the new map](#surfing-directly-across-a-map-connection-does-not-load-the-new-map)
-- [`Function6ec1` does not correctly limit object movement](#function6ec1-does-not-correctly-limit-object-movement)
+- [Swimming NPCs aren't limited by their movement radius](#swimming-npcs-arent-limited-by-their-movement-radius)
 - [`CheckOwnMon` only checks the first five letters of OT names](#checkownmon-only-checks-the-first-five-letters-of-ot-names)
 - [Catching a Transformed Pokémon always catches a Ditto](#catching-a-transformed-pokémon-always-catches-a-ditto)
 - [Using a Park Ball in normal battles has a corrupt animation](#using-a-park-ball-in-normal-battles-has-a-corrupt-animation)
@@ -1185,20 +1185,20 @@
 *To do:* Identify specific code causing this bug and fix it.
 
 
-## `Function6ec1` does not correctly limit object movement
+## Swimming NPCs aren't limited by their movement radius
 
 This bug is why the Lapras in [maps/UnionCaveB2F.asm](/maps/UnionCaveB2F.asm), which uses `SPRITEMOVEDATA_SWIM_WANDER`, is not restricted by its `1, 1` movement radius.
 
-In [engine/overworld/npc_movement.asm](/engine/overworld/npc_movement.asm):
+This is a bug with `CanObjectMoveInDirection` in [engine/overworld/npc_movement.asm](/engine/overworld/npc_movement.asm):
 
 ```asm
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit 4, [hl] ; lost, uncomment next line to fix
-;	jr nz, .resume
+	bit NOCLIP_TILES_F, [hl] ; lost, uncomment next line to fix
+	; jr nz, .noclip_tiles
 ```
 
-**Fix:** Uncomment `jr nz, .resume`.
+**Fix:** Uncomment `jr nz, .noclip_tiles`.
 
 
 ## `CheckOwnMon` only checks the first five letters of OT names
--- a/docs/design_flaws.md
+++ b/docs/design_flaws.md
@@ -36,7 +36,7 @@
 
 	push hl
 	push bc
-	sub BANK(Pics_1) - PICS_FIX
+	sub BANK("Pics 1") - PICS_FIX
 	ld c, a
 	ld b, 0
 	ld hl, .PicsBanks
@@ -47,33 +47,33 @@
 	ret
 
 .PicsBanks: ; 511d4
-	db BANK(Pics_1) + 0
-	db BANK(Pics_1) + 1
-	db BANK(Pics_1) + 2
-	db BANK(Pics_1) + 3
-	db BANK(Pics_1) + 4
-	db BANK(Pics_1) + 5
-	db BANK(Pics_1) + 6
-	db BANK(Pics_1) + 7
-	db BANK(Pics_1) + 8
-	db BANK(Pics_1) + 9
-	db BANK(Pics_1) + 10
-	db BANK(Pics_1) + 11
-	db BANK(Pics_1) + 12
-	db BANK(Pics_1) + 13
-	db BANK(Pics_1) + 14
-	db BANK(Pics_1) + 15
-	db BANK(Pics_1) + 16
-	db BANK(Pics_1) + 17
-	db BANK(Pics_1) + 18
-	db BANK(Pics_1) + 19
-	db BANK(Pics_1) + 20
-	db BANK(Pics_1) + 21
-	db BANK(Pics_1) + 22
-	db BANK(Pics_1) + 23
+	db BANK("Pics 1")  ; BANK("Pics 1") + 0
+	db BANK("Pics 2")  ; BANK("Pics 1") + 1
+	db BANK("Pics 3")  ; BANK("Pics 1") + 2
+	db BANK("Pics 4")  ; BANK("Pics 1") + 3
+	db BANK("Pics 5")  ; BANK("Pics 1") + 4
+	db BANK("Pics 6")  ; BANK("Pics 1") + 5
+	db BANK("Pics 7")  ; BANK("Pics 1") + 6
+	db BANK("Pics 8")  ; BANK("Pics 1") + 7
+	db BANK("Pics 9")  ; BANK("Pics 1") + 8
+	db BANK("Pics 10") ; BANK("Pics 1") + 9
+	db BANK("Pics 11") ; BANK("Pics 1") + 10
+	db BANK("Pics 12") ; BANK("Pics 1") + 11
+	db BANK("Pics 13") ; BANK("Pics 1") + 12
+	db BANK("Pics 14") ; BANK("Pics 1") + 13
+	db BANK("Pics 15") ; BANK("Pics 1") + 14
+	db BANK("Pics 16") ; BANK("Pics 1") + 15
+	db BANK("Pics 17") ; BANK("Pics 1") + 16
+	db BANK("Pics 18") ; BANK("Pics 1") + 17
+	db BANK("Pics 19") ; BANK("Pics 1") + 18
+	db BANK("Pics 20") ; BANK("Pics 1") + 19
+	db BANK("Pics 21") ; BANK("Pics 1") + 20
+	db BANK("Pics 22") ; BANK("Pics 1") + 21
+	db BANK("Pics 23") ; BANK("Pics 1") + 22
+	db BANK("Pics 24") ; BANK("Pics 1") + 23
 ```
 
-**Fix:** Use `dba` instead of `dba_pic`, and don't call `FixPicBank` to modify `a`.
+**Fix:** Use `dba` instead of `dba_pic`, delete `FixPicBank`, and remove all four calls to `FixPicBank`.
 
 
 ## `PokemonPicPointers` and `UnownPicPointers` are assumed to start at the same address
--- a/engine/battle/ai/scoring.asm
+++ b/engine/battle/ai/scoring.asm
@@ -1055,7 +1055,7 @@
 	jr nz, .asm_38a91
 
 	ld a, [wPlayerSubStatus1]
-	and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
+	and 1 << SUBSTATUS_IN_LOVE | 1 << SUBSTATUS_ROLLOUT | 1 << SUBSTATUS_IDENTIFIED | 1 << SUBSTATUS_NIGHTMARE
 	jr nz, .asm_38a91
 
 ; Else, 50% chance to greatly encourage this move if it's the player's Pokemon first turn.
@@ -1569,7 +1569,7 @@
 ; No move has EFFECT_DEFROST_OPPONENT, so this layer is unused.
 
 	ld a, [wEnemyMonStatus]
-	and $20
+	and 1 << FRZ
 	ret z
 	dec [hl]
 	dec [hl]
@@ -1847,7 +1847,7 @@
 ; 80% chance to greatly encourage this move if the player is either
 ; in love, identified, stuck in Rollout, or has a Nightmare.
 	ld a, [wPlayerSubStatus1]
-	and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
+	and 1 << SUBSTATUS_IN_LOVE | 1 << SUBSTATUS_ROLLOUT | 1 << SUBSTATUS_IDENTIFIED | 1 << SUBSTATUS_NIGHTMARE
 	jr nz, .asm_38e26
 
 ; Otherwise, discourage this move unless the player only has not very effective moves against the enemy.
--- a/engine/battle/effect_commands.asm
+++ b/engine/battle/effect_commands.asm
@@ -364,7 +364,7 @@
 	ld a, BATTLE_VARS_SUBSTATUS3
 	call GetBattleVarAddr
 	ld a, [hl]
-	and $ff ^ (1<<SUBSTATUS_BIDE + 1<<SUBSTATUS_RAMPAGE + 1<<SUBSTATUS_CHARGED)
+	and $ff ^ (1 << SUBSTATUS_BIDE | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_CHARGED)
 	ld [hl], a
 
 	call ResetFuryCutterCount
--- a/engine/events/pokecenter_pc.asm
+++ b/engine/events/pokecenter_pc.asm
@@ -39,12 +39,19 @@
 	dw PlaceNthMenuStrings
 	dw .JumpTable
 
+PCPC_PLAYERS_PC   EQU 0
+PCPC_BILLS_PC     EQU 1
+PCPC_OAKS_PC      EQU 2
+PCPC_HALL_OF_FAME EQU 3
+PCPC_TURN_OFF     EQU 4
+
 .JumpTable:
-	dw PlayersPC, .String_PlayersPC
-	dw BillsPC, .String_BillsPC
-	dw OaksPC, .String_OaksPC
+; entries correspond to PCPC_* constants
+	dw PlayersPC,    .String_PlayersPC
+	dw BillsPC,      .String_BillsPC
+	dw OaksPC,       .String_OaksPC
 	dw HallOfFamePC, .String_HallOfFame
-	dw TurnOffPC, .String_TurnOff
+	dw TurnOffPC,    .String_TurnOff
 
 .String_PlayersPC:  db "<PLAYER>'s PC@"
 .String_BillsPC:    db "BILL's PC@"
@@ -53,33 +60,42 @@
 .String_TurnOff:    db "TURN OFF@"
 
 .WhichPC:
-	; before pokedex
-	db  3 ; items
-	db  1, 0, 4 ; bill's, player's, turn off
-	db -1
+	; before Pokédex
+	db 3
+	db PCPC_BILLS_PC
+	db PCPC_PLAYERS_PC
+	db PCPC_TURN_OFF
+	db -1 ; end
 
 	; before Hall Of Fame
-	db  4 ; items
-	db  1, 0, 2, 4 ; bill's, player's, oak's, turn off
-	db -1
+	db 4
+	db PCPC_BILLS_PC
+	db PCPC_PLAYERS_PC
+	db PCPC_OAKS_PC
+	db PCPC_TURN_OFF
+	db -1 ; end
 
 	; postgame
-	db  5 ; items
-	db  1, 0, 2, 3, 4 ; bill's, player's, oak's, hall of fame, turn off
-	db -1
+	db 5
+	db PCPC_BILLS_PC
+	db PCPC_PLAYERS_PC
+	db PCPC_OAKS_PC
+	db PCPC_HALL_OF_FAME
+	db PCPC_TURN_OFF
+	db -1 ; end
 
 .ChooseWhichPCListToUse:
 	call CheckReceivedDex
 	jr nz, .got_dex
-	ld a, $0
+	ld a, 0 ; before Pokédex
 	ret
 
 .got_dex
 	ld a, [wHallOfFameCount]
 	and a
-	ld a, $1
+	ld a, 1 ; before Hall Of Fame
 	ret z
-	ld a, $2
+	ld a, 2 ; postgame
 	ret
 ; 15650
 
@@ -244,7 +260,16 @@
 	dw PlaceNthMenuStrings
 	dw .PlayersPCMenuPointers
 
+PLAYERSPC_WITHDRAW_ITEM EQU 0
+PLAYERSPC_DEPOSIT_ITEM  EQU 1
+PLAYERSPC_TOSS_ITEM     EQU 2
+PLAYERSPC_MAIL_BOX      EQU 3
+PLAYERSPC_DECORATION    EQU 4
+PLAYERSPC_TURN_OFF      EQU 5
+PLAYERSPC_LOG_OFF       EQU 6
+
 .PlayersPCMenuPointers: ; 0x15746
+; entries correspond to PLAYERSPC_* constants
 	dw PlayerWithdrawItemMenu, .WithdrawItem
 	dw PlayerDepositItemMenu,  .DepositItem
 	dw PlayerTossItemMenu,     .TossItem
@@ -261,32 +286,24 @@
 .TurnOff:      db "TURN OFF@"
 .LogOff:       db "LOG OFF@"
 
-WITHDRAW_ITEM EQU 0
-DEPOSIT_ITEM  EQU 1
-TOSS_ITEM     EQU 2
-MAIL_BOX      EQU 3
-DECORATION    EQU 4
-TURN_OFF      EQU 5
-LOG_OFF       EQU 6
-
 .PlayersPCMenuList1:
 	db 5
-	db WITHDRAW_ITEM
-	db DEPOSIT_ITEM
-	db TOSS_ITEM
-	db MAIL_BOX
-	db TURN_OFF
-	db -1
+	db PLAYERSPC_WITHDRAW_ITEM
+	db PLAYERSPC_DEPOSIT_ITEM
+	db PLAYERSPC_TOSS_ITEM
+	db PLAYERSPC_MAIL_BOX
+	db PLAYERSPC_TURN_OFF
+	db -1 ; end
 
 .PlayersPCMenuList2:
 	db 6
-	db WITHDRAW_ITEM
-	db DEPOSIT_ITEM
-	db TOSS_ITEM
-	db MAIL_BOX
-	db DECORATION
-	db LOG_OFF
-	db -1
+	db PLAYERSPC_WITHDRAW_ITEM
+	db PLAYERSPC_DEPOSIT_ITEM
+	db PLAYERSPC_TOSS_ITEM
+	db PLAYERSPC_MAIL_BOX
+	db PLAYERSPC_DECORATION
+	db PLAYERSPC_LOG_OFF
+	db -1 ; end
 
 PC_DisplayTextWaitMenu: ; 157bb
 	ld a, [wOptions]
@@ -461,13 +478,14 @@
 	ret
 
 .dw
-	dw .tossable
+; entries correspond to ITEMMENU_* constants
+	dw .tossable ; ITEMMENU_NOUSE
 	dw .no_toss
 	dw .no_toss
 	dw .no_toss
-	dw .tossable
-	dw .tossable
-	dw .tossable
+	dw .tossable ; ITEMMENU_CURRENT
+	dw .tossable ; ITEMMENU_PARTY
+	dw .tossable ; ITEMMENU_CLOSE
 
 .no_toss
 	ret
--- a/engine/gfx/cgb_layouts.asm
+++ b/engine/gfx/cgb_layouts.asm
@@ -48,7 +48,7 @@
 	dw _CGB_GSTitleScreen
 	dw _CGB0d
 	dw _CGB_MoveList
-	dw _CGB0f
+	dw _CGB_BetaPikachuMinigame
 	dw _CGB_PokedexSearchOption
 	dw _CGB11
 	dw _CGB_Pokepic
@@ -532,7 +532,7 @@
 ; 9195
 
 _CGB11: ; 9195
-	ld hl, Palettes_SCGB_11
+	ld hl, BetaPokerPals
 	ld de, wBGPals1
 	ld bc, 5 palettes
 	ld a, BANK(wBGPals1)
@@ -790,8 +790,8 @@
 	ret
 ; 93a6
 
-_CGB0f: ; 93a6
-	ld hl, PalPacket_SCGB_0F + 1
+_CGB_BetaPikachuMinigame: ; 93a6
+	ld hl, PalPacket_BetaPikachuMinigame + 1
 	call CopyFourPalettes
 	call WipeAttrMap
 	call ApplyAttrMap
--- a/engine/gfx/color.asm
+++ b/engine/gfx/color.asm
@@ -182,12 +182,12 @@
 	ld a, [hSGB]
 	and a
 	ret z
-	ld hl, PalPacket_Function8b4d
+	ld hl, PalPacket_BetaIntroVenusaur
 	jp PushSGBPals_
 
 .cgb
 	ld de, wOBPals1
-	ld a, PREDEFPAL_3B
+	ld a, PREDEFPAL_BETA_INTRO_VENUSAUR
 	call GetPredefPal
 	jp LoadHLPaletteIntoDE
 
@@ -1349,8 +1349,8 @@
 FemalePokegearPals:
 INCLUDE "gfx/pokegear/pokegear_f.pal"
 
-Palettes_SCGB_11:
-INCLUDE "gfx/unknown/b789.pal"
+BetaPokerPals:
+INCLUDE "gfx/beta_poker/beta_poker.pal"
 
 SlotMachinePals:
 INCLUDE "gfx/slots/slots.pal"
--- a/engine/gfx/load_pics.asm
+++ b/engine/gfx/load_pics.asm
@@ -252,7 +252,7 @@
 
 	push hl
 	push bc
-	sub BANK(Pics_1) - PICS_FIX
+	sub BANK("Pics 1") - PICS_FIX
 	ld c, a
 	ld b, 0
 	ld hl, .PicsBanks
@@ -263,30 +263,30 @@
 	ret
 
 .PicsBanks: ; 511d4
-	db BANK(Pics_1) + 0
-	db BANK(Pics_1) + 1
-	db BANK(Pics_1) + 2
-	db BANK(Pics_1) + 3
-	db BANK(Pics_1) + 4
-	db BANK(Pics_1) + 5
-	db BANK(Pics_1) + 6
-	db BANK(Pics_1) + 7
-	db BANK(Pics_1) + 8
-	db BANK(Pics_1) + 9
-	db BANK(Pics_1) + 10
-	db BANK(Pics_1) + 11
-	db BANK(Pics_1) + 12
-	db BANK(Pics_1) + 13
-	db BANK(Pics_1) + 14
-	db BANK(Pics_1) + 15
-	db BANK(Pics_1) + 16
-	db BANK(Pics_1) + 17
-	db BANK(Pics_1) + 18
-	db BANK(Pics_1) + 19
-	db BANK(Pics_1) + 20
-	db BANK(Pics_1) + 21
-	db BANK(Pics_1) + 22
-	db BANK(Pics_1) + 23
+	db BANK("Pics 1")  ; BANK("Pics 1") + 0
+	db BANK("Pics 2")  ; BANK("Pics 1") + 1
+	db BANK("Pics 3")  ; BANK("Pics 1") + 2
+	db BANK("Pics 4")  ; BANK("Pics 1") + 3
+	db BANK("Pics 5")  ; BANK("Pics 1") + 4
+	db BANK("Pics 6")  ; BANK("Pics 1") + 5
+	db BANK("Pics 7")  ; BANK("Pics 1") + 6
+	db BANK("Pics 8")  ; BANK("Pics 1") + 7
+	db BANK("Pics 9")  ; BANK("Pics 1") + 8
+	db BANK("Pics 10") ; BANK("Pics 1") + 9
+	db BANK("Pics 11") ; BANK("Pics 1") + 10
+	db BANK("Pics 12") ; BANK("Pics 1") + 11
+	db BANK("Pics 13") ; BANK("Pics 1") + 12
+	db BANK("Pics 14") ; BANK("Pics 1") + 13
+	db BANK("Pics 15") ; BANK("Pics 1") + 14
+	db BANK("Pics 16") ; BANK("Pics 1") + 15
+	db BANK("Pics 17") ; BANK("Pics 1") + 16
+	db BANK("Pics 18") ; BANK("Pics 1") + 17
+	db BANK("Pics 19") ; BANK("Pics 1") + 18
+	db BANK("Pics 20") ; BANK("Pics 1") + 19
+	db BANK("Pics 21") ; BANK("Pics 1") + 20
+	db BANK("Pics 22") ; BANK("Pics 1") + 21
+	db BANK("Pics 23") ; BANK("Pics 1") + 22
+	db BANK("Pics 24") ; BANK("Pics 1") + 23
 
 Function511ec: ; 511ec
 	ld a, c
--- a/engine/gfx/sgb_layouts.asm
+++ b/engine/gfx/sgb_layouts.asm
@@ -38,9 +38,9 @@
 	dw .SGB_GSTitleScreen
 	dw .SGB0d
 	dw .SGB_MoveList
-	dw .SGB0f
+	dw .SGB_BetaPikachuMinigame
 	dw .SGB_PokedexSearchOption
-	dw .SGB11
+	dw .SGB_BetaPoker
 	dw .SGB12
 	dw .SGB13
 	dw .SGB_PackPals
@@ -346,18 +346,18 @@
 	ret
 ; 8897
 
-.SGB0f: ; 8897
-	ld hl, PalPacket_SCGB_0F
+.SGB_BetaPikachuMinigame: ; 8897
+	ld hl, PalPacket_BetaPikachuMinigame
 	ld de, BlkPacket_9a86
 	ret
 ; 889e
 
-.SGB11: ; 889e
+.SGB_BetaPoker: ; 889e
 	ld hl, BlkPacket_9a86
 	ld de, wPlayerLightScreenCount ; ???
 	ld bc, PALPACKET_LENGTH
 	call CopyBytes
-	ld hl, PalPacket_SCGB_11
+	ld hl, PalPacket_BetaPoker
 	ld de, BlkPacket_9a86
 	ret
 ; 88b1
--- a/engine/items/pack.asm
+++ b/engine/items/pack.asm
@@ -571,11 +571,11 @@
 	ld a, [wCurrPocket]
 	rrca
 	rrca
-	and $c0
+	and REGISTERED_POCKET
 	ld b, a
 	ld a, [wCurItemQuantity]
 	inc a
-	and $3f
+	and REGISTERED_NUMBER
 	or b
 	ld [wWhichRegisteredItem], a
 	ld a, [wCurItem]
@@ -1283,7 +1283,7 @@
 	ld a, [wCurrPocket]
 	maskbits NUM_POCKETS
 	ld e, a
-	ld d, $0
+	ld d, 0
 	ld a, [wBattleType]
 	cp BATTLETYPE_TUTORIAL
 	jr z, .male_dude
--- a/engine/overworld/map_object_action.asm
+++ b/engine/overworld/map_object_action.asm
@@ -47,7 +47,7 @@
 SetFacingStepAction: ; 44c1
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit SLIDING, [hl]
+	bit SLIDING_F, [hl]
 	jp nz, SetFacingCurrent
 
 	ld hl, OBJECT_STEP_FRAME
@@ -59,7 +59,7 @@
 
 	rrca
 	rrca
-	and %00000011
+	maskbits NUM_DIRECTIONS
 	ld d, a
 
 	call GetSpriteDirection
@@ -74,7 +74,7 @@
 SetFacingSkyfall: ; 44e4
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit SLIDING, [hl]
+	bit SLIDING_F, [hl]
 	jp nz, SetFacingCurrent
 
 	ld hl, OBJECT_STEP_FRAME
@@ -86,7 +86,7 @@
 
 	rrca
 	rrca
-	and %00000011
+	maskbits NUM_DIRECTIONS
 	ld d, a
 
 	call GetSpriteDirection
@@ -101,7 +101,7 @@
 SetFacingBumpAction: ; 4508
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit SLIDING, [hl]
+	bit SLIDING_F, [hl]
 	jp nz, SetFacingCurrent
 
 	ld hl, OBJECT_STEP_FRAME
@@ -112,7 +112,7 @@
 	rrca
 	rrca
 	rrca
-	and %00000011
+	maskbits NUM_DIRECTIONS
 	ld d, a
 
 	call GetSpriteDirection
@@ -245,7 +245,7 @@
 	ld a, [hl]
 	inc a
 	ld [hl], a
-	and %00001100
+	maskbits NUM_DIRECTIONS, 2
 	rrca
 	rrca
 	add FACING_WEIRD_TREE_0
--- a/engine/overworld/map_objects.asm
+++ b/engine/overworld/map_objects.asm
@@ -93,7 +93,7 @@
 .ok2
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit 1, [hl]
+	bit WONT_DELETE_F, [hl]
 	jr nz, .yes2
 	call DeleteMapObject
 	scf
@@ -146,7 +146,7 @@
 .HandleObjectAction:
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit INVISIBLE, [hl]
+	bit INVISIBLE_F, [hl]
 	jr nz, SetFacingStanding
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
@@ -161,7 +161,7 @@
 Function4440: ; 4440
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit INVISIBLE, [hl]
+	bit INVISIBLE_F, [hl]
 	jr nz, SetFacingStanding
 asm_4448:
 	ld de, ObjectActionPairPointers + 2 ; use second column
@@ -233,7 +233,7 @@
 UpdateTallGrassFlags: ; 463f
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
-	bit OVERHEAD, [hl]
+	bit OVERHEAD_F, [hl]
 	jr z, .ok
 	ld hl, OBJECT_NEXT_TILE
 	add hl, bc
@@ -260,13 +260,13 @@
 .set
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
-	set OVERHEAD, [hl]
+	set OVERHEAD_F, [hl]
 	ret
 
 .reset
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
-	res OVERHEAD, [hl]
+	res OVERHEAD_F, [hl]
 	ret
 ; 4679
 
@@ -298,7 +298,7 @@
 	ld [hl], a
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit FIXED_FACING, [hl]
+	bit FIXED_FACING_F, [hl]
 	jr nz, GetNextTile
 	add a
 	add a
@@ -696,7 +696,7 @@
 	and %00000011
 	or 0
 	call InitStep
-	call Function6ec1
+	call CanObjectMoveInDirection
 	jr c, .ok2
 	ld de, SFX_STRENGTH
 	call PlaySFX
@@ -1049,7 +1049,7 @@
 
 .RandomWalkContinue:
 	call InitStep
-	call Function6ec1 ; check whether the object can move in that direction
+	call CanObjectMoveInDirection ; check whether the object can move in that direction
 	jr c, .NewDuration
 	call UpdateTallGrassFlags
 	ld hl, OBJECT_ACTION
@@ -2155,7 +2155,7 @@
 	push af
 	ld hl, OBJECT_FLAGS1
 	add hl, de
-	bit EMOTE_OBJECT, [hl]
+	bit EMOTE_OBJECT_F, [hl]
 	jr z, .next
 	ld hl, OBJECT_SPRITE
 	add hl, de
@@ -2444,7 +2444,7 @@
 	ld [hUsedSpriteTile], a
 	ld hl, OBJECT_PALETTE
 	add hl, bc
-	bit 7, [hl]
+	bit BIG_OBJECT_F, [hl]
 	jr z, .ok7
 	ld a, d
 	add 2
@@ -2574,7 +2574,7 @@
 
 _SetPlayerPalette: ; 57e2
 	ld a, d
-	and %10000000
+	and 1 << 7
 	ret z
 	ld bc, 0 ; debug?
 	ld hl, OBJECT_FACING
@@ -2584,13 +2584,13 @@
 	ld [hl], a
 	ld a, d
 	swap a
-	and %00000111
+	and PALETTE_MASK
 	ld d, a
 	ld bc, wPlayerStruct
 	ld hl, OBJECT_PALETTE
 	add hl, bc
 	ld a, [hl]
-	and %11111000
+	and $ff ^ PALETTE_MASK
 	or d
 	ld [hl], a
 	ret
@@ -2918,10 +2918,10 @@
 	ld e, PRIORITY_LOW
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
-	bit LOW_PRIORITY, [hl]
+	bit LOW_PRIORITY_F, [hl]
 	jr nz, .add
 	ld e, PRIORITY_NORM
-	bit HIGH_PRIORITY, [hl]
+	bit HIGH_PRIORITY_F, [hl]
 	jr z, .add
 	ld e, PRIORITY_HIGH
 	jr .add
@@ -2973,12 +2973,12 @@
 	ld hl, OBJECT_SPRITE_TILE
 	add hl, bc
 	ld a, [hl]
-	and %01111111
+	and $ff ^ (1 << 7)
 	ld [hFFC1], a
 	xor a
 	bit 7, [hl]
 	jr nz, .skip1
-	or %00001000
+	or VRAM_BANK_1
 .skip1
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
@@ -2985,23 +2985,23 @@
 	ld e, [hl]
 	bit 7, e
 	jr z, .skip2
-	or %10000000
+	or PRIORITY
 .skip2
-	bit 4, e
+	bit USE_OBP1_F, e
 	jr z, .skip3
-	or %00010000
+	or OBP_NUM
 .skip3
 	ld hl, OBJECT_PALETTE
 	add hl, bc
 	ld d, a
 	ld a, [hl]
-	and %00000111
+	and PALETTE_MASK
 	or d
 	ld d, a
 	xor a
-	bit 3, e
+	bit OVERHEAD_F, e
 	jr z, .skip4
-	or %10000000
+	or PRIORITY
 .skip4
 	ld [hFFC2], a
 	ld hl, OBJECT_SPRITE_X
@@ -3063,7 +3063,7 @@
 	ld e, [hl]
 	inc hl
 	ld a, [hFFC1]
-	bit 2, e
+	bit ABSOLUTE_TILE_ID_F, e
 	jr z, .nope1
 	xor a
 .nope1
@@ -3072,7 +3072,7 @@
 	ld [bc], a ; tile id
 	inc c
 	ld a, e
-	bit 1, a
+	bit RELATIVE_ATTRIBUTES_F, a
 	jr z, .nope2
 	ld a, [hFFC2]
 	or e
--- a/engine/overworld/movement.asm
+++ b/engine/overworld/movement.asm
@@ -377,7 +377,7 @@
 Movement_remove_sliding: ; 5293
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	res SLIDING, [hl]
+	res SLIDING_F, [hl]
 	jp ContinueReadingMovement
 ; 529c
 
@@ -384,7 +384,7 @@
 Movement_set_sliding: ; 529c
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	set SLIDING, [hl]
+	set SLIDING_F, [hl]
 	jp ContinueReadingMovement
 ; 52a5
 
@@ -391,7 +391,7 @@
 Movement_remove_fixed_facing: ; 52a5
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	res FIXED_FACING, [hl]
+	res FIXED_FACING_F, [hl]
 	jp ContinueReadingMovement
 ; 52ae
 
@@ -398,7 +398,7 @@
 Movement_fix_facing: ; 52ae
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	set FIXED_FACING, [hl]
+	set FIXED_FACING_F, [hl]
 	jp ContinueReadingMovement
 ; 52b7
 
@@ -405,7 +405,7 @@
 Movement_show_object: ; 52b7
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	res INVISIBLE, [hl]
+	res INVISIBLE_F, [hl]
 	jp ContinueReadingMovement
 ; 52c0
 
@@ -412,7 +412,7 @@
 Movement_hide_object: ; 52c0
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	set INVISIBLE, [hl]
+	set INVISIBLE_F, [hl]
 	jp ContinueReadingMovement
 ; 52c9
 
@@ -838,7 +838,7 @@
 
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
-	res OVERHEAD, [hl]
+	res OVERHEAD_F, [hl]
 
 	ld hl, OBJECT_ACTION
 	add hl, bc
--- a/engine/overworld/npc_movement.asm
+++ b/engine/overworld/npc_movement.asm
@@ -1,37 +1,38 @@
-Function6ec1: ; 6ec1
+CanObjectMoveInDirection: ; 6ec1
 
 	ld hl, OBJECT_PALETTE
 	add hl, bc
-	bit 5, [hl]
-	jr z, .not_bit_5
+	bit SWIMMING_F, [hl]
+	jr z, .not_swimming
 
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit 4, [hl] ; lost, uncomment next line to fix
-;	jr nz, .resume
+	bit NOCLIP_TILES_F, [hl] ; lost, uncomment next line to fix
+	; jr nz, .noclip_tiles
 	push hl
 	push bc
-	call Function6f2c
+	call WillObjectBumpIntoLand
 	pop bc
 	pop hl
 	ret c
-	jr .resume
+	jr .continue
 
-.not_bit_5
+.not_swimming
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit 4, [hl]
-	jr nz, .resume
+	bit NOCLIP_TILES_F, [hl]
+	jr nz, .noclip_tiles
 	push hl
 	push bc
-	call Function6f07
+	call WillObjectBumpIntoWater
 	pop bc
 	pop hl
 	ret c
 
-.resume
-	bit 6, [hl]
-	jr nz, .bit_6
+.noclip_tiles
+.continue
+	bit NOCLIP_OBJS_F, [hl]
+	jr nz, .noclip_objs
 
 	push hl
 	push bc
@@ -40,9 +41,9 @@
 	pop hl
 	ret c
 
-.bit_6
-	bit 5, [hl]
-	jr nz, .bit_5
+.noclip_objs
+	bit MOVE_ANYWHERE_F, [hl]
+	jr nz, .move_anywhere
 	push hl
 	call HasObjectReachedMovementLimit
 	pop hl
@@ -53,13 +54,13 @@
 	pop hl
 	ret c
 
-.bit_5
+.move_anywhere
 	and a
 	ret
 ; 6f07
 
 
-Function6f07: ; 6f07
+WillObjectBumpIntoWater: ; 6f07
 	call Function6f5f
 	ret c
 	ld hl, OBJECT_NEXT_MAP_X
@@ -78,12 +79,12 @@
 	ld d, a
 	call GetTileCollision
 	and a ; LANDTILE
-	jr z, Function6f3e
+	jr z, WillObjectBumpIntoTile
 	scf
 	ret
 ; 6f2c
 
-Function6f2c: ; 6f2c
+WillObjectBumpIntoLand: ; 6f2c
 	call Function6f5f
 	ret c
 	ld hl, OBJECT_NEXT_TILE
@@ -91,12 +92,12 @@
 	ld a, [hl]
 	call GetTileCollision
 	cp WATERTILE
-	jr z, Function6f3e
+	jr z, WillObjectBumpIntoTile
 	scf
 	ret
 ; 6f3e
 
-Function6f3e: ; 6f3e
+WillObjectBumpIntoTile: ; 6f3e
 	ld hl, OBJECT_NEXT_TILE
 	add hl, bc
 	ld a, [hl]
@@ -331,7 +332,7 @@
 
 	ld hl, OBJECT_PALETTE
 	add hl, bc
-	bit 7, [hl]
+	bit BIG_OBJECT_F, [hl]
 	jr z, .got
 
 	call Function7171
--- a/engine/overworld/player_movement.asm
+++ b/engine/overworld/player_movement.asm
@@ -684,7 +684,7 @@
 
 	ld hl, OBJECT_PALETTE
 	add hl, bc
-	bit 6, [hl]
+	bit STRENGTH_BOULDER_F, [hl]
 	jr z, .not_boulder
 
 	ld hl, OBJECT_FLAGS2
@@ -696,7 +696,7 @@
 	ld hl, OBJECT_RANGE
 	add hl, bc
 	ld a, [hl]
-	and $fc
+	and %11111100
 	or d
 	ld [hl], a
 
--- a/engine/overworld/scripting.asm
+++ b/engine/overworld/scripting.asm
@@ -1071,7 +1071,7 @@
 	jr c, .not_visible ; STILL_SPRITE
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
-	bit FIXED_FACING, [hl]
+	bit FIXED_FACING_F, [hl]
 	jr nz, .not_visible
 	pop de
 	ld a, e
--- a/engine/pokemon/bills_pc_top.asm
+++ b/engine/pokemon/bills_pc_top.asm
@@ -96,9 +96,9 @@
 	dw BillsPC_SeeYa
 
 .items ; e4c4
-	db 5
+	db 5 ; # items
 	db 0 ; WITHDRAW
-	db 1;  DEPOSIT
+	db 1 ; DEPOSIT
 	db 2 ; CHANGE BOX
 	db 3 ; MOVE PKMN
 	db 4 ; SEE YA!
--- a/engine/pokemon/move_mon.asm
+++ b/engine/pokemon/move_mon.asm
@@ -1497,17 +1497,17 @@
 	jr z, .Special
 	cp STAT_SDEF
 	jr z, .Special
-; DV_HP = (DV_ATK & 1) << 3 + (DV_DEF & 1) << 2 + (DV_SPD & 1) << 1 + (DV_SPC & 1)
+; DV_HP = (DV_ATK & 1) << 3 | (DV_DEF & 1) << 2 | (DV_SPD & 1) << 1 | (DV_SPC & 1)
 	push bc
 	ld a, [hl]
 	swap a
-	and $1
+	and 1
 	add a
 	add a
 	add a
 	ld b, a
 	ld a, [hli]
-	and $1
+	and 1
 	add a
 	add a
 	add b
@@ -1514,12 +1514,12 @@
 	ld b, a
 	ld a, [hl]
 	swap a
-	and $1
+	and 1
 	add a
 	add b
 	ld b, a
 	ld a, [hl]
-	and $1
+	and 1
 	add b
 	pop bc
 	jr .GotDV
--- /dev/null
+++ b/gfx/beta_poker/beta_poker.pal
@@ -1,0 +1,19 @@
+	RGB 31, 31, 31
+	RGB 30, 22, 24
+	RGB 18, 18, 18
+	RGB 00, 00, 00
+
+	RGB 31, 31, 31
+	RGB 10, 11, 31
+	RGB 18, 18, 18
+	RGB 00, 00, 00
+
+	RGB 31, 31, 31
+	RGB 12, 31, 11
+	RGB 18, 18, 18
+	RGB 00, 00, 00
+
+	RGB 31, 31, 31
+	RGB 29, 26, 05
+	RGB 18, 18, 18
+	RGB 00, 00, 00
binary files a/gfx/pack/pack_menu.png b/gfx/pack/pack_menu.png differ
--- a/gfx/pics.asm
+++ b/gfx/pics.asm
@@ -20,7 +20,6 @@
 
 
 SECTION "Pics 1", ROMX
-Pics_1::
 
 HoOhFrontpic:        INCBIN "gfx/pokemon/ho_oh/front.animated.2bpp.lz"
 MachampFrontpic:     INCBIN "gfx/pokemon/machamp/front.animated.2bpp.lz"
@@ -794,3 +793,21 @@
 INCBIN "gfx/pokemon/unown_p/back.2bpp.lz"
 INCBIN "gfx/pokemon/unown_i/back.2bpp.lz"
 INCBIN "gfx/pokemon/unown_r/back.2bpp.lz"
+
+
+; Sections "Pics 20" to "Pics 24" are not used for any graphics,
+; but entries for their banks exist in FixPicBank (see engine/gfx/load_pics.asm).
+
+SECTION "Pics 20", ROMX
+
+
+SECTION "Pics 21", ROMX
+
+
+SECTION "Pics 22", ROMX
+
+
+SECTION "Pics 23", ROMX
+
+
+SECTION "Pics 24", ROMX
--- a/gfx/sgb/pal_packets.asm
+++ b/gfx/sgb/pal_packets.asm
@@ -21,10 +21,10 @@
 	sgb_pal_set GS_TITLE_SCREEN_0, GS_TITLE_SCREEN_1, GS_TITLE_SCREEN_2, GS_TITLE_SCREEN_3
 
 PalPacket_SCGB_13:
-	sgb_pal_set GREENMON_NITE, CGB_BADGE, RB_BROWNMON, 00
+	sgb_pal_set BETA_SHINY_GREENMON, CGB_BADGE, RB_BROWNMON, 00
 
-PalPacket_SCGB_11:
-	sgb_pal_set SCGB_11_0, SCGB_11_1, SCGB_11_2, SCGB_11_3
+PalPacket_BetaPoker:
+	sgb_pal_set BETA_POKER_0, BETA_POKER_1, BETA_POKER_2, BETA_POKER_3
 
 PalPacket_UnownPuzzle:
 	sgb_pal_set UNOWN_PUZZLE, UNOWN_PUZZLE, UNOWN_PUZZLE, UNOWN_PUZZLE
@@ -35,8 +35,8 @@
 PalPacket_GSIntroShellderLapras:
 	sgb_pal_set GS_INTRO_SHELLDER_LAPRAS, 00, 00, 00
 
-UnreferencedPalPacket_9bf6:
-	sgb_pal_set 37, 00, 00, 00
+UnreferencedPalPacket_BetaIntroLapras:
+	sgb_pal_set BETA_INTRO_LAPRAS, 00, 00, 00
 
 PalPacket_GSIntroJigglypuffPikachu:
 	sgb_pal_set GS_INTRO_JIGGLYPUFF_PIKACHU_BG, GS_INTRO_JIGGLYPUFF_PIKACHU_OB, 00, 00
@@ -44,13 +44,13 @@
 PalPacket_GSIntroStartersTransition:
 	sgb_pal_set GS_INTRO_STARTERS_TRANSITION, 00, 00, 00
 
-PalPacket_Function8b4d:
-	sgb_pal_set 3B, 00, 00, 00
+PalPacket_BetaIntroVenusaur:
+	sgb_pal_set BETA_INTRO_VENUSAUR, 00, 00, 00
 
 PalPacket_Pack:
 	sgb_pal_set PACK, 00, 00, 00
 
-PalPacket_SCGB_0F:
+PalPacket_BetaPikachuMinigame:
 	sgb_pal_set GS_INTRO_JIGGLYPUFF_PIKACHU_OB, 00, 00, 00
 
 PalPacket_PartyMenu:
@@ -69,7 +69,7 @@
 	sgb_pal_set SLOT_MACHINE_0, SLOT_MACHINE_1, SLOT_MACHINE_2, SLOT_MACHINE_3
 
 PalPacket_SCGB_06:
-	sgb_pal_set 33, 34, DIPLOMA, RB_PURPLEMON
+	sgb_pal_set BETA_LOGO_1, BETA_LOGO_2, DIPLOMA, RB_PURPLEMON
 
 PalPacket_Diploma:
 	sgb_pal_set DIPLOMA, 00, 00, 00
--- a/gfx/sgb/predef.pal
+++ b/gfx/sgb/predef.pal
@@ -35,40 +35,40 @@
 	RGB 31,31,31, 30,22,24, 28,15,21, 00,00,00 ; PREDEFPAL_RB_PINKMON
 	RGB 31,31,31, 31,28,14, 26,20,00, 00,00,00 ; PREDEFPAL_RB_YELLOWMON
 	RGB 31,31,31, 26,21,22, 15,15,18, 00,00,00 ; PREDEFPAL_CGB_BADGE
-	RGB 31,31,31, 23,19,13, 14,12,17, 00,00,00 ; PREDEFPAL_MEWMON_NITE
-	RGB 31,31,31, 16,18,21, 10,12,18, 00,00,00 ; PREDEFPAL_BLUEMON_NITE
-	RGB 31,31,31, 22,15,16, 17,02,05, 00,00,00 ; PREDEFPAL_REDMON_NITE
-	RGB 31,31,31, 15,20,20, 05,16,16, 00,00,00 ; PREDEFPAL_CYANMON_NITE
-	RGB 31,31,31, 23,15,19, 14,04,12, 00,00,00 ; PREDEFPAL_PURPLEMON_NITE
-	RGB 31,31,31, 20,17,18, 18,13,11, 00,00,00 ; PREDEFPAL_BROWNMON_NITE
-	RGB 31,31,31, 23,21,16, 12,12,10, 00,00,00 ; PREDEFPAL_GREENMON_NITE
-	RGB 31,31,31, 21,25,29, 30,22,24, 00,00,00 ; PREDEFPAL_PINKMON_NITE
-	RGB 31,31,31, 26,23,16, 29,14,09, 00,00,00 ; PREDEFPAL_YELLOWMON_NITE
+	RGB 31,31,31, 23,19,13, 14,12,17, 00,00,00 ; PREDEFPAL_SHINY_MEWMON
+	RGB 31,31,31, 16,18,21, 10,12,18, 00,00,00 ; PREDEFPAL_SHINY_BLUEMON
+	RGB 31,31,31, 22,15,16, 17,02,05, 00,00,00 ; PREDEFPAL_SHINY_REDMON
+	RGB 31,31,31, 15,20,20, 05,16,16, 00,00,00 ; PREDEFPAL_SHINY_CYANMON
+	RGB 31,31,31, 23,15,19, 14,04,12, 00,00,00 ; PREDEFPAL_SHINY_PURPLEMON
+	RGB 31,31,31, 20,17,18, 18,13,11, 00,00,00 ; PREDEFPAL_SHINY_BROWNMON
+	RGB 31,31,31, 23,21,16, 12,12,10, 00,00,00 ; PREDEFPAL_SHINY_GREENMON
+	RGB 31,31,31, 21,25,29, 30,22,24, 00,00,00 ; PREDEFPAL_SHINY_PINKMON
+	RGB 31,31,31, 26,23,16, 29,14,09, 00,00,00 ; PREDEFPAL_SHINY_YELLOWMON
 	RGB 31,31,31, 18,18,18, 10,10,10, 00,00,00 ; PREDEFPAL_PARTY_ICON
 	RGB 31,31,31, 30,26,15, 00,23,00, 00,00,00 ; PREDEFPAL_HP_GREEN
 	RGB 31,31,31, 30,26,15, 31,23,00, 00,00,00 ; PREDEFPAL_HP_YELLOW
 	RGB 31,31,31, 30,26,15, 31,00,00, 00,00,00 ; PREDEFPAL_HP_RED
 	RGB 31,31,31, 29,26,19, 27,20,14, 00,00,00 ; PREDEFPAL_POKEGEAR
-	RGB 31,31,31, 24,20,10, 21,00,04, 00,00,00 ; PREDEFPAL_33
-	RGB 31,31,31, 31,20,10, 21,00,04, 00,00,00 ; PREDEFPAL_34
+	RGB 31,31,31, 24,20,10, 21,00,04, 00,00,00 ; PREDEFPAL_BETA_LOGO_1
+	RGB 31,31,31, 31,20,10, 21,00,04, 00,00,00 ; PREDEFPAL_BETA_LOGO_2
 	RGB 31,31,31, 30,26,16, 16,12,09, 00,00,00 ; PREDEFPAL_GS_INTRO_GAMEFREAK_LOGO
 	RGB 31,31,31, 15,28,26, 12,22,26, 03,16,14 ; PREDEFPAL_GS_INTRO_SHELLDER_LAPRAS
-	RGB 31,31,31, 15,28,26, 23,24,24, 00,00,00 ; PREDEFPAL_37
+	RGB 31,31,31, 15,28,26, 23,24,24, 00,00,00 ; PREDEFPAL_BETA_INTRO_LAPRAS
 	RGB 31,31,24, 07,27,19, 26,20,10, 19,12,08 ; PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_BG
 	RGB 31,31,31, 31,28,14, 31,13,31, 00,00,00 ; PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_OB
 	RGB 31,31,31, 16,18,21, 10,12,18, 00,00,00 ; PREDEFPAL_GS_INTRO_STARTERS_TRANSITION
-	RGB 31,31,31, 23,21,16, 12,12,10, 00,00,00 ; PREDEFPAL_3B
+	RGB 31,31,31, 23,21,16, 12,12,10, 00,00,00 ; PREDEFPAL_BETA_INTRO_VENUSAUR
 	RGB 31,31,31, 31,14,00, 07,11,15, 00,00,00 ; PREDEFPAL_PACK
 	RGB 31,31,31, 26,21,22, 26,10,06, 00,00,00 ; PREDEFPAL_SLOT_MACHINE_0
 	RGB 31,31,31, 30,27,04, 24,20,11, 00,00,00 ; PREDEFPAL_SLOT_MACHINE_1
 	RGB 31,31,31, 31,13,25, 24,20,11, 00,00,00 ; PREDEFPAL_SLOT_MACHINE_2
 	RGB 31,31,31, 16,19,29, 24,20,11, 00,00,00 ; PREDEFPAL_SLOT_MACHINE_3
-	RGB 31,31,31, 30,22,24, 18,18,18, 16,10,07 ; PREDEFPAL_SCGB_11_0
-	RGB 31,31,31, 21,25,29, 18,18,18, 16,10,07 ; PREDEFPAL_SCGB_11_1
-	RGB 31,31,31, 20,26,16, 18,18,18, 16,10,07 ; PREDEFPAL_SCGB_11_2
-	RGB 31,31,31, 31,28,14, 18,18,18, 16,10,07 ; PREDEFPAL_SCGB_11_3
-	RGB 31,31,31, 18,18,18, 26,10,06, 00,00,00 ; PREDEFPAL_45
-	RGB 31,31,31, 30,22,24, 28,15,21, 00,00,00 ; PREDEFPAL_46
+	RGB 31,31,31, 30,22,24, 18,18,18, 16,10,07 ; PREDEFPAL_BETA_POKER_0
+	RGB 31,31,31, 21,25,29, 18,18,18, 16,10,07 ; PREDEFPAL_BETA_POKER_1
+	RGB 31,31,31, 20,26,16, 18,18,18, 16,10,07 ; PREDEFPAL_BETA_POKER_2
+	RGB 31,31,31, 31,28,14, 18,18,18, 16,10,07 ; PREDEFPAL_BETA_POKER_3
+	RGB 31,31,31, 18,18,18, 26,10,06, 00,00,00 ; PREDEFPAL_BETA_RADIO
+	RGB 31,31,31, 30,22,24, 28,15,21, 00,00,00 ; PREDEFPAL_BETA_POKEGEAR
 	RGB 31,31,31, 26,20,00, 16,19,29, 00,00,00 ; PREDEFPAL_47
 	RGB 31,31,31, 16,02,30, 15,20,31, 00,00,00 ; PREDEFPAL_GS_TITLE_SCREEN_0
 	RGB 31,31,31, 16,13,04, 15,20,31, 00,00,00 ; PREDEFPAL_GS_TITLE_SCREEN_1
--- a/gfx/tilesets/roofs.pal
+++ b/gfx/tilesets/roofs.pal
@@ -1,107 +1,107 @@
 ; group 0 (unused)
 	RGB 21,21,21, 11,11,11 ; morn/day
-	RGB 21,21,21, 11,11,11; nite
+	RGB 21,21,21, 11,11,11 ; nite
 
 ; group 1 (Olivine)
 	RGB 14,17,31, 07,11,15 ; morn/day
-	RGB 09,09,17, 05,07,13; nite
+	RGB 09,09,17, 05,07,13 ; nite
 
 ; group 2 (Mahogany)
 	RGB 12,19,00, 06,10,00 ; morn/day
-	RGB 06,09,07, 04,05,06; nite
+	RGB 06,09,07, 04,05,06 ; nite
 
 ; group 3 (dungeons)
 	RGB 21,21,21, 11,11,11 ; morn/day
-	RGB 21,21,21, 17,08,07; nite
+	RGB 21,21,21, 17,08,07 ; nite
 
 ; group 4 (Ecruteak)
 	RGB 31,19,00, 27,10,05 ; morn/day
-	RGB 15,07,02, 11,04,02; nite
+	RGB 15,07,02, 11,04,02 ; nite
 
 ; group 5 (Blackthorn)
 	RGB 11,10,16, 05,06,07 ; morn/day
-	RGB 03,04,08, 00,00,00; nite
+	RGB 03,04,08, 00,00,00 ; nite
 
 ; group 6 (Cinnabar)
 	RGB 31,10,00, 18,06,00 ; morn/day
-	RGB 18,05,09, 17,08,07; nite
+	RGB 18,05,09, 17,08,07 ; nite
 
 ; group 7 (Cerulean)
 	RGB 17,27,31, 05,15,31 ; morn/day
-	RGB 07,08,22, 07,07,16; nite
+	RGB 07,08,22, 07,07,16 ; nite
 
 ; group 8 (Azalea)
 	RGB 22,20,10, 17,14,03 ; morn/day
-	RGB 11,11,05, 10,09,07; nite
+	RGB 11,11,05, 10,09,07 ; nite
 
 ; group 9 (Lake of Rage)
 	RGB 31,08,04, 09,09,08 ; morn/day
-	RGB 18,05,09, 09,09,08; nite
+	RGB 18,05,09, 09,09,08 ; nite
 
 ; group 10 (Violet)
 	RGB 24,14,31, 13,07,21 ; morn/day
-	RGB 12,03,18, 09,03,15; nite
+	RGB 12,03,18, 09,03,15 ; nite
 
 ; group 11 (Goldenrod)
 	RGB 25,25,00, 20,17,08 ; morn/day
-	RGB 12,12,00, 10,09,05; nite
+	RGB 12,12,00, 10,09,05 ; nite
 
 ; group 12 (Vermilion)
 	RGB 27,23,01, 23,11,00 ; morn/day
-	RGB 15,11,01, 11,10,01; nite
+	RGB 15,11,01, 11,10,01 ; nite
 
 ; group 13 (Pallet)
 	RGB 27,28,31, 17,19,22 ; morn/day
-	RGB 14,14,18, 10,09,13; nite
+	RGB 14,14,18, 10,09,13 ; nite
 
 ; group 14 (Pewter)
 	RGB 19,19,16, 10,12,15 ; morn/day
-	RGB 09,09,11, 04,05,07; nite
+	RGB 09,09,11, 04,05,07 ; nite
 
 ; group 15 (Mount Moon Square)
 	RGB 14,17,31, 07,11,15 ; morn/day
-	RGB 09,13,19, 07,07,16; nite
+	RGB 09,13,19, 07,07,16 ; nite
 
 ; group 16 (Indigo)
 	RGB 21,21,21, 13,13,13 ; morn/day
-	RGB 11,11,19, 07,07,12; nite
+	RGB 11,11,19, 07,07,12 ; nite
 
 ; group 17 (Fuchsia)
 	RGB 31,18,29, 17,13,20 ; morn/day
-	RGB 14,06,12, 11,03,10; nite
+	RGB 14,06,12, 11,03,10 ; nite
 
 ; group 18 (Lavender)
 	RGB 23,15,31, 16,05,31 ; morn/day
-	RGB 12,07,17, 08,06,10; nite
+	RGB 12,07,17, 08,06,10 ; nite
 
 ; group 19 (Silver Cave)
 	RGB 21,21,25, 16,16,16 ; morn/day
-	RGB 13,13,13, 07,07,07; nite
+	RGB 13,13,13, 07,07,07 ; nite
 
 ; group 20 (Cable Club)
 	RGB 21,21,21, 11,11,11 ; morn/day
-	RGB 21,21,21, 11,11,11; nite
+	RGB 21,21,21, 11,11,11 ; nite
 
 ; group 21 (Celadon)
 	RGB 19,31,15, 31,22,02 ; morn/day
-	RGB 12,13,09, 09,12,03; nite
+	RGB 12,13,09, 09,12,03 ; nite
 
 ; group 22 (Cianwood)
 	RGB 15,10,31, 07,05,15 ; morn/day
-	RGB 06,05,17, 02,02,08; nite
+	RGB 06,05,17, 02,02,08 ; nite
 
 ; group 23 (Viridian)
 	RGB 21,31,07, 13,25,04 ; morn/day
-	RGB 09,14,08, 06,10,04; nite
+	RGB 09,14,08, 06,10,04 ; nite
 
 ; group 24 (New Bark)
 	RGB 20,31,14, 11,23,05 ; morn/day
-	RGB 09,13,08, 06,09,04; nite
+	RGB 09,13,08, 06,09,04 ; nite
 
 ; group 25 (Saffron)
 	RGB 31,26,00, 31,15,00 ; morn/day
-	RGB 13,13,01, 08,08,01; nite
+	RGB 13,13,01, 08,08,01 ; nite
 
 ; group 26 (Cherrygrove)
 	RGB 31,14,28, 31,05,21 ; morn/day
-	RGB 14,07,17, 13,00,08; nite
+	RGB 14,07,17, 13,00,08 ; nite
--- a/gfx/unknown/b789.pal
+++ /dev/null
@@ -1,19 +1,0 @@
-	RGB 31, 31, 31
-	RGB 30, 22, 24
-	RGB 18, 18, 18
-	RGB 00, 00, 00
-
-	RGB 31, 31, 31
-	RGB 10, 11, 31
-	RGB 18, 18, 18
-	RGB 00, 00, 00
-
-	RGB 31, 31, 31
-	RGB 12, 31, 11
-	RGB 18, 18, 18
-	RGB 00, 00, 00
-
-	RGB 31, 31, 31
-	RGB 29, 26, 05
-	RGB 18, 18, 18
-	RGB 00, 00, 00
--- a/home.asm
+++ b/home.asm
@@ -227,26 +227,7 @@
 ; 31f3
 
 INCLUDE "home/tilemap.asm"
-
-SetHPPal:: ; 334e
-; Set palette for hp bar pixel length e at hl.
-	call GetHPPal
-	ld [hl], d
-	ret
-; 3353
-
-GetHPPal:: ; 3353
-; Get palette for hp bar pixel length e in d.
-	ld d, HP_GREEN
-	ld a, e
-	cp (50 * 48 / 100)
-	ret nc
-	inc d ; HP_YELLOW
-	cp (21 * 48 / 100)
-	ret nc
-	inc d ; HP_RED
-	ret
-; 335f
+INCLUDE "home/hp_pals.asm"
 
 CountSetBits:: ; 0x335f
 ; Count the number of set bits in b bytes starting from hl.
--- a/home/copy2.asm
+++ b/home/copy2.asm
@@ -1,7 +1,7 @@
 CopyBytes:: ; 0x3026
 ; copy bc bytes from hl to de
-	inc b  ; we bail the moment b hits 0, so include the last run
-	inc c  ; same thing; include last byte
+	inc b ; we bail the moment b hits 0, so include the last run
+	inc c ; same thing; include last byte
 	jr .HandleLoop
 .CopyByte:
 	ld a, [hli]
@@ -39,8 +39,8 @@
 
 ByteFill:: ; 0x3041
 ; fill bc bytes with the value of a, starting at hl
-	inc b  ; we bail the moment b hits 0, so include the last run
-	inc c  ; same thing; include last byte
+	inc b ; we bail the moment b hits 0, so include the last run
+	inc c ; same thing; include last byte
 	jr .HandleLoop
 .PutByte:
 	ld [hli], a
--- /dev/null
+++ b/home/hp_pals.asm
@@ -1,0 +1,19 @@
+SetHPPal:: ; 334e
+; Set palette for hp bar pixel length e at hl.
+	call GetHPPal
+	ld [hl], d
+	ret
+; 3353
+
+GetHPPal:: ; 3353
+; Get palette for hp bar pixel length e in d.
+	ld d, HP_GREEN
+	ld a, e
+	cp (HP_BAR_LENGTH_PX * 50 / 100) ; 24
+	ret nc
+	inc d ; HP_YELLOW
+	cp (HP_BAR_LENGTH_PX * 21 / 100) ; 10
+	ret nc
+	inc d ; HP_RED
+	ret
+; 335f
--- a/home/map_objects.asm
+++ b/home/map_objects.asm
@@ -482,10 +482,10 @@
 	xor a
 
 .ok
-	ld hl, SpriteMovementData
+	ld hl, SpriteMovementData + SPRITEMOVEATTR_MOVEMENT
 	ld e, a
 	ld d, 0
-rept SPRITEMOVEDATA_FIELDS
+rept NUM_SPRITEMOVEDATA_FIELDS
 	add hl, de
 endr
 	ld a, [hl]
@@ -497,8 +497,8 @@
 	push de
 	ld e, a
 	ld d, 0
-	ld hl, SpriteMovementData + 1 ; init facing
-rept SPRITEMOVEDATA_FIELDS
+	ld hl, SpriteMovementData + SPRITEMOVEATTR_FACING
+rept NUM_SPRITEMOVEDATA_FIELDS
 	add hl, de
 endr
 	ld a, BANK(SpriteMovementData)
@@ -505,7 +505,7 @@
 	call GetFarByte
 	add a
 	add a
-	and $c
+	maskbits NUM_DIRECTIONS, 2
 	pop de
 	pop bc
 	ret
@@ -537,8 +537,8 @@
 	push de
 	ld e, a
 	ld d, 0
-	ld hl, SpriteMovementData + 1 ; init facing
-rept SPRITEMOVEDATA_FIELDS
+	ld hl, SpriteMovementData + SPRITEMOVEATTR_FACING
+rept NUM_SPRITEMOVEDATA_FIELDS
 	add hl, de
 endr
 	ld b, h
@@ -549,7 +549,7 @@
 	inc bc
 	rlca
 	rlca
-	and %00001100
+	maskbits NUM_DIRECTIONS, 2
 	ld hl, OBJECT_FACING
 	add hl, de
 	ld [hl], a
@@ -654,7 +654,7 @@
 	and %11110011
 	ld e, a
 	pop af
-	and %00001100
+	maskbits NUM_DIRECTIONS, 2
 	or e
 	ld [hl], a
 	ret
@@ -664,6 +664,6 @@
 	ld hl, OBJECT_FACING
 	add hl, bc
 	ld a, [hl]
-	and %00001100
+	maskbits NUM_DIRECTIONS, 2
 	ret
 ; 1b0f
--- a/macros/code.asm
+++ b/macros/code.asm
@@ -36,8 +36,10 @@
 ENDM
 
 maskbits: MACRO
-; masks just enough bits to cover the argument
+; masks just enough bits to cover the first argument
+; the second argument is an optional shift amount
 ; e.g. "maskbits 26" becomes "and %00011111" (since 26 - 1 = %00011001)
+; and "maskbits 3, 2" becomes "and %00001100" (since "maskbits 3" becomes %00000011)
 ; example usage in rejection sampling:
 ; .loop
 ; 	call Random
@@ -50,7 +52,11 @@
 x = x << 1 | 1
 endc
 endr
+if _NARG == 2
+	and x << (\2)
+else
 	and x
+endc
 ENDM
 
 calc_sine_wave: MACRO
--- a/maps/GoldenrodGameCorner.asm
+++ b/maps/GoldenrodGameCorner.asm
@@ -46,10 +46,10 @@
 	turnobject GOLDENRODGAMECORNER_POKEFAN_M3, RIGHT
 	end
 
-GoldenrodGmeCornerCoinVendorScript:
+GoldenrodGameCornerCoinVendorScript:
 	jumpstd gamecornercoinvendor
 
-GoldenrodGmeCornerTMVendorScript:
+GoldenrodGameCornerTMVendorScript:
 	faceplayer
 	opentext
 	writetext GoldenrodGameCornerPrizeVendorIntroText
@@ -57,7 +57,7 @@
 	checkitem COIN_CASE
 	iffalse GoldenrodGameCornerPrizeVendor_NoCoinCaseScript
 	writetext GoldenrodGameCornerPrizeVendorWhichPrizeText
-GoldenrodGmeCornerTMVendor_LoopScript: ; 056c36
+GoldenrodGameCornerTMVendor_LoopScript: ; 056c36
 	special DisplayCoinCaseBalance
 	loadmenu GoldenrodGameCornerTMVendorMenuHeader
 	verticalmenu
@@ -76,7 +76,7 @@
 	giveitem TM_THUNDER
 	iffalse GoldenrodGameCornerPrizeMonVendor_NoRoomForPrizeScript
 	takecoins 5500
-	jump GoldenrodGmeCornerTMVendor_FinishScript
+	jump GoldenrodGameCornerTMVendor_FinishScript
 
 .Blizzard:
 	checkcoins 5500
@@ -87,7 +87,7 @@
 	giveitem TM_BLIZZARD
 	iffalse GoldenrodGameCornerPrizeMonVendor_NoRoomForPrizeScript
 	takecoins 5500
-	jump GoldenrodGmeCornerTMVendor_FinishScript
+	jump GoldenrodGameCornerTMVendor_FinishScript
 
 .FireBlast:
 	checkcoins 5500
@@ -98,7 +98,7 @@
 	giveitem TM_FIRE_BLAST
 	iffalse GoldenrodGameCornerPrizeMonVendor_NoRoomForPrizeScript
 	takecoins 5500
-	jump GoldenrodGmeCornerTMVendor_FinishScript
+	jump GoldenrodGameCornerTMVendor_FinishScript
 
 GoldenrodGameCornerPrizeVendor_ConfirmPurchaseScript:
 	writetext GoldenrodGameCornerPrizeVendorConfirmPrizeText
@@ -105,12 +105,12 @@
 	yesorno
 	end
 
-GoldenrodGmeCornerTMVendor_FinishScript:
+GoldenrodGameCornerTMVendor_FinishScript:
 	waitsfx
 	playsound SFX_TRANSACTION
 	writetext GoldenrodGameCornerPrizeVendorHereYouGoText
 	waitbutton
-	jump GoldenrodGmeCornerTMVendor_LoopScript
+	jump GoldenrodGameCornerTMVendor_LoopScript
 
 GoldenrodGameCornerPrizeVendor_NotEnoughCoinsScript:
 	writetext GoldenrodGameCornerPrizeVendorNeedMoreCoinsText
@@ -477,8 +477,8 @@
 	bg_event 12,  1, BGEVENT_LEFT, GoldenrodGameCornerLeftTheirDrinkScript
 
 	db 12 ; object events
-	object_event  3,  2, SPRITE_CLERK, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, GoldenrodGmeCornerCoinVendorScript, -1
-	object_event 16,  2, SPRITE_RECEPTIONIST, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, GoldenrodGmeCornerTMVendorScript, -1
+	object_event  3,  2, SPRITE_CLERK, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, GoldenrodGameCornerCoinVendorScript, -1
+	object_event 16,  2, SPRITE_RECEPTIONIST, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, GoldenrodGameCornerTMVendorScript, -1
 	object_event 18,  2, SPRITE_RECEPTIONIST, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, GoldenrodGameCornerPrizeMonVendorScript, -1
 	object_event  8,  7, SPRITE_PHARMACIST, SPRITEMOVEDATA_STANDING_LEFT, 0, 0, -1, DAY, PAL_NPC_BLUE, OBJECTTYPE_SCRIPT, 0, GoldenrodGameCornerPharmacistScript, -1
 	object_event  8,  7, SPRITE_PHARMACIST, SPRITEMOVEDATA_STANDING_LEFT, 0, 0, -1, NITE, PAL_NPC_BLUE, OBJECTTYPE_SCRIPT, 0, GoldenrodGameCornerPharmacistScript, -1
--- a/maps/Route35GoldenrodGate.asm
+++ b/maps/Route35GoldenrodGate.asm
@@ -63,15 +63,17 @@
 	end
 
 GiftSpearowMail:
-	db   FLOWER_MAIL
+	db FLOWER_MAIL
 	db   "DARK CAVE leads"
 	next "to another road@"
+
 GiftSpearowName:
 	db "KENYA@"
+
 GiftSpearowOTName:
 	db "RANDY@"
 
-	db 0
+	db 0 ; filler
 
 Route35GoldenrodGatePokefanFScript:
 	faceplayer
--- a/mobile/mobile_40.asm
+++ b/mobile/mobile_40.asm
@@ -83,7 +83,7 @@
 	call DoubleSpeed
 	xor a
 	ld [rIF], a
-	ld a, 1 << VBLANK + 1 << LCD_STAT + 1 << TIMER + 1 << SERIAL
+	ld a, 1 << VBLANK | 1 << LCD_STAT | 1 << TIMER | 1 << SERIAL
 	ld [rIE], a
 	xor a
 	ld [hMapAnims], a
--- a/pokecrystal.link
+++ b/pokecrystal.link
@@ -234,17 +234,22 @@
 	"Pics 19"
 ROMX $5b
 	"bank5B"
+	"Pics 20"
 ROMX $5c
 	"Mobile 5C"
+	"Pics 21"
 ROMX $5d
 	"Crystal Phone Text 2"
+	"Pics 22"
 ROMX $5e
 	"UpdateBattleHUDs"
 	"Songs 5"
 	"Crystal Sound Effects"
 	"Mobile 5E"
+	"Pics 23"
 ROMX $5f
 	"Mobile 5F"
+	"Pics 24"
 ROMX $60
 	"Map Scripts 13"
 	"Pokedex Entries 001-064"
--- a/wram.asm
+++ b/wram.asm
@@ -2421,7 +2421,7 @@
 
 wObjectMasks:: ds NUM_OBJECTS ; d81e
 
-wVariableSprites:: ds 16; d82e
+wVariableSprites:: ds $100 - SPRITE_VARS ; d82e
 
 wEnteredMapFromContinue:: db ; d83e
 	ds 2