ref: fa3e27b157112a26e41ed9d6d87a9f5622894f28
parent: e7a1d887d9dddcba2d5679c27198952851271f0a
author: YamaArashi <shadow962@live.com>
date: Tue Jan 24 01:17:22 EST 2012
more battle code hg-commit-id: f31a255ecaf0
--- a/common.asm
+++ b/common.asm
@@ -24948,11 +24948,11 @@
ApplyDamageToEnemyPokemon: ; 60DF
ld a,[W_PLAYERMOVEEFFECT]
- cp a,$26 ; OHKO
+ cp a,OHKO_EFFECT
jr z,.applyDamage\@
- cp a,$28 ; super fang's effect
+ cp a,SUPER_FANG_EFFECT
jr z,.superFangEffect\@
- cp a,$29 ; special damage (fixed or random damage)
+ cp a,SPECIAL_DAMAGE_EFFECT
jr z,.specialDamage\@
ld a,[W_PLAYERMOVEPOWER]
and a
@@ -24985,10 +24985,10 @@
jr z,.storeDamage\@
cp a,NIGHT_SHADE
jr z,.storeDamage\@
- ld b,$14 ; Sonic Boom damage
+ ld b,SONICBOOM_DAMAGE
cp a,SONICBOOM
jr z,.storeDamage\@
- ld b,$28 ; Dragon Rage damage
+ ld b,DRAGON_RAGE_DAMAGE
cp a,DRAGON_RAGE
jr z,.storeDamage\@
; Psywave
@@ -24997,7 +24997,7 @@
srl a
add b
ld b,a ; b = level * 1.5
-; loop until a random number between 1 and b is found
+; loop until a random number in the range [1, b) is found
.loop\@
call $6e9b ; random number
and a
@@ -25020,7 +25020,7 @@
jr z,.done\@ ; we're done if damage is 0
ld a,[W_ENEMYBATTSTATUS2]
bit 4,a ; does the enemy have a substitute?
- jp nz,$625e
+ jp nz,AttackSubstitute
; subtract the damage from the pokemon's current HP
; also, save the current HP at $CEEB
ld a,[hld]
@@ -25037,7 +25037,7 @@
ld [W_ENEMYMONCURHP],a
jr nc,.animateHpBar\@
; if more damage was done than the current HP, zero the HP and set the damage
-; equal to how much HP the pokemon had before fainting
+; equal to how much HP the pokemon had before the attack
ld a,[$ceec]
ld [hli],a
ld a,[$ceeb]
@@ -25065,7 +25065,171 @@
.done\@
jp $4d5a ; redraw pokemon names and HP bars
-INCBIN "baserom.gbc",$3e1a0,$3e2ac - $3e1a0
+ApplyDamageToPlayerPokemon: ; 61A0
+ ld a,[W_ENEMYMOVEEFFECT]
+ cp a,OHKO_EFFECT
+ jr z,.applyDamage\@
+ cp a,SUPER_FANG_EFFECT
+ jr z,.superFangEffect\@
+ cp a,SPECIAL_DAMAGE_EFFECT
+ jr z,.specialDamage\@
+ ld a,[W_ENEMYMOVEPOWER]
+ and a
+ jp z,.done\@
+ jr .applyDamage\@
+.superFangEffect\@
+; set the damage to half the target's HP
+ ld hl,W_PLAYERMONCURHP
+ ld de,W_DAMAGE
+ ld a,[hli]
+ srl a
+ ld [de],a
+ inc de
+ ld b,a
+ ld a,[hl]
+ rr a
+ ld [de],a
+ or b
+ jr nz,.applyDamage\@
+; make sure Super Fang's damage is always at least 1
+ ld a,$01
+ ld [de],a
+ jr .applyDamage\@
+.specialDamage\@
+ ld hl,W_ENEMYMONLEVEL
+ ld a,[hl]
+ ld b,a
+ ld a,[W_ENEMYMOVENUM]
+ cp a,SEISMIC_TOSS
+ jr z,.storeDamage\@
+ cp a,NIGHT_SHADE
+ jr z,.storeDamage\@
+ ld b,SONICBOOM_DAMAGE
+ cp a,SONICBOOM
+ jr z,.storeDamage\@
+ ld b,DRAGON_RAGE_DAMAGE
+ cp a,DRAGON_RAGE
+ jr z,.storeDamage\@
+; Psywave
+ ld a,[hl]
+ ld b,a
+ srl a
+ add b
+ ld b,a ; b = attacker's level * 1.5
+; loop until a random number in the range [0, b) is found
+; this differs from the range when the player attacks, which is [1, b)
+; it's possible for the enemy to do 0 damage with Psywave, but the player always does at least 1 damage
+.loop\@
+ call $6e9b ; random number
+ cp b
+ jr nc,.loop\@
+ ld b,a
+.storeDamage\@
+ ld hl,W_DAMAGE
+ xor a
+ ld [hli],a
+ ld a,b
+ ld [hl],a
+.applyDamage\@
+ ld hl,W_DAMAGE
+ ld a,[hli]
+ ld b,a
+ ld a,[hl]
+ or b
+ jr z,.done\@ ; we're done if damage is 0
+ ld a,[W_PLAYERBATTSTATUS2]
+ bit 4,a ; does the player have a substitute?
+ jp nz,AttackSubstitute
+; subtract the damage from the pokemon's current HP
+; also, save the current HP at $CEEB and the new HP at $CEED
+ ld a,[hld]
+ ld b,a
+ ld a,[W_PLAYERMONCURHP + 1]
+ ld [$ceeb],a
+ sub b
+ ld [W_PLAYERMONCURHP + 1],a
+ ld [$ceed],a
+ ld b,[hl]
+ ld a,[W_PLAYERMONCURHP]
+ ld [$ceec],a
+ sbc b
+ ld [W_PLAYERMONCURHP],a
+ ld [$ceee],a
+ jr nc,.animateHpBar\@
+; if more damage was done than the current HP, zero the HP and set the damage
+; equal to how much HP the pokemon had before the attack
+ ld a,[$ceec]
+ ld [hli],a
+ ld a,[$ceeb]
+ ld [hl],a
+ xor a
+ ld hl,W_PLAYERMONCURHP
+ ld [hli],a
+ ld [hl],a
+ ld hl,$ceed
+ ld [hli],a
+ ld [hl],a
+.animateHpBar\@
+ ld hl,W_PLAYERMONMAXHP
+ ld a,[hli]
+ ld [$ceea],a
+ ld a,[hl]
+ ld [$cee9],a
+ ld hl,$c45e
+ ld a,$01
+ ld [$cf94],a
+ ld a,$48
+ call Predef ; animate the HP bar shortening
+.done\@
+ jp $4d5a ; redraw pokemon names and HP bars
+
+AttackSubstitute: ; 625E
+ ld hl,UnnamedText_3e2ac
+ call PrintText
+; values for player turn
+ ld de,W_ENEMYSUBSITUTEHP
+ ld bc,W_ENEMYBATTSTATUS2
+ ld a,[H_WHOSETURN]
+ and a
+ jr z,.applyDamageToSubstitute\@
+; values for enemy turn
+ ld de,W_PLAYERSUBSITUTEHP
+ ld bc,W_PLAYERBATTSTATUS2
+.applyDamageToSubstitute\@
+ ld hl,W_DAMAGE
+ ld a,[hli]
+ and a
+ jr nz,.substituteBroke\@ ; damage > 0xFF always breaks substitutes
+; subtract damage from HP of substitute
+ ld a,[de]
+ sub [hl]
+ ld [de],a
+ ret nc
+.substituteBroke\@
+ ld h,b
+ ld l,c
+ res 4,[hl] ; unset the substitute bit
+ ld hl,UnnamedText_3e2b1
+ call PrintText
+; flip whose turn it is for the next function call
+ ld a,[H_WHOSETURN]
+ xor a,$01
+ ld [H_WHOSETURN],a
+ ld hl,$5747
+ ld b,$1e ; animate the substitute breaking
+ call Bankswitch ; substitute
+; flip the turn back to the way it was
+ ld a,[H_WHOSETURN]
+ xor a,$01
+ ld [H_WHOSETURN],a
+ ld hl,W_PLAYERMOVEEFFECT ; value for player's turn
+ and a
+ jr z,.nullifyEffect\@
+ ld hl,W_ENEMYMOVEEFFECT ; value for enemy's turn
+.nullifyEffect\@
+ xor a
+ ld [hl],a ; zero the effect of the attacker's move
+ jp $4d5a ; redraw pokemon names and HP bars
UnnamedText_3e2ac: ; 0x3e2ac
TX_FAR _UnnamedText_3e2ac
--- a/constants.asm
+++ b/constants.asm
@@ -89,6 +89,10 @@
; wram locations
+; current HP of player and enemy substitutes
+W_PLAYERSUBSITUTEHP EQU $CCD7
+W_ENEMYSUBSITUTEHP EQU $CCD8
+
W_PLAYERSELECTEDMOVE EQU $CCDC
W_ENEMYSELECTEDMOVE EQU $CCDD
@@ -1264,6 +1268,10 @@
LEECH_SEED_EFFECT EQU $54
SPLASH_EFFECT EQU $55
DISABLE_EFFECT EQU $56
+
+; fixed damage constants
+SONICBOOM_DAMAGE EQU 20
+DRAGON_RAGE_DAMAGE EQU 40
; move name constants
POUND EQU $01