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
This commit is contained in:
Dominik Peters
2025-06-12 23:05:49 +02:00
committed by GitHub
parent e30f1c535a
commit a56933bd8c
3 changed files with 119 additions and 152 deletions
+24 -24
View File
@@ -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.
<!-- README_SCORE_SUMMARY_BEGIN -->
As of June 11, 2025, this is our current score:
As of June 12, 2025, this is our current score:
&emsp;&emsp;&emsp;&emsp;Decomp progress: 90.87%
&emsp;&emsp;&emsp;&emsp;Decomp progress: 91.17%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 59.40%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 59.08%
<!-- README_SCORE_SUMMARY_END -->
---
@@ -117,30 +117,30 @@ s32 is_drumstick_unlocked(void) {
```
<!-- README_SCORE_BEGIN -->
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)
=====================================================================
```
<!-- README_SCORE_END -->
+95 -117
View File
@@ -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.
-11
View File
@@ -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):