shithub: pokecrystal

Download patch

ref: 00c2dba157243c4b3a65988c8034171f356cddf0
parent: 67152eab98f826c22d7ae1be1aa0310e81c3d77b
author: Rangi <remy.oukaour+rangi42@gmail.com>
date: Mon Jun 25 09:48:16 EDT 2018

Merge events_2.asm with events.asm

(events_2.asm was only separate because scripting.asm intervenes; but other files have a similar "code / INCLUDE self-contained code / more code" structure to this)

--- a/engine/overworld/events.asm
+++ b/engine/overworld/events.asm
@@ -1025,4 +1025,614 @@
 
 INCLUDE "engine/overworld/scripting.asm"
 
-INCLUDE "engine/overworld/events_2.asm"
+WarpToSpawnPoint::
+	ld hl, wStatusFlags2
+	res STATUSFLAGS2_SAFARI_GAME_F, [hl]
+	res STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
+	ret
+
+RunMemScript::
+; If there is no script here, we don't need to be here.
+	ld a, [wMapReentryScriptQueueFlag]
+	and a
+	ret z
+; Execute the script at (wMapReentryScriptBank):(wMapReentryScriptAddress).
+	ld hl, wMapReentryScriptAddress
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [wMapReentryScriptBank]
+	call CallScript
+	scf
+; Clear the buffer for the next script.
+	push af
+	xor a
+	ld hl, wMapReentryScriptQueueFlag
+	ld bc, 8
+	call ByteFill
+	pop af
+	ret
+
+LoadScriptBDE::
+; If there's already a script here, don't overwrite.
+	ld hl, wMapReentryScriptQueueFlag
+	ld a, [hl]
+	and a
+	ret nz
+; Set the flag
+	ld [hl], 1
+	inc hl
+; Load the script pointer b:de into (wMapReentryScriptBank):(wMapReentryScriptAddress)
+	ld [hl], b
+	inc hl
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	scf
+	ret
+
+TryTileCollisionEvent::
+	call GetFacingTileCoord
+	ld [wEngineBuffer1], a
+	ld c, a
+	farcall CheckFacingTileForStdScript
+	jr c, .done
+
+	call CheckCutTreeTile
+	jr nz, .whirlpool
+	farcall TryCutOW
+	jr .done
+
+.whirlpool
+	ld a, [wEngineBuffer1]
+	call CheckWhirlpoolTile
+	jr nz, .waterfall
+	farcall TryWhirlpoolOW
+	jr .done
+
+.waterfall
+	ld a, [wEngineBuffer1]
+	call CheckWaterfallTile
+	jr nz, .headbutt
+	farcall TryWaterfallOW
+	jr .done
+
+.headbutt
+	ld a, [wEngineBuffer1]
+	call CheckHeadbuttTreeTile
+	jr nz, .surf
+	farcall TryHeadbuttOW
+	jr c, .done
+	jr .noevent
+
+.surf
+	farcall TrySurfOW
+	jr nc, .noevent
+	jr .done
+
+.noevent
+	xor a
+	ret
+
+.done
+	call PlayClickSFX
+	ld a, $ff
+	scf
+	ret
+
+RandomEncounter::
+; Random encounter
+
+	call CheckWildEncounterCooldown
+	jr c, .nope
+	call CanUseSweetScent
+	jr nc, .nope
+	ld hl, wStatusFlags2
+	bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
+	jr nz, .bug_contest
+	farcall TryWildEncounter
+	jr nz, .nope
+	jr .ok
+
+.bug_contest
+	call _TryWildEncounter_BugContest
+	jr nc, .nope
+	jr .ok_bug_contest
+
+.nope
+	ld a, 1
+	and a
+	ret
+
+.ok
+	ld a, BANK(WildBattleScript)
+	ld hl, WildBattleScript
+	jr .done
+
+.ok_bug_contest
+	ld a, BANK(BugCatchingContestBattleScript)
+	ld hl, BugCatchingContestBattleScript
+	jr .done
+
+.done
+	call CallScript
+	scf
+	ret
+
+WildBattleScript:
+	randomwildmon
+	startbattle
+	reloadmapafterbattle
+	end
+
+CanUseSweetScent::
+	ld hl, wStatusFlags
+	bit STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl]
+	jr nz, .no
+	ld a, [wEnvironment]
+	cp CAVE
+	jr z, .ice_check
+	cp DUNGEON
+	jr z, .ice_check
+	farcall CheckGrassCollision
+	jr nc, .no
+
+.ice_check
+	ld a, [wPlayerStandingTile]
+	call CheckIceTile
+	jr z, .no
+	scf
+	ret
+
+.no
+	and a
+	ret
+
+_TryWildEncounter_BugContest:
+	call TryWildEncounter_BugContest
+	ret nc
+	call ChooseWildEncounter_BugContest
+	farcall CheckRepelEffect
+	ret
+
+ChooseWildEncounter_BugContest::
+; Pick a random mon out of ContestMons.
+
+.loop
+	call Random
+	cp 100 << 1
+	jr nc, .loop
+	srl a
+
+	ld hl, ContestMons
+	ld de, 4
+.CheckMon:
+	sub [hl]
+	jr c, .GotMon
+	add hl, de
+	jr .CheckMon
+
+.GotMon:
+	inc hl
+
+; Species
+	ld a, [hli]
+	ld [wTempWildMonSpecies], a
+
+; Min level
+	ld a, [hli]
+	ld d, a
+
+; Max level
+	ld a, [hl]
+
+	sub d
+	jr nz, .RandomLevel
+
+; If min and max are the same.
+	ld a, d
+	jr .GotLevel
+
+.RandomLevel:
+; Get a random level between the min and max.
+	ld c, a
+	inc c
+	call Random
+	ld a, [hRandomAdd]
+	call SimpleDivide
+	add d
+
+.GotLevel:
+	ld [wCurPartyLevel], a
+
+	xor a
+	ret
+
+TryWildEncounter_BugContest:
+	ld a, [wPlayerStandingTile]
+	call CheckSuperTallGrassTile
+	ld b, 40 percent
+	jr z, .ok
+	ld b, 20 percent
+
+.ok
+	farcall ApplyMusicEffectOnEncounterRate
+	farcall ApplyCleanseTagEffectOnEncounterRate
+	call Random
+	ld a, [hRandomAdd]
+	cp b
+	ret c
+	ld a, 1
+	and a
+	ret
+
+INCLUDE "data/wild/bug_contest_mons.asm"
+
+DoBikeStep::
+	nop
+	nop
+	; If the bike shop owner doesn't have our number, or
+	; if we've already gotten the call, we don't have to
+	; be here.
+	ld hl, wStatusFlags2
+	bit STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl]
+	jr z, .NoCall
+
+	; If we're not on the bike, we don't have to be here.
+	ld a, [wPlayerState]
+	cp PLAYER_BIKE
+	jr nz, .NoCall
+
+	; If we're not in an area of phone service, we don't
+	; have to be here.
+	call GetMapPhoneService
+	and a
+	jr nz, .NoCall
+
+	; Check the bike step count and check whether we've
+	; taken 65536 of them yet.
+	ld hl, wBikeStep
+	ld a, [hli]
+	ld d, a
+	ld e, [hl]
+	cp 255
+	jr nz, .increment
+	ld a, e
+	cp 255
+	jr z, .dont_increment
+
+.increment
+	inc de
+	ld [hl], e
+	dec hl
+	ld [hl], d
+
+.dont_increment
+	; If we've taken at least 1024 steps, have the bike
+	;  shop owner try to call us.
+	ld a, d
+	cp HIGH(1024)
+	jr c, .NoCall
+
+	; If a call has already been queued, don't overwrite
+	; that call.
+	ld a, [wSpecialPhoneCallID]
+	and a
+	jr nz, .NoCall
+
+	; Queue the call.
+	ld a, SPECIALCALL_BIKESHOP
+	ld [wSpecialPhoneCallID], a
+	xor a
+	ld [wSpecialPhoneCallID + 1], a
+	ld hl, wStatusFlags2
+	res STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl]
+	scf
+	ret
+
+.NoCall:
+	xor a
+	ret
+
+ClearCmdQueue::
+	ld hl, wCmdQueue
+	ld de, 6
+	ld c, 4
+	xor a
+.loop
+	ld [hl], a
+	add hl, de
+	dec c
+	jr nz, .loop
+	ret
+
+HandleCmdQueue::
+	ld hl, wCmdQueue
+	xor a
+.loop
+	ld [hMapObjectIndexBuffer], a
+	ld a, [hl]
+	and a
+	jr z, .skip
+	push hl
+	ld b, h
+	ld c, l
+	call HandleQueuedCommand
+	pop hl
+
+.skip
+	ld de, CMDQUEUE_ENTRY_SIZE
+	add hl, de
+	ld a, [hMapObjectIndexBuffer]
+	inc a
+	cp CMDQUEUE_CAPACITY
+	jr nz, .loop
+	ret
+
+Unreferenced_GetNthCmdQueueEntry:
+	ld hl, wCmdQueue
+	ld bc, CMDQUEUE_ENTRY_SIZE
+	call AddNTimes
+	ld b, h
+	ld c, l
+	ret
+
+WriteCmdQueue::
+	push bc
+	push de
+	call .GetNextEmptyEntry
+	ld d, h
+	ld e, l
+	pop hl
+	pop bc
+	ret c
+	ld a, b
+	ld bc, CMDQUEUE_ENTRY_SIZE - 1
+	call FarCopyBytes
+	xor a
+	ld [hl], a
+	ret
+
+.GetNextEmptyEntry:
+	ld hl, wCmdQueue
+	ld de, CMDQUEUE_ENTRY_SIZE
+	ld c, CMDQUEUE_CAPACITY
+.loop
+	ld a, [hl]
+	and a
+	jr z, .done
+	add hl, de
+	dec c
+	jr nz, .loop
+	scf
+	ret
+
+.done
+	ld a, CMDQUEUE_CAPACITY
+	sub c
+	and a
+	ret
+
+DelCmdQueue::
+	ld hl, wCmdQueue
+	ld de, CMDQUEUE_ENTRY_SIZE
+	ld c, CMDQUEUE_CAPACITY
+.loop
+	ld a, [hl]
+	cp b
+	jr z, .done
+	add hl, de
+	dec c
+	jr nz, .loop
+	and a
+	ret
+
+.done
+	xor a
+	ld [hl], a
+	scf
+	ret
+
+_DelCmdQueue:
+	ld hl, CMDQUEUE_TYPE
+	add hl, bc
+	ld [hl], 0
+	ret
+
+HandleQueuedCommand:
+	ld hl, CMDQUEUE_TYPE
+	add hl, bc
+	ld a, [hl]
+	cp 5
+	jr c, .okay
+	xor a
+
+.okay
+	ld e, a
+	ld d, 0
+	ld hl, .Jumptable
+	add hl, de
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	push af
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	pop af
+	rst FarCall
+	ret
+
+.Jumptable:
+	dba CmdQueue_Null
+	dba CmdQueue_Null2
+	dba CmdQueue_StoneTable
+	dba CmdQueue_Type3
+	dba CmdQueue_Type4
+
+CmdQueueAnonymousJumptable:
+	ld hl, CMDQUEUE_05
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	rst JumpTable
+	ret
+
+CmdQueueAnonJT_Increment:
+	ld hl, CMDQUEUE_05
+	add hl, bc
+	inc [hl]
+	ret
+
+CmdQueueAnonJT_Decrement:
+	ld hl, CMDQUEUE_05
+	add hl, bc
+	dec [hl]
+	ret
+
+CmdQueue_Null:
+	ret
+
+CmdQueue_Null2:
+	call ret_2f3e
+	ret
+
+CmdQueue_Type4:
+	call CmdQueueAnonymousJumptable
+	; anonymous dw
+	dw .zero
+	dw .one
+
+.zero
+	ld a, [hSCY]
+	ld hl, 4
+	add hl, bc
+	ld [hl], a
+	call CmdQueueAnonJT_Increment
+.one
+	ld hl, 1
+	add hl, bc
+	ld a, [hl]
+	dec a
+	ld [hl], a
+	jr z, .finish
+	and $1
+	jr z, .add
+	ld hl, 2
+	add hl, bc
+	ld a, [hSCY]
+	sub [hl]
+	ld [hSCY], a
+	ret
+
+.add
+	ld hl, 2
+	add hl, bc
+	ld a, [hSCY]
+	add [hl]
+	ld [hSCY], a
+	ret
+
+.finish
+	ld hl, 4
+	add hl, bc
+	ld a, [hl]
+	ld [hSCY], a
+	call _DelCmdQueue
+	ret
+
+CmdQueue_Type3:
+	call CmdQueueAnonymousJumptable
+	; anonymous dw
+	dw .zero
+	dw .one
+	dw .two
+
+.zero
+	call .IsPlayerFacingDown
+	jr z, .PlayerNotFacingDown
+	call CmdQueueAnonJT_Increment
+.one
+	call .IsPlayerFacingDown
+	jr z, .PlayerNotFacingDown
+	call CmdQueueAnonJT_Increment
+
+	ld hl, 2
+	add hl, bc
+	ld a, [hl]
+	ld [wd173], a
+	ret
+
+.two
+	call .IsPlayerFacingDown
+	jr z, .PlayerNotFacingDown
+	call CmdQueueAnonJT_Decrement
+
+	ld hl, 3
+	add hl, bc
+	ld a, [hl]
+	ld [wd173], a
+	ret
+
+.PlayerNotFacingDown:
+	ld a, $7f
+	ld [wd173], a
+	ld hl, 5
+	add hl, bc
+	ld [hl], 0
+	ret
+
+.IsPlayerFacingDown:
+	push bc
+	ld bc, wPlayerStruct
+	call GetSpriteDirection
+	and a
+	pop bc
+	ret
+
+CmdQueue_StoneTable:
+	ld de, wPlayerStruct
+	ld a, NUM_OBJECT_STRUCTS
+.loop
+	push af
+
+	ld hl, OBJECT_SPRITE
+	add hl, de
+	ld a, [hl]
+	and a
+	jr z, .next
+
+	ld hl, OBJECT_MOVEMENTTYPE
+	add hl, de
+	ld a, [hl]
+	cp SPRITEMOVEDATA_STRENGTH_BOULDER
+	jr nz, .next
+
+	ld hl, OBJECT_NEXT_TILE
+	add hl, de
+	ld a, [hl]
+	call CheckPitTile
+	jr nz, .next
+
+	ld hl, OBJECT_DIRECTION_WALKING
+	add hl, de
+	ld a, [hl]
+	cp STANDING
+	jr nz, .next
+	call HandleStoneQueue
+	jr c, .fall_down_hole
+
+.next
+	ld hl, OBJECT_STRUCT_LENGTH
+	add hl, de
+	ld d, h
+	ld e, l
+
+	pop af
+	dec a
+	jr nz, .loop
+	ret
+
+.fall_down_hole
+	pop af
+	ret
--- a/engine/overworld/events_2.asm
+++ /dev/null
@@ -1,613 +1,0 @@
-; More overworld event handling.
-
-WarpToSpawnPoint::
-	ld hl, wStatusFlags2
-	res STATUSFLAGS2_SAFARI_GAME_F, [hl]
-	res STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
-	ret
-
-RunMemScript::
-; If there is no script here, we don't need to be here.
-	ld a, [wMapReentryScriptQueueFlag]
-	and a
-	ret z
-; Execute the script at (wMapReentryScriptBank):(wMapReentryScriptAddress).
-	ld hl, wMapReentryScriptAddress
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [wMapReentryScriptBank]
-	call CallScript
-	scf
-; Clear the buffer for the next script.
-	push af
-	xor a
-	ld hl, wMapReentryScriptQueueFlag
-	ld bc, 8
-	call ByteFill
-	pop af
-	ret
-
-LoadScriptBDE::
-; If there's already a script here, don't overwrite.
-	ld hl, wMapReentryScriptQueueFlag
-	ld a, [hl]
-	and a
-	ret nz
-; Set the flag
-	ld [hl], 1
-	inc hl
-; Load the script pointer b:de into (wMapReentryScriptBank):(wMapReentryScriptAddress)
-	ld [hl], b
-	inc hl
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	scf
-	ret
-
-TryTileCollisionEvent::
-	call GetFacingTileCoord
-	ld [wEngineBuffer1], a
-	ld c, a
-	farcall CheckFacingTileForStdScript
-	jr c, .done
-
-	call CheckCutTreeTile
-	jr nz, .whirlpool
-	farcall TryCutOW
-	jr .done
-
-.whirlpool
-	ld a, [wEngineBuffer1]
-	call CheckWhirlpoolTile
-	jr nz, .waterfall
-	farcall TryWhirlpoolOW
-	jr .done
-
-.waterfall
-	ld a, [wEngineBuffer1]
-	call CheckWaterfallTile
-	jr nz, .headbutt
-	farcall TryWaterfallOW
-	jr .done
-
-.headbutt
-	ld a, [wEngineBuffer1]
-	call CheckHeadbuttTreeTile
-	jr nz, .surf
-	farcall TryHeadbuttOW
-	jr c, .done
-	jr .noevent
-
-.surf
-	farcall TrySurfOW
-	jr nc, .noevent
-	jr .done
-
-.noevent
-	xor a
-	ret
-
-.done
-	call PlayClickSFX
-	ld a, $ff
-	scf
-	ret
-
-RandomEncounter::
-; Random encounter
-
-	call CheckWildEncounterCooldown
-	jr c, .nope
-	call CanUseSweetScent
-	jr nc, .nope
-	ld hl, wStatusFlags2
-	bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
-	jr nz, .bug_contest
-	farcall TryWildEncounter
-	jr nz, .nope
-	jr .ok
-
-.bug_contest
-	call _TryWildEncounter_BugContest
-	jr nc, .nope
-	jr .ok_bug_contest
-
-.nope
-	ld a, 1
-	and a
-	ret
-
-.ok
-	ld a, BANK(WildBattleScript)
-	ld hl, WildBattleScript
-	jr .done
-
-.ok_bug_contest
-	ld a, BANK(BugCatchingContestBattleScript)
-	ld hl, BugCatchingContestBattleScript
-	jr .done
-
-.done
-	call CallScript
-	scf
-	ret
-
-WildBattleScript:
-	randomwildmon
-	startbattle
-	reloadmapafterbattle
-	end
-
-CanUseSweetScent::
-	ld hl, wStatusFlags
-	bit STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl]
-	jr nz, .no
-	ld a, [wEnvironment]
-	cp CAVE
-	jr z, .ice_check
-	cp DUNGEON
-	jr z, .ice_check
-	farcall CheckGrassCollision
-	jr nc, .no
-
-.ice_check
-	ld a, [wPlayerStandingTile]
-	call CheckIceTile
-	jr z, .no
-	scf
-	ret
-
-.no
-	and a
-	ret
-
-_TryWildEncounter_BugContest:
-	call TryWildEncounter_BugContest
-	ret nc
-	call ChooseWildEncounter_BugContest
-	farcall CheckRepelEffect
-	ret
-
-ChooseWildEncounter_BugContest::
-; Pick a random mon out of ContestMons.
-
-.loop
-	call Random
-	cp 100 << 1
-	jr nc, .loop
-	srl a
-
-	ld hl, ContestMons
-	ld de, 4
-.CheckMon:
-	sub [hl]
-	jr c, .GotMon
-	add hl, de
-	jr .CheckMon
-
-.GotMon:
-	inc hl
-
-; Species
-	ld a, [hli]
-	ld [wTempWildMonSpecies], a
-
-; Min level
-	ld a, [hli]
-	ld d, a
-
-; Max level
-	ld a, [hl]
-
-	sub d
-	jr nz, .RandomLevel
-
-; If min and max are the same.
-	ld a, d
-	jr .GotLevel
-
-.RandomLevel:
-; Get a random level between the min and max.
-	ld c, a
-	inc c
-	call Random
-	ld a, [hRandomAdd]
-	call SimpleDivide
-	add d
-
-.GotLevel:
-	ld [wCurPartyLevel], a
-
-	xor a
-	ret
-
-TryWildEncounter_BugContest:
-	ld a, [wPlayerStandingTile]
-	call CheckSuperTallGrassTile
-	ld b, 40 percent
-	jr z, .ok
-	ld b, 20 percent
-
-.ok
-	farcall ApplyMusicEffectOnEncounterRate
-	farcall ApplyCleanseTagEffectOnEncounterRate
-	call Random
-	ld a, [hRandomAdd]
-	cp b
-	ret c
-	ld a, 1
-	and a
-	ret
-
-INCLUDE "data/wild/bug_contest_mons.asm"
-
-DoBikeStep::
-	nop
-	nop
-	; If the bike shop owner doesn't have our number, or
-	; if we've already gotten the call, we don't have to
-	; be here.
-	ld hl, wStatusFlags2
-	bit STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl]
-	jr z, .NoCall
-
-	; If we're not on the bike, we don't have to be here.
-	ld a, [wPlayerState]
-	cp PLAYER_BIKE
-	jr nz, .NoCall
-
-	; If we're not in an area of phone service, we don't
-	; have to be here.
-	call GetMapPhoneService
-	and a
-	jr nz, .NoCall
-
-	; Check the bike step count and check whether we've
-	; taken 65536 of them yet.
-	ld hl, wBikeStep
-	ld a, [hli]
-	ld d, a
-	ld e, [hl]
-	cp 255
-	jr nz, .increment
-	ld a, e
-	cp 255
-	jr z, .dont_increment
-
-.increment
-	inc de
-	ld [hl], e
-	dec hl
-	ld [hl], d
-
-.dont_increment
-	; If we've taken at least 1024 steps, have the bike
-	;  shop owner try to call us.
-	ld a, d
-	cp HIGH(1024)
-	jr c, .NoCall
-
-	; If a call has already been queued, don't overwrite
-	; that call.
-	ld a, [wSpecialPhoneCallID]
-	and a
-	jr nz, .NoCall
-
-	; Queue the call.
-	ld a, SPECIALCALL_BIKESHOP
-	ld [wSpecialPhoneCallID], a
-	xor a
-	ld [wSpecialPhoneCallID + 1], a
-	ld hl, wStatusFlags2
-	res STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl]
-	scf
-	ret
-
-.NoCall:
-	xor a
-	ret
-
-ClearCmdQueue::
-	ld hl, wCmdQueue
-	ld de, 6
-	ld c, 4
-	xor a
-.loop
-	ld [hl], a
-	add hl, de
-	dec c
-	jr nz, .loop
-	ret
-
-HandleCmdQueue::
-	ld hl, wCmdQueue
-	xor a
-.loop
-	ld [hMapObjectIndexBuffer], a
-	ld a, [hl]
-	and a
-	jr z, .skip
-	push hl
-	ld b, h
-	ld c, l
-	call HandleQueuedCommand
-	pop hl
-
-.skip
-	ld de, CMDQUEUE_ENTRY_SIZE
-	add hl, de
-	ld a, [hMapObjectIndexBuffer]
-	inc a
-	cp CMDQUEUE_CAPACITY
-	jr nz, .loop
-	ret
-
-Unreferenced_GetNthCmdQueueEntry:
-	ld hl, wCmdQueue
-	ld bc, CMDQUEUE_ENTRY_SIZE
-	call AddNTimes
-	ld b, h
-	ld c, l
-	ret
-
-WriteCmdQueue::
-	push bc
-	push de
-	call .GetNextEmptyEntry
-	ld d, h
-	ld e, l
-	pop hl
-	pop bc
-	ret c
-	ld a, b
-	ld bc, CMDQUEUE_ENTRY_SIZE - 1
-	call FarCopyBytes
-	xor a
-	ld [hl], a
-	ret
-
-.GetNextEmptyEntry:
-	ld hl, wCmdQueue
-	ld de, CMDQUEUE_ENTRY_SIZE
-	ld c, CMDQUEUE_CAPACITY
-.loop
-	ld a, [hl]
-	and a
-	jr z, .done
-	add hl, de
-	dec c
-	jr nz, .loop
-	scf
-	ret
-
-.done
-	ld a, CMDQUEUE_CAPACITY
-	sub c
-	and a
-	ret
-
-DelCmdQueue::
-	ld hl, wCmdQueue
-	ld de, CMDQUEUE_ENTRY_SIZE
-	ld c, CMDQUEUE_CAPACITY
-.loop
-	ld a, [hl]
-	cp b
-	jr z, .done
-	add hl, de
-	dec c
-	jr nz, .loop
-	and a
-	ret
-
-.done
-	xor a
-	ld [hl], a
-	scf
-	ret
-
-_DelCmdQueue:
-	ld hl, CMDQUEUE_TYPE
-	add hl, bc
-	ld [hl], 0
-	ret
-
-HandleQueuedCommand:
-	ld hl, CMDQUEUE_TYPE
-	add hl, bc
-	ld a, [hl]
-	cp 5
-	jr c, .okay
-	xor a
-
-.okay
-	ld e, a
-	ld d, 0
-	ld hl, .Jumptable
-	add hl, de
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	push af
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	pop af
-	rst FarCall
-	ret
-
-.Jumptable:
-	dba CmdQueue_Null
-	dba CmdQueue_Null2
-	dba CmdQueue_StoneTable
-	dba CmdQueue_Type3
-	dba CmdQueue_Type4
-
-CmdQueueAnonymousJumptable:
-	ld hl, CMDQUEUE_05
-	add hl, bc
-	ld a, [hl]
-	pop hl
-	rst JumpTable
-	ret
-
-CmdQueueAnonJT_Increment:
-	ld hl, CMDQUEUE_05
-	add hl, bc
-	inc [hl]
-	ret
-
-CmdQueueAnonJT_Decrement:
-	ld hl, CMDQUEUE_05
-	add hl, bc
-	dec [hl]
-	ret
-
-CmdQueue_Null:
-	ret
-
-CmdQueue_Null2:
-	call ret_2f3e
-	ret
-
-CmdQueue_Type4:
-	call CmdQueueAnonymousJumptable
-	; anonymous dw
-	dw .zero
-	dw .one
-
-.zero
-	ld a, [hSCY]
-	ld hl, 4
-	add hl, bc
-	ld [hl], a
-	call CmdQueueAnonJT_Increment
-.one
-	ld hl, 1
-	add hl, bc
-	ld a, [hl]
-	dec a
-	ld [hl], a
-	jr z, .finish
-	and $1
-	jr z, .add
-	ld hl, 2
-	add hl, bc
-	ld a, [hSCY]
-	sub [hl]
-	ld [hSCY], a
-	ret
-
-.add
-	ld hl, 2
-	add hl, bc
-	ld a, [hSCY]
-	add [hl]
-	ld [hSCY], a
-	ret
-
-.finish
-	ld hl, 4
-	add hl, bc
-	ld a, [hl]
-	ld [hSCY], a
-	call _DelCmdQueue
-	ret
-
-CmdQueue_Type3:
-	call CmdQueueAnonymousJumptable
-	; anonymous dw
-	dw .zero
-	dw .one
-	dw .two
-
-.zero
-	call .IsPlayerFacingDown
-	jr z, .PlayerNotFacingDown
-	call CmdQueueAnonJT_Increment
-.one
-	call .IsPlayerFacingDown
-	jr z, .PlayerNotFacingDown
-	call CmdQueueAnonJT_Increment
-
-	ld hl, 2
-	add hl, bc
-	ld a, [hl]
-	ld [wd173], a
-	ret
-
-.two
-	call .IsPlayerFacingDown
-	jr z, .PlayerNotFacingDown
-	call CmdQueueAnonJT_Decrement
-
-	ld hl, 3
-	add hl, bc
-	ld a, [hl]
-	ld [wd173], a
-	ret
-
-.PlayerNotFacingDown:
-	ld a, $7f
-	ld [wd173], a
-	ld hl, 5
-	add hl, bc
-	ld [hl], 0
-	ret
-
-.IsPlayerFacingDown:
-	push bc
-	ld bc, wPlayerStruct
-	call GetSpriteDirection
-	and a
-	pop bc
-	ret
-
-CmdQueue_StoneTable:
-	ld de, wPlayerStruct
-	ld a, NUM_OBJECT_STRUCTS
-.loop
-	push af
-
-	ld hl, OBJECT_SPRITE
-	add hl, de
-	ld a, [hl]
-	and a
-	jr z, .next
-
-	ld hl, OBJECT_MOVEMENTTYPE
-	add hl, de
-	ld a, [hl]
-	cp SPRITEMOVEDATA_STRENGTH_BOULDER
-	jr nz, .next
-
-	ld hl, OBJECT_NEXT_TILE
-	add hl, de
-	ld a, [hl]
-	call CheckPitTile
-	jr nz, .next
-
-	ld hl, OBJECT_DIRECTION_WALKING
-	add hl, de
-	ld a, [hl]
-	cp STANDING
-	jr nz, .next
-	call HandleStoneQueue
-	jr c, .fall_down_hole
-
-.next
-	ld hl, OBJECT_STRUCT_LENGTH
-	add hl, de
-	ld d, h
-	ld e, l
-
-	pop af
-	dec a
-	jr nz, .loop
-	ret
-
-.fall_down_hole
-	pop af
-	ret