diff --git a/README.md b/README.md index e49495fc..470afe39 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of May 17, 2025, this is our current score: +As of May 18, 2025, this is our current score: -    Decomp progress: 87.80% +    Decomp progress: 87.92%     Documentation progress: 56.98% @@ -117,20 +117,20 @@ s32 is_drumstick_unlocked(void) { ``` -As of May 17, 2025, this is our current score: +As of May 18, 2025, this is our current score: ``` ===================================================================== ADVENTURE ONE (ASM -> C Decompilation) - --------------- 87.80% Complete (88.90% NON_MATCHING) --------------- - # Decompiled functions: 1896 - # GLOBAL_ASM remaining: 55 + --------------- 87.92% Complete (89.02% NON_MATCHING) --------------- + # Decompiled functions: 1897 + # GLOBAL_ASM remaining: 54 # NON_MATCHING functions: 6 # NON_EQUIVALENT WIP functions: 16 ---------------------------- Game Status ---------------------------- - Balloons: 40/47, Keys: 4/4, Trophies: 4/5 + Balloons: 41/47, Keys: 4/4, Trophies: 4/5 T.T. Amulets: 4/4, Wizpig Amulets: 4/4 --------------------------------------------------------------------- - We are racing in Darkmoon Caverns. (Lap 3/3) + We are racing in Spaceport Alpha. (Lap 1/3) ===================================================================== ADVENTURE TWO (Cleanup & Documentation) -------------------------- 56.98% Complete -------------------------- diff --git a/src/game_ui.c b/src/game_ui.c index 7726167b..4d385c5c 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -337,13 +337,13 @@ void hud_init(UNUSED s32 viewportCount) { gAssetHudElements->entry[i] = NULL; } gAssetHudElements->entry[HUD_ELEMENT_UNK_01] = - func_8007C12C(gAssetHudElementIds[HUD_ELEMENT_UNK_01] & 0x3FFF, 1); // ID: 86 - 0x56 + tex_load_sprite(gAssetHudElementIds[HUD_ELEMENT_UNK_01] & 0x3FFF, 1); // ID: 86 - 0x56 gAssetHudElements->entry[HUD_ELEMENT_UNK_17] = - func_8007C12C(gAssetHudElementIds[HUD_ELEMENT_UNK_17] & 0x3FFF, 1); // ID: 291 - 0x123 + tex_load_sprite(gAssetHudElementIds[HUD_ELEMENT_UNK_17] & 0x3FFF, 1); // ID: 291 - 0x123 gAssetHudElements->entry[HUD_ELEMENT_UNK_08] = - func_8007C12C(gAssetHudElementIds[HUD_ELEMENT_UNK_08] & 0x3FFF, 1); // ID: 156 - 0x9C + tex_load_sprite(gAssetHudElementIds[HUD_ELEMENT_UNK_08] & 0x3FFF, 1); // ID: 156 - 0x9C gAssetHudElements->entry[HUD_ELEMENT_UNK_11] = - func_8007C12C(gAssetHudElementIds[HUD_ELEMENT_UNK_11] & 0x3FFF, 1); // ID: 60 - 0x3C + tex_load_sprite(gAssetHudElementIds[HUD_ELEMENT_UNK_11] & 0x3FFF, 1); // ID: 60 - 0x3C if (gNumActivePlayers != 3) { playerCount = gNumActivePlayers; } else { @@ -3298,7 +3298,7 @@ void minimap_init(LevelModel *model) { gMinimapBlue = model->minimapColor & 0xFF; load_sprite_info(model->minimapSpriteIndex, &gMinimapDotOffsetX, &gMinimapDotOffsetY, &sp2C, &sp2C, &sp2C); func_8007CA68(model->minimapSpriteIndex, 0, &D_80126D14, &D_80126D18, &sp2C); - model->minimapSpriteIndex = (s32) func_8007C12C(model->minimapSpriteIndex, 1); + model->minimapSpriteIndex = (s32) tex_load_sprite(model->minimapSpriteIndex, 1); } /** @@ -3844,7 +3844,7 @@ void hud_element_render(Gfx **dList, MatrixS **mtx, Vertex **vtxList, HudElement if ((spriteElementId & ASSET_MASK_TEXTURE) == ASSET_MASK_TEXTURE) { gAssetHudElements->entry[hud->spriteID] = load_texture(spriteElementId & 0x3FFF); } else if (spriteElementId & ASSET_MASK_SPRITE) { - gAssetHudElements->entry[hud->spriteID] = func_8007C12C(spriteElementId & 0x3FFF, 1); + gAssetHudElements->entry[hud->spriteID] = tex_load_sprite(spriteElementId & 0x3FFF, 1); } else if (spriteElementId & ASSET_MASK_OBJECT) { objEntry.common.objectID = spriteElementId & 0xFF; objEntry.common.size = ((gAssetHudElementIds[hud->spriteID] & 0x100) >> 1) | sizeof(LevelObjectEntryCommon); diff --git a/src/memory.h b/src/memory.h index a63470a7..9fdc1735 100644 --- a/src/memory.h +++ b/src/memory.h @@ -38,6 +38,7 @@ typedef enum MempoolFlags { #define COLOUR_TAG_YELLOW 0xFFFF00FF // Textures #define COLOUR_TAG_MAGENTA 0xFF00FFFF +#define COLOUR_TAG_LIME 0x00FF0163 // Audio #define COLOUR_TAG_CYAN 0x00FFFFFF // Buffers and heaps diff --git a/src/menu.c b/src/menu.c index 1af79fc3..f7697a91 100644 --- a/src/menu.c +++ b/src/menu.c @@ -13747,7 +13747,7 @@ void menu_asset_load(s32 assetID) { if ((i & ASSET_MASK_TEXTURE) == ASSET_MASK_TEXTURE) { gMenuAssets[assetID] = load_texture(i & 0x3FFF); } else if (i & ASSET_MASK_SPRITE) { - gMenuAssets[assetID] = func_8007C12C(i & 0x3FFF, 0); + gMenuAssets[assetID] = tex_load_sprite(i & 0x3FFF, 0); } else if (i & ASSET_MASK_OBJECT) { if (gMenuElementIdCount) {} // Fakematch entry.objectID = i & 0xFFFF; diff --git a/src/objects.c b/src/objects.c index f8465c2e..fb3fe080 100644 --- a/src/objects.c +++ b/src/objects.c @@ -372,7 +372,7 @@ void racerfx_alloc(s32 numberOfVertices, s32 numberOfTriangles) { gBoostEffectObjects[i]->properties.common.unk4 = 0; miscAsset20[i].unk70 = 0; miscAsset20[i].unk74 = 0.0f; - miscAsset20[i].unk78 = (Sprite *) func_8007C12C(miscAsset20[i].unk6C, 0); + miscAsset20[i].unk78 = (Sprite *) tex_load_sprite(miscAsset20[i].unk6C, 0); miscAsset20[i].unk7C = load_texture(miscAsset20[i].unk6E); miscAsset20[i].unk72 = get_random_number_from_range(0, 255); miscAsset20[i].unk73 = 0; @@ -1904,7 +1904,7 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 arg1) { } } else { for (; var_a2 < assetCount; var_a2++) { - curObj->unk68[var_a2] = (Object_68 *) func_8007C12C(curObj->segment.header->modelIds[var_a2], 10); + curObj->unk68[var_a2] = (Object_68 *) tex_load_sprite(curObj->segment.header->modelIds[var_a2], 10); if (curObj->unk68[var_a2] == NULL) { var_v1 = TRUE; } @@ -2298,7 +2298,7 @@ Object *func_8000FD54(s32 objectHeaderIndex) { } } else { for (i = 0; i < numModelIds; i++) { - object->unk68[i] = (Object_68 *) func_8007C12C(object->segment.header->modelIds[i], 10); + object->unk68[i] = (Object_68 *) tex_load_sprite(object->segment.header->modelIds[i], 10); if (object->unk68[i] == NULL) { failedToLoadModel = TRUE; } diff --git a/src/particles.c b/src/particles.c index 39c45c57..c37b79e6 100644 --- a/src/particles.c +++ b/src/particles.c @@ -419,7 +419,7 @@ void init_particle_buffers(s32 maxTriangleParticles, s32 maxRectangleParticles, D_800E2E60 = mempool_alloc_safe(D_800E2E64 * 4, COLOUR_TAG_BLUE); for (i = 0; i < D_800E2E64; i++) { - D_800E2E60[i] = (Sprite *) func_8007C12C(asset2F[i] & 0x3FFF, 1); + D_800E2E60[i] = (Sprite *) tex_load_sprite(asset2F[i] & 0x3FFF, 1); } mempool_free(asset2F); @@ -1556,7 +1556,7 @@ Particle *create_general_particle(Object *obj, ParticleEmitter *emitter) { noTexture = FALSE; particle->textureFrameStep = descriptor->textureFrameStep; if (particle->kind == PARTICLE_KIND_SPRITE) { - particle->sprite = (Sprite *) func_8007C12C(descriptor->textureID, 0); + particle->sprite = (Sprite *) tex_load_sprite(descriptor->textureID, 0); if (particle->sprite != NULL) { if (particle->sprite->frames[0]->flags & 4) { if (particle->descFlags & PARTICLE_DESC_FLAG_1000) { diff --git a/src/textures_sprites.c b/src/textures_sprites.c index 309dfff7..7f6d1517 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -868,10 +868,119 @@ void material_load_simple(Gfx **dList, s32 flags) { } } -/** - * Official Name: texLoadSprite - */ -#pragma GLOBAL_ASM("asm/nonmatchings/textures_sprites/func_8007C12C.s") +Sprite *tex_load_sprite(s32 spriteID, s32 arg1) { + Sprite *refSprite; + Sprite *newSprite; + s32 cacheNum; + Sprite *sprite; + TextureHeader *tex; + s32 i; + s32 size; + s8 allocFailed; + s8 cacheFull; + s16 frameCount; + s32 allocSize; + + D_8012635C = arg1; + if (spriteID < 0 || spriteID >= gSpriteTableSize) { + return NULL; + } + + for (i = 0, cacheFull = 0; i < gSpriteCacheCount; i++) { + if (spriteID == gSpriteCache[ASSETCACHE_ID(i)]) { + refSprite = (Sprite *) gSpriteCache[ASSETCACHE_PTR(i)]; + refSprite->numberOfInstances++; + return refSprite; + } + } + + cacheNum = -1; + for (i = 0; i < gSpriteCacheCount; i++) { + // @fake + if (newSprite) {} + if (gSpriteCache[ASSETCACHE_ID(i)] == -1) { + cacheNum = i; + } + } + + if (cacheNum == -1) { + cacheFull = TRUE; + cacheNum = gSpriteCacheCount; + gSpriteCacheCount++; + } + + size = gSpriteOffsetTable[spriteID]; + sprite = gCurrentSprite; + load_asset_to_address(12, (u32) sprite, size, gSpriteOffsetTable[spriteID + 1] - size); + + frameCount = sprite->unkC.val[sprite->numberOfFrames]; + size = frameCount * 4; + allocSize = size * sizeof(Vertex); + allocSize += size << 3; + allocSize += sprite->numberOfFrames * sizeof(Gfx); + allocSize += frameCount << 4 << 1; + allocSize += size; + allocSize += (s32) align16((u8 *) 0x10); + allocSize += (s32) align16((u8 *) (sprite->numberOfFrames * 4)); + newSprite = (Sprite *) mempool_alloc(allocSize, COLOUR_TAG_MAGENTA); + if (newSprite == NULL) { + if (cacheFull) { + gSpriteCacheCount--; + } + + return NULL; + } + + D_80126368 = (Triangle *) ((s32) newSprite + (s32) align16((u8 *) sizeof(Sprite)) + + (s32) align16((u8 *) (sprite->numberOfFrames * 4))); + D_80126364 = (Gfx *) (&((u8 *) D_80126368)[frameCount << 5]); // `<< 5` is `sizeof(Triangle) * 2` + D_80126360 = (Vertex *) ((Gfx *) (((s32) & ((u8 *) D_80126364)[frameCount << 5]) + (sprite->numberOfFrames << 3))); + newSprite->gfx[0] = (Gfx *) &((u8 *) D_80126360)[frameCount * sizeof(Vertex) * 4]; + + allocFailed = FALSE; + for (i = 0; i < frameCount; i++) { + gTexColourTag = COLOUR_TAG_LIME; + tex = load_texture(sprite->baseTextureId + i); + newSprite->frames[i] = tex; + if (newSprite->frames[i] == NULL) { + allocFailed = TRUE; + } + + gTexColourTag = COLOUR_TAG_MAGENTA; + D_80126344 = 1; + } + + D_80126344 = 0; + if (allocFailed) { + for (i = 0; i < frameCount; i++) { + tex = (TextureHeader *) newSprite->frames[i]; + if (tex != NULL) { + tex_free(tex); + } + } + if (cacheFull) { + gSpriteCacheCount--; + } + mempool_free(newSprite); + return NULL; + } + + newSprite->numberOfFrames = frameCount; + newSprite->baseTextureId = sprite->numberOfFrames; + for (i = 0; i < sprite->numberOfFrames; i++) { + newSprite->unkC.ptr[i] = (u8 *) D_80126364; + func_8007CDC0(sprite, newSprite, i); + } + + if (gSpriteCacheCount >= 100) { + return NULL; + } + + gSpriteCache[ASSETCACHE_ID(cacheNum)] = spriteID; + gSpriteCache[ASSETCACHE_PTR(cacheNum)] = (s32) newSprite; + newSprite->numberOfInstances = 1; + return newSprite; +} /** * Gets the sprite cache index from the argument. @@ -1036,7 +1145,7 @@ void func_8007CA68(s32 arg0, s32 arg1, s32 *arg2, s32 *arg3, s32 *arg4) { // Must be on the same line. (maybe a macro?) // clang-format off sprite = gCurrentSprite; \ - load_asset_to_address(12, sprite, temp_a2, gSpriteOffsetTable[arg0 + 1] - temp_a2); + load_asset_to_address(12, (u32)sprite, temp_a2, gSpriteOffsetTable[arg0 + 1] - temp_a2); // clang-format on if (sprite->numberOfFrames < arg1) { diff --git a/src/textures_sprites.h b/src/textures_sprites.h index 09d76c87..f0f55096 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -168,7 +168,7 @@ s32 load_sprite_info(s32 spriteIndex, s32 *numOfInstancesOut, s32 *unkOut, s32 * s32 *sizeOut); // Non Matching void gfx_init_basic_xlu(Gfx **dList, u32 index, u32 primitiveColor, u32 environmentColor); // Non Matching void func_8007CA68(s32 spriteID, s32 arg1, s32 *arg2, s32 *arg3, s32 *arg4); // Non Matching -MemoryPoolSlot *func_8007C12C(s32 spriteID, s32 arg1); // Non Matching +Sprite *tex_load_sprite(s32 spriteID, s32 arg1); void tex_init_textures(void); // Non Matching void material_set_blinking_lights(Gfx **dList, TextureHeader *texture_list, u32 flags, s32 texture_index); // Non Matching diff --git a/src/weather.c b/src/weather.c index 56b6ed45..4a48dc37 100644 --- a/src/weather.c +++ b/src/weather.c @@ -806,7 +806,7 @@ void rain_init(s32 intensity, s32 opacity) { gRainVertexFlip = 0; gRainGfx[0].tex = load_texture(gWeatherAssetTable[1]); gRainGfx[1].tex = load_texture(gWeatherAssetTable[1]); - gRainSplashGfx = (Sprite *) func_8007C12C(gWeatherAssetTable[3], 0); + gRainSplashGfx = (Sprite *) tex_load_sprite(gWeatherAssetTable[3], 0); gWeatherType = WEATHER_RAIN; } diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index 10e15f7a..01586b7f 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -1283,7 +1283,7 @@ material_set = 0x8007B7F8; material_set_blinking_lights = 0x8007BD6C; sprite_opaque = 0x8007C22C; material_load_simple = 0x8007C244; -func_8007C12C = 0x8007C43C; +tex_load_sprite = 0x8007C43C; sprite_cache_index = 0x8007C83C; tex_asset_size = 0x8007C88C; func_8007C660 = 0x8007C970; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 4529e55c..d50f9e13 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -1279,7 +1279,7 @@ material_set = 0x8007B4E8; material_set_blinking_lights = 0x8007BA5C; sprite_opaque = 0x8007BF1C; material_load_simple = 0x8007BF34; -func_8007C12C = 0x8007C12C; +tex_load_sprite = 0x8007C12C; sprite_cache_index = 0x8007C52C; tex_asset_size = 0x8007C57C; func_8007C660 = 0x8007C660; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index e25cbb51..d163fbd9 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -1202,7 +1202,7 @@ material_set = 0x8007B938; material_set_blinking_lights = 0x8007BEAC; sprite_opaque = 0x8007C36C; material_load_simple = 0x8007C384; -func_8007C12C = 0x8007C57C; +tex_load_sprite = 0x8007C57C; sprite_cache_index = 0x8007C97C; tex_asset_size = 0x8007C9CC; func_8007C660 = 0x8007CAB0; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index 54cb17dd..aceaf63b 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -1279,7 +1279,7 @@ material_set = 0x8007B4E8; material_set_blinking_lights = 0x8007BA5C; sprite_opaque = 0x8007BF1C; material_load_simple = 0x8007BF34; -func_8007C12C = 0x8007C12C; +tex_load_sprite = 0x8007C12C; sprite_cache_index = 0x8007C52C; tex_asset_size = 0x8007C57C; func_8007C660 = 0x8007C660; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index d3ccfbe8..1a8d0653 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -1202,7 +1202,7 @@ material_set = 0x8007B938; material_set_blinking_lights = 0x8007BEAC; sprite_opaque = 0x8007C36C; material_load_simple = 0x8007C384; -func_8007C12C = 0x8007C57C; +tex_load_sprite = 0x8007C57C; sprite_cache_index = 0x8007C97C; tex_asset_size = 0x8007C9CC; func_8007C660 = 0x8007CAB0;