pokegold/engine/link/mystery_gift.asm

1083 lines
17 KiB
NASM

DoMysteryGift:
call ClearTilemap
call ClearSprites
call WaitBGMap
farcall InitMysteryGiftLayout
hlcoord 3, 8
ld de, .String_PressAToLink_BToCancel
call PlaceString
call WaitBGMap
farcall PrepMysteryGiftDataToSend
call MysteryGift_ClearTrainerData
ld a, $2
ld [wc901], a
ld a, $14
ld [wc902], a
ldh a, [rIE]
push af
call Function29fc9
ld d, a
xor a
ldh [rIF], a
pop af
ldh [rIE], a
push de
call ClearTilemap
call EnableLCD
call WaitBGMap
ld b, SCGB_DIPLOMA
call GetSGBLayout
call SetPalettes
pop de
hlcoord 2, 8
ld a, d
ld de, .MysteryGiftCanceledText ; Link has been canceled
cp $10
jp z, .LinkCanceled
cp $6c
jp nz, .CommunicationError
ld a, [wc800]
cp 3
jr z, .skip_checks
call .CheckAlreadyGotFiveGiftsToday
ld hl, .MysteryGiftFiveADayText ; Only 5 gifts a day
jp nc, .PrintTextAndExit
call .CheckAlreadyGotAGiftFromThatPerson
ld hl, .MysteryGiftOneADayText ; Only one gift a day per person
jp c, .PrintTextAndExit
.skip_checks
ld a, [wMysteryGiftPlayerBackupItem]
and a
jr nz, .GiftWaiting
ld a, [wMysteryGiftPartnerBackupItem]
and a
jr nz, .FriendNotReady
ld a, [wc800]
cp 3
jr z, .skip_append_save
call .AddMysteryGiftPartnerID
ld a, [wc800]
cp 4
jr z, .skip_append_save
call .SaveMysteryGiftTrainerName
.skip_append_save
ld a, [wMysteryGiftPartnerSentDeco]
and a
jr z, .item
ld a, [wMysteryGiftPartnerWhichDeco]
ld c, a
farcall MysteryGiftGetDecoration
push bc
call MysteryGift_CheckAndSetDecorationAlreadyReceived
pop bc
jr nz, .item
callfar GetDecorationName_c
ld h, d
ld l, e
ld de, wStringBuffer1
ld bc, ITEM_NAME_LENGTH
call CopyBytes
ld hl, .MysteryGiftSentHomeText ; sent decoration to home
jr .PrintTextAndExit
.item
call GetMysteryGiftBank
ld a, [wMysteryGiftPartnerWhichItem]
ld c, a
farcall MysteryGiftGetItemHeldEffect
ld a, c
ld [sBackupMysteryGiftItem], a
ld [wNamedObjectIndexBuffer], a
call CloseSRAM
call GetItemName
ld hl, .MysteryGiftSentText ; sent item
jr .PrintTextAndExit
.LinkCanceled:
ld hl, .MysteryGiftCanceledText ; Link has been canceled
jr .PrintTextAndExit
.CommunicationError:
ld hl, .MysteryGiftCommErrorText ; Communication error
call PrintText
jp DoMysteryGift
.GiftWaiting:
ld hl, .RetrieveMysteryGiftText ; receive gift at counter
jr .PrintTextAndExit
.FriendNotReady:
ld hl, .YourFriendIsNotReadyText ; friend not ready
.PrintTextAndExit:
call PrintText
ld a, LCDC_DEFAULT
ldh [rLCDC], a
ret
.String_PressAToLink_BToCancel:
db "Press A to"
next "link IR-Device"
next "Press B to"
next "cancel it."
db "@"
.MysteryGiftCanceledText:
text_far _MysteryGiftCanceledText
text_end
.MysteryGiftCommErrorText:
text_far _MysteryGiftCommErrorText
text_end
.RetrieveMysteryGiftText:
text_far _RetrieveMysteryGiftText
text_end
.YourFriendIsNotReadyText:
text_far _YourFriendIsNotReadyText
text_end
.MysteryGiftFiveADayText:
text_far _MysteryGiftFiveADayText
text_end
.MysteryGiftOneADayText:
text_far _MysteryGiftOneADayText
text_end
.MysteryGiftSentText:
text_far _MysteryGiftSentText
text_end
.MysteryGiftSentHomeText:
text_far _MysteryGiftSentHomeText
text_end
.CheckAlreadyGotFiveGiftsToday:
call GetMysteryGiftBank
ld a, [sNumDailyMysteryGiftPartnerIDs]
cp $5
jp CloseSRAM
.CheckAlreadyGotAGiftFromThatPerson:
call GetMysteryGiftBank
ld a, [wMysteryGiftPartnerID]
ld b, a
ld a, [wMysteryGiftPartnerID + 1]
ld c, a
ld a, [sNumDailyMysteryGiftPartnerIDs]
ld d, a
ld hl, sDailyMysteryGiftPartnerIDs
.loop
ld a, d
and a
jr z, .No
ld a, [hli]
cp b
jr nz, .skip
ld a, [hl]
cp c
jr z, .Yes
.skip
inc hl
dec d
jr .loop
.Yes:
scf
.No:
jp CloseSRAM
.AddMysteryGiftPartnerID:
call GetMysteryGiftBank
ld hl, sNumDailyMysteryGiftPartnerIDs
ld a, [hl]
inc [hl]
ld hl, sDailyMysteryGiftPartnerIDs ; inc hl
ld e, a
ld d, $0
add hl, de
add hl, de
ld a, [wMysteryGiftPartnerID]
ld [hli], a
ld a, [wMysteryGiftPartnerID + 1]
ld [hl], a
jp CloseSRAM
.SaveMysteryGiftTrainerName:
call GetMysteryGiftBank
ld a, $1
ld [sMysteryGiftTrainerHouseFlag], a
ld hl, wMysteryGiftPartnerName
ld de, sMysteryGiftPartnerName
ld bc, NAME_LENGTH
call CopyBytes
ld a, $1
ld [de], a
inc de
ld hl, wMysteryGiftTrainerData
ld bc, (1 + 1 + NUM_MOVES) * PARTY_LENGTH + 2
call CopyBytes
jp CloseSRAM
Function29fc9:
farcall ClearChannels
call Function2a18c
.loop2
call Function2a1c4
call Function2a20b
ldh a, [hMGStatusFlags]
cp $10
jp z, Function2a103
cp $6c
jr nz, .loop2
ldh a, [hPrintNumBuffer + 8]
cp $2
jr z, Function2a055
ld hl, hPrintNumBuffer
ld b, $1
call Function2a184
jr nz, .ly_loop
call Function2a07c
jp nz, Function2a103
jr Function2a03d
; Delay frame
.ly_loop
ldh a, [rLY]
cp LY_VBLANK
jr c, .ly_loop
ld c, LOW(rRP)
ld a, $c0
ldh [c], a
ld b, 240 ; This might have been intended as a 4-second timeout buffer.
; However, it is reset with each frame.
.loop3
push bc
call MysteryGift_ReadJoypad
ld b, $2
ld c, LOW(rRP)
; Delay frame
.ly_loop2
ldh a, [c]
and b
ld b, a
ldh a, [rLY]
cp LY_VBLANK
jr nc, .ly_loop2
.ly_loop3
ldh a, [c]
and b
ld b, a
ldh a, [rLY]
cp LY_VBLANK
jr c, .ly_loop3
ld a, b
pop bc
dec b
jr z, .loop2 ; we never jump here
or a
jr nz, .loop2
; Check if we've pressed the B button
ldh a, [hMGJoypadReleased]
bit B_BUTTON_F, a
jr z, .loop3
ld a, $10
ldh [hMGStatusFlags], a
jp Function2a103
Function2a037:
call Function2a073
jp nz, Function2a103
; fallthrough
Function2a03d:
call Function2a166
jp nz, Function2a103
call Function2a0bb
jp nz, Function2a103
call Function2a171
jp nz, Function2a103
call Function2a461
jp Function2a103
Function2a055:
call Function2a0bb
jp nz, Function2a103
call Function2a171
jp nz, Function2a103
call Function2a073
jp nz, Function2a103
call Function2a166
jp nz, Function2a103
call Function2a45c
jp Function2a103
Function2a073:
ld hl, hPrintNumBuffer
ld b, $1
call Function2a184
ret nz
; fallthrough
Function2a07c:
call Function2a461
ldh a, [hMGStatusFlags]
cp $6c
ret nz
ldh a, [hPrintNumBuffer]
cp $96
jp nz, Function2a160
ld a, $90
ldh [hPrintNumBuffer], a
call Function2a166
ret nz
ld hl, hPrintNumBuffer
ld b, $1
call Function2a17c
ret nz
call Function2a45c
ldh a, [hMGStatusFlags]
cp $6c
ret nz
call Function2a171
ret nz
ld hl, wMysteryGiftTrainerData
ld a, [wc902]
ld b, a
call Function2a184
ret nz
call Function2a461
ldh a, [hMGStatusFlags]
cp $6c
ret
Function2a0bb:
ld a, $96
ldh [hPrintNumBuffer], a
ld hl, hPrintNumBuffer
ld b, $1
call Function2a17c
ret nz
call Function2a45c
ldh a, [hMGStatusFlags]
cp $6c
ret nz
call Function2a171
ret nz
ld hl, hPrintNumBuffer
ld b, $1
call Function2a184
ret nz
call Function2a461
ldh a, [hMGStatusFlags]
cp $6c
ret nz
ldh a, [hPrintNumBuffer]
cp $90
jp nz, Function2a160
call Function2a166
ret nz
ld hl, wLinkData
ld a, [wc902]
ld b, a
call Function2a17c
ret nz
call Function2a45c
ldh a, [hMGStatusFlags]
cp $6c
ret
Function2a103:
nop
ldh a, [hMGStatusFlags]
cp $10
jr z, .quit
cp $6c
jr nz, .quit
ld hl, wc901
dec [hl]
jr z, .quit
ld hl, wMysteryGiftTrainerData
ld de, wMysteryGiftPartnerData
ld bc, wMysteryGiftPartnerDataEnd - wMysteryGiftPartnerData
call CopyBytes
ld a, [wMysteryGiftTrainerData]
cp $3
jr nc, .quit
farcall StagePartyDataForMysteryGift
call MysteryGift_ClearTrainerData
ld a, $26
ld [wc902], a
ldh a, [hPrintNumBuffer + 8]
cp $2
jr z, .asm_2a143
call Function2a171
jr nz, Function2a103
jp Function2a037
.asm_2a143
call Function2a166
jr nz, Function2a103
jp Function2a055
.quit:
xor a
ldh [rIF], a
ldh a, [rIE]
or 1 << VBLANK
ldh [rIE], a
ei
call DelayFrame
ldh a, [hMGStatusFlags]
push af
call Function2a1ce
pop af
ret
Function2a160:
ld a, $80
ldh [hMGStatusFlags], a
and a
ret
Function2a166:
call Function2a1c4
call Function2a274
ldh a, [hMGStatusFlags]
cp $6c
ret
Function2a171:
call Function2a1c4
call Function2a22c
ldh a, [hMGStatusFlags]
cp $6c
ret
Function2a17c:
call Function2a2c1
ldh a, [hMGStatusFlags]
cp $6c
ret
Function2a184:
call Function2a385
ldh a, [hMGStatusFlags]
cp $6c
ret
Function2a18c:
call Function2a1a2
ld a, 1 << TIMER
ldh [rIE], a
xor a
ldh [rIF], a
call Function2a1c4
; runs for ~$40400 cycles
xor a
ld b, a
.busy_wait
inc a
jr nz, .busy_wait
inc b
jr nz, .busy_wait
ret
Function2a1a2:
xor a
ldh [rTAC], a
ld a, $fe
ldh [rTMA], a
ldh [rTIMA], a
ld a, $2
ldh [rTAC], a
or $4
ldh [rTAC], a
ret
Function2a1b4:
xor a
ldh [rTAC], a
ldh [rTMA], a
ldh [rTIMA], a
ld a, $2
ldh [rTAC], a
or $4
ldh [rTAC], a
ret
Function2a1c4:
ld a, $c0
call Function2a2ba
ld a, $1
ldh [hPrintNumBuffer + 8], a
ret
Function2a1ce:
xor a
call Function2a2ba
ld a, $2
ldh [rTAC], a
ret
Function2a1d7:
inc d
ret z
xor a
ldh [rIF], a
halt
ldh a, [c]
bit 1, a
jr z, Function2a1d7
or a
ret
Function2a1e5:
inc d
ret z
xor a
ldh [rIF], a
halt
ldh a, [c]
bit 1, a
jr nz, Function2a1e5
or a
ret
Function2a1f3:
ld a, $c1
ldh [c], a
.wait
dec d
ret z
xor a
ldh [rIF], a
halt
jr .wait
Function2a1ff:
ld a, $c0
ldh [c], a
.wait
dec d
ret z
xor a
ldh [rIF], a
halt
jr .wait
Function2a20b:
ld d, $0
ld e, d
ld a, $1
ldh [hPrintNumBuffer + 8], a
.loop
call MysteryGift_ReadJoypad
ld b, $2
ld c, LOW(rRP)
ldh a, [hMGJoypadReleased]
bit B_BUTTON_F, a
jr z, .next
ld a, $10
ldh [hMGStatusFlags], a
ret
.next
bit 0, a
jr nz, Function2a268
ldh a, [c]
and b
jr nz, .loop
Function2a22c:
ld c, LOW(rRP)
ld d, $0
ld e, d
call Function2a1e5
jp z, Function2a370
ld d, e
call Function2a1d7
jp z, Function2a370
call Function2a1e5
jp z, Function2a370
call Function2a1d7
jp z, Function2a370
ld a, $6c
ldh [hMGStatusFlags], a
ld d, $3d
call Function2a1ff
ld d, $5
call Function2a1f3
ld d, $15
call Function2a1ff
ld d, $5
call Function2a1f3
ld d, $5
call Function2a1ff
ret
Function2a268:
; Wait a random amount of time
call Random
ld e, a
and $f
ld d, a
.loop
dec de
ld a, d
or e
jr nz, .loop
Function2a274:
ld a, $2
ldh [hPrintNumBuffer + 8], a
ld c, LOW(rRP)
ld d, $0
ld e, d
ld d, $3d
call Function2a1ff
ld d, $5
call Function2a1f3
ld d, $15
call Function2a1ff
ld d, $5
call Function2a1f3
ld d, $5
call Function2a1ff
ld d, e
call Function2a1e5
jp z, Function2a370
ld d, e
call Function2a1d7
jp z, Function2a370
call Function2a1e5
jp z, Function2a370
call Function2a1d7
jp z, Function2a370
ld d, $3d
call Function2a1ff
ld a, $6c
ldh [hMGStatusFlags], a
ret
Function2a2ba:
ldh [rRP], a
ld a, $ff
ldh [hMGStatusFlags], a
ret
Function2a2c1:
xor a
ldh [hPrintNumBuffer + 4], a
ldh [hPrintNumBuffer + 5], a
push hl
push bc
ld c, LOW(rRP)
ld d, $3d
call Function2a1ff
ld hl, hPrintNumBuffer + 1
ld a, $5a
ld [hli], a
ld [hl], b
dec hl
ld b, $2
call Function2a304
pop bc
pop hl
call Function2a304
ldh a, [hPrintNumBuffer + 4]
ldh [hPrintNumBuffer + 1], a
ldh a, [hPrintNumBuffer + 5]
ldh [hPrintNumBuffer + 2], a
push hl
ld hl, hPrintNumBuffer + 1
ld b, $2
call Function2a304
ld hl, hMGStatusFlags
ld b, $1
call Function2a3dd
ldh a, [hPrintNumBuffer + 1]
ldh [hPrintNumBuffer + 4], a
ldh a, [hPrintNumBuffer + 2]
ldh [hPrintNumBuffer + 5], a
pop hl
ret
Function2a304:
ld c, LOW(rRP)
ld d, $5
call Function2a1ff
ld d, $5
call Function2a1f3
ld d, $15
call Function2a1ff
ld a, b
cpl
ld b, a
ld a, $f4
ldh [rTMA], a
.main_loop
inc b
jr z, .done
ld a, $8
ldh [hPrintNumBuffer + 3], a
ld a, [hli]
ld e, a
ldh a, [hPrintNumBuffer + 4]
add e
ldh [hPrintNumBuffer + 4], a
ldh a, [hPrintNumBuffer + 5]
adc 0
ldh [hPrintNumBuffer + 5], a
.inner_loop
xor a
ldh [rIF], a
halt
ld a, $c1
ldh [rRP], a
ld d, $1
ld a, e
rlca
ld e, a
jr nc, .wait
inc d
.wait
ldh a, [rTIMA]
cp $f8
jr c, .wait
ld a, $c0
ldh [rRP], a
dec d
jr z, .no_halt
xor a
ldh [rIF], a
halt
.no_halt
ldh a, [hPrintNumBuffer + 3]
dec a
jr z, .main_loop
ldh [hPrintNumBuffer + 3], a
jr .inner_loop
.done
ld a, $fe
ldh [rTMA], a
xor a
ldh [rIF], a
halt
ld d, $5
call Function2a1f3
ld d, $11
call Function2a1ff
ret
Function2a370:
ldh a, [hMGStatusFlags]
or $2
ldh [hMGStatusFlags], a
ret
Function2a377:
ldh a, [hMGStatusFlags]
or $1
ldh [hMGStatusFlags], a
ret
Function2a37e:
ldh a, [hMGStatusFlags]
or $80
ldh [hMGStatusFlags], a
ret
Function2a385:
xor a
ldh [hPrintNumBuffer + 4], a
ldh [hPrintNumBuffer + 5], a
push bc
push hl
ld hl, hPrintNumBuffer + 1
ld b, $2
call Function2a3dd
ldh a, [hPrintNumBuffer + 2]
ldh [hPrintNumBuffer + 7], a
ld b, a
pop hl
pop af
cp b
jp c, Function2a37e
ldh a, [hPrintNumBuffer + 1]
cp $5a
jp nz, Function2a37e
call Function2a3dd
ldh a, [hPrintNumBuffer + 4]
ld d, a
ldh a, [hPrintNumBuffer + 5]
ld e, a
push hl
push de
ld hl, hPrintNumBuffer + 1
ld b, $2
call Function2a3dd
pop de
ld hl, hPrintNumBuffer + 1
ld a, [hli]
xor d
ld b, a
ld a, [hl]
xor e
or b
call nz, Function2a377
push de
ld d, $3d
call Function2a1ff
ld hl, hMGStatusFlags
ld b, $1
call Function2a304
pop de
pop hl
ld a, d
ldh [hPrintNumBuffer + 4], a
ld a, e
ldh [hPrintNumBuffer + 5], a
ret
Function2a3dd:
ld c, LOW(rRP)
ld d, $0
call Function2a1e5
jp z, Function2a370
ld d, $0
call Function2a1d7
jp z, Function2a370
ld d, $0
call Function2a1e5
jp z, Function2a370
ld a, b
cpl
ld b, a
xor a
ldh [hMGPrevTIMA], a
call Function2a1b4
.main_loop
inc b
jr z, .done
ld a, $8
ldh [hPrintNumBuffer + 3], a
.inner_loop
ld d, $0
.wait_one
inc d
jr z, .got_one
ldh a, [c]
bit 1, a
jr z, .wait_one
ld d, $0
.got_one
.wait_zero
inc d
jr z, .got_zero
ldh a, [c]
bit 1, a
jr nz, .wait_zero
.got_zero
ldh a, [hMGPrevTIMA]
ld d, a
ldh a, [rTIMA]
ldh [hMGPrevTIMA], a
sub d
cp $12
jr c, .zero
set 0, e
jr .ok
.zero
res 0, e
.ok
ldh a, [hPrintNumBuffer + 3]
dec a
ldh [hPrintNumBuffer + 3], a
jr z, .continue
ld a, e
rlca
ld e, a
jr .inner_loop
.continue
ld a, e
ld [hli], a
ldh a, [hPrintNumBuffer + 4]
add e
ldh [hPrintNumBuffer + 4], a
ldh a, [hPrintNumBuffer + 5]
adc 0
ldh [hPrintNumBuffer + 5], a
jr .main_loop
.done
call Function2a1a2
xor a
ldh [rIF], a
ld d, $0
call Function2a1d7
jp z, Function2a370
ld d, $10
call Function2a1ff
ret
Function2a45c:
ld b, $0
jp Function2a2c1
Function2a461:
ld b, $0
jp Function2a385
MysteryGift_ReadJoypad:
; We can only get four inputs at a time.
; We take d-pad first for no particular reason.
ld a, R_DPAD
ldh [rJOYP], a
; Read twice to give the request time to take.
ldh a, [rJOYP]
ldh a, [rJOYP]
; The Joypad register output is in the lo nybble (inversed).
; We make the hi nybble of our new container d-pad input.
cpl
and $f
swap a
; We'll keep this in b for now.
ld b, a
; Buttons make 8 total inputs (A, B, Select, Start).
; We can fit this into one byte.
ld a, R_BUTTONS
ldh [rJOYP], a
; Wait for input to stabilize.
rept 6
ldh a, [rJOYP]
endr
; Buttons take the lo nybble.
cpl
and $f
or b
ld c, a
; To get the delta we xor the last frame's input with the new one.
ldh a, [hMGJoypadPressed]
xor c
; Released this frame:
and c
ldh [hMGJoypadReleased], a
; Pressed this frame:
ld a, c
ldh [hMGJoypadPressed], a
ld a, $30
; Reset the joypad register since we're done with it.
ldh [rJOYP], a
ret
MysteryGift_CheckAndSetDecorationAlreadyReceived:
call GetMysteryGiftBank
ld d, $0
ld b, CHECK_FLAG
ld hl, sMysteryGiftDecorationsReceived
lda_predef SmallFarFlagAction
push hl
push bc
call Predef
call CloseSRAM
ld a, c
and a
pop bc
pop hl
ret nz
call GetMysteryGiftBank
ld b, SET_FLAG
predef SmallFarFlagAction
call CloseSRAM
xor a
ret
MysteryGift_CopyReceivedDecosToPC:
call GetMysteryGiftBank
ld c, $0
.loop
push bc
ld d, $0
ld b, CHECK_FLAG
ld hl, sMysteryGiftDecorationsReceived
predef SmallFarFlagAction
ld a, c
and a
pop bc
jr z, .skip
push bc
callfar SetSpecificDecorationFlag
pop bc
.skip
inc c
ld a, c
cp NUM_NON_TROPHY_DECOS
jr c, .loop
jp CloseSRAM
UnlockMysteryGift:
call GetMysteryGiftBank
ld hl, sMysteryGiftUnlocked
ld a, [hl]
inc a
jr nz, .ok
ld [hld], a
ld [hl], a
.ok
jp CloseSRAM
Function2a4f6:
call GetMysteryGiftBank
ld a, [sNumDailyMysteryGiftPartnerIDs]
cp $ff
jr z, .okay
xor a
ld [sNumDailyMysteryGiftPartnerIDs], a
.okay
jp CloseSRAM
BackupMysteryGift:
call GetMysteryGiftBank
ld hl, sMysteryGiftItem
ld de, sBackupMysteryGiftItem
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
jp CloseSRAM
RestoreMysteryGift:
call GetMysteryGiftBank
ld hl, sBackupMysteryGiftItem
ld de, sMysteryGiftItem
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
jp CloseSRAM
MysteryGift_ClearTrainerData:
ld hl, wMysteryGiftTrainerData
xor a
ld b, wMysteryGiftTrainerDataEnd - wMysteryGiftTrainerData
.loop
ld [hli], a
dec b
jr nz, .loop
ret
GetMysteryGiftBank:
ld a, BANK(sBackupMysteryGiftItem)
jp OpenSRAM