pokecrystal-board/engine/events/poisonstep.asm

163 lines
2.5 KiB
NASM
Raw Normal View History

2015-11-11 20:38:57 -08:00
DoPoisonStep:: ; 505da
2018-01-23 14:39:09 -08:00
ld a, [wPartyCount]
2015-11-11 20:38:57 -08:00
and a
jr z, .no_faint
xor a
ld c, 7
2018-01-23 14:39:09 -08:00
ld hl, wEngineBuffer1
2015-11-11 20:38:57 -08:00
.loop_clearEngineBuffer1
ld [hli], a
dec c
jr nz, .loop_clearEngineBuffer1
xor a
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
2015-11-11 20:38:57 -08:00
.loop_check_poison
call .DamageMonIfPoisoned
jr nc, .not_poisoned
2018-01-23 14:39:09 -08:00
; the output flag is stored in c, copy it to the ([wCurPartyMon] + 2)nd EngineBuffer
; and set the corresponding flag in wEngineBuffer1
ld a, [wCurPartyMon]
2015-11-11 20:38:57 -08:00
ld e, a
ld d, 0
2018-01-23 14:39:09 -08:00
ld hl, wEngineBuffer2
2015-11-11 20:38:57 -08:00
add hl, de
ld [hl], c
2018-01-23 14:39:09 -08:00
ld a, [wEngineBuffer1]
2015-11-11 20:38:57 -08:00
or c
2018-01-23 14:39:09 -08:00
ld [wEngineBuffer1], a
2015-11-11 20:38:57 -08:00
.not_poisoned
2018-01-23 14:39:09 -08:00
ld a, [wPartyCount]
ld hl, wCurPartyMon
2015-11-11 20:38:57 -08:00
inc [hl]
cp [hl]
jr nz, .loop_check_poison
2018-01-23 14:39:09 -08:00
ld a, [wEngineBuffer1]
2015-11-11 20:38:57 -08:00
and %10
jr nz, .someone_has_fainted
2018-01-23 14:39:09 -08:00
ld a, [wEngineBuffer1]
2015-11-11 20:38:57 -08:00
and %01
jr z, .no_faint
call .PlayPoisonSFX
xor a
ret
.someone_has_fainted
ld a, BANK(.Script_MonFaintedToPoison)
ld hl, .Script_MonFaintedToPoison
call CallScript
scf
ret
.no_faint
xor a
ret
; 5062e
.DamageMonIfPoisoned: ; 5062e
; check if mon is poisoned, return if not
ld a, MON_STATUS
call GetPartyParamLocation
ld a, [hl]
and 1 << PSN
ret z
; check if mon is already fainted, return if so
ld a, MON_HP
call GetPartyParamLocation
ld a, [hli]
ld b, a
ld c, [hl]
or c
ret z
; do 1 HP damage
dec bc
ld [hl], c
dec hl
ld [hl], b
; check if mon has fainted as a result of poison damage
ld a, b
or c
jr nz, .not_fainted
; the mon has fainted, reset its status, set carry, and return %10
ld a, MON_STATUS
call GetPartyParamLocation
ld [hl], 0
ld c, %10
scf
ret
.not_fainted
; set carry and return %01
ld c, %01
scf
ret
; 50658
.PlayPoisonSFX: ; 50658
ld de, SFX_POISON
call PlaySFX
ld b, $2
predef LoadPoisonBGPals
2015-11-11 20:38:57 -08:00
call DelayFrame
ret
; 50669
.Script_MonFaintedToPoison: ; 50669
callasm .PlayPoisonSFX
2015-12-09 15:25:44 -08:00
opentext
2015-11-11 20:38:57 -08:00
callasm .CheckWhitedOut
iffalse .whiteout
2015-11-25 07:16:29 -08:00
closetext
2015-11-11 20:38:57 -08:00
end
; 50677
.whiteout ; 50677
2015-11-11 20:38:57 -08:00
farjump Script_OverworldWhiteout
; 5067b
.CheckWhitedOut: ; 5067b
xor a
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
ld de, wEngineBuffer2
2015-11-11 20:38:57 -08:00
.party_loop
push de
ld a, [de]
and %10
jr z, .mon_not_fainted
ld c, HAPPINESS_POISONFAINT
2017-12-24 09:47:30 -08:00
farcall ChangeHappiness
farcall GetPartyNick
2015-11-11 20:38:57 -08:00
ld hl, .PoisonFaintText
call PrintText
.mon_not_fainted
pop de
inc de
2018-01-23 14:39:09 -08:00
ld hl, wCurPartyMon
2015-11-11 20:38:57 -08:00
inc [hl]
2018-01-23 14:39:09 -08:00
ld a, [wPartyCount]
2015-11-11 20:38:57 -08:00
cp [hl]
jr nz, .party_loop
predef CheckPlayerPartyForFitPkmn
ld a, d
2018-01-23 14:39:09 -08:00
ld [wScriptVar], a
2015-11-11 20:38:57 -08:00
ret
; 506b2
.PoisonFaintText: ; 506b2
text_jump UnknownText_0x1c0acc
db "@"
; 506b7
.PoisonWhiteOutText: ; 506b7
text_jump UnknownText_0x1c0ada
db "@"
; 506bc