pokeyellow/engine/menu/link_menu.asm
luckytyphlosion 94eee4e89e Cleanup with yellow-exclusive banks
Also introduce charmap for $ec (unfilled menu arrow cursor)
2015-12-31 15:24:54 -05:00

910 lines
15 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Func_f531b:: ; f531b (3d:531b)
ld c,$14
call DelayFrames
ld a,$1
ld [wBuffer],a
xor a
ld [wUnknownSerialFlag_d499],a
coord hl, 0,0
lb bc, 4, 5
call TextBoxBorder
ld de,Text_f5791
coord hl, 1,2
call PlaceString
coord hl, 8,0
lb bc, 8, 10
call TextBoxBorder
coord hl, 10,2
ld de,Text_f579c
call PlaceString
coord hl, 0,10
lb bc, 6, 18
call TextBoxBorder
call UpdateSprites
xor a
ld [wUnusedCD37],a
ld [wd72d],a
ld [wd11e],a
ld hl,wTopMenuItemY
ld a,$2
ld [hli],a
ld a,$9
ld [hli],a
xor a
ld [hli],a
inc hl
ld a,$3
ld [hli],a
ld a,$3
ld [hli],a
xor a
ld [hl],a
.asm_f5377
call Func_f56bd
call HandleMenuInput
and $3
add a
add a
ld b,a
ld a,[wCurrentMenuItem]
cp $3
jr nz,.asm_f5390
bit 2,b
jr z,.asm_f5390
dec a
ld b,$8
.asm_f5390
add b
add $c0
ld [wLinkMenuSelectionSendBuffer],a
ld [wLinkMenuSelectionSendBuffer+1],a
.asm_f5399
ld hl,wLinkMenuSelectionSendBuffer
ld a,[hl]
ld [hSerialSendData],a
call Serial_ExchangeByte
push af
ld hl,wLinkMenuSelectionSendBuffer
ld a,[hl]
ld [hSerialSendData],a
call Serial_ExchangeByte
pop bc
cp b
jr nz,.asm_f5399
and $f0
cp $c0
jr nz,.asm_f5399
ld a,b
and $c
jr nz,.asm_f53c4
ld a,[wLinkMenuSelectionSendBuffer]
and $c
jr z,.asm_f5377
jr .asm_f53df
.asm_f53c4
ld a,[wLinkMenuSelectionSendBuffer]
and $c
jr z,.asm_f53d1
ld a,[hSerialConnectionStatus]
cp $2
jr z,.asm_f53df
.asm_f53d1
ld a,$1
ld [wd11e],a
ld a,b
ld [wLinkMenuSelectionSendBuffer],a
and $3
ld [wCurrentMenuItem],a
.asm_f53df
call DelayFrame
call DelayFrame
ld hl,wLinkMenuSelectionSendBuffer
ld a,[hl]
ld [hSerialSendData],a
call Serial_ExchangeByte
call Serial_ExchangeByte
ld b,$14
.loop
call DelayFrame
call Serial_SendZeroByte
dec b
jr nz,.loop
ld b,$7f
ld c,$7f
ld d,$7f
ld e,$ec
ld a,[wLinkMenuSelectionSendBuffer]
bit 3,a
jr nz,.asm_f541a
ld b,e
ld e,c
ld a,[wCurrentMenuItem]
and a
jr z,.asm_f541a
ld c,b
ld b,d
dec a
jr z,.asm_f541a
ld d,c
ld c,b
.asm_f541a
ld a,b
Coorda 9,2
ld a,c
Coorda 9,4
ld a,d
Coorda 9,6
ld a,e
Coorda 9,8
ld c,40
call DelayFrames
ld a,[wLinkMenuSelectionSendBuffer]
bit 3,a
jr nz,asm_f547f
ld a,[wCurrentMenuItem]
cp $3
jr z,asm_f547f
inc a
ld [wUnknownSerialFlag_d499],a
ld a,[wCurrentMenuItem]
ld hl,PointerTable_f5488
ld c,a
ld b,$0
add hl,bc
add hl,bc
ld a,[hli]
ld h,[hl]
ld l,a
ld de,.returnaddress
push de
jp hl
.returnaddress
ld [wLinkMenuSelectionSendBuffer],a
xor a
ld [wUnknownSerialCounter],a
ld [wUnknownSerialCounter+1],a
call Serial_SyncAndExchangeNybble
ld a,[wLinkMenuSelectionSendBuffer]
and a
jr nz,asm_f547c
ld a, [wLinkMenuSelectionReceiveBuffer]
and a
jr nz, Func_f5476
xor a
ld [wUnknownSerialCounter],a
ld [wUnknownSerialCounter+1],a
and a
ret
Func_f5476:: ; f5476 (3d:5476)
ld hl,ColosseumIneligibleText
call PrintText
asm_f547c:: ; f547c (3d:574c)
jp Func_f531b
asm_f547f:: ; f547f (3d:547f)
xor a
ld [wUnknownSerialCounter],a
ld [wUnknownSerialCounter+1],a
scf
ret
PointerTable_f5488:: ; f5488 (3d:5488)
dw PokeCup
dw PikaCup
dw PetitCup
PokeCup:: ; f548e (3d:548e)
ld hl,wPartyCount
ld a,[hli]
cp $3
jp nz,NotThreeMonsInParty
ld b,$3
.loop
ld a,[hli]
cp MEW
jp z,MewInParty
dec b
jr nz,.loop
dec hl
dec hl
cp [hl] ; is third mon second mon?
jp z,DuplicateSpecies
dec hl ; wPartySpecies
cp [hl] ; is third mon first mon?
jp z,DuplicateSpecies
ld a,[hli]
cp [hl] ; is first mon second mon?
jp z,DuplicateSpecies
ld a,[wPartyMon1Level]
cp 56
jp nc,LevelAbove55
cp 50
jp c,LevelUnder50
ld b,a
ld a,[wPartyMon2Level]
cp 56
jp nc,LevelAbove55
cp 50
jp c,LevelUnder50
ld c,a
ld a,[wPartyMon3Level]
cp 56
jp nc,LevelAbove55
cp 50
jp c,LevelUnder50
add b
add c
cp 156
jp nc,CombinedLevelsGreaterThan155
xor a
ret
PikaCup:: ; f54e4 (3d:54e4)
ld hl,wPartyCount
ld a,[hli]
cp $3
jp nz,NotThreeMonsInParty
ld b,$3
.loop
ld a,[hli] ; wPartySpecies
cp MEW
jp z,MewInParty
dec b
jr nz,.loop
dec hl
dec hl
cp [hl] ; is third mon second mon?
jp z,DuplicateSpecies
dec hl ; wPartySpecies
cp [hl] ; is third mon first mon?
jp z,DuplicateSpecies
ld a,[hli]
cp [hl] ; is first mon second mon?
jp z,DuplicateSpecies
ld a,[wPartyMon1Level]
cp 21
jp nc,LevelAbove20
cp 15
jp c,LevelUnder15
ld b,a
ld a,[wPartyMon2Level]
cp 21
jp nc,LevelAbove20
cp 15
jp c,LevelUnder15
ld c,a
ld a,[wPartyMon3Level]
cp 21
jp nc,LevelAbove20
cp 15
jp c,LevelUnder15
add b
add c
cp 51
jp nc,CombinedLevelsAbove50
xor a
ret
PetitCup:: ; f553a (3d:553a)
ld hl,wPartyCount
ld a,[hli]
cp $3
jp nz,NotThreeMonsInParty
ld b,$3
.loop
ld a,[hli]
cp MEW
jp z,MewInParty
dec b
jr nz,.loop
dec hl
dec hl
cp [hl] ; is third mon second mon?
jp z,DuplicateSpecies
dec hl ; wPartySpecies
cp [hl] ; is third mon first mon?
jp z,DuplicateSpecies
ld a,[hli]
cp [hl] ; is first mon second mon?
jp z,DuplicateSpecies
dec hl
ld a,[hl]
ld [wcf91],a
push hl
callab Func_3b10f
pop hl
jp c,asm_f56ad
inc hl
ld a,[hl]
ld [wcf91],a
push hl
callab Func_3b10f
pop hl
jp c,asm_f56ad
inc hl
ld a,[hl]
ld [wcf91],a
push hl
callab Func_3b10f
pop hl
jp c,asm_f56ad
dec hl
dec hl
ld b,$3
.bigloop
ld a,[hli]
push hl
push bc
push af
dec a
ld c,a
ld b,$0
ld hl,PokedexEntryPointers
add hl,bc
add hl,bc
ld de,wcd6d
ld bc,$2
ld a,BANK(PokedexEntryPointers)
call FarCopyData
ld hl,wcd6d
ld a,[hli]
ld h,[hl]
ld l,a
ld de,wcd6d
ld bc,$14
ld a,BANK(PokedexEntryPointers)
call FarCopyData
ld hl,wcd6d
.loop2
ld a,[hli]
cp "@"
jr nz,.loop2
ld a,[hli]
cp $7
jp nc,asm_f5689
add a
add a
ld b,a
add a
add b
ld b,a
ld a,[hli]
add b
cp $51
jp nc,asm_f5689
ld a,[hli]
sub $b9
ld a,[hl]
sbc $1
jp nc,asm_f569b
pop af
pop bc
pop hl
dec b
jr nz,.bigloop
ld a,[wPartyMon1Level]
cp 31
jp nc,LevelAbove30
cp 25
jp c,LevelUnder25
ld b,a
ld a,[wPartyMon2Level]
cp 31
jp nc,LevelAbove30
cp 25
jp c,LevelUnder25
ld c,a
ld a,[wPartyMon3Level]
cp 31
jp nc,LevelAbove30
cp 25
jp c,LevelUnder25
add b
add c
cp 81
jp nc,CombinedLevelsAbove80
xor a
ret
NotThreeMonsInParty:: ; f561d (3d:516d)
ld hl,Colosseum3MonsText
call PrintText
ld a,$1
ret
MewInParty:: ; f5626 (3d:f5626)
ld hl,ColosseumMewText
call PrintText
ld a,$2
ret
DuplicateSpecies:: ; f562f (3d:f562f)
ld hl,ColosseumDifferentMonsText
call PrintText
ld a,$3
ret
LevelAbove55:: ; f5638 (3d:5638)
ld hl,ColosseumMaxL55Text
call PrintText
ld a,$4
ret
LevelUnder50:: ; f5641 (3d:5641)
ld hl,ColosseumMinL50Text
call PrintText
ld a,$5
ret
CombinedLevelsGreaterThan155:: ; f5641 (3d:564a)
ld hl,ColosseumTotalL155Text
call PrintText
ld a,$6
ret
LevelAbove30:: ; f5653 (3d:5653)
ld hl,ColosseumMaxL30Text
call PrintText
ld a,$7
ret
LevelUnder25:: ; f565c (3d:565c)
ld hl,ColosseumMinL25Text
call PrintText
ld a,$8
ret
CombinedLevelsAbove80:: ; f5665 (3d:5665)
ld hl,ColosseumTotalL80Text
call PrintText
ld a,$9
ret
LevelAbove20:: ; f566e (3d:566e)
ld hl,ColosseumMaxL20Text
call PrintText
ld a,$a
ret
LevelUnder15:: ; f5677 (3d:5677)
ld hl,ColosseumMinL15Text
call PrintText
ld a,$b
ret
CombinedLevelsAbove50:: ; f5680 (3d:5680)
ld hl,ColosseumTotalL50Text
call PrintText
ld a,$c
ret
asm_f5689:: ; f5689 (3d:5689)
pop af
pop bc
pop hl
ld [wd11e],a
call GetMonName
ld hl,ColosseumHeightText
call PrintText
ld a,$d
ret
asm_f569b:: ; f569b (3d:569b)
pop af
pop bc
pop hl
ld [wd11e],a
call GetMonName
ld hl,ColosseumWeightText
call PrintText
ld a,$e
ret
asm_f56ad:: ; f56ad (3d:56ad)
ld a,[hl]
ld [wd11e],a
call GetMonName
ld hl,ColosseumEvolvedText
call PrintText
ld a,$f
ret
Func_f56bd:: ; f56bd (3d:56bd)
xor a
ld [H_AUTOBGTRANSFERENABLED],a
coord hl, 1,11
lb bc, 6, 18
call ClearScreenArea
ld a,[wCurrentMenuItem]
cp $3
jr nc,.asm_f56e6
ld hl,PointerTable_f56ee
ld a,[wCurrentMenuItem]
ld c,a
ld b,$0
add hl,bc
add hl,bc
ld a,[hli]
ld h,[hl]
ld l,a
ld d,h
ld e,l
coord hl, 1,12
call PlaceString
.asm_f56e6
call Delay3
ld a,$1
ld [H_AUTOBGTRANSFERENABLED],a
ret
PointerTable_f56ee:: ; f56ee (3d:56ee)
dw Text_f56f4
dw Text_f5728
dw Text_f575b
Text_f56f4:: ; f56f4 (3d:56f4)
db "LVs of 3<pkmn>:50-55"
next "Sum of LVs:155 MAX"
next "MEW can't attend.@"
Text_f5728:: ; f5728 (3d:5728)
db "LVs of 3<pkmn>:15-20"
next "Sum of LVs:50 MAX"
next "MEW can't attend.@"
Text_f575b:: ; f575b (3d:575b)
db "3 Basic <pkmn>.LV25-30"
next "Sum of LVs:80 MAX"
next "68″ and 44lb MAX@"
Text_f5791:: ; f5791 (3d:5791)
db "View"
next "Rules@"
Text_f579c:: ; f579c (3d:579c)
db "# Cup"
next "Pika Cup"
next "Petit Cup"
next "CANCEL@"
Colosseum3MonsText:: ; f57bc (3d:57bc)
TX_FAR _Colosseum3MonsText ; a0a2b
db "@"
ColosseumMewText:: ; f57c1 (3d:57c1)
TX_FAR _ColosseumMewText ; a0a46
db "@"
ColosseumDifferentMonsText:: ; f57c6 (3d:57c6)
TX_FAR _ColosseumDifferentMonsText ; a0a5f
db "@"
ColosseumMaxL55Text:: ; f57cb (3d:57cb)
TX_FAR _ColosseumMaxL55Text ; a0a81
db "@"
ColosseumMinL50Text:: ; f57d0 (3d:57d0)
TX_FAR _ColosseumMinL50Text ; a0a9a
db "@"
ColosseumTotalL155Text:: ; f57d5 (3d:57d5)
TX_FAR _ColosseumTotalL155Text ; a0aba
db "@"
ColosseumMaxL30Text:: ; f57da (3d:57da)
TX_FAR _ColosseumMaxL30Text ; a0ad9
db "@"
ColosseumMinL25Text:: ; f57df (3d:57df)
TX_FAR _ColosseumMinL25Text ; a0af2
db "@"
ColosseumTotalL80Text:: ; f57e4 (3d:57e4)
TX_FAR _ColosseumTotalL80Text ; a0b12
db "@"
ColosseumMaxL20Text:: ; f57e9 (3d:57e9)
TX_FAR _ColosseumMaxL20Text ; a0b30
db "@"
ColosseumMinL15Text:: ; f57ee (3d:57ee)
TX_FAR _ColosseumMinL15Text ; a0b49
db "@"
ColosseumTotalL50Text:: ; f57f3 (3d:57f3)
TX_FAR _ColosseumTotalL50Text ; a0b69
db "@"
ColosseumHeightText:: ; f57f8 (3d:57f8)
TX_FAR _ColosseumHeightText ; a0b87
db "@"
ColosseumWeightText:: ; f57fd (3d:57fd)
TX_FAR _ColosseumWeightText ; a0b9f
db "@"
ColosseumEvolvedText:: ; f5802 (3d:5802)
TX_FAR _ColosseumEvolvedText ; a0bbb
db "@"
ColosseumIneligibleText:: ; f5807 (3d:5807)
TX_FAR _ColosseumIneligibleText ; a0bd4
db "@"
LinkMenu: ; f580c (3d:580c)
xor a
ld [wLetterPrintingDelayFlags], a
ld hl, wd72e
set 6, [hl]
ld hl, TextTerminator_f5a16
call PrintText
call SaveScreenTilesToBuffer1
ld hl, ColosseumWhereToText
call PrintText
coord hl, 5, 3
lb bc, 8, 13
call TextBoxBorder
call UpdateSprites
coord hl, 7, 5
ld de, TradeCenterText
call PlaceString
xor a
ld [wUnusedCD37], a
ld [wd72d], a
ld [wd11e], a
ld hl, wTopMenuItemY
ld a, $5
ld [hli], a
ld a, $6
ld [hli], a
xor a
ld [hli], a
inc hl
ld a, $3
ld [hli], a
ld [hli], a
xor a
ld [hl], a
.waitForInputLoop
call HandleMenuInput
and A_BUTTON | B_BUTTON
add a
add a
ld b, a
ld a, [wCurrentMenuItem]
cp $3
jr nz,.asm_f586b
bit 2,b
jr z,.asm_f586b
dec a
ld b,$8
.asm_f586b
add b
add $d0
ld [wLinkMenuSelectionSendBuffer], a
ld [wLinkMenuSelectionSendBuffer + 1], a
.exchangeMenuSelectionLoop
call Serial_ExchangeLinkMenuSelection
ld a, [wLinkMenuSelectionReceiveBuffer]
ld b, a
and $f0
cp $d0
jr z, .asm_f5c7d
ld a, [wLinkMenuSelectionReceiveBuffer + 1]
ld b, a
and $f0
cp $d0
jr nz, .exchangeMenuSelectionLoop
.asm_f5c7d
ld a, b
and $c ; did the enemy press A or B?
jr nz, .enemyPressedAOrB
; the enemy didn't press A or B
ld a, [wLinkMenuSelectionSendBuffer]
and $c ; did the player press A or B?
jr z, .waitForInputLoop ; if neither the player nor the enemy pressed A or B, try again
jr .doneChoosingMenuSelection ; if the player pressed A or B but the enemy didn't, use the player's selection
.enemyPressedAOrB
ld a, [wLinkMenuSelectionSendBuffer]
and $c ; did the player press A or B?
jr z, .useEnemyMenuSelection ; if the enemy pressed A or B but the player didn't, use the enemy's selection
; the enemy and the player both pressed A or B
; The gameboy that is clocking the connection wins.
ld a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
jr z, .doneChoosingMenuSelection
.useEnemyMenuSelection
ld a, $1
ld [wd11e], a
ld a, b
ld [wLinkMenuSelectionSendBuffer], a
and $3
ld [wCurrentMenuItem], a ; wCurrentMenuItem
.doneChoosingMenuSelection
ld a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
jr nz, .skipStartingTransfer
call DelayFrame
call DelayFrame
ld a, START_TRANSFER_INTERNAL_CLOCK
ld [rSC], a
.skipStartingTransfer
ld b, " "
ld c, " "
ld d, " "
ld e, "▷"
ld a, [wLinkMenuSelectionSendBuffer]
and (B_BUTTON << 2) ; was B button pressed?
jr nz, .updateCursorPosition
; A button was pressed
ld a, [wCurrentMenuItem]
cp $2
jp z, .asm_f5963
ld b, e
ld e, c
ld a, [wCurrentMenuItem]
and a
jr z, .updateCursorPosition
ld c, b
ld b, d
dec a
jr z, .updateCursorPosition
ld d, c
ld c, b
.updateCursorPosition
call Func_f59ec
call LoadScreenTilesFromBuffer1
ld a, [wLinkMenuSelectionSendBuffer]
and (B_BUTTON << 2) ; was B button pressed?
jr nz, .choseCancel ; cancel if B pressed
ld a, [wCurrentMenuItem]
cp $2
jr z, .choseCancel
xor a
ld [wWalkBikeSurfState], a ; start walking
ld a, [wCurrentMenuItem]
and a
ld a, COLOSSEUM
jr nz, .next
ld a, TRADE_CENTER
.next
ld [wd72d], a
ld hl, ColosseumPleaseWaitText
call PrintText
ld c, 50
call DelayFrames
ld hl, wd732
res 1, [hl]
ld a, [wAnimationID]
ld [wDestinationMap], a
callab SpecialWarpIn
ld c, 20
call DelayFrames
xor a
ld [wMenuJoypadPollCount], a
ld [wSerialExchangeNybbleSendData], a
inc a ; LINK_STATE_IN_CABLE_CLUB
ld [wLinkState], a
ld [wEnteringCableClub], a
jpab SpecialEnterMap
.choseCancel
xor a
ld [wMenuJoypadPollCount], a
call Delay3
callab CloseLinkConnection
ld hl, ColosseumCanceledText
call PrintText
ld hl, wd72e
res 6, [hl]
ret
.asm_f5963
ld a,[wd11e]
and a
jr nz,.asm_f5974
ld b," "
ld c," "
ld d,"▷"
ld e," "
call Func_f59ec
.asm_f5974
xor a
ld [wBuffer], a
ld a,$ff
ld [wSerialExchangeNybbleReceiveData],a
ld a, $b
ld [wLinkMenuSelectionSendBuffer], a
ld b,$78
.loop
ld a,[hSerialConnectionStatus]
cp $2
call z,DelayFrame
dec b
jr z,.asm_f59b2
call Serial_ExchangeNybble
call DelayFrame
ld a,[wSerialExchangeNybbleReceiveData]
inc a
jr z,.loop
ld b,$f
.loop2
call DelayFrame
call Serial_ExchangeNybble
dec b
jr nz,.loop2
ld b,$f
.loop3
call DelayFrame
call Serial_SendZeroByte
dec b
jr nz,.loop3
jr .asm_f59d6
.asm_f59b2
xor a
ld [wUnknownSerialCounter],a
ld [wUnknownSerialCounter+1],a
ld a,[wd11e]
and a
jr z,.asm_f59cd
ld b," "
ld c," "
ld d," "
ld e,"▷"
call Func_f59ec
jp .choseCancel
.asm_f59cd
ld hl,ColosseumVersionText
call PrintText
jp .choseCancel
.asm_f59d6
ld b," "
ld c," "
ld d,"▷"
ld e," "
call Func_f59ec
call Func_f531b
jp c,.choseCancel
ld a,$f0
jp .next
Func_f59ec:: ; f59ec (3d:59ec)
ld a, b
Coorda 6, 5
ld a, c
Coorda 6, 7
ld a, d
Coorda 6, 9
ld a, e
Coorda 6, 11
ld c, 40
call DelayFrames
ret
ColosseumWhereToText: ; f5a02 (3d:5a02)
TX_FAR _ColosseumWhereToText
db "@"
ColosseumPleaseWaitText: ; f5a07 (3d:5a07)
TX_FAR _ColosseumPleaseWaitText
db "@"
ColosseumCanceledText: ; f5a0c (3d:5a0c)
TX_FAR _ColosseumCanceledText
db "@"
ColosseumVersionText: ; f5a11 (3d:5a11)
TX_FAR _ColosseumVersionText ; 28:4c47
db "@"
TextTerminator_f5a16: ; f5a16 (3d:5a16)
db "@"
TradeCenterText: ; f5a17 (3d:5a17)
db "TRADE CENTER"
next "COLOSSEUM"
next "COLOSSEUM2"
next "CANCEL@"