pokecrystal/engine/events/poisonstep.asm

155 lines
2.4 KiB
NASM
Raw Normal View History

2018-06-24 14:09:41 +00:00
DoPoisonStep::
2018-01-23 22:39:09 +00:00
ld a, [wPartyCount]
2015-11-12 04:38:57 +00:00
and a
jr z, .no_faint
xor a
ld c, wPoisonStepDataEnd - wPoisonStepData
ld hl, wPoisonStepData
.loop_clearPoisonStepData
2015-11-12 04:38:57 +00:00
ld [hli], a
dec c
jr nz, .loop_clearPoisonStepData
2015-11-12 04:38:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wCurPartyMon], a
2015-11-12 04:38:57 +00:00
.loop_check_poison
call .DamageMonIfPoisoned
jr nc, .not_poisoned
; the output flag is stored in c, copy it to [wPoisonStepPartyFlags + [wCurPartyMon]]
; and set the corresponding flag in wPoisonStepFlagSum
2018-01-23 22:39:09 +00:00
ld a, [wCurPartyMon]
2015-11-12 04:38:57 +00:00
ld e, a
ld d, 0
ld hl, wPoisonStepPartyFlags
2015-11-12 04:38:57 +00:00
add hl, de
ld [hl], c
ld a, [wPoisonStepFlagSum]
2015-11-12 04:38:57 +00:00
or c
ld [wPoisonStepFlagSum], a
2015-11-12 04:38:57 +00:00
.not_poisoned
2018-01-23 22:39:09 +00:00
ld a, [wPartyCount]
ld hl, wCurPartyMon
2015-11-12 04:38:57 +00:00
inc [hl]
cp [hl]
jr nz, .loop_check_poison
ld a, [wPoisonStepFlagSum]
2015-11-12 04:38:57 +00:00
and %10
jr nz, .someone_has_fainted
ld a, [wPoisonStepFlagSum]
2015-11-12 04:38:57 +00: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
2018-06-24 14:09:41 +00:00
.DamageMonIfPoisoned:
2015-11-12 04:38:57 +00:00
; 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
2018-06-24 14:09:41 +00:00
.PlayPoisonSFX:
2015-11-12 04:38:57 +00:00
ld de, SFX_POISON
call PlaySFX
ld b, $2
predef LoadPoisonBGPals
2015-11-12 04:38:57 +00:00
call DelayFrame
ret
2018-06-24 14:09:41 +00:00
.Script_MonFaintedToPoison:
2015-11-12 04:38:57 +00:00
callasm .PlayPoisonSFX
2015-12-09 23:25:44 +00:00
opentext
2015-11-12 04:38:57 +00:00
callasm .CheckWhitedOut
iffalse .whiteout
2015-11-25 15:16:29 +00:00
closetext
2015-11-12 04:38:57 +00:00
end
2018-06-24 14:09:41 +00:00
.whiteout
farsjump Script_OverworldWhiteout
2015-11-12 04:38:57 +00:00
2018-06-24 14:09:41 +00:00
.CheckWhitedOut:
2015-11-12 04:38:57 +00:00
xor a
2018-01-23 22:39:09 +00:00
ld [wCurPartyMon], a
ld de, wPoisonStepPartyFlags
2015-11-12 04:38:57 +00:00
.party_loop
push de
ld a, [de]
and %10
jr z, .mon_not_fainted
ld c, HAPPINESS_POISONFAINT
2017-12-24 17:47:30 +00:00
farcall ChangeHappiness
farcall GetPartyNick
2015-11-12 04:38:57 +00:00
ld hl, .PoisonFaintText
call PrintText
.mon_not_fainted
pop de
inc de
2018-01-23 22:39:09 +00:00
ld hl, wCurPartyMon
2015-11-12 04:38:57 +00:00
inc [hl]
2018-01-23 22:39:09 +00:00
ld a, [wPartyCount]
2015-11-12 04:38:57 +00:00
cp [hl]
jr nz, .party_loop
predef CheckPlayerPartyForFitMon
2015-11-12 04:38:57 +00:00
ld a, d
2018-01-23 22:39:09 +00:00
ld [wScriptVar], a
2015-11-12 04:38:57 +00:00
ret
2018-06-24 14:09:41 +00:00
.PoisonFaintText:
text_far _PoisonFaintText
text_end
2015-11-12 04:38:57 +00:00
.PoisonWhiteoutText:
text_far _PoisonWhiteoutText
text_end