shithub: pokecrystal

Download patch

ref: 9bbb65166e4f7674bbdec7b1314b0cf42b43a923
parent: a2a26682330b70629d68f1f159c9b139b237c5ae
author: PikalaxALT <[email protected]>
date: Tue Dec 29 08:15:58 EST 2015

More movement stuff

--- a/battle/core.asm
+++ b/battle/core.asm
@@ -5508,7 +5508,7 @@
 ; 3e40b
 
 BattleMonEntrance: ; 3e40b
-	call BattleMonNickComma_TextBox
+	call WithdrawPkmnText
 
 	ld c, 50
 	call DelayFrames
@@ -8103,8 +8103,6 @@
 JumpText_YourFoesWeakGetmPkmn: ; 3f2e6
 	text_jump Text_YourFoesWeakGetmPkmn
 	start_asm
-; 3f2eb
-
 Function_TextJump_BattleMonNick01: ; 3f2eb
 	ld hl, TextJump_BattleMonNick01
 	ret
@@ -8115,18 +8113,13 @@
 	db "@"
 ; 3f2f4
 
-
-BattleMonNickComma_TextBox: ; 3f2f4
-	ld hl, TextJump_BattleMonNickComma
+WithdrawPkmnText: ; 3f2f4
+	ld hl, .WithdrawPkmnText
 	jp BattleTextBox
-; 3f2fa
 
-TextJump_BattleMonNickComma: ; 3f2fa
+.WithdrawPkmnText
 	text_jump Text_BattleMonNickComma
 	start_asm
-; 3f2ff
-
-WithdrawPkmnText: ; 3f2ff
 ; Print text to withdraw Pkmn
 ; depending on HP the message is different
 	push de
--- a/battle/effect_commands.asm
+++ b/battle/effect_commands.asm
@@ -5949,7 +5949,6 @@
 .stat
 	text_jump UnknownText_0x1c0cc6
 	start_asm
-
 	ld hl, .up
 	ld a, [LoweredStat]
 	and $f0
@@ -5983,7 +5982,6 @@
 .stat
 	text_jump UnknownText_0x1c0ceb
 	start_asm
-
 	ld hl, .fell
 	ld a, [LoweredStat]
 	and $f0
@@ -7345,7 +7343,6 @@
 .UsedText
 	text_jump UnknownText_0x1c0d0e ; "[USER]"
 	start_asm
-
 	ld a, BATTLE_VARS_MOVE_ANIM
 	call GetBattleVar
 	cp RAZOR_WIND
--- a/battle/used_move_text.asm
+++ b/battle/used_move_text.asm
@@ -11,7 +11,6 @@
 
 	text_jump _ActorNameText
 	start_asm
-
 	ld a, [hBattleTurn]
 	and a
 	jr nz, .start
@@ -67,30 +66,26 @@
 UsedMove1Text: ; 105e04
 	text_jump _UsedMove1Text
 	start_asm
-	jr Function105e10
+	jr UsedMoveText_CheckObedience
 ; 105e0b
 
 UsedMove2Text: ; 105e0b
 	text_jump _UsedMove2Text
 	start_asm
-; 105e10
-
-Function105e10: ; 105e10
+UsedMoveText_CheckObedience: ; 105e10
 ; check obedience
 	ld a, [AlreadyDisobeyed]
 	and a
-	jr z, GetMoveNameText
+	jr z, .GetMoveNameText
 ; print "instead,"
-	ld hl, UsedInsteadText
+	ld hl, .UsedInsteadText
 	ret
 ; 105e1a
 
-UsedInsteadText: ; 105e1a
+.UsedInsteadText
 	text_jump _UsedInsteadText
 	start_asm
-; 105e1f
-
-GetMoveNameText: ; 105e1f
+.GetMoveNameText
 	ld hl, MoveNameText
 	ret
 ; 105e23
@@ -98,9 +93,6 @@
 MoveNameText: ; 105e23
 	text_jump _MoveNameText
 	start_asm
-; 105e28
-
-GetUsedMoveTextEnder: ; 105e28
 ; get start address
 	ld hl, .endusedmovetexts
 
--- /dev/null
+++ b/data/map_objects.asm
@@ -1,0 +1,44 @@
+sprite_movement_data: macro
+	db \1, \2, \3, \4, \5
+	dn \6, 0
+endm
+
+	; function,                                              facing, action,              flags1, flags2, palette flags
+	sprite_movement_data SPRITEMOVEFN_00,                    DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 00
+	sprite_movement_data SPRITEMOVEFN_STANDING,              DOWN,   PERSON_ACTION_STAND,    $0c,    $00,    %0000 ; 01
+	sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_XY,        DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 02
+	sprite_movement_data SPRITEMOVEFN_SLOW_RANDOM_SPIN,      DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 03
+	sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_Y,         DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 04
+	sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_X,         DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 05
+	sprite_movement_data SPRITEMOVEFN_STANDING,              DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 06
+	sprite_movement_data SPRITEMOVEFN_STANDING,              UP,     PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 07
+	sprite_movement_data SPRITEMOVEFN_STANDING,              LEFT,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 08
+	sprite_movement_data SPRITEMOVEFN_STANDING,              RIGHT,  PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 09
+	sprite_movement_data SPRITEMOVEFN_FAST_RANDOM_SPIN,      DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0a
+	sprite_movement_data SPRITEMOVEFN_OBEY_DPAD,             DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 0b
+	sprite_movement_data SPRITEMOVEFN_08,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0c
+	sprite_movement_data SPRITEMOVEFN_09,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0d
+	sprite_movement_data SPRITEMOVEFN_0A,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0e
+	sprite_movement_data SPRITEMOVEFN_0B,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0f
+	sprite_movement_data SPRITEMOVEFN_0C,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 10
+	sprite_movement_data SPRITEMOVEFN_0D,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 11
+	sprite_movement_data SPRITEMOVEFN_0E,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 12
+	sprite_movement_data SPRITEMOVEFN_FOLLOW,                DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 13
+	sprite_movement_data SPRITEMOVEFN_SCRIPTED,              DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 14
+	sprite_movement_data SPRITEMOVEFN_BIG_SNORLAX,           DOWN,   PERSON_ACTION_09,    $2e,    $01,    %1100 ; 15
+	sprite_movement_data SPRITEMOVEFN_BOUNCE,                DOWN,   PERSON_ACTION_0A,    $2e,    $00,    %0000 ; 16
+	sprite_movement_data SPRITEMOVEFN_STANDING,              DOWN,   PERSON_ACTION_STAND,    $0c,    $00,    %0000 ; 17
+	sprite_movement_data SPRITEMOVEFN_STANDING,              DOWN,   PERSON_ACTION_STAND,    $2e,    $10,    %0000 ; 18
+	sprite_movement_data SPRITEMOVEFN_STRENGTH,              DOWN,   PERSON_ACTION_STAND,    $2e,    $00,    %0100 ; 19
+	sprite_movement_data SPRITEMOVEFN_FOLLOWNOTEXACT,        DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 1a
+	sprite_movement_data SPRITEMOVEFN_SHADOW,                DOWN,   PERSON_ACTION_00,    $8e,    $01,    %0000 ; 1b
+	sprite_movement_data SPRITEMOVEFN_EMOTE,                 DOWN,   PERSON_ACTION_EMOTE,    $8e,    $02,    %0000 ; 1c
+	sprite_movement_data SPRITEMOVEFN_SCREENSHAKE,           DOWN,   PERSON_ACTION_00,    $82,    $00,    %0000 ; 1d
+	sprite_movement_data SPRITEMOVEFN_SPIN_COUNTERCLOCKWISE, LEFT,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 1e
+	sprite_movement_data SPRITEMOVEFN_SPIN_CLOCKWISE,        RIGHT,  PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 1f
+	sprite_movement_data SPRITEMOVEFN_STRENGTH,              DOWN,   PERSON_ACTION_0C,    $2e,    $01,    %1100 ; 20
+	sprite_movement_data SPRITEMOVEFN_STRENGTH,              DOWN,   PERSON_ACTION_0D,    $2e,    $01,    %1100 ; 21
+	sprite_movement_data SPRITEMOVEFN_BOULDERDUST,           DOWN,   PERSON_ACTION_0E,    $8e,    $01,    %0000 ; 22
+	sprite_movement_data SPRITEMOVEFN_GRASS,                 DOWN,   PERSON_ACTION_0F,    $8e,    $02,    %0000 ; 23
+	sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_XY,        DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0010 ; 24
+	sprite_movement_data SPRITEMOVEFN_00,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 25
\ No newline at end of file
--- a/engine/breeding/egg.asm
+++ b/engine/breeding/egg.asm
@@ -8,7 +8,7 @@
 	ld [TempMonDVs], a
 	ld a, [wBreedMon1DVs + 1]
 	ld [TempMonDVs + 1], a
-	ld a, $3
+	ld a, BREEDMON
 	ld [MonType], a
 	predef GetGender
 	jr c, .genderless
--- a/engine/learn.asm
+++ b/engine/learn.asm
@@ -51,7 +51,7 @@
 .not_disabled
 
 	call GetMoveName
-	ld hl, UnknownText_0x6684 ; 1, 2 and…
+	ld hl, Text_1_2_and_Poof ; 1, 2 and…
 	call PrintText
 	pop de
 	pop hl
@@ -102,18 +102,18 @@
 	jp .learned
 
 .cancel
-	ld hl, UnknownText_0x6675 ; Stop learning <MOVE>?
+	ld hl, Text_StopLearning ; Stop learning <MOVE>?
 	call PrintText
 	call YesNoBox
 	jp c, .loop
 
-	ld hl, UnknownText_0x667a ; <MON> did not learn <MOVE>.
+	ld hl, Text_DidNotLearn ; <MON> did not learn <MOVE>.
 	call PrintText
 	ld b, 0
 	ret
 
 .learned
-	ld hl, UnknownText_0x666b ; <MON> learned <MOVE>!
+	ld hl, Text_LearnedMove ; <MON> learned <MOVE>!
 	call PrintText
 	ld b, 1
 	ret
@@ -121,7 +121,7 @@
 
 ForgetMove: ; 65d3
 	push hl
-	ld hl, UnknownText_0x667f
+	ld hl, Text_TryingToLearn
 	call PrintText
 	call YesNoBox
 	pop hl
@@ -135,7 +135,7 @@
 	pop hl
 .loop
 	push hl
-	ld hl, UnknownText_0x6670
+	ld hl, Text_ForgetWhich
 	call PrintText
 	hlcoord 5, 2
 	ld b, NUM_MOVES * 2
@@ -192,7 +192,7 @@
 	ret
 
 .hmmove
-	ld hl, UnknownText_0x669a
+	ld hl, Text_CantForgetHM
 	call PrintText
 	pop hl
 	jr .loop
@@ -202,31 +202,31 @@
 	ret
 ; 666b
 
-UnknownText_0x666b: ; 666b
+Text_LearnedMove: ; 666b
 ; <MON> learned <MOVE>!
 	text_jump UnknownText_0x1c5660
 	db "@"
 ; 6670
 
-UnknownText_0x6670: ; 6670
+Text_ForgetWhich: ; 6670
 ; Which move should be forgotten?
 	text_jump UnknownText_0x1c5678
 	db "@"
 ; 6675
 
-UnknownText_0x6675: ; 6675
+Text_StopLearning: ; 6675
 ; Stop learning <MOVE>?
 	text_jump UnknownText_0x1c5699
 	db "@"
 ; 667a
 
-UnknownText_0x667a: ; 667a
+Text_DidNotLearn: ; 667a
 ; <MON> did not learn <MOVE>.
 	text_jump UnknownText_0x1c56af
 	db "@"
 ; 667f
 
-UnknownText_0x667f: ; 667f
+Text_TryingToLearn: ; 667f
 ; <MON> is trying to learn <MOVE>. But <MON> can't learn more than
 ; four moves. Delete an older move to make room for <MOVE>?
 	text_jump UnknownText_0x1c56c9
@@ -233,7 +233,7 @@
 	db "@"
 ; 6684
 
-UnknownText_0x6684: ; 6684
+Text_1_2_and_Poof: ; 6684
 	text_jump UnknownText_0x1c5740 ; 1, 2 and…
 	start_asm
 	push de
@@ -240,17 +240,16 @@
 	ld de, SFX_SWITCH_POKEMON
 	call PlaySFX
 	pop de
-	ld hl, UnknownText_0x6695
+	ld hl, .PoofForgot
 	ret
-; 6695
 
-UnknownText_0x6695: ; 6695
+.PoofForgot
 ; Poof! <MON> forgot <MOVE>. And…
 	text_jump UnknownText_0x1c574e
 	db "@"
 ; 669a
 
-UnknownText_0x669a: ; 669a
+Text_CantForgetHM: ; 669a
 ; HM moves can't be forgotten now.
 	text_jump UnknownText_0x1c5772
 	db "@"
--- a/engine/mail.asm
+++ b/engine/mail.asm
@@ -208,12 +208,12 @@
 	push bc
 	push af
 	ld hl, sPartyMail
-	ld bc, $2f
+	ld bc, MAIL_STRUCT_LENGTH
 	call AddNTimes
 	ld d, h
 	ld e, l
 	ld hl, wd002
-	ld bc, $21
+	ld bc, MAIL_MSG_LENGTH + 1
 	ld a, BANK(sPartyMail)
 	call GetSRAMBank
 	call CopyBytes
@@ -222,7 +222,7 @@
 	ld hl, PartyMonOT
 	ld bc, NAME_LENGTH
 	call AddNTimes
-	ld bc, $a
+	ld bc, NAME_LENGTH - 1
 	call CopyBytes
 	pop af
 	ld hl, PartyMon1ID
--- /dev/null
+++ b/engine/map_object_action.asm
@@ -1,0 +1,323 @@
+	ld hl, OBJECT_ACTION
+	add hl, bc
+	ld a, [hl]
+	ld l, a
+	ld h, 0
+	add hl, hl
+	add hl, hl
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	call _hl_
+	ret
+; 445f
+
+Pointers445f: ; 445f
+	dw SetFacingStanding, SetFacingStanding ; 00
+	dw Function44b5,      SetFacingCurrent ; 01 standing?
+	dw Function44c1,      SetFacingCurrent ; 02 walking?
+	dw Function4508,      SetFacingCurrent ; 03 bumping?
+	dw Function4529,      SetFacingCurrent ; 04
+	dw Function4539,      SetFacingStanding ; 05
+	dw Function456e,      Function456e ; 06
+	dw Function457b,      SetFacingStanding ; 07
+	dw Function4582,      Function4582 ; 08
+	dw Function4589,      Function4589 ; 09
+	dw Function4590,      Function45a4 ; 0a
+	dw Function45ab,      SetFacingCurrent ; 0c
+	dw Function45be,      Function45be ; 0b
+	dw Function45c5,      Function45c5 ; 0d
+	dw Function45da,      SetFacingStanding ; 0e
+	dw Function45ed,      SetFacingStanding ; 0f
+	dw Function44e4,      SetFacingCurrent ; 10
+; 44a3
+
+SetFacingStanding: ; 44a3
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], STANDING
+	ret
+; 44aa
+
+SetFacingCurrent: ; 44aa
+	call GetSpriteDirection
+	or 0 ; useless
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], a
+	ret
+; 44b5
+
+Function44b5: ; 44b5
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld a, [hl]
+	and 1
+	jr nz, Function44c1
+	jp SetFacingCurrent
+; 44c1
+
+Function44c1: ; 44c1
+	ld hl, OBJECT_FLAGS1
+	add hl, bc
+	bit SLIDING, [hl]
+	jp nz, SetFacingCurrent
+
+	ld hl, OBJECT_STEP_FRAME
+	add hl, bc
+	ld a, [hl]
+	inc a
+	and %00001111
+	ld [hl], a
+
+	rrca
+	rrca
+	and %00000011
+	ld d, a
+
+	call GetSpriteDirection
+	or 0 ; useless
+	or d
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], a
+	ret
+; 44e4
+
+Function44e4: ; 44e4
+	ld hl, OBJECT_FLAGS1
+	add hl, bc
+	bit SLIDING, [hl]
+	jp nz, SetFacingCurrent
+
+	ld hl, OBJECT_STEP_FRAME
+	add hl, bc
+	ld a, [hl]
+	add 2
+	and %00001111
+	ld [hl], a
+
+	rrca
+	rrca
+	and %00000011
+	ld d, a
+
+	call GetSpriteDirection
+	or 0 ; useless
+	or d
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], a
+	ret
+; 4508
+
+Function4508: ; 4508
+	ld hl, OBJECT_FLAGS1
+	add hl, bc
+	bit SLIDING, [hl]
+	jp nz, SetFacingCurrent
+
+	ld hl, OBJECT_STEP_FRAME
+	add hl, bc
+	inc [hl]
+
+	ld a, [hl]
+	rrca
+	rrca
+	rrca
+	and %00000011
+	ld d, a
+
+	call GetSpriteDirection
+	or 0 ; useless
+	or d
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], a
+	ret
+; 4529
+
+Function4529: ; 4529
+	call Function453f
+	ld hl, OBJECT_FACING
+	add hl, bc
+	ld a, [hl]
+	or 0 ; useless
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], a
+	ret
+; 4539
+
+Function4539: ; 4539
+	call Function453f
+	jp SetFacingStanding
+; 453f
+
+Function453f: ; 453f
+	ld hl, OBJECT_STEP_FRAME
+	add hl, bc
+	ld a, [hl]
+	and %11110000
+	ld e, a
+
+	ld a, [hl]
+	inc a
+	and %00001111
+	ld d, a
+	cp 4
+	jr c, .ok
+
+	ld d, 0
+	ld a, e
+	add $10
+	and %00110000
+	ld e, a
+
+.ok
+	ld a, d
+	or e
+	ld [hl], a
+
+	swap e
+	ld d, 0
+	ld hl, .Directions
+	add hl, de
+	ld a, [hl]
+	ld hl, OBJECT_FACING
+	add hl, bc
+	ld [hl], a
+	ret
+; 456a
+
+.Directions ; 456a
+	db OW_DOWN, OW_RIGHT, OW_UP, OW_LEFT
+; 456e
+
+Function456e: ; 456e
+	call GetSpriteDirection
+	rrca
+	rrca
+	add $10
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], a
+	ret
+; 457b
+
+Function457b: ; 457b
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], FACING_15
+	ret
+; 4582
+
+Function4582: ; 4582 emote
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], FACING_EMOTE
+	ret
+; 4589
+
+Function4589: ; 4589
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], FACING_17
+	ret
+; 4590
+
+Function4590: ; 4590
+	ld hl, OBJECT_STEP_FRAME
+	add hl, bc
+	ld a, [hl]
+	inc a
+	and %00001111
+	ld [hl], a
+	and %00001000
+	jr z, Function45a4
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], FACING_04
+	ret
+; 45a4
+
+Function45a4: ; 45a4
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], 0
+	ret
+; 45ab
+
+Function45ab: ; 45ab
+	ld hl, OBJECT_STEP_FRAME
+	add hl, bc
+	ld a, [hl]
+	inc a
+	ld [hl], a
+	and %00001100
+	rrca
+	rrca
+	add $18
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], a
+	ret
+; 45be
+
+Function45be: ; 45be
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], FACING_16
+	ret
+; 45c5
+
+Function45c5: ; 45c5
+	ld a, [VariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS]
+	ld d, FACING_17
+	cp SPRITE_BIG_SNORLAX
+	jr z, .ok
+	cp SPRITE_BIG_LAPRAS
+	jr z, .ok
+	ld d, FACING_16
+
+.ok
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	ld [hl], d
+	ret
+; 45da
+
+Function45da: ; 45da
+	ld hl, OBJECT_STEP_FRAME
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	and 2
+	ld a, FACING_1C
+	jr z, .ok
+	inc a ; FACING_1D
+.ok
+	ld [hl], a
+	ret
+; 45ed
+
+Function45ed: ; 45ed
+	ld hl, OBJECT_STEP_FRAME
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	ld hl, OBJECT_FACING_STEP
+	add hl, bc
+	and 4
+	ld a, FACING_1E
+	jr z, .ok
+	inc a ; FACING_1F
+
+.ok
+	ld [hl], a
+	ret
+; 4600
--- a/engine/map_objects.asm
+++ b/engine/map_objects.asm
@@ -2,53 +2,9 @@
 INCLUDE "engine/facings.asm"
 
 SpriteMovementData:: ; 4273
+INCLUDE "data/map_objects.asm"
 
-sprite_movement_data: macro
-	db \1, \2, \3, \4, \5
-	dn \6, 0
-	endm
-	; function,                                              facing, action,              flags1, flags2, palette flags
-	sprite_movement_data SPRITEMOVEFN_00,                    DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 00
-	sprite_movement_data SPRITEMOVEFN_STANDING,              DOWN,   PERSON_ACTION_STAND,    $0c,    $00,    %0000 ; 01
-	sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_XY,        DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 02
-	sprite_movement_data SPRITEMOVEFN_SLOW_RANDOM_SPIN,      DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 03
-	sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_Y,         DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 04
-	sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_X,         DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 05
-	sprite_movement_data SPRITEMOVEFN_STANDING,              DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 06
-	sprite_movement_data SPRITEMOVEFN_STANDING,              UP,     PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 07
-	sprite_movement_data SPRITEMOVEFN_STANDING,              LEFT,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 08
-	sprite_movement_data SPRITEMOVEFN_STANDING,              RIGHT,  PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 09
-	sprite_movement_data SPRITEMOVEFN_FAST_RANDOM_SPIN,      DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0a
-	sprite_movement_data SPRITEMOVEFN_OBEY_DPAD,             DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 0b
-	sprite_movement_data SPRITEMOVEFN_08,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0c
-	sprite_movement_data SPRITEMOVEFN_09,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0d
-	sprite_movement_data SPRITEMOVEFN_0A,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0e
-	sprite_movement_data SPRITEMOVEFN_0B,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 0f
-	sprite_movement_data SPRITEMOVEFN_0C,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 10
-	sprite_movement_data SPRITEMOVEFN_0D,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 11
-	sprite_movement_data SPRITEMOVEFN_0E,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 12
-	sprite_movement_data SPRITEMOVEFN_FOLLOW,                DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 13
-	sprite_movement_data SPRITEMOVEFN_SCRIPTED,              DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 14
-	sprite_movement_data SPRITEMOVEFN_BIG_SNORLAX,           DOWN,   PERSON_ACTION_09,    $2e,    $01,    %1100 ; 15
-	sprite_movement_data SPRITEMOVEFN_BOUNCE,                DOWN,   PERSON_ACTION_0A,    $2e,    $00,    %0000 ; 16
-	sprite_movement_data SPRITEMOVEFN_STANDING,              DOWN,   PERSON_ACTION_STAND,    $0c,    $00,    %0000 ; 17
-	sprite_movement_data SPRITEMOVEFN_STANDING,              DOWN,   PERSON_ACTION_STAND,    $2e,    $10,    %0000 ; 18
-	sprite_movement_data SPRITEMOVEFN_STRENGTH,              DOWN,   PERSON_ACTION_STAND,    $2e,    $00,    %0100 ; 19
-	sprite_movement_data SPRITEMOVEFN_FOLLOWNOTEXACT,        DOWN,   PERSON_ACTION_STAND,    $02,    $00,    %0000 ; 1a
-	sprite_movement_data SPRITEMOVEFN_SHADOW,                DOWN,   PERSON_ACTION_00,    $8e,    $01,    %0000 ; 1b
-	sprite_movement_data SPRITEMOVEFN_EMOTE,                 DOWN,   PERSON_ACTION_EMOTE,    $8e,    $02,    %0000 ; 1c
-	sprite_movement_data SPRITEMOVEFN_SCREENSHAKE,           DOWN,   PERSON_ACTION_00,    $82,    $00,    %0000 ; 1d
-	sprite_movement_data SPRITEMOVEFN_SPIN_COUNTERCLOCKWISE, LEFT,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 1e
-	sprite_movement_data SPRITEMOVEFN_SPIN_CLOCKWISE,        RIGHT,  PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 1f
-	sprite_movement_data SPRITEMOVEFN_STRENGTH,              DOWN,   PERSON_ACTION_0C,    $2e,    $01,    %1100 ; 20
-	sprite_movement_data SPRITEMOVEFN_STRENGTH,              DOWN,   PERSON_ACTION_0D,    $2e,    $01,    %1100 ; 21
-	sprite_movement_data SPRITEMOVEFN_BOULDERDUST,           DOWN,   PERSON_ACTION_0E,    $8e,    $01,    %0000 ; 22
-	sprite_movement_data SPRITEMOVEFN_GRASS,                 DOWN,   PERSON_ACTION_0F,    $8e,    $02,    %0000 ; 23
-	sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_XY,        DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0010 ; 24
-	sprite_movement_data SPRITEMOVEFN_00,                    DOWN,   PERSON_ACTION_STAND,    $00,    $00,    %0000 ; 25
 ; 4357
-
-
 DeleteMapObject:: ; 4357
 	push bc
 	ld hl, OBJECT_MAP_OBJECT_INDEX
@@ -69,7 +25,6 @@
 	ld hl, OBJECT_SPRITE
 	add hl, bc
 	ld [hl], -1
-
 .ok
 	pop bc
 	ret
@@ -78,12 +33,11 @@
 Function437b: ; 437b
 	call .CheckObjectStillVisible
 	ret c
-	call Function43f3
-	call Function4427
+	call .HandleStepType
+	call .HandleObjectAction
 	ret
-; 4386
 
-.CheckObjectStillVisible: ; 4386
+.CheckObjectStillVisible
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
 	res 6, [hl]
@@ -133,7 +87,6 @@
 	jr c, .ok2
 	cp MAPOBJECT_SCREEN_HEIGHT
 	jr nc, .ok2
-
 .yes
 	and a
 	ret
@@ -153,23 +106,20 @@
 	set 6, [hl]
 	and a
 	ret
-; 43f3
 
-Function43f3: ; 43f3
+.HandleStepType
 	ld hl, OBJECT_STEP_TYPE
 	add hl, bc
 	ld a, [hl]
 	and a
 	jr z, .zero
-
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
 	bit 5, [hl]
 	jr nz, .bit5
-
 	cp STEP_TYPE_SLEEP
 	jr z, .one
-	jr .ok
+	jr .ok3
 
 .zero
 	call ObjectMovementReset
@@ -177,10 +127,8 @@
 	add hl, bc
 	bit 5, [hl]
 	jr nz, .bit5
-
 .one
 	call MapObjectMovementPattern
-
 	ld hl, OBJECT_STEP_TYPE
 	add hl, bc
 	ld a, [hl]
@@ -188,8 +136,7 @@
 	ret z
 	cp STEP_TYPE_SLEEP
 	ret z
-
-.ok
+.ok3
 	ld hl, Pointers4b45
 	rst JumpTable
 	ret
@@ -196,24 +143,20 @@
 
 .bit5
 	ret
-; 4427
 
-Function4427: ; 4427
+.HandleObjectAction
 	ld hl, OBJECT_FLAGS1
 	add hl, bc
 	bit INVISIBLE, [hl]
 	jr nz, SetFacingStanding
-
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
 	bit 6, [hl]
 	jr nz, SetFacingStanding
-
 	bit 5, [hl]
-	jr nz, Function4448
-
-	ld de, Pointers445f
-	jr Function444d
+	jr nz, asm_4448
+	ld de, Pointers445f ; use first column
+	jr asm_444d
 ; 4440
 
 Function4440: ; 4440
@@ -221,339 +164,16 @@
 	add hl, bc
 	bit INVISIBLE, [hl]
 	jr nz, SetFacingStanding
-Function4448: ; 4448
+asm_4448 ; use second column
 	ld de, Pointers445f + 2
-	jr Function444d
+	jr asm_444d
 ; 444d
 
-Function444d: ; 444d
+asm_444d
 ; call [4 * ObjectStructs[ObjInd, OBJECT_ACTION] + de]
-	ld hl, OBJECT_ACTION
-	add hl, bc
-	ld a, [hl]
-	ld l, a
-	ld h, 0
-	add hl,hl
-	add hl,hl
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	call _hl_
-	ret
-; 445f
+INCLUDE "engine/map_object_action.asm"
 
-Pointers445f: ; 445f
-	dw SetFacingStanding, SetFacingStanding ; 00
-	dw Function44b5,      SetFacingCurrent ; 01 standing?
-	dw Function44c1,      SetFacingCurrent ; 02 walking?
-	dw Function4508,      SetFacingCurrent ; 03 bumping?
-	dw Function4529,      SetFacingCurrent ; 04
-	dw Function4539,      SetFacingStanding ; 05
-	dw Function456e,      Function456e ; 06
-	dw Function457b,      SetFacingStanding ; 07
-	dw Function4582,      Function4582 ; 08
-	dw Function4589,      Function4589 ; 09
-	dw Function4590,      Function45a4 ; 0a
-	dw Function45ab,      SetFacingCurrent ; 0c
-	dw Function45be,      Function45be ; 0b
-	dw Function45c5,      Function45c5 ; 0d
-	dw Function45da,      SetFacingStanding ; 0e
-	dw Function45ed,      SetFacingStanding ; 0f
-	dw Function44e4,      SetFacingCurrent ; 10
-; 44a3
-
-SetFacingStanding: ; 44a3
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], STANDING
-	ret
-; 44aa
-
-SetFacingCurrent: ; 44aa
-	call GetSpriteDirection
-	or 0 ; useless
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], a
-	ret
-; 44b5
-
-Function44b5: ; 44b5
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld a, [hl]
-	and 1
-	jr nz, Function44c1
-	jp SetFacingCurrent
-; 44c1
-
-Function44c1: ; 44c1
-	ld hl, OBJECT_FLAGS1
-	add hl, bc
-	bit SLIDING, [hl]
-	jp nz, SetFacingCurrent
-
-	ld hl, OBJECT_STEP_FRAME
-	add hl, bc
-	ld a, [hl]
-	inc a
-	and %00001111
-	ld [hl], a
-
-	rrca
-	rrca
-	and %00000011
-	ld d, a
-
-	call GetSpriteDirection
-	or 0 ; useless
-	or d
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], a
-	ret
-; 44e4
-
-Function44e4: ; 44e4
-	ld hl, OBJECT_FLAGS1
-	add hl, bc
-	bit SLIDING, [hl]
-	jp nz, SetFacingCurrent
-
-	ld hl, OBJECT_STEP_FRAME
-	add hl, bc
-	ld a, [hl]
-	add 2
-	and %00001111
-	ld [hl], a
-
-	rrca
-	rrca
-	and %00000011
-	ld d, a
-
-	call GetSpriteDirection
-	or 0 ; useless
-	or d
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], a
-	ret
-; 4508
-
-Function4508: ; 4508
-	ld hl, OBJECT_FLAGS1
-	add hl, bc
-	bit SLIDING, [hl]
-	jp nz, SetFacingCurrent
-
-	ld hl, OBJECT_STEP_FRAME
-	add hl, bc
-	inc [hl]
-
-	ld a, [hl]
-	rrca
-	rrca
-	rrca
-	and %00000011
-	ld d, a
-
-	call GetSpriteDirection
-	or 0 ; useless
-	or d
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], a
-	ret
-; 4529
-
-Function4529: ; 4529
-	call Function453f
-	ld hl, OBJECT_FACING
-	add hl, bc
-	ld a, [hl]
-	or 0 ; useless
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], a
-	ret
-; 4539
-
-Function4539: ; 4539
-	call Function453f
-	jp SetFacingStanding
-; 453f
-
-Function453f: ; 453f
-	ld hl, OBJECT_STEP_FRAME
-	add hl, bc
-	ld a, [hl]
-	and %11110000
-	ld e, a
-
-	ld a, [hl]
-	inc a
-	and %00001111
-	ld d, a
-	cp 4
-	jr c, .ok
-
-	ld d, 0
-	ld a, e
-	add $10
-	and %00110000
-	ld e, a
-
-.ok
-	ld a, d
-	or e
-	ld [hl], a
-
-	swap e
-	ld d, 0
-	ld hl, .Directions
-	add hl, de
-	ld a, [hl]
-	ld hl, OBJECT_FACING
-	add hl, bc
-	ld [hl], a
-	ret
-; 456a
-
-.Directions ; 456a
-	db OW_DOWN, OW_RIGHT, OW_UP, OW_LEFT
-; 456e
-
-Function456e: ; 456e
-	call GetSpriteDirection
-	rrca
-	rrca
-	add $10
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], a
-	ret
-; 457b
-
-Function457b: ; 457b
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], FACING_15
-	ret
-; 4582
-
-Function4582: ; 4582 emote
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], FACING_EMOTE
-	ret
-; 4589
-
-Function4589: ; 4589
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], FACING_17
-	ret
-; 4590
-
-Function4590: ; 4590
-	ld hl, OBJECT_STEP_FRAME
-	add hl, bc
-	ld a, [hl]
-	inc a
-	and %00001111
-	ld [hl], a
-	and %00001000
-	jr z, Function45a4
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], FACING_04
-	ret
-; 45a4
-
-Function45a4: ; 45a4
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], 0
-	ret
-; 45ab
-
-Function45ab: ; 45ab
-	ld hl, OBJECT_STEP_FRAME
-	add hl, bc
-	ld a, [hl]
-	inc a
-	ld [hl], a
-	and %00001100
-	rrca
-	rrca
-	add $18
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], a
-	ret
-; 45be
-
-Function45be: ; 45be
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], FACING_16
-	ret
-; 45c5
-
-Function45c5: ; 45c5
-	ld a, [VariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS]
-	ld d, FACING_17
-	cp SPRITE_BIG_SNORLAX
-	jr z, .ok
-	cp SPRITE_BIG_LAPRAS
-	jr z, .ok
-	ld d, FACING_16
-
-.ok
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	ld [hl], d
-	ret
-; 45da
-
-Function45da: ; 45da
-	ld hl, OBJECT_STEP_FRAME
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	and 2
-	ld a, FACING_1C
-	jr z, .ok
-	inc a ; FACING_1D
-.ok
-	ld [hl], a
-	ret
-; 45ed
-
-Function45ed: ; 45ed
-	ld hl, OBJECT_STEP_FRAME
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	ld hl, OBJECT_FACING_STEP
-	add hl, bc
-	and 4
-	ld a, FACING_1E
-	jr z, .ok
-	inc a ; FACING_1F
-
-.ok
-	ld [hl], a
-	ret
-; 4600
-
 CopyNextCoordsTileToStandingCoordsTile: ; 4600
-
 	ld hl, OBJECT_NEXT_MAP_X
 	add hl, bc
 	ld a, [hl]
@@ -560,7 +180,6 @@
 	ld hl, OBJECT_MAP_X
 	add hl, bc
 	ld [hl], a
-
 	ld hl, OBJECT_NEXT_MAP_Y
 	add hl, bc
 	ld a, [hl]
@@ -567,7 +186,6 @@
 	ld hl, OBJECT_MAP_Y
 	add hl, bc
 	ld [hl], a
-
 	ld hl, OBJECT_NEXT_TILE
 	add hl, bc
 	ld a, [hl]
@@ -574,18 +192,15 @@
 	ld hl, OBJECT_STANDING_TILE
 	add hl, bc
 	ld [hl], a
-
 	call SetTallGrassFlags
 	ld hl, OBJECT_NEXT_TILE
 	add hl, bc
 	ld a, [hl]
-
 	call UselessAndA
 	ret
 ; 462a
 
 Function462a: ; 462a
-
 	ld hl, OBJECT_MAP_X
 	add hl, bc
 	ld a, [hl]
@@ -592,7 +207,6 @@
 	ld hl, OBJECT_NEXT_MAP_X
 	add hl, bc
 	ld [hl], a
-
 	ld hl, OBJECT_MAP_Y
 	add hl, bc
 	ld a, [hl]
@@ -599,7 +213,6 @@
 	ld hl, OBJECT_NEXT_MAP_Y
 	add hl, bc
 	ld [hl], a
-
 	ret
 ; 463f
 
@@ -612,7 +225,6 @@
 	add hl, bc
 	ld a, [hl]
 	call SetTallGrassFlags
-
 .ok
 	ld hl, OBJECT_NEXT_TILE
 	add hl, bc
@@ -631,7 +243,6 @@
 	jr z, .set
 	call CheckGrassTile
 	jr c, .reset
-
 .set
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
@@ -683,11 +294,9 @@
 	ld [hl], a
 GetNextTile: ; 46a6
 	call GetStepVector
-
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	ld [hl], a
-
 	ld a, d
 	call GetStepVectorSign
 	ld hl, OBJECT_MAP_X
@@ -697,7 +306,6 @@
 	add hl, bc
 	ld [hl], a
 	ld d, a
-
 	ld a, e
 	call GetStepVectorSign
 	ld hl, OBJECT_MAP_Y
@@ -707,34 +315,27 @@
 	add hl, bc
 	ld [hl], a
 	ld e, a
-
 	push bc
 	call GetCoordTile
 	pop bc
-
 	ld hl, OBJECT_NEXT_TILE
 	add hl, bc
 	ld [hl], a
-
 	ret
 ; 46d7
 
 AddStepVector: ; 46d7
-
 	call GetStepVector
-
 	ld hl, OBJECT_SPRITE_X
 	add hl, bc
 	ld a, [hl]
 	add d
 	ld [hl], a
-
 	ld hl, OBJECT_SPRITE_Y
 	add hl, bc
 	ld a, [hl]
 	add e
 	ld [hl], a
-
 	ret
 ; 46e9
 
@@ -777,18 +378,14 @@
 	db -4,  0,  4, 4
 	db  4,  0,  4, 4
 ; 4730
-
 GetStepVectorSign: ; 4730
 	add a
 	ret z  ; 0 or 128
-
 	ld a, 1
 	ret nc ; 1 - 127
-
 	ld a, -1
 	ret    ; 129 - 255
 ; 4738
-
 UpdatePlayerStep: ; 4738
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
@@ -808,6 +405,7 @@
 ; 4759
 
 Function4759: ; 4759
+; unreferenced
 	push bc
 	ld e, a
 	ld d, 0
@@ -836,7 +434,7 @@
 	ret
 
 .ok
-	ld a, 6
+	ld a, SPRITEMOVEFN_STANDING
 	ret
 ; 4780
 
@@ -885,7 +483,6 @@
 ; 47a8
 
 Object28AnonymousJumptable: ; 47a8
-; anonymous dw
 	ld hl, OBJECT_28
 	add hl, bc
 	ld a, [hl]
@@ -936,10 +533,8 @@
 	ld hl, .Pointers
 	rst JumpTable
 	ret
-; 47e9
 
 .Pointers ; 47e9
-	
 	dw .Null_00 ; 00
 	dw .RandomWalkY ; 01
 	dw .RandomWalkX ; 02
@@ -968,35 +563,30 @@
 	dw .MovementSpinCounterclockwise ; 19
 	dw .MovementBoulderDust ; 1a
 	dw .MovementShakingGrass ; 1b
-; 4821
 
-.Null_00: ; 4821
+.Null_00
 	ret
-; 4822
 
-.RandomWalkY: ; 4822
+.RandomWalkY
 	call Random
 	ld a, [hRandomAdd]
 	and %00000001
 	jp .RandomWalkContinue
-; 482c
 
-.RandomWalkX: ; 482c
+.RandomWalkX
 	call Random
 	ld a, [hRandomAdd]
 	and %00000001
 	or  %00000010
 	jp .RandomWalkContinue
-; 4838
 
-.RandomWalkXY: ; 4838
+.RandomWalkXY
 	call Random
 	ld a, [hRandomAdd]
 	and %00000011
 	jp .RandomWalkContinue
-; 4842
 
-.RandomSpin1: ; 4842
+.RandomSpin1
 	call Random
 	ld a, [hRandomAdd]
 	and %00001100
@@ -1004,9 +594,8 @@
 	add hl, bc
 	ld [hl], a
 	jp RandomStepDuration_Slow
-; 4851
 
-.RandomSpin2: ; 4851
+.RandomSpin2
 	ld hl, OBJECT_FACING
 	add hl, bc
 	ld a, [hl]
@@ -1018,13 +607,11 @@
 	cp d
 	jr nz, .keep
 	xor %00001100
-
 .keep
 	ld [hl], a
 	jp RandomStepDuration_Fast
-; 4869
 
-.Standing: ; 4869
+.Standing
 	call Function462a
 	call EndSpriteMovement
 	ld hl, OBJECT_ACTION
@@ -1034,73 +621,59 @@
 	add hl, bc
 	ld [hl], STEP_TYPE_05
 	ret
-; 487c
 
-.ObeyDPad: ; 487c
+.ObeyDPad
 	ld hl, Function5000
 	jp HandleMovementData
-; 4882
 
-.Movement08: ; 4882
+.Movement08
 	ld hl, Function5015
 	jp HandleMovementData
-; 4888
 
-.Movement09: ; 4888
+.Movement09
 	ld hl, Function5026
 	jp HandleMovementData
-; 488e
 
-.Movement0a: ; 488e
-	jp Function5037
-; 4891
+.Movement0a
+	jp _GetMovementPerson
 
-.Movement0b: ; 4891
-	jp Function5037
-; 4894
+.Movement0b
+	jp _GetMovementPerson
 
-.Movement0c: ; 4894
-	jp Function5037
-; 4897
+.Movement0c
+	jp _GetMovementPerson
 
-.Movement0d: ; 4897
+.Movement0d
 	ld hl, Function5000
 	jp HandleMovementData
-; 489d
 
-.Movement0e: ; 489d
-	jp Function5037
-; 48a0
+.Movement0e
+	jp _GetMovementPerson
 
-.Follow: ; 48a0
-	ld hl, Function54e6
+.Follow
+	ld hl, GetFollowerNextMovementByte
 	jp HandleMovementData
-; 48a6
 
-.Script: ; 48a6
-	ld hl, Function500e
+.Script
+	ld hl, GetMovementByte
 	jp HandleMovementData
-; 48ac
 
-.Strength: ; 48ac
+.Strength
 	call MovementAnonymousJumptable
 	dw .Strength_Start
 	dw .Strength_Stop
-; 48b3
 
-.Strength_Start: ; 48b3
+.Strength_Start
 	ld hl, OBJECT_NEXT_TILE
 	add hl, bc
 	ld a, [hl]
 	call CheckPitTile
 	jr z, .on_pit
-
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
 	bit 2, [hl]
 	res 2, [hl]
 	jr z, .ok
-
 	ld hl, OBJECT_RANGE
 	add hl, bc
 	ld a, [hl]
@@ -1109,7 +682,6 @@
 	call InitStep
 	call Function6ec1
 	jr c, .ok2
-
 	ld de, SFX_STRENGTH
 	call PlaySFX
 	call SpawnStrengthBoulderDust
@@ -1121,7 +693,6 @@
 
 .ok2
 	call Function462a
-
 .ok
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
@@ -1130,27 +701,22 @@
 
 .on_pit
 	call IncrementObjectMovementByteIndex
-
-.Strength_Stop: ; 48f8
+.Strength_Stop
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
 	ld [hl], STANDING
 	ret
-; 48ff
 
-.FollowNotExact: ; 48ff
+.FollowNotExact
 	ld hl, OBJECT_NEXT_MAP_X
 	add hl, bc
 	ld d, [hl]
-
 	ld hl, OBJECT_NEXT_MAP_Y
 	add hl, bc
 	ld e, [hl]
-
 	ld hl, OBJECT_RANGE
 	add hl, bc
 	ld a, [hl]
-
 	push bc
 	call GetObjectStruct
 	ld hl, OBJECT_DIRECTION_WALKING
@@ -1158,7 +724,6 @@
 	ld a, [hl]
 	cp STANDING
 	jr z, .standing
-
 	ld hl, OBJECT_MAP_X
 	add hl, bc
 	ld a, [hl]
@@ -1184,7 +749,6 @@
 
 .less2
 	ld a, 1
-
 .done
 	ld d, a
 	ld hl, OBJECT_DIRECTION_WALKING
@@ -1204,9 +768,8 @@
 	add hl, bc
 	ld [hl], PERSON_ACTION_STAND
 	ret
-; 4958
 
-.MovementBigStanding: ; 4958
+.MovementBigStanding
 	call EndSpriteMovement
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
@@ -1218,9 +781,8 @@
 	add hl, bc
 	ld [hl], STEP_TYPE_04
 	ret
-; 496e
 
-.MovementBouncing: ; 496e
+.MovementBouncing
 	call EndSpriteMovement
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
@@ -1232,26 +794,23 @@
 	add hl, bc
 	ld [hl], STEP_TYPE_04
 	ret
-; 4984
 
-.MovementSpinCounterclockwise: ; 4984
+.MovementSpinCounterclockwise
 	call MovementAnonymousJumptable
 	dw .MovementSpinInit
 	dw .MovementSpinRepeat
 	dw .MovementSpinTurnLeft
-; 498d
 
-.MovementSpinClockwise: ; 498d
+.MovementSpinClockwise
 	call MovementAnonymousJumptable
 	dw .MovementSpinInit
 	dw .MovementSpinRepeat
 	dw .MovementSpinTurnRight
-; 4996
 
-.MovementSpinInit: ; 4996
+.MovementSpinInit
 	call EndSpriteMovement
 	call IncrementObjectMovementByteIndex
-.MovementSpinRepeat: ; 499c
+.MovementSpinRepeat
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_STAND
@@ -1267,29 +826,24 @@
 	ld [hl], STEP_TYPE_03
 	call IncrementObjectMovementByteIndex
 	ret
-; 49b8
 
-.MovementSpinTurnLeft: ; 49b8
+.MovementSpinTurnLeft
 	ld de, .DirectionData_Counterclockwise
 	call .MovementSpinNextFacing
 	jr .MovementSpinCounterclockwise
-; 49c0
 
 .DirectionData_Counterclockwise ; 49c0
 	db OW_RIGHT, OW_LEFT, OW_DOWN, OW_UP
-; 49c4
 
-.MovementSpinTurnRight: ; 49c4
+.MovementSpinTurnRight
 	ld de, .DirectionData_Clockwise
 	call .MovementSpinNextFacing
 	jr .MovementSpinClockwise
-; 49cc
 
 .DirectionData_Clockwise ; 49cc
 	db OW_LEFT, OW_RIGHT, OW_UP, OW_DOWN
-; 49d0
 
-.MovementSpinNextFacing: ; 49d0
+.MovementSpinNextFacing
 	ld hl, OBJECT_FACING
 	add hl, bc
 	ld a, [hl]
@@ -1305,9 +859,8 @@
 	ld [hl], a
 	call DecrementObjectMovementByteIndex
 	ret
-; 49e5
 
-.MovementShadow: ; 49e5
+.MovementShadow
 	call ._MovementShadow_Grass_Emote_BoulderDust
 	ld hl, OBJECT_ACTION
 	add hl, bc
@@ -1331,7 +884,6 @@
 	cp UP
 	jr z, .ok_13
 	ld d, 1 * 8 + 4
-
 .ok_13
 	ld hl, OBJECT_SPRITE_Y_OFFSET
 	add hl, bc
@@ -1343,9 +895,8 @@
 	add hl, bc
 	ld [hl], STEP_TYPE_TRACKING_OBJECT
 	ret
-; 4a21
 
-.MovementEmote: ; 4a21
+.MovementEmote
 	call EndSpriteMovement
 	call ._MovementShadow_Grass_Emote_BoulderDust
 	ld hl, OBJECT_ACTION
@@ -1364,9 +915,8 @@
 	add hl, bc
 	ld [hl], STEP_TYPE_TRACKING_OBJECT
 	ret
-; 4a46
 
-.MovementBoulderDust: ; 4a46
+.MovementBoulderDust
 	call EndSpriteMovement
 	call ._MovementShadow_Grass_Emote_BoulderDust
 	ld hl, OBJECT_ACTION
@@ -1387,8 +937,8 @@
 	ld e, a
 	ld d, 0
 	ld hl, .data_4a81
-	add hl,de
-	add hl,de
+	add hl, de
+	add hl, de
 	ld d, [hl]
 	inc hl
 	ld e, [hl]
@@ -1402,7 +952,6 @@
 	add hl, bc
 	ld [hl], STEP_TYPE_TRACKING_OBJECT
 	ret
-; 4a81
 
 .data_4a81  ; 4a81
 	;   x,  y
@@ -1410,9 +959,8 @@
 	db  0,  8
 	db  6,  2
 	db -6,  2
-; 4a89
 
-.MovementShakingGrass: ; 4a89
+.MovementShakingGrass
 	call EndSpriteMovement
 	call ._MovementShadow_Grass_Emote_BoulderDust
 	ld hl, OBJECT_ACTION
@@ -1429,9 +977,8 @@
 	add hl, bc
 	ld [hl], STEP_TYPE_TRACKING_OBJECT
 	ret
-; 4aa8
 
-._MovementShadow_Grass_Emote_BoulderDust: ; 4aa8
+._MovementShadow_Grass_Emote_BoulderDust
 	ld hl, OBJECT_RANGE
 	add hl, bc
 	ld a, [hl]
@@ -1446,9 +993,8 @@
 	inc hl
 	ld [hl], d
 	ret
-; 4abc
 
-.MovementScreenShake: ; 4abc
+.MovementScreenShake
 	call EndSpriteMovement
 	ld hl, OBJECT_ACTION
 	add hl, bc
@@ -1467,9 +1013,8 @@
 	add hl, bc
 	ld [hl], STEP_TYPE_15
 	ret
-; 4ade
 
-._MovementScreenShake: ; 4ade
+._MovementScreenShake
 	ld d, a
 	and %00111111
 	ld e, a
@@ -1485,23 +1030,19 @@
 	ret z
 	add a
 	jr .loop
-; 4af0
 
-.RandomWalkContinue: ; 4af0
+.RandomWalkContinue
 	call InitStep
 	call Function6ec1 ; check whether the object can move in that direction
 	jr c, .NewDuration
-
 	call UpdateTallGrassFlags
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_STEP
-
 	ld hl, wCenteredObject
 	ld a, [hMapObjectIndexBuffer]
 	cp [hl]
 	jr z, .load_6
-
 	ld hl, OBJECT_STEP_TYPE
 	add hl, bc
 	ld [hl], STEP_TYPE_07
@@ -1513,7 +1054,7 @@
 	ld [hl], STEP_TYPE_PLAYER_WALK
 	ret
 
-.NewDuration: ; 4b17
+.NewDuration
 	call EndSpriteMovement
 	call Function462a
 RandomStepDuration_Slow: ; 4b1d
@@ -1545,36 +1086,35 @@
 
 Pointers4b45: ; 4b45
 ; These pointers use OBJECT_STEP_TYPE.  See constants/sprite_constants.asm
-	
 	dw ObjectMovementReset ; 00
-	dw MapObjectMovementPattern ; 01
+	dw MapObjectMovementPattern ; unused
 	dw NPCStep ; 02 npc walk
-	dw Function4ddd ; 03
-	dw Function4e21 ; 04
-	dw Function4e0c ; 05
+	dw StepType03 ; 03
+	dw StepType04 ; 04
+	dw StepType05 ; 05
 	dw PlayerStep ; 06 player walk
-	dw Function4e47 ; 07
+	dw StepType07 ; 07
 	dw NPCJump ; 08 npc jump step
 	dw PlayerJump ; 09 player jump step
-	dw PlayerOrNPCHalfStep ; 0a half step
-	dw Function4dff ; 0b
+	dw PlayerOrNPCTurnStep ; 0a half step
+	dw StepTypeBump ; 0b
 	dw TeleportFrom ; 0c teleport from
 	dw TeleportTo ; 0d teleport to
 	dw Skyfall ; 0e skyfall
-	dw Function4ecd ; 0f
+	dw StepType0f ; 0f
 	dw GotBiteStep ; 10
 	dw RockSmashStep ; 11
 	dw ReturnDigStep ; 12
-	dw Function4f04 ; 13
-	dw Function4f33 ; 14
-	dw Function4f33 ; 15
-	dw Function4f77 ; 16
-	dw Function4f7a ; 17
-	dw Function4df0 ; 18
+	dw StepTypeTrackingObject ; 13
+	dw StepType14 ; 14
+	dw StepType15 ; 15
+	dw StepType16 ; 16
+	dw StepType17 ; 17
+	dw StepType18 ; 18
 	dw SkyfallTop ; 19
 ; 4b79
 
-Function4b79: ; 4b79
+WaitStep_InPlace: ; 4b79
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	dec [hl]
@@ -1588,11 +1128,10 @@
 NPCJump: ; 4b86
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw Function4b8d
-	dw Function4ba9
-; 4b8d
+	dw .Jump
+	dw .Land
 
-Function4b8d: ; 4b8d
+.Jump
 	call AddStepVector
 	call UpdateJumpPosition
 	ld hl, OBJECT_STEP_DURATION
@@ -1606,9 +1145,8 @@
 	res 3, [hl]
 	call IncrementObjectStructField28
 	ret
-; 4ba9
 
-Function4ba9: ; 4ba9
+.Land
 	call AddStepVector
 	call UpdateJumpPosition
 	ld hl, OBJECT_STEP_DURATION
@@ -1629,13 +1167,12 @@
 	dw .stepjump
 	dw .initland
 	dw .stepland
-; 4bca
 
-.initjump: ; 4bca
+.initjump
 	ld hl, wPlayerStepFlags
 	set 7, [hl]
 	call IncrementObjectStructField28
-.stepjump: ; 4bd2
+.stepjump
 	call UpdateJumpPosition
 	call UpdatePlayerStep
 	ld hl, OBJECT_STEP_DURATION
@@ -1651,14 +1188,13 @@
 	set 4, [hl]
 	call IncrementObjectStructField28
 	ret
-; 4bf2
 
-.initland: ; 4bf2
+.initland
 	call GetNextTile
 	ld hl, wPlayerStepFlags
 	set 7, [hl]
 	call IncrementObjectStructField28
-.stepland: ; 4bfd
+.stepland
 	call UpdateJumpPosition
 	call UpdatePlayerStep
 	ld hl, OBJECT_STEP_DURATION
@@ -1677,21 +1213,21 @@
 TeleportFrom: ; 4c18
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw Function4c23
-	dw Function4c32
-	dw Function4c42
-	dw Function4c5d
+	dw .InitSpin
+	dw .DoSpin
+	dw .InitSpinRise
+	dw .DoSpinRise
 ; 4c23
 
-Function4c23: ; 4c23
+.InitSpin
 	ld hl, OBJECT_STEP_FRAME
 	add hl, bc
 	ld [hl], 0
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 16
 	call IncrementObjectStructField28
-Function4c32: ; 4c32
+.DoSpin
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_SPIN
@@ -1701,9 +1237,8 @@
 	ret nz
 	call IncrementObjectStructField28
 	ret
-; 4c42
 
-Function4c42: ; 4c42
+.InitSpinRise
 	ld hl, OBJECT_STEP_FRAME
 	add hl, bc
 	ld [hl], 0
@@ -1712,12 +1247,12 @@
 	ld [hl], $10
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 16
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
 	res 3, [hl]
 	call IncrementObjectStructField28
-Function4c5d: ; 4c5d
+.DoSpinRise
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_SPIN
@@ -1748,33 +1283,33 @@
 TeleportTo: ; 4c89
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw Function4c9a
-	dw Function4caa
-	dw Function4cb3
-	dw Function4cc9
-	dw Function4ceb
-	dw Function4cf5
-	dw Function4d01
+	dw .InitWait
+	dw .DoWait
+	dw .InitDescent
+	dw .DoDescent
+	dw .InitFinalSpin
+	dw .DoFinalSpin
+	dw .FinishStep
 ; 4c9a
 
-Function4c9a: ; 4c9a
+.InitWait
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_00
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 16
 	call IncrementObjectStructField28
 	ret
 ; 4caa
 
-Function4caa: ; 4caa
+.DoWait
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	dec [hl]
 	ret nz
 	call IncrementObjectStructField28
-Function4cb3: ; 4cb3
+.InitDescent
 	ld hl, OBJECT_STEP_FRAME
 	add hl, bc
 	ld [hl], 0
@@ -1783,12 +1318,12 @@
 	ld [hl], 0
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 16
 	call IncrementObjectStructField28
 	ret
 ; 4cc9
 
-Function4cc9: ; 4cc9
+.DoDescent
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_SPIN
@@ -1808,15 +1343,15 @@
 	dec [hl]
 	ret nz
 	call IncrementObjectStructField28
-Function4ceb: ; 4ceb
+.InitFinalSpin
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 16
 	call IncrementObjectStructField28
 	ret
 ; 4cf5
 
-Function4cf5: ; 4cf5
+.DoFinalSpin
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_SPIN
@@ -1824,7 +1359,7 @@
 	add hl, bc
 	dec [hl]
 	ret nz
-Function4d01: ; 4d01
+.FinishStep
 	ld hl, OBJECT_STEP_FRAME
 	add hl, bc
 	ld [hl], 0
@@ -1840,21 +1375,21 @@
 Skyfall: ; 4d14
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw Function4d1f
-	dw Function4d2e
-	dw Function4d4f
-	dw Function4d6b
+	dw .Init
+	dw .Step
+	dw .Fall
+	dw .Finish
 ; 4d1f
 
-Function4d1f: ; 4d1f
+.Init
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_00
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 16
 	call IncrementObjectStructField28
-Function4d2e: ; 4d2e
+.Step
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	dec [hl]
@@ -1870,9 +1405,9 @@
 	ld [hl], 0
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 16
 	call IncrementObjectStructField28
-Function4d4f: ; 4d4f
+.Fall
 	ld hl, OBJECT_31
 	add hl, bc
 	inc [hl]
@@ -1889,7 +1424,7 @@
 	dec [hl]
 	ret nz
 	call IncrementObjectStructField28
-Function4d6b: ; 4d6b
+.Finish
 	ld hl, OBJECT_STEP_FRAME
 	add hl, bc
 	ld [hl], 0
@@ -1905,11 +1440,11 @@
 GotBiteStep: ; 4d7e
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw Function4d85
-	dw Function4d94
+	dw .Init
+	dw .Run
 ; 4d85
 
-Function4d85: ; 4d85
+.Init
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	ld [hl], 8
@@ -1917,7 +1452,7 @@
 	add hl, bc
 	ld [hl], 0
 	call IncrementObjectStructField28
-Function4d94: ; 4d94
+.Run
 	ld hl, OBJECT_SPRITE_Y_OFFSET
 	add hl, bc
 	ld a, [hl]
@@ -1937,11 +1472,11 @@
 ; 4daf
 
 RockSmashStep: ; 4daf
-	call Function4db5
-	jp Function4b79
+	call .Step
+	jp WaitStep_InPlace
 ; 4db5
 
-Function4db5: ; 4db5
+.Step
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	ld a, [hl]
@@ -1949,7 +1484,6 @@
 	ld a, PERSON_ACTION_STAND
 	jr z, .yes
 	ld a, PERSON_ACTION_00
-
 .yes
 	ld hl, OBJECT_ACTION
 	add hl, bc
@@ -1965,15 +1499,14 @@
 	ld a, PERSON_ACTION_SPIN
 	jr z, .yes
 	ld a, PERSON_ACTION_SPIN_FLICKER
-
 .yes
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], a
-	jp Function4b79
+	jp WaitStep_InPlace
 ; 4ddd
 
-Function4ddd: ; 4ddd
+StepType03: ; 4ddd
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
 	ld [hl], STANDING
@@ -1987,7 +1520,7 @@
 	ret
 ; 4df0
 
-Function4df0: ; 4df0
+StepType18: ; 4df0
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
 	ld [hl], STANDING
@@ -1998,7 +1531,7 @@
 	jp DeleteMapObject
 ; 4dff
 
-Function4dff: ; 4dff
+StepTypeBump: ; 4dff
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	dec [hl]
@@ -2009,14 +1542,13 @@
 	ret
 ; 4e0c
 
-Function4e0c: ; 4e0c
+StepType05: ; 4e0c
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw Function4e13
-	dw Function4e21
-; 4e13
+	dw .Reset
+	dw StepType04
 
-Function4e13: ; 4e13
+.Reset
 	call RestoreDefaultMovement
 	call GetInitialFacing
 	ld hl, OBJECT_FACING
@@ -2023,7 +1555,7 @@
 	add hl, bc
 	ld [hl], a
 	call IncrementObjectStructField28
-Function4e21: ; 4e21
+StepType04: ; 4e21
 	call MobileFn_4fb2
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
@@ -2048,7 +1580,7 @@
 	ret
 ; 4e47
 
-Function4e47: ; 4e47
+StepType07: ; 4e47
 	call AddStepVector
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
@@ -2064,19 +1596,17 @@
 ; anonymous dw
 	dw .init
 	dw .step
-; 4e5d
 
-.init: ; 4e5d
+.init
 	ld hl, wPlayerStepFlags
 	set 7, [hl]
 	call IncrementObjectStructField28
-.step: ; 4e65
+.step
 	call UpdatePlayerStep
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	dec [hl]
 	ret nz
-
 	ld hl, wPlayerStepFlags
 	set 6, [hl]
 	call CopyNextCoordsTileToStandingCoordsTile
@@ -2089,7 +1619,7 @@
 	ret
 ; 4e83
 
-PlayerOrNPCHalfStep: ; 4e83
+PlayerOrNPCTurnStep: ; 4e83
 	call Object28AnonymousJumptable
 ; anonymous dw
 	dw .init1
@@ -2096,9 +1626,8 @@
 	dw .step1
 	dw .init2
 	dw .step2
-; 4e8e
 
-.init1: ; 4e8e
+.init1
 	ld hl, OBJECT_DIRECTION_WALKING
 	add hl, bc
 	ld [hl], STANDING
@@ -2110,13 +1639,13 @@
 	add hl, bc
 	ld [hl], 2
 	call IncrementObjectStructField28
-.step1: ; 4ea4
+.step1
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	dec [hl]
 	ret nz
 	call IncrementObjectStructField28
-.init2: ; 4ead
+.init2
 	ld hl, OBJECT_29 ; new facing
 	add hl, bc
 	ld a, [hl]
@@ -2127,7 +1656,7 @@
 	add hl, bc
 	ld [hl], 2
 	call IncrementObjectStructField28
-.step2: ; 4ec0
+.step2
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	dec [hl]
@@ -2138,7 +1667,7 @@
 	ret
 ; 4ecd
 
-Function4ecd: ; 4ecd
+StepType0f: ; 4ecd
 	call AddStepVector
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
@@ -2170,7 +1699,7 @@
 	ret
 ; 4f04
 
-Function4f04: ; 4f04
+StepTypeTrackingObject: ; 4f04
 	ld hl, OBJECT_29
 	add hl, bc
 	ld e, [hl]
@@ -2200,25 +1729,24 @@
 	ret z
 	dec [hl]
 	ret nz
-
 .nope
 	jp DeleteMapObject
 ; 4f33
 
-Function4f33: ; 4f33
+StepType14: ; 4f33
+StepType15: ; 4f33
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw Function4f3a
-	dw Function4f43
-; 4f3a
+	dw .Init
+	dw .Run
 
-Function4f3a: ; 4f3a
+.Init
 	xor a
 	ld hl, OBJECT_29
 	add hl, bc
 	ld [hl], a
 	call IncrementObjectStructField28
-Function4f43: ; 4f43
+.Run
 	ld hl, OBJECT_29
 	add hl, bc
 	ld d, [hl]
@@ -2230,7 +1758,7 @@
 	dec [hl]
 	jr z, .ok
 	ld a, [hl]
-	call Function4f6c
+	call .GetSign
 	ld hl, OBJECT_29
 	add hl, bc
 	ld [hl], a
@@ -2243,9 +1771,8 @@
 .ok
 	call DeleteMapObject
 	ret
-; 4f6c
 
-Function4f6c: ; 4f6c
+.GetSign
 	ld hl, OBJECT_30
 	add hl, bc
 	and 1
@@ -2256,26 +1783,25 @@
 	ret
 ; 4f77
 
-Function4f77: ; 4f77
+StepType16: ; 4f77
 	call Object28AnonymousJumptable ; ????
 ; 4f7a
-
-Function4f7a: ; 4f7a
+StepType17: ; 4f7a
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw SkyfallTop
-	dw SkyfallTop
-	dw SkyfallTop
+	dw .null
+	dw .null
+	dw .null
+.null
 ; 4f83
 
 SkyfallTop: ; 4f83
 	call Object28AnonymousJumptable
 ; anonymous dw
-	dw Function4f8a
-	dw Function4f99
-; 4f8a
+	dw .Init
+	dw .Run
 
-Function4f8a: ; 4f8a
+.Init
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_10
@@ -2283,9 +1809,8 @@
 	add hl, bc
 	ld [hl], 16
 	call IncrementObjectStructField28
-; 4f99
 
-Function4f99: ; 4f99
+.Run:
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	dec [hl]
@@ -2319,12 +1844,10 @@
 	add hl, bc
 	ld [hl], a
 	ret
-; 4fcd
 
 .y ; 4fcd
 	db 0, -1, -2, -3, -4, -3, -2, -1
 ; 4fd5
-
 UpdateJumpPosition: ; 4fd5
 	call GetStepVector
 	ld a, h
@@ -2343,29 +1866,27 @@
 	add hl, bc
 	ld [hl], a
 	ret
-; 4ff0
 
 .y ; 4ff0
 	db  -4,  -6,  -8, -10, -11, -12, -12, -12
 	db -11, -10,  -9,  -8,  -6,  -4,   0,   0
 ; 5000
-
 Function5000: ; unscripted?
-; copy [wc2de] to [wc2df]
-	ld a, [wc2de]
-	ld hl, wc2df
+; copy [wPlayerNextMovement] to [wPlayerMovement]
+	ld a, [wPlayerNextMovement]
+	ld hl, wPlayerMovement
 	ld [hl], a
-; load [wc2de] with movement_step_sleep_1
+; load [wPlayerNextMovement] with movement_step_sleep_1
 	ld a, movement_step_sleep_1
-	ld [wc2de], a
-; recover the previous value of [wc2de]
+	ld [wPlayerNextMovement], a
+; recover the previous value of [wPlayerNextMovement]
 	ld a, [hl]
 	ret
 ; 500e
 
-Function500e: ; scripted
+GetMovementByte:
 	ld hl, wMovementDataPointer
-	call Function1aae
+	call _GetMovementByte
 	ret
 ; 5015
 
@@ -2375,7 +1896,7 @@
 	ld e, [hl]
 	inc [hl]
 	ld d, 0
-	ld hl, wMovementPerson
+	ld hl, wc2e2
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
@@ -2399,7 +1920,7 @@
 	ret
 ; 5037
 
-Function5037: ; 5037
+_GetMovementPerson: ; 5037
 	ld hl, GetMovementPerson
 	jp HandleMovementData
 ; 503d
@@ -2410,19 +1931,18 @@
 ; 5041
 
 HandleMovementData: ; 5041
-	call CopyMovementPointer
+	call .StorePointer
 .loop
 	xor a
-	ld [wc2ea], a
-	call GetMovementByte
+	ld [wMovementByteWasControlSwitch], a
+	call JumpMovementPointer
 	call DoMovementFunction
-	ld a, [wc2ea]
+	ld a, [wMovementByteWasControlSwitch]
 	and a
 	jr nz, .loop
 	ret
-; 5055
 
-CopyMovementPointer: ; 5055
+.StorePointer
 	ld a, l
 	ld [wMovementPointer], a
 	ld a, h
@@ -2430,7 +1950,7 @@
 	ret
 ; 505e
 
-GetMovementByte: ; 505e
+JumpMovementPointer: ; 505e
 	ld hl, wMovementPointer
 	ld a, [hli]
 	ld h, [hl]
@@ -2440,7 +1960,7 @@
 
 ContinueReadingMovement: ; 5065
 	ld a, 1
-	ld [wc2ea], a
+	ld [wMovementByteWasControlSwitch], a
 	ret
 ; 506b
 
@@ -2453,12 +1973,9 @@
 	ret
 ; 5075
 
-
-; 5075
 INCLUDE "engine/movement.asm"
 ; 54b8
 
-
 ApplyMovementToFollower: ; 54b8
 	ld e, a
 	ld a, [wObjectFollow_Follower]
@@ -2470,22 +1987,22 @@
 	cp d
 	ret nz
 	ld a, e
-	cp $3e
+	cp movement_step_sleep_1
 	ret z
-	cp $47
+	cp movement_step_end
 	ret z
-	cp $4b
+	cp movement_step_4b
 	ret z
-	cp $50
+	cp movement_step_bump
 	ret z
-	cp $8
+	cp movement_turn_step_right + 1
 	ret c
 	push af
-	ld hl, wd4d0
+	ld hl, wFollowerMovementQueueLength
 	inc [hl]
 	ld e, [hl]
 	ld d, 0
-	ld hl, wd4d1
+	ld hl, wFollowMovementQueue
 	add hl, de
 	pop af
 	ld [hl], a
@@ -2492,8 +2009,8 @@
 	ret
 ; 54e6
 
-Function54e6: ; 54e6
-	ld hl, wd4d0
+GetFollowerNextMovementByte: ; 54e6
+	ld hl, wFollowerMovementQueueLength
 	ld a, [hl]
 	and a
 	jr z, .done
@@ -2502,7 +2019,7 @@
 	dec [hl]
 	ld e, a
 	ld d, 0
-	ld hl, wd4d1
+	ld hl, wFollowMovementQueue
 	add hl, de
 	inc e
 	ld a, -1
@@ -2515,14 +2032,12 @@
 	ret
 
 .done
-	call Function550a
+	call .CancelFollowIfLeaderMissing
 	ret c
-
 	ld a, movement_step_sleep_1
 	ret
-; 550a
 
-Function550a: ; 550a
+.CancelFollowIfLeaderMissing
 	ld a, [wObjectFollow_Leader]
 	cp -1
 	jr z, .nope
@@ -2538,7 +2053,7 @@
 	ret
 
 .nope
-	ld a, $ff
+	ld a, -1
 	ld [wObjectFollow_Follower], a
 	ld a, movement_step_end
 	scf
@@ -2557,7 +2072,6 @@
 	; vtile, palette, movement
 	db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SHADOW
 ; 5538
-
 SpawnStrengthBoulderDust: ; 5538
 	push bc
 	ld de, .BoulderDustObject
@@ -2569,7 +2083,6 @@
 .BoulderDustObject
 	db $00, PAL_OW_SILVER, SPRITEMOVEDATA_BOULDERDUST
 ; 5547
-
 SpawnEmote: ; 5547
 	push bc
 	ld de, .EmoteObject
@@ -2581,7 +2094,6 @@
 .EmoteObject
 	db $00, PAL_OW_SILVER, SPRITEMOVEDATA_EMOTE
 ; 5556
-
 ShakeGrass: ; 5556
 	push bc
 	ld de, .data_5562
@@ -2593,7 +2105,6 @@
 .data_5562
 	db $00, PAL_OW_TREE, SPRITEMOVEDATA_GRASS
 ; 5565
-
 ShakeScreen: ; 5565
 	push bc
 	push af
@@ -2608,7 +2119,6 @@
 .ScreenShakeObject
 	db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SCREENSHAKE
 ; 5579
-
 DespawnEmote: ; 5579
 	push bc
 	ld a, [hMapObjectIndexBuffer]
@@ -2616,9 +2126,8 @@
 	call .DeleteEmote
 	pop bc
 	ret
-; 5582
 
-.DeleteEmote: ; 5582
+.DeleteEmote
 	ld de, ObjectStructs
 	ld a, NUM_OBJECT_STRUCTS
 .loop
@@ -2637,7 +2146,6 @@
 	ld bc, OBJECT_STRUCT_LENGTH
 	call ByteFill
 	pop bc
-
 .next
 	ld hl, OBJECT_STRUCT_LENGTH
 	add hl, de
@@ -2652,7 +2160,6 @@
 InitTempObject: ; 55ac
 	call FindFirstEmptyObjectStruct
 	ret nc
-
 	ld d, h
 	ld e, l
 	callba CopyTempObjectToObjectStruct
@@ -2668,7 +2175,6 @@
 	inc hl
 	ld [hl], -1
 	inc hl
-
 	ld a, [de]
 	inc de
 	ld [hli], a
@@ -2677,10 +2183,8 @@
 	ld [hli], a
 	ld a, [de]
 	ld [hli], a
-
 	ld a, [hMapObjectIndexBuffer]
 	ld [hli], a
-
 	push hl
 	ld hl, OBJECT_NEXT_MAP_X
 	add hl, bc
@@ -2689,7 +2193,6 @@
 	add hl, bc
 	ld e, [hl]
 	pop hl
-
 	ld [hl], d
 	inc hl
 	ld [hl], e
@@ -2702,7 +2205,6 @@
 	ld a, [VramState]
 	bit 0, a
 	ret z
-
 	ld bc, ObjectStructs
 	xor a
 .loop
@@ -2710,7 +2212,6 @@
 	call GetObjectSprite
 	jr z, .ok
 	call Function565c
-
 .ok
 	ld hl, OBJECT_STRUCT_LENGTH
 	add hl, bc
@@ -2727,16 +2228,13 @@
 	call Function5645 ; clear sprites
 	ld a, PLAYER
 	call Function5629 ; respawn player
-
 	ld a, [wBattleScriptFlags]
 	bit 7, a
 	jr z, .ok
-
 	ld a, [hLastTalked]
 	and a
 	jr z, .ok
 	call Function5629 ; respawn opponent
-
 .ok
 	call _UpdateSprites
 	ret
@@ -2753,7 +2251,6 @@
 Function5629: ; 5629
 	cp NUM_OBJECTS
 	ret nc
-
 	call GetMapObject
 	ld hl, MAPOBJECT_OBJECT_STRUCT_ID
 	add hl, bc
@@ -2760,14 +2257,11 @@
 	ld a, [hl]
 	cp -1
 	ret z
-
 	cp NUM_OBJECT_STRUCTS
 	ret nc
-
 	call GetObjectStruct
 	call GetObjectSprite
 	ret z
-
 	call Function5673
 	ret
 ; 5645
@@ -2851,7 +2345,6 @@
 	add $b
 	cp d
 	jr c, .nope
-
 .equal_x
 	ld a, [YCoord]
 	cp e
@@ -2860,7 +2353,6 @@
 	add $a
 	cp e
 	jr c, .nope
-
 .equal_y
 	xor a
 	ret
@@ -2884,7 +2376,6 @@
 	jr nc, .ok1
 	cp $a0
 	jp nc, .nope
-
 .ok1
 	and %00000111
 	ld d, 2
@@ -2891,7 +2382,6 @@
 	cp 4
 	jr c, .ok2
 	ld d, 3
-
 .ok2
 	ld a, [hl]
 	srl a
@@ -2900,7 +2390,6 @@
 	cp SCREEN_WIDTH
 	jr c, .ok3
 	sub $20
-
 .ok3
 	ld [hUsedSpriteIndex], a
 	ld a, [wFollowNotExactPersonY]
@@ -2916,7 +2405,6 @@
 	jr nc, .ok4
 	cp $90
 	jr nc, .nope
-
 .ok4
 	and %00000111
 	ld e, 2
@@ -2923,7 +2411,6 @@
 	cp 4
 	jr c, .ok5
 	ld e, 3
-
 .ok5
 	ld a, [hl]
 	srl a
@@ -2932,7 +2419,6 @@
 	cp $12
 	jr c, .ok6
 	sub $20
-
 .ok6
 	ld [hUsedSpriteTile], a
 	ld hl, OBJECT_PALETTE
@@ -2945,7 +2431,6 @@
 	ld a, e
 	add 2
 	ld e, a
-
 .ok7
 	ld a, d
 	ld [hFFBF], a
@@ -2971,11 +2456,9 @@
 	ld a, [hl]
 	cp $60
 	jr nc, .nope
-
 .ok8
 	dec d
 	jr nz, .next
-
 .ok9
 	dec e
 	jr nz, .loop
@@ -2991,9 +2474,8 @@
 	call .ResetStepVector
 	call Function5781
 	ret
-; 5771
 
-.ResetStepVector: ; 5771
+.ResetStepVector
 	xor a
 	ld [wPlayerStepVectorX], a
 	ld [wPlayerStepVectorY], a
@@ -3011,7 +2493,6 @@
 	call GetObjectSprite
 	jr z, .next
 	call Function437b
-
 .next
 	ld hl, OBJECT_STRUCT_LENGTH
 	add hl, bc
@@ -3026,8 +2507,8 @@
 
 Function579d: ; 579d
 	ld a, $3e
-	ld [wc2de], a
-	ld [wc2df], a
+	ld [wPlayerNextMovement], a
+	ld [wPlayerMovement], a
 	xor a
 	ld [wd04e], a
 	ld [PlayerObjectStepFrame], a
@@ -3073,7 +2554,6 @@
 	ld a, d
 	and %10000000
 	ret z
-
 	ld bc, 0 ; debug?
 	ld hl, OBJECT_FACING
 	add hl, bc
@@ -3080,7 +2560,6 @@
 	ld a, [hl]
 	or d
 	ld [hl], a
-
 	ld a, d
 	swap a
 	and %00000111
@@ -3103,7 +2582,7 @@
 	ret c
 	ld a, c
 	call SetFollowerIfVisible
-	callba Function848a
+	callba QueueFollowerFirstStep
 	ret
 ; 5815
 
@@ -3189,7 +2668,6 @@
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
 	set 5, [hl]
-
 .next
 	ld hl, OBJECT_STRUCT_LENGTH
 	add hl, bc
@@ -3235,7 +2713,6 @@
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
 	res 5, [hl]
-
 .next
 	ld hl, OBJECT_STRUCT_LENGTH
 	add hl, bc
@@ -3264,7 +2741,6 @@
 	ld a, [hl]
 	cp -1
 	jp z, Function5903 ; a jr would have been appropriate here
-
 	push bc
 	call GetMapObject
 	ld hl, MAPOBJECT_MOVEMENT
@@ -3271,11 +2747,9 @@
 	add hl, bc
 	ld a, [hl]
 	pop bc
-
 	ld hl, OBJECT_MOVEMENTTYPE
 	add hl, bc
 	ld [hl], a
-
 	ld hl, OBJECT_STEP_TYPE
 	add hl, bc
 	ld [hl], STEP_TYPE_00
@@ -3294,7 +2768,6 @@
 	ld hl, OBJECT_MOVEMENTTYPE
 	add hl, bc
 	ld [hl], a
-
 	ld hl, OBJECT_STEP_TYPE
 	add hl, bc
 	ld [hl], STEP_TYPE_00
@@ -3306,7 +2779,6 @@
 	db SPRITEMOVEDATA_STANDING_LEFT
 	db SPRITEMOVEDATA_STANDING_RIGHT
 ; 5920
-
 _UpdateSprites:: ; 5920
 	ld a, [VramState]
 	bit 0, a
@@ -3322,15 +2794,13 @@
 	pop af
 	ld [hOAMUpdate], a
 	ret
-; 593a
 
-.fill: ; 593a
+.fill
 	ld a, [VramState]
 	bit 1, a
 	ld b, SpritesEnd % $100
 	jr z, .ok
 	ld b, 28 * 4
-
 .ok
 	ld a, [hUsedSpriteIndex]
 	cp b
@@ -3358,24 +2828,20 @@
 	ld e, a
 	ld bc, ObjectStructs
 	ld a, NUM_OBJECT_STRUCTS
-
 .loop
 	push af
 	call GetObjectSprite
 	jr z, .skip
-
 	ld hl, OBJECT_SPRITE_X
 	add hl, bc
 	ld a, [hl]
 	add d
 	ld [hl], a
-
 	ld hl, OBJECT_SPRITE_Y
 	add hl, bc
 	ld a, [hl]
 	add e
 	ld [hl], a
-
 .skip
 	ld hl, OBJECT_STRUCT_LENGTH
 	add hl, bc
@@ -3384,7 +2850,6 @@
 	pop af
 	dec a
 	jr nz, .loop
-
 	xor a
 	ld [wFollowNotExactPersonX], a
 	ld [wFollowNotExactPersonY], a
@@ -3406,28 +2871,24 @@
 	ld c, PRIORITY_LOW
 	call .InitSpritesByPriority
 	ret
-; 59a4
 
-.DeterminePriorities: ; 59a4
+.DeterminePriorities
 	xor a
-	ld hl, wc2eb
+	ld hl, wMovementPointer
 	ld bc, NUM_OBJECT_STRUCTS
 	call ByteFill
-
 	ld d, 0
 	ld bc, ObjectStructs
-	ld hl, wc2eb
+	ld hl, wMovementPointer
 .loop
 	push hl
 	call GetObjectSprite
 	jr z, .skip
-
 	ld hl, OBJECT_FACING_STEP
 	add hl, bc
 	ld a, [hl]
 	cp STANDING
 	jr z, .skip
-
 ; Define the sprite priority.
 	ld e, PRIORITY_LOW
 	ld hl, OBJECT_FLAGS2
@@ -3457,7 +2918,6 @@
 	ld a, d
 	or e
 	ld [hli], a
-
 .next
 	inc d
 	ld a, d
@@ -3464,9 +2924,8 @@
 	cp NUM_OBJECT_STRUCTS
 	jr nz, .loop
 	ret
-; 59f3
 
-.InitSpritesByPriority: ; 59f3
+.InitSpritesByPriority
 	ld hl, wMovementPointer
 .next_sprite
 	ld a, [hli]
@@ -3475,7 +2934,6 @@
 	ret z
 	cp c
 	jr nz, .next_sprite
-
 	push bc
 	push hl
 	ld a, d
@@ -3485,21 +2943,18 @@
 	pop hl
 	pop bc
 	jr .next_sprite
-; 5a0d
 
-.InitSprite: ; 5a0d
+.InitSprite
 	ld hl, OBJECT_SPRITE_TILE
 	add hl, bc
 	ld a, [hl]
 	and %01111111
 	ld [hFFC1], a
-
 	xor a
 	bit 7, [hl]
 	jr nz, .skip1
 	or %00001000
 .skip1
-
 	ld hl, OBJECT_FLAGS2
 	add hl, bc
 	ld e, [hl]
@@ -3507,12 +2962,10 @@
 	jr z, .skip2
 	or %10000000
 .skip2
-
 	bit 4, e
 	jr z, .skip3
 	or %00010000
 .skip3
-
 	ld hl, OBJECT_PALETTE
 	add hl, bc
 	ld d, a
@@ -3520,7 +2973,6 @@
 	and %00000111
 	or d
 	ld d, a
-
 	xor a
 	bit 3, e
 	jr z, .skip4
@@ -3527,37 +2979,28 @@
 	or %10000000
 .skip4
 	ld [hFFC2], a
-
 	ld hl, OBJECT_SPRITE_X
 	add hl, bc
 	ld a, [hl]
-
 	ld hl, OBJECT_SPRITE_X_OFFSET
 	add hl, bc
 	add [hl]
-
 	add 8
-
 	ld e, a
 	ld a, [wFollowNotExactPersonX]
 	add e
 	ld [hFFBF], a
-
 	ld hl, OBJECT_SPRITE_Y
 	add hl, bc
 	ld a, [hl]
-
 	ld hl, OBJECT_SPRITE_Y_OFFSET
 	add hl, bc
 	add [hl]
-
 	add 12
-
 	ld e, a
 	ld a, [wFollowNotExactPersonY]
 	add e
 	ld [hFFC0], a
-
 	ld hl, OBJECT_FACING_STEP
 	add hl, bc
 	ld a, [hl]
@@ -3565,7 +3008,6 @@
 	jp z, .done
 	cp NUM_FACINGS
 	jp nc, .done
-
 	ld l, a
 	ld h, 0
 	add hl, hl
@@ -3574,7 +3016,6 @@
 	ld a, [hli]
 	ld h, [hl]
 	ld l, a
-
 	ld a, [hUsedSpriteIndex]
 	ld c, a
 	ld b, Sprites / $100
@@ -3583,25 +3024,19 @@
 	add c
 	cp SpritesEnd % $100
 	jr nc, .full
-
 .addsprite
 	ld a, [hFFC0]
 	add [hl]
 	inc hl
-
 	ld [bc], a
 	inc c
-
 	ld a, [hFFBF]
 	add [hl]
 	inc hl
-
 	ld [bc], a
 	inc c
-
 	ld e, [hl]
 	inc hl
-
 	ld a, [hFFC1]
 	bit 2, e
 	jr z, .nope1
@@ -3609,10 +3044,8 @@
 .nope1
 	add [hl]
 	inc hl
-
 	ld [bc], a
 	inc c
-
 	ld a, e
 	bit 1, a
 	jr z, .nope2
@@ -3623,15 +3056,12 @@
 	or d
 	ld [bc], a
 	inc c
-
 	ld a, [hUsedSpriteTile]
 	dec a
 	ld [hUsedSpriteTile], a
 	jr nz, .addsprite
-
 	ld a, c
 	ld [hUsedSpriteIndex], a
-
 .done
 	xor a
 	ret
@@ -3639,19 +3069,17 @@
 .full
 	scf
 	ret
-; 5ac2
 
-.GetObjectStructPointer: ; 5ac2
+.GetObjectStructPointer
 	ld c, a
 	ld b, 0
 	ld hl, .Addresses
-	add hl,bc
-	add hl,bc
+	add hl, bc
+	add hl, bc
 	ld c, [hl]
 	inc hl
 	ld b, [hl]
 	ret
-; 5ace
 
 .Addresses ; 5ace
 	dw PlayerStruct
--- a/engine/movement.asm
+++ b/engine/movement.asm
@@ -3,10 +3,10 @@
 	dw Movement_turn_head_up          ; 01
 	dw Movement_turn_head_left        ; 02
 	dw Movement_turn_head_right       ; 03
-	dw Movement_half_step_down        ; 04
-	dw Movement_half_step_up          ; 05
-	dw Movement_half_step_left        ; 06
-	dw Movement_half_step_right       ; 07
+	dw Movement_turn_step_down        ; 04
+	dw Movement_turn_step_up          ; 05
+	dw Movement_turn_step_left        ; 06
+	dw Movement_turn_step_right       ; 07
 	dw Movement_slow_step_down        ; 08
 	dw Movement_slow_step_up          ; 09
 	dw Movement_slow_step_left        ; 0a
@@ -130,7 +130,7 @@
 	ld hl, OBJECT_ACTION
 	add hl, bc
 	ld [hl], PERSON_ACTION_SPIN
-	call GetMovementByte
+	call JumpMovementPointer
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	ld [hl], a
@@ -150,7 +150,7 @@
 	ld hl, OBJECT_STEP_FRAME
 	add hl, bc
 	ld [hl], a
-	call GetMovementByte
+	call JumpMovementPointer
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	ld [hl], a
@@ -174,7 +174,7 @@
 ; 5196
 
 Movement_rock_smash: ; 5196
-	call GetMovementByte
+	call JumpMovementPointer
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	ld [hl], a
@@ -233,7 +233,7 @@
 	add hl, bc
 	ld [hl], $0
 
-	call GetMovementByte
+	call JumpMovementPointer
 	ld hl, OBJECT_STEP_DURATION
 	add hl, bc
 	ld [hl], a
@@ -311,7 +311,7 @@
 ; parameters:
 ;	duration (DecimalParam)
 
-	call GetMovementByte
+	call JumpMovementPointer
 	jr Movement_step_sleep_common
 
 Movement_step_sleep_common: ; 5247
@@ -429,7 +429,7 @@
 ; parameters:
 ;	displacement (DecimalParam)
 
-	call GetMovementByte
+	call JumpMovementPointer
 	call ShakeScreen
 	jp ContinueReadingMovement
 ; 52de
@@ -709,23 +709,23 @@
 ; 53f0
 
 
-Movement_half_step_down: ; 53f0
+Movement_turn_step_down: ; 53f0
 	ld a, OW_DOWN
-	jr HalfStep
+	jr TurnStep
 
-Movement_half_step_up: ; 53f4
+Movement_turn_step_up: ; 53f4
 	ld a, OW_UP
-	jr HalfStep
+	jr TurnStep
 
-Movement_half_step_left: ; 53f8
+Movement_turn_step_left: ; 53f8
 	ld a, OW_LEFT
-	jr HalfStep
+	jr TurnStep
 
-Movement_half_step_right: ; 53fc
+Movement_turn_step_right: ; 53fc
 	ld a, OW_RIGHT
-	jr HalfStep
+	jr TurnStep
 
-HalfStep: ; 5400
+TurnStep: ; 5400
 	ld hl, OBJECT_29 ; new facing
 	add hl, bc
 	ld [hl], a
--- a/engine/npctrade.asm
+++ b/engine/npctrade.asm
@@ -511,7 +511,6 @@
 	; traded givemon for getmon
 	text_jump UnknownText_0x1bd429
 	start_asm
-
 	ld de, MUSIC_NONE
 	call PlayMusic
 	call DelayFrame
--- /dev/null
+++ b/engine/player_movement.asm
@@ -1,0 +1,846 @@
+DoPlayerMovement:: ; 80000
+
+	call .GetDPad
+	ld a, movement_step_sleep_1
+	ld [MovementAnimation], a
+	xor a
+	ld [wd041], a
+	call .TranslateIntoMovement
+	ld c, a
+	ld a, [MovementAnimation]
+	ld [wPlayerNextMovement], a
+	ret
+
+.GetDPad
+
+	ld a, [hJoyDown]
+	ld [CurInput], a
+
+; Standing downhill instead moves down.
+
+	ld hl, BikeFlags
+	bit 2, [hl] ; downhill
+	ret z
+
+	ld c, a
+	and D_PAD
+	ret nz
+
+	ld a, c
+	or D_DOWN
+	ld [CurInput], a
+	ret
+; 8002d
+
+.TranslateIntoMovement
+	ld a, [PlayerState]
+	cp PLAYER_NORMAL
+	jr z, .Normal
+	cp PLAYER_SURF
+	jr z, .Surf
+	cp PLAYER_SURF_PIKA
+	jr z, .Surf
+	cp PLAYER_BIKE
+	jr z, .Normal
+	cp PLAYER_SLIP
+	jr z, .Ice
+
+.Normal
+	call .CheckForced
+	call .GetAction
+	call .CheckTile
+	ret c
+	call .CheckTurning
+	ret c
+	call .TryStep
+	ret c
+	call .TryJump
+	ret c
+	call .CheckWarp
+	ret c
+	jr .NotMoving
+
+.Surf
+	call .CheckForced
+	call .GetAction
+	call .CheckTile
+	ret c
+	call .CheckTurning
+	ret c
+	call .TrySurf
+	ret c
+	jr .NotMoving
+
+.Ice
+	call .CheckForced
+	call .GetAction
+	call .CheckTile
+	ret c
+	call .CheckTurning
+	ret c
+	call .TryStep
+	ret c
+	call .TryJump
+	ret c
+	call .CheckWarp
+	ret c
+	ld a, [WalkingDirection]
+	cp STANDING
+	jr z, .HitWall
+	call .BumpSound
+.HitWall
+	call .StandInPlace
+	xor a
+	ret
+
+.NotMoving
+	ld a, [WalkingDirection]
+	cp STANDING
+	jr z, .Standing
+
+; Walking into an edge warp won't bump.
+	ld a, [EngineBuffer4]
+	and a
+	jr nz, .CantMove
+	call .BumpSound
+.CantMove
+	call ._WalkInPlace
+	xor a
+	ret
+
+.Standing
+	call .StandInPlace
+	xor a
+	ret
+; 800b7
+
+.CheckTile: ; 800b7
+; Tiles such as waterfalls and warps move the player
+; in a given direction, overriding input.
+
+	ld a, [PlayerNextTile]
+	ld c, a
+	call CheckWhirlpoolTile
+	jr c, .asm_800c4
+	ld a, 3
+	scf
+	ret
+
+.asm_800c4
+	and $f0
+	cp $30 ; moving water
+	jr z, .water
+	cp $40 ; moving land 1
+	jr z, .land1
+	cp $50 ; moving land 2
+	jr z, .land2
+	cp $70 ; warps
+	jr z, .warps
+	jr .asm_8013c
+
+.water
+	ld a, c
+	and 3
+	ld c, a
+	ld b, 0
+	ld hl, .water_table
+	add hl, bc
+	ld a, [hl]
+	ld [WalkingDirection], a
+	jr .asm_8013e
+
+.water_table
+	db RIGHT
+	db LEFT
+	db UP
+	db DOWN
+
+.land1
+	ld a, c
+	and 7
+	ld c, a
+	ld b, 0
+	ld hl, .land1_table
+	add hl, bc
+	ld a, [hl]
+	cp STANDING
+	jr z, .asm_8013c
+	ld [WalkingDirection], a
+	jr .asm_8013e
+
+.land1_table
+	db STANDING
+	db RIGHT
+	db LEFT
+	db UP
+	db DOWN
+	db STANDING
+	db STANDING
+	db STANDING
+
+.land2
+	ld a, c
+	and 7
+	ld c, a
+	ld b, 0
+	ld hl, .land2_table
+	add hl, bc
+	ld a, [hl]
+	cp STANDING
+	jr z, .asm_8013c
+	ld [WalkingDirection], a
+	jr .asm_8013e
+
+.land2_table
+	db RIGHT
+	db LEFT
+	db UP
+	db DOWN
+	db STANDING
+	db STANDING
+	db STANDING
+	db STANDING
+
+.warps
+	ld a, c
+	cp $71 ; door
+	jr z, .down
+	cp $79
+	jr z, .down
+	cp $7a ; stairs
+	jr z, .down
+	cp $7b ; cave
+	jr nz, .asm_8013c
+
+.down
+	ld a, DOWN
+	ld [WalkingDirection], a
+	jr .asm_8013e
+
+.asm_8013c
+	xor a
+	ret
+
+.asm_8013e
+	ld a, STEP_WALK
+	call .DoStep
+	ld a, 5
+	scf
+	ret
+; 80147
+
+.CheckTurning: ; 80147
+; If the player is turning, change direction first. This also lets
+; the player change facing without moving by tapping a direction.
+
+	ld a, [wd04e]
+	cp 0
+	jr nz, .asm_80169
+	ld a, [WalkingDirection]
+	cp STANDING
+	jr z, .asm_80169
+
+	ld e, a
+	ld a, [PlayerDirection]
+	rrca
+	rrca
+	and 3
+	cp e
+	jr z, .asm_80169
+
+	ld a, STEP_TURN
+	call .DoStep
+	ld a, 2
+	scf
+	ret
+
+.asm_80169
+	xor a
+	ret
+; 8016b
+
+.TryStep: ; 8016b
+
+; Surfing actually calls .TrySurf directly instead of passing through here.
+	ld a, [PlayerState]
+	cp PLAYER_SURF
+	jr z, .TrySurf
+	cp PLAYER_SURF_PIKA
+	jr z, .TrySurf
+
+	call .CheckLandPerms
+	jr c, .bump
+
+	call .CheckNPC
+	and a
+	jr z, .bump
+	cp 2
+	jr z, .bump
+
+	ld a, [PlayerNextTile]
+	call CheckIceTile
+	jr nc, .ice
+
+; Downhill riding is slower when not moving down.
+	call .BikeCheck
+	jr nz, .walk
+
+	ld hl, BikeFlags
+	bit 2, [hl] ; downhill
+	jr z, .fast
+
+	ld a, [WalkingDirection]
+	cp DOWN
+	jr z, .fast
+
+	ld a, STEP_WALK
+	call .DoStep
+	scf
+	ret
+
+.fast
+	ld a, STEP_BIKE
+	call .DoStep
+	scf
+	ret
+
+.walk
+	ld a, STEP_WALK
+	call .DoStep
+	scf
+	ret
+
+.ice
+	ld a, STEP_ICE
+	call .DoStep
+	scf
+	ret
+
+; unused?
+	xor a
+	ret
+
+.bump
+	xor a
+	ret
+; 801c0
+
+.TrySurf: ; 801c0
+
+	call .CheckSurfPerms
+	ld [wd040], a
+	jr c, .surf_bump
+
+	call .CheckNPC
+	ld [wd03f], a
+	and a
+	jr z, .surf_bump
+	cp 2
+	jr z, .surf_bump
+
+	ld a, [wd040]
+	and a
+	jr nz, .ExitWater
+
+	ld a, STEP_WALK
+	call .DoStep
+	scf
+	ret
+
+.ExitWater
+	call .GetOutOfWater
+	call PlayMapMusic
+	ld a, STEP_WALK
+	call .DoStep
+	ld a, 6
+	scf
+	ret
+
+.surf_bump
+	xor a
+	ret
+; 801f3
+
+.TryJump: ; 801f3
+	ld a, [PlayerNextTile]
+	ld e, a
+	and $f0
+	cp $a0 ; ledge
+	jr nz, .DontJump
+
+	ld a, e
+	and 7
+	ld e, a
+	ld d, 0
+	ld hl, .data_8021e
+	add hl, de
+	ld a, [FacingDirection]
+	and [hl]
+	jr z, .DontJump
+
+	ld de, SFX_JUMP_OVER_LEDGE
+	call PlaySFX
+	ld a, STEP_LEDGE
+	call .DoStep
+	ld a, 7
+	scf
+	ret
+
+.DontJump
+	xor a
+	ret
+
+.data_8021e
+	db FACE_RIGHT
+	db FACE_LEFT
+	db FACE_UP
+	db FACE_DOWN
+	db FACE_RIGHT | FACE_DOWN
+	db FACE_DOWN | FACE_LEFT
+	db FACE_UP | FACE_RIGHT
+	db FACE_UP | FACE_LEFT
+; 80226
+
+.CheckWarp: ; 80226
+
+; Bug: Since no case is made for STANDING here, it will check
+; [.edgewarps + $ff]. This resolves to $3e at $8035a.
+; This causes wd041 to be nonzero when standing on tile $3e,
+; making bumps silent.
+
+	ld a, [WalkingDirection]
+	ld e, a
+	ld d, 0
+	ld hl, .EdgeWarps
+	add hl, de
+	ld a, [PlayerNextTile]
+	cp [hl]
+	jr nz, .not_warp
+
+	ld a, 1
+	ld [wd041], a
+	ld a, [WalkingDirection]
+	cp STANDING
+	jr z, .not_warp
+
+	ld e, a
+	ld a, [PlayerDirection]
+	rrca
+	rrca
+	and 3
+	cp e
+	jr nz, .not_warp
+	call WarpCheck
+	jr nc, .not_warp
+
+	call .StandInPlace
+	scf
+	ld a, 1
+	ret
+
+.not_warp
+	xor a
+	ret
+
+.EdgeWarps
+	db $70, $78, $76, $7e
+; 8025f
+
+.DoStep: ; 8025f
+	ld e, a
+	ld d, 0
+	ld hl, .Steps
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+
+	ld a, [WalkingDirection]
+	ld e, a
+	cp STANDING
+	jp z, .StandInPlace
+
+	add hl, de
+	ld a, [hl]
+	ld [MovementAnimation], a
+
+	ld hl, .InPlace
+	add hl, de
+	ld a, [hl]
+	ld [wd04e], a
+
+	ld a, 4
+	ret
+
+.Steps
+	dw .SlowStep
+	dw .NormalStep
+	dw .FastStep
+	dw .JumpStep
+	dw .SlideStep
+	dw .TurningStep
+	dw .BackJumpStep
+	dw .InPlace
+
+.SlowStep
+	slow_step_down
+	slow_step_up
+	slow_step_left
+	slow_step_right
+.NormalStep
+	step_down
+	step_up
+	step_left
+	step_right
+.FastStep
+	big_step_down
+	big_step_up
+	big_step_left
+	big_step_right
+.JumpStep
+	jump_step_down
+	jump_step_up
+	jump_step_left
+	jump_step_right
+.SlideStep
+	fast_slide_step_down
+	fast_slide_step_up
+	fast_slide_step_left
+	fast_slide_step_right
+.BackJumpStep
+	jump_step_up
+	jump_step_down
+	jump_step_right
+	jump_step_left
+.TurningStep
+	turn_step_down
+	turn_step_up
+	turn_step_left
+	turn_step_right
+.InPlace
+	db $80 + movement_turn_head_down
+	db $80 + movement_turn_head_up
+	db $80 + movement_turn_head_left
+	db $80 + movement_turn_head_right
+; 802b3
+
+.StandInPlace: ; 802b3
+	ld a, 0
+	ld [wd04e], a
+	ld a, movement_step_sleep_1
+	ld [MovementAnimation], a
+	xor a
+	ret
+; 802bf
+
+._WalkInPlace: ; 802bf
+	ld a, 0
+	ld [wd04e], a
+	ld a, movement_step_bump
+	ld [MovementAnimation], a
+	xor a
+	ret
+; 802cb
+
+.CheckForced: ; 802cb
+; When sliding on ice, input is forced to remain in the same direction.
+
+	call CheckStandingOnIce
+	ret nc
+
+	ld a, [wd04e]
+	cp 0
+	ret z
+
+	and 3
+	ld e, a
+	ld d, 0
+	ld hl, .forced_dpad
+	add hl, de
+	ld a, [CurInput]
+	and BUTTONS
+	or [hl]
+	ld [CurInput], a
+	ret
+
+.forced_dpad
+	db D_DOWN, D_UP, D_LEFT, D_RIGHT
+; 802ec
+
+.GetAction: ; 802ec
+; Poll player input and update movement info.
+
+	ld hl, .table
+	ld de, .table2 - .table1
+	ld a, [CurInput]
+	bit D_DOWN_F, a
+	jr nz, .d_down
+	bit D_UP_F, a
+	jr nz, .d_up
+	bit D_LEFT_F, a
+	jr nz, .d_left
+	bit D_RIGHT_F, a
+	jr nz, .d_right
+; Standing
+	jr .update
+
+.d_down 	add hl, de
+.d_up   	add hl, de
+.d_left 	add hl, de
+.d_right	add hl, de
+
+.update
+	ld a, [hli]
+	ld [WalkingDirection], a
+	ld a, [hli]
+	ld [FacingDirection], a
+	ld a, [hli]
+	ld [WalkingX], a
+	ld a, [hli]
+	ld [WalkingY], a
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [hl]
+	ld [WalkingTile], a
+	ret
+
+.table
+; struct:
+;	walk direction
+;	facing
+;	x movement
+;	y movement
+;	tile collision pointer
+.table1
+	db STANDING, FACE_CURRENT, 0, 0
+	dw PlayerNextTile
+.table2
+	db RIGHT, FACE_RIGHT,  1,  0
+	dw TileRight
+	db LEFT,  FACE_LEFT,  -1,  0
+	dw TileLeft
+	db UP,    FACE_UP,     0, -1
+	dw TileUp
+	db DOWN,  FACE_DOWN,   0,  1
+	dw TileDown
+; 80341
+
+.CheckNPC: ; 80341
+; Returns 0 if there is an NPC in front that you can't move
+; Returns 1 if there is no NPC in front
+; Returns 2 if there is a movable NPC in front
+	ld a, 0
+	ld [hMapObjectIndexBuffer], a
+; Load the next X coordinate into d
+	ld a, [PlayerNextMapX]
+	ld d, a
+	ld a, [WalkingX]
+	add d
+	ld d, a
+; Load the next Y coordinate into e
+	ld a, [PlayerNextMapY]
+	ld e, a
+	ld a, [WalkingY]
+	add e
+	ld e, a
+; Find an object struct with coordinates equal to d,e
+	ld bc, ObjectStructs ; redundant
+	callba IsNPCAtCoord
+	jr nc, .is_npc
+	call .CheckStrengthBoulder
+	jr c, .no_bump
+
+	xor a
+	ret
+
+.is_npc
+	ld a, 1
+	ret
+
+.no_bump
+	ld a, 2
+	ret
+; 8036f
+
+.CheckStrengthBoulder: ; 8036f
+
+	ld hl, BikeFlags
+	bit 0, [hl] ; using strength
+	jr z, .not_boulder
+
+	ld hl, OBJECT_DIRECTION_WALKING
+	add hl, bc
+	ld a, [hl]
+	cp STANDING
+	jr nz, .not_boulder
+
+	ld hl, OBJECT_PALETTE
+	add hl, bc
+	bit 6, [hl]
+	jr z, .not_boulder
+
+	ld hl, OBJECT_FLAGS2
+	add hl, bc
+	set 2, [hl]
+
+	ld a, [WalkingDirection]
+	ld d, a
+	ld hl, OBJECT_RANGE
+	add hl, bc
+	ld a, [hl]
+	and $fc
+	or d
+	ld [hl], a
+
+	scf
+	ret
+
+.not_boulder
+	xor a
+	ret
+; 8039e
+
+.CheckLandPerms: ; 8039e
+; Return 0 if walking onto land and tile permissions allow it.
+; Otherwise, return carry.
+
+	ld a, [TilePermissions]
+	ld d, a
+	ld a, [FacingDirection]
+	and d
+	jr nz, .NotWalkable
+
+	ld a, [WalkingTile]
+	call .CheckWalkable
+	jr c, .NotWalkable
+
+	xor a
+	ret
+
+.NotWalkable
+	scf
+	ret
+; 803b4
+
+.CheckSurfPerms: ; 803b4
+; Return 0 if moving in water, or 1 if moving onto land.
+; Otherwise, return carry.
+
+	ld a, [TilePermissions]
+	ld d, a
+	ld a, [FacingDirection]
+	and d
+	jr nz, .NotSurfable
+
+	ld a, [WalkingTile]
+	call .CheckSurfable
+	jr c, .NotSurfable
+
+	and a
+	ret
+
+.NotSurfable
+	scf
+	ret
+; 803ca
+
+.BikeCheck: ; 803ca
+
+	ld a, [PlayerState]
+	cp PLAYER_BIKE
+	ret z
+	cp PLAYER_SLIP
+	ret
+; 803d3
+
+.CheckWalkable: ; 803d3
+; Return 0 if tile a is land. Otherwise, return carry.
+
+	call GetTileCollision
+	and a ; land
+	ret z
+	scf
+	ret
+; 803da
+
+.CheckSurfable: ; 803da
+; Return 0 if tile a is water, or 1 if land.
+; Otherwise, return carry.
+
+	call GetTileCollision
+	cp 1
+	jr z, .Water
+
+; Can walk back onto land from water.
+	and a
+	jr z, .Land
+
+	jr .Neither
+
+.Water
+	xor a
+	ret
+
+.Land
+	ld a, 1
+	and a
+	ret
+
+.Neither
+	scf
+	ret
+; 803ee
+
+.BumpSound: ; 803ee
+
+	call CheckSFX
+	ret c
+	ld de, SFX_BUMP
+	call PlaySFX
+	ret
+; 803f9
+
+.GetOutOfWater: ; 803f9
+	push bc
+	ld a, PLAYER_NORMAL
+	ld [PlayerState], a
+	call ReplaceKrisSprite ; UpdateSprites
+	pop bc
+	ret
+; 80404
+
+CheckStandingOnIce:: ; 80404
+	ld a, [wd04e]
+	cp 0
+	jr z, .not_ice
+	cp $f0
+	jr z, .not_ice
+	ld a, [PlayerNextTile]
+	call CheckIceTile
+	jr nc, .yep
+	ld a, [PlayerState]
+	cp PLAYER_SLIP
+	jr nz, .not_ice
+
+.yep
+	scf
+	ret
+
+.not_ice
+	and a
+	ret
+; 80422
+
+Function80422:: ; 80422
+	ld hl, wPlayerNextMovement
+	ld a, movement_step_sleep_1
+	cp [hl]
+	ret z
+
+	ld [hl], a
+	ld a, 0
+	ld [wd04e], a
+	ret
+; 80430
--- a/engine/timeset.asm
+++ b/engine/timeset.asm
@@ -336,7 +336,6 @@
 	; Whoa!@ @
 	text_jump UnknownText_0x1bc31b
 	start_asm
-; 0x908a9
 	hlcoord 7, 14
 	call DisplayMinutesWithMinString
 	ld hl, .QuestionMark
@@ -645,7 +644,6 @@
 
 .Text: ; 0x90acc
 	start_asm
-
 	call UpdateTime
 
 	hlcoord 1, 14
--- a/event/bug_contest_judging.asm
+++ b/event/bug_contest_judging.asm
@@ -63,9 +63,6 @@
 	; Placing third was @ , who caught a @ !@ @
 	text_jump ContestJudging_ThirdPlaceText
 	start_asm
-; 0x1371e
-
-BugContest_ThirdPlace: ; 1371e
 	ld de, SFX_3RD_PLACE
 	call PlaySFX
 	call WaitSFX
--- a/home/map_objects.asm
+++ b/home/map_objects.asm
@@ -460,7 +460,7 @@
 
 	ld hl, OBJECT_STEP_TYPE
 	add hl, bc
-	ld [hl], 0
+	ld [hl], STEP_TYPE_00
 
 	ld hl, VramState
 	set 7, [hl]
@@ -611,7 +611,7 @@
 	ret
 ; 1aae
 
-Function1aae:: ; 1aae
+_GetMovementByte:: ; 1aae
 ; Switch to the movement data bank
 	ld a, [hROMBank]
 	push af
--- a/macros/movement.asm
+++ b/macros/movement.asm
@@ -1,3 +1,4 @@
+
 	enum_start
 
 	enum movement_turn_head_down
@@ -20,24 +21,24 @@
 	db movement_turn_head_right ; $03
 	endm
 
-	enum movement_half_step_down
-half_step_down: macro
-	db movement_half_step_down ; $04
+	enum movement_turn_step_down
+turn_step_down: macro
+	db movement_turn_step_down ; $04
 	endm
 
-	enum movement_half_step_up
-half_step_up: macro
-	db movement_half_step_up ; $05
+	enum movement_turn_step_up
+turn_step_up: macro
+	db movement_turn_step_up ; $05
 	endm
 
-	enum movement_half_step_left
-half_step_left: macro
-	db movement_half_step_left ; $06
+	enum movement_turn_step_left
+turn_step_left: macro
+	db movement_turn_step_left ; $06
 	endm
 
-	enum movement_half_step_right
-half_step_right: macro
-	db movement_half_step_right ; $07
+	enum movement_turn_step_right
+turn_step_right: macro
+	db movement_turn_step_right ; $07
 	endm
 
 	enum movement_slow_step_down
@@ -367,7 +368,10 @@
 	db movement_step_loop ; $4a
 	endm
 
-__enum__ = $4c
+	enum movement_step_4b
+step_4b: macro
+	db movement_step_4b ; $4b
+	endm
 
 	enum movement_teleport_from
 teleport_from: macro
--- a/main.asm
+++ b/main.asm
@@ -1568,21 +1568,21 @@
 	ret
 ; 848a
 
-Function848a: ; 848a
-	call Function849d
+QueueFollowerFirstStep: ; 848a
+	call .QueueFirstStep
 	jr c, .same
-	ld [wd4d1], a
+	ld [wFollowMovementQueue], a
 	xor a
-	ld [wd4d0], a
+	ld [wFollowerMovementQueueLength], a
 	ret
 
 .same
 	ld a, -1
-	ld [wd4d0], a
+	ld [wFollowerMovementQueueLength], a
 	ret
 ; 849d
 
-Function849d: ; 849d
+.QueueFirstStep
 	ld a, [wObjectFollow_Leader]
 	call GetObjectStruct
 	ld hl, OBJECT_NEXT_MAP_X
@@ -1600,12 +1600,12 @@
 	jr z, .check_y
 	jr c, .left
 	and a
-	ld a, $c + RIGHT
+	ld a, movement_step_right
 	ret
 
 .left
 	and a
-	ld a, $c + LEFT
+	ld a, movement_step_left
 	ret
 
 .check_y
@@ -1616,12 +1616,12 @@
 	jr z, .same_xy
 	jr c, .up
 	and a
-	ld a, $c + DOWN
+	ld a, movement_step_down
 	ret
 
 .up
 	and a
-	ld a, $c + UP
+	ld a, movement_step_up
 	ret
 
 .same_xy
@@ -11520,855 +11520,7 @@
 
 SECTION "bank20", ROMX, BANK[$20]
 
-DoPlayerMovement:: ; 80000
-
-	call GetMovementInput
-	ld a, movement_step_sleep_1
-	ld [MovementAnimation], a
-	xor a
-	ld [wd041], a
-	call GetPlayerMovement
-	ld c, a
-	ld a, [MovementAnimation]
-	ld [wc2de], a
-	ret
-; 80017
-
-GetMovementInput: ; 80017
-
-	ld a, [hJoyDown]
-	ld [CurInput], a
-
-; Standing downhill instead moves down.
-
-	ld hl, BikeFlags
-	bit 2, [hl] ; downhill
-	ret z
-
-	ld c, a
-	and D_PAD
-	ret nz
-
-	ld a, c
-	or D_DOWN
-	ld [CurInput], a
-	ret
-; 8002d
-
-GetPlayerMovement: ; 8002d
-
-	ld a, [PlayerState]
-	cp PLAYER_NORMAL
-	jr z, .Normal
-	cp PLAYER_SURF
-	jr z, .Surf
-	cp PLAYER_SURF_PIKA
-	jr z, .Surf
-	cp PLAYER_BIKE
-	jr z, .Normal
-	cp PLAYER_SLIP
-	jr z, .Ice
-
-.Normal
-	call CheckForcedMovementInput
-	call GetMovementAction
-	call CheckTileMovement
-	ret c
-	call CheckTurning
-	ret c
-	call TryStep
-	ret c
-	call TryJumpLedge
-	ret c
-	call CheckEdgeWarp
-	ret c
-	jr .NotMoving
-
-.Surf
-	call CheckForcedMovementInput
-	call GetMovementAction
-	call CheckTileMovement
-	ret c
-	call CheckTurning
-	ret c
-	call TrySurfStep
-	ret c
-	jr .NotMoving
-
-.Ice
-	call CheckForcedMovementInput
-	call GetMovementAction
-	call CheckTileMovement
-	ret c
-	call CheckTurning
-	ret c
-	call TryStep
-	ret c
-	call TryJumpLedge
-	ret c
-	call CheckEdgeWarp
-	ret c
-	ld a, [WalkingDirection]
-	cp STANDING
-	jr z, .HitWall
-	call PlayBump
-.HitWall
-	call StandInPlace
-	xor a
-	ret
-
-.NotMoving
-	ld a, [WalkingDirection]
-	cp STANDING
-	jr z, .Standing
-
-; Walking into an edge warp won't bump.
-	ld a, [EngineBuffer4]
-	and a
-	jr nz, .CantMove
-	call PlayBump
-.CantMove
-	call WalkInPlace
-	xor a
-	ret
-
-.Standing
-	call StandInPlace
-	xor a
-	ret
-; 800b7
-
-CheckTileMovement: ; 800b7
-; Tiles such as waterfalls and warps move the player
-; in a given direction, overriding input.
-
-	ld a, [PlayerNextTile]
-	ld c, a
-	call CheckWhirlpoolTile
-	jr c, .asm_800c4
-	ld a, 3
-	scf
-	ret
-
-.asm_800c4
-	and $f0
-	cp $30 ; moving water
-	jr z, .water
-	cp $40 ; moving land 1
-	jr z, .land1
-	cp $50 ; moving land 2
-	jr z, .land2
-	cp $70 ; warps
-	jr z, .warps
-	jr .asm_8013c
-
-.water
-	ld a, c
-	and 3
-	ld c, a
-	ld b, 0
-	ld hl, .water_table
-	add hl, bc
-	ld a, [hl]
-	ld [WalkingDirection], a
-	jr .asm_8013e
-
-.water_table
-	db RIGHT
-	db LEFT
-	db UP
-	db DOWN
-
-.land1
-	ld a, c
-	and 7
-	ld c, a
-	ld b, 0
-	ld hl, .land1_table
-	add hl, bc
-	ld a, [hl]
-	cp STANDING
-	jr z, .asm_8013c
-	ld [WalkingDirection], a
-	jr .asm_8013e
-
-.land1_table
-	db STANDING
-	db RIGHT
-	db LEFT
-	db UP
-	db DOWN
-	db STANDING
-	db STANDING
-	db STANDING
-
-.land2
-	ld a, c
-	and 7
-	ld c, a
-	ld b, 0
-	ld hl, .land2_table
-	add hl, bc
-	ld a, [hl]
-	cp STANDING
-	jr z, .asm_8013c
-	ld [WalkingDirection], a
-	jr .asm_8013e
-
-.land2_table
-	db RIGHT
-	db LEFT
-	db UP
-	db DOWN
-	db STANDING
-	db STANDING
-	db STANDING
-	db STANDING
-
-.warps
-	ld a, c
-	cp $71 ; door
-	jr z, .down
-	cp $79
-	jr z, .down
-	cp $7a ; stairs
-	jr z, .down
-	cp $7b ; cave
-	jr nz, .asm_8013c
-
-.down
-	ld a, DOWN
-	ld [WalkingDirection], a
-	jr .asm_8013e
-
-.asm_8013c
-	xor a
-	ret
-
-.asm_8013e
-	ld a, STEP_WALK
-	call DoStep
-	ld a, 5
-	scf
-	ret
-; 80147
-
-CheckTurning: ; 80147
-; If the player is turning, change direction first. This also lets
-; the player change facing without moving by tapping a direction.
-
-	ld a, [wd04e]
-	cp 0
-	jr nz, .asm_80169
-	ld a, [WalkingDirection]
-	cp STANDING
-	jr z, .asm_80169
-
-	ld e, a
-	ld a, [PlayerDirection]
-	rrca
-	rrca
-	and 3
-	cp e
-	jr z, .asm_80169
-
-	ld a, STEP_TURN
-	call DoStep
-	ld a, 2
-	scf
-	ret
-
-.asm_80169
-	xor a
-	ret
-; 8016b
-
-TryStep: ; 8016b
-
-; Surfing actually calls TrySurfStep directly instead of passing through here.
-	ld a, [PlayerState]
-	cp PLAYER_SURF
-	jr z, TrySurfStep
-	cp PLAYER_SURF_PIKA
-	jr z, TrySurfStep
-
-	call CheckLandPermissions
-	jr c, .bump
-
-	call IsNPCInFront
-	and a
-	jr z, .bump
-	cp 2
-	jr z, .bump
-
-	ld a, [PlayerNextTile]
-	call CheckIceTile
-	jr nc, .ice
-
-; Downhill riding is slower when not moving down.
-	call CheckRiding
-	jr nz, .walk
-
-	ld hl, BikeFlags
-	bit 2, [hl] ; downhill
-	jr z, .fast
-
-	ld a, [WalkingDirection]
-	cp DOWN
-	jr z, .fast
-
-	ld a, STEP_WALK
-	call DoStep
-	scf
-	ret
-
-.fast
-	ld a, STEP_BIKE
-	call DoStep
-	scf
-	ret
-
-.walk
-	ld a, STEP_WALK
-	call DoStep
-	scf
-	ret
-
-.ice
-	ld a, STEP_ICE
-	call DoStep
-	scf
-	ret
-
-; unused?
-	xor a
-	ret
-
-.bump
-	xor a
-	ret
-; 801c0
-
-TrySurfStep: ; 801c0
-
-	call CheckWaterPermissions
-	ld [wd040], a
-	jr c, .bump
-
-	call IsNPCInFront
-	ld [wd03f], a
-	and a
-	jr z, .bump
-	cp 2
-	jr z, .bump
-
-	ld a, [wd040]
-	and a
-	jr nz, .ExitWater
-
-	ld a, STEP_WALK
-	call DoStep
-	scf
-	ret
-
-.ExitWater
-	call WaterToLandSprite
-	call PlayMapMusic
-	ld a, STEP_WALK
-	call DoStep
-	ld a, 6
-	scf
-	ret
-
-.bump
-	xor a
-	ret
-; 801f3
-
-TryJumpLedge: ; 801f3
-	ld a, [PlayerNextTile]
-	ld e, a
-	and $f0
-	cp $a0 ; ledge
-	jr nz, .DontJump
-
-	ld a, e
-	and 7
-	ld e, a
-	ld d, 0
-	ld hl, .data_8021e
-	add hl, de
-	ld a, [FacingDirection]
-	and [hl]
-	jr z, .DontJump
-
-	ld de, SFX_JUMP_OVER_LEDGE
-	call PlaySFX
-	ld a, STEP_LEDGE
-	call DoStep
-	ld a, 7
-	scf
-	ret
-
-.DontJump
-	xor a
-	ret
-
-.data_8021e
-	db FACE_RIGHT
-	db FACE_LEFT
-	db FACE_UP
-	db FACE_DOWN
-	db FACE_RIGHT | FACE_DOWN
-	db FACE_DOWN | FACE_LEFT
-	db FACE_UP | FACE_RIGHT
-	db FACE_UP | FACE_LEFT
-; 80226
-
-CheckEdgeWarp: ; 80226
-
-; Bug: Since no case is made for STANDING here, it will check
-; [.edgewarps + $ff]. This resolves to $3e at $8035a.
-; This causes wd041 to be nonzero when standing on tile $3e,
-; making bumps silent.
-
-	ld a, [WalkingDirection]
-	ld e, a
-	ld d, 0
-	ld hl, .EdgeWarps
-	add hl, de
-	ld a, [PlayerNextTile]
-	cp [hl]
-	jr nz, .nope
-
-	ld a, 1
-	ld [wd041], a
-	ld a, [WalkingDirection]
-	cp STANDING
-	jr z, .nope
-
-	ld e, a
-	ld a, [PlayerDirection]
-	rrca
-	rrca
-	and 3
-	cp e
-	jr nz, .nope
-	call WarpCheck
-	jr nc, .nope
-
-	call StandInPlace
-	scf
-	ld a, 1
-	ret
-
-.nope
-	xor a
-	ret
-
-.EdgeWarps
-	db $70, $78, $76, $7e
-; 8025f
-
-DoStep: ; 8025f
-	ld e, a
-	ld d, 0
-	ld hl, .Steps
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-
-	ld a, [WalkingDirection]
-	ld e, a
-	cp STANDING
-	jp z, StandInPlace
-
-	add hl, de
-	ld a, [hl]
-	ld [MovementAnimation], a
-
-	ld hl, .WalkInPlace
-	add hl, de
-	ld a, [hl]
-	ld [wd04e], a
-
-	ld a, 4
-	ret
-
-.Steps
-	dw .Slow
-	dw .Walk
-	dw .Bike
-	dw .Ledge
-	dw .Ice
-	dw .Turn
-	dw .BackwardsLedge
-	dw .WalkInPlace
-
-.Slow
-	slow_step_down
-	slow_step_up
-	slow_step_left
-	slow_step_right
-.Walk
-	step_down
-	step_up
-	step_left
-	step_right
-.Bike
-	big_step_down
-	big_step_up
-	big_step_left
-	big_step_right
-.Ledge
-	jump_step_down
-	jump_step_up
-	jump_step_left
-	jump_step_right
-.Ice
-	fast_slide_step_down
-	fast_slide_step_up
-	fast_slide_step_left
-	fast_slide_step_right
-.BackwardsLedge
-	jump_step_up
-	jump_step_down
-	jump_step_right
-	jump_step_left
-.Turn
-	half_step_down
-	half_step_up
-	half_step_left
-	half_step_right
-.WalkInPlace
-	db $80 + movement_turn_head_down
-	db $80 + movement_turn_head_up
-	db $80 + movement_turn_head_left
-	db $80 + movement_turn_head_right
-; 802b3
-
-StandInPlace: ; 802b3
-	ld a, 0
-	ld [wd04e], a
-	ld a, movement_step_sleep_1
-	ld [MovementAnimation], a
-	xor a
-	ret
-; 802bf
-
-WalkInPlace: ; 802bf
-	ld a, 0
-	ld [wd04e], a
-	ld a, movement_step_bump
-	ld [MovementAnimation], a
-	xor a
-	ret
-; 802cb
-
-CheckForcedMovementInput: ; 802cb
-; When sliding on ice, input is forced to remain in the same direction.
-
-	call CheckStandingOnIce
-	ret nc
-
-	ld a, [wd04e]
-	cp 0
-	ret z
-
-	and 3
-	ld e, a
-	ld d, 0
-	ld hl, .data_802e8
-	add hl, de
-	ld a, [CurInput]
-	and BUTTONS
-	or [hl]
-	ld [CurInput], a
-	ret
-
-.data_802e8
-	db D_DOWN, D_UP, D_LEFT, D_RIGHT
-; 802ec
-
-GetMovementAction: ; 802ec
-; Poll player input and update movement info.
-
-	ld hl, .table
-	ld de, .table2 - .table1
-	ld a, [CurInput]
-	bit 7, a
-	jr nz, .down
-	bit 6, a
-	jr nz, .up
-	bit 5, a
-	jr nz, .left
-	bit 4, a
-	jr nz, .right
-; Standing
-	jr .update
-
-.down 	add hl, de
-.up   	add hl, de
-.left 	add hl, de
-.right	add hl, de
-
-.update
-	ld a, [hli]
-	ld [WalkingDirection], a
-	ld a, [hli]
-	ld [FacingDirection], a
-	ld a, [hli]
-	ld [WalkingX], a
-	ld a, [hli]
-	ld [WalkingY], a
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [hl]
-	ld [WalkingTile], a
-	ret
-
-.table
-; struct:
-;	walk direction
-;	facing
-;	x movement
-;	y movement
-;	tile collision pointer
-.table1
-	db STANDING, FACE_CURRENT, 0, 0
-	dw PlayerNextTile
-.table2
-	db RIGHT, FACE_RIGHT,  1,  0
-	dw TileRight
-	db LEFT,  FACE_LEFT,  -1,  0
-	dw TileLeft
-	db UP,    FACE_UP,     0, -1
-	dw TileUp
-	db DOWN,  FACE_DOWN,   0,  1
-	dw TileDown
-; 80341
-
-IsNPCInFront: ; 80341
-; Returns 0 if there is an NPC in front that you can't move
-; Returns 1 if there is no NPC in front
-; Returns 2 if there is a movable NPC in front
-	ld a, 0
-	ld [hMapObjectIndexBuffer], a
-; Load the next X coordinate into d
-	ld a, [PlayerNextMapX]
-	ld d, a
-	ld a, [WalkingX]
-	add d
-	ld d, a
-; Load the next Y coordinate into e
-	ld a, [PlayerNextMapY]
-	ld e, a
-	ld a, [WalkingY]
-	add e
-	ld e, a
-; Find an object struct with coordinates equal to d,e
-	ld bc, ObjectStructs ; redundant
-	callba IsNPCAtCoord
-	jr nc, .nope
-	call Function8036f
-	jr c, .no_bump
-
-; .bump
-	xor a
-	ret
-
-.nope
-	ld a, 1
-	ret
-
-.no_bump
-	ld a, 2
-	ret
-; 8036f
-
-Function8036f: ; 8036f
-
-	ld hl, BikeFlags
-	bit 0, [hl] ; using strength
-	jr z, .nope
-
-	ld hl, OBJECT_DIRECTION_WALKING
-	add hl, bc
-	ld a, [hl]
-	cp STANDING
-	jr nz, .nope
-
-	ld hl, OBJECT_PALETTE
-	add hl, bc
-	bit 6, [hl]
-	jr z, .nope
-
-	ld hl, OBJECT_FLAGS2
-	add hl, bc
-	set 2, [hl]
-
-	ld a, [WalkingDirection]
-	ld d, a
-	ld hl, OBJECT_RANGE
-	add hl, bc
-	ld a, [hl]
-	and $fc
-	or d
-	ld [hl], a
-
-	scf
-	ret
-
-.nope
-	xor a
-	ret
-; 8039e
-
-CheckLandPermissions: ; 8039e
-; Return 0 if walking onto land and tile permissions allow it.
-; Otherwise, return carry.
-
-	ld a, [TilePermissions]
-	ld d, a
-	ld a, [FacingDirection]
-	and d
-	jr nz, .NotWalkable
-
-	ld a, [WalkingTile]
-	call CheckWalkable
-	jr c, .NotWalkable
-
-	xor a
-	ret
-
-.NotWalkable
-	scf
-	ret
-; 803b4
-
-CheckWaterPermissions: ; 803b4
-; Return 0 if moving in water, or 1 if moving onto land.
-; Otherwise, return carry.
-
-	ld a, [TilePermissions]
-	ld d, a
-	ld a, [FacingDirection]
-	and d
-	jr nz, .NotSurfable
-
-	ld a, [WalkingTile]
-	call CheckSurfable
-	jr c, .NotSurfable
-
-	and a
-	ret
-
-.NotSurfable
-	scf
-	ret
-; 803ca
-
-CheckRiding: ; 803ca
-
-	ld a, [PlayerState]
-	cp PLAYER_BIKE
-	ret z
-	cp PLAYER_SLIP
-	ret
-; 803d3
-
-CheckWalkable: ; 803d3
-; Return 0 if tile a is land. Otherwise, return carry.
-
-	call GetTileCollision
-	and a ; land
-	ret z
-	scf
-	ret
-; 803da
-
-CheckSurfable: ; 803da
-; Return 0 if tile a is water, or 1 if land.
-; Otherwise, return carry.
-
-	call GetTileCollision
-	cp 1
-	jr z, .Water
-
-; Can walk back onto land from water.
-	and a
-	jr z, .Land
-
-	jr .Neither
-
-.Water
-	xor a
-	ret
-
-.Land
-	ld a, 1
-	and a
-	ret
-
-.Neither
-	scf
-	ret
-; 803ee
-
-PlayBump: ; 803ee
-
-	call CheckSFX
-	ret c
-	ld de, SFX_BUMP
-	call PlaySFX
-	ret
-; 803f9
-
-WaterToLandSprite: ; 803f9
-	push bc
-	ld a, PLAYER_NORMAL
-	ld [PlayerState], a
-	call ReplaceKrisSprite ; UpdateSprites
-	pop bc
-	ret
-; 80404
-
-CheckStandingOnIce:: ; 80404
-	ld a, [wd04e]
-	cp 0
-	jr z, .nope
-	cp $f0
-	jr z, .nope
-	ld a, [PlayerNextTile]
-	call CheckIceTile
-	jr nc, .yep
-	ld a, [PlayerState]
-	cp PLAYER_SLIP
-	jr nz, .nope
-
-.yep
-	scf
-	ret
-
-.nope
-	and a
-	ret
-; 80422
-
-Function80422:: ; 80422
-	ld hl, wc2de
-	ld a, movement_step_sleep_1
-	cp [hl]
-	ret z
-
-	ld [hl], a
-	ld a, 0
-	ld [wd04e], a
-	ret
-; 80430
+INCLUDE "engine/player_movement.asm"
 
 INCLUDE "engine/engine_flags.asm"
 ; 80648
--- a/misc/mobile_22_2.asm
+++ b/misc/mobile_22_2.asm
@@ -542,9 +542,6 @@
 	; CARD FOLDER open.@ @
 	text_jump UnknownText_0x1bc288
 	start_asm
-; 0x8b651
-
-Function8b651: ; 8b651
 	ld de, SFX_TWINKLE
 	call PlaySFX
 	call WaitSFX
--- a/wram.asm
+++ b/wram.asm
@@ -385,14 +385,14 @@
 ScriptVar:: ; c2dd
 	ds 1
 
-wc2de:: ds 1
-wc2df:: ds 1
+wPlayerNextMovement:: ds 1
+wPlayerMovement:: ds 1
 	ds 2
+wc2e2::
 wMovementPerson:: ds 1
 wMovementDataPointer:: ds 3 ; dba
 wc2e6:: ds 4
-wc2ea:: ds 1
-wc2eb::
+wMovementByteWasControlSwitch:: ds 1
 wMovementPointer:: ds 2 ; c2eb
 	ds 3
 
@@ -2601,9 +2601,8 @@
 wObjectFollow_Leader:: ds 1
 wObjectFollow_Follower:: ds 1
 wCenteredObject:: ds 1
-wd4d0:: ds 1
-wd4d1:: ds 1
-	ds 4
+wFollowerMovementQueueLength:: ds 1
+wFollowMovementQueue:: ds 5
 
 ObjectStructs:: ; d4d6
 object_struct: MACRO