pokecrystal/engine/party_menu.asm

945 lines
13 KiB
NASM

SelectMonFromParty: ; 50000
call DisableSpriteUpdates
xor a
ld [PartyMenuActionText], a
call ClearBGPalettes
call Function5003f
call WaitBGMap
call SetPalettes
call DelayFrame
call PartyMenuSelect
call Function2b74
ret
; 5001d
Function5001d: ; 5001d
ld a, b
ld [PartyMenuActionText], a
call DisableSpriteUpdates
call ClearBGPalettes
call Function5003f
call WaitBGMap
ld b, $a
call GetSGBLayout
call SetPalettes
call DelayFrame
call PartyMenuSelect
call Function2b74
ret
; 5003f
Function5003f: ; 5003f
call Function5004f
call Function50405
call Function503e0
call WritePartyMenuTilemap
call PrintPartyMenuText
ret
; 5004f
Function5004f: ; 5004f
call LoadFontsBattleExtra
callab Function8ad1 ; engine/color.asm
callab InefficientlyClear121BytesAtwc300
ret
; 5005f
WritePartyMenuTilemap: ; 0x5005f
ld hl, Options
ld a, [hl]
push af
set 4, [hl] ; Disable text delay
xor a
ld [hBGMapMode], a
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, " "
call ByteFill ; blank the tilemap
call GetPartyMenuTilemapPointers ; This reads from a pointer table???
.loop
ld a, [hli]
cp $ff
jr z, .end ; 0x5007a $8
push hl
ld hl, .Jumptable
rst JumpTable
pop hl
jr .loop ; 0x50082 $f3
.end
pop af
ld [Options], a
ret
; 0x50089
.Jumptable: ; 50089
dw PlacePartyNicknames
dw PlacePartyHPBar
dw PlacePartyMenuHPDigits
dw PlacePartyMonLevel
dw PlacePartyMonStatus
dw PlacePartyMonTMHMCompatibility
dw PlacePartyMonEvoStoneCompatibility
dw PlacePartyMonGender
dw PlacePartyMonMobileBattleSelection
; 5009b
PlacePartyNicknames: ; 5009b
hlcoord 3, 1
ld a, [PartyCount]
and a
jr z, .end
ld c, a
ld b, $0
.loop
push bc
push hl
push hl
ld hl, PartyMonNicknames
ld a, b
call GetNick
pop hl
call PlaceString
pop hl
ld de, 2 * SCREEN_WIDTH
add hl, de
pop bc
inc b
dec c
jr nz, .loop
.end
rept 2
dec hl
endr
ld de, .CANCEL
call PlaceString
ret
; 500c8
.CANCEL: ; 500c8
db "CANCEL@"
; 500cf
PlacePartyHPBar: ; 500cf
xor a
ld [wcda9], a
ld a, [PartyCount]
and a
ret z
ld c, a
ld b, $0
hlcoord 11, 2
.loop
push bc
push hl
call PartyMenuCheckEgg
jr z, .skip
push hl
call PlacePartymonHPBar
pop hl
ld d, $6
ld b, $0
call DrawBattleHPBar
ld hl, wcd9b
ld a, [wcda9]
ld c, a
ld b, $0
add hl, bc
call SetHPPal
ld b, $fc
call GetSGBLayout
.skip
ld hl, wcda9
inc [hl]
pop hl
ld de, 2 * SCREEN_WIDTH
add hl, de
pop bc
inc b
dec c
jr nz, .loop
ld b, $a
call GetSGBLayout
ret
; 50117
PlacePartymonHPBar: ; 50117
ld a, b
ld bc, PARTYMON_STRUCT_LENGTH
ld hl, PartyMon1HP
call AddNTimes
ld a, [hli]
or [hl]
jr nz, .not_fainted
xor a
ld e, a
ld c, a
ret
.not_fainted
dec hl
ld a, [hli]
ld b, a
ld a, [hli]
ld c, a
ld a, [hli]
ld d, a
ld a, [hli]
ld e, a
predef DrawPartyMenuHPBar
ret
; 50138
PlacePartyMenuHPDigits: ; 50138
ld a, [PartyCount]
and a
ret z
ld c, a
ld b, $0
hlcoord 13, 1
.loop
push bc
push hl
call PartyMenuCheckEgg
jr z, .next
push hl
ld a, b
ld bc, PARTYMON_STRUCT_LENGTH
ld hl, PartyMon1HP
call AddNTimes
ld e, l
ld d, h
pop hl
push de
lb bc, 2, 3
call PrintNum
pop de
ld a, "/"
ld [hli], a
rept 2
inc de
endr
lb bc, 2, 3
call PrintNum
.next
pop hl
ld de, 2 * SCREEN_WIDTH
add hl, de
pop bc
inc b
dec c
jr nz, .loop
ret
; 50176
PlacePartyMonLevel: ; 50176
ld a, [PartyCount]
and a
ret z
ld c, a
ld b, 0
hlcoord 8, 2
.loop
push bc
push hl
call PartyMenuCheckEgg
jr z, .next
push hl
ld a, b
ld bc, PARTYMON_STRUCT_LENGTH
ld hl, PartyMon1Level
call AddNTimes
ld e, l
ld d, h
pop hl
ld a, [de]
cp 100 ; This is distinct from MAX_LEVEL.
jr nc, .ThreeDigits
ld a, "<LV>"
ld [hli], a
lb bc, PRINTNUM_RIGHTALIGN | 1, 2
; jr .okay
.ThreeDigits
lb bc, PRINTNUM_RIGHTALIGN | 1, 3
; .okay
call PrintNum
.next
pop hl
ld de, SCREEN_WIDTH * 2
add hl, de
pop bc
inc b
dec c
jr nz, .loop
ret
; 501b2
PlacePartyMonStatus: ; 501b2
ld a, [PartyCount]
and a
ret z
ld c, a
ld b, 0
hlcoord 5, 2
.loop
push bc
push hl
call PartyMenuCheckEgg
jr z, .next
push hl
ld a, b
ld bc, PARTYMON_STRUCT_LENGTH
ld hl, PartyMon1Status
call AddNTimes
ld e, l
ld d, h
pop hl
call PlaceStatusString
.next
pop hl
ld de, SCREEN_WIDTH * 2
add hl, de
pop bc
inc b
dec c
jr nz, .loop
ret
; 501e0
PlacePartyMonTMHMCompatibility: ; 501e0
ld a, [PartyCount]
and a
ret z
ld c, a
ld b, 0
hlcoord 12, 2
.loop
push bc
push hl
call PartyMenuCheckEgg
jr z, .next
push hl
ld hl, PartySpecies
ld e, b
ld d, 0
add hl, de
ld a, [hl]
ld [CurPartySpecies], a
predef CanLearnTMHMMove
pop hl
call .PlaceAbleNotAble
call PlaceString
.next
pop hl
ld de, SCREEN_WIDTH * 2
add hl, de
pop bc
inc b
dec c
jr nz, .loop
ret
; 50215
.PlaceAbleNotAble: ; 50215
ld a, c
and a
jr nz, .able
ld de, .string_not_able
ret
.able
ld de, .string_able
ret
; 50221
.string_able: ; 50221
db "ABLE@"
; 50226
.string_not_able: ; 50226
db "NOT ABLE@"
; 5022f
PlacePartyMonEvoStoneCompatibility: ; 5022f
ld a, [PartyCount]
and a
ret z
ld c, a
ld b, 0
hlcoord 12, 2
.loop
push bc
push hl
call PartyMenuCheckEgg
jr z, .next
push hl
ld a, b
ld bc, PARTYMON_STRUCT_LENGTH
ld hl, PartyMon1Species
call AddNTimes
ld a, [hl]
dec a
ld e, a
ld d, 0
ld hl, EvosAttacksPointers
rept 2
add hl, de
endr
call .DetermineCompatibility
pop hl
call PlaceString
.next
pop hl
ld de, 2 * SCREEN_WIDTH
add hl, de
pop bc
inc b
dec c
jr nz, .loop
ret
; 50268
.DetermineCompatibility: ; 50268
ld de, StringBuffer1
ld a, BANK(EvosAttacksPointers)
ld bc, 2
call FarCopyBytes
ld hl, StringBuffer1
ld a, [hli]
ld h, [hl]
ld l, a
ld de, StringBuffer1
ld a, BANK(EvosAttacks)
ld bc, $a
call FarCopyBytes
ld hl, StringBuffer1
.loop2
ld a, [hli]
and a
jr z, .nope
rept 2
inc hl
endr
cp EVOLVE_ITEM
jr nz, .loop2
rept 2
dec hl
endr
ld a, [CurItem]
cp [hl]
rept 2
inc hl
endr
jr nz, .loop2
ld de, .string_able
ret
.nope
ld de, .string_not_able
ret
; 502a3
.string_able: ; 502a3
db "ABLE@"
; 502a8
.string_not_able: ; 502a8
db "NOT ABLE@"
; 502b1
PlacePartyMonGender: ; 502b1
ld a, [PartyCount]
and a
ret z
ld c, a
ld b, 0
hlcoord 12, 2
.loop
push bc
push hl
call PartyMenuCheckEgg
jr z, .next
ld [CurPartySpecies], a
push hl
ld a, b
ld [CurPartyMon], a
xor a
ld [MonType], a
call GetGender
ld de, .unknown
jr c, .got_gender
ld de, .male
jr nz, .got_gender
ld de, .female
.got_gender
pop hl
call PlaceString
.next
pop hl
ld de, 2 * SCREEN_WIDTH
add hl, de
pop bc
inc b
dec c
jr nz, .loop
ret
; 502ee
.male: ; 502ee
db "♂…MALE@"
; 502f5
.female: ; 502f5
db "♀…FEMALE@"
; 502fe
.unknown: ; 502fe
db "…UNKNOWN@"
; 50307
PlacePartyMonMobileBattleSelection: ; 50307
ld a, [PartyCount]
and a
ret z
ld c, a
ld b, 0
hlcoord 12, 1
.loop
push bc
push hl
ld de, .String_Sanka_Shinai
call PlaceString
pop hl
ld de, 2 * SCREEN_WIDTH
add hl, de
pop bc
inc b
dec c
jr nz, .loop
ld a, l
ld e, PKMN_NAME_LENGTH
sub e
ld l, a
ld a, h
sbc $0
ld h, a
ld de, .String_Kettei_Yameru
call PlaceString
ld b, $3
ld c, $0
ld hl, wd002
ld a, [hl]
.loop2
push hl
push bc
hlcoord 12, 1
.loop3
and a
jr z, .done
ld de, 2 * SCREEN_WIDTH
add hl, de
dec a
jr .loop3
.done
ld de, .String_Banme
push hl
call PlaceString
pop hl
pop bc
push bc
push hl
ld a, c
ld hl, .Strings_1_2_3
call GetNthString
ld d, h
ld e, l
pop hl
call PlaceString
pop bc
pop hl
inc hl
ld a, [hl]
inc c
dec b
ret z
jr .loop2
; 5036b
.String_Banme: ; 5036b
db " ばんめ @" ; Place
; 50372
.String_Sanka_Shinai: ; 50372
db "さんかしない@" ; Cancel
; 50379
.String_Kettei_Yameru: ; 50379
db "けってい やめる@" ; Quit
; 50383
.Strings_1_2_3: ; 50383
db "1@", "2@", "3@" ; 1st, 2nd, 3rd
; 50389
PartyMenuCheckEgg: ; 50389
ld a, PartySpecies % $100
add b
ld e, a
ld a, PartySpecies / $100
adc 0
ld d, a
ld a, [de]
cp EGG
ret
; 50396
GetPartyMenuTilemapPointers: ; 50396
ld a, [PartyMenuActionText]
and $f0
jr nz, .skip
ld a, [PartyMenuActionText]
and $f
ld e, a
ld d, 0
ld hl, .Pointers
rept 2
add hl, de
endr
ld a, [hli]
ld h, [hl]
ld l, a
ret
.skip
ld hl, .Default
ret
; 503b2
.Pointers: ; 503b2
dw .Default
dw .Default
dw .Default
dw .TMHM
dw .Default
dw .EvoStone
dw .Gender
dw .Gender
dw .Default
dw .Mobile
; 503c6
.Default: db 0, 1, 2, 3, 4, $ff
.TMHM: db 0, 5, 3, 4, $ff
.EvoStone: db 0, 6, 3, 4, $ff
.Gender: db 0, 7, 3, 4, $ff
.Mobile: db 0, 8, 3, 4, $ff
; 503e0
Function503e0: ; 503e0
ld hl, PartyCount
ld a, [hli]
and a
ret z
ld c, a
xor a
ld [hObjectStructIndexBuffer], a
.asm_503ea
push bc
push hl
ld hl, Function8e83f
ld a, BANK(Function8e83f)
ld e, $0
rst FarCall
ld a, [hObjectStructIndexBuffer]
inc a
ld [hObjectStructIndexBuffer], a
pop hl
pop bc
dec c
jr nz, .asm_503ea
callab Function8cf69
ret
; 50405
Function50405: ; 50405
xor a
ld [wd0e3], a
ld de, Unknown_5044f
call Function1bb1
ld a, [PartyCount]
inc a
ld [wcfa3], a
dec a
ld b, a
ld a, [wd0d8]
and a
jr z, .asm_50422
inc b
cp b
jr c, .asm_50424
.asm_50422
ld a, $1
.asm_50424
ld [MenuSelection2], a
ld a, $3
ld [wcfa8], a
ret
; 5042d
Function5042d: ; 0x5042d
ld de, Unknown_5044f
call Function1bb1
ld a, [PartyCount]
ld [wcfa3], a
ld b, a
ld a, [wd0d8]
and a
jr z, .asm_50444
inc b
cp b
jr c, .asm_50446
.asm_50444
ld a, $1
.asm_50446
ld [MenuSelection2], a
ld a, $3
ld [wcfa8], a
ret
; 5044f (14:444f)
Unknown_5044f: ; 5044f
; cursor y
; cursor x
; list length
; ?
; bit 6: animate sprites bit 5: wrap around
; ?
; distance between items (hi: y, lo: x)
; allowed buttons (mask)
db $01, $00, $00, $01, $60, $00, $20, $00
; 50457
PartyMenuSelect: ; 0x50457
; sets carry if exitted menu.
call Function1bc9
call Function1bee
ld a, [PartyCount]
inc a
ld b, a
ld a, [MenuSelection2] ; menu selection?
cp b
jr z, .exitmenu ; CANCEL
ld [wd0d8], a
ld a, [hJoyLast]
ld b, a
bit 1, b
jr nz, .exitmenu ; B button?
ld a, [MenuSelection2]
dec a
ld [CurPartyMon], a
ld c, a
ld b, $0
ld hl, PartySpecies
add hl, bc
ld a, [hl]
ld [CurPartySpecies], a
ld de, SFX_READ_TEXT_2
call PlaySFX
call WaitSFX
and a
ret
.exitmenu
ld de, SFX_READ_TEXT_2
call PlaySFX
call WaitSFX
scf
ret
; 0x5049a
PrintPartyMenuText: ; 5049a
hlcoord 0, 14
lb bc, 2, 18
call TextBox
ld a, [PartyCount]
and a
jr nz, .haspokemon
ld de, YouHaveNoPKMNString
jr .gotstring
.haspokemon ; 504ae
ld a, [PartyMenuActionText]
and $f ; drop high nibble
ld hl, PartyMenuStrings
ld e, a
ld d, $0
rept 2
add hl, de
endr
ld a, [hli]
ld d, [hl]
ld e, a
.gotstring ; 504be
ld a, [Options]
push af
set 4, a ; disable text delay
ld [Options], a
hlcoord 1, 16 ; Coord
call PlaceString
pop af
ld [Options], a
ret
; 0x504d2
PartyMenuStrings: ; 0x504d2
dw ChooseAMonString
dw UseOnWhichPKMNString
dw WhichPKMNString
dw TeachWhichPKMNString
dw MoveToWhereString
dw UseOnWhichPKMNString
dw ChooseAMonString ; Probably used to be ChooseAFemalePKMNString
dw ChooseAMonString ; Probably used to be ChooseAMalePKMNString
dw ToWhichPKMNString
ChooseAMonString: ; 0x504e4
db "Choose a #MON.@"
UseOnWhichPKMNString: ; 0x504f3
db "Use on which <PK><MN>?@"
WhichPKMNString: ; 0x50504
db "Which <PK><MN>?@"
TeachWhichPKMNString: ; 0x5050e
db "Teach which <PK><MN>?@"
MoveToWhereString: ; 0x5051e
db "Move to where?@"
ChooseAFemalePKMNString: ; 0x5052d ; UNUSED
db "Choose a ♀<PK><MN>.@"
ChooseAMalePKMNString: ; 0x5053b ; UNUSED
db "Choose a ♂<PK><MN>.@"
ToWhichPKMNString: ; 0x50549
db "To which <PK><MN>?@"
YouHaveNoPKMNString: ; 0x50556
db "You have no <PK><MN>!@"
Function50566: ; 50566
ld a, [CurPartyMon]
ld hl, PartyMonNicknames
call GetNick
ld a, [PartyMenuActionText]
and $f
ld hl, Unknown_5057b
call Function505c1
ret
; 5057b
Unknown_5057b: ; 5057b
dw UnknownText_0x50594
dw UnknownText_0x5059e
dw UnknownText_0x505a3
dw UnknownText_0x505a8
dw UnknownText_0x50599
dw UnknownText_0x5058f
dw UnknownText_0x505ad
dw UnknownText_0x505b2
dw UnknownText_0x505b7
dw UnknownText_0x505bc
; 5058f
UnknownText_0x5058f: ; 0x5058f
; recovered @ HP!
text_jump UnknownText_0x1bc0a2
db "@"
; 0x50594
UnknownText_0x50594: ; 0x50594
; 's cured of poison.
text_jump UnknownText_0x1bc0bb
db "@"
; 0x50599
UnknownText_0x50599: ; 0x50599
; 's rid of paralysis.
text_jump UnknownText_0x1bc0d2
db "@"
; 0x5059e
UnknownText_0x5059e: ; 0x5059e
; 's burn was healed.
text_jump UnknownText_0x1bc0ea
db "@"
; 0x505a3
UnknownText_0x505a3: ; 0x505a3
; was defrosted.
text_jump UnknownText_0x1bc101
db "@"
; 0x505a8
UnknownText_0x505a8: ; 0x505a8
; woke up.
text_jump UnknownText_0x1bc115
db "@"
; 0x505ad
UnknownText_0x505ad: ; 0x505ad
; 's health returned.
text_jump UnknownText_0x1bc123
db "@"
; 0x505b2
UnknownText_0x505b2: ; 0x505b2
; is revitalized.
text_jump UnknownText_0x1bc13a
db "@"
; 0x505b7
UnknownText_0x505b7: ; 0x505b7
; grew to level @ !@ @
text_jump UnknownText_0x1bc14f
db "@"
; 0x505bc
UnknownText_0x505bc: ; 0x505bc
; came to its senses.
text_jump UnknownText_0x1bc16e
db "@"
; 0x505c1
Function505c1: ; 505c1
ld e, a
ld d, 0
rept 2
add hl, de
endr
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [Options]
push af
set 4, a
ld [Options], a
call PrintText
pop af
ld [Options], a
ret
; 505da