diff options
-rw-r--r-- | engine/overworld/events.asm | 612 | ||||
-rw-r--r-- | engine/overworld/events_2.asm | 613 |
2 files changed, 611 insertions, 614 deletions
diff --git a/engine/overworld/events.asm b/engine/overworld/events.asm index dfde757d9..707d31e66 100644 --- a/engine/overworld/events.asm +++ b/engine/overworld/events.asm @@ -1025,4 +1025,614 @@ ChangeDirectionScript: ; 9 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 diff --git a/engine/overworld/events_2.asm b/engine/overworld/events_2.asm deleted file mode 100644 index 436e2f083..000000000 --- a/engine/overworld/events_2.asm +++ /dev/null @@ -1,613 +0,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 |