mirror of https://github.com/pret/pokecrystal.git
273 lines
4.2 KiB
NASM
273 lines
4.2 KiB
NASM
SwitchItemsInBag:
|
|
ld a, [wSwitchItem]
|
|
and a
|
|
jr z, .init
|
|
ld b, a
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
inc a
|
|
cp b
|
|
jr z, .trivial
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
call ItemSwitch_GetNthItem
|
|
ld a, [hl]
|
|
cp -1
|
|
ret z
|
|
ld a, [wSwitchItem]
|
|
dec a
|
|
ld [wSwitchItem], a
|
|
call .try_combining_stacks
|
|
jp c, .combine_stacks
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
ld c, a
|
|
ld a, [wSwitchItem]
|
|
cp c
|
|
jr c, .above
|
|
jr .below
|
|
|
|
.init:
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
inc a
|
|
ld [wSwitchItem], a
|
|
ret
|
|
|
|
.trivial:
|
|
xor a
|
|
ld [wSwitchItem], a
|
|
ret
|
|
|
|
.below:
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_CopyItemToBuffer
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
ld d, a
|
|
ld a, [wSwitchItem]
|
|
ld e, a
|
|
call ItemSwitch_GetItemOffset
|
|
push bc
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_GetNthItem
|
|
dec hl
|
|
push hl
|
|
call ItemSwitch_GetItemFormatSize
|
|
add hl, bc
|
|
ld d, h
|
|
ld e, l
|
|
pop hl
|
|
pop bc
|
|
call ItemSwitch_BackwardsCopyBytes
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
call ItemSwitch_CopyBufferToItem
|
|
xor a
|
|
ld [wSwitchItem], a
|
|
ret
|
|
|
|
.above:
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_CopyItemToBuffer
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
ld d, a
|
|
ld a, [wSwitchItem]
|
|
ld e, a
|
|
call ItemSwitch_GetItemOffset
|
|
push bc
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_GetNthItem
|
|
ld d, h
|
|
ld e, l
|
|
call ItemSwitch_GetItemFormatSize
|
|
add hl, bc
|
|
pop bc
|
|
call CopyBytes
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
call ItemSwitch_CopyBufferToItem
|
|
xor a
|
|
ld [wSwitchItem], a
|
|
ret
|
|
|
|
.try_combining_stacks:
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_GetNthItem
|
|
ld d, h
|
|
ld e, l
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
call ItemSwitch_GetNthItem
|
|
ld a, [de]
|
|
cp [hl]
|
|
jr nz, .no_combine
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
call ItemSwitch_GetItemQuantity
|
|
cp MAX_ITEM_STACK
|
|
jr z, .no_combine
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_GetItemQuantity
|
|
cp MAX_ITEM_STACK
|
|
jr nz, .combine
|
|
.no_combine
|
|
and a
|
|
ret
|
|
.combine
|
|
scf
|
|
ret
|
|
|
|
.combine_stacks:
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_GetNthItem
|
|
inc hl
|
|
push hl
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
call ItemSwitch_GetNthItem
|
|
inc hl
|
|
ld a, [hl]
|
|
pop hl
|
|
add [hl]
|
|
cp MAX_ITEM_STACK + 1
|
|
jr c, .merge_stacks
|
|
sub MAX_ITEM_STACK
|
|
push af
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
call ItemSwitch_GetNthItem
|
|
inc hl
|
|
ld [hl], MAX_ITEM_STACK
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_GetNthItem
|
|
inc hl
|
|
pop af
|
|
ld [hl], a
|
|
xor a
|
|
ld [wSwitchItem], a
|
|
ret
|
|
|
|
.merge_stacks:
|
|
push af
|
|
ld a, [wScrollingMenuCursorPosition]
|
|
call ItemSwitch_GetNthItem
|
|
inc hl
|
|
pop af
|
|
ld [hl], a
|
|
ld hl, wMenuData_ItemsPointerAddr
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
ld a, [wSwitchItem]
|
|
cp [hl]
|
|
jr nz, .not_combining_last_item
|
|
dec [hl]
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_GetNthItem
|
|
ld [hl], -1 ; end
|
|
xor a
|
|
ld [wSwitchItem], a
|
|
ret
|
|
|
|
.not_combining_last_item:
|
|
dec [hl]
|
|
call ItemSwitch_GetItemFormatSize
|
|
push bc
|
|
ld a, [wSwitchItem]
|
|
call ItemSwitch_GetNthItem
|
|
pop bc
|
|
push hl
|
|
add hl, bc
|
|
pop de
|
|
.copy_loop
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
cp -1 ; end?
|
|
jr nz, .copy_loop
|
|
xor a
|
|
ld [wSwitchItem], a
|
|
ret
|
|
|
|
ItemSwitch_CopyItemToBuffer:
|
|
call ItemSwitch_GetNthItem
|
|
ld de, wSwitchItemBuffer
|
|
call ItemSwitch_GetItemFormatSize
|
|
call CopyBytes
|
|
ret
|
|
|
|
ItemSwitch_CopyBufferToItem:
|
|
call ItemSwitch_GetNthItem
|
|
ld d, h
|
|
ld e, l
|
|
ld hl, wSwitchItemBuffer
|
|
call ItemSwitch_GetItemFormatSize
|
|
call CopyBytes
|
|
ret
|
|
|
|
ItemSwitch_GetNthItem:
|
|
push af
|
|
call ItemSwitch_GetItemFormatSize
|
|
ld hl, wMenuData_ItemsPointerAddr
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
inc hl
|
|
pop af
|
|
call AddNTimes
|
|
ret
|
|
|
|
ItemSwitch_GetItemOffset:
|
|
push hl
|
|
call ItemSwitch_GetItemFormatSize
|
|
ld a, d
|
|
sub e
|
|
jr nc, .dont_negate
|
|
dec a
|
|
cpl
|
|
.dont_negate
|
|
ld hl, 0
|
|
call AddNTimes
|
|
ld b, h
|
|
ld c, l
|
|
pop hl
|
|
ret
|
|
|
|
ItemSwitch_GetItemFormatSize:
|
|
push hl
|
|
ld a, [wMenuData_ScrollingMenuItemFormat]
|
|
ld c, a
|
|
ld b, 0
|
|
ld hl, .item_format_sizes
|
|
add hl, bc
|
|
add hl, bc
|
|
ld c, [hl]
|
|
inc hl
|
|
ld b, [hl]
|
|
pop hl
|
|
ret
|
|
|
|
.item_format_sizes:
|
|
; entries correspond to SCROLLINGMENU_ITEMS_* constants
|
|
dw 0 ; unused
|
|
dw 1 ; SCROLLINGMENU_ITEMS_NORMAL
|
|
dw 2 ; SCROLLINGMENU_ITEMS_QUANTITY
|
|
|
|
ItemSwitch_GetItemQuantity:
|
|
push af
|
|
call ItemSwitch_GetItemFormatSize
|
|
ld a, c
|
|
cp 2
|
|
jr nz, .no_quantity
|
|
pop af
|
|
call ItemSwitch_GetNthItem
|
|
inc hl
|
|
ld a, [hl]
|
|
ret
|
|
|
|
.no_quantity
|
|
pop af
|
|
ld a, 1
|
|
ret
|
|
|
|
ItemSwitch_BackwardsCopyBytes:
|
|
.loop
|
|
ld a, [hld]
|
|
ld [de], a
|
|
dec de
|
|
dec bc
|
|
ld a, b
|
|
or c
|
|
jr nz, .loop
|
|
ret
|