diff --git a/LEGO1/lego/legoomni/include/act3ammo.h b/LEGO1/lego/legoomni/include/act3ammo.h index 4cd23f66..379971b4 100644 --- a/LEGO1/lego/legoomni/include/act3ammo.h +++ b/LEGO1/lego/legoomni/include/act3ammo.h @@ -27,7 +27,7 @@ class Act3Ammo : public LegoPathActor { MxU32 IsValid() { return m_ammoFlag & c_valid; } // FUNCTION: BETA10 0x100177b0 - Mx3DPointFloat* GetUnknown0x160() { return m_unk0x160; } + Mx3DPointFloat* GetUnknown0x160() { return m_eq; } // FUNCTION: BETA10 0x100177e0 MxFloat* GetUnknown0x19c() { return &m_unk0x19c; } @@ -70,11 +70,11 @@ class Act3Ammo : public LegoPathActor { // Act3Ammo::`scalar deleting destructor' private: - MxU16 m_ammoFlag; // 0x154 - MxFloat m_unk0x158; // 0x158 - Act3* m_a3; // 0x15c - Mx3DPointFloat m_unk0x160[3]; // 0x160 - MxFloat m_unk0x19c; // 0x19c + MxU16 m_ammoFlag; // 0x154 + MxFloat m_unk0x158; // 0x158 + Act3* m_a3; // 0x15c + Mx3DPointFloat m_eq[3]; // 0x160 + MxFloat m_unk0x19c; // 0x19c }; #endif // ACT3AMMO_H diff --git a/LEGO1/lego/legoomni/src/actors/act3ammo.cpp b/LEGO1/lego/legoomni/src/actors/act3ammo.cpp index 475ed8cd..bf214ded 100644 --- a/LEGO1/lego/legoomni/src/actors/act3ammo.cpp +++ b/LEGO1/lego/legoomni/src/actors/act3ammo.cpp @@ -80,11 +80,39 @@ MxResult Act3Ammo::Create(Act3* p_a3, MxU32 p_isPizza, MxS32 p_index) return SUCCESS; } -// STUB: LEGO1 0x10053b40 -// STUB: BETA10 0x1001db2a +// FUNCTION: LEGO1 0x10053b40 +// FUNCTION: BETA10 0x1001db2a MxResult Act3Ammo::FUN_10053b40(Vector3& p_srcLoc, Vector3& p_srcDir, Vector3& p_srcUp) { - // TODO + assert(p_srcDir[1] != 0); + + MxFloat local1c = -(p_srcLoc[1] / p_srcDir[1]); + Mx3DPointFloat local18(p_srcDir); + Mx3DPointFloat local34; + + local18 *= local1c; + local18 += p_srcLoc; + + local34[0] = local34[2] = 0.0f; + local34[1] = -1.0f; + + m_eq[1] = p_srcUp; + m_eq[2] = p_srcLoc; + + Mx3DPointFloat local48(local34); + local48 -= m_eq[1]; + + for (MxS32 i = 0; i < 3; i++) { + if (local18[0] == p_srcLoc[0]) { + return FAILURE; + } + + m_eq[0][i] = (local48[i] * local48[i] + local48[i] * m_eq[1][i] * 2.0f) / ((local18[i] - p_srcLoc[i]) * 4.0f); + } + + assert(m_eq[0][0] > 0.000001 || m_eq[0][0] < -0.000001); + + m_unk0x19c = local48[0] / (m_eq[0][0] * 2.0f); return SUCCESS; }