mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
eb1e3636bb
Use explicit ldh instruction to access HRAM locations, don't rely on optimizing ld
397 lines
5.5 KiB
NASM
397 lines
5.5 KiB
NASM
Kurt_PrintTextWhichApricorn:
|
||
ld hl, .Text
|
||
call PrintText
|
||
ret
|
||
|
||
.Text:
|
||
; Which APRICORN should I use?
|
||
text_jump UnknownText_0x1bc06b
|
||
db "@"
|
||
|
||
Kurt_PrintTextHowMany:
|
||
ld hl, .Text
|
||
call PrintText
|
||
ret
|
||
|
||
.Text:
|
||
; How many should I make?
|
||
text_jump UnknownText_0x1bc089
|
||
db "@"
|
||
|
||
SelectApricornForKurt:
|
||
call LoadStandardMenuHeader
|
||
ld c, $1
|
||
xor a
|
||
ld [wMenuScrollPosition], a
|
||
ld [wKurtApricornQuantity], a
|
||
.loop
|
||
push bc
|
||
call Kurt_PrintTextWhichApricorn
|
||
pop bc
|
||
ld a, c
|
||
ld [wMenuSelection], a
|
||
call Kurt_SelectApricorn
|
||
ld a, c
|
||
ld [wScriptVar], a
|
||
and a
|
||
jr z, .done
|
||
ld [wCurItem], a
|
||
ld a, [wMenuCursorY]
|
||
ld c, a
|
||
push bc
|
||
call Kurt_PrintTextHowMany
|
||
call Kurt_SelectQuantity
|
||
pop bc
|
||
jr nc, .loop
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
ld [wKurtApricornQuantity], a
|
||
call Kurt_GiveUpSelectedQuantityOfSelectedApricorn
|
||
|
||
.done
|
||
call Call_ExitMenu
|
||
ret
|
||
|
||
Kurt_SelectApricorn:
|
||
farcall FindApricornsInBag
|
||
jr c, .nope
|
||
ld hl, .MenuHeader
|
||
call CopyMenuHeader
|
||
ld a, [wMenuSelection]
|
||
ld [wMenuCursorBuffer], a
|
||
xor a
|
||
ldh [hBGMapMode], a
|
||
call InitScrollingMenu
|
||
call UpdateSprites
|
||
call ScrollingMenu
|
||
ld a, [wMenuJoypad]
|
||
cp B_BUTTON
|
||
jr z, .nope
|
||
ld a, [wMenuSelection]
|
||
cp -1
|
||
jr nz, .done
|
||
|
||
.nope
|
||
xor a ; FALSE
|
||
|
||
.done
|
||
ld c, a
|
||
ret
|
||
|
||
.MenuHeader:
|
||
db MENU_BACKUP_TILES ; flags
|
||
menu_coords 1, 1, 13, 10
|
||
dw .MenuData
|
||
db 1 ; default option
|
||
|
||
db 0 ; XXX
|
||
|
||
.MenuData:
|
||
db SCROLLINGMENU_DISPLAY_ARROWS ; flags
|
||
db 4, 7
|
||
db 1
|
||
dbw 0, wBuffer1
|
||
dba .Name
|
||
dba .Quantity
|
||
dba NULL
|
||
|
||
.Name:
|
||
ld a, [wMenuSelection]
|
||
and a
|
||
ret z
|
||
farcall PlaceMenuItemName
|
||
ret
|
||
|
||
.Quantity:
|
||
ld a, [wMenuSelection]
|
||
ld [wCurItem], a
|
||
call Kurt_GetQuantityOfApricorn
|
||
ret z
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
ld [wMenuSelectionQuantity], a
|
||
farcall PlaceMenuItemQuantity
|
||
ret
|
||
|
||
Kurt_SelectQuantity:
|
||
ld a, [wCurItem]
|
||
ld [wMenuSelection], a
|
||
call Kurt_GetQuantityOfApricorn
|
||
jr z, .done
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
ld [wItemQuantityBuffer], a
|
||
ld a, $1
|
||
ld [wItemQuantityChangeBuffer], a
|
||
ld hl, .MenuHeader
|
||
call LoadMenuHeader
|
||
.loop
|
||
xor a
|
||
ldh [hBGMapMode], a
|
||
call MenuBox
|
||
call UpdateSprites
|
||
call .PlaceApricornName
|
||
call PlaceApricornQuantity
|
||
call ApplyTilemap
|
||
farcall Kurt_SelectQuantity_InterpretJoypad
|
||
jr nc, .loop
|
||
|
||
push bc
|
||
call PlayClickSFX
|
||
pop bc
|
||
ld a, b
|
||
cp -1
|
||
jr z, .done
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
ld [wItemQuantityChangeBuffer], a ; What is the point of this operation?
|
||
scf
|
||
|
||
.done
|
||
call CloseWindow
|
||
ret
|
||
|
||
.MenuHeader:
|
||
db MENU_BACKUP_TILES ; flags
|
||
menu_coords 6, 9, SCREEN_WIDTH - 1, 12
|
||
dw NULL
|
||
db -1 ; default option
|
||
db 0
|
||
|
||
.PlaceApricornName:
|
||
call MenuBoxCoord2Tile
|
||
ld de, SCREEN_WIDTH + 1
|
||
add hl, de
|
||
ld d, h
|
||
ld e, l
|
||
farcall PlaceMenuItemName
|
||
ret
|
||
|
||
PlaceApricornQuantity:
|
||
call MenuBoxCoord2Tile
|
||
ld de, 2 * SCREEN_WIDTH + 10
|
||
add hl, de
|
||
ld [hl], "×"
|
||
inc hl
|
||
ld de, wItemQuantityChangeBuffer
|
||
lb bc, PRINTNUM_LEADINGZEROS | 1, 2
|
||
jp PrintNum
|
||
|
||
Kurt_GetQuantityOfApricorn:
|
||
push bc
|
||
ld hl, wNumItems
|
||
ld a, [wCurItem]
|
||
ld c, a
|
||
ld b, $0
|
||
.loop
|
||
inc hl
|
||
ld a, [hli]
|
||
cp -1
|
||
jr z, .done
|
||
cp c
|
||
jr nz, .loop
|
||
ld a, [hl]
|
||
add b
|
||
ld b, a
|
||
jr nc, .loop
|
||
ld b, -1
|
||
|
||
.done
|
||
ld a, b
|
||
sub 99
|
||
jr c, .done2
|
||
ld b, 99
|
||
|
||
.done2
|
||
ld a, b
|
||
ld [wItemQuantityChangeBuffer], a
|
||
and a
|
||
pop bc
|
||
ret
|
||
|
||
Kurt_GiveUpSelectedQuantityOfSelectedApricorn:
|
||
; Get the quantity of Apricorns of type [wCurItem]
|
||
; in the bag. Compatible with multiple stacks.
|
||
|
||
; Initialize the search.
|
||
push de
|
||
push bc
|
||
ld hl, wNumItems
|
||
ld a, [wCurItem]
|
||
ld c, a
|
||
ld e, $0
|
||
xor a
|
||
ld [wCurItemQuantity], a
|
||
ld a, -1
|
||
ld [wApricorns], a
|
||
|
||
; Search for [wCurItem] in the bag.
|
||
.loop1
|
||
; Increase the total count.
|
||
ld a, [wCurItemQuantity]
|
||
inc a
|
||
ld [wCurItemQuantity], a
|
||
; Get the index of the next item.
|
||
inc hl
|
||
ld a, [hli]
|
||
; If we've reached the end of the pocket, break.
|
||
cp -1
|
||
jr z, .okay1
|
||
; If we haven't found what we're looking for, continue.
|
||
cp c
|
||
jr nz, .loop1
|
||
; Increment the result counter and store the bag index of the match.
|
||
ld d, $0
|
||
push hl
|
||
ld hl, wApricorns
|
||
add hl, de
|
||
inc e
|
||
ld a, [wCurItemQuantity]
|
||
dec a
|
||
ld [hli], a
|
||
ld a, -1
|
||
ld [hl], a
|
||
pop hl
|
||
jr .loop1
|
||
|
||
.okay1
|
||
; How many stacks have we found?
|
||
ld a, e
|
||
and a
|
||
jr z, .done
|
||
dec a
|
||
jr z, .OnlyOne
|
||
ld hl, wApricorns
|
||
|
||
.loop2
|
||
ld a, [hl]
|
||
ld c, a
|
||
push hl
|
||
.loop3
|
||
inc hl
|
||
ld a, [hl]
|
||
cp -1
|
||
jr z, .okay2
|
||
ld b, a
|
||
ld a, c
|
||
call Kurt_GetAddressOfApricornQuantity
|
||
ld e, a
|
||
ld a, b
|
||
call Kurt_GetAddressOfApricornQuantity
|
||
sub e
|
||
jr z, .equal
|
||
jr c, .less
|
||
jr .loop3
|
||
|
||
.equal
|
||
ld a, c
|
||
sub b
|
||
jr nc, .loop3
|
||
|
||
.less
|
||
ld a, c
|
||
ld c, b
|
||
ld [hl], a
|
||
ld a, c
|
||
pop hl
|
||
ld [hl], a
|
||
push hl
|
||
jr .loop3
|
||
|
||
.okay2
|
||
pop hl
|
||
inc hl
|
||
ld a, [hl]
|
||
cp -1
|
||
jr nz, .loop2
|
||
|
||
.OnlyOne:
|
||
ld hl, wApricorns
|
||
.loop4
|
||
ld a, [hl]
|
||
cp -1
|
||
jr z, .done
|
||
push hl
|
||
ld [wCurItemQuantity], a
|
||
call Kurt_GetRidOfItem
|
||
pop hl
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
and a
|
||
jr z, .done
|
||
push hl
|
||
ld a, [hli]
|
||
ld c, a
|
||
.loop5
|
||
ld a, [hli]
|
||
cp -1
|
||
jr z, .okay3
|
||
cp c
|
||
jr c, .loop5
|
||
dec a
|
||
dec hl
|
||
ld [hli], a
|
||
jr .loop5
|
||
|
||
.okay3
|
||
pop hl
|
||
inc hl
|
||
jr .loop4
|
||
|
||
.done
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
and a
|
||
pop bc
|
||
pop de
|
||
ret
|
||
|
||
Kurt_GetAddressOfApricornQuantity:
|
||
push hl
|
||
push bc
|
||
ld hl, wNumItems
|
||
inc hl
|
||
ld c, a
|
||
ld b, $0
|
||
add hl, bc
|
||
add hl, bc
|
||
inc hl
|
||
ld a, [hl]
|
||
pop bc
|
||
pop hl
|
||
ret
|
||
|
||
Kurt_GetRidOfItem:
|
||
push bc
|
||
ld hl, wNumItems
|
||
ld a, [wCurItemQuantity]
|
||
ld c, a
|
||
ld b, $0
|
||
inc hl
|
||
add hl, bc
|
||
add hl, bc
|
||
ld a, [wCurItem]
|
||
ld c, a
|
||
ld a, [hli]
|
||
cp -1
|
||
jr z, .done
|
||
cp c
|
||
jr nz, .done
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
ld c, a
|
||
ld a, [hl]
|
||
sub c
|
||
ld b, c
|
||
jr nc, .okay
|
||
add c
|
||
ld b, a
|
||
|
||
.okay
|
||
push bc
|
||
ld hl, wNumItems
|
||
ld a, b
|
||
ld [wItemQuantityChangeBuffer], a
|
||
call TossItem
|
||
pop bc
|
||
ld a, c
|
||
sub b
|
||
|
||
.done
|
||
ld [wItemQuantityChangeBuffer], a
|
||
pop bc
|
||
ret
|