ref: b8c90b6fdbe97cebb07fba0cd607be2a0faf4cc6
parent: 3901d3ac17c89d760620fe92ea4d9283ad6ca949
author: stag019 <[email protected]>
date: Thu Mar 22 09:58:31 EDT 2012
SubstituteEffectHandler from smkdan. hg-commit-id: 284019b3561e
--- a/main.asm
+++ b/main.asm
@@ -21130,8 +21130,74 @@
db BANK(LyingOldManSprite)
; 0x17c47
-INCBIN "baserom.gbc",$17c47,$17e1d - $17c47
+INCBIN "baserom.gbc",$17c47,$17dad - $17c47
+SubstituteEffectHandler: ;0x17DAD
+ ld c, 50
+ call DelayFrames
+ ld hl, W_PLAYERMONMAXHP
+ ld de, W_PLAYERSUBSITUTEHP
+ ld bc, W_PLAYERBATTSTATUS2
+ ld a, [$ff00+$f3] ;whose turn?
+ and a
+ jr z, .notEnemy
+ ld hl, W_ENEMYMONMAXHP
+ ld de, W_ENEMYSUBSITUTEHP
+ ld bc, W_ENEMYBATTSTATUS2
+.notEnemy
+ ld a, [bc] ;load flags
+ bit 4, a ;user already has substitute?
+ jr nz, .alreadyHasSubstitute ;skip this code if so
+ ;user doesn't have a substitute [yet]
+ push bc
+ ld a, [hli] ;load max hp
+ ld b, [hl]
+ srl a ;max hp / 4, [quarter health to remove from user]
+ rr b
+ srl a
+ rr b
+ push de
+ ld de, $fff2 ;subtract 8 to point to [current hp] instead of [max hp]
+ add hl, de ;HL -= 8
+ pop de
+ ld a, b
+ ld [de], a ;save copy of HP to subtract in ccd7/ccd8 [how much HP substitute has]
+ ld a, [hld] ;load current hp
+ sub b ;subtract [max hp / 4]
+ ld d, a ;save low byte result in D
+ ld a, [hl]
+ sbc a, 0 ;borrow from high byte if needed
+ pop bc
+ jr c, .notEnoughHP ;underflow means user would be left with negative health
+ ;bug: note since it only brances on carry, it will possibly leave user with 0HP
+.userHasZeroOrMoreHP
+ ldi [hl], a ;store high byte HP
+ ld [hl], d ;store low byte HP
+ ld h, b
+ ld l, c
+ set 4, [hl] ;set bit 4 of flags, user now has substitute
+ ld a, [$d355] ;load options
+ bit 7, a ;battle animation is enabled?
+ ld hl, $7ba8 ;animation enabled: 0F:7BA8
+ ld b, $0f
+ jr z, .animationEnabled
+ ld hl, $56e0 ;animation disabled: 1E:56E0
+ ld b, $1e
+.animationEnabled
+ call Bankswitch ;jump to routine depending on animation setting
+ ld hl, UnnamedText_17e1d ;"it created a substitute"
+ call PrintText
+ ld hl, $4d5a
+ ld b, $0f
+ jp Bankswitch
+.alreadyHasSubstitute
+ ld hl, UnnamedText_17e22 ;"____ has a substitute"
+ jr .printText
+.notEnoughHP
+ ld hl, UnnamedText_17e27 ;"too weak to make substitute"
+.printText
+ jp PrintText
+
UnnamedText_17e1d: ; 0x17e1d
TX_FAR _UnnamedText_17e1d
db $50
@@ -22090,7 +22156,7 @@
ld hl, UnnamedText_1920a
call PrintText
ld c, $2
- call $3739
+ call DelayFrames
call $35ec
ld a, [$cc26]
and a
@@ -22796,7 +22862,7 @@
and a
ret nz
ld c, $a
- call $3739
+ call DelayFrames
ld a, $0
ld [$d62a], a
ret
@@ -25000,7 +25066,7 @@
OaksLabScript13: ; 0x1ce32
ld c, $14
- call $3739
+ call DelayFrames
ld a, $10
ld [$ff00+$8c], a
call $2920
@@ -25366,7 +25432,7 @@
res 6, [hl]
call ReloadMapData
ld c, $a
- call $3739
+ call DelayFrames
ld a, [$cf13]
cp $2
jr z, OaksLabLookAtCharmander
@@ -39242,7 +39308,7 @@
jr .next4\@
.next3\@
ld c,$1E
- call $3739
+ call DelayFrames
ld a,[W_PLAYERMOVEEFFECT]
cp a,$2B
jr z,.next5\@
@@ -61514,7 +61580,7 @@
ld b, $5
.asm_5a4ff
ld c, $78
- call $3739
+ call DelayFrames
dec b
jr nz, .asm_5a4ff ; 0x5a505 $f8
call $3865
@@ -62279,7 +62345,7 @@
ld a, $ff
call $23b1
ld c, $20
- call $3739
+ call DelayFrames
ld hl, $4608
ld de, $cd3f
ld bc, $0004
@@ -62308,7 +62374,7 @@
ld [$cd42], a
pop hl
ld c, $18
- call $3739
+ call DelayFrames
ld a, [$c026]
ld b, a
ld a, [$c027]
@@ -62315,7 +62381,7 @@
or b
jr nz, .asm_5c5d1 ; 0x5c5f6 $d9
ld c, $30
- call $3739
+ call DelayFrames
call $2307
jp TextScriptEnd
; 0x5c603
@@ -72081,7 +72147,7 @@
;db $c3, $d6, $35
ld b, $18
ld hl, $50eb
- jp $35d6
+ jp Bankswitch
; 0x75df0
Lab4Object: ; 0x75df0 (size=32)