pokeyellow/engine/overworld/check_player_state.asm
2016-03-17 18:00:54 -04:00

236 lines
3.5 KiB
NASM

; only used for setting bit 2 of wd736 upon entering a new map
IsPlayerStandingOnWarp: ; c0a6 (3:40a6)
ld a, [wNumberOfWarps]
and a
ret z
ld c, a
ld hl, wWarpEntries
.loop
ld a, [wYCoord]
cp [hl]
jr nz, .nextWarp1
inc hl
ld a, [wXCoord]
cp [hl]
jr nz, .nextWarp2
inc hl
ld a, [hli] ; target warp
ld [wDestinationWarpID], a
ld a, [hl] ; target map
ld [$ff8b], a
ld hl, wd736
set 2, [hl] ; standing on warp flag
ret
.nextWarp1
inc hl
.nextWarp2
inc hl
inc hl
inc hl
dec c
jr nz, .loop
ret
CheckForceBikeOrSurf: ; c0d2 (3:40d2)
ld hl, wd732
bit 5, [hl]
ret nz
ld hl, ForcedBikeOrSurfMaps
ld a, [wYCoord]
ld b, a
ld a, [wXCoord]
ld c, a
ld a, [wCurMap]
ld d, a
.loop
ld a, [hli]
cp $ff
ret z ;if we reach FF then it's not part of the list
cp d ;compare to current map
jr nz, .incorrectMap
ld a, [hli]
cp b ;compare y-coord
jr nz, .incorrectY
ld a, [hli]
cp c ;compare x-coord
jr nz, .loop ; incorrect x-coord, check next item
ld a, [wCurMap]
cp SEAFOAM_ISLANDS_4
ld a, $2
ld [wSeafoamIslands4CurScript], a
jr z, .forceSurfing
ld a, [wCurMap]
cp SEAFOAM_ISLANDS_5
ld a, $2
ld [wSeafoamIslands5CurScript], a
jr z, .forceSurfing
;force bike riding
ld hl, wd732
set 5, [hl]
ld a, $1
ld [wWalkBikeSurfState], a
ld [wWalkBikeSurfStateCopy], a
call ForceBikeOrSurf
ret
.incorrectMap
inc hl
.incorrectY
inc hl
jr .loop
.forceSurfing
ld a, $2
ld [wWalkBikeSurfState], a
ld [wWalkBikeSurfStateCopy], a
call ForceBikeOrSurf
ret
INCLUDE "data/force_bike_surf.asm"
IsPlayerFacingEdgeOfMap: ; c148 (3:4148)
push hl
push de
push bc
ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
srl a
ld c, a
ld b, $0
ld hl, .functionPointerTable
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wYCoord]
ld b, a
ld a, [wXCoord]
ld c, a
ld de, .returnaddress
push de
jp [hl]
.returnaddress
pop bc
pop de
pop hl
ret
.functionPointerTable
dw .facingDown
dw .facingUp
dw .facingLeft
dw .facingRight
.facingDown
ld a, [wCurMapHeight]
add a
dec a
cp b
jr z, .setCarry
jr .resetCarry
.facingUp
ld a, b
and a
jr z, .setCarry
jr .resetCarry
.facingLeft
ld a, c
and a
jr z, .setCarry
jr .resetCarry
.facingRight
ld a, [wCurMapWidth]
add a
dec a
cp c
jr z, .setCarry
jr .resetCarry
.resetCarry
and a
ret
.setCarry
scf
ret
IsWarpTileInFrontOfPlayer: ; c197 (3:4197)
push hl
push de
push bc
call _GetTileAndCoordsInFrontOfPlayer
ld a, [wCurMap]
cp SS_ANNE_5
jr z, .ssAnne5
ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
srl a
ld c, a
ld b, 0
ld hl, .warpTileListPointers
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wTileInFrontOfPlayer]
ld de, $1
call IsInArray
.done
pop bc
pop de
pop hl
ret
.warpTileListPointers: ; c1c0 (3:41c0)
dw .facingDownWarpTiles
dw .facingUpWarpTiles
dw .facingLeftWarpTiles
dw .facingRightWarpTiles
.facingDownWarpTiles
db $01,$12,$17,$3D,$04,$18,$33,$FF
.facingUpWarpTiles
db $01,$5C,$FF
.facingLeftWarpTiles
db $1A,$4B,$FF
.facingRightWarpTiles
db $0F,$4E,$FF
.ssAnne5
ld a, [wTileInFrontOfPlayer]
cp $15
jr nz, .notSSAnne5Warp
scf
jr .done
.notSSAnne5Warp
and a
jr .done
IsPlayerStandingOnDoorTileOrWarpTile: ; c1e6 (3:41e6)
push hl
push de
push bc
callba IsPlayerStandingOnDoorTile ; 6:6785
jr c, .done
ld a, [wCurMapTileset]
add a
ld c, a
ld b, $0
ld hl, WarpTileIDPointers
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld de, $1
aCoord 8, 9
call IsInArray
jr nc, .done
ld hl, wd736
res 2, [hl]
.done
pop bc
pop de
pop hl
ret
INCLUDE "data/warp_tile_ids.asm"