diff options
-rw-r--r-- | constants.asm | 14 | ||||
-rw-r--r-- | main.asm | 106 |
2 files changed, 112 insertions, 8 deletions
diff --git a/constants.asm b/constants.asm index 0161c6e9..31dc5a82 100644 --- a/constants.asm +++ b/constants.asm @@ -211,12 +211,14 @@ W_ENEMYMONSTATUS EQU $CFE9 ; active opponent's status condition ; bit 5 frz ; bit 6 par ; unused? (XXX confirm) -W_ENEMYMONTYPES EQU $CFEA -W_ENEMYMONTYPE1 EQU $CFEA -W_ENEMYMONTYPE2 EQU $CFEB -W_ENEMYMONLEVEL EQU $CFF3 -W_ENEMYMONMAXHP EQU $CFF4 ; (16 bits) -W_ENEMYMONPP EQU $CFFE +W_ENEMYMONTYPES EQU $CFEA +W_ENEMYMONTYPE1 EQU $CFEA +W_ENEMYMONTYPE2 EQU $CFEB +W_ENEMYMONLEVEL EQU $CFF3 +W_ENEMYMONMAXHP EQU $CFF4 ; (16 bits) +W_ENEMYMONDEFENSE EQU $CFF8 +W_ENEMYMONSPECIAL EQU $CFFC +W_ENEMYMONPP EQU $CFFE W_PLAYERMONCURHP EQU $D015 ; active opponent's hp (16 bits) W_PLAYERMONSTATUS EQU $D018 ; the status of the player’s current monster @@ -39201,7 +39201,7 @@ INCBIN "baserom.gbc",$3d435,$274 call $6023 call $6093 jr z,.next11\@ - call $5DCF + call CalculateDamage call $5F65 jp z,$574B call $63A5 @@ -39767,7 +39767,109 @@ UnnamedText_3ddca: ; 0x3ddca db $50 ; 0x3ddca + 5 bytes -INCBIN "baserom.gbc",$3ddcf,$3e04f - $3ddcf +CalculateDamage: ; 0x3ddcf + xor a + ld hl, $d0d7 ;D0D7-D0D8: damage to eventually inflict, intitialise to zero + ldi [hl], a + ld [hl], a + ld hl, W_PLAYERMOVEPOWER + ld a, [hli] ;*read attack base power + and a + ld d, a ;*D = attack base, used later + ret z ;return if attack is zero + ld a, [hl] ;*test attacking type + cp a, $14 ;types >= $14 are all special + jr nc, .specialAttack +.physicalAttack + ld hl, W_ENEMYMONDEFENSE ;CFF8: opponent defense + ld a, [hli] ;*BC = opponent defense used later + ld b, a + ld c, [hl] + ld a, [W_ENEMYBATTSTATUS3] ;test for reflect? + bit 2, a + jr z, .next\@ +.doubleDefense + sla c ;x2 defense if bit2 of D069 is set + rl b +.next\@ + ld hl, $d025 ;attack pointer + ld a, [$d05e] + and a + jr z, .next3\@ + ld c, 3 + call $5f1c + ld a, [$ff00+$97] + ld b, a + ld a, [$ff00+$98] + ld c, a + push bc + ld hl, $d18f + ld a, [W_PLAYERMONNUMBER] + ld bc, $002c + call AddNTimes + pop bc + jr .next3\@ +.specialAttack + ld hl, W_ENEMYMONSPECIAL ;CFFC: opponent special + ld a, [hli] ;*BC = opponent special defense used later + ld b, a + ld c, [hl] + ld a, [W_ENEMYBATTSTATUS3] ;test for lightscreen? + bit 1, a + jr z, .next2\@ +.doubleSpecialDefense + sla c ;x2 special defense if bit1 of D069 set + rl b +.next2\@ + ld hl, $d02b + ld a, [$d05e] ;D05E[?] decides skip + and a + jr z, .next3\@ ;skip portion of code that pulls up inactive pokemon +.loadOtherPoke + ld c, 5 + call $5f1c + ld a, [$ff00+$97] + ld b, a + ld a, [$ff00+$98] + ld c, a + push bc + ld hl, $d195 ;HL base = D195 [where other monster data is stored] + ld a, [W_PLAYERMONNUMBER] ;multiplier = [CC2F] [desired slot #?] + ld bc, $002c ;mulitiplicand = 002C [bytes per monster] + call AddNTimes ;HL = D195 + $002C * slot + pop bc +.next3\@ + ld a, [hli] ;HL: D025 when this was taken + ld l, [hl] + ld h, a ;*HL = attacker attack + or b ;is either attack or defense high byte nonzero? + jr z, .next4\@ + srl b ;[defense] BC /= 4 [this is just so it fits into a single byte, 10bits max] + rr c + srl b + rr c + srl h ;[attack] HL /= 4 [to apply equal scaling] + rr l + srl h + rr l + ld a, l + or h + jr nz, .next4\@ ;is HL result zero? + inc l ;minimum HL = 1 +.next4\@ + ld b, l ;*B = attack [possibly scaled] [C contains defense] + ld a, [$d022] ;*E = level + ld e, a + ld a, [$d05e] ;critical hit? + and a + jr z, .next5\@ + sla e ;double level if it was a critical hit +.next5\@ + ld a, 1 ;return Z = 0 + and a + ret + +INCBIN "baserom.gbc",$3de75,$3e04f - $3de75 ; azure heights claims "the fastest pokémon (who are,not coincidentally, ; among the most popular) tend to CH about 20 to 25% of the time." |