From a56933bd8c5c4a430df26124edeff7f50e147506 Mon Sep 17 00:00:00 2001 From: Dominik Peters Date: Thu, 12 Jun 2025 23:05:49 +0200 Subject: [PATCH] match: update_camera_plane & func_8004CC20 (#622) * match: update_camera_plane * refac: use 1/180.0 instead * match: func_8004CC20 * document: re-add function comment --- README.md | 48 +++++----- src/racer.c | 212 +++++++++++++++++++----------------------- tools/python/score.py | 11 --- 3 files changed, 119 insertions(+), 152 deletions(-) diff --git a/README.md b/README.md index 9ef7b2fe..a5186916 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ 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 June 11, 2025, this is our current score: +As of June 12, 2025, this is our current score: -    Decomp progress: 90.87% +    Decomp progress: 91.17% -    Documentation progress: 59.40% +    Documentation progress: 59.08% --- @@ -117,30 +117,30 @@ s32 is_drumstick_unlocked(void) { ``` -As of June 11, 2025, this is our current score: +As of June 12, 2025, this is our current score: ``` - ==================================================================== + ===================================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------------- 90.87% Complete (91.65% NON_MATCHING) --------------- - # Decompiled functions: 1913 - # GLOBAL_ASM remaining: 37 - # NON_MATCHING functions: 4 - # NON_EQUIVALENT WIP functions: 30 - --------------------------- Game Status ---------------------------- - Balloons: 42/47, Keys: 4/4, Trophies: 4/5 + --------------- 91.17% Complete (91.94% NON_MATCHING) --------------- + # Decompiled functions: 1914 + # GLOBAL_ASM remaining: 30 + # NON_MATCHING functions: 4 + # NON_EQUIVALENT WIP functions: 26 + ---------------------------- Game Status ---------------------------- + Balloons: 43/47, Keys: 4/4, Trophies: 4/5 T.T. Amulets: 4/4, Wizpig Amulets: 4/4 - -------------------------------------------------------------------- - We are racing in Star City. (Lap 3/3) - ==================================================================== - ADVENTURE TWO (Cleanup & Documentation) - ------------------------- 59.40% Complete -------------------------- - # Documented functions: 1208 - # Undocumented remaining: 445 - --------------------------- Game Status ---------------------------- - Balloons: 29/47, Keys: 3/4, Trophies: 2/5 + --------------------------------------------------------------------- + We are collecting silver coins in Spacedust Alley. (1/8 silver coins) + ===================================================================== + ADVENTURE TWO (Cleanup & Documentation) + -------------------------- 59.08% Complete -------------------------- + # Documented functions: 1207 + # Undocumented remaining: 440 + ---------------------------- Game Status ---------------------------- + Balloons: 28/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 3/4, Wizpig Amulets: 2/4 - -------------------------------------------------------------------- - We are collecting silver coins in Treasure Caves. (1/8 silver coins) - ==================================================================== + --------------------------------------------------------------------- + We are collecting silver coins in Pirate Lagoon. (8/8 silver coins) + ===================================================================== ``` diff --git a/src/racer.c b/src/racer.c index 3898d8c3..7f6f7b32 100644 --- a/src/racer.c +++ b/src/racer.c @@ -3476,35 +3476,32 @@ void racer_attack_handler_plane(Object *obj, Object_Racer *racer) { } } -// https://decomp.me/scratch/CQwF9 -#ifdef NON_EQUIVALENT void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { s32 segmentIndex; f32 baseSpeed; - f32 tempVel; + s32 pad_sp44; f32 yOffset; - f32 yVel; - s32 angle; - f32 temp_f16; - f32 baseFloat1 = 120.0f; + f32 pad_sp3C; s32 angleVel; + f32 baseFloat2 = 120.0f; + f32 baseFloat1 = 45.0f; + s32 angle; f32 xOffset; f32 zOffset; - f32 baseFloat2 = 45.0f; - f32 phi_f14; + f32 var_f16; + f32 var_f14; f32 brakeVar = 0.0f; s32 numViewports; - f32 baseFloat3; s32 delta; delta = (s32) updateRate; - temp_f16 = gCurrentCourseHeight; - temp_f16 = 200.0f - (obj->segment.trans.y_position + (-temp_f16)); - if (temp_f16 < 0.0f) { - temp_f16 = 0.0f; + var_f16 = gCurrentCourseHeight - obj->segment.trans.y_position; + var_f16 = 200.0f - (var_f16); + if (var_f16 < 0.0f) { + var_f16 = 0.0f; } - if (temp_f16 > 200.0f) { - temp_f16 = 200.0f; + if (var_f16 > 200.0f) { + var_f16 = 200.0f; } numViewports = cam_get_viewport_layout(); if (numViewports == 1) { @@ -3523,7 +3520,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { angle += 0xFFFF; } if (racer->camera_zoom < 0.4) { - racer->camera_zoom += 0.005; + racer->camera_zoom += 1 / 180.0; } else { racer->camera_zoom = 0.4f; } @@ -3559,18 +3556,18 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { angle = -0x3000; } } - angle = -(angle - ((s32) (temp_f16 * 10.0f))); - angle = angle - ((u16) gCameraObject->trans.rotation.x_rotation); - if (angle > 0x8000) { - angle -= 0xFFFF; + angle = -(angle - ((s32) (var_f16 * 10.0f))); + angleVel = angle - ((u16) gCameraObject->trans.rotation.x_rotation); + if (angleVel > 0x8000) { + angleVel -= 0xFFFF; } - if (angle < -0x8000) { - angle += 0xFFFF; + if (angleVel < -0x8000) { + angleVel += 0xFFFF; } - gCameraObject->trans.rotation.x_rotation += ((angle * delta) >> 4); + gCameraObject->trans.rotation.x_rotation += ((angleVel * delta) >> 4); brakeVar = racer->brake; baseSpeed = racer->forwardVel; - switch (gCameraObject->mode) { + switch (gCameraObject->zoom) { case 1: baseFloat2 += 35.0f; break; @@ -3586,49 +3583,40 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { break; } if (numViewports < 2) { - phi_f14 = baseSpeed * 60.0f; - phi_f14 = baseFloat2 + phi_f14; + baseFloat2 += baseSpeed * 60.0f; } else { - phi_f14 = baseSpeed * 30.0f; - phi_f14 = baseFloat2 + phi_f14; + baseFloat2 += baseSpeed * 30.0f; } if (racer->velocity < 0.0 && !racer->groundedWheels) { - tempVel = -(racer->velocity * brakeVar); - tempVel = tempVel * 6.0f; - if (65.0 < tempVel) { - tempVel = 65.0f; + var_f16 = -(racer->velocity * brakeVar) * 6.0f; + if (65.0 < var_f16) { + var_f16 = 65.0f; } - if (yOffset) { - ; - } - phi_f14 -= tempVel; + baseFloat2 -= var_f16; } if (!gRaceStartTimer) { if (normalise_time(36) < racer->boostTimer) { - phi_f14 = -30.0f; + baseFloat2 = -30.0f; } else if (racer->boostTimer > 0) { - phi_f14 = 180.0f; + baseFloat2 = 180.0f; } } if (gRaceStartTimer > 80) { - gCameraObject->boomLength = phi_f14; + gCameraObject->boomLength = baseFloat2; gCameraObject->cam_unk_20 = baseFloat1; } - gCameraObject->boomLength += (phi_f14 - gCameraObject->boomLength) * 0.125; + gCameraObject->boomLength += (baseFloat2 - gCameraObject->boomLength) * 0.125; gCameraObject->cam_unk_20 += (baseFloat1 - gCameraObject->cam_unk_20) * 0.125; - phi_f14 = sins_f(gCameraObject->trans.rotation.x_rotation - 0x400); + var_f14 = sins_f(gCameraObject->trans.rotation.x_rotation - 0x400); xOffset = coss_f(gCameraObject->trans.rotation.x_rotation - 0x400); - baseFloat3 = phi_f14; - baseFloat2 = (gCameraObject->boomLength * baseFloat3) - (gCameraObject->cam_unk_20 * xOffset); - baseFloat1 = ((gCameraObject->boomLength) * (gCameraObject->boomLength)); - baseFloat1 += (gCameraObject->cam_unk_20 * baseFloat3); - xOffset = sins_f(0x8000 - racer->cameraYaw) * baseFloat2; - zOffset = coss_f(0x8000 - racer->cameraYaw) * baseFloat2; - yVel = sins_f(racer->cameraYaw + 0x4000) * 3.0f; - yVel = yVel * racer->lateral_velocity; - gCameraObject->trans.x_position = (obj->segment.trans.x_position + xOffset) + yVel; - temp_f16 = obj->segment.trans.y_position; - yOffset = gCameraObject->trans.y_position - (temp_f16 + baseFloat1); + var_f16 = (gCameraObject->boomLength * xOffset) - (gCameraObject->cam_unk_20 * var_f14); + baseFloat1 = ((gCameraObject->boomLength) * var_f14) + (gCameraObject->cam_unk_20 * xOffset); + xOffset = sins_f(0x8000 - racer->cameraYaw) * var_f16; + zOffset = coss_f(0x8000 - racer->cameraYaw) * var_f16; + var_f16 = sins_f(racer->cameraYaw + 0x4000) * 3.0f * racer->lateral_velocity; + gCameraObject->trans.x_position = (obj->segment.trans.x_position + xOffset) + var_f16; + yOffset = gCameraObject->trans.y_position - (obj->segment.trans.y_position + baseFloat1); + var_f16 = yOffset; if (racer->trickType == 1 || racer->trickType == -1) { racer->unk74 = 8.0; } @@ -3640,76 +3628,69 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { } else { racer->unk74 = 2.0; } - yVel = racer->unk74; - yVel = (yOffset * updateRate) / yVel; - if (yVel > 0.0f && yOffset < yVel) { - yVel = yOffset; + yOffset = (yOffset * updateRate) / racer->unk74; + if (yOffset > 0.0f && var_f16 < yOffset) { + yOffset = var_f16; } - if (yVel < 0.0f && yVel < yOffset) { - yVel = yOffset; + if (yOffset < 0.0f && yOffset < var_f16) { + yOffset = var_f16; } - gCameraObject->trans.y_position -= yVel; - gCameraObject->trans.z_position = - zOffset + obj->segment.trans.z_position + (-coss_f(racer->cameraYaw + 0x4000) * 3.0f * racer->lateral_velocity); + gCameraObject->trans.y_position -= yOffset; + var_f16 = (-coss_f(racer->cameraYaw + 0x4000) * 3.0f * racer->lateral_velocity); + gCameraObject->trans.z_position = zOffset + obj->segment.trans.z_position + var_f16; gCameraObject->trans.rotation.y_rotation = racer->cameraYaw; if (racer->trickType || gDialogueCameraAngle) { - angle = -(u16) gCameraObject->trans.rotation.z_rotation; - if (angle > 0x8000) { - angle -= 0xFFFF; + angleVel = -(u16) gCameraObject->trans.rotation.z_rotation; + if (angleVel > 0x8000) { + angleVel -= 0xFFFF; } - if (angle < -0x8000) { - angle += 0xFFFF; + if (angleVel < -0x8000) { + angleVel += 0xFFFF; } - gCameraObject->trans.rotation.z_rotation += angle >> 2; + gCameraObject->trans.rotation.z_rotation += angleVel >> 2; } else { - angle = (u16) gCameraObject->trans.rotation.z_rotation; - angle = angle + (-(racer->x_rotation_vel >> 4)); - if (angle > 0x8000) { - angle -= 0xFFFF; + angle = racer->x_rotation_vel; + angleVel = (angle >> 4) - (u16) gCameraObject->trans.rotation.z_rotation; + if (angleVel > 0x8000) { + angleVel -= 0xFFFF; } - if (angle < -0x8000) { - angle += 0xFFFF; + if (angleVel < -0x8000) { + angleVel += 0xFFFF; } - gCameraObject->trans.rotation.z_rotation += angle >> 3; + gCameraObject->trans.rotation.z_rotation += angleVel >> 3; } - tempVel = gCameraObject->trans.x_position; - segmentIndex = get_level_segment_index_from_position(tempVel, gCameraObject->trans.y_position, - gCameraObject->trans.z_position); + segmentIndex = get_level_segment_index_from_position( + gCameraObject->trans.x_position, gCameraObject->trans.y_position, gCameraObject->trans.z_position); if (segmentIndex != -1) { gCameraObject->cameraSegmentID = segmentIndex; } racer->cameraYaw = gCameraObject->trans.rotation.y_rotation; } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/racer/update_camera_plane.s") -#endif -// https://decomp.me/scratch/nVftv -#ifdef NON_EQUIVALENT // Handles loop de loops void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Racer *racer) { s32 animFrame; s32 moveObjResult; f32 curYPos; - Object *new_var; - Object *obj; + s32 i; Object **nodes; s32 var_a2; + s32 var_v0; f32 prevXPos; f32 prevYPos; f32 prevZPos; - s32 steerAngle; // sp90 f32 xDiff; f32 zDiff; f32 yDiff; - s32 var_v0; s32 var_v1; f32 temp; f32 temp2; f32 temp3; + s32 steerAngle; f32 temp4; - MtxF mtx; // sp48 f32 var_f0; + f32 mtx[4][4]; + Object *obj; f32 var_f2; s8 objectMoved; @@ -3775,7 +3756,8 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac handle_car_velocity_control(racer); func_80053750(racerObj, racer, updateRateF); racerObj->segment.object.animationID = 0; - animFrame = racer->steerAngle >> 1; + animFrame = racer->steerAngle; + animFrame = animFrame >> 1; animFrame = 40 - animFrame; if (animFrame < 0) { animFrame = 0; @@ -3795,34 +3777,33 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac zDiff = obj->segment.trans.z_position - racerObj->segment.trans.z_position; if (sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < 200.0) { nodes = obj->unk64->ai_node.nodeObj; - for (var_v0 = 0; var_v0 < ARRAY_COUNT(obj->unk64->ai_node.nodeObj); var_v0++) { - if (nodes[var_v0] != NULL && racer->challengeMarker != nodes[var_v0]) { + for (i = 0; i < 4; i++) { + if (nodes[i] != NULL && racer->challengeMarker != nodes[i]) { racer->challengeMarker = obj; - racer->nodeCurrent = nodes[var_v0]; - var_v0 = ARRAY_COUNT(obj->unk64->ai_node.nodeObj); + racer->nodeCurrent = nodes[i]; + i = 4; } } - if (var_v0 != (ARRAY_COUNT(obj->unk64->ai_node.nodeObj) + 1)) { + if (i != 5) { racer->nodeCurrent = NULL; } } else { - temp = -((racer->ox3 * racerObj->segment.trans.x_position) + - (racer->oz3 * racerObj->segment.trans.z_position)); - steerAngle = - ((racer->ox3 * obj->segment.trans.x_position) + (racer->oz3 * obj->segment.trans.z_position)) + - temp; + zDiff = racer->oz3; + temp4 = + -((racer->ox3 * racerObj->segment.trans.x_position) + (zDiff * racerObj->segment.trans.z_position)); + var_f0 = (obj->segment.trans.x_position * racer->ox3) + (obj->segment.trans.z_position * zDiff) + temp4; + steerAngle = var_f0; steerAngle /= 5; } } } racer->attackType = ATTACK_NONE; racer->spinout_timer = 0; - var_f0 = racer->velocity; - var_f0 = (steerAngle * var_f0) / 360; - racerObj->segment.x_velocity -= racer->ox3 * var_f0; - racerObj->segment.y_velocity -= racer->oy3 * var_f0; - racerObj->segment.z_velocity -= racer->oz3 * var_f0; + var_f0 = (steerAngle * racer->velocity) / 360; var_f2 = 1.0f; + racerObj->segment.x_velocity -= (racer->ox3 * var_f0); + racerObj->segment.y_velocity -= (racer->oy3 * var_f0); + racerObj->segment.z_velocity -= (racer->oz3 * var_f0); if (gCurrentPlayerIndex == PLAYER_COMPUTER) { var_f2 = 1.3f; } @@ -3832,7 +3813,7 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac racerObj->segment.trans.rotation.x_rotation = 0; racer->trickType = 0; if (racer->playerIndex >= 0) { - objectMoved = 1; + objectMoved = TRUE; } } if (racer->groundedWheels == 0) { @@ -3853,7 +3834,7 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac if (var_v0 < -0x8000) { var_v0 += 0xFFFF; } - if (var_v0 > 0x1000 || var_v0 < -0x1000) { + if ((var_v0 > 0x1000) || (var_v0 < -0x1000)) { var_f2 = 0.0f; } racer->steerVisualRotation += (var_v0 >> 3); @@ -3895,10 +3876,11 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac racer->z_rotation_vel += ((D_8011D558 - racer->z_rotation_vel) >> 3); racerObj->segment.trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; temp2 = racerObj->segment.x_velocity; + temp3 = racerObj->segment.z_velocity; racer->unk1D2 = 0; - moveObjResult = move_object(racerObj, temp2 * updateRateF, racerObj->segment.y_velocity * updateRateF, - racerObj->segment.z_velocity * updateRateF); - if (moveObjResult && gCurrentPlayerIndex != PLAYER_COMPUTER) { + moveObjResult = + move_object(racerObj, temp2 * updateRateF, racerObj->segment.y_velocity * updateRateF, temp3 * updateRateF); + if ((moveObjResult) && (gCurrentPlayerIndex != -1)) { objectMoved = TRUE; } if (gCurrentPlayerIndex == PLAYER_COMPUTER) { @@ -3906,16 +3888,15 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac } else { func_80054FD0(racerObj, racer, updateRate); } - // Not sure what to do here. var_f0 = (racerObj->segment.trans.x_position - prevXPos) * (1 / updateRateF); - temp = (racerObj->segment.trans.y_position - prevYPos) * (1 / updateRateF); + racerObj->segment.y_velocity = (racerObj->segment.trans.y_position - prevYPos) * (1 / updateRateF); + temp3 = (racerObj->segment.trans.z_position - prevZPos) * (1 / updateRateF); + racerObj->segment.z_velocity = temp3; racerObj->segment.x_velocity = var_f0; - racerObj->segment.y_velocity = temp; - var_f0 = (racerObj->segment.trans.z_position - prevZPos) * (1 / updateRateF); - racerObj->segment.z_velocity = var_f0; gCurrentRacerTransform.rotation.y_rotation = -racerObj->segment.trans.rotation.y_rotation; gCurrentRacerTransform.rotation.x_rotation = -racerObj->segment.trans.rotation.x_rotation; gCurrentRacerTransform.rotation.z_rotation = 0; + gCurrentRacerTransform.scale = 1.0f; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; @@ -3935,9 +3916,6 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac func_800230D0(racerObj, racer); } } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/racer/func_8004CC20.s") -#endif /** * Handles the camera movement when the player is on a loop-the-loop. diff --git a/tools/python/score.py b/tools/python/score.py index 3ac44583..395b302e 100644 --- a/tools/python/score.py +++ b/tools/python/score.py @@ -148,16 +148,6 @@ class ScoreFile: for nonMatching in self.nonMatchings: self.nonMatchingsSizes += MAP_FILE.functionSizes[nonMatching] self.numNonMatchings = len(self.nonMatchings) -<<<<<<< HEAD - - self.nonEquivalents = re.findall(NON_EQUVIALENT_REGEX, self.text) - self.nonEquivalentsSizes = 0 - for nonEquivalent in self.nonEquivalents: - if (nonEquivalent not in NOT_FUNCTION_NAMES): - self.nonEquivalentsSizes += MAP_FILE.functionSizes[nonEquivalent] - self.numNonEquivalents = len(self.nonEquivalents) - -======= all_nonEquivalents = re.findall(NON_EQUVIALENT_REGEX, self.text) # Filter out the ones that are in NOT_FUNCTION_NAMES self.nonEquivalents = [ne for ne in all_nonEquivalents if ne not in NOT_FUNCTION_NAMES] @@ -166,7 +156,6 @@ class ScoreFile: for nonEquivalent in self.nonEquivalents: self.nonEquivalentsSizes += MAP_FILE.functionSizes[nonEquivalent] self.numNonEquivalents = len(self.nonEquivalents) ->>>>>>> master self.text = re.sub(WIP_REGEX, r"GLOBAL_ASM(\1)", self.text) def get_matches(self):