diff --git a/README.md b/README.md index c1445f28..1a855e42 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fd As of May 12, 2025, this is our current score: -    Decomp progress: 86.85% +    Decomp progress: 86.98%     Documentation progress: 56.95% @@ -121,16 +121,16 @@ As of May 12, 2025, this is our current score: ``` ===================================================================== ADVENTURE ONE (ASM -> C Decompilation) - --------------- 86.85% Complete (88.01% NON_MATCHING) --------------- - # Decompiled functions: 1887 - # GLOBAL_ASM remaining: 64 + --------------- 86.98% Complete (88.14% NON_MATCHING) --------------- + # Decompiled functions: 1888 + # GLOBAL_ASM remaining: 63 # NON_MATCHING functions: 7 - # NON_EQUIVALENT WIP functions: 22 + # NON_EQUIVALENT WIP functions: 21 ---------------------------- Game Status ---------------------------- Balloons: 40/47, Keys: 4/4, Trophies: 4/5 T.T. Amulets: 4/4, Wizpig Amulets: 4/4 --------------------------------------------------------------------- - We are racing in Darkmoon Caverns. (Lap 1/3) + We are racing in Darkmoon Caverns. (Lap 2/3) ===================================================================== ADVENTURE TWO (Cleanup & Documentation) -------------------------- 56.95% Complete -------------------------- diff --git a/src/textures_sprites.c b/src/textures_sprites.c index 6d51b417..8d303680 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -416,26 +416,21 @@ UNUSED s32 sprite_table_size(void) { return gSpriteTableSize; } -#ifdef NON_EQUIVALENT -// Minor matching issues with loops, but should be functionally the same. -// Official Name: texLoadTexture +// Official Name: texLoadTexture TextureHeader *load_texture(s32 arg0) { - s32 assetSection; + TextureHeader *tex; + TextureHeader *texTemp; + u32 temp_a1; s32 assetIndex; s32 assetOffset; s32 assetSize; - s32 assetTable; - s32 texIndex; - s32 temp_a1; s32 paletteOffset; + s32 assetSection; + s32 texIndex; + s32 assetTable; s32 i; - u8 *alignedAddress; - TextureHeader *tex; - TextureHeader *texTemp; - s32 numberOfTextures; + u16 numberOfTextures; s32 sp3C; - s32 temp_a0; - s32 temp_v0_5; arg0 &= 0xFFFF; assetIndex = arg0; @@ -450,8 +445,8 @@ TextureHeader *load_texture(s32 arg0) { arg0 = 0; } for (i = 0; i < gNumberOfLoadedTextures; i++) { - if (arg0 == gTextureCache[(i << 1)]) { - tex = (TextureHeader *) gTextureCache[(i << 1) + 1]; + if (arg0 == gTextureCache[ASSETCACHE_ID(i)]) { + tex = (TextureHeader *) gTextureCache[ASSETCACHE_PTR(i)]; tex->numberOfInstances++; return tex; } @@ -459,39 +454,38 @@ TextureHeader *load_texture(s32 arg0) { assetOffset = gTextureAssetTable[assetTable][assetIndex]; assetSize = gTextureAssetTable[assetTable][assetIndex + 1] - assetOffset; load_asset_to_address(assetSection, (u32) gTempTextureHeader, assetOffset, 0x28); - numberOfTextures = (gTempTextureHeader->header.numOfTextures >> 8) & 0xFFFF; + numberOfTextures = gTempTextureHeader->header.numOfTextures >> 8; if (!gTempTextureHeader->header.isCompressed) { - tex = (TextureHeader *) mempool_alloc((numberOfTextures * 0x60) + assetSize, gTexColourTag); + tex = (TextureHeader *) mempool_alloc(numberOfTextures * 0x60 + assetSize, gTexColourTag); if (tex == NULL) { return NULL; } load_asset_to_address(assetSection, (u32) tex, assetOffset, assetSize); } else { - temp_v0_5 = byteswap32((u8 *) &gTempTextureHeader->uncompressedSize); - temp_a0 = (numberOfTextures * 0x60) + temp_v0_5; - sp3C = temp_v0_5 + 0x20; - tex = (TextureHeader *) mempool_alloc(temp_a0 + 0x20, gTexColourTag); + sp3C = byteswap32((u8 *) &gTempTextureHeader->uncompressedSize) + sizeof(TextureHeader); + tex = (TextureHeader *) mempool_alloc(numberOfTextures * 0x60 + sp3C, gTexColourTag); if (tex == NULL) { return NULL; } - temp_a1 = ((s32) tex + sp3C) - assetSize; - temp_a1 -= temp_a1 % 0x10; + temp_a1 = (((s32) tex + sp3C) - assetSize); + temp_a1 = (s32) temp_a1 - (s32) temp_a1 % 16; load_asset_to_address(assetSection, temp_a1, assetOffset, assetSize); - gzip_inflate((u8 *) (temp_a1 + 0x20), (u8 *) tex); - assetSize = sp3C - 0x20; + gzip_inflate((u8 *) (temp_a1 + sizeof(TextureHeader)), (u8 *) tex); + assetSize = sp3C - sizeof(TextureHeader); } texIndex = -1; for (i = 0; i < gNumberOfLoadedTextures; i++) { - if (gTextureCache[(i << 1)] == -1) { + if (gTextureCache[ASSETCACHE_ID(i)] == -1) { texIndex = i; } } if (texIndex == -1) { - texIndex = gNumberOfLoadedTextures++; + texIndex = gNumberOfLoadedTextures; + gNumberOfLoadedTextures++; } - gTextureCache[(texIndex << 1)] = arg0; - gTextureCache[(texIndex << 1) + 1] = (s32) tex; + gTextureCache[ASSETCACHE_ID(texIndex)] = arg0; + gTextureCache[ASSETCACHE_PTR(texIndex)] = (s32) tex; paletteOffset = -1; if ((tex->format & 0xF) == TEX_FORMAT_CI4) { if (D_80126344 == 0) { @@ -510,28 +504,26 @@ TextureHeader *load_texture(s32 arg0) { paletteOffset = gCiPalettesSize - 128; } D_80126344 = 0; + + assetOffset = (s32)align16((u8 *) ((s32) tex + assetSize)); texTemp = tex; - alignedAddress = align16((u8 *) ((s32) texTemp + assetSize)); for (i = 0; i < numberOfTextures; i++) { - material_init(texTemp, (Gfx *) alignedAddress); + material_init(texTemp, (Gfx *) assetOffset); if (paletteOffset >= 0) { texTemp->ciPaletteOffset = paletteOffset; - alignedAddress += 0x30; // I'm guessing it takes 6 f3d commands to load the palette + assetOffset += 0x30; // I'm guessing it takes 6 f3d commands to load the palette } - alignedAddress += 0x60; // I'm guessing it takes 12 f3d commands to load the texture + assetOffset += 0x60; // I'm guessing it takes 12 f3d commands to load the texture texTemp = (TextureHeader *) ((s32) texTemp + texTemp->textureSize); } if (gCiPalettesSize >= 0x280) { return NULL; } - if (gNumberOfLoadedTextures >= 701) { + if (gNumberOfLoadedTextures > 700) { return NULL; } return tex; } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/textures_sprites/load_texture.s") -#endif /** * This function attempts to free the texture from memory.