2013-09-03 15:39:19 -07:00
|
|
|
; Functions handling map objects.
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
GetSpritePalette::
|
2013-09-03 15:39:19 -07:00
|
|
|
push hl
|
|
|
|
push de
|
|
|
|
push bc
|
|
|
|
ld c, a
|
2015-11-14 11:41:47 -08:00
|
|
|
|
2017-12-24 09:47:30 -08:00
|
|
|
farcall _GetSpritePalette
|
2015-11-14 11:41:47 -08:00
|
|
|
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, c
|
|
|
|
pop bc
|
|
|
|
pop de
|
|
|
|
pop hl
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
GetSpriteVTile::
|
2013-09-03 15:39:19 -07:00
|
|
|
push hl
|
|
|
|
push bc
|
2018-01-23 14:39:09 -08:00
|
|
|
ld hl, wUsedSprites + 2
|
2015-07-15 12:48:44 -07:00
|
|
|
ld c, SPRITE_GFX_LIST_CAPACITY - 1
|
2013-09-03 15:39:19 -07:00
|
|
|
ld b, a
|
2020-12-23 13:54:28 -08:00
|
|
|
ldh a, [hMapObjectIndex]
|
2015-07-18 12:46:38 -07:00
|
|
|
cp 0
|
2015-07-15 12:48:44 -07:00
|
|
|
jr z, .nope
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, b
|
2015-07-15 12:48:44 -07:00
|
|
|
.loop
|
2013-09-03 15:39:19 -07:00
|
|
|
cp [hl]
|
2015-07-15 12:48:44 -07:00
|
|
|
jr z, .found
|
2013-09-03 15:39:19 -07:00
|
|
|
inc hl
|
2016-05-04 08:46:23 -07:00
|
|
|
inc hl
|
2013-09-03 15:39:19 -07:00
|
|
|
dec c
|
2015-07-15 12:48:44 -07:00
|
|
|
jr nz, .loop
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wUsedSprites + 1]
|
2013-09-03 15:39:19 -07:00
|
|
|
scf
|
2015-07-15 12:48:44 -07:00
|
|
|
jr .done
|
2013-09-03 15:39:19 -07:00
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.nope
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wUsedSprites + 1]
|
2015-07-15 12:48:44 -07:00
|
|
|
jr .done
|
2013-09-03 15:39:19 -07:00
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.found
|
2013-09-03 15:39:19 -07:00
|
|
|
inc hl
|
|
|
|
xor a
|
|
|
|
ld a, [hl]
|
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.done
|
2013-09-03 15:39:19 -07:00
|
|
|
pop bc
|
|
|
|
pop hl
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
DoesSpriteHaveFacings::
|
2013-09-03 15:39:19 -07:00
|
|
|
push de
|
|
|
|
push hl
|
|
|
|
|
|
|
|
ld b, a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hROMBank]
|
2013-09-03 15:39:19 -07:00
|
|
|
push af
|
2015-11-04 17:20:14 -08:00
|
|
|
ld a, BANK(_DoesSpriteHaveFacings)
|
2013-09-03 15:39:19 -07:00
|
|
|
rst Bankswitch
|
|
|
|
|
|
|
|
ld a, b
|
2015-11-04 17:20:14 -08:00
|
|
|
call _DoesSpriteHaveFacings
|
2013-09-03 15:39:19 -07:00
|
|
|
ld c, a
|
|
|
|
|
|
|
|
pop de
|
|
|
|
ld a, d
|
|
|
|
rst Bankswitch
|
|
|
|
|
|
|
|
pop hl
|
|
|
|
pop de
|
|
|
|
ret
|
|
|
|
|
2022-09-12 06:15:44 -07:00
|
|
|
GetPlayerTile::
|
|
|
|
ld a, [wPlayerTile]
|
2013-09-03 15:39:19 -07:00
|
|
|
call GetTileCollision
|
|
|
|
ld b, a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckOnWater::
|
2024-01-04 13:30:40 -08:00
|
|
|
; return z if on water, nz otherwise.
|
|
|
|
; if tile permission is SPACE_TILE, wPlayerState dictates whether player is on water or not.
|
|
|
|
; otherwise the current tile permission being LAND_TILE or WATER_TILE dictates it.
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerTile]
|
2013-09-03 15:39:19 -07:00
|
|
|
call GetTileCollision
|
2024-01-04 13:30:40 -08:00
|
|
|
cp SPACE_TILE
|
|
|
|
jr z, .check_player_state
|
2020-02-13 16:01:47 -08:00
|
|
|
sub WATER_TILE
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2024-01-04 13:30:40 -08:00
|
|
|
.check_player_state
|
|
|
|
ld a, [wPlayerState]
|
|
|
|
cp PLAYER_SURF
|
|
|
|
ret z
|
|
|
|
cp PLAYER_SURF_PIKA
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
GetTileCollision::
|
2013-09-03 15:39:19 -07:00
|
|
|
; Get the collision type of tile a.
|
|
|
|
|
|
|
|
push de
|
|
|
|
push hl
|
|
|
|
|
|
|
|
ld hl, TileCollisionTable
|
|
|
|
ld e, a
|
|
|
|
ld d, 0
|
|
|
|
add hl, de
|
|
|
|
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hROMBank]
|
2013-09-03 15:39:19 -07:00
|
|
|
push af
|
|
|
|
ld a, BANK(TileCollisionTable)
|
|
|
|
rst Bankswitch
|
|
|
|
ld e, [hl]
|
|
|
|
pop af
|
|
|
|
rst Bankswitch
|
|
|
|
|
|
|
|
ld a, e
|
|
|
|
and $f ; lo nybble only
|
|
|
|
|
|
|
|
pop hl
|
|
|
|
pop de
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckGrassTile::
|
2013-09-03 15:39:19 -07:00
|
|
|
ld d, a
|
|
|
|
and $f0
|
2017-12-12 13:15:58 -08:00
|
|
|
cp HI_NYBBLE_TALL_GRASS
|
|
|
|
jr z, .grass
|
|
|
|
cp HI_NYBBLE_WATER
|
|
|
|
jr z, .water
|
2013-09-03 15:39:19 -07:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2017-12-12 13:15:58 -08:00
|
|
|
.grass
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, d
|
2017-12-12 13:15:58 -08:00
|
|
|
and LO_NYBBLE_GRASS
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
|
|
|
scf
|
|
|
|
ret
|
2015-11-15 11:59:38 -08:00
|
|
|
; For some reason, the above code is duplicated down here.
|
2017-12-12 13:15:58 -08:00
|
|
|
.water
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, d
|
2017-12-12 13:15:58 -08:00
|
|
|
and LO_NYBBLE_GRASS
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckSuperTallGrassTile::
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_LONG_GRASS
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_LONG_GRASS_1C
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckCutTreeTile::
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_CUT_TREE
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_CUT_TREE_1A
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckHeadbuttTreeTile::
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_HEADBUTT_TREE
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_HEADBUTT_TREE_1D
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckCounterTile::
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_COUNTER
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_COUNTER_98
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckPitTile::
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_PIT
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_PIT_68
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckIceTile::
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_ICE
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_ICE_2B
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckWhirlpoolTile::
|
2013-09-03 15:39:19 -07:00
|
|
|
nop
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_WHIRLPOOL
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_WHIRLPOOL_2C
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckWaterfallTile::
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_WATERFALL
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_CURRENT_DOWN
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckStandingOnEntrance::
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerTile]
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_DOOR
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_DOOR_79
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_STAIRCASE
|
2013-09-03 15:39:19 -07:00
|
|
|
ret z
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_CAVE
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
GetMapObject::
|
2013-09-03 15:39:19 -07:00
|
|
|
; Return the location of map object a in bc.
|
2018-01-23 14:39:09 -08:00
|
|
|
ld hl, wMapObjects
|
2019-11-03 09:25:59 -08:00
|
|
|
ld bc, MAPOBJECT_LENGTH
|
2013-09-03 15:39:19 -07:00
|
|
|
call AddNTimes
|
|
|
|
ld b, h
|
|
|
|
ld c, l
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckObjectVisibility::
|
2015-07-15 12:48:44 -07:00
|
|
|
; Sets carry if the object is not visible on the screen.
|
2020-12-23 13:54:28 -08:00
|
|
|
ldh [hMapObjectIndex], a
|
2013-09-03 15:39:19 -07:00
|
|
|
call GetMapObject
|
2015-07-18 12:46:38 -07:00
|
|
|
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2015-07-19 01:58:31 -07:00
|
|
|
cp -1
|
2015-07-15 12:48:44 -07:00
|
|
|
jr z, .not_visible
|
2020-12-23 13:54:28 -08:00
|
|
|
ldh [hObjectStructIndex], a
|
2015-07-15 12:48:44 -07:00
|
|
|
call GetObjectStruct
|
2013-09-03 15:39:19 -07:00
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.not_visible
|
2013-09-03 15:39:19 -07:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckObjectTime::
|
2023-01-03 19:16:08 -08:00
|
|
|
ld hl, MAPOBJECT_HOUR_1
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2015-07-15 12:48:44 -07:00
|
|
|
cp -1
|
|
|
|
jr nz, .check_hour
|
|
|
|
ld hl, MAPOBJECT_TIMEOFDAY
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2015-07-15 12:48:44 -07:00
|
|
|
cp -1
|
|
|
|
jr z, .timeofday_always
|
2020-07-01 10:13:49 -07:00
|
|
|
ld hl, .TimesOfDay
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wTimeOfDay]
|
2013-09-03 15:39:19 -07:00
|
|
|
add l
|
|
|
|
ld l, a
|
2015-07-15 12:48:44 -07:00
|
|
|
jr nc, .ok
|
2013-09-03 15:39:19 -07:00
|
|
|
inc h
|
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.ok
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [hl]
|
2015-07-15 12:48:44 -07:00
|
|
|
ld hl, MAPOBJECT_TIMEOFDAY
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
and [hl]
|
2015-07-15 12:48:44 -07:00
|
|
|
jr nz, .timeofday_always
|
2013-09-03 15:39:19 -07:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.timeofday_always
|
2013-09-03 15:39:19 -07:00
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2020-07-01 10:13:49 -07:00
|
|
|
.TimesOfDay:
|
2018-01-25 15:10:41 -08:00
|
|
|
; entries correspond to TimeOfDay values
|
|
|
|
db MORN
|
|
|
|
db DAY
|
|
|
|
db NITE
|
2023-07-31 03:27:53 -07:00
|
|
|
db EVE
|
2013-09-03 15:39:19 -07:00
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.check_hour
|
2023-01-03 19:16:08 -08:00
|
|
|
ld hl, MAPOBJECT_HOUR_1
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld d, [hl]
|
2023-01-03 19:16:08 -08:00
|
|
|
ld hl, MAPOBJECT_HOUR_2
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld e, [hl]
|
2023-07-27 15:07:07 -07:00
|
|
|
ld hl, wGameTimeHours + 1
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, d
|
|
|
|
cp e
|
2015-07-15 12:48:44 -07:00
|
|
|
jr z, .yes
|
|
|
|
jr c, .check_timeofday
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [hl]
|
|
|
|
cp d
|
2015-07-15 12:48:44 -07:00
|
|
|
jr nc, .yes
|
2013-09-03 15:39:19 -07:00
|
|
|
cp e
|
2015-07-15 12:48:44 -07:00
|
|
|
jr c, .yes
|
|
|
|
jr z, .yes
|
|
|
|
jr .no
|
2013-09-03 15:39:19 -07:00
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.check_timeofday
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, e
|
|
|
|
cp [hl]
|
2015-07-15 12:48:44 -07:00
|
|
|
jr c, .no
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [hl]
|
|
|
|
cp d
|
2015-07-15 12:48:44 -07:00
|
|
|
jr nc, .yes
|
|
|
|
jr .no
|
2013-09-03 15:39:19 -07:00
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.yes
|
2013-09-03 15:39:19 -07:00
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.no
|
2013-09-03 15:39:19 -07:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2020-06-22 13:30:13 -07:00
|
|
|
UnmaskCopyMapObjectStruct::
|
2020-12-23 13:54:28 -08:00
|
|
|
ldh [hMapObjectIndex], a
|
2015-11-01 18:17:46 -08:00
|
|
|
call UnmaskObject
|
2020-12-23 13:54:28 -08:00
|
|
|
ldh a, [hMapObjectIndex]
|
2013-09-03 15:39:19 -07:00
|
|
|
call GetMapObject
|
2017-12-24 09:47:30 -08:00
|
|
|
farcall CopyObjectStruct
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
ApplyDeletionToMapObject::
|
2020-12-23 13:54:28 -08:00
|
|
|
ldh [hMapObjectIndex], a
|
2013-09-03 15:39:19 -07:00
|
|
|
call GetMapObject
|
2015-07-18 12:46:38 -07:00
|
|
|
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2015-07-19 01:58:31 -07:00
|
|
|
cp -1
|
2015-11-02 08:15:32 -08:00
|
|
|
ret z ; already hidden
|
2015-07-19 01:58:31 -07:00
|
|
|
ld [hl], -1
|
2013-09-03 15:39:19 -07:00
|
|
|
push af
|
2016-01-10 23:36:39 -08:00
|
|
|
call .CheckStopFollow
|
2013-09-03 15:39:19 -07:00
|
|
|
pop af
|
2015-07-15 12:48:44 -07:00
|
|
|
call GetObjectStruct
|
2017-12-24 09:47:30 -08:00
|
|
|
farcall DeleteMapObject
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.CheckStopFollow:
|
2015-11-02 08:15:32 -08:00
|
|
|
ld hl, wObjectFollow_Leader
|
2013-09-03 15:39:19 -07:00
|
|
|
cp [hl]
|
2015-07-15 12:48:44 -07:00
|
|
|
jr z, .ok
|
2015-11-02 08:15:32 -08:00
|
|
|
ld hl, wObjectFollow_Follower
|
2013-09-03 15:39:19 -07:00
|
|
|
cp [hl]
|
|
|
|
ret nz
|
2015-07-15 12:48:44 -07:00
|
|
|
.ok
|
2017-12-24 09:47:30 -08:00
|
|
|
farcall StopFollow
|
2015-07-15 12:48:44 -07:00
|
|
|
ld a, -1
|
2015-11-02 08:15:32 -08:00
|
|
|
ld [wObjectFollow_Leader], a
|
|
|
|
ld [wObjectFollow_Follower], a
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
DeleteObjectStruct::
|
2016-01-10 23:36:39 -08:00
|
|
|
call ApplyDeletionToMapObject
|
2015-11-01 18:17:46 -08:00
|
|
|
call MaskObject
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CopyPlayerObjectTemplate::
|
2013-09-03 15:39:19 -07:00
|
|
|
push hl
|
|
|
|
call GetMapObject
|
|
|
|
ld d, b
|
|
|
|
ld e, c
|
2015-07-19 01:58:31 -07:00
|
|
|
ld a, -1
|
2013-09-03 15:39:19 -07:00
|
|
|
ld [de], a
|
|
|
|
inc de
|
|
|
|
pop hl
|
2019-11-03 09:25:59 -08:00
|
|
|
ld bc, MAPOBJECT_LENGTH - 1
|
2013-09-03 15:39:19 -07:00
|
|
|
call CopyBytes
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
LoadMovementDataPointer::
|
2017-12-24 10:46:34 -08:00
|
|
|
; Load the movement data pointer for object a.
|
|
|
|
ld [wMovementObject], a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hROMBank]
|
2019-04-19 08:35:27 -07:00
|
|
|
ld [wMovementDataBank], a
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, l
|
2019-04-19 08:35:27 -07:00
|
|
|
ld [wMovementDataAddress], a
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, h
|
2019-04-19 08:35:27 -07:00
|
|
|
ld [wMovementDataAddress + 1], a
|
2017-12-24 10:46:34 -08:00
|
|
|
ld a, [wMovementObject]
|
2015-11-02 08:15:32 -08:00
|
|
|
call CheckObjectVisibility
|
2013-09-03 15:39:19 -07:00
|
|
|
ret c
|
2015-11-11 20:38:57 -08:00
|
|
|
|
2022-09-12 06:15:44 -07:00
|
|
|
ld hl, OBJECT_MOVEMENT_TYPE
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
2015-11-06 13:42:38 -08:00
|
|
|
ld [hl], SPRITEMOVEDATA_SCRIPTED
|
2015-11-11 20:38:57 -08:00
|
|
|
|
2015-11-14 20:02:38 -08:00
|
|
|
ld hl, OBJECT_STEP_TYPE
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
2020-10-22 14:41:48 -07:00
|
|
|
ld [hl], STEP_TYPE_RESET
|
2015-11-11 20:38:57 -08:00
|
|
|
|
2018-01-23 14:39:09 -08:00
|
|
|
ld hl, wVramState
|
2013-09-03 15:39:19 -07:00
|
|
|
set 7, [hl]
|
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
FindFirstEmptyObjectStruct::
|
2015-10-31 18:05:02 -07:00
|
|
|
; Returns the index of the first empty object struct in A and its address in HL, then sets carry.
|
|
|
|
; If all object structs are occupied, A = 0 and Z is set.
|
|
|
|
; Preserves BC and DE.
|
2013-09-03 15:39:19 -07:00
|
|
|
push bc
|
|
|
|
push de
|
2018-01-23 14:39:09 -08:00
|
|
|
ld hl, wObjectStructs
|
2019-11-03 09:25:59 -08:00
|
|
|
ld de, OBJECT_LENGTH
|
2015-07-15 12:48:44 -07:00
|
|
|
ld c, NUM_OBJECT_STRUCTS
|
|
|
|
.loop
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [hl]
|
|
|
|
and a
|
2015-10-31 18:05:02 -07:00
|
|
|
jr z, .break
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, de
|
|
|
|
dec c
|
2015-07-15 12:48:44 -07:00
|
|
|
jr nz, .loop
|
2013-09-03 15:39:19 -07:00
|
|
|
xor a
|
2015-07-15 12:48:44 -07:00
|
|
|
jr .done
|
2013-09-03 15:39:19 -07:00
|
|
|
|
2015-10-31 18:05:02 -07:00
|
|
|
.break
|
|
|
|
ld a, NUM_OBJECT_STRUCTS
|
2013-09-03 15:39:19 -07:00
|
|
|
sub c
|
|
|
|
scf
|
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.done
|
2013-09-03 15:39:19 -07:00
|
|
|
pop de
|
|
|
|
pop bc
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
GetSpriteMovementFunction::
|
2022-09-12 06:15:44 -07:00
|
|
|
ld hl, OBJECT_MOVEMENT_TYPE
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2015-11-06 13:42:38 -08:00
|
|
|
cp NUM_SPRITEMOVEDATA
|
2015-07-15 12:48:44 -07:00
|
|
|
jr c, .ok
|
2013-09-03 15:39:19 -07:00
|
|
|
xor a
|
|
|
|
|
2015-07-15 12:48:44 -07:00
|
|
|
.ok
|
2018-05-23 09:48:14 -07:00
|
|
|
ld hl, SpriteMovementData + SPRITEMOVEATTR_MOVEMENT
|
2013-09-03 15:39:19 -07:00
|
|
|
ld e, a
|
|
|
|
ld d, 0
|
2018-05-23 09:48:14 -07:00
|
|
|
rept NUM_SPRITEMOVEDATA_FIELDS
|
2017-12-08 21:50:59 -08:00
|
|
|
add hl, de
|
2015-07-20 08:28:05 -07:00
|
|
|
endr
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [hl]
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
GetInitialFacing::
|
2013-09-03 15:39:19 -07:00
|
|
|
push bc
|
|
|
|
push de
|
|
|
|
ld e, a
|
|
|
|
ld d, 0
|
2018-05-23 09:48:14 -07:00
|
|
|
ld hl, SpriteMovementData + SPRITEMOVEATTR_FACING
|
|
|
|
rept NUM_SPRITEMOVEDATA_FIELDS
|
2017-12-08 21:50:59 -08:00
|
|
|
add hl, de
|
2015-07-20 08:28:05 -07:00
|
|
|
endr
|
2015-11-06 13:42:38 -08:00
|
|
|
ld a, BANK(SpriteMovementData)
|
2013-09-03 15:39:19 -07:00
|
|
|
call GetFarByte
|
|
|
|
add a
|
2016-05-04 08:46:23 -07:00
|
|
|
add a
|
2018-05-23 09:48:14 -07:00
|
|
|
maskbits NUM_DIRECTIONS, 2
|
2013-09-03 15:39:19 -07:00
|
|
|
pop de
|
|
|
|
pop bc
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CopySpriteMovementData::
|
2013-09-03 15:39:19 -07:00
|
|
|
ld l, a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hROMBank]
|
2013-09-03 15:39:19 -07:00
|
|
|
push af
|
2015-11-06 13:42:38 -08:00
|
|
|
ld a, BANK(SpriteMovementData)
|
2013-09-03 15:39:19 -07:00
|
|
|
rst Bankswitch
|
|
|
|
ld a, l
|
|
|
|
push bc
|
|
|
|
|
2015-11-15 21:52:53 -08:00
|
|
|
call .CopyData
|
2013-09-03 15:39:19 -07:00
|
|
|
|
|
|
|
pop bc
|
|
|
|
pop af
|
|
|
|
rst Bankswitch
|
|
|
|
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CopyData:
|
2022-09-12 06:15:44 -07:00
|
|
|
ld hl, OBJECT_MOVEMENT_TYPE
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, de
|
|
|
|
ld [hl], a
|
2015-11-15 21:52:53 -08:00
|
|
|
|
2013-09-03 15:39:19 -07:00
|
|
|
push de
|
|
|
|
ld e, a
|
|
|
|
ld d, 0
|
2018-05-23 09:48:14 -07:00
|
|
|
ld hl, SpriteMovementData + SPRITEMOVEATTR_FACING
|
|
|
|
rept NUM_SPRITEMOVEDATA_FIELDS
|
2015-07-29 15:22:23 -07:00
|
|
|
add hl, de
|
2015-07-20 08:28:05 -07:00
|
|
|
endr
|
2013-09-03 15:39:19 -07:00
|
|
|
ld b, h
|
|
|
|
ld c, l
|
|
|
|
pop de
|
2015-11-15 21:52:53 -08:00
|
|
|
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [bc]
|
|
|
|
inc bc
|
|
|
|
rlca
|
|
|
|
rlca
|
2018-05-23 09:48:14 -07:00
|
|
|
maskbits NUM_DIRECTIONS, 2
|
2022-09-12 06:15:44 -07:00
|
|
|
ld hl, OBJECT_DIRECTION
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, de
|
|
|
|
ld [hl], a
|
2015-11-15 21:52:53 -08:00
|
|
|
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [bc]
|
|
|
|
inc bc
|
2015-11-14 11:41:47 -08:00
|
|
|
ld hl, OBJECT_ACTION
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, de
|
|
|
|
ld [hl], a
|
2015-11-15 21:52:53 -08:00
|
|
|
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [bc]
|
|
|
|
inc bc
|
2015-10-29 20:32:11 -07:00
|
|
|
ld hl, OBJECT_FLAGS1
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, de
|
|
|
|
ld [hl], a
|
2015-11-15 21:52:53 -08:00
|
|
|
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [bc]
|
|
|
|
inc bc
|
2015-10-29 20:32:11 -07:00
|
|
|
ld hl, OBJECT_FLAGS2
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, de
|
|
|
|
ld [hl], a
|
2015-11-15 21:52:53 -08:00
|
|
|
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [bc]
|
|
|
|
inc bc
|
2015-07-15 12:48:44 -07:00
|
|
|
ld hl, OBJECT_PALETTE
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, de
|
|
|
|
ld [hl], a
|
|
|
|
ret
|
|
|
|
|
2022-09-12 06:15:44 -07:00
|
|
|
_GetMovementIndex::
|
2015-11-11 20:38:57 -08:00
|
|
|
; Switch to the movement data bank
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hROMBank]
|
2013-09-03 15:39:19 -07:00
|
|
|
push af
|
|
|
|
ld a, [hli]
|
|
|
|
rst Bankswitch
|
2022-09-12 06:15:44 -07:00
|
|
|
; Load the current script byte as given by OBJECT_MOVEMENT_INDEX, and increment OBJECT_MOVEMENT_INDEX
|
2013-09-03 15:39:19 -07:00
|
|
|
ld a, [hli]
|
|
|
|
ld d, [hl]
|
2022-09-12 06:15:44 -07:00
|
|
|
ld hl, OBJECT_MOVEMENT_INDEX
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
add [hl]
|
|
|
|
ld e, a
|
|
|
|
ld a, d
|
2015-07-15 12:48:44 -07:00
|
|
|
adc 0
|
2013-09-03 15:39:19 -07:00
|
|
|
ld d, a
|
|
|
|
inc [hl]
|
|
|
|
ld a, [de]
|
|
|
|
ld h, a
|
|
|
|
pop af
|
|
|
|
rst Bankswitch
|
|
|
|
|
|
|
|
ld a, h
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
UpdateSprites::
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wVramState]
|
2013-09-03 15:39:19 -07:00
|
|
|
bit 0, a
|
|
|
|
ret z
|
2020-10-22 18:25:40 -07:00
|
|
|
farcall UpdateAllObjectsFrozen
|
2023-10-21 09:46:56 -07:00
|
|
|
farcall _UpdateActiveSprites
|
|
|
|
ret
|
|
|
|
|
|
|
|
UpdateActiveSprites::
|
|
|
|
ld a, [wVramState]
|
|
|
|
bit 0, a
|
|
|
|
ret z
|
|
|
|
farcall _UpdateActiveSprites
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|
|
|
|
|
2023-10-14 10:28:35 -07:00
|
|
|
UpdateSecondarySprites::
|
|
|
|
ld a, [wVramState]
|
|
|
|
bit 0, a
|
|
|
|
ret z
|
|
|
|
farcall _UpdateSecondarySprites
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
GetObjectStruct::
|
2019-11-03 09:25:59 -08:00
|
|
|
ld bc, OBJECT_LENGTH
|
2018-01-23 14:39:09 -08:00
|
|
|
ld hl, wObjectStructs
|
2013-09-03 15:39:19 -07:00
|
|
|
call AddNTimes
|
|
|
|
ld b, h
|
|
|
|
ld c, l
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
DoesObjectHaveASprite::
|
2015-07-15 12:48:44 -07:00
|
|
|
ld hl, OBJECT_SPRITE
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
SetSpriteDirection::
|
2015-11-14 11:41:47 -08:00
|
|
|
; preserves other flags
|
2013-09-03 15:39:19 -07:00
|
|
|
push af
|
2022-09-12 06:15:44 -07:00
|
|
|
ld hl, OBJECT_DIRECTION
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2015-07-15 12:48:44 -07:00
|
|
|
and %11110011
|
2013-09-03 15:39:19 -07:00
|
|
|
ld e, a
|
|
|
|
pop af
|
2018-05-23 09:48:14 -07:00
|
|
|
maskbits NUM_DIRECTIONS, 2
|
2013-09-03 15:39:19 -07:00
|
|
|
or e
|
|
|
|
ld [hl], a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
GetSpriteDirection::
|
2022-09-12 06:15:44 -07:00
|
|
|
ld hl, OBJECT_DIRECTION
|
2013-09-03 15:39:19 -07:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2018-05-23 09:48:14 -07:00
|
|
|
maskbits NUM_DIRECTIONS, 2
|
2013-09-03 15:39:19 -07:00
|
|
|
ret
|