match: func_80012F94 (#626)

* match: func_80012F94

* refac: rename func_80012F94 to set_temp_model_transforms

---------

Co-authored-by: Dominik Peters <dominik.peters@committance.com>
This commit is contained in:
Dominik Peters
2025-06-16 20:22:47 +02:00
committed by GitHub
co-authored by Dominik Peters
parent fcb113ce7f
commit ea9e21fa64
8 changed files with 85 additions and 90 deletions
+8 -8
View File
@@ -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.
<!-- README_SCORE_SUMMARY_BEGIN -->
As of June 12, 2025, this is our current score:
As of June 16, 2025, this is our current score:
&emsp;&emsp;&emsp;&emsp;Decomp progress: 91.17%
&emsp;&emsp;&emsp;&emsp;Decomp progress: 91.31%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 59.08%
<!-- README_SCORE_SUMMARY_END -->
@@ -117,20 +117,20 @@ s32 is_drumstick_unlocked(void) {
```
<!-- README_SCORE_BEGIN -->
As of June 12, 2025, this is our current score:
As of June 16, 2025, this is our current score:
```
=====================================================================
ADVENTURE ONE (ASM -> C Decompilation)
--------------- 91.17% Complete (91.94% NON_MATCHING) ---------------
# Decompiled functions: 1914
# GLOBAL_ASM remaining: 30
--------------- 91.31% Complete (92.09% NON_MATCHING) ---------------
# Decompiled functions: 1918
# GLOBAL_ASM remaining: 29
# NON_MATCHING functions: 4
# NON_EQUIVALENT WIP functions: 26
# NON_EQUIVALENT WIP functions: 25
---------------------------- Game Status ----------------------------
Balloons: 43/47, Keys: 4/4, Trophies: 4/5
T.T. Amulets: 4/4, Wizpig Amulets: 4/4
---------------------------------------------------------------------
We are collecting silver coins in Spacedust Alley. (1/8 silver coins)
We are collecting silver coins in Spacedust Alley. (2/8 silver coins)
=====================================================================
ADVENTURE TWO (Cleanup & Documentation)
-------------------------- 59.08% Complete --------------------------
+71 -76
View File
@@ -3694,27 +3694,21 @@ void object_undo_player_tumble(Object *obj) {
}
}
// https://decomp.me/scratch/TZSwt
#ifdef NON_EQUIVALENT
// set_temp_model_transforms
void func_80012F94(Object *obj) {
u8 *bossAsset;
ObjectModel *temp_a1_3;
Object_Racer *objRacer;
Object_68 **var_v0;
Object_68 *new_var;
f32 ret1;
f32 var_f0_2;
f32 ret2;
u8 *var_a1;
s32 temp_f6;
s32 temp_v1;
s32 bossVehicleId;
s32 racerLightTimer;
void set_temp_model_transforms(Object *obj) {
s32 batchNum;
ObjectModel *objModel;
s32 var_v1;
Object_68 **obj68List;
Object_68 *obj68;
u8 *bossAsset;
f32 var_f0;
u8 *var_a1;
f32 ret2;
UNUSED s32 pad;
Object_Racer *objRacer;
f32 ret1;
s32 firstNonEmptyUnk68ObjectIndex;
s32 var_t0;
s32 modelIndex;
s32 numberOfModels;
ret1 = 1.0f;
@@ -3730,106 +3724,110 @@ void func_80012F94(Object *obj) {
}
}
if (objRacer->playerIndex != PLAYER_COMPUTER && objRacer->raceFinished) {
var_t0 = 0;
modelIndex = 0;
batchNum = 0;
} else {
if (obj->behaviorId == BHV_TIMETRIAL_GHOST) { // Ghost Object?
var_t0 = 1;
modelIndex = 1;
batchNum = 0;
} else {
// Loads vehicles between VEHICLE_TRICKY and VEHICLE_SMOKEY. So all boss vehicles except wizpig.
var_t0 = objRacer->vehicleID + VEHICLE_BOSSES;
batchNum = objRacer->vehicleID;
if (objRacer->vehicleID >= NUMBER_OF_PLAYER_VEHICLES) {
var_t0 = VEHICLE_BOSSES;
batchNum = 0;
}
bossAsset = (u8 *) get_misc_asset(batchNum + VEHICLE_BOSSES); // 40 bytes of data u8[8][5]?
batchNum = 0;
bossAsset = (u8 *) get_misc_asset(var_t0); // 40 bytes of data u8[8][5]?
bossAsset = &bossAsset[(cam_get_viewport_layout() * 10)];
var_a1 = bossAsset;
bossAsset += cam_get_viewport_layout() * 10;
if (get_current_viewport() != objRacer->playerIndex) {
var_a1 += 5;
bossAsset += 5;
}
var_f0_2 = obj->segment.object.distanceToCamera;
temp_v1 = (s32) var_f0_2 >> 3;
var_f0 = obj->segment.object.distanceToCamera;
var_v1 = (s32) var_f0 >> 3;
if (obj->segment.object.distanceToCamera < 0.0f) {
var_f0_2 = 0.0f;
} else if (var_f0_2 > 3500.0f) {
var_f0_2 = 3500.0f;
var_f0 = 0.0f;
} else if (var_f0 > 3500.0f) {
var_f0 = 3500.0f;
}
obj->segment.trans.scale *= (var_f0_2 / 2700.0f) + 1.0f;
temp_f6 = (s32) ((f32) temp_v1 * *((f32 *) get_misc_asset(ASSET_MISC_4)[objRacer->characterId]));
var_f0 /= 2700.0f;
var_f0 += 1.0f;
obj->segment.trans.scale *= var_f0;
var_v1 *= ((f32 *) get_misc_asset(ASSET_MISC_4))[objRacer->characterId];
// ASSET_MISC_4 is just 10 floats of 1.0f. One for each playable character.
if (temp_f6 < -50) {
var_t0 = 5;
if (var_v1 < -50) {
modelIndex = 5;
} else {
racerLightTimer = MIN(temp_f6 >> 1, 0);
var_v1 = racerLightTimer;
if (var_v1 < var_a1[0]) {
var_t0 = 0;
} else if (var_v1 < var_a1[1]) {
var_t0 = 1;
} else if (var_v1 < var_a1[2]) {
var_t0 = 2;
} else if (var_v1 < var_a1[3]) {
var_t0 = 3;
} else if (var_v1 < var_a1[4]) {
var_t0 = 4;
var_v1 >>= 1;
if (var_v1 < 0) {
var_v1 = 0;
}
if (var_v1 < bossAsset[0]) {
modelIndex = 0;
} else if (var_v1 < bossAsset[1]) {
modelIndex = 1;
} else if (var_v1 < bossAsset[2]) {
modelIndex = 2;
} else if (var_v1 < bossAsset[3]) {
modelIndex = 3;
} else if (var_v1 < bossAsset[4]) {
modelIndex = 4;
} else {
var_t0 = 5;
modelIndex = 5;
}
}
}
}
firstNonEmptyUnk68ObjectIndex = 0;
var_v0 = &obj->unk68[firstNonEmptyUnk68ObjectIndex];
obj68List = &obj->unk68[firstNonEmptyUnk68ObjectIndex];
while (*var_v0 == NULL) {
while (*obj68List == NULL) {
firstNonEmptyUnk68ObjectIndex++;
var_v0++;
obj68List++;
}
numberOfModels = obj->segment.header->numberOfModelIds - 1;
var_v0 = &obj->unk68[numberOfModels];
obj68List = &obj->unk68[numberOfModels];
while (*var_v0 == NULL) {
while (*obj68List == NULL) {
numberOfModels--;
var_v0--;
obj68List--;
}
if (var_t0 < firstNonEmptyUnk68ObjectIndex) {
var_t0 = firstNonEmptyUnk68ObjectIndex;
if (modelIndex < firstNonEmptyUnk68ObjectIndex) {
modelIndex = firstNonEmptyUnk68ObjectIndex;
}
if (numberOfModels < var_t0) {
var_t0 = numberOfModels;
if (numberOfModels < modelIndex) {
modelIndex = numberOfModels;
}
obj->segment.object.modelIndex = var_t0;
obj->segment.object.modelIndex = modelIndex;
if ((obj->shading != NULL) && (obj->shading->unk0 < 0.6f)) {
objRacer->lightFlags |= RACER_LIGHT_NIGHT;
} else {
objRacer->lightFlags &= ~RACER_LIGHT_NIGHT;
}
racerLightTimer = objRacer->lightFlags & RACER_LIGHT_TIMER;
new_var = obj->unk68[obj->segment.object.modelIndex];
temp_a1_3 = new_var->objModel;
if (racerLightTimer != 0) {
racerLightTimer--;
modelIndex = objRacer->lightFlags & RACER_LIGHT_TIMER;
obj68 = obj->unk68[obj->segment.object.modelIndex];
objModel = obj68->objModel;
if (modelIndex != 0) {
modelIndex--;
if (objRacer->lightFlags & RACER_LIGHT_BRAKE) {
racerLightTimer += 1;
modelIndex += 1;
objRacer->lightFlags = (objRacer->lightFlags & ~RACER_LIGHT_UNK10) | RACER_LIGHT_UNK20;
} else if (objRacer->lightFlags & RACER_LIGHT_NIGHT) {
racerLightTimer += 3;
modelIndex += 3;
objRacer->lightFlags = (objRacer->lightFlags & ~RACER_LIGHT_UNK20) | RACER_LIGHT_UNK10;
} else if (objRacer->lightFlags & RACER_LIGHT_UNK20) {
racerLightTimer += 1;
modelIndex += 1;
} else {
racerLightTimer += 3;
modelIndex += 3;
}
}
racerLightTimer *= 4;
for (batchNum = 0; batchNum < temp_a1_3->numberOfBatches; batchNum++) {
if ((temp_a1_3->batches[batchNum].flags & 0x810000) == RENDER_TEX_ANIM) {
temp_a1_3->batches[batchNum].texOffset = racerLightTimer;
modelIndex *= 4;
for (batchNum = 0; batchNum < objModel->numberOfBatches; batchNum++) {
if ((objModel->batches[batchNum].flags & 0x810000) == RENDER_TEX_ANIM) {
objModel->batches[batchNum].texOffset = modelIndex;
}
}
obj->segment.trans.x_position += objRacer->carBobX;
@@ -3843,9 +3841,6 @@ void func_80012F94(Object *obj) {
gObjectModelScaleY = ret1;
gCurrentLightIntensity = ret2;
}
#else
#pragma GLOBAL_ASM("asm/nonmatchings/objects/func_80012F94.s")
#endif
/**
* Determine which model type the object is using, then call the related function to render it.
@@ -3853,7 +3848,7 @@ void func_80012F94(Object *obj) {
* Afterwards, undo that.
*/
void render_object_parts(Object *obj) {
func_80012F94(obj);
set_temp_model_transforms(obj);
if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) {
render_particle((Particle *) obj, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList,
PARTICLE_UNK_FLAG_8000);
+1 -1
View File
@@ -546,7 +546,7 @@ s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ
void obj_tex_animate(Object *, s32);
Object *find_furthest_telepoint(f32 x, f32 z);
void func_8006017C(ObjectModel *);
void func_80012F94(Object *);
void set_temp_model_transforms(Object *);
void func_800101AC(Object *, s32);
void func_800135B8(Object *);
void func_8000CC7C(Vehicle, u32, s32);
+1 -1
View File
@@ -256,7 +256,7 @@ func_80012CE8 = 0x80012CE8;
render_object = 0x80012D5C;
object_do_player_tumble = 0x80012E28;
object_undo_player_tumble = 0x80012F30;
func_80012F94 = 0x80012F94;
set_temp_model_transforms = 0x80012F94;
render_object_parts = 0x8001348C;
unset_temp_model_transforms = 0x80013548;
func_800135B8 = 0x800135B8;
+1 -1
View File
@@ -256,7 +256,7 @@ func_80012CE8 = 0x80012CE8;
render_object = 0x80012D5C;
object_do_player_tumble = 0x80012E28;
object_undo_player_tumble = 0x80012F30;
func_80012F94 = 0x80012F94;
set_temp_model_transforms = 0x80012F94;
render_object_parts = 0x8001348C;
unset_temp_model_transforms = 0x80013548;
func_800135B8 = 0x800135B8;
+1 -1
View File
@@ -256,7 +256,7 @@ func_80012CE8 = 0x80012CE8;
render_object = 0x80012D5C;
object_do_player_tumble = 0x80012E28;
object_undo_player_tumble = 0x80012F30;
func_80012F94 = 0x80012F94;
set_temp_model_transforms = 0x80012F94;
render_object_parts = 0x8001348C;
unset_temp_model_transforms = 0x80013548;
func_800135B8 = 0x800135B8;
+1 -1
View File
@@ -256,7 +256,7 @@ func_80012CE8 = 0x80012CE8;
render_object = 0x80012D5C;
object_do_player_tumble = 0x80012E28;
object_undo_player_tumble = 0x80012F30;
func_80012F94 = 0x80012F94;
set_temp_model_transforms = 0x80012F94;
render_object_parts = 0x8001348C;
unset_temp_model_transforms = 0x80013548;
func_800135B8 = 0x800135B8;
+1 -1
View File
@@ -256,7 +256,7 @@ func_80012CE8 = 0x80012CE8;
render_object = 0x80012D5C;
object_do_player_tumble = 0x80012E28;
object_undo_player_tumble = 0x80012F30;
func_80012F94 = 0x80012F94;
set_temp_model_transforms = 0x80012F94;
render_object_parts = 0x8001348C;
unset_temp_model_transforms = 0x80013548;
func_800135B8 = 0x800135B8;