diff options
| author | MegaMech <MegaMech@users.noreply.github.com> | 2024-08-03 20:57:07 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-03 20:57:07 -0600 |
| commit | c270c11c9bee22a2c6fd9395f21f389e18c8afed (patch) | |
| tree | 390538449d09a778c6f85931fffdeb2e1b0f066d /src/update_objects.c | |
| parent | 016b16a4845d51d32bbff97c29dbcf5509471e55 (diff) | |
Lakitu fix (#35)
* Fix menu bug
* Fix undefined behaviour
* Fix kart textures
* Fix boost texture
* Rename as per review
* Fix buffer overflows
* Fix lakitu progress
* Fix race starter character
---------
Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com>
Diffstat (limited to 'src/update_objects.c')
| -rw-r--r-- | src/update_objects.c | 103 |
1 files changed, 55 insertions, 48 deletions
diff --git a/src/update_objects.c b/src/update_objects.c index ea7a66a7a..4dba217dc 100644 --- a/src/update_objects.c +++ b/src/update_objects.c @@ -730,7 +730,7 @@ void func_80073404(s32 objectIndex, u8 arg1, u8 arg2, Vtx *arg3) { gObjectList[objectIndex].status = 0; } -void init_texture_object(s32 objectIndex, u8 *texture, u8* arg2, u8 arg3, u16 arg4) { +void init_texture_object(s32 objectIndex, u8 *texture, const char **arg2, u8 arg3, u16 arg4) { gObjectList[objectIndex].tlutList = texture; gObjectList[objectIndex].textureList = arg2; gObjectList[objectIndex].textureWidth = arg3; @@ -762,7 +762,7 @@ void update_neon_texture(s32 objectIndex) { void func_80073514(s32 objectIndex) { gObjectList[objectIndex].activeTLUT = gObjectList[objectIndex].tlutList; - gObjectList[objectIndex].activeTexture = gObjectList[objectIndex].textureList + (gObjectList[objectIndex].textureWidth * gObjectList[objectIndex].textureHeight * gObjectList[objectIndex].itemDisplay); + gObjectList[objectIndex].activeTexture = gObjectList[objectIndex].textureList[gObjectList[objectIndex].itemDisplay]; } UNUSED void func_80073568() { @@ -1201,20 +1201,20 @@ void func_800744CC(void) { } } -void func_80074510(uintptr_t devAddr, void *vaddr, size_t nbytes) { - u8 *texture = (u8 *) LOAD_ASSET(devAddr); +uintptr_t devaddr2; + +void func_80074510(const char **lakituTexturePtr, const char* devAddr, size_t vaddr, size_t nbytes) { func_800744CC(); - //osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, devAddr, vaddr, nbytes, &gDmaMesgQueue); - memcpy(vaddr, texture, nbytes); + lakituTexturePtr[vaddr] = devAddr; D_8018D224 = 1; } -void func_80074574(u8 *arg0, void *arg1, u16 arg2, u16 arg3) { - func_80074510((uintptr_t) (arg0), arg1, arg2 * arg3); +void func_80074574(const char **lakituTexturePtr, const char *devAddr, size_t vaddr, u16 width, u16 height) { + func_80074510(lakituTexturePtr, devAddr, vaddr, width * height); } //! @todo arg1 should likely be a u8 * -void func_800745C8(s32 objectIndex, uintptr_t arg1) { +void func_800745C8(s32 objectIndex, const char **lakituTexturePtr) { s32 phi_a1; if ((gObjectList[objectIndex].status & 1) != 0) { @@ -1228,28 +1228,28 @@ void func_800745C8(s32 objectIndex, uintptr_t arg1) { phi_a1 = 1; } - gObjectList[objectIndex].activeTexture = (u8 *) (gObjectList[objectIndex].textureWidth * gObjectList[objectIndex].textureHeight * phi_a1) + arg1; + gObjectList[objectIndex].activeTexture = lakituTexturePtr[phi_a1]; func_800744A0(objectIndex); } } -void func_8007466C(s32 objectIndex, uintptr_t arg1) { +void func_8007466C(s32 objectIndex, const char **lakituTexturePtr) { s32 phi_a1; if ((gObjectList[objectIndex].status & 1) != 0) { // I have no idea why this typecase works - gObjectList[objectIndex].activeTLUT = (u8*) ((u32*)gObjectList[objectIndex].tlutList + (gObjectList[objectIndex].unk_0D3 << 7)) ; + gObjectList[objectIndex].activeTLUT = (u8*) ((u32*)gObjectList[objectIndex].tlutList + (gObjectList[objectIndex].unk_0D3 << 7)); gObjectList[objectIndex].status ^= 2; phi_a1 = 0; if ((gObjectList[objectIndex].status & 2) != 0) { phi_a1 = 1; } - gObjectList[objectIndex].activeTexture = (u8 *) (gObjectList[objectIndex].textureWidth * gObjectList[objectIndex].textureHeight * phi_a1) + arg1; + gObjectList[objectIndex].activeTexture = lakituTexturePtr[phi_a1]; func_800744A0(objectIndex); } } -void func_80074704(s32 objectIndex, uintptr_t arg1) { +void func_80074704(s32 objectIndex, const char **lakituTexturePtr) { s32 phi_a1; if ((gObjectList[objectIndex].status & 1) != 0) { @@ -1259,12 +1259,13 @@ void func_80074704(s32 objectIndex, uintptr_t arg1) { if ((gObjectList[objectIndex].status & 2) != 0) { phi_a1 = 1; } - gObjectList[objectIndex].activeTexture = (u8 *) (gObjectList[objectIndex].textureWidth * gObjectList[objectIndex].textureHeight * phi_a1) + arg1; + gObjectList[objectIndex].activeTexture = lakituTexturePtr[phi_a1]; func_800744A0(objectIndex); } } -u8 *func_80074790(s32 objectIndex, u8 *arg1) { +// Since the buffer only holds two textures, phi_a2 chooses which spot to load into +size_t func_80074790(s32 objectIndex, const char **lakituTexturePtr) { s32 phi_a2; gObjectList[objectIndex].status ^= 4; @@ -1272,32 +1273,35 @@ u8 *func_80074790(s32 objectIndex, u8 *arg1) { if ((gObjectList[objectIndex].status & 4) != 0) { phi_a2 = 1; } - return (gObjectList[objectIndex].textureWidth * gObjectList[objectIndex].textureHeight * phi_a2) + arg1; + return phi_a2; } -void func_800747F0(s32 objectIndex, u8 *arg1) { - u8 *sp24; +void func_800747F0(s32 objectIndex, const char **lakituTexturePtr) { + const char *nextTexture = NULL; if (gObjectList[objectIndex].itemDisplay != gObjectList[objectIndex].unk_0D3) { - sp24 = gObjectList[objectIndex].textureList + (gObjectList[objectIndex].textureWidth * gObjectList[objectIndex].textureHeight * gObjectList[objectIndex].itemDisplay); - func_80074574(sp24, (void *) func_80074790(objectIndex, arg1), gObjectList[objectIndex].textureWidth, gObjectList[objectIndex].textureHeight); - gObjectList[objectIndex].unk_0D3 = gObjectList[objectIndex].itemDisplay; - func_80074478(objectIndex); + nextTexture = gObjectList[objectIndex].textureList[gObjectList[objectIndex].itemDisplay]; + + if (nextTexture != NULL) { + func_80074574(lakituTexturePtr, nextTexture, func_80074790(objectIndex, lakituTexturePtr), gObjectList[objectIndex].textureWidth, gObjectList[objectIndex].textureHeight); + gObjectList[objectIndex].unk_0D3 = gObjectList[objectIndex].itemDisplay; + func_80074478(objectIndex); + } } } -void func_80074894(s32 objectIndex, u8 *arg1) { - func_800747F0(objectIndex, arg1); - func_800745C8(objectIndex, (uintptr_t)arg1); +void func_80074894(s32 objectIndex, const char **lakituTexturePtr) { + func_800747F0(objectIndex, lakituTexturePtr); + func_800745C8(objectIndex, lakituTexturePtr); } -void func_800748C4(s32 objectIndex, u8 *arg1) { - func_800747F0(objectIndex, arg1); - func_8007466C(objectIndex, (uintptr_t)arg1); +void func_800748C4(s32 objectIndex, const char **lakituTexturePtr) { + func_800747F0(objectIndex, lakituTexturePtr); + func_8007466C(objectIndex, lakituTexturePtr); } -void func_800748F4(s32 objectIndex, u8 *arg1) { - func_800747F0(objectIndex, arg1); - func_80074704(objectIndex, (uintptr_t)arg1); +void func_800748F4(s32 objectIndex, const char **lakituTexturePtr) { + func_800747F0(objectIndex, lakituTexturePtr); + func_80074704(objectIndex, lakituTexturePtr); } void func_80074924(s32 objectIndex) { @@ -2921,7 +2925,7 @@ void func_80079114(s32 objectIndex, s32 playerId, s32 arg2) { if (gObjectList[objectIndex].state >= 2) { if ((u8)gObjectList[objectIndex].unk_0D8 == 1) { if (playerId == 0) { - func_80074894(objectIndex, D_8018C028); + func_80074894(objectIndex, gLakituTexturePtr); return; } a = gIndexLakituList[0]; @@ -2932,13 +2936,13 @@ void func_80079114(s32 objectIndex, s32 playerId, s32 arg2) { } switch (arg2) { case 0: - func_800748F4(objectIndex, D_8018C028); + func_800748F4(objectIndex, gLakituTexturePtr); break; case 1: - func_800748C4(objectIndex, D_8018C028); + func_800748C4(objectIndex, gLakituTexturePtr); break; case 2: - func_80074894(objectIndex, D_8018C028); + func_80074894(objectIndex, gLakituTexturePtr); break; } } @@ -2986,7 +2990,7 @@ void init_obj_lakitu_red_flag_countdown(s32 objectIndex, s32 playerId) { //u8 *tlut = (u8 *) LOAD_ASSET(common_tlut_lakitu_countdown); //u8 *lights = (u8 *) LOAD_ASSET(gTextureLakituNoLights1); - init_texture_object(objectIndex, (u8 *) load_lakitu_textures_x64(common_tlut_lakitu_countdown, ARRAY_COUNT(common_tlut_lakitu_countdown)), load_lakitu_textures_x64(sLakituTextures, ARRAY_COUNT(sLakituTextures)), 56, (u16) 72); + init_texture_object(objectIndex, (u8 *) load_lakitu_tlut_x64(common_tlut_lakitu_countdown, ARRAY_COUNT(common_tlut_lakitu_countdown)), sLakituTextures, 56, (u16) 72); Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_lakitu); gObjectList[objectIndex].vertex = vtx; gObjectList[objectIndex].sizeScaling = 0.15f; @@ -3093,12 +3097,12 @@ void init_obj_lakitu_red_flag(s32 objectIndex, s32 playerIndex) { func_800791F0(objectIndex, playerIndex); - u8 *tlut = (u8 *) LOAD_ASSET(common_tlut_lakitu_checkered_flag); + u8 *tex = (u8 *) LOAD_ASSET(common_tlut_lakitu_checkered_flag); Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_also_lakitu); - init_texture_object(objectIndex, (u8*) tlut, load_lakitu_textures_x64(sLakituCheckeredList, ARRAY_COUNT(sLakituCheckeredList)), 0x48U, (u16) 0x00000038); + init_texture_object(objectIndex, (u8*) tex, sLakituCheckeredList, 0x48U, (u16) 0x00000038); object = &gObjectList[objectIndex]; - object->activeTexture = D_8018C028; + object->activeTexture = *gObjectList[objectIndex].textureList; object->vertex = vtx; object->pos[2] = 5000.0f; object->pos[1] = 5000.0f; @@ -3181,7 +3185,7 @@ void init_obj_lakitu_red_flag_fishing(s32 objectIndex, s32 arg1) { Vtx *vtx = (Vtx *) LOAD_ASSET(D_0D005F30); func_800791F0(objectIndex, arg1); - init_texture_object(objectIndex, (u8*) tlut, load_lakitu_textures_x64(sLakituFishingTextures, ARRAY_COUNT(sLakituFishingTextures)), 0x38U, (u16) 0x00000048); + init_texture_object(objectIndex, tlut, sLakituFishingTextures, 0x38U, (u16) 0x00000048); gObjectList[objectIndex].vertex = vtx; gObjectList[objectIndex].sizeScaling = 0.15f; func_80086E70(objectIndex); @@ -3360,11 +3364,12 @@ void func_8007A060(s32 objectIndex, s32 playerIndex) { func_800791F0(objectIndex, playerIndex); + u8 *tlut = (u8 *) LOAD_ASSET(common_tlut_lakitu_second_lap); Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_also_lakitu); - init_texture_object(objectIndex, (u8*) common_tlut_lakitu_second_lap, load_lakitu_textures_x64(sLakituSecondLapTextures, ARRAY_COUNT(sLakituSecondLapTextures)), 0x48U, (u16) 0x00000038); + init_texture_object(objectIndex, tlut, sLakituSecondLapTextures, 0x48U, (u16) 0x00000038); object = &gObjectList[objectIndex]; - object->activeTexture = D_8018C028; + object->activeTexture = *gObjectList[objectIndex].textureList; object->vertex = vtx; object->pos[2] = 5000.0f; object->pos[1] = 5000.0f; @@ -3418,11 +3423,12 @@ void func_8007A228(s32 objectIndex, s32 playerIndex) { func_800791F0(objectIndex, playerIndex); + u8 *tlut = (u8 *) LOAD_ASSET(common_tlut_lakitu_final_lap); Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_also_lakitu); - init_texture_object(objectIndex, (u8*) common_tlut_lakitu_final_lap, load_lakitu_textures_x64(sLakituFinalLapTextures, ARRAY_COUNT(sLakituFinalLapTextures)), 0x48U, (u16) 0x00000038); + init_texture_object(objectIndex, tlut, sLakituFinalLapTextures, 0x48U, (u16) 0x00000038); object = &gObjectList[objectIndex]; - object->activeTexture = D_8018C028; + object->activeTexture = *gObjectList[objectIndex].textureList; object->vertex = vtx; object->pos[2] = 5000.0f; object->pos[1] = 5000.0f; @@ -3475,10 +3481,11 @@ void func_8007A3F0(s32 objectIndex, s32 arg1) { f32 var = 5000.0f; func_800791F0(objectIndex, arg1); + u8 *tlut = (u8 *) LOAD_ASSET(common_tlut_lakitu_reverse); Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_also_lakitu); - init_texture_object(objectIndex, (u8*) common_tlut_lakitu_reverse, load_lakitu_textures_x64(sLakituReverseTextures, ARRAY_COUNT(sLakituReverseTextures)), 72, (u16) 56); - gObjectList[objectIndex].activeTexture = D_8018C028; + init_texture_object(objectIndex, tlut, sLakituReverseTextures, 72, (u16) 56); + gObjectList[objectIndex].activeTexture = *gObjectList[objectIndex].textureList; gObjectList[objectIndex].vertex = vtx; gObjectList[objectIndex].pos[2] = var; gObjectList[objectIndex].pos[1] = var; @@ -3614,7 +3621,7 @@ void func_8007AA44(s32 playerId) { func_8007A910(playerId); objectIndex = gIndexLakituList[playerId]; - D_8018C028 = D_80183FA8[playerId]; + gLakituTexturePtr = &gLakituTextureBuffer[playerId]; switch (gObjectList[objectIndex].unk_0D8) { case 1: func_80079114(objectIndex, playerId, 2); |
