diff options
-rw-r--r-- | asm/pokemon_summary_screen.s | 168 | ||||
-rw-r--r-- | src/pokemon/pokemon_summary_screen.c | 67 |
2 files changed, 68 insertions, 167 deletions
diff --git a/asm/pokemon_summary_screen.s b/asm/pokemon_summary_screen.s index 257ab1345..704703c78 100644 --- a/asm/pokemon_summary_screen.s +++ b/asm/pokemon_summary_screen.s @@ -4914,7 +4914,7 @@ _0809FF6A: adds r0, r5, 0 movs r1, 0x17 movs r2, 0x10 - bl sub_80A0C80 + bl DrawExperienceProgressBar adds r0, r5, 0 movs r1, 0x3B bl GetMonData @@ -5741,172 +5741,6 @@ _080A0660: .4byte 0x0000103d .section .text_80A0958 - thumb_func_start sub_80A0C80 -sub_80A0C80: @ 80A0C80 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r4, r0, 0 - lsls r1, 24 - lsrs r1, 24 - mov r10, r1 - lsls r2, 24 - lsrs r2, 24 - str r2, [sp] - movs r0, 0 - mov r9, r0 - movs r6, 0 - movs r7, 0 - adds r0, r4, 0 - movs r1, 0x19 - bl GetMonData - mov r8, r0 - adds r0, r4, 0 - movs r1, 0x38 - bl GetMonData - lsls r0, 24 - lsrs r5, r0, 24 - adds r0, r4, 0 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - lsrs r4, r0, 16 - cmp r5, 0x63 - bhi _080A0D14 - ldr r3, _080A0D4C @ =gExperienceTables - adds r1, r5, 0x1 - lsls r1, 2 - ldr r2, _080A0D50 @ =gBaseStats - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - adds r0, r2 - ldrb r2, [r0, 0x13] - movs r0, 0xCA - lsls r0, 1 - muls r2, r0 - adds r1, r2 - adds r1, r3 - ldr r1, [r1] - mov r0, r8 - subs r0, r1, r0 - mov r9, r0 - lsls r0, r5, 2 - adds r0, r2 - adds r0, r3 - ldr r0, [r0] - subs r1, r0 - mov r2, r8 - subs r4, r2, r0 - lsls r0, r4, 6 - bl __udivsi3 - adds r6, r0, 0 - movs r7, 0 - adds r0, r7, 0 - orrs r0, r6 - cmp r0, 0 - bne _080A0D14 - cmp r4, 0 - beq _080A0D14 - movs r6, 0x1 - movs r7, 0 -_080A0D14: - ldr r4, _080A0D54 @ =gStringVar1 - adds r0, r4, 0 - mov r1, r9 - bl ConvertIntToDecimalString - mov r1, r10 - adds r1, 0x6 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - ldr r2, [sp] - bl MenuPrint_RightAligned - ldr r0, _080A0D58 @ =0x06004caa - mov r9, r0 - movs r2, 0 - mov r12, r2 - ldr r0, _080A0D5C @ =0x00002062 - mov r8, r0 -_080A0D3A: - cmp r7, 0 - bgt _080A0D46 - cmp r7, 0 - bne _080A0D64 - cmp r6, 0x7 - bls _080A0D64 -_080A0D46: - ldr r1, _080A0D60 @ =0x0000206a - b _080A0D96 - .align 2, 0 -_080A0D4C: .4byte gExperienceTables -_080A0D50: .4byte gBaseStats -_080A0D54: .4byte gStringVar1 -_080A0D58: .4byte 0x06004caa -_080A0D5C: .4byte 0x00002062 -_080A0D60: .4byte 0x0000206a -_080A0D64: - adds r5, r7, 0 - adds r4, r6, 0 - cmp r7, 0 - bge _080A0D74 - movs r4, 0x7 - movs r5, 0 - adds r4, r6 - adcs r5, r7 -_080A0D74: - lsls r3, r5, 29 - lsrs r2, r4, 3 - adds r0, r3, 0 - orrs r0, r2 - asrs r1, r5, 3 - lsrs r5, r0, 29 - lsls r4, r1, 3 - adds r3, r5, 0 - orrs r3, r4 - lsls r2, r0, 3 - adds r1, r7, 0 - adds r0, r6, 0 - subs r0, r2 - sbcs r1, r3 - add r0, r8 - lsls r0, 16 - lsrs r1, r0, 16 -_080A0D96: - mov r2, r12 - lsls r0, r2, 1 - add r0, r9 - strh r1, [r0] - movs r0, 0x8 - negs r0, r0 - asrs r1, r0, 31 - adds r6, r0 - adcs r7, r1 - cmp r7, 0 - bge _080A0DB0 - movs r6, 0 - movs r7, 0 -_080A0DB0: - mov r0, r12 - adds r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - mov r12, r0 - cmp r0, 0x7 - bls _080A0D3A - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80A0C80 - thumb_func_start sub_80A0DD0 sub_80A0DD0: @ 80A0DD0 push {r4,r5,lr} diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 02c5b7501..63f9a9b9e 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -343,4 +343,71 @@ void PrintHeldItemName(u16 itemId, u8 left, u8 top) MenuPrint(gUnknown_083C15B4, left, top); } +void DrawExperienceProgressBar(struct Pokemon *pokemon, u8 left, u8 top) +{ + u32 curExperience; + u8 level; + u16 species; + u8 i; + u16 *vramAddr; + u32 expToNextLevel = 0; + s64 numExpProgressBarTicks = 0; + + curExperience = GetMonData(pokemon, MON_DATA_EXP); + level = GetMonData(pokemon, MON_DATA_LEVEL); + species = GetMonData(pokemon, MON_DATA_SPECIES); + + // The experience progress bar is shown as empty when the Pokemon is already level 100. + if (level < 100) + { + u32 nextLevelExp; + u32 expSinceLastLevel; + u32 expBetweenLevels; + u32 curLevelExperience; + + nextLevelExp = gExperienceTables[gBaseStats[species].growthRate][level + 1]; + expToNextLevel = nextLevelExp - curExperience; + curLevelExperience = gExperienceTables[gBaseStats[species].growthRate][level]; + expBetweenLevels = (nextLevelExp - curLevelExperience); + expSinceLastLevel = curExperience - curLevelExperience; + + // Calculate the number of 1-pixel "ticks" to illuminate in the experience progress bar. + // There are 8 tiles that make up the bar, and each tile has 8 "ticks". Hence, the numerator + // is multiplied by 64. + numExpProgressBarTicks = (expSinceLastLevel * 64) / expBetweenLevels; + if (numExpProgressBarTicks == 0 && expSinceLastLevel != 0) + { + // Ensure sure some exp. gain is visible in the progress bar. + numExpProgressBarTicks = 1; + } + } + + ConvertIntToDecimalString(gStringVar1, expToNextLevel); + MenuPrint_RightAligned(gStringVar1, left + 6, top); + + // Draw each of the 8 tiles that make up the experience progress bar. + vramAddr = (u16 *)(VRAM + 0x4CAA); + for (i = 0; i < 8; i++) + { + u16 tile; + u16 baseTile = 0x2062; + + if (numExpProgressBarTicks > 7) + { + tile = 0x206A; // full exp. bar block + } + else + { + tile = (numExpProgressBarTicks % 8) + baseTile; + } + + vramAddr[i] = tile; + + numExpProgressBarTicks -= 8; + if (numExpProgressBarTicks < 0) + { + numExpProgressBarTicks = 0; + } + } +} |