mirror of https://github.com/pret/pokecrystal.git
486 lines
6.2 KiB
NASM
486 lines
6.2 KiB
NASM
DrawPlayerHP: ; 50b0a
|
|
ld a, $1
|
|
jr DrawHP
|
|
|
|
DrawEnemyHP: ; 50b0e
|
|
ld a, $2
|
|
|
|
DrawHP: ; 50b10
|
|
ld [wWhichHPBar], a
|
|
push hl
|
|
push bc
|
|
; box mons have full HP
|
|
ld a, [MonType]
|
|
cp BOXMON
|
|
jr z, .at_least_1_hp
|
|
|
|
ld a, [TempMonHP]
|
|
ld b, a
|
|
ld a, [TempMonHP + 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, [TempMonMaxHP]
|
|
ld d, a
|
|
ld a, [TempMonMaxHP + 1]
|
|
ld e, a
|
|
ld a, [MonType]
|
|
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, TempMonHP
|
|
ld a, [MonType]
|
|
cp BOXMON
|
|
jr nz, .not_boxmon_2
|
|
ld de, TempMonMaxHP
|
|
.not_boxmon_2
|
|
lb bc, 2, 3
|
|
call PrintNum
|
|
|
|
ld a, "/"
|
|
ld [hli], a
|
|
|
|
; Print max HP
|
|
ld de, TempMonMaxHP
|
|
lb bc, 2, 3
|
|
call PrintNum
|
|
pop hl
|
|
pop de
|
|
ret
|
|
|
|
PrintTempMonStats: ; 50b7b
|
|
; Print TempMon's stats at hl, with spacing bc.
|
|
push bc
|
|
push hl
|
|
ld de, .StatNames
|
|
call PlaceString
|
|
pop hl
|
|
pop bc
|
|
add hl, bc
|
|
ld bc, SCREEN_WIDTH
|
|
add hl, bc
|
|
ld de, TempMonAttack
|
|
lb bc, 2, 3
|
|
call .PrintStat
|
|
ld de, TempMonDefense
|
|
call .PrintStat
|
|
ld de, TempMonSpclAtk
|
|
call .PrintStat
|
|
ld de, TempMonSpclDef
|
|
call .PrintStat
|
|
ld de, TempMonSpeed
|
|
jp PrintNum
|
|
|
|
.PrintStat: ; 50bab
|
|
push hl
|
|
call PrintNum
|
|
pop hl
|
|
ld de, SCREEN_WIDTH * 2
|
|
add hl, de
|
|
ret
|
|
|
|
.StatNames: ; 50bb5
|
|
db "ATTACK"
|
|
next "DEFENSE"
|
|
next "SPCL.ATK"
|
|
next "SPCL.DEF"
|
|
next "SPEED"
|
|
next "@"
|
|
|
|
GetGender: ; 50bdd
|
|
; Return the gender of a given monster (CurPartyMon/CurOTMon/CurWildMon).
|
|
; When calling this function, a should be set to an appropriate MonType value.
|
|
|
|
; return values:
|
|
; a = 1: f = nc|nz; male
|
|
; a = 0: f = nc|z; female
|
|
; f = c: genderless
|
|
|
|
; This is determined by comparing the Attack and Speed DVs
|
|
; with the species' gender ratio.
|
|
|
|
; Figure out what type of monster struct we're looking at.
|
|
|
|
; 0: PartyMon
|
|
ld hl, PartyMon1DVs
|
|
ld bc, PARTYMON_STRUCT_LENGTH
|
|
ld a, [MonType]
|
|
and a
|
|
jr z, .PartyMon
|
|
|
|
; 1: OTPartyMon
|
|
ld hl, OTPartyMon1DVs
|
|
dec a
|
|
jr z, .PartyMon
|
|
|
|
; 2: sBoxMon
|
|
ld hl, sBoxMon1DVs
|
|
ld bc, BOXMON_STRUCT_LENGTH
|
|
dec a
|
|
jr z, .sBoxMon
|
|
|
|
; 3: Unknown
|
|
ld hl, TempMonDVs
|
|
dec a
|
|
jr z, .DVs
|
|
|
|
; else: WildMon
|
|
ld hl, EnemyMonDVs
|
|
jr .DVs
|
|
|
|
; Get our place in the party/box.
|
|
|
|
.PartyMon:
|
|
.sBoxMon
|
|
ld a, [CurPartyMon]
|
|
call AddNTimes
|
|
|
|
.DVs:
|
|
|
|
; sBoxMon data is read directly from SRAM.
|
|
ld a, [MonType]
|
|
cp BOXMON
|
|
ld a, BANK(sBox)
|
|
call z, GetSRAMBank
|
|
|
|
; 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
|
|
|
|
; Close SRAM if we were dealing with a sBoxMon.
|
|
ld a, [MonType]
|
|
cp BOXMON
|
|
call z, CloseSRAM
|
|
|
|
; We need the gender ratio to do anything with this.
|
|
push bc
|
|
ld a, [CurPartySpecies]
|
|
dec a
|
|
ld hl, BaseData + BASE_GENDER
|
|
ld bc, BASE_DATA_SIZE
|
|
call AddNTimes
|
|
pop bc
|
|
|
|
ld a, BANK(BaseData)
|
|
call GetFarByte
|
|
|
|
; The higher the ratio, the more likely the monster is to be female.
|
|
|
|
cp GENDERLESS
|
|
jr z, .Genderless
|
|
|
|
and a ; GENDER_F0?
|
|
jr z, .Male
|
|
|
|
cp GENDER_F100
|
|
jr z, .Female
|
|
|
|
; Values below the ratio are male, and vice versa.
|
|
cp b
|
|
jr c, .Male
|
|
|
|
.Female:
|
|
xor a
|
|
ret
|
|
|
|
.Male:
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
|
|
.Genderless:
|
|
scf
|
|
ret
|
|
|
|
ListMovePP: ; 50c50
|
|
ld a, [wNumMoves]
|
|
inc a
|
|
ld c, a
|
|
ld a, NUM_MOVES
|
|
sub c
|
|
ld b, a
|
|
push hl
|
|
ld a, [Buffer1]
|
|
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, TempMonMoves
|
|
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, TempMonPP - (TempMonMoves + 1)
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and $3f
|
|
ld [StringBuffer1 + 4], a
|
|
ld h, d
|
|
ld l, e
|
|
push hl
|
|
ld de, StringBuffer1 + 4
|
|
lb bc, 1, 2
|
|
call PrintNum
|
|
ld a, "/"
|
|
ld [hli], a
|
|
ld de, wd265
|
|
lb bc, 1, 2
|
|
call PrintNum
|
|
pop hl
|
|
ld a, [Buffer1]
|
|
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 ; 50cc9
|
|
ld [hli], a
|
|
ld [hld], a
|
|
add hl, de
|
|
dec c
|
|
jr nz, .load_loop
|
|
ret
|
|
|
|
Unreferenced_Function50cd0: ; 50cd0
|
|
.loop
|
|
ld [hl], $32
|
|
inc hl
|
|
ld [hl], $3e
|
|
dec hl
|
|
add hl, de
|
|
dec c
|
|
jr nz, .loop
|
|
ret
|
|
|
|
Unused_PlaceEnemyHPLevel:
|
|
push hl
|
|
push hl
|
|
ld hl, PartyMonNicknames
|
|
ld a, [CurPartyMon]
|
|
call GetNick
|
|
pop hl
|
|
call PlaceString
|
|
call CopyPkmnToTempMon
|
|
pop hl
|
|
ld a, [CurPartySpecies]
|
|
cp EGG
|
|
jr z, .egg
|
|
push hl
|
|
ld bc, -12
|
|
add hl, bc
|
|
ld b, $0
|
|
call DrawEnemyHP
|
|
pop hl
|
|
ld bc, 5
|
|
add hl, bc
|
|
push de
|
|
call PrintLevel
|
|
pop de
|
|
|
|
.egg
|
|
ret
|
|
|
|
PlaceStatusString: ; 50d0a
|
|
push de
|
|
inc de
|
|
inc de
|
|
ld a, [de]
|
|
ld b, a
|
|
inc de
|
|
ld a, [de]
|
|
or b
|
|
pop de
|
|
jr nz, PlaceNonFaintStatus
|
|
push de
|
|
ld de, FntString
|
|
call CopyStatusString
|
|
pop de
|
|
ld a, $1
|
|
and a
|
|
ret
|
|
|
|
FntString: ; 50d22
|
|
db "FNT@"
|
|
|
|
CopyStatusString: ; 50d25
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
ld a, [de]
|
|
ld [hl], a
|
|
ret
|
|
|
|
PlaceNonFaintStatus: ; 50d2e
|
|
push de
|
|
ld a, [de]
|
|
ld de, PsnString
|
|
bit PSN, a
|
|
jr nz, .place
|
|
ld de, BrnString
|
|
bit BRN, a
|
|
jr nz, .place
|
|
ld de, FrzString
|
|
bit FRZ, a
|
|
jr nz, .place
|
|
ld de, ParString
|
|
bit PAR, a
|
|
jr nz, .place
|
|
ld de, SlpString
|
|
and SLP
|
|
jr z, .no_status
|
|
|
|
.place
|
|
call CopyStatusString
|
|
ld a, $1
|
|
and a
|
|
|
|
.no_status
|
|
pop de
|
|
ret
|
|
|
|
SlpString: db "SLP@"
|
|
PsnString: db "PSN@"
|
|
BrnString: db "BRN@"
|
|
FrzString: db "FRZ@"
|
|
ParString: db "PAR@"
|
|
|
|
ListMoves: ; 50d6f
|
|
; List moves at hl, spaced every [Buffer1] tiles.
|
|
ld de, wListMoves_MoveIndicesBuffer
|
|
ld b, $0
|
|
.moves_loop
|
|
ld a, [de]
|
|
inc de
|
|
and a
|
|
jr z, .no_more_moves
|
|
push de
|
|
push hl
|
|
push hl
|
|
ld [CurSpecies], a
|
|
ld a, MOVE_NAME
|
|
ld [wNamedObjectTypeBuffer], a
|
|
call GetName
|
|
ld de, StringBuffer1
|
|
pop hl
|
|
push bc
|
|
call PlaceString
|
|
pop bc
|
|
ld a, b
|
|
ld [wNumMoves], a
|
|
inc b
|
|
pop hl
|
|
push bc
|
|
ld a, [Buffer1]
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
pop bc
|
|
pop de
|
|
ld a, b
|
|
cp NUM_MOVES
|
|
jr z, .done
|
|
jr .moves_loop
|
|
|
|
.no_more_moves
|
|
ld a, b
|
|
.nonmove_loop
|
|
push af
|
|
ld [hl], "-"
|
|
ld a, [Buffer1]
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
pop af
|
|
inc a
|
|
cp NUM_MOVES
|
|
jr nz, .nonmove_loop
|
|
|
|
.done
|
|
ret
|