summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-06-28 02:00:02 +0800
committerjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-06-28 02:00:02 +0800
commit6e570a107f6425068902e4ad077ab8c7b6e15ed3 (patch)
tree1c6063b3578146df4807ca336dd9802a6f27b771 /src
parent9260240931d7584a8a2007f0f24a33ba9d82140c (diff)
parentc27f8d2d9ee63deaf9de9f7c3689e072400ab5c3 (diff)
Merge branch 'decompress' into misc
Diffstat (limited to 'src')
-rw-r--r--src/daycare.c4
-rw-r--r--src/decompress.c664
-rw-r--r--src/item_menu_icons.c4
-rw-r--r--src/item_pc.c4
-rw-r--r--src/mevent_8145654.c2
-rw-r--r--src/oak_speech.c10
-rw-r--r--src/tm_case.c2
-rw-r--r--src/trainer_pokemon_sprites.c4
-rw-r--r--src/unk_815C980.c2
-rw-r--r--src/unk_815F138.c2
10 files changed, 681 insertions, 17 deletions
diff --git a/src/daycare.c b/src/daycare.c
index cc98da28e..35670465a 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -1768,8 +1768,8 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc
{
u16 species = GetMonData(mon, MON_DATA_SPECIES);
u32 pid = GetMonData(mon, MON_DATA_PERSONALITY);
- sub_800ECC4(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);
- LoadCompressedObjectPalette(GetMonSpritePalStruct(mon));
+ HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);
+ LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));
*speciesLoc = species;
}
break;
diff --git a/src/decompress.c b/src/decompress.c
new file mode 100644
index 000000000..ddc86b5b7
--- /dev/null
+++ b/src/decompress.c
@@ -0,0 +1,664 @@
+#include "global.h"
+#include "malloc.h"
+#include "decompress.h"
+#include "pokemon.h"
+#include "text.h"
+#include "constants/species.h"
+
+extern const struct CompressedSpriteSheet gMonFrontPicTable[];
+extern const struct CompressedSpriteSheet gMonBackPicTable[];
+
+static void DuplicateDeoxysTiles(void *pointer, s32 species);
+
+void LZDecompressWram(const void *src, void *dest)
+{
+ LZ77UnCompWram(src, dest);
+}
+
+void LZDecompressVram(const void *src, void *dest)
+{
+ LZ77UnCompVram(src, dest);
+}
+
+u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src)
+{
+ struct SpriteSheet dest;
+
+ LZ77UnCompWram(src->data, gDecompressionBuffer);
+ dest.data = gDecompressionBuffer;
+ dest.size = src->size;
+ dest.tag = src->tag;
+ return LoadSpriteSheet(&dest);
+}
+
+void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer)
+{
+ struct SpriteSheet dest;
+
+ LZ77UnCompWram(src->data, buffer);
+ dest.data = buffer;
+ dest.size = src->size;
+ dest.tag = src->tag;
+ LoadSpriteSheet(&dest);
+}
+
+void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src)
+{
+ struct SpritePalette dest;
+
+ LZ77UnCompWram(src->data, gDecompressionBuffer);
+ dest.data = (void*) gDecompressionBuffer;
+ dest.tag = src->tag;
+ LoadSpritePalette(&dest);
+}
+
+void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer)
+{
+ struct SpritePalette dest;
+
+ LZ77UnCompWram(a->data, buffer);
+ dest.data = buffer;
+ dest.tag = a->tag;
+ LoadSpritePalette(&dest);
+}
+
+void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void* buffer, s32 species)
+{
+ if (species > NUM_SPECIES)
+ LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
+ else
+ LZ77UnCompWram(src->data, buffer);
+ DuplicateDeoxysTiles(buffer, species);
+}
+
+void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality)
+{
+ bool8 isFrontPic;
+
+ if (src == &gMonFrontPicTable[species])
+ isFrontPic = TRUE; // frontPic
+ else
+ isFrontPic = FALSE; // backPic
+
+ LoadSpecialPokePic(src, dest, species, personality, isFrontPic);
+}
+
+void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic)
+{
+ if (species == SPECIES_UNOWN)
+ {
+ u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C;
+
+ // The other Unowns are separate from Unown A.
+ if (i == 0)
+ i = SPECIES_UNOWN;
+ else
+ i += SPECIES_UNOWN_B - 1;
+
+ if (!isFrontPic)
+ LZ77UnCompWram(gMonBackPicTable[i].data, dest);
+ else
+ LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
+ }
+ else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
+ LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
+ else
+ LZ77UnCompWram(src->data, dest);
+
+ DuplicateDeoxysTiles(dest, species);
+ DrawSpindaSpots(species, personality, dest, isFrontPic);
+}
+
+static void DuplicateDeoxysTiles(void *pointer, s32 species)
+{
+ if (species == SPECIES_DEOXYS)
+ CpuCopy32(pointer + 0x800, pointer, 0x800);
+}
+
+static void Unused_LZDecompressWramIndirect(const void **src, void *dest)
+{
+ LZ77UnCompWram(*src, dest);
+}
+
+#ifdef NONMATCHING
+static void sub_800EDDC(s32 a0, s32 a1, const u8 *a2, u8 *a3)
+{
+ u8 *v1, *v2;
+ int i, j, k, l;
+
+ if (a0 & 1)
+ {
+ u8 v40 = ((a0 >> 1) + 4);
+ for (i = 0; i < a1; ++i)
+ {
+ // this nested loop failed to match
+ for (j = 0; j < 8 - a0; ++j)
+ {
+ for (k = 0; k < 8; ++k)
+ {
+
+ v1 = a3 + 0x100 * v40 + 0x100 * (j >> 1) + 0x20 * k;
+ v2 = a3 + 0x20 * k + 0x100 * (j >> 1);
+ for (l = 0; l < 0x10; ++l)
+ {
+ if (!(j & 1))
+ {
+ v2[0] = j & 1;
+ v1[16] = 0;
+// a3[0x100 * (j / 2) + 0x20 * k + l] = 0;
+// a3[0x100 * v40 + 0x100 * (j / 2) + 0x20 * k + l + 0x10] = 0;
+ }
+ else
+ {
+ v2[16] = 0;
+ v1[0x100] = 0;
+// a3[0x100 * (j / 2) + 0x20 * k + l + 0x10] = 0;
+// a3[0x100 * v40 + 0x100 * (j / 2) + 0x20 * k + l + 0x100] = 0;
+ }
+ ++v1;
+ ++v2; // this should be generated if you write stuff inside operator [] instead of declaring v1/v2
+ }
+ }
+ }
+ for (j = 0; j < 2; ++j)
+ {
+ for (k = 0; k < 8; ++k)
+ {
+ for (l = 0; l < 0x20; ++l)
+ {
+ a3[0x100 * k + 0x20 * j + l] = 0;
+ a3[0x100 * k + 0xC0 + 0x20 * j + l] = 0;
+ }
+ }
+ }
+ if (a0 == 5)
+ a3 += 0x120;
+ for (j = 0; j < a0; ++j)
+ {
+ for (k = 0; k < a0; ++k)
+ {
+ for (l = 0; l < 4; ++l)
+ {
+ a3[0x12 + 4 * l] = a2[0 + 4 * l];
+ a3[0x13 + 4 * l] = a2[1 + 4 * l];
+ a3[0x12 + 0x1E + 4 * l] = a2[2 + 4 * l];
+ a3[0x12 + 0x1F + 4 * l] = a2[3 + 4 * l];
+ a3[0x102 + 4 * l] = a2[0x10 + 4 * l];
+ a3[0x103 + 4 * l] = a2[0x11 + 4 * l];
+ a3[0x120 + 4 * l] = a2[0x12 + 4 * l];
+ a3[0x121 + 4 * l] = a2[0x13 + 4 * l];
+ }
+ a2 += 0x20;
+ a3 += 0x20;
+ }
+ if (a0 == 7)
+ a3 += 0x20;
+ else if (a0 == 5)
+ a3 += 0x60;
+ }
+ if (a0 == 7)
+ a3 += 0x100;
+ else if (a0 == 5)
+ a3 += 0x1E0;
+ }
+ }
+ else
+ {
+ for (i = 0; i < a1; ++i)
+ {
+ if (a0 == 6)
+ for (j = 0; j < 0x100; ++j)
+ *a3++ = 0;
+ for (j = 0; j < a0; ++j)
+ {
+ if (a0 == 6)
+ for (k = 0; k < 0x20; ++k)
+ *a3++ = 0;
+ for (k = 0; k < 0x20 * a0; ++k)
+ *a3++ = *a2++;
+ if (a0 == 6)
+ for (k = 0; k < 0x20; ++k)
+ *a3++ = 0;
+ }
+ if (a0 == 6)
+ for (j = 0; j < 0x100; ++j)
+ *a3++ = 0;
+ }
+ }
+}
+#else
+NAKED
+static void sub_800EDDC(s32 a0, s32 a1, const u8 *a2, u8 *a3)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x24\n\
+ mov r9, r0\n\
+ str r1, [sp]\n\
+ str r2, [sp, 0x4]\n\
+ adds r5, r3, 0\n\
+ movs r0, 0x1\n\
+ mov r1, r9\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0800EDFC\n\
+ b _0800EF94\n\
+ _0800EDFC:\n\
+ asrs r0, r1, 1\n\
+ adds r0, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x8]\n\
+ movs r0, 0\n\
+ ldr r2, [sp]\n\
+ cmp r0, r2\n\
+ blt _0800EE10\n\
+ b _0800F024\n\
+ _0800EE10:\n\
+ movs r4, 0x8\n\
+ subs r1, r4, r1\n\
+ str r1, [sp, 0x10]\n\
+ _0800EE16:\n\
+ movs r7, 0\n\
+ adds r0, 0x1\n\
+ str r0, [sp, 0x14]\n\
+ ldr r0, [sp, 0x10]\n\
+ cmp r7, r0\n\
+ bge _0800EE92\n\
+ ldr r1, [sp, 0x8]\n\
+ lsls r1, 8\n\
+ str r1, [sp, 0x18]\n\
+ movs r2, 0\n\
+ mov r10, r2\n\
+ mov r0, r9\n\
+ movs r4, 0x8\n\
+ subs r0, r4, r0\n\
+ str r0, [sp, 0xC]\n\
+ _0800EE34:\n\
+ movs r3, 0\n\
+ asrs r0, r7, 1\n\
+ adds r1, r7, 0\n\
+ movs r2, 0x1\n\
+ ands r1, r2\n\
+ str r1, [sp, 0x20]\n\
+ lsls r0, 8\n\
+ mov r8, r0\n\
+ mov r12, r5\n\
+ _0800EE46:\n\
+ lsls r1, r3, 5\n\
+ ldr r4, [sp, 0x18]\n\
+ adds r0, r5, r4\n\
+ adds r0, r1\n\
+ mov r1, r8\n\
+ adds r2, r0, r1\n\
+ mov r1, r12\n\
+ add r1, r8\n\
+ movs r6, 0xF\n\
+ _0800EE58:\n\
+ ldr r4, [sp, 0x20]\n\
+ cmp r4, 0\n\
+ bne _0800EE68\n\
+ strb r4, [r1]\n\
+ add r4, sp, 0x20\n\
+ ldrb r4, [r4]\n\
+ strb r4, [r2, 0x10]\n\
+ b _0800EE76\n\
+ _0800EE68:\n\
+ mov r0, r10\n\
+ strb r0, [r1, 0x10]\n\
+ movs r4, 0x80\n\
+ lsls r4, 1\n\
+ adds r4, r2, r4\n\
+ str r4, [sp, 0x1C]\n\
+ strb r0, [r4]\n\
+ _0800EE76:\n\
+ adds r2, 0x1\n\
+ adds r1, 0x1\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _0800EE58\n\
+ movs r0, 0x20\n\
+ add r12, r0\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x7\n\
+ ble _0800EE46\n\
+ adds r7, 0x1\n\
+ ldr r1, [sp, 0xC]\n\
+ cmp r7, r1\n\
+ blt _0800EE34\n\
+ _0800EE92:\n\
+ movs r7, 0\n\
+ movs r2, 0\n\
+ _0800EE96:\n\
+ movs r6, 0\n\
+ adds r4, r7, 0x1\n\
+ mov r8, r4\n\
+ lsls r4, r7, 5\n\
+ _0800EE9E:\n\
+ adds r0, r6, 0x1\n\
+ mov r10, r0\n\
+ lsls r1, r6, 8\n\
+ adds r0, r1, 0\n\
+ adds r0, 0xC0\n\
+ adds r0, r5, r0\n\
+ adds r0, r4\n\
+ adds r1, r5, r1\n\
+ adds r1, r4\n\
+ movs r3, 0x1F\n\
+ _0800EEB2:\n\
+ strb r2, [r1]\n\
+ strb r2, [r0]\n\
+ adds r0, 0x1\n\
+ adds r1, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800EEB2\n\
+ mov r6, r10\n\
+ cmp r6, 0x7\n\
+ ble _0800EE9E\n\
+ mov r7, r8\n\
+ cmp r7, 0x1\n\
+ ble _0800EE96\n\
+ mov r1, r9\n\
+ cmp r1, 0x5\n\
+ bne _0800EED8\n\
+ movs r2, 0x90\n\
+ lsls r2, 1\n\
+ adds r5, r2\n\
+ _0800EED8:\n\
+ movs r7, 0\n\
+ cmp r7, r9\n\
+ bge _0800EF6E\n\
+ _0800EEDE:\n\
+ movs r3, 0\n\
+ adds r7, 0x1\n\
+ mov r8, r7\n\
+ cmp r3, r9\n\
+ bge _0800EF4E\n\
+ _0800EEE8:\n\
+ adds r3, 0x1\n\
+ mov r10, r3\n\
+ ldr r4, [sp, 0x4]\n\
+ adds r4, 0x20\n\
+ adds r7, r5, 0\n\
+ adds r7, 0x20\n\
+ movs r0, 0x12\n\
+ adds r0, r5\n\
+ mov r12, r0\n\
+ ldr r2, [sp, 0x4]\n\
+ adds r3, r5, 0\n\
+ movs r6, 0x3\n\
+ _0800EF00:\n\
+ ldrb r0, [r2]\n\
+ mov r1, r12\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r2, 0x1]\n\
+ strb r0, [r1, 0x1]\n\
+ ldrb r0, [r2, 0x2]\n\
+ strb r0, [r1, 0x1E]\n\
+ ldrb r0, [r2, 0x3]\n\
+ strb r0, [r1, 0x1F]\n\
+ movs r0, 0x81\n\
+ lsls r0, 1\n\
+ adds r1, r3, r0\n\
+ ldrb r0, [r2, 0x10]\n\
+ strb r0, [r1]\n\
+ ldr r0, _0800EF58 @ =0x00000103\n\
+ adds r1, r3, r0\n\
+ ldrb r0, [r2, 0x11]\n\
+ strb r0, [r1]\n\
+ movs r0, 0x90\n\
+ lsls r0, 1\n\
+ adds r1, r3, r0\n\
+ ldrb r0, [r2, 0x12]\n\
+ strb r0, [r1]\n\
+ ldr r0, _0800EF5C @ =0x00000121\n\
+ adds r1, r3, r0\n\
+ ldrb r0, [r2, 0x13]\n\
+ strb r0, [r1]\n\
+ movs r1, 0x4\n\
+ add r12, r1\n\
+ adds r2, 0x4\n\
+ adds r3, 0x4\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _0800EF00\n\
+ str r4, [sp, 0x4]\n\
+ adds r5, r7, 0\n\
+ mov r3, r10\n\
+ cmp r3, r9\n\
+ blt _0800EEE8\n\
+ _0800EF4E:\n\
+ mov r2, r9\n\
+ cmp r2, 0x7\n\
+ bne _0800EF60\n\
+ adds r5, 0x20\n\
+ b _0800EF68\n\
+ .align 2, 0\n\
+ _0800EF58: .4byte 0x00000103\n\
+ _0800EF5C: .4byte 0x00000121\n\
+ _0800EF60:\n\
+ mov r4, r9\n\
+ cmp r4, 0x5\n\
+ bne _0800EF68\n\
+ adds r5, 0x60\n\
+ _0800EF68:\n\
+ mov r7, r8\n\
+ cmp r7, r9\n\
+ blt _0800EEDE\n\
+ _0800EF6E:\n\
+ mov r0, r9\n\
+ cmp r0, 0x7\n\
+ bne _0800EF7C\n\
+ movs r1, 0x80\n\
+ lsls r1, 1\n\
+ adds r5, r1\n\
+ b _0800EF88\n\
+ _0800EF7C:\n\
+ mov r2, r9\n\
+ cmp r2, 0x5\n\
+ bne _0800EF88\n\
+ movs r4, 0xF0\n\
+ lsls r4, 1\n\
+ adds r5, r4\n\
+ _0800EF88:\n\
+ ldr r0, [sp, 0x14]\n\
+ ldr r1, [sp]\n\
+ cmp r0, r1\n\
+ bge _0800EF92\n\
+ b _0800EE16\n\
+ _0800EF92:\n\
+ b _0800F024\n\
+ _0800EF94:\n\
+ movs r6, 0\n\
+ ldr r2, [sp]\n\
+ cmp r6, r2\n\
+ bge _0800F024\n\
+ _0800EF9C:\n\
+ adds r6, 0x1\n\
+ mov r10, r6\n\
+ mov r4, r9\n\
+ cmp r4, 0x6\n\
+ bne _0800EFB4\n\
+ movs r0, 0\n\
+ movs r3, 0xFF\n\
+ _0800EFAA:\n\
+ strb r0, [r5]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800EFAA\n\
+ _0800EFB4:\n\
+ movs r7, 0\n\
+ cmp r7, r9\n\
+ bge _0800F008\n\
+ _0800EFBA:\n\
+ adds r7, 0x1\n\
+ mov r8, r7\n\
+ mov r1, r9\n\
+ lsls r0, r1, 5\n\
+ cmp r1, 0x6\n\
+ bne _0800EFD4\n\
+ movs r1, 0\n\
+ movs r3, 0x1F\n\
+ _0800EFCA:\n\
+ strb r1, [r5]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800EFCA\n\
+ _0800EFD4:\n\
+ adds r1, r0, 0\n\
+ cmp r1, 0\n\
+ ble _0800EFEE\n\
+ adds r3, r1, 0\n\
+ _0800EFDC:\n\
+ ldr r2, [sp, 0x4]\n\
+ ldrb r0, [r2]\n\
+ strb r0, [r5]\n\
+ adds r2, 0x1\n\
+ str r2, [sp, 0x4]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bne _0800EFDC\n\
+ _0800EFEE:\n\
+ mov r4, r9\n\
+ cmp r4, 0x6\n\
+ bne _0800F002\n\
+ movs r0, 0\n\
+ movs r3, 0x1F\n\
+ _0800EFF8:\n\
+ strb r0, [r5]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800EFF8\n\
+ _0800F002:\n\
+ mov r7, r8\n\
+ cmp r7, r9\n\
+ blt _0800EFBA\n\
+ _0800F008:\n\
+ mov r0, r9\n\
+ cmp r0, 0x6\n\
+ bne _0800F01C\n\
+ movs r0, 0\n\
+ movs r3, 0xFF\n\
+ _0800F012:\n\
+ strb r0, [r5]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800F012\n\
+ _0800F01C:\n\
+ mov r6, r10\n\
+ ldr r1, [sp]\n\
+ cmp r6, r1\n\
+ blt _0800EF9C\n\
+ _0800F024:\n\
+ add sp, 0x24\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ ");
+}
+#endif
+
+bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src)
+{
+ struct SpriteSheet dest;
+ void* buffer;
+
+ buffer = AllocZeroed(*((u32*)(&src->data[0])) >> 8);
+ if (!buffer)
+ return TRUE;
+ LZ77UnCompWram(src->data, buffer);
+ dest.data = buffer;
+ dest.size = src->size;
+ dest.tag = src->tag;
+ LoadSpriteSheet(&dest);
+ Free(buffer);
+ return FALSE;
+}
+
+bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src)
+{
+ struct SpritePalette dest;
+ void* buffer;
+
+ buffer = AllocZeroed(*((u32*)(&src->data[0])) >> 8);
+ if (!buffer)
+ return TRUE;
+ LZ77UnCompWram(src->data, buffer);
+ dest.data = buffer;
+ dest.tag = src->tag;
+ LoadSpritePalette(&dest);
+ Free(buffer);
+ return FALSE;
+}
+
+u32 GetDecompressedDataSize(const u8 *ptr)
+{
+ u32 ptr32[1];
+ u8 *ptr8 = (u8 *)ptr32;
+
+ ptr8[0] = ptr[1];
+ ptr8[1] = ptr[2];
+ ptr8[2] = ptr[3];
+ ptr8[3] = 0;
+ return ptr32[0];
+}
+
+void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species)
+{
+ if (species > NUM_SPECIES)
+ LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
+ else
+ LZ77UnCompWram(src->data, buffer);
+}
+
+void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality)
+{
+ bool8 isFrontPic;
+
+ if (src == &gMonFrontPicTable[species])
+ isFrontPic = TRUE; // frontPic
+ else
+ isFrontPic = FALSE; // backPic
+ LoadSpecialPokePic_DontHandleDeoxys(src, dest, species, personality, isFrontPic);
+}
+
+void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic)
+{
+ if (species == SPECIES_UNOWN)
+ {
+ u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C;
+
+ // The other Unowns are separate from Unown A.
+ if (i == 0)
+ i = SPECIES_UNOWN;
+ else
+ i += SPECIES_UNOWN_B - 1;
+ if (!isFrontPic)
+ LZ77UnCompWram(gMonBackPicTable[i].data, dest);
+ else
+ LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
+ }
+ else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
+ {
+ LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
+ }
+ else
+ {
+ LZ77UnCompWram(src->data, dest);
+ }
+ DrawSpindaSpots(species, personality, dest, isFrontPic);
+}
diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c
index a244a1075..0c2c60437 100644
--- a/src/item_menu_icons.c
+++ b/src/item_menu_icons.c
@@ -683,7 +683,7 @@ u8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId)
spritePalette.data = sub_8098974(itemId, 1);
spritePalette.tag = paletteTag;
- LoadCompressedObjectPalette(&spritePalette);
+ LoadCompressedSpritePalette(&spritePalette);
CpuCopy16(&gUnknown_83D427C, &template, sizeof(struct SpriteTemplate));
template.tileTag = tilesTag;
@@ -714,7 +714,7 @@ u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origT
spritePalette.data = sub_8098974(itemId, 1);
spritePalette.tag = paletteTag;
- LoadCompressedObjectPalette(&spritePalette);
+ LoadCompressedSpritePalette(&spritePalette);
CpuCopy16(origTemplate, &template, sizeof(struct SpriteTemplate));
template.tileTag = tilesTag;
diff --git a/src/item_pc.c b/src/item_pc.c
index 5e5e91355..2d30416c9 100644
--- a/src/item_pc.c
+++ b/src/item_pc.c
@@ -452,11 +452,11 @@ static bool8 ItemPc_LoadGraphics(void)
sStateDataPtr->data[0]++;
break;
case 3:
- LoadCompressedObjectPic(&gBagSwapSpriteSheet);
+ LoadCompressedSpriteSheet(&gBagSwapSpriteSheet);
sStateDataPtr->data[0]++;
break;
default:
- LoadCompressedObjectPalette(&gBagSwapSpritePalette);
+ LoadCompressedSpritePalette(&gBagSwapSpritePalette);
sStateDataPtr->data[0] = 0;
return TRUE;
}
diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c
index 49b08a99c..abd29ca11 100644
--- a/src/mevent_8145654.c
+++ b/src/mevent_8145654.c
@@ -402,7 +402,7 @@ void sub_8146060(void)
}
if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
{
- sub_800F034(&gUnknown_8467F58);
+ LoadCompressedSpriteSheetUsingHeap(&gUnknown_8467F58);
LoadSpritePalette(&gUnknown_8467F60[gUnknown_203F3C8->unk_0170->textPal4]);
for (; r7 < gUnknown_203F3C8->unk_0000.unk_09; r7++)
{
diff --git a/src/oak_speech.c b/src/oak_speech.c
index d444899f6..14e7c87d0 100644
--- a/src/oak_speech.c
+++ b/src/oak_speech.c
@@ -1613,7 +1613,7 @@ static void CreateNidoranFSprite(u8 taskId)
u8 spriteId;
DecompressPicFromTable(gUnknown_8235194, sub_8044E00(0), SPECIES_NIDORAN_F);
- sub_800F078(&gUnknown_82373F4);
+ LoadCompressedSpritePaletteUsingHeap(&gUnknown_82373F4);
SetMultiuseSpriteTemplateToPokemon(SPECIES_NIDORAN_F, 0);
spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x60, 0x60, 1);
gSprites[spriteId].callback = SpriteCallbackDummy;
@@ -1635,9 +1635,9 @@ static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 st
switch (state)
{
case 0:
- LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[0]);
- LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[1]);
- LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[2]);
+ LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[0]);
+ LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[1]);
+ LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[2]);
LoadSpritePalette(&sOakSpeech_PikaSpritePal);
spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[0], 0x10, 0x11, 2);
gSprites[spriteId].oam.priority = 0;
@@ -1654,7 +1654,7 @@ static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 st
gTasks[taskId].data[9] = spriteId;
break;
case 1:
- LoadCompressedObjectPic(&sOakSpeech_GrassPlatformSpriteSheet);
+ LoadCompressedSpriteSheet(&sOakSpeech_GrassPlatformSpriteSheet);
LoadSpritePalette(&sOakSpeech_GrassPlatformSpritePal);
for (i = 0; i < 3; i++)
{
diff --git a/src/tm_case.c b/src/tm_case.c
index 6a9e6d864..54c50cc71 100644
--- a/src/tm_case.c
+++ b/src/tm_case.c
@@ -469,7 +469,7 @@ static bool8 HandleLoadTMCaseGraphicsAndPalettes(void)
sTMCaseDynamicResources->seqId++;
break;
case 4:
- LoadCompressedObjectPic(&sTMSpriteSheet);
+ LoadCompressedSpriteSheet(&sTMSpriteSheet);
sTMCaseDynamicResources->seqId++;
break;
default:
diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c
index ecd889d80..25a8d4515 100644
--- a/src/trainer_pokemon_sprites.c
+++ b/src/trainer_pokemon_sprites.c
@@ -109,7 +109,7 @@ void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 palett
else
{
sCreatingSpriteTemplate.paletteTag = paletteTag;
- LoadCompressedObjectPalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));
+ LoadCompressedSpritePalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));
}
}
else
@@ -122,7 +122,7 @@ void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 palett
else
{
sCreatingSpriteTemplate.paletteTag = paletteTag;
- LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[species]);
+ LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[species]);
}
}
}
diff --git a/src/unk_815C980.c b/src/unk_815C980.c
index b90d2fb03..09b92c834 100644
--- a/src/unk_815C980.c
+++ b/src/unk_815C980.c
@@ -128,7 +128,7 @@ bool32 sub_815CA40(u32 id, s32 arg1, const struct UnkStruct3 *arg2)
compObjectPic = *(struct CompressedSpriteSheet*)(arg2->spriteSheet);
compObjectPic.size = GetDecompressedDataSize(arg2->spriteSheet->data);
- gUnknown_203F454->array[id].tileStart = LoadCompressedObjectPic(&compObjectPic);
+ gUnknown_203F454->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
}
if (gUnknown_203F454->array[id].tileStart == 0xFFFF)
diff --git a/src/unk_815F138.c b/src/unk_815F138.c
index 8941f1559..96005a07b 100644
--- a/src/unk_815F138.c
+++ b/src/unk_815F138.c
@@ -209,7 +209,7 @@ void sub_815F564(u16 tilesTag, u16 palTag)
struct SpritePalette spritePalette = {gUnknown_847A328};
spriteSheet.tag = tilesTag;
spritePalette.tag = palTag;
- LoadCompressedObjectPic(&spriteSheet);
+ LoadCompressedSpriteSheet(&spriteSheet);
LoadSpritePalette(&spritePalette);
}