From 5255e7fa52535eab96e53fbcb488d1fc493e7c08 Mon Sep 17 00:00:00 2001 From: Dominik Peters Date: Thu, 3 Jul 2025 21:33:07 +0200 Subject: [PATCH] update current code to match scratches on decomp.me (#662) * chore: update current code to match scratches on decomp.me * update score --- README.md | 6 +- include/structs.h | 5 + src/objects.c | 1314 ++++++++++++++++++++------------------------- src/particles.c | 55 +- src/printf.c | 473 ++++++++-------- src/racer.c | 163 +++--- src/racer.h | 2 +- src/tracks.c | 212 ++++---- 8 files changed, 1041 insertions(+), 1189 deletions(-) diff --git a/README.md b/README.md index 21022892..018d3dd9 100644 --- a/README.md +++ b/README.md @@ -121,11 +121,11 @@ As of July 3, 2025, this is our current score: ``` ====================================================================== ADVENTURE ONE (ASM -> C Decompilation) - --------------- 96.43% Complete (97.13% NON_MATCHING) ---------------- + --------------- 96.43% Complete (97.33% NON_MATCHING) ---------------- # Decompiled functions: 1939 # GLOBAL_ASM remaining: 13 - # NON_MATCHING functions: 4 - # NON_EQUIVALENT WIP functions: 9 + # NON_MATCHING functions: 5 + # NON_EQUIVALENT WIP functions: 8 ---------------------------- Game Status ----------------------------- Balloons: 46/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 33f975a1..d1407336 100644 --- a/include/structs.h +++ b/include/structs.h @@ -1717,4 +1717,9 @@ typedef struct GhostNode { /* 0x08 */ s16 xRotation; /* 0x0A */ s16 yRotation; } GhostNode; + +typedef struct CollisionNode { + u16 colPlaneIndex; // This triangle index + u16 closestTri[3]; +} CollisionNode; #endif diff --git a/src/objects.c b/src/objects.c index aaa97eae..1f419450 100644 --- a/src/objects.c +++ b/src/objects.c @@ -330,7 +330,7 @@ s32 D_8011AF2C; ShadeProperties *gWorldShading; // Effectively unused. s32 D_8011AF34; s32 D_8011AF38[10]; -Object_MidiFade *D_8011AF60[2]; +Object_MidiFade *D_8011AF60; TexCoords D_8011AF68[32]; Vec3s gEnvmapPos[2]; unk800179D0 *D_8011AFF4; @@ -858,7 +858,7 @@ void clear_object_pointers(void) { gTransformTimer = 0; gIsTajChallenge = FALSE; gTajRaceInit = 0; - D_8011AF60[0] = 0; + D_8011AF60 = NULL; D_8011AE00 = 0; D_8011AE01 = TRUE; D_8011AD53 = 0; @@ -4628,7 +4628,7 @@ void process_object_interactions(void) { } } -// https://decomp.me/scratch/Hubco +// https://decomp.me/scratch/Hg44X #ifdef NON_EQUIVALENT void func_800159C8(Object *arg0, Object *arg1) { f32 sp9C; @@ -4652,9 +4652,6 @@ void func_800159C8(Object *arg0, Object *arg1) { ObjectInteraction *sp54; Object_Racer *sp50; Object_Racer *sp4C; - f32 sp48; - f32 sp44; - f32 sp40; sp68 = arg1->trans.x_position - arg0->trans.x_position; sp64 = arg1->trans.y_position - arg0->trans.y_position; @@ -4682,9 +4679,11 @@ void func_800159C8(Object *arg0, Object *arg1) { if (sp58->flags & 0x20) { var_v0 >>= 3; } + if (var_v0 > 255) { var_v0 = 255; } + if (sp58->distance >= var_v0) { sp58->obj = arg1; sp58->distance = var_v0; @@ -4694,185 +4693,192 @@ void func_800159C8(Object *arg0, Object *arg1) { if (sp54->flags & 0x20) { var_v0 >>= 3; } + if (var_v0 > 255) { var_v0 = 255; } + if (sp54->distance >= var_v0) { sp54->obj = arg0; sp54->distance = var_v0; } - if (sp54->flags & 1) { - sp98 = sp54->hitboxRadius + sp58->hitboxRadius; + if (!(sp54->flags & 1)) { + return; + } - sp7C = arg0->trans.x_position - sp58->x_position; - sp78 = arg0->trans.y_position - sp58->y_position; - sp74 = arg0->trans.z_position - sp58->z_position; + sp98 = sp54->hitboxRadius + sp58->hitboxRadius; + sp7C = arg0->trans.x_position - sp58->x_position; + sp78 = arg0->trans.y_position - sp58->y_position; + sp74 = arg0->trans.z_position - sp58->z_position; + + if (sp54->unk11 == 1) { + sp78 = 0.0f; + } + + temp_f10 = sp7C * sp7C + sp78 * sp78 + sp74 * sp74; + if (temp_f10 > 1.0) { + var_f2 = + ((arg1->trans.x_position - sp58->x_position) * sp7C + (arg1->trans.y_position - sp58->y_position) * sp78 + + (arg1->trans.z_position - sp58->z_position) * sp74) / + temp_f10; + if (var_f2 >= 0.0f && var_f2 <= 1.0) { + sp8C = sp58->x_position + var_f2 * sp7C; + sp88 = sp58->y_position + var_f2 * sp78; + sp84 = sp58->z_position + var_f2 * sp74; + sp9C = sqrtf((sp8C - arg1->trans.x_position) * (sp8C - arg1->trans.x_position) + + (sp88 - arg1->trans.y_position) * (sp88 - arg1->trans.y_position) + + (sp84 - arg1->trans.z_position) * (sp84 - arg1->trans.z_position)); + } + } + + if (sp9C < sp98 && sp9C > 0.0f) { + sp8C = sp54->x_position - sp58->x_position; + sp88 = sp54->y_position - sp58->y_position; + sp84 = sp54->z_position - sp58->z_position; if (sp54->unk11 == 1) { - sp78 = 0.0f; + sp88 = 0.0f; } - if (sp7C * sp7C + sp78 * sp78 + sp74 * sp74 > 1.0) { - sp48 = arg1->trans.x_position; - sp44 = arg1->trans.y_position; - sp40 = arg1->trans.z_position; - var_f2 = ((sp48 - sp58->x_position) * sp7C + (sp44 - sp58->y_position) * sp78 + - (sp40 - sp58->z_position) * sp74) / - (sp7C * sp7C + sp78 * sp78 + sp74 * sp74); - if (var_f2 >= 0.0f && var_f2 <= 1.0) { - sp8C = sp58->x_position + var_f2 * sp7C; - sp88 = sp58->y_position + var_f2 * sp78; - sp84 = sp58->z_position + var_f2 * sp74; - sp9C = sqrtf((sp8C - sp48) * (sp8C - sp48) + (sp88 - sp44) * (sp88 - sp44) + - (sp84 - sp40) * (sp84 - sp40)); - } + temp_f0_3 = sqrtf(sp8C * sp8C + sp88 * sp88 + sp84 * sp84); + if (temp_f0_3 > 0.0f) { + sp68 = sp8C / temp_f0_3; + sp64 = sp88 / temp_f0_3; + sp60 = sp84 / temp_f0_3; + } else { + sp68 /= sp9C; + sp64 /= sp9C; + sp60 /= sp9C; } - if (sp9C < sp98 && sp9C > 0.0f) { - sp8C = sp54->x_position - sp58->x_position; - sp88 = sp54->y_position - sp58->y_position; - sp84 = sp54->z_position - sp58->z_position; - if (sp54->unk11 == 1) { - sp88 = 0.0f; + sp9C = temp_f0_3 - sp9C; + if (sp9C < 0.0f) { + sp9C = -sp9C; + } + + sp68 *= sp9C; + sp64 *= sp9C; + sp60 *= sp9C; + sp9C *= sp80; + sp58->flags |= 8; + sp54->flags |= 8; + if (sp54->pushForce == 0) { + arg0->trans.x_position -= sp68; + arg0->trans.y_position -= sp64; + arg0->trans.z_position -= sp60; + + sp68 *= sp80; + sp60 *= sp80; + if (arg0->behaviorId != 1) { + return; } - temp_f0_3 = sqrtf(sp8C * sp8C + sp88 * sp88 + sp84 * sp84); - if (temp_f0_3 > 0.0f) { - sp68 = sp8C / temp_f0_3; - sp64 = sp88 / temp_f0_3; - sp60 = sp84 / temp_f0_3; - } else { - sp68 /= sp9C; - sp64 /= sp9C; - sp60 /= sp9C; - } - sp9C = temp_f0_3 - sp9C; - if (sp9C < 0.0f) { - sp9C = -sp9C; - } - - sp68 *= sp9C; - sp64 *= sp9C; - sp60 *= sp9C; - sp9C *= sp80; - sp58->flags |= 8; - sp54->flags |= 8; - if (sp54->pushForce == 0) { - arg0->trans.x_position -= sp68; - arg0->trans.y_position -= sp64; - arg0->trans.z_position -= sp60; - - sp68 *= sp80; - sp60 *= sp80; - if (arg0->behaviorId == 1) { - sp50 = arg0->racer; - var_v0 = FALSE; - if (sp50->vehicleID == 1) { - if (sp9C > 0.3) { - if (sp9C > 1.0) { - var_v0 = TRUE; - } - if (var_v0) { - arg0->x_velocity *= 0.8; - arg0->z_velocity *= 0.8; - } - if (var_v0) { - sp54->flags |= 0x40; - var_f2 = (arg0->trans.x_position * arg0->z_velocity - - arg0->trans.z_position * arg0->x_velocity); - var_f2 = (arg1->trans.x_position * arg0->z_velocity - - arg1->trans.z_position * arg0->x_velocity) - - var_f2; - sp50->unk1D2 = 7; - if (var_f2 >= 0.0f) { - sp50->unk120 = arg0->x_velocity * 0.1; - sp50->unk11C = -arg0->z_velocity * 0.1; - } else { - sp50->unk120 = -arg0->x_velocity * 0.1; - sp50->unk11C = arg0->z_velocity * 0.1; - } - } - } - } else { - if (sp9C > 0.3) { - if (sp9C > 1.0) { - var_v0 = 1; - } - arg0->x_velocity -= sp68; - arg0->z_velocity -= sp60; - sp50->velocity = sp9C * 0.25; - sp50->lateral_velocity = 0.0f; - } - if (var_v0) { - sp54->flags |= 0x40; - var_f2 = - arg0->trans.x_position * arg0->z_velocity - arg0->trans.z_position * arg0->x_velocity; - var_f2 = arg1->trans.x_position * arg0->z_velocity - - arg1->trans.z_position * arg0->x_velocity - var_f2; - if (var_f2 >= 0.0f) { - var_f2 = 2.0f; - } else { - var_f2 = -2.0f; - } - sp50->unk1D2 = 7; - sp50->unk11C = sp50->ox3 * var_f2 * sp50->velocity; - sp50->unk120 = sp50->oz3 * var_f2 * sp50->velocity; - } - } - if (var_v0 && sp50->playerIndex != -1) { - func_80016500(arg0, sp50); - } - } - } else { - sp68 *= 0.5; - sp64 *= 0.5; - sp60 *= 0.5; - if (sp58->pushForce != 0) { - arg0->trans.x_position -= sp68; - arg0->trans.y_position -= sp64; - arg0->trans.z_position -= sp60; - } - arg1->trans.x_position += sp68; - arg1->trans.y_position += sp64; - arg1->trans.z_position += sp60; - - sp68 *= sp80; - sp60 *= sp80; - if (arg0->behaviorId == 1 && arg1->behaviorId == 1) { - sp90 = 1.0f; - sp90 += (f32) (sp58->pushForce - sp54->pushForce) * 0.3; - - sp50 = arg0->racer; - sp4C = arg1->racer; - - if (sp50->shieldType != 0 && sp4C->shieldType == 0) { - sp4C->spinout_timer = sp50->shieldType; - } - if (sp4C->shieldType != 0 && sp50->shieldType == 0) { - sp50->spinout_timer = sp4C->shieldType; - } - - var_v0 = FALSE; - if (sp50->vehicleID == 1) { + sp50 = arg0->racer; + var_v0 = FALSE; + if (sp50->vehicleID == 1) { + if (sp9C > 0.3) { + if (sp9C > 1.0) { var_v0 = TRUE; - } else if (sp9C > 0.1) { - var_v0 = TRUE; - sp68 *= 0.5; - sp60 *= 0.5; } - if (var_v0) { - if (sp58->pushForce != 0) { - temp_f0_3 = 2.0 - sp90; - arg0->x_velocity -= sp68 * temp_f0_3; - arg0->z_velocity -= sp60 * temp_f0_3; - func_80016500(arg0, sp50); + arg0->x_velocity *= 0.8; + arg0->z_velocity *= 0.8; + } + if (var_v0) { + sp54->flags |= 0x40; + var_f2 = + (arg0->trans.x_position * arg0->z_velocity - arg0->trans.z_position * arg0->x_velocity); + var_f2 = + (arg1->trans.x_position * arg0->z_velocity - arg1->trans.z_position * arg0->x_velocity) - + var_f2; + sp50->unk1D2 = 7; + if (var_f2 >= 0.0f) { + sp50->unk120 = arg0->x_velocity * 0.1; + sp50->unk11C = -arg0->z_velocity * 0.1; + } else { + sp50->unk120 = -arg0->x_velocity * 0.1; + sp50->unk11C = arg0->z_velocity * 0.1; } - arg1->x_velocity += sp68 * sp90; - arg1->z_velocity += sp60 * sp90; - func_80016500(arg1, sp4C); } } + } else { + if (sp9C > 0.3) { + if (sp9C > 1.0) { + var_v0 = 1; + } + arg0->x_velocity -= sp68; + arg0->z_velocity -= sp60; + sp50->velocity = sp9C * 0.25; + sp50->lateral_velocity = 0.0f; + } + if (var_v0) { + sp54->flags |= 0x40; + var_f2 = arg0->trans.x_position * arg0->z_velocity - arg0->trans.z_position * arg0->x_velocity; + var_f2 = + arg1->trans.x_position * arg0->z_velocity - arg1->trans.z_position * arg0->x_velocity - var_f2; + if (var_f2 >= 0.0f) { + var_f2 = 2.0f; + } else { + var_f2 = -2.0f; + } + sp50->unk1D2 = 7; + sp50->unk11C = sp50->ox3 * var_f2 * sp50->velocity; + sp50->unk120 = sp50->oz3 * var_f2 * sp50->velocity; + } + } + if (var_v0 && sp50->playerIndex != -1) { + func_80016500(arg0, sp50); + } + return; + } + + sp68 *= 0.5; + sp64 *= 0.5; + sp60 *= 0.5; + if (sp58->pushForce != 0) { + arg0->trans.x_position -= sp68; + arg0->trans.y_position -= sp64; + arg0->trans.z_position -= sp60; + } + arg1->trans.x_position += sp68; + arg1->trans.y_position += sp64; + arg1->trans.z_position += sp60; + + sp68 *= sp80; + sp60 *= sp80; + if (arg0->behaviorId == 1 && arg1->behaviorId == 1) { + sp90 = 1.0f; + sp90 += (f32) (sp58->pushForce - sp54->pushForce) * 0.3; + + sp50 = arg0->racer; + sp4C = arg1->racer; + + if (sp50->shieldType != 0 && sp4C->shieldType == 0) { + sp4C->spinout_timer = sp50->shieldType; + } + if (sp4C->shieldType != 0 && sp50->shieldType == 0) { + sp50->spinout_timer = sp4C->shieldType; + } + + var_v0 = FALSE; + if (sp50->vehicleID == 1) { + var_v0 = TRUE; + } else if (sp9C > 0.1) { + var_v0 = TRUE; + sp68 *= 0.5; + sp60 *= 0.5; + } + + if (var_v0) { + if (sp58->pushForce != 0) { + temp_f0_3 = 2.0 - sp90; + arg0->x_velocity -= sp68 * temp_f0_3; + arg0->z_velocity -= sp60 * temp_f0_3; + func_80016500(arg0, sp50); + } + arg1->x_velocity += sp68 * sp90; + arg1->z_velocity += sp60 * sp90; + func_80016500(arg1, sp4C); } } } @@ -5176,275 +5182,162 @@ void obj_collision_transform(Object *obj) { colData->collidedObj = NULL; } -// https://decomp.me/scratch/Lxwa8 -#ifdef NON_EQUIVALENT -s32 func_80017248(Object *obj, s32 arg1, s32 *arg2, Vec3f *arg3, f32 *arg4, f32 *arg5, s8 *surface) { +// https://decomp.me/scratch/RBmJV +#ifdef NON_MATCHING +s32 func_80017248(Object *obj, s32 arg1, s32 *arg2, f32 *arg3, f32 *arg4, f32 *arg5, s8 *surface) { + ModelInstance *modInst; s32 sp170; s32 sp16C; s32 sp168; + s32 j; // fp // sp164 s32 sp160; - Object *otherObj; // sp158 - ObjectModel *objModel; // sp154 + f32 dist; // sp15C + Object *sp158; + ObjectModel *sp154; + f32 temp; unk800179D0 *sp14C; - f32 sp13C; - f32 sp12C; - f32 sp11C; - f32 *sp100; - f32 *spF0; - f32 *spE0; + f32 sp13C[4]; + f32 sp12C[4]; + f32 sp11C[4]; + s32 i; + ObjectCollision *collision; + s32 tempv0; + f32 sp100[4]; + f32 spF0[4]; + f32 spE0[4]; MtxF *spDC; - s32 spB8; - s32 *spB4; - f32 *sp8C; - s32 *sp88; - Object *temp_a1; - Object *temp_v0; - ObjectInteraction *temp_v1; - ObjectCollision *temp_v0_2; - ObjectCollision *temp_v0_5; - Vec3f *var_s0_2; - f32 temp_f0; - f32 temp_f0_2; - f32 temp_f14; - f32 temp_f2; - f32 var_f0; - f32 var_f2; - f32 *temp_v1_2; - f32 *var_s1_2; - f32 *var_s1_3; - f32 *var_s2_2; - f32 *var_s2_3; - f32 *var_s3; - f32 *var_s3_2; - f32 *var_s4; - f32 *var_s4_2; - f32 *var_s5; - f32 *var_s5_2; - f32 *var_s6; - f32 *var_s6_2; - f32 *var_s7; - f32 *var_s7_2; - f32 *var_v1; - s32 temp_f16; - s32 temp_t0; - s32 temp_t2; - s32 temp_t2_2; - s32 temp_t6; - s32 temp_t7; - s32 temp_v0_4; - s32 temp_v0_6; - s32 temp_v0_7; - s32 var_a3; - s32 var_fp; - s32 var_fp_2; - s32 var_fp_3; - s32 var_s1; - s32 var_s2; - s32 var_t0; - s32 var_t0_2; - s32 *var_v0; - unk800179D0 *temp_v0_3; - unk800179D0 *var_s0; - unk800179D0 *temp_s0; + s32 spB4[10]; + f32 sp8C[10]; sp160 = 0; + + for (sp170 = 0; sp170 < gCollisionObjectCount; sp170++) { + sp158 = gCollisionObjects[sp170]; + modInst = sp158->modelInstances[sp158->modelIndex]; + sp154 = modInst->objModel; + + temp = sp158->trans.x_position - obj->trans.x_position; + dist = sqrtf( + (temp) * (temp) + + (sp158->trans.y_position - obj->trans.y_position) * (sp158->trans.y_position - obj->trans.y_position) + + (sp158->trans.z_position - obj->trans.z_position) * (sp158->trans.z_position - obj->trans.z_position)); + + j = dist; + if (sp158->interactObj->flags & 0x20) { + j >>= 3; + } + if (j > 255) { + j = 255; + } + if (sp158->interactObj->distance > j) { + sp158->interactObj->distance = j; + sp158->interactObj->obj = obj; + } + + if (dist - 25.0f < sp154->unk3C * sp158->trans.scale) { + spB4[sp160] = sp170; + sp8C[sp160] = dist; + + // clang-format off + for (i = sp160; i > 0 && sp8C[i - 1] < sp8C[i]; i--) {\ + temp = sp8C[i];\ + sp16C = spB4[i];\ + sp8C[i] = sp8C[i - 1];\ + spB4[i] = spB4[i - 1];\ + sp8C[i - 1] = temp; + spB4[i - 1] = sp16C; + } + // clang-format on + + sp160++; + } + } + + sp168 = 0; sp170 = 0; - if (gCollisionObjectCount > 0) { - var_s2 = 0; - do { - temp_v0 = *(gCollisionObjects + var_s2); - objModel = temp_v0->modelInstances[temp_v0->modelIndex]->objModel; - temp_f14 = temp_v0->trans.x_position - obj->trans.x_position; - temp_f0 = temp_v0->trans.y_position - obj->trans.y_position; - temp_f2 = temp_v0->trans.z_position - obj->trans.z_position; - otherObj = temp_v0; - temp_f0_2 = sqrtf((temp_f14 * temp_f14) + (temp_f0 * temp_f0) + (temp_f2 * temp_f2)); - temp_v1 = otherObj->interactObj; - temp_f16 = (s32) temp_f0_2; - var_fp = temp_f16; - if (temp_v1->flags & 0x20) { - var_fp = temp_f16 >> 3; + while (sp170 < sp160) { + sp158 = gCollisionObjects[spB4[sp170]]; + modInst = sp158->modelInstances[sp158->modelIndex]; + sp154 = modInst->objModel; + collision = sp158->collisionData; +#ifdef AVOID_UB + spDC = &collision->matrices[((sp158->collisionData->mtxFlip + 1) & 1)]; +#else + spDC = (MtxF *) &collision->_matrices[((sp158->collisionData->mtxFlip + 1) & 1) << 1]; +#endif + + sp14C = func_8001790C((u32 *) obj, (u32 *) sp158); + if (sp14C != NULL) { + for (i = 0, j = 0; j < arg1; j++, i += 3) { + sp13C[j] = sp14C->unk0C[i + 0]; + sp12C[j] = sp14C->unk0C[i + 1]; + sp11C[j] = sp14C->unk0C[i + 2]; + mtxf_transform_point(spDC, arg4[i], arg4[i + 1], arg4[i + 2], &sp100[j], &spF0[j], &spE0[j]); } - var_s2 += 4; - if (var_fp >= 0x100) { - var_fp = 0xFF; + } else { + for (i = 0, j = 0; j < arg1; j++, i += 3) { + mtxf_transform_point(spDC, arg3[i], arg3[i + 1], arg3[i + 2], &sp13C[j], &sp12C[j], &sp11C[j]); } - if (var_fp < (s32) temp_v1->distance) { - temp_v1->distance = (u8) var_fp; - otherObj->interactObj->obj = obj; + } + + for (i = 0, j = 0; j < arg1; j++, i += 3) { + mtxf_transform_point(spDC, arg4[i], arg4[i + 1], arg4[i + 2], &sp100[j], &spF0[j], &spE0[j]); + } + + arg2[0] = 0; + tempv0 = func_80017A18(sp154, arg1, arg2, sp13C, sp12C, sp11C, sp100, spF0, spE0, arg5, surface, + 1.0 / sp158->trans.scale); + if (tempv0 != 0) { + + // @fake + if (!j) {} + + sp158->collisionData->collidedObj = obj; + } + + if (D_8011AD24[0] == 0) { + sp14C = func_80017978(obj, sp158); + } + +#ifdef AVOID_UB + spDC = &sp158->collisionData->matrices[(sp158->collisionData->mtxFlip + 2)]; +#else + spDC = (MtxF *) &sp158->collisionData->_matrices[(sp158->collisionData->mtxFlip + 2) << 1]; +#endif + + // @fake + if (sp158) {} + + sp16C = 1; + for (i = 0, j = 0; j < arg1; j++, i += 3, sp16C <<= 1) { + if (sp14C != NULL) { + sp14C->unk0C[i + 0] = sp100[j]; + sp14C->unk0C[i + 1] = spF0[j]; + sp14C->unk0C[i + 2] = spE0[j]; } - temp_v1_2 = &(&sp8C[0])[sp160]; - if ((temp_f0_2 - 25.0f) < (objModel->unk3C * otherObj->trans.scale)) { - (&spB4[0])[sp160] = sp170; - temp_v1_2[0] = temp_f0_2; - if (sp160 > 0) { - var_v1 = &(&sp8C[0])[sp160]; - if (temp_v1_2[-1] < temp_v1_2[0]) { - var_f0 = var_v1[-1]; - var_f2 = var_v1[0]; - var_v0 = &(&spB4[0])[sp160]; - loop_12: - temp_t0 = var_v0[0]; - temp_t7 = var_v0[-1]; - var_v0--; - var_v1[0] = var_f0; - var_v1[-1] = var_f2; - var_v1--; - var_v0[0] = temp_t0; - var_v0[1] = temp_t7; - if ((u32) var_v0 >= (u32) &spB8) { - var_f0 = var_v1[-1]; - var_f2 = var_v1[0]; - if (var_f0 < var_f2) { - goto loop_12; - } - } - } - } - sp160 += 1; + if (tempv0 & sp16C) { + mtxf_transform_point(spDC, sp100[j], spF0[j], spE0[j], &arg4[i + 0], &arg4[i + 1], &arg4[i + 2]); } - temp_t2 = sp170 + 1; - sp170 = temp_t2; - } while (temp_t2 < gCollisionObjectCount); - sp170 = 0; + } + + sp168 |= tempv0; + sp170++; } - var_a3 = 0; - if (sp160 > 0) { - sp88 = &spB4[0]; - sp168 = 0; - do { - temp_a1 = gCollisionObjects[*sp88]; - var_s1 = 0; - objModel = temp_a1->modelInstances[temp_a1->modelIndex]->objModel; - temp_v0_2 = temp_a1->collisionData; - var_fp_2 = 0; - sp16C = 1; - spDC = &temp_a1->collisionData->matrices[(((temp_a1->collisionData->mtxFlip + 1) & 1) << 6)]; - otherObj = temp_a1; - temp_v0_3 = func_8001790C((u32 *) obj, (u32 *) temp_a1); - var_t0 = 1; - sp14C = temp_v0_3; - if (temp_v0_3 != NULL) { - var_s2_2 = &sp13C; - var_s0 = temp_v0_3; - if (arg1 > 0) { - var_s1_2 = arg4; - var_s3 = &sp12C; - var_s4 = &sp11C; - var_s5 = sp100; - var_s6 = spF0; - var_s7 = spE0; - do { - *var_s2_2 = var_s0->unk0C[0]; - *var_s3 = var_s0->unk0C[1]; - *var_s4 = var_s0->unk0C[2]; - sp16C = var_t0; - mtxf_transform_point(spDC, var_s1_2[0], var_s1_2[1], var_s1_2[2], var_s5, var_s6, var_s7); - var_fp_2 += 1; - var_s2_2 += 4; - var_s3 += 4; - var_s4 += 4; - var_s5 += 4; - var_s6 += 4; - var_s7 += 4; - var_s0 += 0xC; - var_s1_2 += 0xC; - } while (var_fp_2 != arg1); - var_s1 = 0; - var_fp_2 = 0; - } - } else { - var_s2_3 = &sp13C; - var_s3_2 = &sp12C; - if (arg1 > 0) { - var_s0_2 = arg3; - var_s4_2 = &sp11C; - do { - sp16C = var_t0; - mtxf_transform_point(spDC, var_s0_2->f[0], var_s0_2->f[1], var_s0_2->f[2], var_s2_3, var_s3_2, - var_s4_2); - var_fp_2 += 1; - var_s2_3 += 4; - var_s3_2 += 4; - var_s4_2 += 4; - var_s0_2 += 0xC; - } while (var_fp_2 != arg1); - var_s1 = 0; - var_fp_2 = 0; - } - } - var_s5_2 = sp100; - var_s6_2 = spF0; - if (arg1 > 0) { - var_s1_2 = arg4; - var_s7_2 = spE0; - do { - sp16C = var_t0; - mtxf_transform_point(spDC, var_s1_2[0], var_s1_2[1], var_s1_2[2], var_s5_2, var_s6_2, var_s7_2); - var_fp_2 += 1; - var_s5_2 += 4; - var_s6_2 += 4; - var_s7_2 += 4; - var_s1_2 += 0xC; - } while (var_fp_2 != arg1); - var_s1 = 0; - } - *arg2 = 0; - sp16C = var_t0; - temp_v0_4 = func_80017A18(objModel, arg1, arg2, &sp13C, &sp12C, &sp11C, sp100, spF0, spE0, arg5, surface, - (f32) (1.0 / (f64) otherObj->trans.scale)); - var_t0_2 = sp16C; - if (temp_v0_4 != 0) { - otherObj->collisionData->collidedObj = obj; - } - var_fp_3 = 0; - if (*D_8011AD24 == 0) { - sp14C = func_80017978((s32) obj, (s32) otherObj); - } - temp_v0_5 = otherObj->collisionData; - spDC = &temp_a1->collisionData->matrices[(temp_a1->collisionData->mtxFlip + 2) << 6]; - if (arg1 > 0) { - do { - if (sp14C != NULL) { - temp_v0_6 = var_fp_3; - temp_s0 = sp14C + (var_s1 * 4); - sp14C->unk0C[var_s1] = sp100[temp_v0_6]; - temp_s0->unk0C[2] = (f32) spF0[temp_v0_6]; - temp_s0->unk0C[3] = (f32) spE0[temp_v0_6]; - } - temp_v0_7 = var_fp_3 * 4; - if (temp_v0_4 & var_t0_2) { - sp16C = var_t0_2; - mtxf_transform_point(spDC, sp100[temp_v0_7], spF0[temp_v0_7], spE0[temp_v0_7], &arg4[var_s1], - &arg4[var_s1 + 1], &arg4[var_s1 + 2]); - } - var_fp_3 += 1; - var_t0_2 *= 2; - var_s1 += 3; - } while (var_fp_3 != arg1); - } - temp_t6 = sp168 | temp_v0_4; - temp_t2_2 = sp170 + 1; - sp168 = temp_t6; - sp88 += 4; - sp170 = temp_t2_2; - } while (temp_t2_2 != sp160); - var_a3 = temp_t6; + + arg2[0] = 0; + if (sp168 & 1) { + arg2[0]++; } - *arg2 = 0; - if (var_a3 & 1) { - *arg2 = 1; + if (sp168 & 2) { + arg2[0]++; } - if (var_a3 & 2) { - *arg2 += 1; + if (sp168 & 4) { + arg2[0]++; } - if (var_a3 & 4) { - *arg2 += 1; + if (sp168 & 8) { + arg2[0]++; } - if (var_a3 & 8) { - *arg2 += 1; - } - return var_a3; + return sp168; } #else #pragma GLOBAL_ASM("asm/nonmatchings/objects/func_80017248.s") @@ -5494,125 +5387,134 @@ u32 func_800179D0(void) { #endif } -// https://decomp.me/scratch/dzU8Y +// https://decomp.me/scratch/xNAlf #ifdef NON_EQUIVALENT s32 func_80017A18(ObjectModel *arg0, s32 arg1, s32 *arg2, f32 *arg3, f32 *arg4, f32 *arg5, f32 *arg6, f32 *arg7, - f32 *arg8, f32 *arg9, s8 *surface, f32 argB) { - s32 pad[4]; - s32 var_a2; + f32 *arg8, f32 *arg9, s8 *argA, f32 argB) { + f32 *planes; + s32 i, j, k; + f32 sum1, sum2; + f32 t; + u32 var_a2; // u32 required here to force loading 1 instead of a3 into it + s32 counter; + s32 spF8; // f8 s32 var_s6; - s32 i; // s1 - s32 j; - s32 k; - s32 spF8; - s32 var_t4; - f32 *var_a0; - f32 spE4; - f32 spDC; - f32 spD8; - f32 spC0; - f32 spBC; - f32 spB4; - f32 spA4; - f32 spA0; - f32 sp9C; - f32 sp74; - f32 sp70; - f32 sp68; - f32 sp64; - f32 sp60; - f32 temp_f0; - f32 temp_f10; - f32 temp_f12; - f32 temp_f22; - f32 temp_f26; - f32 var_f2; - f32 var_f30; - f32 *temp_t0; - f32 *temp_v0; + f32 A2, C2; + f32 A; // e4 + f32 B; // e0 + f32 C; // dc + f32 D; // d8 + f32 A1, B1, C1, D1; s32 redoLoop; - s32 pad1; + f32 spC0; // c0 + f32 x1; // bc + f32 y1; + f32 z1; // b4 + f32 x3, y3, z3; + f32 x2; // a4 + f32 y2; // a0 + f32 z2; // 9c + CollisionNode *node; + f32 dx, dy, dz; + s32 triIndex; + s32 closestTri; spF8 = 0; - temp_t0 = arg0->collisionPlanes; + planes = arg0->collisionPlanes; var_s6 = 1; + for (i = 0; i < arg1; i++) { - spBC = arg6[i]; - var_f30 = arg7[i]; - spB4 = arg8[i]; - spA4 = arg3[i]; - spA0 = arg4[i]; - sp9C = arg5[i]; + x1 = arg6[i]; + y1 = arg7[i]; + z1 = arg8[i]; spC0 = arg9[i] * argB; - var_t4 = 0; + + counter = 0; do { redoLoop = FALSE; + x2 = arg3[i]; + y2 = arg4[i]; + z2 = arg5[i]; + for (j = 0; j < arg0->collisionFacetCount; j++) { - temp_v0 = &temp_t0[arg0->collisionFacets[j].basePlaneIndex]; - temp_f26 = temp_v0[1]; - sp74 = temp_v0[0]; - temp_f12 = temp_v0[2]; - temp_f10 = temp_v0[3]; - spE4 = sp74; - spDC = temp_f12; - sp64 = spA0; - spD8 = temp_f10; - sp70 = spDC * spB4; - sp74 = sp74 * spBC; - temp_f0 = ((sp74 * spA4) + (temp_f26 * spA0) + (temp_f12 * sp9C) + temp_f10) - spC0; - sp60 = spA4; - sp68 = sp9C; - temp_f22 = (sp74 + (temp_f26 * var_f30) + sp70 + spD8) - spC0; - if (-0.10 <= temp_f0) { - var_a2 = 1; - if (temp_f22 < -0.1) { - if (temp_f0 != temp_f22) { - var_f2 = temp_f0 / (temp_f0 - temp_f22); + node = &arg0->collisionFacets[j]; + triIndex = node->colPlaneIndex; + + A = planes[4 * triIndex + 0]; + B = planes[4 * triIndex + 1]; + C = planes[4 * triIndex + 2]; + D = planes[4 * triIndex + 3]; + + A2 = A * x2; + sum1 = A2; + sum1 += B * y2; + C2 = C * z2; + sum1 += C2; + sum1 = D + sum1; + sum1 -= spC0; + + sum2 = planes[4 * triIndex + 0] * x1; + sum2 += planes[4 * triIndex + 1] * y1; + sum2 += planes[4 * triIndex + 2] * z1; + sum2 += D; + sum2 -= spC0; + if (sum1 >= -0.1 && sum2 < -0.1) { + if (sum1 != sum2) { + t = sum1 / (sum1 - sum2); + } else { + t = 0.0f; + } + x3 = (x1 - x2) * t + x2; + y3 = (y1 - y2) * t + y2; + z3 = (z1 - z2) * t + z2; + var_a2 = TRUE; + + for (k = 0; k < 3 && var_a2 == TRUE; k++) { + closestTri = node->closestTri[k]; + + A1 = planes[4 * closestTri + 0] * x3; + B1 = planes[4 * closestTri + 1] * y3; + C1 = planes[4 * closestTri + 2] * z3; + D1 = planes[4 * closestTri + 3]; + + if (A1 + B1 + C1 + D1 > 4.0f) { + var_a2 = FALSE; + } + } + + if (var_a2) { + redoLoop = TRUE; + if (B > 0.707) { + y1 = (spC0 - (A2 + C2 + D)) / B; } else { - var_f2 = 0.0f; + x1 -= sum2 * A; + y1 -= sum2 * B; + z1 -= sum2 * C; } - - for (k = 0; (k < 3) && (var_a2 == 1); k++) { - temp_v0 = &temp_t0[arg0->collisionFacets->edgeBisectorPlane[k]]; - if (((temp_v0[0] * (((spBC - sp60) * var_f2) + spA4)) + - (temp_v0[1] * (((var_f30 - sp64) * var_f2) + spA0)) + - (temp_v0[2] * (((spB4 - sp68) * var_f2) + sp9C)) + temp_v0[3]) > 4.0f) { - var_a2 = 0; - } - } - - if (var_a2) { - redoLoop = TRUE; - if (temp_f26 > 0.707) { - var_f30 = (spC0 - (sp74 + sp70 + spD8)) / temp_f26; - } else { - spBC -= temp_f22 * spE4; - var_f30 -= temp_f22 * temp_f26; - spB4 -= temp_f22 * spDC; - } - var_t4++; - if (var_t4 >= 0xB) { - var_f30 = spA0; - redoLoop = 0; - spBC = spA4; - spB4 = sp9C; - } - surface[i] = 0; - arg6[i] = spBC; - arg7[i] = var_f30; - arg8[i] = spB4; - j = arg0->collisionFacetCount; + counter++; + if (counter > 10) { + redoLoop = FALSE; + x1 = x2; + y1 = y2; + z1 = z2; } + argA[i] = 0; + arg6[i] = x1; + arg7[i] = y1; + arg8[i] = z1; + j = arg0->collisionFacetCount; // break } } } } while (redoLoop); - if (var_t4 > 0) { + + if (counter > 0) { arg2[0]++; spF8 |= var_s6; } var_s6 <<= 1; } + return spF8; } #else @@ -5949,275 +5851,195 @@ Object *find_taj_object(void) { return NULL; } -// https://decomp.me/scratch/hcneX +// https://decomp.me/scratch/nWMak #ifdef NON_EQUIVALENT // Handles MidiFadePoint, MidiFade, and MidiSetChannel objects? -void func_80018CE0(Object *racerObj, f32 xPos, f32 yPos, f32 zPos, s32 updateRate) { - s32 spF4; - f32 spC0; - void *spBC; - s32 sp98; - f32 sp78; - f32 sp74; - f32 sp70; +void func_80018CE0(Object *racerObj, f32 arg1, f32 arg2, f32 arg3, s32 arg4) { f32 temp_f0; - f32 temp_f0_2; - f32 temp_f0_3; - f32 temp_f0_4; - f32 temp_f0_5; - f32 temp_f0_6; - f32 temp_f0_7; f32 temp_f12; - f32 temp_f12_2; + s32 spF4; f32 temp_f14; - f32 temp_f14_2; - f32 temp_f14_3; - f32 temp_f14_4; - f32 temp_f16; - f32 temp_f18; - f32 temp_f20; f32 temp_f22; - f32 temp_f24; - f32 temp_f26; - f32 temp_f28; + f32 racerX; // f24 + f32 racerY; // f26 + f32 racerZ; // f28 f32 temp_f2; - f32 temp_f2_2; - f32 temp_f2_3; - f32 temp_f2_4; - f32 temp_f2_5; - f32 temp_f30; - f32 var_f12; - // f32 var_f6; + f32 var_f4; f32 var_f8; - s16 behaviorId; s32 temp_f10; - s32 temp_s0_2; - s32 temp_s0_3; - s32 temp_s0_4; - s32 temp_s0_5; - s32 temp_s0_6; - s32 temp_t3; s32 temp_t3_2; - s32 temp_t4; - s32 temp_t8; - Object_MidiFade *temp_v1_2; - Object_MidiFade *temp_v1_3; - s32 var_s1; - s32 var_s1_2; + s32 i; // s1 s32 var_s2; - s8 temp_t2_2; + f32 spC0; + Object_MidiFadePoint *midiFadePoint; // spBC + u16 temp_t4; s8 var_v0_2; + u8 var_v0_u; s8 var_v1; - u16 temp_t2; - u16 temp_v0_2; - s32 var_v0; - u8 temp_v0_3; - u8 temp_v0_5; - u8 temp_v0_6; Object *obj; Object_MidiFade *midiFade; - Object_MidiFadePoint *midiFadePoint; - Object_MidiFadePoint *midiFadePoint2; Object_MidiChannelSet *midiChannelSet; + Object_Racer *racer; - if (racerObj->racer->playerIndex == 0) { - if (cam_get_viewport_layout() == 0) { - spF4 = gObjectListStart; - if (gObjectListStart < gObjectCount) { - sp98 = gObjectListStart * 4; - do { - obj = *(gObjPtrList + sp98); - if (!(obj->trans.flags & 0x8000)) { - behaviorId = obj->behaviorId; - if (behaviorId == BHV_MIDI_FADE_POINT) { - temp_f0 = racerObj->trans.x_position - obj->trans.x_position; - temp_f2 = racerObj->trans.y_position - obj->trans.y_position; - temp_f14 = racerObj->trans.z_position - obj->trans.z_position; - temp_f0_2 = sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)); - midiFadePoint = obj->midi_fade_point; - temp_f2_2 = temp_f0_2; - temp_t2 = midiFadePoint->unk2; - var_f8 = (f32) temp_t2; - if ((s32) temp_t2 < 0) { - var_f8 += 4294967296.0f; - } - if (temp_f0_2 < var_f8) { - spBC = midiFadePoint; - spC0 = temp_f2_2; - var_s1 = 0; - midiFadePoint2 = midiFadePoint; - if (midiFadePoint->unk1C == music_current_sequence()) { - temp_v0_2 = midiFadePoint->unk0; - var_f12 = (f32) temp_v0_2; - if ((s32) temp_v0_2 < 0) { - var_f12 += 4294967296.0f; - } - if (temp_f2_2 <= var_f12) { - var_s2 = 0; - } else { - var_s2 = (s32) ((127.0f * (temp_f2_2 - var_f12)) / - (f32) (midiFadePoint->unk2 - temp_v0_2)); - } - do { - temp_v0_3 = midiFadePoint2->unkC; - if (temp_v0_3 != 1) { - temp_s0_2 = var_s1 & 0xFF; - if (temp_v0_3 != 2) { + racer = racerObj->racer; + if (racer->playerIndex != 0) { + return; + } - } else if ((music_channel_fade(temp_s0_2 & 0xFF) > 0) && - (music_channel_active(var_s1) == 0)) { - music_channel_fade_set(temp_s0_2 & 0xFF, var_s2 & 0xFF); - } - } else { - temp_s0_3 = var_s1 & 0xFF; - if (var_s2 >= 0x7B) { - music_channel_off(var_s1 & 0xFF); - } else { - music_channel_fade_set(temp_s0_3 & 0xFF, (0x7F - var_s2) & 0xFF); - music_channel_on(temp_s0_3 & 0xFF); - } - } - var_s1 += 1; - midiFadePoint2 += 1; - } while (var_s1 != 0x10); - } - } - } else if (behaviorId == BHV_MIDI_FADE) { - midiFade = obj->midi_fade; - temp_f16 = midiFade->unkC; - temp_f30 = temp_f16 * yPos; - temp_f18 = midiFade->unk10; - temp_f12 = midiFade->unk8; - temp_f14_2 = temp_f18 * zPos; - temp_f24 = racerObj->trans.x_position; - temp_f26 = racerObj->trans.y_position; - temp_f20 = midiFade->unk14; - temp_f28 = racerObj->trans.z_position; - sp78 = temp_f14_2; - temp_f0_3 = (temp_f12 * xPos) + temp_f30 + temp_f14_2 + temp_f20; - temp_f2_3 = - (temp_f12 * temp_f24) + (temp_f16 * temp_f26) + (temp_f18 * temp_f28) + temp_f20; - if ((temp_f0_3 > 0.0f) && (temp_f2_3 <= 0.0f)) { - var_v1 = 1; - } else { - var_v1 = 0; - if ((temp_f2_3 > 0.0f) && (temp_f0_3 <= 0.0f)) { - var_v1 = -1; - } - } - if (var_v1 != 0) { - sp70 = yPos; - temp_f2_4 = temp_f26 - yPos; - sp74 = zPos; - temp_f0_4 = temp_f24 - xPos; - temp_f14_3 = temp_f28 - zPos; - temp_f22 = ((((-temp_f12 * xPos) - temp_f30) - sp78) - temp_f20) / - ((temp_f12 * temp_f0_4) + (temp_f16 * temp_f2_4) + (temp_f18 * temp_f14_3)); - temp_f12_2 = (temp_f22 * temp_f0_4) + xPos; - if ((midiFade->unk18 <= temp_f12_2) && (temp_f12_2 <= midiFade->unk24)) { - temp_f0_5 = (temp_f22 * temp_f2_4) + sp70; - if (((f32) midiFade->unk1C <= temp_f0_5) && (temp_f0_5 <= midiFade->unk28)) { - temp_f0_6 = (temp_f22 * temp_f14_3) + sp74; - if ((midiFade->unk20 <= temp_f0_6) && (temp_f0_6 <= midiFade->unk2C)) { - midiFade->unk0 = var_v1; - midiFade->unk1 = 0; - midiFade->unk4 = 0; - D_8011AF60[0] = (Object_MidiFade *) midiFade; - } - } - } - } - } else if (behaviorId == BHV_MIDI_CHANNEL_SET) { - temp_f0_7 = racerObj->trans.x_position - obj->trans.x_position; - temp_f2_5 = racerObj->trans.y_position - obj->trans.y_position; - temp_f14_4 = racerObj->trans.z_position - obj->trans.z_position; - midiChannelSet = obj->midi_channel_set; - if ((sqrtf((temp_f0_7 * temp_f0_7) + (temp_f2_5 * temp_f2_5) + (temp_f14_4 * temp_f14_4)) < - (f32) (midiChannelSet->unk2 * 4)) && - (midiChannelSet->unk0 != music_channel_get_mask()) && - (midiChannelSet->unk3 == music_current_sequence())) { - music_dynamic_set(midiChannelSet->unk0); - } + if (cam_get_viewport_layout() != 0) { + return; + } + + for (spF4 = gObjectListStart; spF4 < gObjectCount; spF4++) { + obj = gObjPtrList[spF4]; + if (!(obj->trans.flags & 0x8000)) { + if (obj->behaviorId == BHV_MIDI_FADE_POINT) { + spC0 = sqrtf(((racerObj->trans.x_position - obj->trans.x_position) * + (racerObj->trans.x_position - obj->trans.x_position)) + + ((racerObj->trans.y_position - obj->trans.y_position) * + (racerObj->trans.y_position - obj->trans.y_position)) + + ((racerObj->trans.z_position - obj->trans.z_position) * + (racerObj->trans.z_position - obj->trans.z_position))); + midiFadePoint = obj->midi_fade_point; + if (spC0 < midiFadePoint->unk2) { + if (midiFadePoint->unk1C == music_current_sequence()) { + if (spC0 <= midiFadePoint->unk0) { + var_s2 = 0; + } else { + spC0 -= midiFadePoint->unk0; + var_f4 = 127.0f * (spC0); + var_s2 = var_f4 / (midiFadePoint->unk2 - midiFadePoint->unk0); } - } - temp_t3 = spF4 + 1; - sp98 += 4; - spF4 = temp_t3; - } while (temp_t3 < gObjectCount); - } - if (D_8011AF60[0] != 0) { - temp_v1_2 = D_8011AF60[0]; - var_s1_2 = 0; - if (temp_v1_2->unk40 == music_current_sequence()) { - temp_v1_2->unk4 += updateRate; - var_v0 = D_8011AF60[0]->unk4; - temp_t4 = (D_8011AF60[0]->unk2 * gVideoRefreshRate) & 0xFFFF; - if (temp_t4 < (s32) var_v0) { - D_8011AF60[0]->unk4 = (u16) temp_t4; - var_v0 = D_8011AF60[0]->unk4; - } - /* - var_f6 = (f32) temp_t4; - if (temp_t4 < 0) { - var_f6 += 4294967296.0f; - } - */ - temp_f10 = (s32) (((f32) var_v0 * 254.0f) / temp_t4); - if (temp_f10 < 0xFE) { - D_8011AF60[0]->unk1 = (s8) temp_f10; - } else { - D_8011AF60[0]->unk1 = 0xFE; - } - temp_v1_3 = D_8011AF60[0]; - do { - var_v0_2 = temp_v1_3->unk2F[var_s1_2 + 1]; - if (temp_v1_3->unk0 == -1) { - var_v0_2 = (s8) (var_v0_2 >> 2); - } - temp_t2_2 = var_v0_2 & 3; - if (temp_t2_2 != 0) { - temp_s0_4 = var_s1_2 & 0xFF; - switch (temp_t2_2) { /* irregular */ + for (i = 0; i < 16; i++) { + switch (midiFadePoint->unkC[i]) { case 1: - music_channel_on(temp_s0_4 & 0xFF); - music_channel_fade_set(temp_s0_4 & 0xFF, 0x7FU); - break; - case 3: - temp_v0_5 = temp_v1_3->unk1; - temp_s0_5 = var_s1_2 & 0xFF; - if ((s32) temp_v0_5 >= 0x80) { - temp_t3_2 = (temp_v0_5 - 0x7F) & 0xFF; - music_channel_on(temp_s0_5 & 0xFF); - if (music_channel_fade(temp_s0_5 & 0xFF) < temp_t3_2) { - music_channel_fade_set(temp_s0_5 & 0xFF, temp_t3_2 & 0xFF); - } + if (var_s2 >= 0x7B) { + music_channel_off(i); + } else { + music_channel_fade_set(i, (0x7F - var_s2)); + music_channel_on(i); } break; case 2: - temp_v0_6 = temp_v1_3->unk1; - temp_s0_6 = var_s1_2 & 0xFF; - if ((s32) temp_v0_6 < 0x7F) { - temp_t8 = (0x7F - temp_v0_6) & 0xFF; - if (temp_t8 < music_channel_fade(temp_s0_6 & 0xFF)) { - music_channel_fade_set(temp_s0_6 & 0xFF, temp_t8 & 0xFF); - } - } else { - music_channel_off(var_s1_2 & 0xFF); + if ((music_channel_fade(i) > 0) && (music_channel_active(i) == 0)) { + music_channel_fade_set(i, var_s2); } break; + default: + break; } - } else { - music_channel_off(var_s1_2 & 0xFF); } - var_s1_2 += 1; - } while (var_s1_2 != 0x10); + } } - if ((temp_v1_2->unk1 == 0xFE) && (D_8011AF60[0]->unk40 == music_current_sequence())) { - D_8011AF60[0] = 0; + } else if (obj->behaviorId == BHV_MIDI_FADE) { + midiFade = obj->midi_fade; + temp_f0 = + (midiFade->unk8 * arg1) + (midiFade->unkC * arg2) + (midiFade->unk10 * arg3) + midiFade->unk14; + temp_f2 = (midiFade->unk8 * racerObj->trans.x_position) + + (midiFade->unkC * racerObj->trans.y_position) + + (midiFade->unk10 * racerObj->trans.z_position) + midiFade->unk14; + if (temp_f0 > 0.0f && temp_f2 <= 0.0f) { + var_v1 = 1; + } else if (temp_f2 > 0.0f && temp_f0 <= 0.0f) { + var_v1 = -1; + } else { + var_v1 = 0; + } + if (var_v1 != 0) { + temp_f2 = -midiFade->unk8 * arg1 - midiFade->unkC * arg2 - midiFade->unk10 * arg3 - midiFade->unk14; + temp_f0 = midiFade->unk8 * (racerObj->trans.x_position - arg1) + + midiFade->unkC * (racerObj->trans.y_position - arg2) + + midiFade->unk10 * (racerObj->trans.z_position - arg3); + + temp_f22 = temp_f2 / temp_f0; + if ((midiFade->unk18 <= (temp_f22 * (racerObj->trans.x_position - arg1)) + arg1) && + ((temp_f22 * (racerObj->trans.x_position - arg1)) + arg1 <= midiFade->unk24)) { + if ((midiFade->unk1C <= (temp_f22 * (racerObj->trans.y_position - arg2)) + arg2) && + ((temp_f22 * (racerObj->trans.y_position - arg2)) + arg2 <= midiFade->unk28)) { + if ((midiFade->unk20 <= (temp_f22 * (racerObj->trans.z_position - arg3)) + arg3) && + ((temp_f22 * (racerObj->trans.z_position - arg3)) + arg3 <= midiFade->unk2C)) { + midiFade->unk0 = var_v1; + midiFade->unk1 = 0; + midiFade->unk4 = 0; + D_8011AF60 = midiFade; + } + } + } + } + } else if (obj->behaviorId == BHV_MIDI_CHANNEL_SET) { + midiChannelSet = obj->midi_channel_set; + temp_f0 = sqrtf(((racerObj->trans.x_position - obj->trans.x_position) * + (racerObj->trans.x_position - obj->trans.x_position)) + + ((racerObj->trans.y_position - obj->trans.y_position) * + (racerObj->trans.y_position - obj->trans.y_position)) + + ((racerObj->trans.z_position - obj->trans.z_position) * + (racerObj->trans.z_position - obj->trans.z_position))); + var_v0_u = midiChannelSet->unk2; + if ((temp_f0 < (var_v0_u * 4)) && (midiChannelSet->unk0 != music_channel_get_mask()) && + (midiChannelSet->unk3 == music_current_sequence())) { + music_dynamic_set(midiChannelSet->unk0); } } } } + + if (D_8011AF60 == 0) { + return; + } + + if (D_8011AF60->unk40 == music_current_sequence()) { + D_8011AF60->unk4 += arg4; + temp_t4 = D_8011AF60->unk2 * gVideoRefreshRate; + if (temp_t4 < D_8011AF60->unk4) { + D_8011AF60->unk4 = temp_t4; + } + temp_f10 = (D_8011AF60->unk4 * 254.0f) / temp_t4; + if (temp_f10 < 0xFE) { + D_8011AF60->unk1 = temp_f10; + } else { + D_8011AF60->unk1 = 0xFE; + } + for (i = 0; i < 16; i++) { + var_v0_2 = D_8011AF60->unk2F[i + 1]; + if (D_8011AF60->unk0 == -1) { + var_v0_2 >>= 2; + } + var_v0_2 &= 3; + switch (var_v0_2) { + case 1: + music_channel_on(i); + music_channel_fade_set(i, 0x7FU); + break; + case 0: + music_channel_off(i); + break; + case 3: + if (D_8011AF60->unk1 >= 0x80) { + temp_t3_2 = (D_8011AF60->unk1 - 0x7F) & 0xFF; + music_channel_on(i); + if (music_channel_fade(i) < temp_t3_2) { + music_channel_fade_set(i, temp_t3_2); + } + } + break; + case 2: + if (D_8011AF60->unk1 < 0x7F) { + temp_t3_2 = (0x7F - D_8011AF60->unk1) & 0xFF; + if (temp_t3_2 < music_channel_fade(i)) { + music_channel_fade_set(i, temp_t3_2); + } + } else { + music_channel_off(i); + } + break; + default: + break; + } + } + } + if ((D_8011AF60->unk1 == 0xFE) && (D_8011AF60->unk40 == music_current_sequence())) { + D_8011AF60 = 0; + } } #else #pragma GLOBAL_ASM("asm/nonmatchings/objects/func_80018CE0.s") diff --git a/src/particles.c b/src/particles.c index f06a1092..8730d1c4 100644 --- a/src/particles.c +++ b/src/particles.c @@ -299,13 +299,13 @@ void init_particle_assets(void) { #ifdef NON_EQUIVALENT void init_particle_buffers(s32 maxTriangleParticles, s32 maxRectangleParticles, s32 maxSpriteParticles, s32 maxLineParticles, s32 maxPointParticles, s32 unused_arg) { - unsigned int new_var2; - Vertex *sp54; - Triangle *sp50; + s32 allocSize; s32 i; s16 *asset2F; ParticleModel *modelPtr; - s32 zero = 0; + Vertex *sp54; + Triangle *sp50; + s32 pad; gParticleOverrideColor->word = 0; @@ -336,42 +336,55 @@ void init_particle_buffers(s32 maxTriangleParticles, s32 maxRectangleParticles, gPointParticleBufferFull = FALSE; free_particle_vertices_triangles(); - gParticleVertexBuffer = mempool_alloc_safe( - (3 * maxTriangleParticles + 4 * maxRectangleParticles + 6 * maxLineParticles + 16 * maxPointParticles) * - sizeof(Vertex), - COLOUR_TAG_SEMITRANS_GREY); - gParticleTriangleBuffer = mempool_alloc_safe((maxTriangleParticles + 2 * maxRectangleParticles) * sizeof(Triangle), - COLOUR_TAG_SEMITRANS_GREY); + allocSize = 0; + allocSize += maxTriangleParticles * 3; + allocSize += maxRectangleParticles << 2; + allocSize += maxLineParticles * 3 * 2; + allocSize += maxPointParticles << 4; + allocSize *= sizeof(Vertex); + gParticleVertexBuffer = mempool_alloc_safe(allocSize, COLOUR_TAG_SEMITRANS_GREY); + + // @fake + // i = maxPointParticles <= 0; + i = 0; + allocSize = 0; + allocSize += maxTriangleParticles; + allocSize += maxRectangleParticles << 1; + allocSize += i; + allocSize *= sizeof(Triangle); + gParticleTriangleBuffer = mempool_alloc_safe(allocSize, COLOUR_TAG_SEMITRANS_GREY); D_800E2CDC = 0; free_particle_buffers(); if (gMaxTriangleParticles > 0) { gNumTriangleParticles = 0; - gTriangleParticleBuffer = mempool_alloc_safe(maxTriangleParticles * (sizeof(Particle) + sizeof(ParticleModel)), - COLOUR_TAG_SEMITRANS_GREY); + allocSize = maxTriangleParticles * (sizeof(Particle) + sizeof(ParticleModel)); + gTriangleParticleBuffer = mempool_alloc_safe(allocSize, COLOUR_TAG_SEMITRANS_GREY); } if (gMaxRectangleParticles > 0) { gNumRectangleParticles = 0; - gRectangleParticleBuffer = mempool_alloc_safe( - maxRectangleParticles * (sizeof(Particle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); + allocSize = maxRectangleParticles * (sizeof(Particle) + sizeof(ParticleModel)); + gRectangleParticleBuffer = mempool_alloc_safe(allocSize, COLOUR_TAG_SEMITRANS_GREY); } if (gMaxSpriteParticles > 0) { gNumSpriteParticles = 0; - gSpriteParticleBuffer = mempool_alloc_safe(maxSpriteParticles * sizeof(Particle), COLOUR_TAG_SEMITRANS_GREY); + allocSize = maxSpriteParticles * sizeof(Particle); + gSpriteParticleBuffer = mempool_alloc_safe(allocSize, COLOUR_TAG_SEMITRANS_GREY); } if (gMaxLineParticles > 0) { gNumLineParticles = 0; - gLineParticleBuffer = mempool_alloc_safe(maxLineParticles * (sizeof(Particle) + sizeof(ParticleModel)), - COLOUR_TAG_SEMITRANS_GREY); + allocSize = maxLineParticles * (sizeof(Particle) + sizeof(ParticleModel)); + gLineParticleBuffer = mempool_alloc_safe(allocSize, COLOUR_TAG_SEMITRANS_GREY); } if (gMaxPointParticles > 0) { gNumPointParticles = 0; - gPointParticleBuffer = mempool_alloc_safe(maxPointParticles * (sizeof(PointParticle) + sizeof(ParticleModel)), - COLOUR_TAG_SEMITRANS_GREY); + allocSize = maxPointParticles * (sizeof(PointParticle) + sizeof(ParticleModel)); + gPointParticleBuffer = mempool_alloc_safe(allocSize, COLOUR_TAG_SEMITRANS_GREY); } - sp54 = &gParticleVertexBuffer[zero]; - sp50 = &gParticleTriangleBuffer[zero]; + // *0 is "fake", the asm does << 3 and << 4 on zero + sp54 = &gParticleVertexBuffer[maxTriangleParticles * 0]; + sp50 = &gParticleTriangleBuffer[maxTriangleParticles * 0]; modelPtr = (ParticleModel *) &gTriangleParticleBuffer[gMaxTriangleParticles]; for (i = 0; i < gMaxTriangleParticles; i++) { diff --git a/src/printf.c b/src/printf.c index e6c70690..0e947cd8 100644 --- a/src/printf.c +++ b/src/printf.c @@ -235,71 +235,78 @@ UNUSED int sprintf(char *s, const char *format, ...) { #define isdigit(c) ((c >= '0') && (c <= '9')) /** - * https://decomp.me/scratch/xoBfs + * https://decomp.me/scratch/zoSu7 * Official name: vsprintf */ #ifdef NON_EQUIVALENT // Returns the total number of characters written. int vsprintf(char *s, const char *fmt, va_list args) { - /* The string describing the size of groups of digits. */ - UNUSED char *grouping; - /* Pointer into the format string. */ - register char *f; + char *f; + /* The string describing the size of groups of digits. */ + UNUSED char *grouping; + /* Number of characters written. */ - register int done = 0; + int done = 0; f = fmt; while (*f != '\0') { - /* Type modifiers. */ - char is_short, is_long, is_long_double; + /* Type modifiers. */ + char is_short, is_long, is_long_double; -#ifdef HAVE_LONGLONG +#ifdef HAVE_LONGLONG /* We use the `L' modifier for `long long int'. */ -#define is_longlong is_long_double +#define is_longlong is_long_double #else -#define is_longlong 0 +#define is_longlong 0 #endif - + /* Format spec modifiers. */ char space, showsign, left, alt; - + /* Padding character: ' ' or '0'. */ char pad; /* Width of a field. */ - register int width; + int width; + /* Precision of a field. */ int prec; - + /* Decimal integer is negative. */ char is_neg; - + /* Current character of the format. */ char fc; - + /* Base of a number to be written. */ int base; + /* Integral values to be written. */ u64 num; s64 signed_num; - + /* String to be written. */ char *str; + + char work[BUFSIZ]; // sp17B s32 a1; s32 i; s32 unused2; + s32 v1; + s32 a0; + s32 digit; if (*f != '%') { - /* This isn't a format spec, so write everything out until the - next one. To properly handle multibyte characters, we cannot - just search for a '%'. Since multibyte characters are hairy - (and dealt with above), if we hit any byte above 127 (only - those can start a multibyte character) we just punt back to - that code. */ + /* This isn't a format spec, so write everything out until the + next one. To properly handle multibyte characters, we cannot + just search for a '%'. Since multibyte characters are hairy + (and dealt with above), if we hit any byte above 127 (only + those can start a multibyte character) we just punt back to + that code. */ while (*f != '%' && *f != '\0') { - outchar(*f++); + outchar (*f++); } continue; } @@ -345,7 +352,7 @@ int vsprintf(char *s, const char *fmt, va_list args) { } } // end of while loop - + if (left) { pad = ' '; } @@ -381,7 +388,7 @@ int vsprintf(char *s, const char *fmt, va_list args) { prec = -1; } ++f; - } else if (isdigit(*f)) { + } else if (isdigit (*f)) { prec = 0; while (isdigit(*f)) { prec *= 10; @@ -399,13 +406,13 @@ int vsprintf(char *s, const char *fmt, va_list args) { is_short = 1; break; case 'l': -#ifdef HAVE_LONGLONG +#ifdef HAVE_LONGLONG if (is_long) { /* A double `l' is equivalent to an `L'. */ is_longlong = 1; } else { #endif - /* int's are long int's. */ + /* int's are long int's. */ is_long = 1; } break; @@ -415,11 +422,11 @@ int vsprintf(char *s, const char *fmt, va_list args) { break; case 'Z': /* int's are size_t's. */ -#ifdef HAVE_LONGLONG - // assert (sizeof(size_t) <= sizeof(unsigned long long int)); - // is_longlong = sizeof(size_t) > sizeof(unsigned long int); +#ifdef HAVE_LONGLONG + //assert (sizeof(size_t) <= sizeof(unsigned long long int)); + //is_longlong = sizeof(size_t) > sizeof(unsigned long int); #endif - is_long = TRUE; // sizeof(size_t) > sizeof(unsigned int); + is_long = TRUE; //sizeof(size_t) > sizeof(unsigned int); break; case 'q': is_longlong = 1; @@ -443,9 +450,9 @@ int vsprintf(char *s, const char *fmt, va_list args) { } else { castarg(signed_num, int, short int); } - + is_neg = signed_num < 0; - num = is_neg ? (-signed_num) : signed_num; + num = is_neg ? (- signed_num) : signed_num; goto number; case 'u': /* Decimal unsigned integer. */ @@ -470,9 +477,9 @@ int vsprintf(char *s, const char *fmt, va_list args) { } else if (is_long) { castarg(num, long int, unsigned long int); } else if (!is_short) { - castarg(num, int, unsigned int); + castarg(num, int, unsigned int); } else { - castarg(num, int, unsigned short int); + castarg(num, int, unsigned short int); } /* ANSI only specifies the `+' and ` ' flags for signed conversions. */ @@ -481,9 +488,8 @@ int vsprintf(char *s, const char *fmt, va_list args) { number: /* Number of base BASE. */ { - char work[BUFSIZ]; - char *workend = &work[sizeof(work) - 1]; - register char *w; + char *w; + char *workend = &work[sizeof(work) - 1]; // spF8 if (gSprintfSpacingCode) { outchar(0x84); @@ -491,94 +497,90 @@ int vsprintf(char *s, const char *fmt, va_list args) { if (prec >= 0) { pad = ' '; } - /* Supply a default precision if none was given. */ - if (prec == -1) { - prec = 1; + /* Supply a default precision if none was given. */ + if (prec == -1) { + prec = 1; } - /* Put the number in WORK. */ - w = _itoa(num, workend + 1, base, fc == 'X') - 1; - width -= workend - w; - prec -= workend - w; + /* Put the number in WORK. */ + w = _itoa(num, workend + 1, base, fc == 'X') - 1; + v1 = workend - w; + width -= v1; + prec -= v1; - if (alt && base == 8 && prec <= 0) { - *w-- = '0'; - --width; + if (alt && base == 8 && prec <= 0) { + *w-- = '0'; + --width; + } + + if (prec > 0) { + width -= prec; + while (prec-- > 0) { + *w-- = '0'; + } + } + + if (alt && base == 16) { + width -= 2; } - if (prec > 0) { - width -= prec; - while (prec-- > 0) { - *w-- = '0'; + if (is_neg || showsign || space) { + --width; + } + + if (!left && pad == ' ') { + while (width-- > 0) { + outchar(' '); } } - - if (alt && base == 16) { - width -= 2; - } - - if (is_neg || showsign || space) { - --width; - } - - if (!left && pad == ' ') { - while (width-- > 0) { - outchar(' '); - } - } - - if (is_neg) { - outchar('-'); + + if (is_neg) { + outchar('-'); } else if (showsign) { - outchar('+'); + outchar('+'); } else if (space) { - outchar(' '); + outchar(' '); } - if (alt && base == 16) { - outchar('0'); - outchar(fc); - } + if (alt && base == 16) { + outchar ('0'); + outchar (fc); + } - if (!left && pad == '0') { - while (width-- > 0) { - outchar('0'); + if (!left && pad == '0') { + while (width-- > 0) { + outchar('0'); } } - /* Write the number. */ - while (++w <= workend) { - outchar(*w); + /* Write the number. */ + while (++w <= workend) { + outchar(*w); } - if (left) { - while (width-- > 0) { - outchar(' '); + if (left) { + while (width-- > 0) { + outchar(' '); } } - } - break; + } + break; - case 'e': - case 'E': { - s32 v1; - s32 a0; - s32 s4; - - s32 digit; - - f64 f16; - s32 v02; + case 'e': + case 'E': + { + s32 dash; // a1 in this scope s32 a05; f64 f02; + f64 f16; f64 f0; - // s32 i; f64 spD0; + s32 pad2; + s32 s4; // spC8 - v02 = FALSE; - + dash = FALSE; // should probably use dash here instead if (gSprintfSpacingCode) { - outchar(0x84); + outchar(0x84); } if (prec < 0) { @@ -591,15 +593,15 @@ int vsprintf(char *s, const char *fmt, va_list args) { nextarg(spD0, f64); } - if (*((s8 *) &spD0) < 0) { - v02 = TRUE; + if (*((s8*)&spD0) < 0) { + dash = TRUE; spD0 = -spD0; } if (spD0 == 0.0) { s4 = 0; f16 = 1.0; - } else if (spD0 < 1.0) { + } else if (spD0 < 1.0){ s4 = 0; f16 = 1.0; while (spD0 < f16) { @@ -612,7 +614,7 @@ int vsprintf(char *s, const char *fmt, va_list args) { s4 = 0; f16 = 1.0; f0 = 10.0; - + while (f0 <= spD0) { f16 = f0; f0 *= 10.0; @@ -621,7 +623,7 @@ int vsprintf(char *s, const char *fmt, va_list args) { } f02 = f16 * 0.5; - + for (i = prec; i > 0; i--) { f02 /= 10.0; } @@ -632,8 +634,10 @@ int vsprintf(char *s, const char *fmt, va_list args) { s4++; } - a05 = (v02 || showsign || space); - a1 = a05 + prec + (prec > 0 || alt) + (s4 >= 100) + 5; + // @fake + digit = dash != 0; + a1 = (dash || showsign || space) + prec + (prec > 0 || alt) + (s4 >= 100); + a1 += 5; if (!left && pad == ' ') { while (width-- > a1) { @@ -641,7 +645,7 @@ int vsprintf(char *s, const char *fmt, va_list args) { } } - if (v02) { + if (dash) { outchar('-'); } else if (showsign) { outchar('+'); @@ -667,9 +671,9 @@ int vsprintf(char *s, const char *fmt, va_list args) { outchar('.'); } - if (prec) { + if (prec > 0) { do { - digit = '0'; + digit = '0'; while (spD0 >= f16) { spD0 -= f16; digit++; @@ -683,13 +687,13 @@ int vsprintf(char *s, const char *fmt, va_list args) { if (s4 < 0) { s4 = -s4; + v1 = '0' + ((s4 / 10) % 10); + a0 = '0' + (s4 % 10); outchar('-'); - v1 = '0' + ((s4 / 10) % 10); - a0 = '0' + (s4 % 10); } else { - outchar('+'); v1 = '0' + ((s4 / 10) % 10); a0 = '0' + (s4 % 10); + outchar('+'); } if (s4 >= 100) { @@ -698,7 +702,7 @@ int vsprintf(char *s, const char *fmt, va_list args) { outchar(v1); outchar(a0); - + if (left) { while (width-- > a1) { outchar(' '); @@ -709,28 +713,29 @@ int vsprintf(char *s, const char *fmt, va_list args) { case 'G': case 'g': break; - case 'f': { + case 'f': + { f64 f12 = 1.0; - f64 f14 = 10.0; + f64 f14; f64 f2; - // s32 i; - s32 digit; - s32 vara1; + s32 pad_spE4; + s32 dash; s32 a05; s32 v010; f64 spD0; - vara1 = FALSE; - + dash = FALSE; + f14 = 10.0; + if (gSprintfSpacingCode) { - outchar(0x84); + outchar(0x84); } if (prec < 0) { prec = 6; } - - for (i = 0; i < prec; i++) { - f12 /= 10.0; + + for (v010 = 0; v010 < prec; v010++) { + f12 /= 10.0; } if (is_short) { @@ -740,27 +745,31 @@ int vsprintf(char *s, const char *fmt, va_list args) { } if (spD0 < 0.0) { - vara1 = TRUE; + dash = TRUE; spD0 = -spD0; } spD0 += f12 * 0.5; - for (f2 = 1.0, v010 = 1; spD0 >= f2; v010++) { - f2 = f14; - f14 *= 10.0; + v010 = 1; + f2 = 1.0; + if (spD0 >= 10.0) { + do { + f2 = f14; + f14 *= 10.0; + v010++; + } while (spD0 >= f14); } - a05 = (vara1 || showsign || space); - a1 = (prec > 0 || alt) + a05 + v010 + prec; - + a1 = (dash || showsign || space) + (prec > 0 || alt) + v010 + prec; + if (!left && pad == ' ') { while (width-- > a1) { outchar(pad); } } - - if (vara1) { + + if (dash) { outchar('-'); } else if (showsign) { outchar('+'); @@ -773,7 +782,7 @@ int vsprintf(char *s, const char *fmt, va_list args) { outchar(pad); } } - + do { digit = '0'; while (spD0 >= f2) { @@ -790,7 +799,7 @@ int vsprintf(char *s, const char *fmt, va_list args) { if (prec > 0) { do { - digit = '0'; + digit = '0'; while (spD0 >= f2) { spD0 -= f2; digit++; @@ -807,125 +816,127 @@ int vsprintf(char *s, const char *fmt, va_list args) { } break; } - case 'c': - /* Character. */ - nextarg(num, int); - if (!left) { - while (--width > 0) { - outchar(pad); + case 'c': + /* Character. */ + nextarg(num, int); + if (!left) { + while (--width > 0) { + outchar(pad); } } - outchar((unsigned char) num); - if (left) { - while (--width > 0) { - outchar(' '); + outchar((unsigned char) num); + if (left) { + while (--width > 0) { + outchar(' '); } } - break; + break; - case 's': { - static char null[] = "(null)"; - s32 len; + case 's': + { + static char null[] = "(null)"; + s32 len; - nextarg(str, char *); - - if (str == NULL) { - /* Write "(null)" if there's space. */ - if (prec == -1 || prec >= (int) sizeof(null) - 1) { - str = null; - len = sizeof(null) - 1; - } else { - str = ""; - len = 0; - } + nextarg(str, char *); + + if (str == NULL) { + /* Write "(null)" if there's space. */ + if (prec == -1 || prec >= (int) sizeof(null) - 1) { + str = null; + a0 = sizeof(null) - 1; + } else { + str = ""; + a0 = 0; + } } else { - len = strlen(str); + a0 = strlen(str); } - if (prec != -1 && prec < len) { - len = prec; + if (prec != -1 && prec < a0) { + a0 = prec; } - width -= len; + width -= a0; - if (!left) { - while (width-- > 0) { + if (!left) { + while (width-- > 0) { outchar(' '); } } - while (len-- > 0) { + while (a0-- > 0) { outchar(*str++); } - - if (left) { - while (width-- > 0) { + + if (left) { + while (width-- > 0) { outchar(' '); } } - } break; + } + break; - case 'p': - /* Generic pointer. */ - { - PTR ptr; - nextarg(ptr, PTR); - if (ptr != NULL) { - /* If the pointer is not NULL, write it as a %#x spec. */ - base = 16; - fc = 'x'; - alt = 1; - num = (u64) (unsigned long int) ptr; - is_neg = 0; - goto number; - } else { - /* Write "(nil)" for a nil pointer. */ - static char nil[] = "(nil)"; - register char *p; - - width -= sizeof(nil) - 1; - if (!left) { - while (width-- > 0) { - outchar(' '); - } - } - for (p = nil; *p != '\0';) { - outchar(*p++); - } - if (left) { - while (width-- > 0) { - outchar(' '); - } + case 'p': + /* Generic pointer. */ + { + PTR ptr; + nextarg(ptr, PTR); + if (ptr != NULL) { + /* If the pointer is not NULL, write it as a %#x spec. */ + base = 16; + fc = 'x'; + alt = 1; + num = (u64) (unsigned long int) ptr; + is_neg = 0; + goto number; + } else { + /* Write "(nil)" for a nil pointer. */ + static char nil[] = "(nil)"; + register char *p; + + width -= sizeof (nil) - 1; + if (!left) { + while (width-- > 0) { + outchar(' '); } } - } - break; + for (p = nil; *p != '\0';) { + outchar(*p++); + } + if (left) { + while (width-- > 0) { + outchar(' '); + } + } + } + } + break; - case 'n': - /* Answer the count of characters written. */ - if (is_longlong) { - s64 *p; - nextarg(p, s64 *); - *p = done; - } else if (is_long) { - long int *p; - nextarg(p, long int *); - *p = done; + case 'n': + /* Answer the count of characters written. */ + if (is_longlong) { + s64 *p; + nextarg(p, s64 *); + *p = done; + } else if (is_long) { + long int *p; + nextarg(p, long int *); + *p = done; } else if (!is_short) { - int *p; - nextarg(p, int *); - *p = done; - } else { - short int *p; - nextarg(p, short int *); - *p = done; - } - break; - default: - /* Unrecognized format specifier. */ - break; - } + int *p; + nextarg(p, int *); + *p = done; + } else { + short int *p; + nextarg(p, short int *); + *p = done; + } + break; + default: + /* Unrecognized format specifier. */ + break; + } if (gSprintfSpacingCode) { outchar(0x83); - } + } } *s = 0; return done; diff --git a/src/racer.c b/src/racer.c index 317c1f91..775f42ce 100644 --- a/src/racer.c +++ b/src/racer.c @@ -2731,10 +2731,11 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r apply_plane_tilt_anim(updateRate, obj, racer); } var_v0 = racer->playerIndex; - if (var_v0 == PLAYER_COMPUTER && gCurrentPlayerIndex != PLAYER_COMPUTER) { + if ((var_v0 == PLAYER_COMPUTER) && (gCurrentPlayerIndex != PLAYER_COMPUTER)) { gCurrentRacerHandlingStat = 1.4f; } - var_f20 = sqrtf((obj->x_velocity * obj->x_velocity) + (obj->z_velocity * obj->z_velocity) + + var_f20 = sqrtf((obj->x_velocity * obj->x_velocity) + + (obj->z_velocity * obj->z_velocity) + (obj->y_velocity * obj->y_velocity)) - 2.0; if (racer->vehicleID >= VEHICLE_BOSSES) { @@ -3199,7 +3200,7 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->y_velocity -= racer->oy3 * var_f20; obj->z_velocity -= racer->oz3 * var_f20; if (racer->trickType == 1 || racer->trickType == -1) { - spEC = racer->velocity * 0.0588235 * 1.5; + spEC = racer->velocity * 0.058823529411764705 * 1.5; var_f20 = coss_f(racer->x_rotation_vel) * spEC * racer->trickType; if (racer->x_rotation_vel > 0x4000 || racer->x_rotation_vel < -0x4000) { var_f20 *= 2; @@ -3303,8 +3304,8 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; mtxf_from_inverse_transform((MtxF *) &sp60, &gCurrentRacerTransform); - mtxf_transform_point((MtxF *) &sp60, obj->x_velocity, obj->y_velocity, obj->z_velocity, &racer->lateral_velocity, - &racer->unk34, &racer->velocity); + mtxf_transform_point((MtxF *) &sp60, obj->x_velocity, obj->y_velocity, obj->z_velocity, + &racer->lateral_velocity, &racer->unk34, &racer->velocity); if (obj->attachPoints != NULL && obj->attachPoints->count >= 3) { temp_v0_obj = obj->attachPoints->obj[2]; temp_v0_obj->trans.rotation.y_rotation = 0x4000; @@ -8132,16 +8133,17 @@ void set_position_goal_from_path(UNUSED Object *obj, Object_Racer *racer, f32 *x *z = catmull_rom_interpolation(splineZ, destReached, magnitude); } -// https://decomp.me/scratch/6WBdX +// https://decomp.me/scratch/uUmRq #ifdef NON_MATCHING void func_80059208(Object *obj, Object_Racer *racer, s32 updateRate) { - UNUSED s32 pad[2]; + UNUSED f32 pad; + UNUSED f32 pad2; s32 temp_v0; CheckpointNode *temp_v0_4; f32 posX[5]; f32 posY[5]; f32 posZ[5]; - UNUSED s32 pad2; + UNUSED f32 pad3; f32 tempX; s32 counter; f32 tempY; @@ -8192,78 +8194,81 @@ void func_80059208(Object *obj, Object_Racer *racer, s32 updateRate) { racer->unk1C8 = 0; } } - } else { - if (splinePos < 0.0f) { - splinePos = 0.0f; - } - temp_v0_4 = find_next_checkpoint_node(racer->checkpoint, racer->unk1C8); - scale = temp_v0_4->scale; - counter = racer->checkpoint - 1; - if (counter < 0) { - counter = temp_v0 - 1; - } - temp_v0_4 = get_checkpoint_node(counter); - distance = temp_v0_4->scale; - divisor = ((scale - temp_v0_4->scale) * splinePos) + distance; - counter = racer->checkpoint - 2; - if (counter < 0) { - counter += temp_v0; - } - for (i = 0; (i < 5) ^ 0; i++) { - temp_v0_4 = find_next_checkpoint_node(counter, racer->unk1C8); - posX[i] = temp_v0_4->x + ((temp_v0_4->scale * temp_v0_4->rotationZFrac) * racer->unk1BA); - posY[i] = temp_v0_4->y + (temp_v0_4->scale * racer->unk1BC); - posZ[i] = temp_v0_4->z + ((temp_v0_4->scale * (-temp_v0_4->rotationXFrac)) * racer->unk1BA); - counter++; - if (counter == temp_v0) { - counter = 0; - } - } - splineIndex = FALSE; - if (splinePos >= 1.0) { - splinePos -= 1.0; - splineIndex = TRUE; - } - tempX = cubic_spline_interpolation(posX, splineIndex, splinePos, &diffX); - tempY = cubic_spline_interpolation(posY, splineIndex, splinePos, &diffY); - tempZ = cubic_spline_interpolation(posZ, splineIndex, splinePos, &diffZ); - distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); - if (distance != 0.0f) { - scale = 1.0f / distance; - diffX *= scale; - diffZ *= scale; - } - angle = arctan2_f(diffX, diffZ) - (racer->steerVisualRotation & 0xFFFF) - 0x8000; - WRAP(angle, -0x8000, 0x8000); - if (angle > 0x4000 || angle < -0x4000) { - if (racer->wrongWayCounter < 200 && racer->velocity <= -1.0) { - racer->wrongWayCounter += updateRate; - } - } else { - racer->wrongWayCounter = 0; - } - diffY = diffX; - diffX = diffZ; - diffZ = -diffY; - splinePos = obj->trans.x_position; - distance = obj->trans.z_position; - diffX = -(((splinePos * diffX) + (diffZ * distance) - ((tempZ * diffZ) + (diffX * tempX))) / divisor); - if (diffX > 5.0f) { - diffX = 5.0f; - } - if (diffX < -5.0f) { - diffX = -5.0f; - } - racer->unk1BA += (s32) diffX; - diffY = (obj->trans.y_position - tempY) / divisor; - if (diffY > 100.0f) { - diffY = 100.0f; - } - if (diffY < -100.0f) { - diffY = -100.0f; - } - racer->unk1BC += (s32) diffY; + return; } + if (splinePos < 0.0f) { + splinePos = 0.0f; + } + temp_v0_4 = find_next_checkpoint_node(racer->checkpoint, racer->unk1C8); + scale = temp_v0_4->scale; + counter = racer->checkpoint - 1; + if (counter < 0) { + counter = temp_v0 - 1; + } + temp_v0_4 = get_checkpoint_node(counter); + distance = temp_v0_4->scale; + divisor = ((scale - temp_v0_4->scale) * splinePos) + distance; + counter = racer->checkpoint - 2; + if (counter < 0) { + counter += temp_v0; + } + for (i = 0; (i < 5) ^ 0; i++) { + temp_v0_4 = find_next_checkpoint_node(counter, racer->unk1C8); + posX[i] = temp_v0_4->x + ((temp_v0_4->scale * temp_v0_4->rotationZFrac) * racer->unk1BA); + posY[i] = temp_v0_4->y + (temp_v0_4->scale * racer->unk1BC); + posZ[i] = temp_v0_4->z + ((temp_v0_4->scale * (-temp_v0_4->rotationXFrac)) * racer->unk1BA); + counter++; + if (counter == temp_v0) { + counter = 0; + } + } + splineIndex = FALSE; + if (splinePos >= 1.0) { + splinePos -= 1.0; + splineIndex = TRUE; + } + tempX = cubic_spline_interpolation(posX, splineIndex, splinePos, &diffX); + tempY = cubic_spline_interpolation(posY, splineIndex, splinePos, &diffY); + tempZ = cubic_spline_interpolation(posZ, splineIndex, splinePos, &diffZ); + distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); + if (distance != 0.0f) { + scale = 1.0f / distance; + diffX *= scale; + diffZ *= scale; + } + angle = arctan2_f(diffX, diffZ) - (racer->steerVisualRotation & 0xFFFF) - 0x8000; + WRAP(angle, -0x8000, 0x8000); + if (angle > 0x4000 || angle < -0x4000) { + if (racer->wrongWayCounter < 200 && racer->velocity <= -1.0) { + racer->wrongWayCounter += updateRate; + } + } else { + racer->wrongWayCounter = 0; + } + diffY = diffX; + diffX = diffZ; + diffZ = -diffY; + + splinePos = obj->trans.x_position; + distance = obj->trans.z_position; + pad = ((splinePos * diffX) + (diffZ * distance)); + pad2 = -((tempZ * diffZ) + (diffX * tempX)); + diffX = -((pad + pad2) / divisor); + if (diffX > 5.0f) { + diffX = 5.0f; + } + if (diffX < -5.0f) { + diffX = -5.0f; + } + racer->unk1BA += (s32) diffX; + diffY = (obj->trans.y_position - tempY) / divisor; + if (diffY > 100.0f) { + diffY = 100.0f; + } + if (diffY < -100.0f) { + diffY = -100.0f; + } + racer->unk1BC += (s32) diffY; } #else #pragma GLOBAL_ASM("asm/nonmatchings/racer/func_80059208.s") diff --git a/src/racer.h b/src/racer.h index b55ebc8f..78d543ad 100644 --- a/src/racer.h +++ b/src/racer.h @@ -219,7 +219,7 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object* racerObj, Object_Rac //Non Matching s32 timetrial_ghost_read(Object *obj); void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32, f32); -s32 func_80017248(Object *obj, s32, s32 *, Vec3f *, f32 *, f32 *, s8 *surface); +s32 func_80017248(Object *obj, s32 arg1, s32* arg2, f32 *arg3, f32* arg4, f32* arg5, s8* surface); void func_80059208(Object* obj, Object_Racer* racer, s32 updateRate); /* extern */ void func_80049794(s32 updateRate, f32 updateRateF, Object* obj, Object_Racer* racer); /* extern */ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Racer *racer); /* extern */ diff --git a/src/tracks.c b/src/tracks.c index 3a9a7f3a..849b313a 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -1076,43 +1076,34 @@ s32 void_generate_primitive(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3) { return NULL; } +// https://decomp.me/scratch/7GUjD #ifdef NON_MATCHING -typedef struct Unk80027568_1 { - u8 unk0[0x18]; - Vec4f *unk18; -} Unk80027568_1; - -// https://decomp.me/scratch/duMgr s32 func_80027568(void) { - Unk80027568_1 *var_ra; // spE4 - f32 new_var; + LevelModelSegment *segment; // spE4 s32 ret; s32 var_t4; - f32 projectedRacerPos; - f32 projectedCamPos; + f32 playerDist; + f32 camDist; f32 scalingFactor; - f32 var_f14; + u32 curViewport; + s32 flipSide; s32 numRacers; // spC4 - s32 curViewport; - s32 isNegative; s32 i; - Vec4f *vector; s32 j; f32 var_f18; - f32 temp; - f32 temp2; - f32 temp3; + f32 A1, B1, C1, D1; f32 var_f20; f32 var_f22; f32 var_f24; - u16 *var_t2; + CollisionNode *colNode; Object_Racer *racer; - f32 camXPos; - f32 camYPos; - Object **racerGroup; // sp80 - Object *currentObjRacer; // sp7C + f32 A, B, C, D; + Object **racerObjects; // sp80 + Object *racerObj; // sp7C + s32 index; + u16 index2; - racerGroup = get_racer_objects(&numRacers); + racerObjects = get_racer_objects(&numRacers); if (numRacers == 0) { return FALSE; } @@ -1121,68 +1112,65 @@ s32 func_80027568(void) { return FALSE; } curViewport = get_current_viewport(); - currentObjRacer = NULL; + racerObj = NULL; for (i = 0; i < numRacers; i++) { - racer = racerGroup[i]->racer; + racer = racerObjects[i]->racer; if (curViewport == racer->playerIndex) { - currentObjRacer = racerGroup[i]; + racerObj = racerObjects[i]; i = numRacers; // Come on! Just use break! } } - if (currentObjRacer == NULL) { + if (racerObj == NULL) { return FALSE; } - generate_collision_candidates(1, ¤tObjRacer->trans.x_position, &gSceneActiveCamera->trans.x_position, -1); + generate_collision_candidates(1, &racerObj->trans.x_position, &gSceneActiveCamera->trans.x_position, -1); ret = FALSE; - // bug? var_ra can be undefined? for (var_t4 = 0; var_t4 < gNumCollisionCandidates && ret == FALSE; var_t4++) { - if ((s32) gCollisionCandidates[var_t4] > 0) { - var_ra = (Unk80027568_1 *) PHYS_TO_K0(gCollisionCandidates[var_t4]); + if (gCollisionCandidates[var_t4] > 0) { + // this is segment Entry + segment = (LevelModelSegment *) (gCollisionCandidates[var_t4] | 0x80000000); } else { - var_t2 = gCollisionCandidates[var_t4]; - vector = var_ra->unk18; - vector += var_t2[0]; - new_var = vector->x; + colNode = (CollisionNode *) gCollisionCandidates[var_t4]; + index = colNode->colPlaneIndex << 2; + A = segment->collisionPlanes[index + 0]; + B = segment->collisionPlanes[index + 1]; + C = segment->collisionPlanes[index + 2]; + D = segment->collisionPlanes[index + 3]; - camXPos = gSceneActiveCamera->trans.x_position; - camYPos = gSceneActiveCamera->trans.y_position; + camDist = A * gSceneActiveCamera->trans.x_position + B * gSceneActiveCamera->trans.y_position + + C * gSceneActiveCamera->trans.z_position + D - 14.0; + if (camDist < -0.1) { + playerDist = A * racerObj->trans.x_position + B * racerObj->trans.y_position + + C * racerObj->trans.z_position + D; + if (playerDist >= -0.1) { + var_f20 = (gSceneActiveCamera->trans.x_position - racerObj->trans.x_position); + var_f22 = (gSceneActiveCamera->trans.y_position - racerObj->trans.y_position); + var_f24 = (gSceneActiveCamera->trans.z_position - racerObj->trans.z_position); - projectedCamPos = (((camXPos * new_var) + (vector->y * camYPos) + - (vector->z * gSceneActiveCamera->trans.z_position) + vector->w) - - 14.0); - if (projectedCamPos < -0.1) { - projectedRacerPos = (currentObjRacer->trans.x_position * new_var) + - (vector->y * currentObjRacer->trans.y_position) + - (vector->z * currentObjRacer->trans.z_position) + vector->w; - if (projectedRacerPos >= -0.1) { - var_f20 = (camXPos - currentObjRacer->trans.x_position); - var_f22 = (camYPos - currentObjRacer->trans.y_position); - var_f24 = (gSceneActiveCamera->trans.z_position - currentObjRacer->trans.z_position); - - if (projectedRacerPos != projectedCamPos) { - scalingFactor = projectedRacerPos / (projectedRacerPos - projectedCamPos); + if (playerDist != camDist) { + scalingFactor = playerDist / (playerDist - camDist); } else { scalingFactor = 0.0f; } - var_f20 = currentObjRacer->trans.x_position + (var_f20 * scalingFactor); - var_f22 = currentObjRacer->trans.y_position + (var_f22 * scalingFactor); - var_f24 = currentObjRacer->trans.z_position + (var_f24 * scalingFactor); + var_f20 = racerObj->trans.x_position + (var_f20 * scalingFactor); + var_f22 = racerObj->trans.y_position + (var_f22 * scalingFactor); + var_f24 = racerObj->trans.z_position + (var_f24 * scalingFactor); for (j = 0, ret = TRUE; j < 3 && ret == TRUE; j++) { - isNegative = FALSE; - curViewport = var_t2[j + 1]; + flipSide = FALSE; + curViewport = colNode->closestTri[j]; if (curViewport & 0x8000) { curViewport &= 0x7FFF; - isNegative = TRUE; + flipSide = TRUE; } - vector = &var_ra->unk18[curViewport]; - temp = vector->x; - temp2 = vector->y; - temp3 = vector->z; - var_f14 = vector->w; - var_f18 = (temp * var_f20) + (temp2 * var_f22) + (temp3 * var_f24) + var_f14; - if (isNegative) { + curViewport = 4 * curViewport; + A1 = segment->collisionPlanes[curViewport + 0]; + B1 = segment->collisionPlanes[curViewport + 1]; + C1 = segment->collisionPlanes[curViewport + 2]; + D1 = segment->collisionPlanes[curViewport + 3]; + var_f18 = A1 * var_f20 + B1 * var_f22 + C1 * var_f24 + D1; + if (flipSide) { var_f18 = -var_f18; } if (var_f18 > 4.0f) { @@ -1481,9 +1469,9 @@ void trackbg_render_flashy(void) { var_t2 = *gCurrentLevelHeader2->unk74; var_a2 = -1; - if ((s32) var_t2 != -1) { + if ((u32) var_t2 != -1) { levelHeader = gCurrentLevelHeader2->unk74[1]; - if ((s32) levelHeader == -1) { + if ((u32) levelHeader == -1) { levelHeader = var_t2; } } else { @@ -2507,48 +2495,50 @@ s32 get_wave_properties(f32 yPos, f32 *waterHeight, Vec3f *rotation) { return gTrackWaves[index]->type; } -// https://decomp.me/scratch/X1SBi +// https://decomp.me/scratch/5Useu #ifdef NON_EQUIVALENT s32 func_8002B0F4(s32 levelSegmentIndex, f32 xIn, f32 zIn, WaterProperties ***arg3) { LevelModelSegment *currentSegment; LevelModelSegmentBoundingBox *currentBoundingBox; Triangle *tri; Vertex *vert; - f32 temp_f2_2; + s32 pad; s16 vert2X; s16 vert2Z; s16 temp_a2; s16 vert3X; + s32 sp108; s16 vert3Z; - s32 currentVerticesOffset; - s16 nextFaceOffset; s16 vert1X; - s16 currentFaceOffset; + s32 pad2; + s32 currentVerticesOffset; + s32 nextFaceOffset; + s32 currentFaceOffset; s16 vert1Z; s16 var_a1; s32 faceNum; s16 var_s1; s16 var_t0; s16 var_t1; + s8 surface; s32 XInInt; s32 ZInInt; s32 temp_ra_1; s32 temp_ra_2; s32 temp_ra_3; + s32 spB0[8]; s32 yOutCount; s32 batchNum; s32 i; s32 var_v0; s32 stopSorting; TriangleBatchInfo *currentBatch; - f32 *temp_v1_4; + s32 pad3; Vec4f tempVec4f; - u16 temp; - - s32 sp108; - s32 spB0[8]; - s32 surface; + s32 temp; s32 var_fp; + WaterProperties *wave; + WaterProperties *wave2; D_8011D308 = 0; *arg3 = NULL; @@ -2558,15 +2548,16 @@ s32 func_8002B0F4(s32 levelSegmentIndex, f32 xIn, f32 zIn, WaterProperties ***ar return 0; } - XInInt = xIn; - ZInInt = zIn; + yOutCount = 0; for (var_fp = 0; var_fp < sp108; var_fp++) { currentSegment = &gCurrentLevelModel->segments[spB0[var_fp]]; currentBoundingBox = &gCurrentLevelModel->segmentsBoundingBoxes[spB0[var_fp]]; var_a1 = 1; var_s1 = 0; - + XInInt = xIn; + ZInInt = zIn; + temp_a2 = ((currentBoundingBox->x2 - currentBoundingBox->x1) >> 3) + 1; var_t0 = temp_a2 + currentBoundingBox->x1; var_t1 = currentBoundingBox->x1; @@ -2578,9 +2569,11 @@ s32 func_8002B0F4(s32 levelSegmentIndex, f32 xIn, f32 zIn, WaterProperties ***ar var_t1 += temp_a2; var_a1 *= 2; } - + // Same as above, but for Z temp_a2 = ((currentBoundingBox->z2 - currentBoundingBox->z1) >> 3) + 1; + // @fake for s3 vs s2 + if (1) {} var_t0 = temp_a2 + currentBoundingBox->z1; var_t1 = currentBoundingBox->z1; for (i = 0; i < 8; i++) { @@ -2591,50 +2584,47 @@ s32 func_8002B0F4(s32 levelSegmentIndex, f32 xIn, f32 zIn, WaterProperties ***ar var_t1 += temp_a2; var_a1 *= 2; } - - yOutCount = 0; - + for (batchNum = 0; batchNum < currentSegment->numberOfBatches; batchNum++) { currentBatch = ¤tSegment->batches[batchNum]; surface = gCurrentLevelModel->textures[currentBatch->textureIndex].surfaceType; currentFaceOffset = currentBatch->facesOffset; - nextFaceOffset = currentBatch[1].facesOffset; currentVerticesOffset = currentBatch->verticesOffset; + nextFaceOffset = currentBatch[1].facesOffset; if (surface != SURFACE_WATER_CALM && surface != SURFACE_WATER_UNK_F && (currentBatch->flags & (RENDER_HIDDEN | RENDER_NO_COLLISION))) { currentFaceOffset = nextFaceOffset; } - + for (faceNum = currentFaceOffset; faceNum < nextFaceOffset; faceNum++) { if (var_s1 == (currentSegment->unk10[faceNum] & var_s1)) { tri = ¤tSegment->triangles[faceNum]; + vert = ¤tSegment->vertices[tri->verticesArray[1] + currentVerticesOffset]; vert1X = vert->x; vert1Z = vert->z; + vert = ¤tSegment->vertices[tri->verticesArray[2] + currentVerticesOffset]; vert2X = vert->x; vert2Z = vert->z; + vert = ¤tSegment->vertices[tri->verticesArray[3] + currentVerticesOffset]; vert3X = vert->x; vert3Z = vert->z; - temp_ra_1 = - ((((XInInt - vert2X) * (vert3Z - vert2Z)) - ((vert3X - vert2X) * (ZInInt - vert2Z))) >= 0); - temp_ra_2 = - ((((XInInt - vert1X) * (vert2Z - vert1Z)) - ((vert2X - vert1X) * (ZInInt - vert1Z))) >= 0); - temp_ra_3 = - ((((XInInt - vert1X) * (vert3Z - vert1Z)) - ((vert3X - vert1X) * (ZInInt - vert1Z))) >= 0); + + temp_ra_1 = (((XInInt - vert2X) * (vert3Z - vert2Z)) - ((vert3X - vert2X) * (ZInInt - vert2Z))) >= 0; + temp_ra_2 = (((XInInt - vert1X) * (vert2Z - vert1Z)) - ((vert2X - vert1X) * (ZInInt - vert1Z))) >= 0; + temp_ra_3 = (((XInInt - vert1X) * (vert3Z - vert1Z)) - ((vert3X - vert1X) * (ZInInt - vert1Z))) >= 0; if (temp_ra_1 == temp_ra_2 && temp_ra_2 != temp_ra_3) { temp = currentSegment->collisionFacets[faceNum].basePlaneIndex; - temp_v1_4 = (f32 *) ¤tSegment->collisionPlanes[temp * 4]; - tempVec4f.x = temp_v1_4[0]; - tempVec4f.y = temp_v1_4[1]; - tempVec4f.z = temp_v1_4[2]; - tempVec4f.w = temp_v1_4[3]; + tempVec4f.x = currentSegment->collisionPlanes[temp * 4 + 0]; + tempVec4f.y = currentSegment->collisionPlanes[temp * 4 + 1]; + tempVec4f.z = currentSegment->collisionPlanes[temp * 4 + 2]; + tempVec4f.w = currentSegment->collisionPlanes[temp * 4 + 3]; if (tempVec4f.y != 0.0) { D_8011D128[yOutCount].type = surface; - D_8011D128[yOutCount].waveHeight = - -(((tempVec4f.x * xIn) + (tempVec4f.z * zIn) + tempVec4f.w) / tempVec4f.y); + D_8011D128[yOutCount].waveHeight = -(((tempVec4f.x * xIn) + (tempVec4f.z * zIn) + tempVec4f.w) / tempVec4f.y); D_8011D128[yOutCount].rot.x = tempVec4f.x; D_8011D128[yOutCount].rot.y = tempVec4f.y; D_8011D128[yOutCount].rot.z = tempVec4f.z; @@ -2652,12 +2642,14 @@ s32 func_8002B0F4(s32 levelSegmentIndex, f32 xIn, f32 zIn, WaterProperties ***ar } } + // @diff gCurrentLevelModel is stored in a0? Might be fixed if the bottom for and do-while is fixed if (levelSegmentIndex >= 0 && levelSegmentIndex < gCurrentLevelModel->numberOfSegments) { + currentSegment = &gCurrentLevelModel->segments[levelSegmentIndex]; D_8011D128[yOutCount].type = SURFACE_WATER_WAVY; - if (gCurrentLevelModel->segments[levelSegmentIndex].hasWaves && gWaveBlockCount != 0) { - D_8011D128[yOutCount].waveHeight = func_800BB2F4(levelSegmentIndex, xIn, zIn, &D_8011D128[yOutCount].rot); + if (currentSegment->hasWaves && gWaveBlockCount != 0) { + D_8011D128[yOutCount].waveHeight = func_800BB2F4(levelSegmentIndex, xIn, zIn, &(yOutCount + D_8011D128)->rot); } else { - D_8011D128[yOutCount].waveHeight = gCurrentLevelModel->segments[levelSegmentIndex].unk38; + D_8011D128[yOutCount].waveHeight = currentSegment->unk38; D_8011D128[yOutCount].rot.x = 0.0f; D_8011D128[yOutCount].rot.y = 1.0f; D_8011D128[yOutCount].rot.z = 0.0f; @@ -2666,17 +2658,21 @@ s32 func_8002B0F4(s32 levelSegmentIndex, f32 xIn, f32 zIn, WaterProperties ***ar } // clang-format off - for (i = 0; i < yOutCount; i++) { gTrackWaves[i] = &D_8011D128[i]; } + for (var_v0 = 0; var_v0 < yOutCount; var_v0++) {\ + wave = &D_8011D128[var_v0];\ + gTrackWaves[var_v0] = wave;\ + }\ // clang-format on do { stopSorting = TRUE; - for (i = 0; i < yOutCount - 1; i++) { - if (gTrackWaves[i]->waveHeight < gTrackWaves[i + 1]->waveHeight) { - WaterProperties *wave = gTrackWaves[i]; + for (var_v0 = 0; var_v0 < yOutCount - 1; var_v0++) { + wave = gTrackWaves[var_v0 + 1]; // @fake? + if (gTrackWaves[var_v0]->waveHeight < gTrackWaves[var_v0 + 1]->waveHeight) { stopSorting = FALSE; - gTrackWaves[i] = gTrackWaves[i + 1]; - gTrackWaves[i + 1] = wave; + wave = gTrackWaves[var_v0]; + gTrackWaves[var_v0] = gTrackWaves[var_v0 + 1]; + gTrackWaves[var_v0 + 1] = wave; } } } while (!stopSorting);