summaryrefslogtreecommitdiff
path: root/engine/battle/15.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/battle/15.asm')
-rwxr-xr-xengine/battle/15.asm233
1 files changed, 122 insertions, 111 deletions
diff --git a/engine/battle/15.asm b/engine/battle/15.asm
index 69d8ff3f..2fb3b108 100755
--- a/engine/battle/15.asm
+++ b/engine/battle/15.asm
@@ -1,63 +1,63 @@
GainExperience: ; 5524f (15:524f)
ld a, [W_ISLINKBATTLE]
cp $4
- ret z
- call Func_5546c
- ld hl, wPartyMons
+ ret z ; return if link battle
+ call DivideExpDataByNumMonsGainingExp
+ ld hl, wPartyMon1
xor a
ld [wWhichPokemon], a
-
-Func_5525f: ; 5525f (15:525f)
+.partyMonLoop ; loop over each mon and add gained exp
inc hl
ld a, [hli]
- or [hl]
- jp z, Func_55436
+ or [hl] ; is mon's HP 0?
+ jp z, .nextMon ; if so, go to next mon
push hl
- ld hl, wPartyAliveFlags
+ ld hl, wPartyGainExpFlags
ld a, [wWhichPokemon]
ld c, a
ld b, $2
predef FlagActionPredef
ld a, c
- and a
+ and a ; is mon's gain exp flag set?
pop hl
- jp z, Func_55436
- ld de, $10
+ jp z, .nextMon ; if mon's gain exp flag not set, go to next mon
+ ld de, (wPartyMon1HPExp + 1) - (wPartyMon1HP + 1)
add hl, de
ld d, h
ld e, l
- ld hl, wd002
+ ld hl, wEnemyMonBaseStats
ld c, $5
-.asm_55285
+.gainStatExpLoop
ld a, [hli]
- ld b, a
- ld a, [de]
- add b
+ ld b, a ; enemy mon base stat
+ ld a, [de] ; stat exp
+ add b ; add enemy mon base state to stat exp
ld [de], a
- jr nc, .asm_5529a
+ jr nc, .nextBaseStat
+; if there was a carry, increment the upper byte
dec de
ld a, [de]
inc a
- jr z, .asm_55295
+ jr z, .maxStatExp ; jump if the value overflowed
ld [de], a
inc de
- jr .asm_5529a
-.asm_55295
+ jr .nextBaseStat
+.maxStatExp ; if the upper byte also overflowed, then we have hit the max stat exp
ld a, $ff
ld [de], a
inc de
ld [de], a
-.asm_5529a
+.nextBaseStat
dec c
jr z, .asm_552a1
inc de
inc de
- jr .asm_55285
+ jr .gainStatExpLoop
.asm_552a1
xor a
ld [H_MULTIPLICAND], a
ld [H_MULTIPLICAND + 1], a
- ld a, [wd008]
+ ld a, [wEnemyMonBaseExp]
ld [H_MULTIPLICAND + 2], a
ld a, [wEnemyMonLevel]
ld [H_MULTIPLIER], a
@@ -66,44 +66,46 @@ Func_5525f: ; 5525f (15:525f)
ld [H_DIVISOR], a
ld b, 4
call Divide
- ld hl, $fff2
+ ld hl, -((wPartyMon1HPExp + 1) - wPartyMon1OTID + 4 * 2)
add hl, de
- ld b, [hl]
+ ld b, [hl] ; party mon OTID
inc hl
ld a, [wPlayerID]
cp b
- jr nz, .asm_552d1
+ jr nz, .tradedMon
ld b, [hl]
ld a, [wPlayerID + 1]
cp b
ld a, $0
- jr z, .asm_552d6
-.asm_552d1
- call Func_5549f
+ jr z, .next
+.tradedMon
+ call BoostExp ; traded mon exp boost
ld a, $1
-.asm_552d6
+.next
ld [wcf4d], a
ld a, [W_ISINBATTLE]
- dec a
- call nz, Func_5549f
+ dec a ; is it a trainer battle?
+ call nz, BoostExp ; if so, boost exp
inc hl
inc hl
inc hl
+; add the gained exp to the party mon's exp
ld b, [hl]
- ld a, [$ff98]
+ ld a, [H_QUOTIENT + 3]
ld [wcf4c], a
add b
ld [hld], a
ld b, [hl]
- ld a, [$ff97]
+ ld a, [H_QUOTIENT + 2]
ld [wcf4b], a
adc b
ld [hl], a
- jr nc, .asm_552f8
+ jr nc, .noCarry
dec hl
inc [hl]
inc hl
-.asm_552f8
+.noCarry
+; calculate exp for the mon at max level, and cap the exp at that value
inc hl
push hl
ld a, [wWhichPokemon]
@@ -111,11 +113,12 @@ Func_5525f: ; 5525f (15:525f)
ld b, 0
ld hl, wPartySpecies
add hl, bc
- ld a, [hl]
+ ld a, [hl] ; species
ld [wd0b5], a
call GetMonHeader
ld d, MAX_LEVEL
- callab CalcExperience
+ callab CalcExperience ; get max exp
+; compare max exp with current exp
ld a, [$ff96]
ld b, a
ld a, [$ff97]
@@ -129,7 +132,8 @@ Func_5525f: ; 5525f (15:525f)
sbc c
ld a, [hl]
sbc b
- jr c, .asm_5532e
+ jr c, .next2
+; the mon's exp is greater than the max exp, so overwrite it with the max exp
ld a, b
ld [hli], a
ld a, c
@@ -137,103 +141,108 @@ Func_5525f: ; 5525f (15:525f)
ld a, d
ld [hld], a
dec hl
-.asm_5532e
+.next2
push hl
ld a, [wWhichPokemon]
ld hl, wPartyMonNicks
call GetPartyMonName
ld hl, GainedText
call PrintText
- xor a
+ xor a ; party mon data
ld [wcc49], a
call LoadMonData
pop hl
- ld bc, $13
+ ld bc, wPartyMon1Level - wPartyMon1Exp
add hl, bc
push hl
- callba Func_58f43
+ callba CalcLevelFromExperience
pop hl
- ld a, [hl]
+ ld a, [hl] ; current level
cp d
- jp z, Func_55436
+ jp z, .nextMon ; if level didn't change, go to next mon
ld a, [W_CURENEMYLVL]
push af
push hl
ld a, d
ld [W_CURENEMYLVL], a
ld [hl], a
- ld bc, $ffdf
+ ld bc, wPartyMon1Species - wPartyMon1Level
add hl, bc
- ld a, [hl]
+ ld a, [hl] ; species
ld [wd0b5], a
ld [wd11e], a
call GetMonHeader
- ld bc, $23
+ ld bc, (wPartyMon1MaxHP + 1) - wPartyMon1Species
add hl, bc
push hl
ld a, [hld]
ld c, a
ld b, [hl]
- push bc
+ push bc ; push max HP (from before levelling up)
ld d, h
ld e, l
- ld bc, $ffee
+ ld bc, (wPartyMon1HPExp - 1) - wPartyMon1MaxHP
add hl, bc
- ld b, $1
+ ld b, $1 ; consider stat exp when calculating stats
call CalcStats
- pop bc
+ pop bc ; pop max HP (from before levelling up)
pop hl
ld a, [hld]
sub c
ld c, a
ld a, [hl]
sbc b
- ld b, a
- ld de, $ffe0
+ ld b, a ; bc = difference between old max HP and new max HP after levelling
+ ld de, (wPartyMon1HP + 1) - wPartyMon1MaxHP
add hl, de
- ld a, [hl]
+; add to the current HP the amount of max HP gained when levelling
+ ld a, [hl] ; wPartyMon1HP + 1
add c
ld [hld], a
- ld a, [hl]
+ ld a, [hl] ; wPartyMon1HP + 1
adc b
- ld [hl], a
+ ld [hl], a ; wPartyMon1HP
ld a, [wPlayerMonNumber]
ld b, a
ld a, [wWhichPokemon]
- cp b
- jr nz, .asm_553f7
+ cp b ; is the current mon in battle?
+ jr nz, .printGrewLevelText
+; current mon is in battle
ld de, wBattleMonHP
+; copy party mon HP to battle mon HP
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
- ld bc, $1f
+; copy other stats from party mon to battle mon
+ ld bc, wPartyMon1Level - (wPartyMon1HP + 1)
add hl, bc
push hl
- ld de, wBattleMonLevel ; wBattleMonLevel
- ld bc, $b
+ ld de, wBattleMonLevel
+ ld bc, $b ; size of stats
call CopyData
pop hl
- ld a, [W_PLAYERBATTSTATUS3] ; W_PLAYERBATTSTATUS3
- bit 3, a
- jr nz, .asm_553c8
+ ld a, [W_PLAYERBATTSTATUS3]
+ bit 3, a ; is the mon transformed?
+ jr nz, .recalcStatChanges
+; the mon is transformed, so copy transformed data
ld de, wcd0f
ld bc, $b
call CopyData
-.asm_553c8
+.recalcStatChanges
xor a
ld [wd11e], a
- callab Func_3ed99
- callab Func_3ed1a
- callab Func_3ee19
- callab Func_3cd60
- callab Func_3ee94
+ callab CalculateModifiedStats
+ callab ApplyBurnAndParalysisPenaltiesToPlayer
+ callab ApplyBadgeStatBoosts
+ callab DrawPlayerHUDAndHPBar
+ callab PrintEmptyString
call SaveScreenTilesToBuffer1
-.asm_553f7
+.printGrewLevelText
ld hl, GrewLevelText
call PrintText
- xor a
+ xor a ; party mon data
ld [wcc49], a
call LoadMonData
ld d, $1
@@ -244,88 +253,90 @@ Func_5525f: ; 5525f (15:525f)
ld [wcc49], a
ld a, [wd0b5]
ld [wd11e], a
- predef Func_3af5b
+ predef LearnMoveFromLevelUp
ld hl, wccd3
- ld a, [wWhichPokemon] ; wWhichPokemon
+ ld a, [wWhichPokemon]
ld c, a
ld b, $1
predef FlagActionPredef
pop hl
pop af
- ld [W_CURENEMYLVL], a ; W_CURENEMYLVL
+ ld [W_CURENEMYLVL], a
-Func_55436: ; 55436 (15:5436)
- ld a, [wPartyCount] ; wPartyCount
+.nextMon
+ ld a, [wPartyCount]
ld b, a
- ld a, [wWhichPokemon] ; wWhichPokemon
+ ld a, [wWhichPokemon]
inc a
cp b
- jr z, .asm_55450
- ld [wWhichPokemon], a ; wWhichPokemon
- ld bc, $2c
- ld hl, wPartyMon1Species ; wPartyMon1Species (aliases: wPartyMon1)
+ jr z, .done
+ ld [wWhichPokemon], a
+ ld bc, wPartyMon2 - wPartyMon1
+ ld hl, wPartyMon1
call AddNTimes
- jp Func_5525f
-.asm_55450
- ld hl, wPartyAliveFlags
+ jp .partyMonLoop
+.done
+ ld hl, wPartyGainExpFlags
xor a
- ld [hl], a
- ld a, [wPlayerMonNumber] ; wPlayerMonNumber
+ ld [hl], a ; clear gain exp flags
+ ld a, [wPlayerMonNumber]
ld c, a
ld b, $1
push bc
- predef FlagActionPredef
- ld hl, wccf5
+ predef FlagActionPredef ; set the gain exp flag for the mon that is currently out
+ ld hl, wPartyFoughtCurrentEnemyFlags
xor a
ld [hl], a
pop bc
- predef_jump FlagActionPredef
+ predef_jump FlagActionPredef ; set the fought current enemy flag for the mon that is currently out
-Func_5546c: ; 5546c (15:546c)
- ld a, [wPartyAliveFlags]
+; divide enemy base stats, catch rate, and base exp by the number of mons gaining exp
+DivideExpDataByNumMonsGainingExp: ; 5546c (15:546c)
+ ld a, [wPartyGainExpFlags]
ld b, a
xor a
ld c, $8
ld d, $0
-.asm_55475
+.countSetBitsLoop ; loop to count set bits in wPartyGainExpFlags
xor a
srl b
adc d
ld d, a
dec c
- jr nz, .asm_55475
+ jr nz, .countSetBitsLoop
cp $2
- ret c
- ld [wd11e], a
- ld hl, wd002
+ ret c ; return if only one mon is gaining exp
+ ld [wd11e], a ; store number of mons gaining exp
+ ld hl, wEnemyMonBaseStats
ld c, $7
-.asm_55488
+.divideLoop
xor a
- ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ ld [H_DIVIDEND], a
ld a, [hl]
- ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
+ ld [H_DIVIDEND + 1], a
ld a, [wd11e]
- ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+ ld [H_DIVISOR], a
ld b, $2
- call Divide
- ld a, [$ff98]
+ call Divide ; divide value by number of mons gaining exp
+ ld a, [H_QUOTIENT + 3]
ld [hli], a
dec c
- jr nz, .asm_55488
+ jr nz, .divideLoop
ret
-Func_5549f: ; 5549f (15:549f)
- ld a, [$ff97]
+; multiplies exp by 1.5
+BoostExp: ; 5549f (15:549f)
+ ld a, [H_QUOTIENT + 2]
ld b, a
- ld a, [$ff98]
+ ld a, [H_QUOTIENT + 3]
ld c, a
srl b
rr c
add c
- ld [$ff98], a
- ld a, [$ff97]
+ ld [H_QUOTIENT + 3], a
+ ld a, [H_QUOTIENT + 2]
adc b
- ld [$ff97], a
+ ld [H_QUOTIENT + 2], a
ret
GainedText: ; 554b2 (15:54b2)