mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
e6ea1889fb
The former is arguably misleading (as you don’t access the memory location in hl to retrieve the jump location), and is consequently deprecated in newer versions of rgbds. This fix silences these deprecation warnings.
3098 lines
46 KiB
NASM
3098 lines
46 KiB
NASM
|
|
INCLUDE "engine/facings.asm"
|
|
|
|
SpriteMovementData:: ; 4273
|
|
INCLUDE "data/map_objects.asm"
|
|
|
|
; 4357
|
|
DeleteMapObject:: ; 4357
|
|
push bc
|
|
ld hl, OBJECT_MAP_OBJECT_INDEX
|
|
add hl, bc
|
|
ld a, [hl]
|
|
push af
|
|
ld h, b
|
|
ld l, c
|
|
ld bc, OBJECT_STRUCT_LENGTH
|
|
xor a
|
|
call ByteFill
|
|
pop af
|
|
cp -1
|
|
jr z, .ok
|
|
bit 7, a
|
|
jr nz, .ok
|
|
call GetMapObject
|
|
ld hl, OBJECT_SPRITE
|
|
add hl, bc
|
|
ld [hl], -1
|
|
.ok
|
|
pop bc
|
|
ret
|
|
; 437b
|
|
|
|
Function437b: ; 437b
|
|
call .CheckObjectStillVisible
|
|
ret c
|
|
call .HandleStepType
|
|
call .HandleObjectAction
|
|
ret
|
|
|
|
.CheckObjectStillVisible:
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 6, [hl]
|
|
ld a, [XCoord]
|
|
ld e, a
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld a, [hl]
|
|
add 1
|
|
sub e
|
|
jr c, .ok
|
|
cp MAPOBJECT_SCREEN_WIDTH
|
|
jr nc, .ok
|
|
ld a, [YCoord]
|
|
ld e, a
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld a, [hl]
|
|
add 1
|
|
sub e
|
|
jr c, .ok
|
|
cp MAPOBJECT_SCREEN_HEIGHT
|
|
jr nc, .ok
|
|
jr .yes
|
|
|
|
.ok
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
set 6, [hl]
|
|
ld a, [XCoord]
|
|
ld e, a
|
|
ld hl, OBJECT_INIT_X
|
|
add hl, bc
|
|
ld a, [hl]
|
|
add 1
|
|
sub e
|
|
jr c, .ok2
|
|
cp MAPOBJECT_SCREEN_WIDTH
|
|
jr nc, .ok2
|
|
ld a, [YCoord]
|
|
ld e, a
|
|
ld hl, OBJECT_INIT_Y
|
|
add hl, bc
|
|
ld a, [hl]
|
|
add 1
|
|
sub e
|
|
jr c, .ok2
|
|
cp MAPOBJECT_SCREEN_HEIGHT
|
|
jr nc, .ok2
|
|
.yes
|
|
and a
|
|
ret
|
|
|
|
.ok2
|
|
ld hl, OBJECT_FLAGS1
|
|
add hl, bc
|
|
bit 1, [hl]
|
|
jr nz, .yes2
|
|
call DeleteMapObject
|
|
scf
|
|
ret
|
|
|
|
.yes2
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
set 6, [hl]
|
|
and a
|
|
ret
|
|
|
|
.HandleStepType:
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .zero
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
bit 5, [hl]
|
|
jr nz, .bit5
|
|
cp STEP_TYPE_SLEEP
|
|
jr z, .one
|
|
jr .ok3
|
|
|
|
.zero
|
|
call ObjectMovementReset
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
bit 5, [hl]
|
|
jr nz, .bit5
|
|
.one
|
|
call MapObjectMovementPattern
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and a
|
|
ret z
|
|
cp STEP_TYPE_SLEEP
|
|
ret z
|
|
.ok3
|
|
ld hl, StepTypesJumptable
|
|
rst JumpTable
|
|
ret
|
|
|
|
.bit5
|
|
ret
|
|
|
|
.HandleObjectAction:
|
|
ld hl, OBJECT_FLAGS1
|
|
add hl, bc
|
|
bit INVISIBLE, [hl]
|
|
jr nz, SetFacingStanding
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
bit 6, [hl]
|
|
jr nz, SetFacingStanding
|
|
bit 5, [hl]
|
|
jr nz, asm_4448
|
|
ld de, Pointers445f ; use first column
|
|
jr asm_444d
|
|
; 4440
|
|
|
|
Function4440: ; 4440
|
|
ld hl, OBJECT_FLAGS1
|
|
add hl, bc
|
|
bit INVISIBLE, [hl]
|
|
jr nz, SetFacingStanding
|
|
asm_4448 ; use second column
|
|
ld de, Pointers445f + 2
|
|
jr asm_444d
|
|
; 444d
|
|
|
|
asm_444d
|
|
; call [4 * ObjectStructs[ObjInd, OBJECT_ACTION] + de]
|
|
INCLUDE "engine/map_object_action.asm"
|
|
|
|
CopyNextCoordsTileToStandingCoordsTile: ; 4600
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_MAP_X
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_MAP_Y
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_STANDING_TILE
|
|
add hl, bc
|
|
ld [hl], a
|
|
call SetTallGrassFlags
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
call UselessAndA
|
|
ret
|
|
; 462a
|
|
|
|
Function462a: ; 462a
|
|
ld hl, OBJECT_MAP_X
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_MAP_Y
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld [hl], a
|
|
ret
|
|
; 463f
|
|
|
|
UpdateTallGrassFlags: ; 463f
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
bit 3, [hl] ; is current tile grass?
|
|
jr z, .ok
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
call SetTallGrassFlags
|
|
.ok
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
call UselessAndA
|
|
ret c ; never happens
|
|
ld hl, OBJECT_STANDING_TILE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
call UselessAndA
|
|
ret
|
|
; 4661
|
|
|
|
SetTallGrassFlags: ; 4661
|
|
call CheckSuperTallGrassTile
|
|
jr z, .set
|
|
call CheckGrassTile
|
|
jr c, .reset
|
|
.set
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
set 3, [hl]
|
|
ret
|
|
|
|
.reset
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 3, [hl]
|
|
ret
|
|
; 4679
|
|
|
|
UselessAndA: ; 4679
|
|
and a
|
|
ret
|
|
; 467b
|
|
|
|
EndSpriteMovement: ; 467b
|
|
xor a
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_MOVEMENT_BYTE_INDEX
|
|
add hl, bc
|
|
ld [hli], a
|
|
ld [hli], a
|
|
ld [hli], a
|
|
ld [hl], a ; OBJECT_30
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ret
|
|
; 4690
|
|
|
|
InitStep: ; 4690
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_FLAGS1
|
|
add hl, bc
|
|
bit FIXED_FACING, [hl]
|
|
jr nz, GetNextTile
|
|
add a
|
|
add a
|
|
and %00001100
|
|
ld hl, OBJECT_FACING
|
|
add hl, bc
|
|
ld [hl], a
|
|
GetNextTile: ; 46a6
|
|
call GetStepVector
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld a, d
|
|
call GetStepVectorSign
|
|
ld hl, OBJECT_MAP_X
|
|
add hl, bc
|
|
add [hl]
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld d, a
|
|
ld a, e
|
|
call GetStepVectorSign
|
|
ld hl, OBJECT_MAP_Y
|
|
add hl, bc
|
|
add [hl]
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld e, a
|
|
push bc
|
|
call GetCoordTile
|
|
pop bc
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, bc
|
|
ld [hl], a
|
|
ret
|
|
; 46d7
|
|
|
|
AddStepVector: ; 46d7
|
|
call GetStepVector
|
|
ld hl, OBJECT_SPRITE_X
|
|
add hl, bc
|
|
ld a, [hl]
|
|
add d
|
|
ld [hl], a
|
|
ld hl, OBJECT_SPRITE_Y
|
|
add hl, bc
|
|
ld a, [hl]
|
|
add e
|
|
ld [hl], a
|
|
ret
|
|
; 46e9
|
|
|
|
GetStepVector: ; 46e9
|
|
; Return (x, y, duration, speed) in (d, e, a, h).
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %00001111
|
|
add a
|
|
add a
|
|
ld l, a
|
|
ld h, 0
|
|
ld de, StepVectors
|
|
add hl, de
|
|
ld d, [hl]
|
|
inc hl
|
|
ld e, [hl]
|
|
inc hl
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ret
|
|
; 4700
|
|
|
|
StepVectors: ; 4700
|
|
; x, y, duration, speed
|
|
; slow
|
|
db 0, 1, 16, 1
|
|
db 0, -1, 16, 1
|
|
db -1, 0, 16, 1
|
|
db 1, 0, 16, 1
|
|
; normal
|
|
db 0, 2, 8, 2
|
|
db 0, -2, 8, 2
|
|
db -2, 0, 8, 2
|
|
db 2, 0, 8, 2
|
|
; fast
|
|
db 0, 4, 4, 4
|
|
db 0, -4, 4, 4
|
|
db -4, 0, 4, 4
|
|
db 4, 0, 4, 4
|
|
; 4730
|
|
GetStepVectorSign: ; 4730
|
|
add a
|
|
ret z ; 0 or 128
|
|
ld a, 1
|
|
ret nc ; 1 - 127
|
|
ld a, -1
|
|
ret ; 129 - 255
|
|
; 4738
|
|
UpdatePlayerStep: ; 4738
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %00000011
|
|
ld [wPlayerStepDirection], a
|
|
call AddStepVector
|
|
ld a, [wPlayerStepVectorX]
|
|
add d
|
|
ld [wPlayerStepVectorX], a
|
|
ld a, [wPlayerStepVectorY]
|
|
add e
|
|
ld [wPlayerStepVectorY], a
|
|
ld hl, wPlayerStepFlags
|
|
set 5, [hl]
|
|
ret
|
|
; 4759
|
|
|
|
Function4759: ; 4759
|
|
; unreferenced
|
|
push bc
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, OBJECT_MAP_OBJECT_INDEX
|
|
add hl, bc
|
|
ld a, [hl]
|
|
call GetMapObject
|
|
add hl, de
|
|
ld a, [hl]
|
|
pop bc
|
|
ret
|
|
; 4769
|
|
|
|
RestoreDefaultMovement: ; 4769
|
|
ld hl, OBJECT_MAP_OBJECT_INDEX
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp -1
|
|
jr z, .ok
|
|
push bc
|
|
call GetMapObject
|
|
ld hl, MAPOBJECT_MOVEMENT
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop bc
|
|
ret
|
|
|
|
.ok
|
|
ld a, SPRITEMOVEFN_STANDING
|
|
ret
|
|
; 4780
|
|
|
|
ClearObjectMovementByteIndex: ; 4780
|
|
ld hl, OBJECT_MOVEMENT_BYTE_INDEX
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ret
|
|
; 4787
|
|
|
|
IncrementObjectMovementByteIndex: ; 4787
|
|
ld hl, OBJECT_MOVEMENT_BYTE_INDEX
|
|
add hl, bc
|
|
inc [hl]
|
|
ret
|
|
; 478d
|
|
|
|
DecrementObjectMovementByteIndex: ; 478d
|
|
ld hl, OBJECT_MOVEMENT_BYTE_INDEX
|
|
add hl, bc
|
|
dec [hl]
|
|
ret
|
|
; 4793
|
|
|
|
MovementAnonymousJumptable: ; 4793
|
|
ld hl, OBJECT_MOVEMENT_BYTE_INDEX
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop hl
|
|
rst JumpTable
|
|
ret
|
|
; 479b
|
|
|
|
ClearObjectStructField28: ; 479b
|
|
ld hl, OBJECT_28
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ret
|
|
; 47a2
|
|
|
|
IncrementObjectStructField28: ; 47a2
|
|
ld hl, OBJECT_28
|
|
add hl, bc
|
|
inc [hl]
|
|
ret
|
|
; 47a8
|
|
|
|
Object28AnonymousJumptable: ; 47a8
|
|
ld hl, OBJECT_28
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop hl
|
|
rst JumpTable
|
|
ret
|
|
; 47b0
|
|
|
|
GetValueObjectStructField28: ; 47b0
|
|
ld hl, OBJECT_28
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ret
|
|
; 47b6
|
|
|
|
SetValueObjectStructField28: ; 47b6
|
|
ld hl, OBJECT_28
|
|
add hl, bc
|
|
ld [hl], a
|
|
ret
|
|
; 47bc
|
|
|
|
ObjectMovementReset: ; 47bc
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld d, [hl]
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld e, [hl]
|
|
push bc
|
|
call GetCoordTile
|
|
pop bc
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, bc
|
|
ld [hl], a
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
call EndSpriteMovement
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 47dd
|
|
|
|
MapObjectMovementPattern: ; 47dd
|
|
call ClearObjectStructField28
|
|
call GetSpriteMovementFunction
|
|
ld a, [hl]
|
|
ld hl, .Pointers
|
|
rst JumpTable
|
|
ret
|
|
|
|
.Pointers: ; 47e9
|
|
dw .Null_00 ; 00
|
|
dw .RandomWalkY ; 01
|
|
dw .RandomWalkX ; 02
|
|
dw .RandomWalkXY ; 03
|
|
dw .RandomSpin1 ; 04
|
|
dw .RandomSpin2 ; 05
|
|
dw .Standing ; 06
|
|
dw .ObeyDPad ; 07
|
|
dw .Movement08 ; 08
|
|
dw .Movement09 ; 09
|
|
dw .Movement0a ; 0a
|
|
dw .Movement0b ; 0b
|
|
dw .Movement0c ; 0c
|
|
dw .Movement0d ; 0d
|
|
dw .Movement0e ; 0e
|
|
dw .Follow ; 0f
|
|
dw .Script ; 10
|
|
dw .Strength ; 11
|
|
dw .FollowNotExact ; 12
|
|
dw .MovementShadow ; 13
|
|
dw .MovementEmote ; 14
|
|
dw .MovementBigStanding ; 15
|
|
dw .MovementBouncing ; 16
|
|
dw .MovementScreenShake ; 17
|
|
dw .MovementSpinClockwise ; 18
|
|
dw .MovementSpinCounterclockwise ; 19
|
|
dw .MovementBoulderDust ; 1a
|
|
dw .MovementShakingGrass ; 1b
|
|
|
|
.Null_00:
|
|
ret
|
|
|
|
.RandomWalkY:
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
and %00000001
|
|
jp .RandomWalkContinue
|
|
|
|
.RandomWalkX:
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
and %00000001
|
|
or %00000010
|
|
jp .RandomWalkContinue
|
|
|
|
.RandomWalkXY:
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
and %00000011
|
|
jp .RandomWalkContinue
|
|
|
|
.RandomSpin1:
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
and %00001100
|
|
ld hl, OBJECT_FACING
|
|
add hl, bc
|
|
ld [hl], a
|
|
jp RandomStepDuration_Slow
|
|
|
|
.RandomSpin2:
|
|
ld hl, OBJECT_FACING
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %00001100
|
|
ld d, a
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
and %00001100
|
|
cp d
|
|
jr nz, .keep
|
|
xor %00001100
|
|
.keep
|
|
ld [hl], a
|
|
jp RandomStepDuration_Fast
|
|
|
|
.Standing:
|
|
call Function462a
|
|
call EndSpriteMovement
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_STAND
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_05
|
|
ret
|
|
|
|
.ObeyDPad:
|
|
ld hl, Function5000
|
|
jp HandleMovementData
|
|
|
|
.Movement08:
|
|
ld hl, Function5015
|
|
jp HandleMovementData
|
|
|
|
.Movement09:
|
|
ld hl, Function5026
|
|
jp HandleMovementData
|
|
|
|
.Movement0a:
|
|
jp _GetMovementPerson
|
|
|
|
.Movement0b:
|
|
jp _GetMovementPerson
|
|
|
|
.Movement0c:
|
|
jp _GetMovementPerson
|
|
|
|
.Movement0d:
|
|
ld hl, Function5000
|
|
jp HandleMovementData
|
|
|
|
.Movement0e:
|
|
jp _GetMovementPerson
|
|
|
|
.Follow:
|
|
ld hl, GetFollowerNextMovementByte
|
|
jp HandleMovementData
|
|
|
|
.Script:
|
|
ld hl, GetMovementByte
|
|
jp HandleMovementData
|
|
|
|
.Strength:
|
|
call MovementAnonymousJumptable
|
|
dw .Strength_Start
|
|
dw .Strength_Stop
|
|
|
|
.Strength_Start:
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
call CheckPitTile
|
|
jr z, .on_pit
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
bit 2, [hl]
|
|
res 2, [hl]
|
|
jr z, .ok
|
|
ld hl, OBJECT_RANGE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %00000011
|
|
or 0
|
|
call InitStep
|
|
call Function6ec1
|
|
jr c, .ok2
|
|
ld de, SFX_STRENGTH
|
|
call PlaySFX
|
|
call SpawnStrengthBoulderDust
|
|
call UpdateTallGrassFlags
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_0F
|
|
ret
|
|
|
|
.ok2
|
|
call Function462a
|
|
.ok
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ret
|
|
|
|
.on_pit
|
|
call IncrementObjectMovementByteIndex
|
|
.Strength_Stop:
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ret
|
|
|
|
.FollowNotExact:
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld d, [hl]
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld e, [hl]
|
|
ld hl, OBJECT_RANGE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
push bc
|
|
call GetObjectStruct
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp STANDING
|
|
jr z, .standing
|
|
ld hl, OBJECT_MAP_X
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp d
|
|
jr z, .equal
|
|
jr c, .less
|
|
ld a, 3
|
|
jr .done
|
|
|
|
.less
|
|
ld a, 2
|
|
jr .done
|
|
|
|
.equal
|
|
ld hl, OBJECT_MAP_Y
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp e
|
|
jr z, .standing
|
|
jr c, .less2
|
|
ld a, 0
|
|
jr .done
|
|
|
|
.less2
|
|
ld a, 1
|
|
.done
|
|
ld d, a
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %00001100
|
|
or d
|
|
pop bc
|
|
jp NormalStep
|
|
|
|
.standing
|
|
pop bc
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_STAND
|
|
ret
|
|
|
|
.MovementBigStanding:
|
|
call EndSpriteMovement
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_BIG_SNORLAX
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_04
|
|
ret
|
|
|
|
.MovementBouncing:
|
|
call EndSpriteMovement
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_BOUNCE
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_04
|
|
ret
|
|
|
|
.MovementSpinCounterclockwise:
|
|
call MovementAnonymousJumptable
|
|
dw .MovementSpinInit
|
|
dw .MovementSpinRepeat
|
|
dw .MovementSpinTurnLeft
|
|
|
|
.MovementSpinClockwise:
|
|
call MovementAnonymousJumptable
|
|
dw .MovementSpinInit
|
|
dw .MovementSpinRepeat
|
|
dw .MovementSpinTurnRight
|
|
|
|
.MovementSpinInit:
|
|
call EndSpriteMovement
|
|
call IncrementObjectMovementByteIndex
|
|
.MovementSpinRepeat:
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_STAND
|
|
ld hl, OBJECT_RANGE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld a, $10
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_03
|
|
call IncrementObjectMovementByteIndex
|
|
ret
|
|
|
|
.MovementSpinTurnLeft:
|
|
ld de, .DirectionData_Counterclockwise
|
|
call .MovementSpinNextFacing
|
|
jr .MovementSpinCounterclockwise
|
|
|
|
.DirectionData_Counterclockwise: ; 49c0
|
|
db OW_RIGHT, OW_LEFT, OW_DOWN, OW_UP
|
|
|
|
.MovementSpinTurnRight:
|
|
ld de, .DirectionData_Clockwise
|
|
call .MovementSpinNextFacing
|
|
jr .MovementSpinClockwise
|
|
|
|
.DirectionData_Clockwise: ; 49cc
|
|
db OW_LEFT, OW_RIGHT, OW_UP, OW_DOWN
|
|
|
|
.MovementSpinNextFacing:
|
|
ld hl, OBJECT_FACING
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %00001100
|
|
rrca
|
|
rrca
|
|
push hl
|
|
ld l, a
|
|
ld h, 0
|
|
add hl, de
|
|
ld a, [hl]
|
|
pop hl
|
|
ld [hl], a
|
|
call DecrementObjectMovementByteIndex
|
|
ret
|
|
|
|
.MovementShadow:
|
|
call ._MovementShadow_Grass_Emote_BoulderDust
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_SHADOW
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, de
|
|
ld a, [hl]
|
|
inc a
|
|
add a
|
|
add 0
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, de
|
|
ld a, [hl]
|
|
and 3
|
|
ld d, 1 * 8 + 6
|
|
cp DOWN
|
|
jr z, .ok_13
|
|
cp UP
|
|
jr z, .ok_13
|
|
ld d, 1 * 8 + 4
|
|
.ok_13
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], d
|
|
ld hl, OBJECT_SPRITE_X_OFFSET
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_TRACKING_OBJECT
|
|
ret
|
|
|
|
.MovementEmote:
|
|
call EndSpriteMovement
|
|
call ._MovementShadow_Grass_Emote_BoulderDust
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_EMOTE
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], -2 * 8
|
|
ld hl, OBJECT_SPRITE_X_OFFSET
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_TRACKING_OBJECT
|
|
ret
|
|
|
|
.MovementBoulderDust:
|
|
call EndSpriteMovement
|
|
call ._MovementShadow_Grass_Emote_BoulderDust
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_BOULDER_DUST
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, de
|
|
ld a, [hl]
|
|
inc a
|
|
add a
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, de
|
|
ld a, [hl]
|
|
and %00000011
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, .data_4a81
|
|
add hl, de
|
|
add hl, de
|
|
ld d, [hl]
|
|
inc hl
|
|
ld e, [hl]
|
|
ld hl, OBJECT_SPRITE_X_OFFSET
|
|
add hl, bc
|
|
ld [hl], d
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], e
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_TRACKING_OBJECT
|
|
ret
|
|
|
|
.data_4a81 ; 4a81
|
|
; x, y
|
|
db 0, -4
|
|
db 0, 8
|
|
db 6, 2
|
|
db -6, 2
|
|
|
|
.MovementShakingGrass:
|
|
call EndSpriteMovement
|
|
call ._MovementShadow_Grass_Emote_BoulderDust
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_GRASS_SHAKE
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, de
|
|
ld a, [hl]
|
|
add -1
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_TRACKING_OBJECT
|
|
ret
|
|
|
|
._MovementShadow_Grass_Emote_BoulderDust:
|
|
ld hl, OBJECT_RANGE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
push bc
|
|
call GetObjectStruct
|
|
ld d, b
|
|
ld e, c
|
|
pop bc
|
|
ld hl, OBJECT_29
|
|
add hl, bc
|
|
ld [hl], e
|
|
inc hl
|
|
ld [hl], d
|
|
ret
|
|
|
|
.MovementScreenShake:
|
|
call EndSpriteMovement
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_00
|
|
ld hl, OBJECT_RANGE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
call ._MovementScreenShake
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], e
|
|
ld hl, OBJECT_30
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_15
|
|
ret
|
|
|
|
._MovementScreenShake:
|
|
ld d, a
|
|
and %00111111
|
|
ld e, a
|
|
ld a, d
|
|
rlca
|
|
rlca
|
|
and %00000011
|
|
ld d, a
|
|
inc d
|
|
ld a, 1
|
|
.loop
|
|
dec d
|
|
ret z
|
|
add a
|
|
jr .loop
|
|
|
|
.RandomWalkContinue:
|
|
call InitStep
|
|
call Function6ec1 ; check whether the object can move in that direction
|
|
jr c, .NewDuration
|
|
call UpdateTallGrassFlags
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_STEP
|
|
ld hl, wCenteredObject
|
|
ld a, [hMapObjectIndexBuffer]
|
|
cp [hl]
|
|
jr z, .load_6
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_07
|
|
ret
|
|
|
|
.load_6
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_PLAYER_WALK
|
|
ret
|
|
|
|
.NewDuration:
|
|
call EndSpriteMovement
|
|
call Function462a
|
|
RandomStepDuration_Slow: ; 4b1d
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
and %01111111
|
|
jr SetRandomStepDuration
|
|
; 4b26
|
|
|
|
RandomStepDuration_Fast: ; 4b26
|
|
call Random
|
|
ld a, [hRandomAdd]
|
|
and %00011111
|
|
SetRandomStepDuration: ; 4b2d
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_STAND
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_03
|
|
ret
|
|
; 4b45
|
|
|
|
StepTypesJumptable: ; 4b45
|
|
; These pointers use OBJECT_STEP_TYPE. See constants/sprite_constants.asm
|
|
dw ObjectMovementReset ; 00
|
|
dw MapObjectMovementPattern ; unused
|
|
dw NPCStep ; 02 npc walk
|
|
dw StepType03 ; 03
|
|
dw StepType04 ; 04
|
|
dw StepType05 ; 05
|
|
dw PlayerStep ; 06 player walk
|
|
dw StepType07 ; 07
|
|
dw NPCJump ; 08 npc jump step
|
|
dw PlayerJump ; 09 player jump step
|
|
dw PlayerOrNPCTurnStep ; 0a half step
|
|
dw StepTypeBump ; 0b
|
|
dw TeleportFrom ; 0c teleport from
|
|
dw TeleportTo ; 0d teleport to
|
|
dw Skyfall ; 0e skyfall
|
|
dw StepType0f ; 0f
|
|
dw GotBiteStep ; 10
|
|
dw RockSmashStep ; 11
|
|
dw ReturnDigStep ; 12
|
|
dw StepTypeTrackingObject ; 13
|
|
dw StepType14 ; 14
|
|
dw StepType15 ; 15
|
|
dw StepType16 ; 16
|
|
dw StepType17 ; 17
|
|
dw StepType18 ; 18
|
|
dw SkyfallTop ; 19
|
|
; 4b79
|
|
|
|
WaitStep_InPlace: ; 4b79
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4b86
|
|
|
|
NPCJump: ; 4b86
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .Jump
|
|
dw .Land
|
|
|
|
.Jump:
|
|
call AddStepVector
|
|
call UpdateJumpPosition
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
call GetNextTile
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 3, [hl]
|
|
call IncrementObjectStructField28
|
|
ret
|
|
|
|
.Land:
|
|
call AddStepVector
|
|
call UpdateJumpPosition
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4bbf
|
|
|
|
PlayerJump: ; 4bbf
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .initjump
|
|
dw .stepjump
|
|
dw .initland
|
|
dw .stepland
|
|
|
|
.initjump
|
|
ld hl, wPlayerStepFlags
|
|
set 7, [hl]
|
|
call IncrementObjectStructField28
|
|
.stepjump
|
|
call UpdateJumpPosition
|
|
call UpdatePlayerStep
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 3, [hl]
|
|
ld hl, wPlayerStepFlags
|
|
set 6, [hl]
|
|
set 4, [hl]
|
|
call IncrementObjectStructField28
|
|
ret
|
|
|
|
.initland
|
|
call GetNextTile
|
|
ld hl, wPlayerStepFlags
|
|
set 7, [hl]
|
|
call IncrementObjectStructField28
|
|
.stepland
|
|
call UpdateJumpPosition
|
|
call UpdatePlayerStep
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, wPlayerStepFlags
|
|
set 6, [hl]
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4c18
|
|
|
|
TeleportFrom: ; 4c18
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .InitSpin
|
|
dw .DoSpin
|
|
dw .InitSpinRise
|
|
dw .DoSpinRise
|
|
; 4c23
|
|
|
|
.InitSpin:
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 16
|
|
call IncrementObjectStructField28
|
|
.DoSpin:
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_SPIN
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call IncrementObjectStructField28
|
|
ret
|
|
|
|
.InitSpinRise:
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_31
|
|
add hl, bc
|
|
ld [hl], $10
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 16
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 3, [hl]
|
|
call IncrementObjectStructField28
|
|
.DoSpinRise:
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_SPIN
|
|
ld hl, OBJECT_31
|
|
add hl, bc
|
|
inc [hl]
|
|
ld a, [hl]
|
|
ld d, $60
|
|
call Sine
|
|
ld a, h
|
|
sub $60
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4c89
|
|
|
|
TeleportTo: ; 4c89
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .InitWait
|
|
dw .DoWait
|
|
dw .InitDescent
|
|
dw .DoDescent
|
|
dw .InitFinalSpin
|
|
dw .DoFinalSpin
|
|
dw .FinishStep
|
|
; 4c9a
|
|
|
|
.InitWait:
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_00
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 16
|
|
call IncrementObjectStructField28
|
|
ret
|
|
; 4caa
|
|
|
|
.DoWait:
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call IncrementObjectStructField28
|
|
.InitDescent:
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_31
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 16
|
|
call IncrementObjectStructField28
|
|
ret
|
|
; 4cc9
|
|
|
|
.DoDescent:
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_SPIN
|
|
ld hl, OBJECT_31
|
|
add hl, bc
|
|
inc [hl]
|
|
ld a, [hl]
|
|
ld d, $60
|
|
call Sine
|
|
ld a, h
|
|
sub $60
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call IncrementObjectStructField28
|
|
.InitFinalSpin:
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 16
|
|
call IncrementObjectStructField28
|
|
ret
|
|
; 4cf5
|
|
|
|
.DoFinalSpin:
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_SPIN
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
.FinishStep:
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4d14
|
|
|
|
Skyfall: ; 4d14
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .Init
|
|
dw .Step
|
|
dw .Fall
|
|
dw .Finish
|
|
; 4d1f
|
|
|
|
.Init:
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_00
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 16
|
|
call IncrementObjectStructField28
|
|
.Step:
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_STEP
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_31
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 16
|
|
call IncrementObjectStructField28
|
|
.Fall:
|
|
ld hl, OBJECT_31
|
|
add hl, bc
|
|
inc [hl]
|
|
ld a, [hl]
|
|
ld d, $60
|
|
call Sine
|
|
ld a, h
|
|
sub $60
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call IncrementObjectStructField28
|
|
.Finish:
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4d7e
|
|
|
|
GotBiteStep: ; 4d7e
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .Init
|
|
dw .Run
|
|
; 4d85
|
|
|
|
.Init:
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 8
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], 0
|
|
call IncrementObjectStructField28
|
|
.Run:
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld a, [hl]
|
|
xor 1
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4daf
|
|
|
|
RockSmashStep: ; 4daf
|
|
call .Step
|
|
jp WaitStep_InPlace
|
|
; 4db5
|
|
|
|
.Step:
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %00000001
|
|
ld a, PERSON_ACTION_STAND
|
|
jr z, .yes
|
|
ld a, PERSON_ACTION_00
|
|
.yes
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], a
|
|
ret
|
|
; 4dc8
|
|
|
|
ReturnDigStep: ; 4dc8
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %00000001
|
|
ld a, PERSON_ACTION_SPIN
|
|
jr z, .yes
|
|
ld a, PERSON_ACTION_SPIN_FLICKER
|
|
.yes
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], a
|
|
jp WaitStep_InPlace
|
|
; 4ddd
|
|
|
|
StepType03: ; 4ddd
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4df0
|
|
|
|
StepType18: ; 4df0
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
jp DeleteMapObject
|
|
; 4dff
|
|
|
|
StepTypeBump: ; 4dff
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4e0c
|
|
|
|
StepType05: ; 4e0c
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .Reset
|
|
dw StepType04
|
|
|
|
.Reset:
|
|
call RestoreDefaultMovement
|
|
call GetInitialFacing
|
|
ld hl, OBJECT_FACING
|
|
add hl, bc
|
|
ld [hl], a
|
|
call IncrementObjectStructField28
|
|
StepType04: ; 4e21
|
|
call MobileFn_4fb2
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ret
|
|
; 4e2b
|
|
|
|
NPCStep: ; 4e2b
|
|
call MobileFn_4fb2
|
|
call AddStepVector
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4e47
|
|
|
|
StepType07: ; 4e47
|
|
call AddStepVector
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
jp RandomStepDuration_Slow
|
|
; 4e56
|
|
|
|
PlayerStep: ; 4e56
|
|
; AnimateStep?
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .init
|
|
dw .step
|
|
|
|
.init
|
|
ld hl, wPlayerStepFlags
|
|
set 7, [hl]
|
|
call IncrementObjectStructField28
|
|
.step
|
|
call UpdatePlayerStep
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, wPlayerStepFlags
|
|
set 6, [hl]
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4e83
|
|
|
|
PlayerOrNPCTurnStep: ; 4e83
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .init1
|
|
dw .step1
|
|
dw .init2
|
|
dw .step2
|
|
|
|
.init1
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld [hl], 2
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 2
|
|
call IncrementObjectStructField28
|
|
.step1
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
call IncrementObjectStructField28
|
|
.init2
|
|
ld hl, OBJECT_29 ; new facing
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_FACING
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 2
|
|
call IncrementObjectStructField28
|
|
.step2
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4ecd
|
|
|
|
StepType0f: ; 4ecd
|
|
call AddStepVector
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
push bc
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld d, [hl]
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld e, [hl]
|
|
ld hl, OBJECT_MAP_OBJECT_INDEX
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld b, a
|
|
callba CopyDECoordsToMapObject
|
|
pop bc
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 2, [hl]
|
|
call CopyNextCoordsTileToStandingCoordsTile
|
|
ld hl, OBJECT_DIRECTION_WALKING
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4f04
|
|
|
|
StepTypeTrackingObject: ; 4f04
|
|
ld hl, OBJECT_29
|
|
add hl, bc
|
|
ld e, [hl]
|
|
inc hl
|
|
ld d, [hl]
|
|
ld hl, OBJECT_SPRITE
|
|
add hl, de
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .nope
|
|
ld hl, OBJECT_SPRITE_X
|
|
add hl, de
|
|
ld a, [hl]
|
|
ld hl, OBJECT_SPRITE_X
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_SPRITE_Y
|
|
add hl, de
|
|
ld a, [hl]
|
|
ld hl, OBJECT_SPRITE_Y
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and a
|
|
ret z
|
|
dec [hl]
|
|
ret nz
|
|
.nope
|
|
jp DeleteMapObject
|
|
; 4f33
|
|
|
|
StepType14: ; 4f33
|
|
StepType15: ; 4f33
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .Init
|
|
dw .Run
|
|
|
|
.Init:
|
|
xor a
|
|
ld hl, OBJECT_29
|
|
add hl, bc
|
|
ld [hl], a
|
|
call IncrementObjectStructField28
|
|
.Run:
|
|
ld hl, OBJECT_29
|
|
add hl, bc
|
|
ld d, [hl]
|
|
ld a, [wPlayerStepVectorY]
|
|
sub d
|
|
ld [wPlayerStepVectorY], a
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
jr z, .ok
|
|
ld a, [hl]
|
|
call .GetSign
|
|
ld hl, OBJECT_29
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld d, a
|
|
ld a, [wPlayerStepVectorY]
|
|
add d
|
|
ld [wPlayerStepVectorY], a
|
|
ret
|
|
|
|
.ok
|
|
call DeleteMapObject
|
|
ret
|
|
|
|
.GetSign:
|
|
ld hl, OBJECT_30
|
|
add hl, bc
|
|
and 1
|
|
ld a, [hl]
|
|
ret z
|
|
cpl
|
|
inc a
|
|
ret
|
|
; 4f77
|
|
|
|
StepType16: ; 4f77
|
|
call Object28AnonymousJumptable ; ????
|
|
; 4f7a
|
|
StepType17: ; 4f7a
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .null
|
|
dw .null
|
|
dw .null
|
|
.null
|
|
; 4f83
|
|
|
|
SkyfallTop: ; 4f83
|
|
call Object28AnonymousJumptable
|
|
; anonymous dw
|
|
dw .Init
|
|
dw .Run
|
|
|
|
.Init:
|
|
ld hl, OBJECT_ACTION
|
|
add hl, bc
|
|
ld [hl], PERSON_ACTION_SKYFALL
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
ld [hl], 16
|
|
call IncrementObjectStructField28
|
|
|
|
.Run:
|
|
ld hl, OBJECT_STEP_DURATION
|
|
add hl, bc
|
|
dec [hl]
|
|
ret nz
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], $60
|
|
ld hl, OBJECT_STEP_FRAME
|
|
add hl, bc
|
|
ld [hl], 0
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_SLEEP
|
|
ret
|
|
; 4fb2
|
|
|
|
MobileFn_4fb2: mobile
|
|
ld hl, OBJECT_29
|
|
add hl, bc
|
|
inc [hl]
|
|
ld a, [hl]
|
|
srl a
|
|
srl a
|
|
and %00000111
|
|
ld l, a
|
|
ld h, 0
|
|
ld de, .y
|
|
add hl, de
|
|
ld a, [hl]
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], a
|
|
ret
|
|
|
|
.y ; 4fcd
|
|
db 0, -1, -2, -3, -4, -3, -2, -1
|
|
; 4fd5
|
|
UpdateJumpPosition: ; 4fd5
|
|
call GetStepVector
|
|
ld a, h
|
|
ld hl, OBJECT_31
|
|
add hl, bc
|
|
ld e, [hl]
|
|
add e
|
|
ld [hl], a
|
|
nop
|
|
srl e
|
|
ld d, 0
|
|
ld hl, .y
|
|
add hl, de
|
|
ld a, [hl]
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld [hl], a
|
|
ret
|
|
|
|
.y ; 4ff0
|
|
db -4, -6, -8, -10, -11, -12, -12, -12
|
|
db -11, -10, -9, -8, -6, -4, 0, 0
|
|
; 5000
|
|
Function5000: ; unscripted?
|
|
; copy [wPlayerNextMovement] to [wPlayerMovement]
|
|
ld a, [wPlayerNextMovement]
|
|
ld hl, wPlayerMovement
|
|
ld [hl], a
|
|
; load [wPlayerNextMovement] with movement_step_sleep
|
|
ld a, movement_step_sleep
|
|
ld [wPlayerNextMovement], a
|
|
; recover the previous value of [wPlayerNextMovement]
|
|
ld a, [hl]
|
|
ret
|
|
; 500e
|
|
|
|
GetMovementByte:
|
|
ld hl, wMovementDataPointer
|
|
call _GetMovementByte
|
|
ret
|
|
; 5015
|
|
|
|
Function5015: ; 5015
|
|
ld hl, OBJECT_MOVEMENT_BYTE_INDEX
|
|
add hl, bc
|
|
ld e, [hl]
|
|
inc [hl]
|
|
ld d, 0
|
|
ld hl, wc2e2
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
add hl, de
|
|
ld a, [hl]
|
|
ret
|
|
; 5026
|
|
|
|
Function5026: ; 5026
|
|
ld hl, OBJECT_MOVEMENT_BYTE_INDEX
|
|
add hl, bc
|
|
ld e, [hl]
|
|
inc [hl]
|
|
ld d, 0
|
|
ld hl, wc2e6
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
add hl, de
|
|
ld a, [hl]
|
|
ret
|
|
; 5037
|
|
|
|
_GetMovementPerson: ; 5037
|
|
ld hl, GetMovementPerson
|
|
jp HandleMovementData
|
|
; 503d
|
|
|
|
GetMovementPerson: ; 503d
|
|
ld a, [wMovementPerson]
|
|
ret
|
|
; 5041
|
|
|
|
HandleMovementData: ; 5041
|
|
call .StorePointer
|
|
.loop
|
|
xor a
|
|
ld [wMovementByteWasControlSwitch], a
|
|
call JumpMovementPointer
|
|
call DoMovementFunction
|
|
ld a, [wMovementByteWasControlSwitch]
|
|
and a
|
|
jr nz, .loop
|
|
ret
|
|
|
|
.StorePointer:
|
|
ld a, l
|
|
ld [wMovementPointer], a
|
|
ld a, h
|
|
ld [wMovementPointer + 1], a
|
|
ret
|
|
; 505e
|
|
|
|
JumpMovementPointer: ; 505e
|
|
ld hl, wMovementPointer
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
jp hl
|
|
; 5065
|
|
|
|
ContinueReadingMovement: ; 5065
|
|
ld a, 1
|
|
ld [wMovementByteWasControlSwitch], a
|
|
ret
|
|
; 506b
|
|
|
|
DoMovementFunction: ; 506b
|
|
push af
|
|
call ApplyMovementToFollower
|
|
pop af
|
|
ld hl, MovementPointers
|
|
rst JumpTable
|
|
ret
|
|
; 5075
|
|
|
|
INCLUDE "engine/movement.asm"
|
|
; 54b8
|
|
|
|
ApplyMovementToFollower: ; 54b8
|
|
ld e, a
|
|
ld a, [wObjectFollow_Follower]
|
|
cp -1
|
|
ret z
|
|
ld a, [wObjectFollow_Leader]
|
|
ld d, a
|
|
ld a, [hMapObjectIndexBuffer]
|
|
cp d
|
|
ret nz
|
|
ld a, e
|
|
cp movement_step_sleep
|
|
ret z
|
|
cp movement_step_end
|
|
ret z
|
|
cp movement_step_4b
|
|
ret z
|
|
cp movement_step_bump
|
|
ret z
|
|
cp movement_slow_step
|
|
ret c
|
|
push af
|
|
ld hl, wFollowerMovementQueueLength
|
|
inc [hl]
|
|
ld e, [hl]
|
|
ld d, 0
|
|
ld hl, wFollowMovementQueue
|
|
add hl, de
|
|
pop af
|
|
ld [hl], a
|
|
ret
|
|
; 54e6
|
|
|
|
GetFollowerNextMovementByte: ; 54e6
|
|
ld hl, wFollowerMovementQueueLength
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .done
|
|
cp -1
|
|
jr z, .done
|
|
dec [hl]
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, wFollowMovementQueue
|
|
add hl, de
|
|
inc e
|
|
ld a, -1
|
|
.loop
|
|
ld d, [hl]
|
|
ld [hld], a
|
|
ld a, d
|
|
dec e
|
|
jr nz, .loop
|
|
ret
|
|
|
|
.done
|
|
call .CancelFollowIfLeaderMissing
|
|
ret c
|
|
ld a, movement_step_sleep
|
|
ret
|
|
|
|
.CancelFollowIfLeaderMissing:
|
|
ld a, [wObjectFollow_Leader]
|
|
cp -1
|
|
jr z, .nope
|
|
push bc
|
|
call GetObjectStruct
|
|
ld hl, OBJECT_SPRITE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop bc
|
|
and a
|
|
jr z, .nope
|
|
and a
|
|
ret
|
|
|
|
.nope
|
|
ld a, -1
|
|
ld [wObjectFollow_Follower], a
|
|
ld a, movement_step_end
|
|
scf
|
|
ret
|
|
; 5529
|
|
|
|
SpawnShadow: ; 5529
|
|
push bc
|
|
ld de, .ShadowObject
|
|
call CopyTempObjectData
|
|
call InitTempObject
|
|
pop bc
|
|
ret
|
|
|
|
.ShadowObject:
|
|
; vtile, palette, movement
|
|
db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SHADOW
|
|
; 5538
|
|
SpawnStrengthBoulderDust: ; 5538
|
|
push bc
|
|
ld de, .BoulderDustObject
|
|
call CopyTempObjectData
|
|
call InitTempObject
|
|
pop bc
|
|
ret
|
|
|
|
.BoulderDustObject:
|
|
db $00, PAL_OW_SILVER, SPRITEMOVEDATA_BOULDERDUST
|
|
; 5547
|
|
SpawnEmote: ; 5547
|
|
push bc
|
|
ld de, .EmoteObject
|
|
call CopyTempObjectData
|
|
call InitTempObject
|
|
pop bc
|
|
ret
|
|
|
|
.EmoteObject:
|
|
db $00, PAL_OW_SILVER, SPRITEMOVEDATA_EMOTE
|
|
; 5556
|
|
ShakeGrass: ; 5556
|
|
push bc
|
|
ld de, .data_5562
|
|
call CopyTempObjectData
|
|
call InitTempObject
|
|
pop bc
|
|
ret
|
|
|
|
.data_5562
|
|
db $00, PAL_OW_TREE, SPRITEMOVEDATA_GRASS
|
|
; 5565
|
|
ShakeScreen: ; 5565
|
|
push bc
|
|
push af
|
|
ld de, .ScreenShakeObject
|
|
call CopyTempObjectData
|
|
pop af
|
|
ld [wTempObjectCopyRange], a
|
|
call InitTempObject
|
|
pop bc
|
|
ret
|
|
|
|
.ScreenShakeObject:
|
|
db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SCREENSHAKE
|
|
; 5579
|
|
DespawnEmote: ; 5579
|
|
push bc
|
|
ld a, [hMapObjectIndexBuffer]
|
|
ld c, a
|
|
call .DeleteEmote
|
|
pop bc
|
|
ret
|
|
|
|
.DeleteEmote:
|
|
ld de, ObjectStructs
|
|
ld a, NUM_OBJECT_STRUCTS
|
|
.loop
|
|
push af
|
|
ld hl, OBJECT_FLAGS1
|
|
add hl, de
|
|
bit EMOTE_OBJECT, [hl]
|
|
jr z, .next
|
|
ld hl, OBJECT_SPRITE
|
|
add hl, de
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .next
|
|
push bc
|
|
xor a
|
|
ld bc, OBJECT_STRUCT_LENGTH
|
|
call ByteFill
|
|
pop bc
|
|
.next
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, de
|
|
ld d, h
|
|
ld e, l
|
|
pop af
|
|
dec a
|
|
jr nz, .loop
|
|
ret
|
|
; 55ac
|
|
|
|
InitTempObject: ; 55ac
|
|
call FindFirstEmptyObjectStruct
|
|
ret nc
|
|
ld d, h
|
|
ld e, l
|
|
callba CopyTempObjectToObjectStruct
|
|
ret
|
|
; 55b9
|
|
|
|
CopyTempObjectData: ; 55b9
|
|
; load into wTempObjectCopy:
|
|
; -1, -1, [de], [de + 1], [de + 2], [hMapObjectIndexBuffer], [NextMapX], [NextMapY], -1
|
|
; This spawns the object at the same place as whichever object is loaded into bc.
|
|
ld hl, wTempObjectCopyMapObjectIndex
|
|
ld [hl], -1
|
|
inc hl
|
|
ld [hl], -1
|
|
inc hl
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
ld a, [de]
|
|
ld [hli], a
|
|
ld a, [hMapObjectIndexBuffer]
|
|
ld [hli], a
|
|
push hl
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld d, [hl]
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld e, [hl]
|
|
pop hl
|
|
ld [hl], d
|
|
inc hl
|
|
ld [hl], e
|
|
inc hl
|
|
ld [hl], -1
|
|
ret
|
|
; 55e0
|
|
|
|
Function55e0:: ; 55e0
|
|
ld a, [VramState]
|
|
bit 0, a
|
|
ret z
|
|
ld bc, ObjectStructs
|
|
xor a
|
|
.loop
|
|
ld [hMapObjectIndexBuffer], a
|
|
call DoesObjectHaveASprite
|
|
jr z, .ok
|
|
call Function565c
|
|
.ok
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, bc
|
|
ld b, h
|
|
ld c, l
|
|
ld a, [hMapObjectIndexBuffer]
|
|
inc a
|
|
cp NUM_OBJECT_STRUCTS
|
|
jr nz, .loop
|
|
ret
|
|
; 5602
|
|
|
|
Function5602: ; 5602, called at battle start
|
|
call Function5645 ; clear sprites
|
|
ld a, PLAYER
|
|
call Function5629 ; respawn player
|
|
ld a, [wBattleScriptFlags]
|
|
bit 7, a
|
|
jr z, .ok
|
|
ld a, [hLastTalked]
|
|
and a
|
|
jr z, .ok
|
|
call Function5629 ; respawn opponent
|
|
.ok
|
|
call _UpdateSprites
|
|
ret
|
|
; 561d
|
|
|
|
Function561d: ; 561d
|
|
call Function5645 ; clear sprites
|
|
ld a, PLAYER
|
|
call Function5629 ; respawn player
|
|
call _UpdateSprites
|
|
ret
|
|
; 5629
|
|
|
|
Function5629: ; 5629
|
|
cp NUM_OBJECTS
|
|
ret nc
|
|
call GetMapObject
|
|
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp -1
|
|
ret z
|
|
cp NUM_OBJECT_STRUCTS
|
|
ret nc
|
|
call GetObjectStruct
|
|
call DoesObjectHaveASprite
|
|
ret z
|
|
call Function5673
|
|
ret
|
|
; 5645
|
|
|
|
Function5645: ; 5645
|
|
xor a
|
|
ld bc, ObjectStructs
|
|
.loop
|
|
ld [hMapObjectIndexBuffer], a
|
|
call SetFacing_Standing
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, bc
|
|
ld b, h
|
|
ld c, l
|
|
ld a, [hMapObjectIndexBuffer]
|
|
inc a
|
|
cp NUM_OBJECT_STRUCTS
|
|
jr nz, .loop
|
|
ret
|
|
; 565c
|
|
|
|
Function565c: ; 565c
|
|
push bc
|
|
call Function56cd
|
|
pop bc
|
|
jr c, SetFacing_Standing
|
|
call Function56a3
|
|
jr c, SetFacing_Standing
|
|
call Function5688
|
|
callba Function4440
|
|
xor a
|
|
ret
|
|
; 5673
|
|
|
|
Function5673: ; 5673
|
|
call Function56a3
|
|
jr c, SetFacing_Standing
|
|
callba Function4440 ; no need to farcall
|
|
xor a
|
|
ret
|
|
; 5680
|
|
|
|
SetFacing_Standing: ; 5680
|
|
ld hl, OBJECT_FACING_STEP
|
|
add hl, bc
|
|
ld [hl], STANDING
|
|
scf
|
|
ret
|
|
; 5688
|
|
|
|
Function5688: ; 5688
|
|
push bc
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld d, [hl]
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld e, [hl]
|
|
call GetCoordTile
|
|
pop bc
|
|
ld hl, OBJECT_NEXT_TILE
|
|
add hl, bc
|
|
ld [hl], a
|
|
callba UpdateTallGrassFlags ; no need to farcall
|
|
ret
|
|
; 56a3
|
|
|
|
Function56a3: ; 56a3
|
|
ld hl, OBJECT_NEXT_MAP_X
|
|
add hl, bc
|
|
ld d, [hl]
|
|
ld hl, OBJECT_NEXT_MAP_Y
|
|
add hl, bc
|
|
ld e, [hl]
|
|
inc d
|
|
inc e
|
|
ld a, [XCoord]
|
|
cp d
|
|
jr z, .equal_x
|
|
jr nc, .nope
|
|
add $b
|
|
cp d
|
|
jr c, .nope
|
|
.equal_x
|
|
ld a, [YCoord]
|
|
cp e
|
|
jr z, .equal_y
|
|
jr nc, .nope
|
|
add $a
|
|
cp e
|
|
jr c, .nope
|
|
.equal_y
|
|
xor a
|
|
ret
|
|
|
|
.nope
|
|
scf
|
|
ret
|
|
; 56cd
|
|
|
|
Function56cd: ; 56cd
|
|
ld a, [wPlayerBGMapOffsetX]
|
|
ld d, a
|
|
ld hl, OBJECT_SPRITE_X_OFFSET
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_SPRITE_X
|
|
add hl, bc
|
|
add [hl]
|
|
add d
|
|
cp $f0
|
|
jr nc, .ok1
|
|
cp $a0
|
|
jp nc, .nope
|
|
.ok1
|
|
and %00000111
|
|
ld d, 2
|
|
cp 4
|
|
jr c, .ok2
|
|
ld d, 3
|
|
.ok2
|
|
ld a, [hl]
|
|
srl a
|
|
srl a
|
|
srl a
|
|
cp SCREEN_WIDTH
|
|
jr c, .ok3
|
|
sub $20
|
|
.ok3
|
|
ld [hUsedSpriteIndex], a
|
|
ld a, [wPlayerBGMapOffsetY]
|
|
ld e, a
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_SPRITE_Y
|
|
add hl, bc
|
|
add [hl]
|
|
add e
|
|
cp $f0
|
|
jr nc, .ok4
|
|
cp $90
|
|
jr nc, .nope
|
|
.ok4
|
|
and %00000111
|
|
ld e, 2
|
|
cp 4
|
|
jr c, .ok5
|
|
ld e, 3
|
|
.ok5
|
|
ld a, [hl]
|
|
srl a
|
|
srl a
|
|
srl a
|
|
cp $12
|
|
jr c, .ok6
|
|
sub $20
|
|
.ok6
|
|
ld [hUsedSpriteTile], a
|
|
ld hl, OBJECT_PALETTE
|
|
add hl, bc
|
|
bit 7, [hl]
|
|
jr z, .ok7
|
|
ld a, d
|
|
add 2
|
|
ld d, a
|
|
ld a, e
|
|
add 2
|
|
ld e, a
|
|
.ok7
|
|
ld a, d
|
|
ld [hFFBF], a
|
|
.loop
|
|
ld a, [hFFBF]
|
|
ld d, a
|
|
ld a, [hUsedSpriteTile]
|
|
add e
|
|
dec a
|
|
cp $12
|
|
jr nc, .ok9
|
|
ld b, a
|
|
.next
|
|
ld a, [hUsedSpriteIndex]
|
|
add d
|
|
dec a
|
|
cp $14
|
|
jr nc, .ok8
|
|
ld c, a
|
|
push bc
|
|
call Coord2Tile
|
|
pop bc
|
|
ld a, [hl]
|
|
cp $60
|
|
jr nc, .nope
|
|
.ok8
|
|
dec d
|
|
jr nz, .next
|
|
.ok9
|
|
dec e
|
|
jr nz, .loop
|
|
and a
|
|
ret
|
|
|
|
.nope
|
|
scf
|
|
ret
|
|
; 576a
|
|
|
|
HandleNPCStep:: ; 576a
|
|
call .ResetStepVector
|
|
call .DoStepsForAllObjects
|
|
ret
|
|
|
|
.ResetStepVector:
|
|
xor a
|
|
ld [wPlayerStepVectorX], a
|
|
ld [wPlayerStepVectorY], a
|
|
ld [wPlayerStepFlags], a
|
|
ld a, -1
|
|
ld [wPlayerStepDirection], a
|
|
ret
|
|
|
|
.DoStepsForAllObjects:
|
|
ld bc, ObjectStructs
|
|
xor a
|
|
.loop
|
|
ld [hMapObjectIndexBuffer], a
|
|
call DoesObjectHaveASprite
|
|
jr z, .next
|
|
call Function437b
|
|
.next
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, bc
|
|
ld b, h
|
|
ld c, l
|
|
ld a, [hMapObjectIndexBuffer]
|
|
inc a
|
|
cp NUM_OBJECT_STRUCTS
|
|
jr nz, .loop
|
|
ret
|
|
; 579d
|
|
|
|
RefreshPlayerSprite: ; 579d
|
|
ld a, movement_step_sleep
|
|
ld [wPlayerNextMovement], a
|
|
ld [wPlayerMovement], a
|
|
xor a
|
|
ld [wPlayerTurningDirection], a
|
|
ld [PlayerObjectStepFrame], a
|
|
call .TryResetPlayerAction
|
|
callba CheckWarpFacingDown
|
|
call c, SpawnInFacingDown
|
|
call .SpawnInCustomFacing
|
|
ret
|
|
; 57bc
|
|
|
|
.TryResetPlayerAction: ; 57bc
|
|
ld hl, wPlayerSpriteSetupFlags
|
|
bit 7, [hl]
|
|
jr nz, .ok
|
|
ret
|
|
|
|
.ok
|
|
ld a, PERSON_ACTION_00
|
|
ld [PlayerAction], a
|
|
ret
|
|
; 57ca
|
|
|
|
.SpawnInCustomFacing: ; 57ca
|
|
ld hl, wPlayerSpriteSetupFlags
|
|
bit 5, [hl]
|
|
ret z
|
|
ld a, [wPlayerSpriteSetupFlags]
|
|
and 3
|
|
add a
|
|
add a
|
|
jr ContinueSpawnFacing
|
|
; 57d9
|
|
|
|
SpawnInFacingDown: ; 57d9
|
|
ld a, 0
|
|
ContinueSpawnFacing: ; 57db
|
|
ld bc, PlayerStruct
|
|
call SetSpriteDirection
|
|
ret
|
|
; 57e2
|
|
|
|
SetPlayerPalette: ; 57e2
|
|
ld a, d
|
|
and %10000000
|
|
ret z
|
|
ld bc, 0 ; debug?
|
|
ld hl, OBJECT_FACING
|
|
add hl, bc
|
|
ld a, [hl]
|
|
or d
|
|
ld [hl], a
|
|
ld a, d
|
|
swap a
|
|
and %00000111
|
|
ld d, a
|
|
ld bc, PlayerStruct
|
|
ld hl, OBJECT_PALETTE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %11111000
|
|
or d
|
|
ld [hl], a
|
|
ret
|
|
; 5803
|
|
|
|
StartFollow:: ; 5803
|
|
push bc
|
|
ld a, b
|
|
call SetLeaderIfVisible
|
|
pop bc
|
|
ret c
|
|
ld a, c
|
|
call SetFollowerIfVisible
|
|
callba QueueFollowerFirstStep
|
|
ret
|
|
; 5815
|
|
|
|
SetLeaderIfVisible: ; 5815
|
|
call CheckObjectVisibility
|
|
ret c
|
|
ld a, [hObjectStructIndexBuffer]
|
|
ld [wObjectFollow_Leader], a
|
|
ret
|
|
; 581f
|
|
|
|
StopFollow:: ; 581f
|
|
call ResetLeader
|
|
call ResetFollower
|
|
ret
|
|
; 5826
|
|
|
|
ResetLeader: ; 5826
|
|
ld a, -1
|
|
ld [wObjectFollow_Leader], a
|
|
ret
|
|
; 582c
|
|
|
|
SetFollowerIfVisible: ; 582c
|
|
push af
|
|
call ResetFollower
|
|
pop af
|
|
call CheckObjectVisibility
|
|
ret c
|
|
ld hl, OBJECT_MOVEMENTTYPE
|
|
add hl, bc
|
|
ld [hl], SPRITEMOVEDATA_FOLLOWING
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_00
|
|
ld a, [hObjectStructIndexBuffer]
|
|
ld [wObjectFollow_Follower], a
|
|
ret
|
|
; 5847
|
|
|
|
ResetFollower: ; 5847
|
|
ld a, [wObjectFollow_Follower]
|
|
cp -1
|
|
ret z
|
|
call GetObjectStruct
|
|
callba Function58e3 ; no need to bankswitch
|
|
ld a, -1
|
|
ld [wObjectFollow_Follower], a
|
|
ret
|
|
; 585c
|
|
|
|
SetFlagsForMovement_1:: ; 585c
|
|
ld a, c
|
|
call CheckObjectVisibility
|
|
ret c
|
|
push bc
|
|
call Function587a
|
|
pop bc
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 5, [hl]
|
|
xor a
|
|
ret
|
|
; 586e
|
|
|
|
Function586e: ; 586e
|
|
call CheckObjectVisibility
|
|
ret c
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
set 5, [hl]
|
|
xor a
|
|
ret
|
|
; 587a
|
|
|
|
Function587a: ; 587a
|
|
ld bc, ObjectStructs
|
|
xor a
|
|
.loop
|
|
push af
|
|
call DoesObjectHaveASprite
|
|
jr z, .next
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
set 5, [hl]
|
|
.next
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, bc
|
|
ld b, h
|
|
ld c, l
|
|
pop af
|
|
inc a
|
|
cp NUM_OBJECT_STRUCTS
|
|
jr nz, .loop
|
|
ret
|
|
; 5897
|
|
|
|
_SetFlagsForMovement_2:: ; 5897
|
|
ld a, [wObjectFollow_Leader]
|
|
cp -1
|
|
ret z
|
|
push bc
|
|
call GetObjectStruct
|
|
ld hl, OBJECT_MAP_OBJECT_INDEX
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop bc
|
|
cp c
|
|
ret nz
|
|
ld a, [wObjectFollow_Follower]
|
|
cp -1
|
|
ret z
|
|
call GetObjectStruct
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 5, [hl]
|
|
ret
|
|
; 58b9
|
|
|
|
Function58b9:: ; 58b9
|
|
push bc
|
|
ld bc, ObjectStructs
|
|
xor a
|
|
.loop
|
|
push af
|
|
call DoesObjectHaveASprite
|
|
jr z, .next
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 5, [hl]
|
|
.next
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, bc
|
|
ld b, h
|
|
ld c, l
|
|
pop af
|
|
inc a
|
|
cp NUM_OBJECT_STRUCTS
|
|
jr nz, .loop
|
|
pop bc
|
|
ret
|
|
; 58d8
|
|
|
|
Function58d8: ; 58d8
|
|
call CheckObjectVisibility
|
|
ret c
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
res 5, [hl]
|
|
ret
|
|
; 58e3
|
|
|
|
Function58e3: ; 58e3
|
|
ld hl, OBJECT_MAP_OBJECT_INDEX
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp -1
|
|
jp z, Function5903 ; a jr would have been appropriate here
|
|
push bc
|
|
call GetMapObject
|
|
ld hl, MAPOBJECT_MOVEMENT
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop bc
|
|
ld hl, OBJECT_MOVEMENTTYPE
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_00
|
|
ret
|
|
; 5903
|
|
|
|
Function5903: ; 5903
|
|
call GetSpriteDirection
|
|
rrca
|
|
rrca
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, .standing_movefns
|
|
add hl, de
|
|
ld a, [hl]
|
|
ld hl, OBJECT_MOVEMENTTYPE
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, OBJECT_STEP_TYPE
|
|
add hl, bc
|
|
ld [hl], STEP_TYPE_00
|
|
ret
|
|
|
|
.standing_movefns
|
|
db SPRITEMOVEDATA_STANDING_DOWN
|
|
db SPRITEMOVEDATA_STANDING_UP
|
|
db SPRITEMOVEDATA_STANDING_LEFT
|
|
db SPRITEMOVEDATA_STANDING_RIGHT
|
|
; 5920
|
|
_UpdateSprites:: ; 5920
|
|
ld a, [VramState]
|
|
bit 0, a
|
|
ret z
|
|
xor a
|
|
ld [hUsedSpriteIndex], a
|
|
ld a, [hOAMUpdate]
|
|
push af
|
|
ld a, 1
|
|
ld [hOAMUpdate], a
|
|
call InitSprites
|
|
call .fill
|
|
pop af
|
|
ld [hOAMUpdate], a
|
|
ret
|
|
|
|
.fill
|
|
ld a, [VramState]
|
|
bit 1, a
|
|
ld b, SpritesEnd % $100
|
|
jr z, .ok
|
|
ld b, 28 * 4
|
|
.ok
|
|
ld a, [hUsedSpriteIndex]
|
|
cp b
|
|
ret nc
|
|
ld l, a
|
|
ld h, Sprites / $100
|
|
ld de, 4
|
|
ld a, b
|
|
ld c, SCREEN_HEIGHT_PX + 16
|
|
.loop
|
|
ld [hl], c
|
|
add hl, de
|
|
cp l
|
|
jr nz, .loop
|
|
ret
|
|
; 5958
|
|
|
|
ApplyBGMapAnchorToObjects: ; 5958
|
|
push hl
|
|
push de
|
|
push bc
|
|
ld a, [wPlayerBGMapOffsetX]
|
|
ld d, a
|
|
ld a, [wPlayerBGMapOffsetY]
|
|
ld e, a
|
|
ld bc, ObjectStructs
|
|
ld a, NUM_OBJECT_STRUCTS
|
|
.loop
|
|
push af
|
|
call DoesObjectHaveASprite
|
|
jr z, .skip
|
|
ld hl, OBJECT_SPRITE_X
|
|
add hl, bc
|
|
ld a, [hl]
|
|
add d
|
|
ld [hl], a
|
|
ld hl, OBJECT_SPRITE_Y
|
|
add hl, bc
|
|
ld a, [hl]
|
|
add e
|
|
ld [hl], a
|
|
.skip
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, bc
|
|
ld b, h
|
|
ld c, l
|
|
pop af
|
|
dec a
|
|
jr nz, .loop
|
|
xor a
|
|
ld [wPlayerBGMapOffsetX], a
|
|
ld [wPlayerBGMapOffsetY], a
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
; 5991
|
|
|
|
InitSprites: ; 5991
|
|
PRIORITY_LOW EQU $10
|
|
PRIORITY_NORM EQU $20
|
|
PRIORITY_HIGH EQU $30
|
|
call .DeterminePriorities
|
|
ld c, PRIORITY_HIGH
|
|
call .InitSpritesByPriority
|
|
ld c, PRIORITY_NORM
|
|
call .InitSpritesByPriority
|
|
ld c, PRIORITY_LOW
|
|
call .InitSpritesByPriority
|
|
ret
|
|
|
|
.DeterminePriorities:
|
|
xor a
|
|
ld hl, wMovementPointer
|
|
ld bc, NUM_OBJECT_STRUCTS
|
|
call ByteFill
|
|
ld d, 0
|
|
ld bc, ObjectStructs
|
|
ld hl, wMovementPointer
|
|
.loop
|
|
push hl
|
|
call DoesObjectHaveASprite
|
|
jr z, .skip
|
|
ld hl, OBJECT_FACING_STEP
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp STANDING
|
|
jr z, .skip
|
|
; Define the sprite priority.
|
|
ld e, PRIORITY_LOW
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
bit 0, [hl]
|
|
jr nz, .add
|
|
ld e, PRIORITY_NORM
|
|
bit 1, [hl]
|
|
jr z, .add
|
|
ld e, PRIORITY_HIGH
|
|
jr .add
|
|
|
|
.skip
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, bc
|
|
ld b, h
|
|
ld c, l
|
|
pop hl
|
|
jr .next
|
|
|
|
.add
|
|
ld hl, OBJECT_STRUCT_LENGTH
|
|
add hl, bc
|
|
ld b, h
|
|
ld c, l
|
|
pop hl
|
|
ld a, d
|
|
or e
|
|
ld [hli], a
|
|
.next
|
|
inc d
|
|
ld a, d
|
|
cp NUM_OBJECT_STRUCTS
|
|
jr nz, .loop
|
|
ret
|
|
|
|
.InitSpritesByPriority:
|
|
ld hl, wMovementPointer
|
|
.next_sprite
|
|
ld a, [hli]
|
|
ld d, a
|
|
and $f0
|
|
ret z
|
|
cp c
|
|
jr nz, .next_sprite
|
|
push bc
|
|
push hl
|
|
ld a, d
|
|
and $f
|
|
call .GetObjectStructPointer
|
|
call .InitSprite
|
|
pop hl
|
|
pop bc
|
|
jr .next_sprite
|
|
|
|
.InitSprite:
|
|
ld hl, OBJECT_SPRITE_TILE
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and %01111111
|
|
ld [hFFC1], a
|
|
xor a
|
|
bit 7, [hl]
|
|
jr nz, .skip1
|
|
or %00001000
|
|
.skip1
|
|
ld hl, OBJECT_FLAGS2
|
|
add hl, bc
|
|
ld e, [hl]
|
|
bit 7, e
|
|
jr z, .skip2
|
|
or %10000000
|
|
.skip2
|
|
bit 4, e
|
|
jr z, .skip3
|
|
or %00010000
|
|
.skip3
|
|
ld hl, OBJECT_PALETTE
|
|
add hl, bc
|
|
ld d, a
|
|
ld a, [hl]
|
|
and %00000111
|
|
or d
|
|
ld d, a
|
|
xor a
|
|
bit 3, e
|
|
jr z, .skip4
|
|
or %10000000
|
|
.skip4
|
|
ld [hFFC2], a
|
|
ld hl, OBJECT_SPRITE_X
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_SPRITE_X_OFFSET
|
|
add hl, bc
|
|
add [hl]
|
|
add 8
|
|
ld e, a
|
|
ld a, [wPlayerBGMapOffsetX]
|
|
add e
|
|
ld [hFFBF], a
|
|
ld hl, OBJECT_SPRITE_Y
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld hl, OBJECT_SPRITE_Y_OFFSET
|
|
add hl, bc
|
|
add [hl]
|
|
add 12
|
|
ld e, a
|
|
ld a, [wPlayerBGMapOffsetY]
|
|
add e
|
|
ld [hFFC0], a
|
|
ld hl, OBJECT_FACING_STEP
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp STANDING
|
|
jp z, .done
|
|
cp NUM_FACINGS
|
|
jp nc, .done
|
|
ld l, a
|
|
ld h, 0
|
|
add hl, hl
|
|
ld bc, Facings
|
|
add hl, bc
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
ld a, [hUsedSpriteIndex]
|
|
ld c, a
|
|
ld b, Sprites / $100
|
|
ld a, [hli]
|
|
ld [hUsedSpriteTile], a
|
|
add c
|
|
cp SpritesEnd % $100
|
|
jr nc, .full
|
|
.addsprite
|
|
ld a, [hFFC0]
|
|
add [hl]
|
|
inc hl
|
|
ld [bc], a
|
|
inc c
|
|
ld a, [hFFBF]
|
|
add [hl]
|
|
inc hl
|
|
ld [bc], a
|
|
inc c
|
|
ld e, [hl]
|
|
inc hl
|
|
ld a, [hFFC1]
|
|
bit 2, e
|
|
jr z, .nope1
|
|
xor a
|
|
.nope1
|
|
add [hl]
|
|
inc hl
|
|
ld [bc], a
|
|
inc c
|
|
ld a, e
|
|
bit 1, a
|
|
jr z, .nope2
|
|
ld a, [hFFC2]
|
|
or e
|
|
.nope2
|
|
and %11110000
|
|
or d
|
|
ld [bc], a
|
|
inc c
|
|
ld a, [hUsedSpriteTile]
|
|
dec a
|
|
ld [hUsedSpriteTile], a
|
|
jr nz, .addsprite
|
|
ld a, c
|
|
ld [hUsedSpriteIndex], a
|
|
.done
|
|
xor a
|
|
ret
|
|
|
|
.full
|
|
scf
|
|
ret
|
|
|
|
.GetObjectStructPointer:
|
|
ld c, a
|
|
ld b, 0
|
|
ld hl, .Addresses
|
|
add hl, bc
|
|
add hl, bc
|
|
ld c, [hl]
|
|
inc hl
|
|
ld b, [hl]
|
|
ret
|
|
|
|
.Addresses: ; 5ace
|
|
dw PlayerStruct
|
|
dw Object1Struct
|
|
dw Object2Struct
|
|
dw Object3Struct
|
|
dw Object4Struct
|
|
dw Object5Struct
|
|
dw Object6Struct
|
|
dw Object7Struct
|
|
dw Object8Struct
|
|
dw Object9Struct
|
|
dw Object10Struct
|
|
dw Object11Struct
|
|
dw Object12Struct
|
|
; 5ae8
|