pokegold-spaceworld/engine/items/inventory.asm

701 lines
8.3 KiB
NASM

; Leftover from Generation I. Equivalent to pokered's AddItemToInventory_.
Unreferenced_ReceiveItem_Old:
ld a, [wItemQuantity]
push af
push bc
push de
push hl
push hl
ld d, 50 ; PC_ITEM_CAPACITY
push hl
ld bc, -wNumBagItems
add hl, bc
ld a, h
or l
pop hl
jr nz, .check_if_inventory_full
ld d, 20 ; BAG_ITEM_CAPACITY
.check_if_inventory_full
ld a, [hl]
sub d
ld d, a
ld a, [hli]
and a
jr z, .add_new_item
.not_at_end_of_inventory
ld a, [hli]
ld b, a
ld a, [wCurItem]
cp b
jp z, .increase_item_quantity
inc hl
ld a, [hl]
cp -1
jr nz, .not_at_end_of_inventory
.add_new_item
pop hl
ld a, d
and a
jr z, .done
inc [hl]
ld a, [hl]
add a
dec a
ld c, a
ld b, 0
add hl, bc ; address to store item
ld a, [wCurItem]
ld [hli], a
ld a, [wItemQuantity]
ld [hli], a
ld [hl], -1
jp .success
.increase_item_quantity
ld a, [wItemQuantity]
ld b, a
ld a, [hl]
add b
cp MAX_ITEM_STACK + 1
jp c, .store_new_quantity
sub MAX_ITEM_STACK
ld [wItemQuantity], a
ld a, d
and a
jr z, .increase_item_quantity_failed
ld a, MAX_ITEM_STACK
ld [hli], a
jp .not_at_end_of_inventory
.increase_item_quantity_failed
pop hl
and a
jr .done
.store_new_quantity
ld [hl], a
pop hl
.success
scf
.done
pop hl
pop de
pop bc
pop bc
ld a, b
ld [wItemQuantity], a
ret
Unreferenced_RemoveItemFromInventory_Old:
push hl
inc hl
ld a, [wItemIndex]
ld e, a
ld d, 0
add hl, de
add hl, de
inc hl
ld a, [wItemQuantity]
ld e, a
ld a, [hl]
sub e
ld [hld], a
ld [wItemQuantityBuffer], a
and a
jr nz, .skip_moving_up_slots
ld e, l
ld d, h
inc de
inc de
.loop
ld a, [de]
inc de
ld [hli], a
cp -1
jr nz, .loop
xor a
ld [wMenuScrollPosition], a
ld [wRegularItemsCursor], a
pop hl
ld a, [hl]
dec a
ld [hl], a
ld [wScrollingMenuListSize], a
cp 2
jr c, .done
jr .done
.skip_moving_up_slots
pop hl
.done
ret
_ReceiveItem::
call DoesHLEqualwNumBagItems
jp nz, PutItemInPocket
push hl
callfar CheckItemPocket
ld a, [wItemAttributeValue]
dec a
ld hl, .Pockets
jp CallJumptable
.Pockets:
dw .Item
dw .KeyItem
dw .Ball
dw .TMHM
.Item:
pop hl
jp PutItemInPocket
.KeyItem:
pop hl
jp ReceiveKeyItem
.Ball:
pop hl
ld a, [wCurItem]
ld c, a
call GetBallIndex
jp ReceiveBall
.TMHM:
pop hl
ld a, [wCurItem]
ld c, a
call GetTMHMNumber
jp ReceiveTMHM
_TossItem::
call DoesHLEqualwNumBagItems
jr nz, .remove_item
push hl
callfar CheckItemPocket
ld a, [wItemAttributeValue]
dec a
ld hl, .Pockets
jp CallJumptable
.Pockets
dw .Item
dw .KeyItem
dw .Ball
dw .TMHM
.Ball
pop hl
ld a, [wCurItem]
ld c, a
call GetBallIndex
jp TossBall
.TMHM
pop hl
ld a, [wCurItem]
ld c, a
call GetTMHMNumber
jp TossTMHM
.KeyItem
pop hl
jp TossKeyItem
.Item
pop hl
.remove_item
jp RemoveItemFromPocket
_CheckItem:
call DoesHLEqualwNumBagItems
jr nz, .not_bag
push hl
callfar CheckItemPocket
ld a, [wItemAttributeValue]
dec a
ld hl, .Pockets
jp CallJumptable
.Pockets
dw .Item
dw .KeyItem
dw .Ball
dw .TMHM
.Ball
pop hl
ld a, [wCurItem]
ld c, a
call GetBallIndex
jp CheckBall
.TMHM
pop hl
ld a, [wCurItem]
ld c, a
call GetTMHMNumber
jp CheckTMHM
.KeyItem
pop hl
jp CheckKeyItems
.Item
pop hl
.not_bag
jp CheckTheItem
DoesHLEqualwNumBagItems:
ld a, l
cp LOW(wNumBagItems)
ret nz
ld a, h
cp HIGH(wNumBagItems)
ret
PutItemInPocket:
ld d, h
ld e, l
inc hl
ld a, [wCurItem]
ld c, a
ld b, 0
; will add the item once the total
; available space (b) exceeds the
; amount being added
.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, [wItemQuantity]
cp b
jr z, .can_add
jr c, .can_add
.next
inc hl
jr .loop
.terminator
call GetPocketCapacity
ld a, [de]
cp c
jr c, .can_add
and a
ret
.can_add
ld h, d
ld l, e
ld a, [wCurItem]
ld c, a
.loop2
inc hl
ld a, [hli]
cp a, -1
jr z, .terminator2
cp c
jr nz, .loop2
ld a, [wItemQuantity]
add [hl]
cp a, 100
jr nc, .set_max
ld [hl], a
jr .done
; set this slot's quantity to MAX_ITEM_STACK,
; and keep iterating through list
; to add remaining amount
.set_max
ld [hl], MAX_ITEM_STACK
sub MAX_ITEM_STACK
ld [wItemQuantity], a
jr .loop2
.terminator2
dec hl
ld a, [wCurItem]
ld [hli], a
ld a, [wItemQuantity]
ld [hli], a
ld [hl], -1
ld h, d
ld l, e
inc [hl]
.done
scf
ret
GetPocketCapacity:
ld c, MAX_ITEMS
ld a, e
cp a, LOW(wNumBagItems)
jr nz, .not_bag
ld a, d
cp HIGH(wNumBagItems)
ret z
.not_bag
ld c, MAX_PC_ITEMS
ret
RemoveItemFromPocket:
ld d, h
ld e, l
inc hl
ld a, [wItemIndex]
ld c, a
ld b, 0
add hl, bc
add hl, bc
inc hl
ld a, [wItemQuantity]
ld b, a
ld a, [hl]
sub b
jr c, .underflow
ld [hl], a
ld [wItemQuantityBuffer], a
and a
jr nz, .done
; if the remaining quantity is zero
; then erase the slot by shifting
; the subsequent data upwards
dec hl
ld b, h
ld c, l
inc hl
inc hl
.loop
ld a, [hli]
ld [bc], a
inc bc
cp -1
jr nz, .loop
ld h, d
ld l, e
dec [hl]
.done
scf
ret
.underflow
and a
ret
CheckTheItem:
ld a, [wCurItem]
ld c, a
.loop
inc hl
ld a, [hli]
cp -1
jr z, .fail
cp c
jr nz, .loop
scf
ret
.fail
and a
ret
ReceiveKeyItem:
ld hl, wNumKeyItems
ld a, [hli]
cp a, MAX_KEY_ITEMS
jr nc, .full_pack
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
.full_pack
and a
ret
TossKeyItem:
ld hl, wNumKeyItems
dec [hl]
inc hl
ld a, [wItemIndex]
ld e, a
ld d, 0
add hl, de
ld d, h
ld e, l
inc hl
; erase this item by shifting
; all subsequent data upwards
.loop
ld a, [hli]
ld [de], a
inc de
cp -1
jr nz, .loop
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
; get index of ball item id c from BallItems
GetBallIndex:
ld a, c
push hl
push de
push bc
ld hl, BallItems
ld de, 1
call FindItemInTable
ld a, b
pop bc
pop de
pop hl
ld c, a
ret
; get ball item id at index c in BallItems
GetBallByIndex:
push bc
push hl
ld b, 0
ld hl, BallItems
add hl, bc
ld a, [hl]
pop hl
pop bc
ld c, a
ret
BallItems:
db ITEM_MASTER_BALL
db ITEM_ULTRA_BALL
db ITEM_GREAT_BALL
db ITEM_POKE_BALL
db -1
; empties the ball pocket by setting the
; terminator immediately after wNumBallItems
; Note, the ball pocket appears to be
; a fixed length, not -1 terminated
EmptyBallPocket:
ld hl, wNumBallItems
xor a
ld [hli], a
ld [hl], -1
ret
ReceiveBall:
ld hl, wBallQuantities
ld b, 0
add hl, bc
ld a, [wItemQuantity]
add [hl]
cp 100
jr nc, .overflow
ld b, a
ld a, [hl]
and a
jr nz, .done
; increase the ball pocket size if
; this ball's previous quantity was 0
ld a, [wNumBallItems]
inc a
ld [wNumBallItems], a
.done
ld [hl], b
scf
ret
.overflow
and a
ret
TossBall:
ld hl, wBallQuantities
ld b, 0
add hl, bc
ld a, [wItemQuantity]
ld b, a
ld a, [hl]
sub b
jr c, .underflow
jr nz, .done
; increase the ball pocket size if
; this ball's new quantity is 0
ld b, a
ld a, [wNumBallItems]
dec a
ld [wNumBallItems], a
ld a, b
.done
ld [hl], a
ld [wItemQuantityBuffer], a
scf
ret
.underflow
and a
ret
CheckBall:
ld hl, wBallQuantities
ld b, 0
add hl, bc
ld a, [hl]
and a
ret z
scf
ret
ReceiveTMHM:
ld b, 0
ld hl, wTMsHMs
add hl, bc
ld a, [wItemQuantity]
add [hl]
cp 100
jr nc, .overflow
ld [hl], a
scf
ret
.overflow
and a
ret
TossTMHM:
ld b, 0
ld hl, wTMsHMs
add hl, bc
ld a, [wItemQuantity]
ld b, a
ld a, [hl]
sub b
jr c, .underflow
ld [hl], a
ld [wItemQuantityBuffer], a
scf
ret
.underflow
and a
ret
CheckTMHM:
ld b, 0
ld hl, wTMsHMs
add hl, bc
ld a, [hl]
and a
ret z
scf
ret
GetTMHMNumber:
ld a, c
ld c, 0
sub ITEM_TM01
jr c, .not_machine
cp ITEM_C8 - ITEM_TM01
jr z, .not_machine
jr c, .finish
inc c
cp ITEM_E1 - ITEM_TM01
jr z, .not_machine
jr c, .finish
inc c
; c represents the amount of non-TMs which
; appear ahead of this item in the list
; so subtract that value before exiting
.finish
sub c
ld c, a
scf
ret
.not_machine
and a
ret
GetNumberedTMHM:
; Return the item id of a TM/HM by number c.
ld a, c
ld c, 0
; Adjust for any dummy items.
cp ITEM_C8 - ITEM_TM01 ; TM01-04
jr c, .finish
inc c
cp ITEM_E1 - ITEM_TM01 - 1 ; TM05-28
jr c, .finish
inc c
cp ITEM_FF - ITEM_TM01 - 2 ; End of list
jr nc, .not_machine
.finish
add c
add ITEM_TM01
ld c, a
scf
ret
.not_machine
and a
ret