mirror of https://github.com/pret/pokecrystal.git
582 lines
6.8 KiB
NASM
582 lines
6.8 KiB
NASM
_ReceiveItem::
|
|
call DoesHLEqualNumItems
|
|
jp nz, PutItemInPocket
|
|
push hl
|
|
call CheckItemPocket
|
|
pop de
|
|
ld a, [wItemAttributeParamBuffer]
|
|
dec a
|
|
ld hl, .Pockets
|
|
rst JumpTable
|
|
ret
|
|
|
|
.Pockets:
|
|
; entries correspond to item types
|
|
dw .Item
|
|
dw .KeyItem
|
|
dw .Ball
|
|
dw .TMHM
|
|
|
|
.Item:
|
|
ld h, d
|
|
ld l, e
|
|
jp PutItemInPocket
|
|
|
|
.KeyItem:
|
|
ld h, d
|
|
ld l, e
|
|
jp ReceiveKeyItem
|
|
|
|
.Ball:
|
|
ld hl, wNumBalls
|
|
jp PutItemInPocket
|
|
|
|
.TMHM:
|
|
ld h, d
|
|
ld l, e
|
|
ld a, [wCurItem]
|
|
ld c, a
|
|
call GetTMHMNumber
|
|
jp ReceiveTMHM
|
|
|
|
_TossItem::
|
|
call DoesHLEqualNumItems
|
|
jr nz, .remove
|
|
push hl
|
|
call CheckItemPocket
|
|
pop de
|
|
ld a, [wItemAttributeParamBuffer]
|
|
dec a
|
|
ld hl, .Pockets
|
|
rst JumpTable
|
|
ret
|
|
|
|
.Pockets:
|
|
; entries correspond to item types
|
|
dw .Item
|
|
dw .KeyItem
|
|
dw .Ball
|
|
dw .TMHM
|
|
|
|
.Ball:
|
|
ld hl, wNumBalls
|
|
jp RemoveItemFromPocket
|
|
|
|
.TMHM:
|
|
ld h, d
|
|
ld l, e
|
|
ld a, [wCurItem]
|
|
ld c, a
|
|
call GetTMHMNumber
|
|
jp TossTMHM
|
|
|
|
.KeyItem:
|
|
ld h, d
|
|
ld l, e
|
|
jp TossKeyItem
|
|
|
|
.Item:
|
|
ld h, d
|
|
ld l, e
|
|
|
|
.remove
|
|
jp RemoveItemFromPocket
|
|
|
|
_CheckItem::
|
|
call DoesHLEqualNumItems
|
|
jr nz, .nope
|
|
push hl
|
|
call CheckItemPocket
|
|
pop de
|
|
ld a, [wItemAttributeParamBuffer]
|
|
dec a
|
|
ld hl, .Pockets
|
|
rst JumpTable
|
|
ret
|
|
|
|
.Pockets:
|
|
; entries correspond to item types
|
|
dw .Item
|
|
dw .KeyItem
|
|
dw .Ball
|
|
dw .TMHM
|
|
|
|
.Ball:
|
|
ld hl, wNumBalls
|
|
jp CheckTheItem
|
|
|
|
.TMHM:
|
|
ld h, d
|
|
ld l, e
|
|
ld a, [wCurItem]
|
|
ld c, a
|
|
call GetTMHMNumber
|
|
jp CheckTMHM
|
|
|
|
.KeyItem:
|
|
ld h, d
|
|
ld l, e
|
|
jp CheckKeyItems
|
|
|
|
.Item:
|
|
ld h, d
|
|
ld l, e
|
|
|
|
.nope
|
|
jp CheckTheItem
|
|
|
|
DoesHLEqualNumItems:
|
|
ld a, l
|
|
cp LOW(wNumItems)
|
|
ret nz
|
|
ld a, h
|
|
cp HIGH(wNumItems)
|
|
ret
|
|
|
|
GetPocketCapacity:
|
|
ld c, MAX_ITEMS
|
|
ld a, e
|
|
cp LOW(wNumItems)
|
|
jr nz, .not_bag
|
|
ld a, d
|
|
cp HIGH(wNumItems)
|
|
ret z
|
|
|
|
.not_bag
|
|
ld c, MAX_PC_ITEMS
|
|
ld a, e
|
|
cp LOW(wNumPCItems)
|
|
jr nz, .not_pc
|
|
ld a, d
|
|
cp HIGH(wNumPCItems)
|
|
ret z
|
|
|
|
.not_pc
|
|
ld c, MAX_BALLS
|
|
ret
|
|
|
|
PutItemInPocket:
|
|
ld d, h
|
|
ld e, l
|
|
inc hl
|
|
ld a, [wCurItem]
|
|
ld c, a
|
|
ld b, 0
|
|
.loop
|
|
ld a, [hli]
|
|
cp -1
|
|
jr z, .terminator
|
|
cp c
|
|
jr nz, .next
|
|
ld a, MAX_ITEM_STACK
|
|
sub [hl]
|
|
add b
|
|
ld b, a
|
|
ld a, [wItemQuantityChangeBuffer]
|
|
cp b
|
|
jr z, .ok
|
|
jr c, .ok
|
|
|
|
.next
|
|
inc hl
|
|
jr .loop
|
|
|
|
.terminator
|
|
call GetPocketCapacity
|
|
ld a, [de]
|
|
cp c
|
|
jr c, .ok
|
|
and a
|
|
ret
|
|
|
|
.ok
|
|
ld h, d
|
|
ld l, e
|
|
ld a, [wCurItem]
|
|
ld c, a
|
|
ld a, [wItemQuantityChangeBuffer]
|
|
ld [wItemQuantityBuffer], a
|
|
.loop2
|
|
inc hl
|
|
ld a, [hli]
|
|
cp -1
|
|
jr z, .terminator2
|
|
cp c
|
|
jr nz, .loop2
|
|
ld a, [wItemQuantityBuffer]
|
|
add [hl]
|
|
cp MAX_ITEM_STACK + 1
|
|
jr nc, .newstack
|
|
ld [hl], a
|
|
jr .done
|
|
|
|
.newstack
|
|
ld [hl], MAX_ITEM_STACK
|
|
sub MAX_ITEM_STACK
|
|
ld [wItemQuantityBuffer], a
|
|
jr .loop2
|
|
|
|
.terminator2
|
|
dec hl
|
|
ld a, [wCurItem]
|
|
ld [hli], a
|
|
ld a, [wItemQuantityBuffer]
|
|
ld [hli], a
|
|
ld [hl], -1
|
|
ld h, d
|
|
ld l, e
|
|
inc [hl]
|
|
|
|
.done
|
|
scf
|
|
ret
|
|
|
|
RemoveItemFromPocket:
|
|
ld d, h
|
|
ld e, l
|
|
ld a, [hli]
|
|
ld c, a
|
|
ld a, [wCurItemQuantity]
|
|
cp c
|
|
jr nc, .ok ; memory
|
|
ld c, a
|
|
ld b, $0
|
|
add hl, bc
|
|
add hl, bc
|
|
ld a, [wCurItem]
|
|
cp [hl]
|
|
inc hl
|
|
jr z, .skip
|
|
ld h, d
|
|
ld l, e
|
|
inc hl
|
|
|
|
.ok
|
|
ld a, [wCurItem]
|
|
ld b, a
|
|
.loop
|
|
ld a, [hli]
|
|
cp b
|
|
jr z, .skip
|
|
cp -1
|
|
jr z, .nope
|
|
inc hl
|
|
jr .loop
|
|
|
|
.skip
|
|
ld a, [wItemQuantityChangeBuffer]
|
|
ld b, a
|
|
ld a, [hl]
|
|
sub b
|
|
jr c, .nope
|
|
ld [hl], a
|
|
ld [wItemQuantityBuffer], a
|
|
and a
|
|
jr nz, .yup
|
|
dec hl
|
|
ld b, h
|
|
ld c, l
|
|
inc hl
|
|
inc hl
|
|
.loop2
|
|
ld a, [hli]
|
|
ld [bc], a
|
|
inc bc
|
|
cp -1
|
|
jr nz, .loop2
|
|
ld h, d
|
|
ld l, e
|
|
dec [hl]
|
|
|
|
.yup
|
|
scf
|
|
ret
|
|
|
|
.nope
|
|
and a
|
|
ret
|
|
|
|
CheckTheItem:
|
|
ld a, [wCurItem]
|
|
ld c, a
|
|
.loop
|
|
inc hl
|
|
ld a, [hli]
|
|
cp -1
|
|
jr z, .done
|
|
cp c
|
|
jr nz, .loop
|
|
scf
|
|
ret
|
|
|
|
.done
|
|
and a
|
|
ret
|
|
|
|
ReceiveKeyItem:
|
|
ld hl, wNumKeyItems
|
|
ld a, [hli]
|
|
cp MAX_KEY_ITEMS
|
|
jr nc, .nope
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, [wCurItem]
|
|
ld [hli], a
|
|
ld [hl], -1
|
|
ld hl, wNumKeyItems
|
|
inc [hl]
|
|
scf
|
|
ret
|
|
|
|
.nope
|
|
and a
|
|
ret
|
|
|
|
TossKeyItem:
|
|
ld a, [wCurItemQuantity]
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, wNumKeyItems
|
|
ld a, [hl]
|
|
cp e
|
|
jr nc, .ok
|
|
call .Toss
|
|
ret nc
|
|
jr .ok2
|
|
|
|
.ok
|
|
dec [hl]
|
|
inc hl
|
|
add hl, de
|
|
|
|
.ok2
|
|
ld d, h
|
|
ld e, l
|
|
inc hl
|
|
.loop
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
cp -1
|
|
jr nz, .loop
|
|
scf
|
|
ret
|
|
|
|
.Toss:
|
|
ld hl, wNumKeyItems
|
|
ld a, [wCurItem]
|
|
ld c, a
|
|
.loop3
|
|
inc hl
|
|
ld a, [hl]
|
|
cp c
|
|
jr z, .ok3
|
|
cp -1
|
|
jr nz, .loop3
|
|
xor a
|
|
ret
|
|
|
|
.ok3
|
|
ld a, [wNumKeyItems]
|
|
dec a
|
|
ld [wNumKeyItems], a
|
|
scf
|
|
ret
|
|
|
|
CheckKeyItems:
|
|
ld a, [wCurItem]
|
|
ld c, a
|
|
ld hl, wKeyItems
|
|
.loop
|
|
ld a, [hli]
|
|
cp c
|
|
jr z, .done
|
|
cp -1
|
|
jr nz, .loop
|
|
and a
|
|
ret
|
|
|
|
.done
|
|
scf
|
|
ret
|
|
|
|
ReceiveTMHM:
|
|
dec c
|
|
ld b, 0
|
|
ld hl, wTMsHMs
|
|
add hl, bc
|
|
ld a, [wItemQuantityChangeBuffer]
|
|
add [hl]
|
|
cp MAX_ITEM_STACK + 1
|
|
jr nc, .toomany
|
|
ld [hl], a
|
|
scf
|
|
ret
|
|
|
|
.toomany
|
|
and a
|
|
ret
|
|
|
|
TossTMHM:
|
|
dec c
|
|
ld b, 0
|
|
ld hl, wTMsHMs
|
|
add hl, bc
|
|
ld a, [wItemQuantityChangeBuffer]
|
|
ld b, a
|
|
ld a, [hl]
|
|
sub b
|
|
jr c, .nope
|
|
ld [hl], a
|
|
ld [wItemQuantityBuffer], a
|
|
jr nz, .yup
|
|
ld a, [wTMHMPocketScrollPosition]
|
|
and a
|
|
jr z, .yup
|
|
dec a
|
|
ld [wTMHMPocketScrollPosition], a
|
|
|
|
.yup
|
|
scf
|
|
ret
|
|
|
|
.nope
|
|
and a
|
|
ret
|
|
|
|
CheckTMHM:
|
|
dec c
|
|
ld b, $0
|
|
ld hl, wTMsHMs
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and a
|
|
ret z
|
|
scf
|
|
ret
|
|
|
|
GetTMHMNumber::
|
|
; Return the number of a TM/HM by item id c.
|
|
ld a, c
|
|
; Skip any dummy items.
|
|
cp ITEM_C3 ; TM04-05
|
|
jr c, .done
|
|
cp ITEM_DC ; TM28-29
|
|
jr c, .skip
|
|
dec a
|
|
.skip
|
|
dec a
|
|
.done
|
|
sub TM01
|
|
inc a
|
|
ld c, a
|
|
ret
|
|
|
|
GetNumberedTMHM:
|
|
; Return the item id of a TM/HM by number c.
|
|
ld a, c
|
|
; Skip any gaps.
|
|
cp ITEM_C3 - (TM01 - 1)
|
|
jr c, .done
|
|
cp ITEM_DC - (TM01 - 1) - 1
|
|
jr c, .skip_one
|
|
; skip two
|
|
inc a
|
|
.skip_one
|
|
inc a
|
|
.done
|
|
add TM01
|
|
dec a
|
|
ld c, a
|
|
ret
|
|
|
|
_CheckTossableItem::
|
|
; Return 1 in wItemAttributeParamBuffer and carry if wCurItem can't be removed from the bag.
|
|
ld a, ITEMATTR_PERMISSIONS
|
|
call GetItemAttr
|
|
bit CANT_TOSS_F, a
|
|
jr nz, ItemAttr_ReturnCarry
|
|
and a
|
|
ret
|
|
|
|
CheckSelectableItem:
|
|
; Return 1 in wItemAttributeParamBuffer and carry if wCurItem can't be selected.
|
|
ld a, ITEMATTR_PERMISSIONS
|
|
call GetItemAttr
|
|
bit CANT_SELECT_F, a
|
|
jr nz, ItemAttr_ReturnCarry
|
|
and a
|
|
ret
|
|
|
|
CheckItemPocket::
|
|
; Return the pocket for wCurItem in wItemAttributeParamBuffer.
|
|
ld a, ITEMATTR_POCKET
|
|
call GetItemAttr
|
|
and $f
|
|
ld [wItemAttributeParamBuffer], a
|
|
ret
|
|
|
|
CheckItemContext:
|
|
; Return the context for wCurItem in wItemAttributeParamBuffer.
|
|
ld a, ITEMATTR_HELP
|
|
call GetItemAttr
|
|
and $f
|
|
ld [wItemAttributeParamBuffer], a
|
|
ret
|
|
|
|
CheckItemMenu:
|
|
; Return the menu for wCurItem in wItemAttributeParamBuffer.
|
|
ld a, ITEMATTR_HELP
|
|
call GetItemAttr
|
|
swap a
|
|
and $f
|
|
ld [wItemAttributeParamBuffer], a
|
|
ret
|
|
|
|
GetItemAttr:
|
|
; Get attribute a of wCurItem.
|
|
|
|
push hl
|
|
push bc
|
|
|
|
ld hl, ItemAttributes
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
|
|
xor a
|
|
ld [wItemAttributeParamBuffer], a
|
|
|
|
ld a, [wCurItem]
|
|
dec a
|
|
ld c, a
|
|
ld a, ITEMATTR_STRUCT_LENGTH
|
|
call AddNTimes
|
|
ld a, BANK(ItemAttributes)
|
|
call GetFarByte
|
|
|
|
pop bc
|
|
pop hl
|
|
ret
|
|
|
|
ItemAttr_ReturnCarry:
|
|
ld a, 1
|
|
ld [wItemAttributeParamBuffer], a
|
|
scf
|
|
ret
|
|
|
|
GetItemPrice:
|
|
; Return the price of wCurItem in de.
|
|
push hl
|
|
push bc
|
|
ld a, ITEMATTR_PRICE_LO
|
|
call GetItemAttr
|
|
ld e, a
|
|
ld a, ITEMATTR_PRICE_HI
|
|
call GetItemAttr
|
|
ld d, a
|
|
pop bc
|
|
pop hl
|
|
ret
|