From 41fb214dff0646240d7292021020a9208d26a3f2 Mon Sep 17 00:00:00 2001 From: Dominik Peters Date: Sun, 18 May 2025 00:10:34 +0200 Subject: [PATCH] partial match: func_80028050 (#579) * partial match: func_80028050 * match: func_8007CA68 --- README.md | 16 +-- include/structs.h | 35 +++--- src/game_ui.c | 2 +- src/textures_sprites.c | 107 +++++++++++++++--- src/tracks.c | 238 +++++++++++++++++++++-------------------- src/waves.c | 6 +- 6 files changed, 238 insertions(+), 166 deletions(-) diff --git a/README.md b/README.md index ba7cd073..e49495fc 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 15, 2025, this is our current score: +As of May 17, 2025, this is our current score: -    Decomp progress: 87.74% +    Decomp progress: 87.80%     Documentation progress: 56.98% @@ -117,15 +117,15 @@ s32 is_drumstick_unlocked(void) { ``` -As of May 15, 2025, this is our current score: +As of May 17, 2025, this is our current score: ``` ===================================================================== ADVENTURE ONE (ASM -> C Decompilation) - --------------- 87.74% Complete (88.56% NON_MATCHING) --------------- - # Decompiled functions: 1895 - # GLOBAL_ASM remaining: 56 - # NON_MATCHING functions: 5 - # NON_EQUIVALENT WIP functions: 17 + --------------- 87.80% Complete (88.90% NON_MATCHING) --------------- + # Decompiled functions: 1896 + # GLOBAL_ASM remaining: 55 + # NON_MATCHING functions: 6 + # NON_EQUIVALENT WIP functions: 16 ---------------------------- Game Status ---------------------------- Balloons: 40/47, Keys: 4/4, Trophies: 4/5 T.T. Amulets: 4/4, Wizpig Amulets: 4/4 diff --git a/include/structs.h b/include/structs.h index 43350e05..d169f9f0 100644 --- a/include/structs.h +++ b/include/structs.h @@ -376,20 +376,26 @@ typedef struct LevelHeader_70_18 { u8 alpha; //0xFF } LevelHeader_70_18; +typedef struct { + union { + struct { + u8 r; + u8 g; + u8 b; + u8 a; + }; + u32 word; + }; +} ColourRGBA; + /* Unknown size */ typedef struct LevelHeader_70 { /* 0x00 */ s32 unk0; //0x00000004 /* 0x04 */ s32 unk4; //0x00000000 /* 0x08 */ s32 unk8; //0x00000000 /* 0x0C */ s32 unkC; //0x00000000 - /* 0x10 */ u8 red; //0x72 - /* 0x11 */ u8 green; //0x75 - /* 0x12 */ u8 blue; //0x73 - /* 0x13 */ u8 alpha; //0x20 - /* 0x14 */ u8 red2; //0xFF - /* 0x15 */ u8 green2; //0x00 - /* 0x16 */ u8 blue2; //0x00 - /* 0x17 */ u8 alpha2; //0xFF + /* 0x10 */ ColourRGBA rgba; + /* 0x14 */ ColourRGBA rgba2; /* 0x18 */ LevelHeader_70_18 unk18[1]; // Actual length depends on unk0 } LevelHeader_70; @@ -1894,17 +1900,4 @@ typedef struct GhostNode { /* 0x08 */ s16 xRotation; /* 0x0A */ s16 yRotation; } GhostNode; - -typedef struct { -union { -struct { - u8 r; - u8 g; - u8 b; - u8 a; -}; -u32 word; -}; -} ColourRGBA; - #endif diff --git a/src/game_ui.c b/src/game_ui.c index acc0595c..7726167b 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -1750,7 +1750,7 @@ void hud_main_time_trial(s32 arg0, Object *playerRacerObj, s32 updateRate) { draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX + 1, gStopwatchErrorY + 29, SWMessage[0], ALIGN_MIDDLE_CENTER); // Draw actual text. - set_text_colour(D_80127194->red, D_80127194->green, D_80127194->blue, 128, D_80127194->alpha); + set_text_colour(D_80127194->rgba.r, D_80127194->rgba.g, D_80127194->rgba.b, 128, D_80127194->rgba.a); draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX, gStopwatchErrorY, SWMessage[2], ALIGN_MIDDLE_CENTER); draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX, gStopwatchErrorY + 14, SWMessage[1], diff --git a/src/textures_sprites.c b/src/textures_sprites.c index d61142d9..309dfff7 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -1012,7 +1012,80 @@ s32 load_sprite_info(s32 spriteIndex, s32 *numOfInstancesOut, s32 *unkOut, s32 * goto textureCouldNotBeLoaded; } -#pragma GLOBAL_ASM("asm/nonmatchings/textures_sprites/func_8007CA68.s") +void func_8007CA68(s32 arg0, s32 arg1, s32 *arg2, s32 *arg3, s32 *arg4) { + Sprite *sprite; + TextureHeader *tex; + s32 temp_a0; + s32 temp_v1; + s32 var_s1; + s32 var_s3; + s32 var_s4; + s32 var_s5; + s32 var_s6; + s32 temp_a1; + s32 temp_a2; + + if ((arg0 < 0) || (arg0 >= gSpriteTableSize)) { + *arg2 = 0; + *arg3 = 0; + return; + } + + temp_a2 = gSpriteOffsetTable[arg0]; + + // 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); + // clang-format on + + if (sprite->numberOfFrames < arg1) { + failedExit: + *arg2 = 0; + *arg3 = 0; + *arg4 = 0; + return; + } + tex = load_texture(sprite->unkC.val[arg1] + sprite->baseTextureId); + if (tex == NULL) { + goto failedExit; + } + *arg4 = tex_asset_size(sprite->unkC.val[arg1] + sprite->baseTextureId); + var_s3 = tex->unk3 - sprite->numberOfInstances; + var_s4 = sprite->drawFlags - tex->unk4; + temp_a1 = tex->width; + temp_a2 = tex->height; + var_s5 = var_s3 + temp_a1; + var_s6 = var_s4 - temp_a2; + tex_free(tex); + + for (var_s1 = sprite->unkC.val[arg1] + 1; var_s1 < sprite->unkC.val[arg1 + 1]; var_s1++) { + tex = load_texture(sprite->baseTextureId + var_s1); + if (tex == NULL) { + goto failedExit; + } + *arg4 += tex_asset_size(sprite->baseTextureId + var_s1); + temp_v1 = tex->unk3 - sprite->numberOfInstances; + temp_a0 = sprite->drawFlags - tex->unk4; + temp_a1 = tex->width; + temp_a2 = tex->height; + if (temp_v1 < var_s3) { + var_s3 = temp_v1; + } + if (var_s5 < temp_v1 + temp_a1) { + var_s5 = temp_v1 + temp_a1; + } + if (temp_a0 - temp_a2 < var_s6) { + var_s6 = temp_a0 - temp_a2; + } + if (var_s4 < temp_a0) { + var_s4 = temp_a0; + } + tex_free(tex); + } + *arg2 = var_s5 - var_s3; + *arg3 = var_s4 - var_s6; +} /** * This function attempts to free the sprite from memory. @@ -1403,10 +1476,10 @@ void func_8007F1E8(LevelHeader_70 *arg0) { arg0->unk4 = 0; arg0->unk8 = 0; arg0->unkC = 0; - arg0->red = arg0->red2; - arg0->green = arg0->green2; - arg0->blue = arg0->blue2; - arg0->alpha = arg0->alpha2; + arg0->rgba.r = arg0->rgba2.r; + arg0->rgba.g = arg0->rgba2.g; + arg0->rgba.b = arg0->rgba2.b; + arg0->rgba.a = arg0->rgba2.a; for (i = 0; i < arg0->unk0; i++) { arg0->unkC += arg0->unk18[i].unk0; } @@ -1452,22 +1525,22 @@ void update_colour_cycle(LevelHeader_70 *arg0, s32 updateRate) { cur = (LevelHeader_70 *) (&((LevelHeader_70_18 *) arg0)[curIndex]); temp = (arg0->unk8 << 16) / (cur->unk18->unk0); - cur_red = cur->red2; - cur_green = cur->green2; - cur_blue = cur->blue2; - cur_alpha = cur->alpha2; + cur_red = cur->rgba2.r; + cur_green = cur->rgba2.g; + cur_blue = cur->rgba2.b; + cur_alpha = cur->rgba2.a; next = (LevelHeader_70 *) (&((LevelHeader_70_18 *) arg0)[nextIndex]); - next_red = next->red2; - next_green = next->green2; - next_blue = next->blue2; - next_alpha = next->alpha2; + next_red = next->rgba2.r; + next_green = next->rgba2.g; + next_blue = next->rgba2.b; + next_alpha = next->rgba2.a; next = arg0; - arg0->red = (((next_red - cur_red) * temp) >> 16) + cur_red; - arg0->green = (((next_green - cur_green) * temp) >> 16) + cur_green; - arg0->blue = (((next_blue - cur_blue) * temp) >> 16) + cur_blue; - arg0->alpha = (((next_alpha - cur_alpha) * temp) >> 16) + cur_alpha; + arg0->rgba.r = (((next_red - cur_red) * temp) >> 16) + cur_red; + arg0->rgba.g = (((next_green - cur_green) * temp) >> 16) + cur_green; + arg0->rgba.b = (((next_blue - cur_blue) * temp) >> 16) + cur_blue; + arg0->rgba.a = (((next_alpha - cur_alpha) * temp) >> 16) + cur_alpha; } } diff --git a/src/tracks.c b/src/tracks.c index 873aa50f..329ef470 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -55,7 +55,7 @@ char gJpnTTCam[] = { 0x80, 0x2D, 0x80, 0x3C, 0x80, 0x2D, 0x80, 0x3C, 0x80, 0x55, u8 *D_800DC924 = NULL; s32 D_800DC928 = 0; // Currently unknown, might be a different type. -s8 D_800DC92C[24] = { +u8 D_800DC92C[24] = { 0, 1, 4, 1, 2, 4, 2, 3, 4, 3, 0, 4, 5, 6, 1, 1, 0, 5, 3, 2, 7, 7, 8, 3 // There may or may not be extra zeroes here. @@ -1350,135 +1350,142 @@ void set_skydome_visbility(s32 renderSky) { gSceneRenderSkyDome = renderSky; } -#ifdef NON_EQUIVALENT +#ifdef NON_MATCHING // This function creates the flashy sky effect in the wizpig 2 race. // init_skydome -// https://decomp.me/scratch/F52TP +// https://decomp.me/scratch/E1DFy void func_80028050(void) { - // sp154 ? - s32 uCoordMask; // sp150 ? + Triangle *tris; + Vertex *verts; s32 vCoordMask; // sp14C + s32 uCoordMask; + f32 scaledXSin; + f32 scaledXCos; + f32 var_f16; s16 uCoords[9]; // sp128 s16 vCoords[9]; // sp114 - f32 yRotCos; // sp10C - f32 yRotSin; + f32 xCos; + f32 xSin; // sp10C + f32 pad_sp108; + ObjectSegment *objSegment; + f32 pad_sp100; f32 xPositions[9]; // spDC f32 zPositions[9]; // spB8 - f32 spB4; - s8 *sp7C; - s32 sp78; - TextureHeader *sp74; - f32 sp48; - f32 sp3C; - f32 sp38; - f32 sp2C; - ObjectSegment *objSeg; - s16 temp_a1; - s16 temp_v0_2; - s16 temp_v1_2; - Vertex *verts; - Triangle *tris; - s8 *var_t2; - s8 *var_v0; - u8 *var_v0_3; - u32 var_a2; - u32 var_a3; + Vec3f pos; s32 i; - s16 yPos; + s32 var_v0; + s32 var_v1; + s32 var_a1; + s32 var_a2; + s32 var_a3; + u8 *var_v0_3; + f32 var_f14; + s16 vertY; + s16 vTempCoord; + s16 uTempCoord; + LevelHeader_70 *levelHeader; + LevelHeader_70 *var_t2; // sp7C + LevelHeader_70 *sp78; + TextureHeader *texHeader; // sp74 + s32 pad[4]; verts = gSceneCurrVertexList; tris = gSceneCurrTriList; - objSeg = get_active_camera_segment(); - sp74 = gCurrentLevelHeader2->unkA4; - uCoordMask = (sp74->width << 5) - 1; - vCoordMask = (sp74->height << 5) - 1; - yRotCos = coss_f(-objSeg->trans.rotation.y_rotation); - yRotSin = sins_f(-objSeg->trans.rotation.y_rotation); - xPositions[0] = -(yRotSin * 1280.0f) - (yRotCos * 1280.0f); // spDC OK - zPositions[0] = -(yRotSin * 1280.0f) + (yRotCos * 1280.0f); // spB8 OK + objSegment = get_active_camera_segment(); + texHeader = gCurrentLevelHeader2->unkA4; + uCoordMask = (texHeader->width << 5) - 1; + vCoordMask = (texHeader->height << 5) - 1; + xSin = sins_f(-objSegment->trans.rotation.x); + xCos = coss_f(-objSegment->trans.rotation.x); - zPositions[1] = (yRotSin * 1280.0f) - (yRotCos * 1280.0f); // spE0 OK - xPositions[1] = -(yRotSin * 1280.0f) - (yRotCos * 1280.0f); // spBC OK + scaledXSin = xSin * 1280.0f; + scaledXCos = xCos * 1280.0f; + xPositions[0] = -scaledXCos - (xSin * 1280.0f); + zPositions[0] = -scaledXCos + (xSin * 1280.0f); + xPositions[1] = scaledXCos - (xSin * 1280.0f); + zPositions[1] = -scaledXCos - (xSin * 1280.0f); + xPositions[2] = scaledXCos + (xSin * 1280.0f); + zPositions[2] = scaledXCos - (xSin * 1280.0f); + xPositions[3] = -scaledXCos + (xSin * 1280.0f); + zPositions[3] = scaledXCos + scaledXSin; + xPositions[4] = 0.0f; + zPositions[4] = 0.0f; - xPositions[2] = (yRotSin * 1280.0f) + (yRotCos * 1280.0f); // spE4 OK - zPositions[2] = (yRotSin * 1280.0f) - (yRotCos * 1280.0f); // spC0 OK + zPositions[5] = scaledXSin - (2.0f * scaledXCos); + xPositions[6] = scaledXCos - (2.0f * scaledXSin); + zPositions[6] = -(2.0f * scaledXCos) - scaledXSin; + xPositions[5] = -scaledXCos - (2.0f * scaledXSin); + xPositions[7] = scaledXCos + (2.0f * scaledXSin); + zPositions[7] = (2.0f * scaledXCos) - scaledXSin; + xPositions[8] = -scaledXCos + (2.0f * scaledXSin); + zPositions[8] = (2.0f * scaledXCos) + scaledXSin; - xPositions[3] = -(yRotSin * 1280.0f) + (yRotCos * 1280.0f); // spE8 OK - zPositions[3] = (yRotSin * 1280.0f) + (yRotCos * 1280.0f); // spC4 OK + var_f14 = 1280.0f; + var_f14 *= 0.25f; - xPositions[4] = 0.0f; // spEC OK - zPositions[4] = 0.0f; // spC8 OK + var_a1 = texHeader->width * 16 * gCurrentLevelHeader2->unkA0; + var_a2 = texHeader->height * 16 * gCurrentLevelHeader2->unkA1; - xPositions[5] = -(yRotSin * 1280.0f) - (2.0f * (yRotCos * 1280.0f)); // spF0 - zPositions[5] = (yRotCos * 1280.0f) - (2.0f * (yRotSin * 1280.0f)); // spCC + var_v0 = + ((s32) (objSegment->trans.x_position * (var_f14 / var_a1)) + (gCurrentLevelHeader2->unkA8 >> 4)) & uCoordMask; + var_v1 = + ((s32) (objSegment->trans.z_position * (var_f14 / var_a2)) + (gCurrentLevelHeader2->unkAA >> 4)) & vCoordMask; - zPositions[6] = -(2.0f * (yRotSin * 1280.0f)) - (yRotCos * 1280.0f); // spF4 - xPositions[6] = (yRotSin * 1280.0f) - (2.0f * (yRotCos * 1280.0f)); // spD0 + var_f14 = var_a1 * xCos; + pos.z = var_a1 * xCos; + pos.x = var_a1 * xCos; + var_f16 = var_a2 * xSin; + xCos = var_f16; - xPositions[7] = (yRotSin * 1280.0f) + (2.0f * (yRotCos * 1280.0f)); // spF8 - zPositions[7] = (2.0f * (yRotSin * 1280.0f)) - (yRotCos * 1280.0f); // spD4 + // @fake + var_a2 = texHeader->height * 16 * gCurrentLevelHeader2->unkA1; - xPositions[8] = -(yRotSin * 1280.0f) + (2.0f * (yRotCos * 1280.0f)); // spFC - zPositions[8] = (2.0f * (yRotSin * 1280.0f)) + (yRotCos * 1280.0f); // spD8 + uCoords[0] = (s16) (-var_f14 - xCos) + var_v0; + vCoords[0] = (s16) (var_f16 - var_f14) + var_v1; + uCoords[1] = (s16) (var_f14 - xCos) + var_v0; + vCoords[1] = (s16) (-var_f14 - var_f16) + var_v1; + uCoords[2] = (s16) (var_f14 + var_f16) + var_v0; + vCoords[2] = (s16) (var_f14 - var_f16) + var_v1; + uCoords[3] = (s16) (var_f16 - var_f14) + var_v0; + vCoords[3] = (s16) (var_f14 + var_f16) + var_v1; - sp38 = (f32) (sp74->width * 16 * gCurrentLevelHeader2->unkA0); - temp_v0_2 = - ((s32) (objSeg->trans.x_position * ((1280.0f * 0.25f) / sp38)) + ((s16) gCurrentLevelHeader2->unkA8 >> 4)) & - uCoordMask; - sp48 = (f32) (sp74->height * 16 * gCurrentLevelHeader2->unkA1); - temp_v1_2 = - ((s32) (objSeg->trans.z_position * ((1280.0f * 0.25f) / sp48)) + ((s16) gCurrentLevelHeader2->unkAA >> 4)) & - vCoordMask; + uCoords[4] = var_v0; + vCoords[4] = var_v1; - uCoords[0] = (s32) (-(sp38 * yRotSin) - (sp48 * yRotCos)) + temp_v0_2; - vCoords[0] = (s32) ((sp48 * yRotCos) - (sp38 * yRotSin)) + temp_v1_2; - - uCoords[1] = (s32) ((sp38 * yRotSin) - (sp48 * yRotCos)) + temp_v0_2; - vCoords[1] = (s32) (-(sp38 * yRotSin) - (sp48 * yRotCos)) + temp_v1_2; - - uCoords[2] = (s32) ((sp38 * yRotSin) + (sp48 * yRotCos)) + temp_v0_2; - vCoords[2] = (s32) ((sp38 * yRotSin) - (sp48 * yRotCos)) + temp_v1_2; - - uCoords[3] = (s32) ((sp48 * yRotCos) - (sp38 * yRotSin)) + temp_v0_2; - vCoords[3] = (s32) ((sp38 * yRotSin) + (sp48 * yRotCos)) + temp_v1_2; - - uCoords[4] = temp_v0_2; - vCoords[4] = temp_v1_2; - - uCoords[5] = (s32) (-(sp38 * yRotSin) - (2.0f * (sp48 * yRotCos))) + temp_v0_2; - vCoords[5] = (s32) ((sp48 * yRotCos) - (2.0f * (sp38 * yRotSin))) + temp_v1_2; - - uCoords[6] = (s32) ((sp38 * yRotSin) - (2.0f * (sp48 * yRotCos))) + temp_v0_2; - vCoords[6] = (s32) (-(2.0f * (sp38 * yRotSin)) - (sp48 * yRotCos)) + temp_v1_2; - - uCoords[7] = (s32) ((sp38 * yRotSin) + (2.0f * (sp48 * yRotCos))) + temp_v0_2; - vCoords[7] = (s32) ((2.0f * (sp38 * yRotSin)) - (sp48 * yRotCos)) + temp_v1_2; - - uCoords[8] = (s32) ((2.0f * (sp48 * yRotCos)) - (sp38 * yRotSin)) + temp_v0_2; - vCoords[8] = (s32) ((2.0f * (sp38 * yRotSin)) + (sp48 * yRotCos)) + temp_v1_2; + uCoords[5] = (s16) (-var_f14 - (2.0f * xCos)) + var_v0; + vCoords[5] = (s16) (var_f16 - (2.0f * var_f14)) + var_v1; + uCoords[6] = (s16) (var_f14 - (2.0f * xCos)) + var_v0; + vCoords[6] = (s16) ((-(2.0f * var_f14)) - var_f16) + var_v1; + uCoords[7] = (s16) ((2.0f * xCos) + pos.z) + var_v0; + vCoords[7] = (s16) ((2.0f * pos.x) - var_f16) + var_v1; + uCoords[8] = (s16) ((2.0f * xCos) - pos.z) + var_v0; + vCoords[8] = (s16) ((2.0f * pos.x) + var_f16) + var_v1; matrix_world_origin(&gSceneCurrDisplayList, &gSceneCurrMatrix); - var_t2 = gCurrentLevelHeader2->unk74[0]; - var_a2 = 0xFFFFFFFF; - if (var_t2 != (s8 *) -1) { - var_v0 = gCurrentLevelHeader2->unk74[1]; - if (var_v0 == (s8 *) -1) { - var_v0 = var_t2; + + var_t2 = *gCurrentLevelHeader2->unk74; + var_a2 = -1; + + if ((u32) var_t2 != -1) { + levelHeader = gCurrentLevelHeader2->unk74[1]; + if ((u32) levelHeader == -1) { + levelHeader = var_t2; } } else { - var_v0 = sp78; + levelHeader = sp78; // @bug? sp78 is never set var_t2 = NULL; } - var_a3 = 0xFFFFFF00; + + var_a3 = -0x100; if (var_t2 != NULL) { - var_a2 = var_t2[0x10]; - var_a3 = var_v0[0x10] & ~0xFF; + var_a2 = var_t2->rgba.word; + var_a3 = levelHeader->rgba.word & (~0xFF); } - sp7C = var_t2; + gfx_init_basic_xlu(&gSceneCurrDisplayList, 1, var_a2, var_a3); - sp74 = (TextureHeader *) set_animated_texture_header(sp74, D_8011B110 << 8); - gDkrDmaDisplayList(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(sp74->cmd), sp74->numberOfCommands); + texHeader = set_animated_texture_header(texHeader, D_8011B110 << 8); + gDkrDmaDisplayList(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(texHeader->cmd), texHeader->numberOfCommands); gSPVertexDKR(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(gSceneCurrVertexList), 9, 0); gSPPolygon(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(gSceneCurrTriList), 8, 1); gDPPipeSync(gSceneCurrDisplayList++); @@ -1488,37 +1495,33 @@ void func_80028050(void) { } rendermode_reset(&gSceneCurrDisplayList); - yPos = objSeg->trans.y_position + 192.0f; + vertY = objSegment->trans.y_position + 192.0f; for (i = 0; i < 9; i++) { - verts->y = yPos; - verts->x = objSeg->trans.x_position + xPositions[i]; - verts->z = objSeg->trans.z_position + zPositions[i]; - verts->r = 255; - verts->g = 255; - verts->b = 255; - verts->a = (i <= 4) ? 255 : 0; + verts->x = xPositions[i] + objSegment->trans.x_position; + verts->y = vertY; + verts->z = zPositions[i] + objSegment->trans.z_position; + verts->r = 0xFF; + verts->g = 0xFF; + verts->b = 0xFF; + verts->a = (i <= 4) ? (255) : (0); verts++; } var_v0_3 = D_800DC92C; for (i = 0; i < 8; i++) { tris->flags = 0x40; - tris->vi0 = *var_v0_3; tris->uv0.u = uCoords[*var_v0_3]; tris->uv0.v = vCoords[*var_v0_3]; - var_v0_3++; - + var_v0_3 += 1; tris->vi1 = *var_v0_3; tris->uv1.u = uCoords[*var_v0_3]; tris->uv1.v = vCoords[*var_v0_3]; - var_v0_3++; - + var_v0_3 += 1; tris->vi2 = *var_v0_3; tris->uv2.u = uCoords[*var_v0_3]; tris->uv2.v = vCoords[*var_v0_3]; - var_v0_3++; - + var_v0_3 += 1; tris++; } @@ -1955,10 +1958,11 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { if (levelHeaderIndex != (batchInfo->verticesOffset * 0)) { gDPSetEnvColor( gSceneCurrDisplayList++, - ((LevelHeader_70 *) ((u8 **) (&((LevelHeader **) gCurrentLevelHeader2)[levelHeaderIndex]))[28])->red, - ((LevelHeader_70 *) ((u8 **) (&((LevelHeader **) gCurrentLevelHeader2)[levelHeaderIndex]))[28])->green, - ((LevelHeader_70 *) ((u8 **) (&((LevelHeader **) gCurrentLevelHeader2)[levelHeaderIndex]))[28])->blue, - ((LevelHeader_70 *) ((u8 **) (&((LevelHeader **) gCurrentLevelHeader2)[levelHeaderIndex]))[28])->alpha); + ((LevelHeader_70 *) ((u8 **) (&((LevelHeader **) gCurrentLevelHeader2)[levelHeaderIndex]))[28])->rgba.r, + ((LevelHeader_70 *) ((u8 **) (&((LevelHeader **) gCurrentLevelHeader2)[levelHeaderIndex]))[28])->rgba.g, + ((LevelHeader_70 *) ((u8 **) (&((LevelHeader **) gCurrentLevelHeader2)[levelHeaderIndex]))[28])->rgba.b, + ((LevelHeader_70 *) ((u8 **) (&((LevelHeader **) gCurrentLevelHeader2)[levelHeaderIndex]))[28]) + ->rgba.a); } else { gDPSetEnvColor(gSceneCurrDisplayList++, 255, 255, 255, 0); } diff --git a/src/waves.c b/src/waves.c index 0fadb1b0..74f35f77 100644 --- a/src/waves.c +++ b/src/waves.c @@ -962,7 +962,8 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { } gDPSetPrimColor(gWaveDL++, 0, 0, 255, 255, 255, 0); if (D_800E3180 != NULL) { - gDPSetEnvColor(gWaveDL++, D_800E3180->red, D_800E3180->green, D_800E3180->blue, D_800E3180->alpha); + gDPSetEnvColor(gWaveDL++, D_800E3180->rgba.r, D_800E3180->rgba.g, D_800E3180->rgba.b, + D_800E3180->rgba.a); } else { gDPSetEnvColor(gWaveDL++, 255, 255, 255, 0); } @@ -974,7 +975,8 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { gDPSetOtherMode(gWaveDL++, DKR_OMH_2CYC_BILERP, DKR_OML_COMMON | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2); gDPSetPrimColor(gWaveDL++, 0, 0, 255, 255, 255, 255); if (D_800E3180 != NULL) { - gDPSetEnvColor(gWaveDL++, D_800E3180->red, D_800E3180->green, D_800E3180->blue, D_800E3180->alpha); + gDPSetEnvColor(gWaveDL++, D_800E3180->rgba.r, D_800E3180->rgba.g, D_800E3180->rgba.b, + D_800E3180->rgba.a); } else { gDPSetEnvColor(gWaveDL++, 255, 255, 255, 0); }