pokered/engine/overworld/missable_objects.asm

216 lines
3.6 KiB
NASM
Raw Normal View History

MarkTownVisitedAndLoadMissableObjects::
2017-01-01 01:23:54 +00:00
ld a, [wCurMap]
cp ROUTE_1
jr nc, .notInTown
ld c, a
ld b, FLAG_SET
ld hl, wTownVisitedFlag ; mark town as visited (for flying)
predef FlagActionPredef
.notInTown
ld hl, MapHSPointers
ld a, [wCurMap]
ld b, $0
ld c, a
add hl, bc
add hl, bc
ld a, [hli] ; load missable objects pointer in hl
ld h, [hl]
; fall through
LoadMissableObjects:
ld l, a
push hl
ld de, MapHS00 ; calculate difference between out pointer and the base pointer
ld a, l
sub e
jr nc, .asm_f13c
dec h
.asm_f13c
ld l, a
ld a, h
sub d
ld h, a
ld a, h
ld [H_DIVIDEND], a
ld a, l
ld [H_DIVIDEND+1], a
xor a
ld [H_DIVIDEND+2], a
ld [H_DIVIDEND+3], a
ld a, $3
ld [H_DIVISOR], a
ld b, $2
call Divide ; divide difference by 3, resulting in the global offset (number of missable items before ours)
ld a, [wCurMap]
ld b, a
ld a, [H_DIVIDEND+3]
ld c, a ; store global offset in c
ld de, wMissableObjectList
pop hl
.writeMissableObjectsListLoop
ld a, [hli]
cp $ff
jr z, .done ; end of list
cp b
jr nz, .done ; not for current map anymore
ld a, [hli]
inc hl
ld [de], a ; write (map-local) sprite ID
inc de
ld a, c
inc c
ld [de], a ; write (global) missable object index
inc de
jr .writeMissableObjectsListLoop
.done
ld a, $ff
ld [de], a ; write sentinel
ret
InitializeMissableObjectsFlags:
ld hl, wMissableObjectFlags
ld bc, wMissableObjectFlagsEnd - wMissableObjectFlags
xor a
call FillMemory ; clear missable objects flags
ld hl, MapHS00
xor a
ld [wMissableObjectCounter], a
.missableObjectsLoop
ld a, [hli]
cp $ff ; end of list
ret z
push hl
inc hl
ld a, [hl]
cp Hide
jr nz, .skip
ld hl, wMissableObjectFlags
ld a, [wMissableObjectCounter]
ld c, a
ld b, FLAG_SET
call MissableObjectFlagAction ; set flag if Item is hidden
.skip
ld hl, wMissableObjectCounter
inc [hl]
pop hl
inc hl
inc hl
jr .missableObjectsLoop
; tests if current sprite is a missable object that is hidden/has been removed
IsObjectHidden:
ld a, [H_CURRENTSPRITEOFFSET]
swap a
ld b, a
ld hl, wMissableObjectList
.loop
ld a, [hli]
cp $ff
jr z, .notHidden ; not missable -> not hidden
cp b
ld a, [hli]
jr nz, .loop
ld c, a
ld b, FLAG_TEST
ld hl, wMissableObjectFlags
call MissableObjectFlagAction
ld a, c
and a
jr nz, .hidden
.notHidden
xor a
.hidden
ld [$ffe5], a
ret
; adds missable object (items, leg. pokemon, etc.) to the map
; [wMissableObjectIndex]: index of the missable object to be added (global index)
ShowObject:
ShowObject2:
ld hl, wMissableObjectFlags
ld a, [wMissableObjectIndex]
ld c, a
ld b, FLAG_RESET
call MissableObjectFlagAction ; reset "removed" flag
jp UpdateSprites
; removes missable object (items, leg. pokemon, etc.) from the map
; [wMissableObjectIndex]: index of the missable object to be removed (global index)
HideObject:
ld hl, wMissableObjectFlags
ld a, [wMissableObjectIndex]
ld c, a
ld b, FLAG_SET
call MissableObjectFlagAction ; set "removed" flag
jp UpdateSprites
MissableObjectFlagAction:
; identical to FlagAction
push hl
push de
push bc
; bit
ld a, c
ld d, a
and 7
ld e, a
; byte
ld a, d
srl a
srl a
srl a
add l
ld l, a
jr nc, .ok
inc h
.ok
; d = 1 << e (bitmask)
inc e
ld d, 1
.shift
dec e
jr z, .shifted
sla d
jr .shift
.shifted
ld a, b
and a
jr z, .reset
cp 2
jr z, .read
.set
ld a, [hl]
ld b, a
ld a, d
or b
ld [hl], a
jr .done
.reset
ld a, [hl]
ld b, a
ld a, d
xor $ff
and b
ld [hl], a
jr .done
.read
ld a, [hl]
ld b, a
ld a, d
and b
.done
pop bc
pop de
pop hl
ld c, a
ret