summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2017-11-14 20:58:19 -0800
committerMarcus Huderle <huderlem@gmail.com>2017-11-26 12:57:30 -0800
commite5a0da4d11fcf6bb1a4ca0ed27da7aaa234c28ac (patch)
treee71d68822ec95fae9282f9ab32acafa4355f7a59
parent3ee36e8fcf7fd5e1739b52b4ddc9e2ac2103c8bb (diff)
Decompile DrawExperienceProgressBar()
-rw-r--r--asm/pokemon_summary_screen.s168
-rw-r--r--src/pokemon/pokemon_summary_screen.c67
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;
+ }
+ }
+}