diff --git a/data/unk_9D02950.s b/data/unk_9D02950.s index 6dce53be1..046bffd11 100644 --- a/data/unk_9D02950.s +++ b/data/unk_9D02950.s @@ -1,6 +1,5 @@ .section .rodata .align 2 -.if MODERN == 0 + .incbin "data/unknown_unused/unk_9D02950.bin" -.endif diff --git a/src/ground_bg.c b/src/ground_bg.c index 1e1f29b2d..6b097db2f 100644 --- a/src/ground_bg.c +++ b/src/ground_bg.c @@ -603,68 +603,68 @@ static void _UncompressCell(void *dst_, u16 *chunkDimensions, const void *src_, static const u8 *BmaLayerNrlDecompressor(u16 **dstArray, const void *bmaData, SubStruct_52C *a2, BmaHeader *bmaHeader) { - s32 i, j, k, l; + s32 i, k, j, l; const u8 *src = bmaData; for (i = 0; i < a2->numLayers; i++) { + // Interestingly enough it's swapped in Sky dstArray[a2->numLayers - i - 1] u16 *dst = dstArray[i]; - for (j = 0; j < bmaHeader->mapHeightChunks; j++) { k = 0; if (j == 0) { while (k < bmaHeader->mapWidthChunks) { - s32 val = *src++; - if (val > 191) { - for (l = 191; l < val; l++) { + s32 cmd = *src++; + if (cmd >= 0xc0) { + for (l = 0xC0; l <= cmd; l++) { s32 dstVal = src[0] | (src[1] << 8) | (src[2] << 16); src += 3; *dst++ = dstVal & 0xFFF; *dst++ = (dstVal >> 12) & 0xFFF; } - k += (val - 191) * 2; + k += (cmd - 0xBF) * 2; } - else if (val > 127) { + else if (cmd >= 0x80) { s32 dstVal = src[0] | (src[1] << 8) | (src[2] << 16); src += 3; - for (l = 127; l < val; l++) { + for (l = 0x80; l <= cmd; l++) { *dst++ = dstVal & 0xFFF; *dst++ = (dstVal >> 12) & 0xFFF; } - k += (val - 127) * 2; + k += (cmd - 0x7F) * 2; } else { - for (l = 0; l <= val; l++) { + for (l = 0; l <= cmd; l++) { *dst++ = 0; *dst++ = 0; } - k += (val + 1) * 2; + k += (cmd + 1) * 2; } } } else { u16 *ptrVal = dst - 64; while (k < bmaHeader->mapWidthChunks) { - s32 val = *src++; - if (val > 191) { - for (l = 191; l < val; l++) { + s32 cmd = *src++; + if (cmd >= 0xC0) { + for (l = 0xC0; l <= cmd; l++) { s32 dstVal = src[0] | (src[1] << 8) | (src[2] << 16); src += 3; - *dst++ = (dstVal & 0xFFF) ^ *ptrVal++; - *dst++ = ((dstVal >> 12) & 0xFFF) ^ *ptrVal++; + *dst++ = *ptrVal++ ^ (dstVal & 0xFFF); + *dst++ = *ptrVal++ ^ ((dstVal >> 12) & 0xFFF); } - k += (val - 191) * 2; + k += (cmd - 0xBF) * 2; } - else if (val > 127) { + else if (cmd >= 0x80) { s32 dstVal = src[0] | (src[1] << 8) | (src[2] << 16); src += 3; - for (l = 127; l < val; l++) { - *dst++ = (dstVal & 0xFFF) ^ *ptrVal++; - *dst++ = ((dstVal >> 12) & 0xFFF) ^ *ptrVal++; + for (l = 0x80; l <= cmd; l++) { + *dst++ = *ptrVal++ ^ (dstVal & 0xFFF); + *dst++ = *ptrVal++ ^ ((dstVal >> 12) & 0xFFF); } - k += (val - 127) * 2; + k += (cmd - 0x7F) * 2; } else { - for (l = 0; l <= val; l++) { + for (l = 0; l <= cmd; l++) { *dst++ = *ptrVal++; *dst++ = *ptrVal++; } - k += (val + 1) * 2; + k += (cmd + 1) * 2; } } } diff --git a/src/unk_dungeon_load_maybe.c b/src/unk_dungeon_load_maybe.c index 75e1dd07c..e1a92d80b 100644 --- a/src/unk_dungeon_load_maybe.c +++ b/src/unk_dungeon_load_maybe.c @@ -87,7 +87,13 @@ void sub_80ADD9C(OpenedFile **a0, OpenedFile **a1, u32 *a2, void *a3, u16 *a4, c static s32 sub_80ADF8C(s32 a0, s32 a1, s32 a2, s32 a3, u16 *a4, s32 a5) { s32 ret = a5; - if (a0 >= 0 && a1 >= 0 && a0 < a2 && a1 < a3) { + if (a0 < 0) + return ret; + if (a1 < 0) + return ret; + if (a0 >= a2) + return ret; + if (a1 < a3) { ret = a4[a0 + (a1 * a2)]; } return ret;