diff options
Diffstat (limited to 'engine/battle/15.asm')
-rwxr-xr-x | engine/battle/15.asm | 233 |
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) |