pokegold-spaceworld/engine/dumps/bank14.asm
2025-12-20 13:30:16 -05:00

2160 lines
32 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

INCLUDE "constants.asm"
SECTION "engine/dumps/bank14.asm@CopyMonToTempMon", ROMX
CopyMonToTempMon::
ld a, [wCurPartyMon]
ld e, a
call GetMonSpecies
ld a, [wCurPartySpecies]
ld [wCurSpecies], a
call GetBaseData
ld a, [wMonType]
ld hl, wPartyMons
ld bc, PARTYMON_STRUCT_LENGTH
and a
jr z, .getmonaddress
ld hl, wOTPartyMons
ld bc, PARTYMON_STRUCT_LENGTH
cp OTPARTYMON
jr z, .getmonaddress
ld hl, wBoxMons
ld bc, BOXMON_STRUCT_LENGTH
cp BOXMON
jr z, .getmonaddress
ld hl, wBufferMon
jr .copywholestruct
.getmonaddress
ld a, [wCurPartyMon]
call AddNTimes
.copywholestruct
ld de, wTempMon
ld bc, PARTYMON_STRUCT_LENGTH
call CopyBytes
ret
GetMonSpecies::
ld a, [wMonType]
and a ; PARTYMON
jr z, .partymon
cp OTPARTYMON
jr z, .otpartymon
cp BOXMON
jr z, .boxmon
cp TEMPMON
jr z, .buffermon
; WILDMON
.partymon
ld hl, wPartySpecies
jr .done
.otpartymon
ld hl, wOTPartySpecies
jr .done
.boxmon
ld hl, wBoxSpecies
jr .done
.buffermon
ld a, [wBufferMonSpecies]
jr .done2
.done
ld d, 0
add hl, de
ld a, [hl]
.done2
ld [wCurPartySpecies], a
ret
PrintMonTypes::
; Print one or both types of [wCurSpecies]
; on the stats screen at hl.
push hl
call GetBaseData
pop hl
push hl
ld a, [wMonHType1]
call .Print
ld a, [wMonHType1]
ld b, a
ld a, [wMonHType2]
cp b
pop hl
jr z, .hide_type_2
ld bc, SCREEN_WIDTH * 2
add hl, bc
.Print
push hl
jr PrintType
.hide_type_2
ld a, ' '
ld bc, SCREEN_WIDTH - 3
add hl, bc
ld [hl], a
inc bc
add hl, bc
ld bc, PLAYER_NAME_LENGTH - 1
jp ByteFill
PrintMoveType::
; Print the type of move b at hl.
push hl
ld a, b
dec a
ld bc, MOVE_LENGTH
ld hl, Moves
call AddNTimes
ld de, wStringBuffer1
ld a, BANK(Moves)
call FarCopyBytes
ld a, [wStringBuffer1 + MOVE_TYPE]
PrintType::
; Print type a to stack pointer.
add a
ld hl, TypeNames
ld e, a
ld d, 0
add hl, de
ld a, [hli]
ld e, a
ld d, [hl]
pop hl
jp PlaceString
GetTypeName::
; Copy the name of type [wMoveGrammar] to wStringBuffer1.
ld a, [wMoveGrammar]
ld hl, TypeNames
ld e, a
ld d, 0
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld de, wStringBuffer1
ld bc, TYPE_NAME_LENGTH
jp CopyBytes
SECTION "engine/dumps/bank14.asm@GetTrainerClassName_Old", ROMX
GetTrainerClassName_Old::
; Seemingly unreferenced.
; Loads a name to wStringBuffer1 from a partial list of Trainer classes leftover from Red/Green.
ld hl, .name_table
ld a, [wTrainerClass]
dec a
ld c, a
ld b, 0
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld de, wStringBuffer1
.copy_byte
ld a, [hli]
ld [de], a
inc de
cp '@'
jr nz, .copy_byte
ret
.name_table:
dw .youngster, .bug_catcher, .lass, wOTClassName
dw .jr_trainer_male, .jr_trainer_female, .pokemaniac, .super_nerd
dw wOTClassName, wOTClassName, .burglar, .engineer
dw .jack, wOTClassName, .swimmer, wOTClassName
dw wOTClassName, .beauty, wOTClassName, .rocker
dw .juggler, wOTClassName, wOTClassName, .blackbelt
dw wOTClassName, .prof_oak, .chief, .scientist
dw wOTClassName, .rocket, .cooltrainer_male, .cooltrainer_female
dw wOTClassName, wOTClassName, wOTClassName, wOTClassName
dw wOTClassName, wOTClassName, wOTClassName, wOTClassName
dw wOTClassName, wOTClassName, wOTClassName, wOTClassName
dw wOTClassName, wOTClassName, wOTClassName
.youngster
db "たんパン@"
.bug_catcher
db "むしとり@"
.lass
db "ミニスカ@"
.jr_trainer_male
db "ボーイ@"
.jr_trainer_female
db "ガール@"
.pokemaniac
db "マニア@"
.super_nerd
db "りかけい@"
.burglar
db "どろぼう@"
.engineer
db "オヤジ@"
.jack
; Removed trainer class from original game, whose name string didn't make it to Gen I but somehow ended up in Gen II.
db "ジャック@"
.swimmer
db "かいパン@"
.beauty
db "おねえさん@"
.rocker
db "グループ@"
.juggler
db "ジャグラー@"
.blackbelt
db "からて@"
.prof_oak
db "オーキド@"
.chief
db "チーフ@"
.scientist
db "けんきゅういん@"
.rocket
db "だんいん@"
.cooltrainer_male
db "エリート♂@"
.cooltrainer_female
db "エリート♀@"
DrawPlayerHP::
ld a, 1
jr DrawHP
DrawEnemyHP:
ld a, 2
DrawHP:
ld [wWhichHPBar], a
push hl
push bc
; box mons have full HP
ld a, [wMonType]
cp BOXMON
jr z, .at_least_1_hp
ld a, [wTempMonHP]
ld b, a
ld a, [wTempMonHP + 1]
ld c, a
; Any HP?
or b
jr nz, .at_least_1_hp
xor a
ld c, a
ld e, a
ld a, 6
ld d, a
jp .fainted
.at_least_1_hp
ld a, [wTempMonMaxHP]
ld d, a
ld a, [wTempMonMaxHP + 1]
ld e, a
ld a, [wMonType]
cp BOXMON
jr nz, .not_boxmon
ld b, d
ld c, e
.not_boxmon
predef ComputeHPBarPixels
ld a, 6
ld d, a
ld c, a
.fainted
ld a, c
pop bc
ld c, a
pop hl
push de
push hl
push hl
call DrawBattleHPBar
pop hl
; Print HP
bccoord 1, 1, 0
add hl, bc
ld de, wTempMonHP
ld a, [wMonType]
cp BOXMON
jr nz, .not_boxmon_2
ld de, wTempMonMaxHP
.not_boxmon_2
lb bc, 2, 3
call PrintNumber
ld a, '' ; $f3
ld [hli], a
; Print max HP
ld de, wTempMonMaxHP
lb bc, 2, 3
call PrintNumber
pop hl
pop de
ret
; TODO: Finish this baby up.
StatsScreenMain::
ld a, [wCurPartySpecies]
cp DEX_EGG
jr z, .got_stats
call CopyMonToTempMon
ld a, [wMonType]
cp BOXMON
jr c, .got_stats
ld a, [wTempMonLevel]
ld [wCurPartyLevel], a
ld hl, wTempMonExp + 2
ld de, wTempMonMaxHP
ld b, 1
predef CalcMonStats
.got_stats
ld hl, wd4a7
set 1, [hl]
call ClearBGPalettes
call ClearTileMap
call UpdateSprites
callfar LoadPokemonStatsGraphics
ldh a, [hMapAnims]
push af
xor a
ldh [hMapAnims], a
ld c, 1
ld b, 0
ld hl, Function50340
.asm_502fc
push bc
ld de, .asm_50302
push de
jp hl
.asm_50302
pop bc
.asm_50303
call GetJoypadDebounced
ldh a, [hJoySum]
and (D_LEFT | D_RIGHT | B_BUTTON | A_BUTTON)
jr z, .asm_50303
bit B_BUTTON_F, a
jr nz, .asm_50333
bit D_LEFT_F, a
jr nz, .asm_5031e
inc c
ld a, 3
cp c
jr nc, .asm_50323
ld c, 1
jr .asm_50323
.asm_5031e
dec c
jr nz, .asm_50323
ld c, 3
.asm_50323
ld hl, .data_5033a
dec c
ld b, 0
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
inc c
ld b, 1
jr .asm_502fc
.asm_50333
call ClearBGPalettes
pop af
ldh [hMapAnims], a
ret
.data_5033a
dw Function50340, Function504e5, Function50562
Function50340::
call WaitBGMap
xor a
ldh [hBGMapMode], a
ld a, [wMonHIndex]
ld [wMoveGrammar], a
ld [wCurSpecies], a
ld a, b
and a
jr nz, .asm_503b3
push bc
hlcoord 1, 0
ld [hl], $74
inc hl
ld [hl], $f2
inc hl
ld de, wMoveGrammar
ld bc, $8103
call PrintNumber
hlcoord 1, 8
call PrintLevel
ld hl, NicknamePointers
call GetNicknamePointer
ld d, h
ld e, l
hlcoord 1, 10
call PlaceString
push bc
call GetGender
ld a, '♂'
jr c, .asm_50384
ld a, '♀'
.asm_50384
pop hl
ld [hl], a
hlcoord 1, 12
ld a, ''
ld [hli], a
ld a, [wMonHIndex]
ld [wMoveGrammar], a
call GetPokemonName
call PlaceString
hlcoord 7, 0
ld bc, SCREEN_WIDTH
ld d, SCREEN_HEIGHT
.place_vertical_divider
ld a, $31
ld [hl], a
add hl, bc
dec d
jr nz, .place_vertical_divider
inc a
hlcoord 2, 16
ld [hli], a
inc a
ld [hli], a
inc a
ld [hli], a
inc a
ld [hl], a
pop bc
.asm_503b3
push bc
ld b, 1
call Function505d9
hlcoord 8, 0
ld bc, TextCommands
call ClearBox
hlcoord 10, 1
ld b, 0
call DrawPlayerHP
hlcoord 18, 1
ld [hl], $41
ld hl, wCurHPPal
call SetHPPal
ld b, SGB_STATS_SCREEN_HP_PALS
call GetSGBLayout
hlcoord 9, 4
ld de, StatusText_StatusType
call PlaceString
hlcoord 15, 4
ld a, [wMonType]
cp 2
jr z, .asm_503f5
push hl
ld de, wTempMonStatus
call PlaceStatusString
pop hl
.asm_503f5
ld de, StatusText_OK
call z, PlaceString
hlcoord 14, 6
call PrintMonTypes
hlcoord 8, 10
ld b, 6
ld c, 10
call DrawTextBox
hlcoord 10, 10
ld de, StatusText_ExpPoints
call PlaceString
ld a, [wTempMonLevel]
push af
cp 100
jr z, .asm_50420
inc a
ld [wTempMonLevel], a
.asm_50420
hlcoord 16, 14
call PrintLevel
pop af
ld [wTempMonLevel], a
ld de, wTempMonExp
hlcoord 12, 11
ld bc, $0307
call PrintNumber
call .CalcExpToNextLevel
ld de, wExpToNextLevel
hlcoord 10, 13
ld bc, $0307
call PrintNumber
hlcoord 9, 13
ld de, StatusText_Ato
call PlaceString
hlcoord 17, 13
ld de, StatusText_De
call PlaceString
ld a, [wTempMonLevel]
ld b, a
ld de, wTempMonExp + 2
hlcoord 10, 16
predef CalcAndPlaceExpBar
hlcoord 9, 16
ld [hl], $40
hlcoord 18, 16
ld [hl], $41
call WaitBGMap
ld a, 1
ldh [hBGMapMode], a
pop bc
ld a, b
and a
ret nz
call SetPalettes
ld hl, wTempMonDVs
call GetUnownLetter
hlcoord 0, 1
call PrepMonFrontpic
ld a, [wCurPartySpecies]
call PlayCry
ret
.CalcExpToNextLevel::
ld a, [wTempMonLevel]
cp MAX_LEVEL
jr z, .AlreadyAtMaxLevel
inc a
ld d, a
call CalcExpAtLevel
ld hl, wTempMonExp + 2
ld hl, wTempMonExp + 2 ; Seemingly an unnecessary duplicate line
ldh a, [hQuotient + 3]
sub [hl]
dec hl
ld [wExpToNextLevel + 2], a
ldh a, [hQuotient + 2]
sbc [hl]
dec hl
ld [wExpToNextLevel + 1], a
ldh a, [hQuotient + 1]
sbc [hl]
ld [wExpToNextLevel], a
ret
.AlreadyAtMaxLevel
ld hl, wExpToNextLevel
xor a
ld [hli], a
ld [hli], a
ld [hl], a
ret
NicknamePointers:
dw wPartyMonNicknames, wOTPartyMonNicknames, wBoxMonNicknames, wBufferMonNickname
StatusText_StatusType:
db "じょうたい/"
next "タイプ/@"
StatusText_OK:
db "ふつう@"
StatusText_ExpPoints:
db " けいけんち @"
StatusText_Ato:
; This string and the one below are used to present the
; remaining amount of EXP to level up in a grammatical manner.
; Equivalent to the English version's "LEVEL UP - <amount> to :L<level>".
db "あと@"
StatusText_De:
db "で@"
Function504e5::
call WaitBGMap
xor a
ldh [hBGMapMode], a
ld b, 2
call Function505d9
hlcoord 8, 0
ld bc, TextCommands
call ClearBox
hlcoord 8, 1
ld de, .Item
call PlaceString
ld a, [wTempMonItem]
and a
ld de, .NoItem
jr z, .asm_50511
ld [wNamedObjectIndexBuffer], a
call GetItemName
.asm_50511
hlcoord 11, 2
call PlaceString
ld hl, wTempMonMoves
ld de, wListMoves_MoveIndicesBuffer
ld bc, $0004
call CopyBytes
hlcoord 8, 4
ld b, 12
ld c, 10
call DrawTextBox
hlcoord 11, 4
ld de, .Moves
call PlaceString
hlcoord 9, 6
ld a, $3c
ld [wcdc3], a
call ListMoves
hlcoord 11, 7
ld a, $3c
ld [wcdc3], a
call ListMovePP
call WaitBGMap
ld a, 1
ldh [hBGMapMode], a
ret
.Item
db "そうび@"
.NoItem
db "なし@"
.Moves
db " もちわざ @"
Function50562::
call WaitBGMap
xor a
ldh [hBGMapMode], a
ld b, 3
call Function505d9
hlcoord 8, 0
ld bc, TextCommands
call ClearBox
hlcoord 9, 1
ld de, .IDNo_OT
call PlaceString
hlcoord 12, 1
ld de, wTempMonID
ld bc, $8205
call PrintNumber
ld hl, .OTPointers
call GetNicknamePointer
ld de, wStringBuffer1
push de
ld bc, MON_NAME_LENGTH
call CopyBytes
pop de
callfar CorrectNickErrors
hlcoord 12, 3
call PlaceString
ld d, 0
call PrintTempMonStats
hlcoord 10, 6
ld de, .Parameters
call PlaceString
call WaitBGMap
ld a, 1
ldh [hBGMapMode], a
ret
.IDNo_OT
db "<ID>№/"
next "おや/"
next "@"
.Parameters
db " パラメータ @"
.OTPointers
dw wPartyMonOTs
dw wOTPartyMonOT
dw wBoxMonOTs
dw wBufferMonOT
Function505d9::
hlcoord 1, 14
ld a, $36
call .load_square
hlcoord 3, 14
ld a, $36
call .load_square
hlcoord 5, 14
ld a, $36
call .load_square
ld a, b
cp 2
ld a, $3a
hlcoord 3, 14
jr c, .load_square
hlcoord 5, 14
jr z, .load_square
hlcoord 1, 14
.load_square
ld [hli], a
inc a
ld [hld], a
push bc
ld bc, SCREEN_WIDTH
add hl, bc
pop bc
inc a
ld [hli], a
inc a
ld [hl], a
ret
GetNicknamePointer::
ld a, [wMonType]
add a
ld c, a
ld b, 0
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wMonType]
cp 3
ret z
ld a, [wCurPartyMon]
jp SkipNames
; Prints a text box containing wTempMon's stats.
; If d = 0, print it closer to the middle. Else, print it on the side.
PrintTempMonStats::
ld a, d
and a
jr nz, .level_up_screen
hlcoord 8, 6
ld b, 10
ld c, 10
call DrawTextBox
hlcoord 9, 8
lb bc, 0, 6
jr .next
.level_up_screen
hlcoord 9, 0
ld b, 10
ld c, 9
call DrawTextBox
hlcoord 11, 2
lb bc, 0, 4
.next
push bc
push hl
ld de, .StatNames
call PlaceString
pop hl
pop bc
add hl, bc
ld de, wTempMonAttack
lb bc, 2, 3
call .PrintStat
ld de, wTempMonDefense
call .PrintStat
ld de, wTempMonSpclAtk
call .PrintStat
ld de, wTempMonSpclDef
call .PrintStat
ld de, wTempMonSpeed
jp PrintNumber
.PrintStat
push hl
call PrintNumber
pop hl
; Print next numbers two tiles lower
ld de, 2 * SCREEN_WIDTH
add hl, de
ret
.StatNames:
db "こうげき" ; "ATTACK"
next "ぼうぎょ" ; "DEFENSE"
next "とくこう" ; "SPCL.ATK"
next "とくぼう" ; "SPCL.DEF"
next "すばやさ" ; "SPEED"
next "@"
GetGender::
; 0: PartyMon
ld hl, wPartyMon1DVs
ld bc, PARTYMON_STRUCT_LENGTH
ld a, [wMonType]
and a
jr z, .PartyMon
; 1: OTPartyMon
ld hl, wOTPartyMon1DVs
dec a
jr z, .PartyMon
; 2: wBoxMon
ld hl, wBoxMon1DVs
ld bc, BOXMON_STRUCT_LENGTH
dec a
jr z, .wBoxMon
; else: WildMon
ld hl, wEnemyMonDVs
jr .DVs
.PartyMon
.wBoxMon
ld a, [wCurPartyMon]
call AddNTimes
.DVs
; Attack DV
ld a, [hli]
and $f0
ld b, a
; Speed DV
ld a, [hl]
and $f0
swap a
; Put our DVs together.
or b
ld b, a
; BUG: No handling for genderless Pokémon, despite already being defined in base stats.
; As a result, they're always considered as female here.
; Also, due to GENDER_FEMALE not truly being 100%, an always-female
; Pokémon can be male if it has max Attack and Speed DVs.
; Final game adds a check to guarantee that those Pokémon will be female.
ld a, [wMonHGenderRatio]
cp b
ret
ListMovePP::
ld a, [wNumMoves]
inc a
ld c, a
ld a, NUM_MOVES
sub c
ld b, a
push hl
ld a, [wcdc3]
ld e, a
ld d, 0
ld a, $3e ; P
call .load_loop
ld a, b
and a
jr z, .skip
ld c, a
ld a, 'ー'
call .load_loop
.skip
pop hl
inc hl
inc hl
inc hl
ld d, h
ld e, l
ld hl, wTempMonMoves
ld b, 0
.loop
ld a, [hli]
and a
jr z, .done
push bc
push hl
push de
ld hl, wMenuCursorY
ld a, [hl]
push af
ld [hl], b
push hl
callfar GetMaxPPOfMove
pop hl
pop af
ld [hl], a
pop de
pop hl
push hl
ld bc, $0014
add hl, bc
ld a, [hl]
and $3f
ld [wStringBuffer1 + 4], a
ld h, d
ld l, e
push hl
ld de, wStringBuffer1 + 4
lb bc, 1, 2
call PrintNumber
ld a, ''
ld [hli], a
ld de, wNamedObjectIndexBuffer
lb bc, 1, 2
call PrintNumber
pop hl
ld a, [wcdc3]
ld e, a
ld d, 0
add hl, de
ld d, h
ld e, l
pop hl
pop bc
inc b
ld a, b
cp NUM_MOVES
jr nz, .loop
.done
ret
.load_loop::
ld [hli], a
ld [hld], a
add hl, de
dec c
jr nz, .load_loop
ret
SECTION "engine/dumps/bank14.asm@Party Menu Routines", ROMX
ClearGraphicsForPartyMenu::
ldh a, [rLCDC]
bit rLCDC_ENABLE, a
jr z, .asm_5075f
call ClearBGPalettes
.asm_5075f
ld hl, wStateFlags
res SPRITE_UPDATES_DISABLED_F, [hl]
call ClearSprites
xor a
ldh [hBGMapMode], a
call ClearTileMap
call UpdateSprites
ret
OpenPartyMenu_ClearGraphics::
call ClearGraphicsForPartyMenu
; Fallthrough
OpenPartyMenu::
ldh a, [hMapAnims]
push af
xor a
ldh [hMapAnims], a
ld hl, wOptions
set NO_TEXT_SCROLL_F, [hl]
call .SetMenuAttributes
call InitPartyMenuLayout
call PartyMenuSelect
ld hl, wOptions
res NO_TEXT_SCROLL_F, [hl]
pop bc
ld a, b
ldh [hMapAnims], a
ret
.SetMenuAttributes:
call LoadFontsBattleExtra
xor a
ld [wMonType], a
ld de, Data_507c7
call SetMenuAttributes
ld a, [wPartyCount]
ld [w2DMenuNumRows], a
ld b, a
ld a, [wce38]
and a
ld a, $03
jr z, .asm_507b4
xor a
ld [wce38], a
ld a, $01
.asm_507b4
ld [wMenuJoypadFilter], a
ld a, [wPartyMenuCursor]
and a
jr z, .asm_507c1
inc b
cp b
jr c, .asm_507c3
.asm_507c1
ld a, $01
.asm_507c3
ld [wMenuCursorY], a
ret
Data_507c7:
db $01, $00, $00, $01, $60, $00, $20, $00
PartyMenuSelect::
call StaticMenuJoypad
call PlaceHollowCursor
ld a, [wMenuCursorY]
ld [wPartyMenuCursor], a
ldh a, [hJoySum]
ld b, a
ld a, [wSelectedSwapPosition]
and a
jp nz, .asm_50808
ld a, [wPartyCount]
and a
jr z, .asm_50806
bit 1, b
jr nz, .asm_50806
ld a, [wMenuCursorY]
dec a
ld [wCurPartyMon], a
ld c, a
ld b, $00
ld hl, wPartySpecies
add hl, bc
ld a, [hl]
ld [wCurPartySpecies], a
ld [wTempBattleMonSpecies], a
and a
ret
.asm_50806
scf
ret
.asm_50808
bit 1, b
jr nz, .asm_5080f
call _SwitchPartyMons
.asm_5080f
call PartyMenu_ClearCursor
xor a
ld [wSelectedSwapPosition], a
ld [wPartyMenuActionText], a
call InitPartyMenuLayout
jp PartyMenuSelect
InitPartyMenuLayout::
ld a, [wPartyMenuActionText]
cp PARTYMENUACTION_MOVE
jp z, PrintPartyMenuText
callfar LoadOverworldMonIcon
call PartyMenu_ClearCursor
callfar InitPartyMenuPalettes
hlcoord 3, 1
ld de, wPartySpecies
ld a, [wCurPartyMon]
push af
xor a
ld [wCurPartyMon], a
ld [wcce1], a
.loop
ld a, [de]
cp -1
jp z, .done
push de
call PlacePartyMember
pop de
ld a, [wCurPartyMon]
ldh [hObjectStructIndex], a
push hl
push de
ld hl, LoadMenuMonIcon
ld a, BANK(LoadMenuMonIcon)
ld e, MONICON_PARTYMENU
call FarCall_hl
pop de
inc de
pop hl
ld bc, 2 * SCREEN_WIDTH
add hl, bc
ld a, [wCurPartyMon]
inc a
ld [wCurPartyMon], a
jr .loop
.done
pop af
ld [wCurPartyMon], a
jp PrintPartyText_GetSGBLayout
WritePartyMenuTilemapAndText::
ld a, [wPartyMenuActionText]
cp PARTYMENUACTION_MOVE
jp z, PrintPartyMenuText
callfar InitPartyMenuPalettes
hlcoord 3, 1
ld de, wPartySpecies
ld a, [wCurPartyMon]
push af
xor a
ld [wCurPartyMon], a
ld [wcce1], a
.loop
ld a, [de]
cp -1
jp z, .done
push de
call PlacePartyMember
pop de
ld a, [wCurPartyMon]
ldh [hEventID], a
inc de
ld bc, 2 * SCREEN_WIDTH
add hl, bc
ld a, [wCurPartyMon] ; redundant
inc a
ld [wCurPartyMon], a
jr .loop
.done
pop af
ld [wCurPartyMon], a
jp PrintPartyText_GetSGBLayout
; Places the tilemap of the party member at wCurPartyMon.
PlacePartyMember::
push bc
push hl
push hl
ld hl, wPartyMonNicknames
ld a, [wCurPartyMon]
call GetNick
pop hl
call PlaceString
call CopyMonToTempMon
pop hl
push hl
ld a, [wSelectedSwapPosition]
and a
jr z, .not_switching
dec a
ld b, a
ld a, [wCurPartyMon]
cp b
jr nz, .not_switching
dec hl
dec hl
dec hl
ld a, '▷'
ld [hli], a
inc hl
inc hl
.not_switching
ld a, [wPartyMenuActionText]
cp PARTYMENUACTION_TEACH_TMHM
jr z, .PlacePartyMonTMHMCompatibility
cp PARTYMENUACTION_EVO_STONE
jr z, .PlacePartyMonEvoStoneCompatibility
cp PARTYMENUACTION_GIVE_MON
jp z, .PlacePartyMonGender
cp PARTYMENUACTION_GIVE_MON_FEMALE
jp z, .PlacePartyMonGender
push hl
ld bc, -15
add hl, bc
ld de, wTempMonStatus
call PlaceStatusString
pop hl
push hl
ld bc, -12
add hl, bc
ld b, 0
call DrawEnemyHP
push de
call SetPartyHPBarPalette
pop de
pop hl
jr .PrintLevel
.PlacePartyMonTMHMCompatibility
push hl
predef CanLearnTMHMMove
pop hl
ld de, .string_able
ld a, c
and a
jr nz, .able
ld de, .string_not_able
.able
push hl
ld bc, 9
add hl, bc
call PlaceString
pop hl
.PrintLevel
ld bc, 5
add hl, bc
push de
call PrintLevel
pop de
pop hl
pop bc
ret
.string_able:
db "おぼえられる@" ; "ABLE"
.string_not_able:
db "おぼえられない@" ; "NOT ABLE"
.PlacePartyMonEvoStoneCompatibility:
push hl
ld hl, EvosAttacksPointers
ld a, [wTempMonSpecies]
dec a
ld c, a
ld b, 0
add hl, bc
add hl, bc
; BUG: Only the first three evolution entries can have Stone compatibility reported correctly.
; While this never comes up in the final game, this prototype has Espeon and Umbreon evolving from
; Heart Stones and Poison Stones respectively, making it five evolution stone entries for Eevee.
ld de, wStringBuffer1
ld a, BANK(EvosAttacksPointers)
ld bc, 2
call FarCopyBytes
ld hl, wStringBuffer1
ld a, [hli]
ld h, [hl]
ld l, a
ld de, wStringBuffer1
ld a, BANK(EvosAttacks)
ld bc, 10
call FarCopyBytes
ld hl, wStringBuffer1
ld de, .string_cant_use
.loop
ld a, [hli]
and a
jr z, .nope
inc hl
inc hl
cp EVOLVE_STONE
jr nz, .loop
dec hl
dec hl
ld b, [hl]
ld a, [wCurItem]
inc hl
inc hl
cp b
jr nz, .loop
ld de, .string_can_use
.nope
pop hl
push hl
ld bc, 9
add hl, bc
call PlaceString
pop hl
jr .PrintLevel
.string_can_use
db "つかえる@" ; "ABLE"
.string_cant_use
db "つかえない@" ; "NOT ABLE"
.PlacePartyMonGender
xor a
ld [wMonType], a
push hl
call GetGender
pop hl
ld de, .male
jr c, .got_gender
ld de, .female
.got_gender
push hl
ld bc, 9
add hl, bc
call PlaceString
pop hl
jp .PrintLevel
.male
db "オス@"
.female
db "メス@"
PrintPartyText_GetSGBLayout::
ld b, SGB_PARTY_MENU
call GetSGBLayout
PrintPartyMenuText::
ld hl, wOptions
ld a, [hl]
push af
push hl
set NO_TEXT_SCROLL_F, [hl]
ld a, [wPartyMenuActionText]
cp PARTYMENUTEXT_HEAL_PSN
jr nc, .heal
add a
ld c, a
ld b, 0
ld hl, .PartyMenuStrings
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
call PrintText
jr .done
.heal
and $f
add a
ld c, a
ld b, 0
ld hl, .MenuActionStrings
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
push hl
ld a, [wCurPartyMon]
ld hl, wPartyMonNicknames
call GetNick
pop hl
call PrintText
.done
pop hl
pop af
ld [hl], a
call WaitBGMap
call SetPalettes
ret
.MenuActionStrings
dw CuredOfPoisonText
dw BurnWasHealedText
dw _WasDefrostedText
dw _WokeUpText
dw RidOfParalysisText
dw RecoveredSomeHPText
dw HealthReturnedText
dw RevitalizedText
dw _GrewToLevelText
.PartyMenuStrings
dw ChooseAMonString
dw UseOnWhichPKMNString
dw WhichPKMNString
dw TeachWhichPKMNString
dw MoveToWhereString
dw UseOnWhichPKMNString
dw ChooseFirstMonString
dw ChooseSecondMonString
ChooseAMonString:
text "#を えらんで ください"
done
UseOnWhichPKMNString:
text "どの#に つかいますか?"
done
WhichPKMNString:
text "どの#を だしますか?"
done
TeachWhichPKMNString:
text "どの#に おしえますか?"
done
MoveToWhereString:
text "どこに いどうしますか?"
done
ChooseFirstMonString:
text "1ぴきめの #を"
line "えらんで ください"
done
ChooseSecondMonString:
text "2ひきめの #を"
line "えらんで ください"
done
RecoveredSomeHPText:
text_from_ram wStringBuffer1
text "の たいりょくが"
line "@"
deciram wHPBarHPDifference, 2, 3
text " かいふくした"
done
CuredOfPoisonText:
text_from_ram wStringBuffer1
text "の どくは"
line "きれい さっぱり なくなった!"
done
RidOfParalysisText:
text_from_ram wStringBuffer1
text "の からだの"
line "しびれが とれた"
done
BurnWasHealedText:
text_from_ram wStringBuffer1
text "の"
line "やけどが なおった"
done
_WasDefrostedText:
text_from_ram wStringBuffer1
text "の からだの"
line "こおりが とけた"
done
_WokeUpText:
text_from_ram wStringBuffer1
text "は"
line "めを さました"
done
HealthReturnedText:
text_from_ram wStringBuffer1
text "は"
line "けんこうになった!"
done
RevitalizedText:
text_from_ram wStringBuffer1
text "は"
line "げんきを とりもどした!"
done
_GrewToLevelText:
text_from_ram wStringBuffer1
text "の レベルが@"
deciram wCurPartyLevel, 1, 3
text "になった@"
sound_dex_fanfare_50_79
text_waitbutton
text_end
SetPartyHPBarPalette::
ld hl, wHPPals
ld a, [wcce1]
ld c, a
ld b, 0
add hl, bc
call SetHPPal
ld b, SGB_PARTY_MENU_HP_PALS
call GetSGBLayout
ld hl, wcce1
inc [hl]
ret
PlaceStatusString::
push de
inc de
inc de
ld a, [de]
ld b, a
inc de
ld a, [de]
or b
pop de
jr nz, PlaceNonFaintStatus
; "FNT" equivalent string
ld a, 'ひ'
ld [hli], a
ld a, 'ん'
ld [hli], a
ld [hl], 'し'
and a
ret
PlaceNonFaintStatus::
ld a, [de]
bit PSN, a
jr nz, .PsnString
bit BRN, a
jr nz, .BrnString
bit FRZ, a
jr nz, .FrzString
bit PAR, a
jr nz, .ParString
and SLP
ret z
; "SLP" equivalent string
ld a, 'ね'
ld [hli], a
ld a, 'む'
ld [hli], a
ld [hl], 'り'
ret
.PsnString
ld a, '<DO>'
ld [hli], a
ld [hl], 'く'
ret
.BrnString
ld a, 'や'
ld [hli], a
ld a, 'け'
ld [hli], a
ld [hl], '<DO>'
ret
.FrzString
ld a, 'こ'
ld [hli], a
ld a, 'お'
ld [hli], a
ld [hl], 'り'
ret
.ParString
ld a, 'ま'
ld [hli], a
ld [hl], 'ひ'
ret
GetMonBackpic::
ld a, $00
call OpenSRAM
push hl
ld hl, sSpriteBuffer1
ld de, sSpriteBuffer0
ld bc, SPRITEBUFFERSIZE
call CopyBytes
ld hl, sSpriteBuffer2
ld de, sSpriteBuffer1
ld bc, SPRITEBUFFERSIZE
call CopyBytes
call _InterlaceMergeSpriteBuffers
pop hl
ld de, sSpriteBuffer1
ld c, 6 * 6
ldh a, [hROMBank]
ld b, a
call Get2bpp
call CloseSRAM
ret
ListMoves::
ld de, wListMoves_MoveIndicesBuffer
ld b, $00
.asm_50c03
ld a, [de]
inc de
and a
jr z, .asm_50c36
push de
push hl
push hl
ld [wCurSpecies], a
ld a, MOVE_NAME
ld [wNamedObjectTypeBuffer], a
call GetName
ld de, wStringBuffer1
pop hl
push bc
call PlaceString
pop bc
ld a, b
ld [wNumMoves], a
inc b
pop hl
push bc
ld a, [wHPBarMaxHP]
ld c, a
ld b, $00
add hl, bc
pop bc
pop de
ld a, b
cp $04
jr z, .asm_50c47
jr .asm_50c03
.asm_50c36
ld a, b
.asm_50c37
push af
ld [hl], $e3
ld a, [wHPBarMaxHP]
ld c, a
ld b, $00
add hl, bc
pop af
inc a
cp $04
jr nz, .asm_50c37
.asm_50c47
ret
Function50c48::
ld a, [wce34]
cp $01
jr nz, .asm_50c59
ld hl, wOTPartyCount
ld de, wOTPartyMonOT
ld a, ENEMY_OT_NAME
jr .asm_50c8b
.asm_50c59
cp $04
jr nz, .asm_50c67
ld hl, wPartyCount
ld de, wPartyMonOTs
ld a, PARTY_OT_NAME
jr .asm_50c8b
.asm_50c67
cp $05
jr nz, .asm_50c75
ld hl, wcd60
ld de, PokemonNames
ld a, MON_NAME
jr .asm_50c8b
.asm_50c75
cp $02
jr nz, .asm_50c83
ld hl, wItems
ld de, ItemNames
ld a, ITEM_NAME
jr .asm_50c8b
.asm_50c83
ld hl, wcd60
ld de, ItemNames
ld a, ITEM_NAME
.asm_50c8b
ld [wNamedObjectTypeBuffer], a
ld a, l
ld [wListPointer], a
ld a, h
ld [wListPointer + 1], a
ld a, e
ld [wNamesPointer], a
ld a, d
ld [wNamesPointer + 1], a
ld bc, ItemAttributes
ld a, c
ld [wItemAttributesPointer], a
ld a, b
ld [wItemAttributesPointer + 1], a
ret
CalcLevel::
ld a, [wTempMonSpecies]
ld [wCurSpecies], a
call GetBaseData
ld d, 1
.next_level
inc d
call CalcExpAtLevel
push hl
ld hl, wTempMonExp + 2
ldh a, [hQuotient + 3]
ld c, a
ld a, [hld]
sub c
ldh a, [hQuotient + 2]
ld c, a
ld a, [hld]
sbc c
ldh a, [hQuotient + 1]
ld c, a
ld a, [hl]
sbc c
pop hl
jr nc, .next_level
.got_level
dec d
ret
CalcExpAtLevel::
ld a, [wMonHGrowthRate]
add a
add a
ld c, a
ld b, 0
ld hl, GrowthRates
add hl, bc
; Cube the level
call .LevelSquared
ld a, d
ldh [hMultiplier], a
call Multiply
; Multiply by a
ld a, [hl]
and $f0
swap a
ldh [hMultiplier], a
call Multiply
; Divide by b
ld a, [hli]
and $f
ldh [hDivisor], a
ld b, 4
call Divide
; Push the cubic term to the stack
ldh a, [hQuotient + 1]
push af
ldh a, [hQuotient + 2]
push af
ldh a, [hQuotient + 3]
push af
; Square the level and multiply by the lower 7 bits of c
call .LevelSquared
ld a, [hl]
and $7f
ldh [hPrintNumDivisor], a
call Multiply
; Push the absolute value of hte quadratic term to the stack
ldh a, [hProduct + 1]
push af
ldh a, [hProduct + 2]
push af
ldh a, [hProduct + 3]
push af
ld a, [hli]
push af
; Multiply the level by d
xor a
ldh [hMultiplicand + 0], a
ldh [hMultiplicand + 1], a
ld a, d
ldh [hMultiplicand + 2], a
ld a, [hli]
ldh [hMultiplier], a
call Multiply
; Subtract e
ld b, [hl]
ldh a, [hProduct + 3]
sub b
ldh [hMultiplicand + 2], a
ld b, 0
ldh a, [hProduct + 2]
sbc b
ldh [hMultiplicand + 1], a
ldh a, [hProduct + 1]
sbc b
ldh [hMultiplicand], a
; If bit 7 of c is set, c is negative; otherwise, it's positive
pop af
and $80
jr nz, .subtract
; Add c*n**2 to (d*n - e)
pop bc
ldh a, [hProduct + 3]
add b
ldh [hMultiplicand + 2], a
pop bc
ldh a, [hProduct + 2]
adc b
ldh [hMultiplicand + 1], a
pop bc
ldh a, [hProduct + 1]
adc b
ldh [hMultiplicand], a
jr .done_quadratic
.subtract
; Subtract c*n**2 from (d*n - e)
pop bc
ldh a, [hProduct + 3]
sub b
ldh [hMultiplicand + 2], a
pop bc
ldh a, [hProduct + 2]
sbc b
ldh [hMultiplicand + 1], a
pop bc
ldh a, [hProduct + 1]
sbc b
ldh [hMultiplicand], a
.done_quadratic
; Add (a/b)*n**3 to (d*n - e +/- c*n**2)
pop bc
ldh a, [hProduct + 3]
add b
ldh [hMultiplicand + 2], a
pop bc
ldh a, [hProduct + 2]
adc b
ldh [hMultiplicand + 1], a
pop bc
ldh a, [hProduct + 1]
adc b
ldh [hMultiplicand], a
ret
.LevelSquared::
xor a
ldh [hMultiplicand + 0], a
ldh [hMultiplicand + 1], a
ld a, d
ldh [hMultiplicand + 2], a
ldh [hMultiplier], a
jp Multiply
MACRO growth_rate
; [1]/[2]*n**3 + [3]*n**2 + [4]*n - [5]
dn \1, \2
if \3 < 0
db -\3 | $80 ; signed magnitude
else
db \3
endc
db \4, \5
ENDM
GrowthRates:
; entries correspond to GROWTH_* (see constants/pokemon_data_constants.asm)
growth_rate 1, 1, 0, 0, 0 ; Medium Fast
growth_rate 3, 4, 10, 0, 30 ; Slightly Fast
growth_rate 3, 4, 20, 0, 70 ; Slightly Slow
growth_rate 6, 5, -15, 100, 140 ; Medium Slow
growth_rate 4, 5, 0, 0, 0 ; Fast
growth_rate 5, 4, 0, 0, 0 ; Slow
_SwitchPartyMons::
; replace instances of wHPBarOldHP with wcdc5, perhaps?
ld a, [wSelectedSwapPosition]
dec a
ld [wHPBarOldHP], a
ld b, a
ld a, [wMenuCursorY]
dec a
ld [wcdc4], a
cp b
jr z, .skip
call .SwapMonAndMail
ld a, [wcdc5]
call .ClearSprite
ld a, [wcdc4]
call .ClearSprite
.skip
ret
.ClearSprite:
push af
hlcoord 0, 0
ld bc, 2 * SCREEN_WIDTH
call AddNTimes
ld bc, 2 * SCREEN_WIDTH
ld a, ' '
call ByteFill
pop af
ld hl, wShadowOAMSprite00
ld bc, 4 * SPRITEOAMSTRUCT_LENGTH
call AddNTimes
ld de, SPRITEOAMSTRUCT_LENGTH
ld c, 4
.gfx_loop
ld [hl], OAM_YCOORD_HIDDEN
add hl, de
dec c
jr nz, .gfx_loop
ld de, SFX_SWITCH_POKEMON
call WaitPlaySFX
ret
.SwapMonAndMail::
push hl
push de
push bc
ld bc, wPartySpecies
ld a, [wcdc4]
ld l, a
ld h, 0
add hl, bc
ld d, h
ld e, l
ld a, [wcdc5]
ld l, a
ld h, 0
add hl, bc
ld a, [hl]
push af
ld a, [de]
ld [hl], a
pop af
ld [de], a
ld a, [wcdc4]
ld hl, wPartyMon1Species
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
push hl
ld de, wcc3a
ld bc, PARTYMON_STRUCT_LENGTH
call CopyBytes
ld a, [wcdc5]
ld hl, wPartyMon1
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
pop de
push hl
ld bc, PARTYMON_STRUCT_LENGTH
call CopyBytes
pop de
ld hl, wcc3a
ld bc, PARTYMON_STRUCT_LENGTH
call CopyBytes
ld a, [wcdc4]
ld hl, wPartyMonOTs
call SkipNames
push hl
call .CopyNameToSwitchMonBuffer
ld a, [wcdc5]
ld hl, wPartyMonOTs
call SkipNames
pop de
push hl
call .CopyName
pop de
ld hl, wcc3a
call .CopyName
ld hl, wPartyMonNicknames
ld a, [wcdc4]
call SkipNames
push hl
call .CopyNameToSwitchMonBuffer
ld hl, wPartyMonNicknames
ld a, [wcdc5]
call SkipNames
pop de
push hl
call .CopyName
pop de
ld hl, wcc3a
call .CopyName
ld hl, $ba68 ; Buffer somewhere in SRAM. Needs investigation
ld a, [wcdc4]
ld bc, $0028 ; todo: Constantify this
call AddNTimes
push hl
ld de, wcc3a
ld bc, $0028
ld a, $02
call OpenSRAM
call CopyBytes
ld hl, $ba68
ld a, [wcdc5]
ld bc, $0028
call AddNTimes
pop de
push hl
ld bc, $0028
call CopyBytes
pop de
ld hl, wcc3a
ld bc, $0028
call CopyBytes
call CloseSRAM
pop bc
pop de
pop hl
ret
.CopyNameToSwitchMonBuffer
ld de, wcc3a
.CopyName
ld bc, PLAYER_NAME_LENGTH
call CopyBytes
ret
PartyMenu_ClearCursor::
hlcoord 0, 1
ld bc, 2 * SCREEN_WIDTH
ld a, PARTY_LENGTH
.next
ld [hl], ' '
add hl, bc
dec a
jr nz, .next
ret
GetUnownLetter::
; Return Unown letter in wUnownLetter based on DVs at hl
; Take the middle 2 bits of each DV and place them in order:
; atk def spd spc
; .ww..xx. .yy..zz.
; atk
ld a, [hl]
and %01100000
sla a
ld b, a
; def
ld a, [hli]
and %00000110
swap a
srl a
or b
ld b, a
; spd
ld a, [hl]
and %01100000
swap a
sla a
or b
ld b, a
; spc
ld a, [hl]
and %00000110
srl a
or b
; Divide by 10 to get 0-25
ldh [hDividend + 3], a
xor a
ldh [hDividend], a
ldh [hDividend + 1], a
ldh [hDividend + 2], a
ld a, $0a
ldh [hDivisor], a
ld b, 4
call Divide
; Increment to get 1-26
ldh a, [hQuotient + 3]
inc a
ld [wAnnonID], a
ret