pokecrystal-board/engine/mon_stats.asm
mid-kid e8bc86d1fe Pkmn -> Mon
Since we're aiming for consistency across the codebase, I believe it
includes a uniform way to refer to the creatures this game consists of
in the labels of the code.
The only exceptions to this rule are labels referring to things named
through the use of the <PK><MN> or <PKMN> characters, in which case PKMN
is used.

Most of this was already consistent enoughâ„¢, I just picked the
convention with the most occurences and fixed the outliers.
2018-02-22 17:39:06 +01:00

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, [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 PrintNum
ld a, "/"
ld [hli], a
; Print max HP
ld de, wTempMonMaxHP
lb bc, 2, 3
call PrintNum
pop hl
pop de
ret
PrintTempMonStats: ; 50b7b
; Print wTempMon'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, 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 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 (wCurPartyMon/wCurOTMon/CurWildMon).
; When calling this function, a should be set to an appropriate wMonType 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, 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: sBoxMon
ld hl, sBoxMon1DVs
ld bc, BOXMON_STRUCT_LENGTH
dec a
jr z, .sBoxMon
; 3: Unknown
ld hl, wTempMonDVs
dec a
jr z, .DVs
; else: WildMon
ld hl, wEnemyMonDVs
jr .DVs
; Get our place in the party/box.
.PartyMon:
.sBoxMon
ld a, [wCurPartyMon]
call AddNTimes
.DVs:
; sBoxMon data is read directly from SRAM.
ld a, [wMonType]
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, [wMonType]
cp BOXMON
call z, CloseSRAM
; We need the gender ratio to do anything with this.
push bc
ld a, [wCurPartySpecies]
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, [wBuffer1]
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, wTempMonPP - (wTempMonMoves + 1)
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 PrintNum
ld a, "/"
ld [hli], a
ld de, wd265
lb bc, 1, 2
call PrintNum
pop hl
ld a, [wBuffer1]
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, wPartyMonNicknames
ld a, [wCurPartyMon]
call GetNick
pop hl
call PlaceString
call CopyMonToTempMon
pop hl
ld a, [wCurPartySpecies]
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 [wBuffer1] 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 [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, [wBuffer1]
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, [wBuffer1]
ld c, a
ld b, 0
add hl, bc
pop af
inc a
cp NUM_MOVES
jr nz, .nonmove_loop
.done
ret