pokecrystal-board/engine/pokemon/mon_stats.asm

490 lines
6.3 KiB
NASM
Raw Normal View History

2018-06-24 07:09:41 -07:00
DrawPlayerHP:
ld a, $1
jr DrawHP
2018-06-24 07:09:41 -07:00
DrawEnemyHP:
ld a, $2
2018-06-24 07:09:41 -07:00
DrawHP:
ld [wWhichHPBar], a
push hl
push bc
; box mons have full HP
2018-01-23 14:39:09 -08:00
ld a, [wMonType]
cp BOXMON
jr z, .at_least_1_hp
2018-01-23 14:39:09 -08:00
ld a, [wTempMonHP]
ld b, a
2018-01-23 14:39:09 -08:00
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
2018-01-23 14:39:09 -08:00
ld a, [wTempMonMaxHP]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wTempMonMaxHP + 1]
ld e, a
2018-01-23 14:39:09 -08:00
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
2018-01-23 14:39:09 -08:00
ld de, wTempMonHP
ld a, [wMonType]
cp BOXMON
jr nz, .not_boxmon_2
2018-01-23 14:39:09 -08:00
ld de, wTempMonMaxHP
.not_boxmon_2
lb bc, 2, 3
call PrintNum
ld a, "/"
ld [hli], a
; Print max HP
2018-01-23 14:39:09 -08:00
ld de, wTempMonMaxHP
lb bc, 2, 3
call PrintNum
pop hl
pop de
ret
2018-06-24 07:09:41 -07:00
PrintTempMonStats:
2018-01-23 14:39:09 -08:00
; 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
2018-01-23 14:39:09 -08:00
ld de, wTempMonAttack
lb bc, 2, 3
call .PrintStat
2018-01-23 14:39:09 -08:00
ld de, wTempMonDefense
call .PrintStat
2018-01-23 14:39:09 -08:00
ld de, wTempMonSpclAtk
call .PrintStat
2018-01-23 14:39:09 -08:00
ld de, wTempMonSpclDef
call .PrintStat
2018-01-23 14:39:09 -08:00
ld de, wTempMonSpeed
jp PrintNum
2018-06-24 07:09:41 -07:00
.PrintStat:
push hl
call PrintNum
pop hl
ld de, SCREEN_WIDTH * 2
add hl, de
ret
2018-06-24 07:09:41 -07:00
.StatNames:
db "ATTACK"
next "DEFENSE"
next "SPCL.ATK"
next "SPCL.DEF"
next "SPEED"
next "@"
2018-06-24 07:09:41 -07:00
GetGender:
Merge branch 'master' of https://github.com/pret/pokecrystal # Conflicts: # audio/engine.asm # constants/gfx_constants.asm # constants/map_data_constants.asm # constants/pokemon_data_constants.asm # constants/sprite_constants.asm # constants/wram_constants.asm # data/maps/data.asm # engine/battle/ai/scoring.asm # engine/battle/core.asm # engine/battle/effect_commands.asm # engine/battle/misc.asm # engine/battle_anims/getpokeballwobble.asm # engine/breeding.asm # engine/buy_sell_toss.asm # engine/decorations.asm # engine/events/battle_tower/battle_tower.asm # engine/events/battle_tower/rules.asm # engine/events/buena.asm # engine/events/bug_contest/contest_2.asm # engine/events/daycare.asm # engine/events/dratini.asm # engine/events/halloffame.asm # engine/events/happiness_egg.asm # engine/events/kurt.asm # engine/events/lucky_number.asm # engine/events/magnet_train.asm # engine/events/overworld.asm # engine/events/pokerus/pokerus.asm # engine/events/print_unown.asm # engine/events/print_unown_2.asm # engine/events/unown_walls.asm # engine/item_effects.asm # engine/link.asm # engine/mon_menu.asm # engine/player_object.asm # engine/routines/playslowcry.asm # engine/scripting.asm # engine/search.asm # engine/search2.asm # engine/specials.asm # engine/start_menu.asm # engine/timeset.asm # home/battle_vars.asm # home/map.asm # maps/GoldenrodUndergroundSwitchRoomEntrances.asm # maps/IlexForest.asm # maps/KrissHouse2F.asm # maps/Route39Barn.asm # mobile/mobile_12_2.asm # mobile/mobile_40.asm # mobile/mobile_5f.asm # wram.asm
2018-02-03 15:21:53 -08:00
; Return the gender of a given monster (wCurPartyMon/wCurOTMon/wCurWildMon).
2018-01-23 14:39:09 -08:00
; 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
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1DVs
ld bc, PARTYMON_STRUCT_LENGTH
2018-01-23 14:39:09 -08:00
ld a, [wMonType]
and a
jr z, .PartyMon
; 1: OTPartyMon
2018-01-23 14:39:09 -08:00
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
2018-01-23 14:39:09 -08:00
ld hl, wTempMonDVs
dec a
jr z, .DVs
; else: WildMon
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonDVs
jr .DVs
; Get our place in the party/box.
.PartyMon:
.sBoxMon
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
call AddNTimes
.DVs:
; sBoxMon data is read directly from SRAM.
2018-01-23 14:39:09 -08:00
ld a, [wMonType]
cp BOXMON
ld a, BANK(sBox)
call z, OpenSRAM
; 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.
2018-01-23 14:39:09 -08:00
ld a, [wMonType]
cp BOXMON
call z, CloseSRAM
; We need the gender ratio to do anything with this.
push bc
2018-01-23 14:39:09 -08:00
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 GENDER_UNKNOWN
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
2018-06-24 07:09:41 -07:00
ListMovePP:
ld a, [wNumMoves]
inc a
ld c, a
ld a, NUM_MOVES
sub c
ld b, a
push hl
2020-11-03 16:53:07 -08:00
ld a, [wListMovesLineSpacing]
ld e, a
2020-11-03 16:53:07 -08:00
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
2018-01-23 14:39:09 -08:00
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
2017-12-24 09:47:30 -08:00
callfar GetMaxPPOfMove
pop hl
pop af
ld [hl], a
pop de
pop hl
push hl
2018-01-23 14:39:09 -08:00
ld bc, wTempMonPP - (wTempMonMoves + 1)
add hl, bc
ld a, [hl]
and $3f
2018-01-23 14:39:09 -08:00
ld [wStringBuffer1 + 4], a
ld h, d
ld l, e
push hl
2018-01-23 14:39:09 -08:00
ld de, wStringBuffer1 + 4
lb bc, 1, 2
call PrintNum
ld a, "/"
ld [hli], a
ld de, wTempPP
lb bc, 1, 2
call PrintNum
pop hl
2020-11-03 16:53:07 -08:00
ld a, [wListMovesLineSpacing]
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
2018-06-24 07:09:41 -07:00
.load_loop
ld [hli], a
ld [hld], a
add hl, de
dec c
jr nz, .load_loop
ret
BrokenPlacePPUnits: ; unreferenced
; Probably would have these parameters:
; hl = starting coordinate
; de = SCREEN_WIDTH or SCREEN_WIDTH * 2
; c = the number of moves (1-4)
.loop
ld [hl], $32 ; typo for P?
inc hl
ld [hl], $3e ; P
dec hl
add hl, de
dec c
jr nz, .loop
ret
Unused_PlaceEnemyHPLevel:
push hl
push hl
2018-01-23 14:39:09 -08:00
ld hl, wPartyMonNicknames
ld a, [wCurPartyMon]
call GetNickname
pop hl
call PlaceString
call CopyMonToTempMon
pop hl
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
cp EGG
jr z, .egg
push hl
ld bc, -12
add hl, bc
2020-11-03 16:53:07 -08:00
ld b, 0
call DrawEnemyHP
pop hl
ld bc, 5
add hl, bc
push de
call PrintLevel
pop de
.egg
ret
2018-06-24 07:09:41 -07:00
PlaceStatusString:
2020-11-03 16:53:07 -08:00
; Return nz if the status is not OK
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
2020-11-03 16:53:07 -08:00
ld a, TRUE
and a
ret
2018-06-24 07:09:41 -07:00
FntString:
db "FNT@"
2018-06-24 07:09:41 -07:00
CopyStatusString:
ld a, [de]
inc de
ld [hli], a
ld a, [de]
inc de
ld [hli], a
ld a, [de]
ld [hl], a
ret
2018-06-24 07:09:41 -07:00
PlaceNonFaintStatus:
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_MASK
jr z, .no_status
.place
call CopyStatusString
2020-11-03 16:53:07 -08:00
ld a, TRUE
and a
.no_status
pop de
ret
SlpString: db "SLP@"
PsnString: db "PSN@"
BrnString: db "BRN@"
FrzString: db "FRZ@"
ParString: db "PAR@"
2018-06-24 07:09:41 -07:00
ListMoves:
2020-11-03 16:53:07 -08:00
; List moves at hl, spaced every [wListMovesLineSpacing] tiles.
ld de, wListMoves_MoveIndicesBuffer
2020-11-03 16:53:07 -08:00
ld b, 0
.moves_loop
ld a, [de]
inc de
and a
jr z, .no_more_moves
push de
push hl
push hl
2018-01-23 14:39:09 -08:00
ld [wCurSpecies], a
ld a, MOVE_NAME
ld [wNamedObjectType], a
call GetName
2018-01-23 14:39:09 -08:00
ld de, wStringBuffer1
pop hl
push bc
call PlaceString
pop bc
ld a, b
ld [wNumMoves], a
inc b
pop hl
push bc
2020-11-03 16:53:07 -08:00
ld a, [wListMovesLineSpacing]
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], "-"
2020-11-03 16:53:07 -08:00
ld a, [wListMovesLineSpacing]
ld c, a
ld b, 0
add hl, bc
pop af
inc a
cp NUM_MOVES
jr nz, .nonmove_loop
.done
ret