diff options
Diffstat (limited to 'engine/overworld/advance_player_sprite.asm')
-rw-r--r-- | engine/overworld/advance_player_sprite.asm | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/engine/overworld/advance_player_sprite.asm b/engine/overworld/advance_player_sprite.asm new file mode 100644 index 00000000..4ebdac84 --- /dev/null +++ b/engine/overworld/advance_player_sprite.asm @@ -0,0 +1,244 @@ +_AdvancePlayerSprite:: + ld a, [wSpritePlayerStateData1YStepVector] + ld b, a + ld a, [wSpritePlayerStateData1XStepVector] + ld c, a + ld hl, wWalkCounter ; walking animation counter + dec [hl] + jr nz, .afterUpdateMapCoords +; if it's the end of the animation, update the player's map coordinates + ld hl, wPikachuOverworldStateFlags + res 5, [hl] + ld a, [wYCoord] + add b + ld [wYCoord], a + ld a, [wXCoord] + add c + ld [wXCoord], a +.afterUpdateMapCoords + ld a, [wWalkCounter] ; walking animation counter + cp $07 + jp nz, .scrollBackgroundAndSprites +; if this is the first iteration of the animation + ld a, c + cp $01 + jr nz, .checkIfMovingWest +; moving east + ld a, [wMapViewVRAMPointer] + ld e, a + and $e0 + ld d, a + ld a, e + add $02 + and $1f + or d + ld [wMapViewVRAMPointer], a + jr .adjustXCoordWithinBlock +.checkIfMovingWest + cp $ff + jr nz, .checkIfMovingSouth +; moving west + ld a, [wMapViewVRAMPointer] + ld e, a + and $e0 + ld d, a + ld a, e + sub $02 + and $1f + or d + ld [wMapViewVRAMPointer], a + jr .adjustXCoordWithinBlock +.checkIfMovingSouth + ld a, b + cp $01 + jr nz, .checkIfMovingNorth +; moving south + ld a, [wMapViewVRAMPointer] + add $40 + ld [wMapViewVRAMPointer], a + jr nc, .adjustXCoordWithinBlock + ld a, [wMapViewVRAMPointer + 1] + inc a + and $03 + or $98 + ld [wMapViewVRAMPointer + 1], a + jr .adjustXCoordWithinBlock +.checkIfMovingNorth + cp $ff + jr nz, .adjustXCoordWithinBlock +; moving north + ld a, [wMapViewVRAMPointer] + sub $40 + ld [wMapViewVRAMPointer], a + jr nc, .adjustXCoordWithinBlock + ld a, [wMapViewVRAMPointer + 1] + dec a + and $03 + or $98 + ld [wMapViewVRAMPointer + 1], a +.adjustXCoordWithinBlock + ld a, c + and a + jr z, .pointlessJump ; mistake? +.pointlessJump + ld hl, wXBlockCoord + ld a, [hl] + add c + ld [hl], a + cp $02 + jr nz, .checkForMoveToWestBlock +; moved into the tile block to the east + xor a + ld [hl], a + ld hl, wXOffsetSinceLastSpecialWarp + inc [hl] + ld de, wCurrentTileBlockMapViewPointer + call MoveTileBlockMapPointerEast + jr .updateMapView +.checkForMoveToWestBlock + cp $ff + jr nz, .adjustYCoordWithinBlock +; moved into the tile block to the west + ld a, $01 + ld [hl], a + ld hl, wXOffsetSinceLastSpecialWarp + dec [hl] + ld de, wCurrentTileBlockMapViewPointer + call MoveTileBlockMapPointerWest + jr .updateMapView +.adjustYCoordWithinBlock + ld hl, wYBlockCoord + ld a, [hl] + add b + ld [hl], a + cp $02 + jr nz, .checkForMoveToNorthBlock +; moved into the tile block to the south + xor a + ld [hl], a + ld hl, wYOffsetSinceLastSpecialWarp + inc [hl] + ld de, wCurrentTileBlockMapViewPointer + ld a, [wCurMapWidth] + call MoveTileBlockMapPointerSouth + jr .updateMapView +.checkForMoveToNorthBlock + cp $ff + jr nz, .updateMapView +; moved into the tile block to the north + ld a, $01 + ld [hl], a + ld hl, wYOffsetSinceLastSpecialWarp + dec [hl] + ld de, wCurrentTileBlockMapViewPointer + ld a, [wCurMapWidth] + call MoveTileBlockMapPointerNorth +.updateMapView + call LoadCurrentMapView + ld a, [wSpritePlayerStateData1YStepVector] + cp $01 + jr nz, .checkIfMovingNorth2 +; if moving south + call ScheduleSouthRowRedraw + jr .scrollBackgroundAndSprites +.checkIfMovingNorth2 + cp $ff + jr nz, .checkIfMovingEast2 +; if moving north + call ScheduleNorthRowRedraw + jr .scrollBackgroundAndSprites +.checkIfMovingEast2 + ld a, [wSpritePlayerStateData1XStepVector] + cp $01 + jr nz, .checkIfMovingWest2 +; if moving east + call ScheduleEastColumnRedraw + jr .scrollBackgroundAndSprites +.checkIfMovingWest2 + cp $ff + jr nz, .scrollBackgroundAndSprites +; if moving west + call ScheduleWestColumnRedraw +.scrollBackgroundAndSprites + ld a, [wSpritePlayerStateData1YStepVector] + add a + ld b, a + ld a, [wSpritePlayerStateData1XStepVector] + add a + ld c, a +; shift all the sprites in the direction opposite of the player's motion +; so that the player appears to move relative to them + ld hl, wSprite01StateData1YPixels + ld e, 15 +.spriteShiftLoop + ld a, [hl] + sub b + ld [hli], a + inc l + ld a, [hl] + sub c + ld [hl], a + ld a, $0e + add l + ld l, a + dec e + jr nz, .spriteShiftLoop +.done + ldh a, [hSCY] + add b + ldh [hSCY], a ; update background scroll Y + ldh a, [hSCX] + add c + ldh [hSCX], a ; update background scroll X + ret + +; the following four functions are used to move the pointer to the upper left +; corner of the tile block map in the direction of motion + +MoveTileBlockMapPointerEast:: + ld a, [de] + add $01 + ld [de], a + ret nc + inc de + ld a, [de] + inc a + ld [de], a + ret + +MoveTileBlockMapPointerWest:: + ld a, [de] + sub $01 + ld [de], a + ret nc + inc de + ld a, [de] + dec a + ld [de], a + ret + +MoveTileBlockMapPointerSouth:: + add MAP_BORDER * 2 + ld b, a + ld a, [de] + add b + ld [de], a + ret nc + inc de + ld a, [de] + inc a + ld [de], a + ret + +MoveTileBlockMapPointerNorth:: + add MAP_BORDER * 2 + ld b, a + ld a, [de] + sub b + ld [de], a + ret nc + inc de + ld a, [de] + dec a + ld [de], a + ret |