From a1f4906aa0453c7bd148087816f1c9345badeaf8 Mon Sep 17 00:00:00 2001 From: petrie911 Date: Thu, 8 Jun 2023 17:41:07 -0500 Subject: [PATCH] my god, it matches --- spec | 4 -- src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c | 50 +++++++++---------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/spec b/spec index 9f7cb3dd4..bb4a78b66 100644 --- a/spec +++ b/spec @@ -2926,11 +2926,7 @@ beginseg name "ovl_Obj_Mine" compress include "build/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.o" -#ifdef NON_MATCHING include "build/src/overlays/actors/ovl_Obj_Mine/ovl_Obj_Mine_reloc.o" -#else - include "build/data/ovl_Obj_Mine/ovl_Obj_Mine.reloc.o" -#endif endseg beginseg diff --git a/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c b/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c index 25c07120a..23c520b31 100644 --- a/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c +++ b/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c @@ -478,28 +478,27 @@ void ObjMine_Water_WallCheck(ObjMine* this, PlayState* play) { } } -#ifdef NON_MATCHING -// https://decomp.me/scratch/BW51G -// Probably equivalent, but nightmare loop unrolls. The tension section also has weird comparisons. It should be -// equivalent to what's written, but it seems the actual code comparisons were implemented differently. ASM suggests -// multiple index variables were used at once. +Vec3f sLastLinkAccel[OBJMINE_CHAIN_MAX + 1]; void ObjMine_Water_ApplyForces(ObjMine* this) { - static Vec3f sLastLinkAccel[OBJMINE_CHAIN_MAX + 1]; ObjMineWaterChain* waterChain = &this->chain.water; ObjMineWaterLink* waterLink; s32 i; - s16 swayPhase; + s16 swayPhase = 0; s32 linkCount = OBJMINE_GET_LINK_COUNT(&this->actor); f32 inverseCount = 1.0f / linkCount; f32 restoreY = (waterChain->links[linkCount - 1].pos.y - waterChain->restY) * waterChain->restoreY; Vec3f tension; f32 scaledKnockback; + s32 index; + s32 pad; + Vec3f* lastLinkAccel; // Applies the buoyant force and sway from the water. - for (i = 0, waterLink = waterChain->links, swayPhase = 0; i < linkCount; - i++, waterLink++, swayPhase += waterChain->swayPhaseVel) { - Math_Vec3f_Copy(&sLastLinkAccel[i], &waterLink->accel); + for (i = 0, waterLink = waterChain->links, lastLinkAccel = sLastLinkAccel; i < linkCount; + i++, waterLink++, swayPhase += waterChain->swayPhaseVel, lastLinkAccel++) { + Math_Vec3f_Copy(lastLinkAccel, &waterLink->accel); + if (waterLink->pos.y <= this->actor.home.pos.y) { waterLink->accel.y = waterChain->restoreY * -96.0f; } else if (restoreY > 0.0f) { @@ -507,6 +506,7 @@ void ObjMine_Water_ApplyForces(ObjMine* this) { } else { waterLink->accel.y = restoreY; } + waterLink->accel.x = (waterLink->pos.x - this->actor.home.pos.x) * waterChain->restoreXZ; waterLink->accel.z = (waterLink->pos.z - this->actor.home.pos.z) * waterChain->restoreXZ; waterLink->accel.x += waterChain->swayXZ * Math_SinS(swayPhase); @@ -538,12 +538,14 @@ void ObjMine_Water_ApplyForces(ObjMine* this) { // frame. for (i = 0, waterLink = waterChain->links; i < linkCount; i++, waterLink++) { Math_Vec3f_Copy(&tension, &gZeroVec3f); - if (i - 2 >= 0) { + + if (i >= 2) { tension.x += sLastLinkAccel[i - 2].x * 0.075f; tension.y += sLastLinkAccel[i - 2].y * 0.075f; tension.z += sLastLinkAccel[i - 2].z * 0.075f; } - if (i - 1 >= 0) { + + if (i >= 1) { tension.x += sLastLinkAccel[i - 1].x * 0.15f; tension.y += sLastLinkAccel[i - 1].y * 0.15f; tension.z += sLastLinkAccel[i - 1].z * 0.15f; @@ -553,26 +555,24 @@ void ObjMine_Water_ApplyForces(ObjMine* this) { tension.y += sLastLinkAccel[i].y * 0.3f; tension.z += sLastLinkAccel[i].z * 0.3f; - if (i + 1 < linkCount) { - tension.x += sLastLinkAccel[i + 1].x * 0.15f; - tension.y += sLastLinkAccel[i + 1].y * 0.15f; - tension.z += sLastLinkAccel[i + 1].z * 0.15f; + index = i + 1; + if (index < linkCount) { + tension.x += sLastLinkAccel[index].x * 0.15f; + tension.y += sLastLinkAccel[index].y * 0.15f; + tension.z += sLastLinkAccel[index].z * 0.15f; } - if (i + 2 < linkCount) { - tension.x += sLastLinkAccel[i + 2].x * 0.075f; - tension.y += sLastLinkAccel[i + 2].y * 0.075f; - tension.z += sLastLinkAccel[i + 2].z * 0.075f; + + index = i + 2; + if (index < linkCount) { + tension.x += sLastLinkAccel[index].x * 0.075f; + tension.y += sLastLinkAccel[index].y * 0.075f; + tension.z += sLastLinkAccel[index].z * 0.075f; } waterLink->accel.x += tension.x; waterLink->accel.y += tension.y; waterLink->accel.z += tension.z; } } -#else -Vec3f sLastLinkAccel[OBJMINE_CHAIN_MAX + 1]; -void ObjMine_Water_ApplyForces(ObjMine* this); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Mine/ObjMine_Water_ApplyForces.s") -#endif void ObjMine_Water_UpdateLinks(ObjMine* this) { s32 pad; // Could be recast to thisx as in ObjMine_Path_Move