diff --git a/LEGO1/lego/legoomni/include/legocarraceactor.h b/LEGO1/lego/legoomni/include/legocarraceactor.h index e68a2afc..6f1c72f4 100644 --- a/LEGO1/lego/legoomni/include/legocarraceactor.h +++ b/LEGO1/lego/legoomni/include/legocarraceactor.h @@ -60,6 +60,9 @@ public: virtual void VTable0x1c(); // vtable+0x1c + // SYNTHETIC: LEGO1 0x10012c30 + // LegoCarRaceActor::`vbase destructor' + // SYNTHETIC: LEGO1 0x10081620 // LegoCarRaceActor::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoentity.h b/LEGO1/lego/legoomni/include/legoentity.h index 4fb01d61..115ed813 100644 --- a/LEGO1/lego/legoomni/include/legoentity.h +++ b/LEGO1/lego/legoomni/include/legoentity.h @@ -62,6 +62,7 @@ public: virtual void ResetWorldTransform(MxBool p_cameraFlag); // vtable+0x2c // FUNCTION: LEGO1 0x10001090 + // FUNCTION: BETA10 0x10013260 virtual void SetWorldSpeed(MxFloat p_worldSpeed) { m_worldSpeed = p_worldSpeed; } // vtable+0x30 virtual void ClickSound(MxBool p_und); // vtable+0x34 diff --git a/LEGO1/lego/legoomni/include/legoraceactor.h b/LEGO1/lego/legoomni/include/legoraceactor.h index 50d4a016..57325256 100644 --- a/LEGO1/lego/legoomni/include/legoraceactor.h +++ b/LEGO1/lego/legoomni/include/legoraceactor.h @@ -33,6 +33,9 @@ public: // FUNCTION: LEGO1 0x10014aa0 virtual MxResult FUN_10014aa0() { return SUCCESS; } + // SYNTHETIC: LEGO1 0x10012c10 + // LegoRaceActor::`vbase destructor' + // SYNTHETIC: LEGO1 0x10014ac0 // LegoRaceActor::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoracemap.h b/LEGO1/lego/legoomni/include/legoracemap.h index 99625dd9..3cbd7739 100644 --- a/LEGO1/lego/legoomni/include/legoracemap.h +++ b/LEGO1/lego/legoomni/include/legoracemap.h @@ -21,6 +21,9 @@ public: // LegoRaceMap vtable virtual void FUN_1005d4b0(); // vtable+0x00 + // SYNTHETIC: LEGO1 0x10012c50 + // LegoRaceMap::`vbase destructor' + // SYNTHETIC: LEGO1 0x1005d5d0 // LegoRaceMap::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoracers.h b/LEGO1/lego/legoomni/include/legoracers.h index ab5310a7..d20de8a7 100644 --- a/LEGO1/lego/legoomni/include/legoracers.h +++ b/LEGO1/lego/legoomni/include/legoracers.h @@ -11,8 +11,9 @@ // SIZE 0x08 struct EdgeReference { - const char* m_name; // 0x00 - LegoPathBoundary* m_data; // 0x04 + const char* m_name; // 0x00 + // name verified by BETA10 0x100cbee6 + LegoPathBoundary* m_b; // 0x04 }; // SIZE 0x10 @@ -78,15 +79,23 @@ public: // LegoRaceCar::`scalar deleting destructor' private: - undefined m_userState; // 0x54 - float m_unk0x58; // 0x58 - Mx3DPointFloat m_unk0x5c; // 0x5c - LegoAnimActorStruct* m_unk0x70; // 0x70 - LegoAnimActorStruct* m_unk0x74; // 0x74 - LegoPathBoundary* m_unk0x78; // 0x78 - LegoPathBoundary* m_unk0x7c; // 0x7c + undefined m_userState; // 0x54 + float m_unk0x58; // 0x58 + Mx3DPointFloat m_unk0x5c; // 0x5c + + // Names verified by BETA10 0x100cb4a9 + LegoAnimActorStruct* m_skelKick1Anim; // 0x70 + LegoAnimActorStruct* m_skelKick2Anim; // 0x74 + + // Name verified by BETA10 0x100cb4f0 + LegoPathBoundary* m_kick1B; // 0x78 + + // Name verified by BETA10 0x100cb537 + LegoPathBoundary* m_kick2B; // 0x7c + + // name verified by BETA10 0x100cbee6 + static EdgeReference g_skBMap[]; - static EdgeReference g_edgeReferences[]; static const SkeletonKickPhase g_skeletonKickPhases[]; static const char* g_strSpeed; static const char* g_srtsl18to29[]; diff --git a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp index c374ab5e..239f704f 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp @@ -33,6 +33,7 @@ DECOMP_SIZE_ASSERT(LegoPathEdgeContainer, 0x3c) const char* g_strHIT_WALL_SOUND = "HIT_WALL_SOUND"; // GLOBAL: LEGO1 0x100f3308 +// GLOBAL: BETA10 0x101f1e1c MxLong g_unk0x100f3308 = 0; // FUNCTION: LEGO1 0x1002d700 diff --git a/LEGO1/lego/legoomni/src/race/legoracers.cpp b/LEGO1/lego/legoomni/src/race/legoracers.cpp index 355f3b79..5bebe2da 100644 --- a/LEGO1/lego/legoomni/src/race/legoracers.cpp +++ b/LEGO1/lego/legoomni/src/race/legoracers.cpp @@ -22,7 +22,8 @@ DECOMP_SIZE_ASSERT(SkeletonKickPhase, 0x10) DECOMP_SIZE_ASSERT(LegoRaceCar, 0x200) // GLOBAL: LEGO1 0x100f0a20 -EdgeReference LegoRaceCar::g_edgeReferences[] = { +// GLOBAL: BETA10 0x101f5e34 +EdgeReference LegoRaceCar::g_skBMap[] = { {// STRING: LEGO1 0x100f0a10 "EDG03_772", NULL @@ -50,19 +51,20 @@ EdgeReference LegoRaceCar::g_edgeReferences[] = { }; // GLOBAL: LEGO1 0x100f0a50 +// GLOBAL: BETA10 0x101f5e60 const SkeletonKickPhase LegoRaceCar::g_skeletonKickPhases[] = { - {&LegoRaceCar::g_edgeReferences[0], 0.1, 0.2, LEGORACECAR_KICK2}, - {&LegoRaceCar::g_edgeReferences[1], 0.2, 0.3, LEGORACECAR_KICK2}, - {&LegoRaceCar::g_edgeReferences[2], 0.3, 0.4, LEGORACECAR_KICK2}, - {&LegoRaceCar::g_edgeReferences[2], 0.6, 0.7, LEGORACECAR_KICK1}, - {&LegoRaceCar::g_edgeReferences[1], 0.7, 0.8, LEGORACECAR_KICK1}, - {&LegoRaceCar::g_edgeReferences[0], 0.8, 0.9, LEGORACECAR_KICK1}, - {&LegoRaceCar::g_edgeReferences[3], 0.1, 0.2, LEGORACECAR_KICK1}, - {&LegoRaceCar::g_edgeReferences[4], 0.2, 0.3, LEGORACECAR_KICK1}, - {&LegoRaceCar::g_edgeReferences[5], 0.3, 0.4, LEGORACECAR_KICK1}, - {&LegoRaceCar::g_edgeReferences[5], 0.6, 0.7, LEGORACECAR_KICK2}, - {&LegoRaceCar::g_edgeReferences[4], 0.7, 0.8, LEGORACECAR_KICK2}, - {&LegoRaceCar::g_edgeReferences[3], 0.8, 0.9, LEGORACECAR_KICK2}, + {&LegoRaceCar::g_skBMap[0], 0.1, 0.2, LEGORACECAR_KICK2}, + {&LegoRaceCar::g_skBMap[1], 0.2, 0.3, LEGORACECAR_KICK2}, + {&LegoRaceCar::g_skBMap[2], 0.3, 0.4, LEGORACECAR_KICK2}, + {&LegoRaceCar::g_skBMap[2], 0.6, 0.7, LEGORACECAR_KICK1}, + {&LegoRaceCar::g_skBMap[1], 0.7, 0.8, LEGORACECAR_KICK1}, + {&LegoRaceCar::g_skBMap[0], 0.8, 0.9, LEGORACECAR_KICK1}, + {&LegoRaceCar::g_skBMap[3], 0.1, 0.2, LEGORACECAR_KICK1}, + {&LegoRaceCar::g_skBMap[4], 0.2, 0.3, LEGORACECAR_KICK1}, + {&LegoRaceCar::g_skBMap[5], 0.3, 0.4, LEGORACECAR_KICK1}, + {&LegoRaceCar::g_skBMap[5], 0.6, 0.7, LEGORACECAR_KICK2}, + {&LegoRaceCar::g_skBMap[4], 0.7, 0.8, LEGORACECAR_KICK2}, + {&LegoRaceCar::g_skBMap[3], 0.8, 0.9, LEGORACECAR_KICK2}, }; // GLOBAL: LEGO1 0x100f0b10 @@ -70,6 +72,7 @@ const SkeletonKickPhase LegoRaceCar::g_skeletonKickPhases[] = { const char* LegoRaceCar::g_strSpeed = "SPEED"; // GLOBAL: LEGO1 0x100f0b18 +// GLOBAL: BETA10 0x101f5f28 const char* LegoRaceCar::g_srtsl18to29[] = { "srt018sl", "srt019sl", @@ -86,12 +89,15 @@ const char* LegoRaceCar::g_srtsl18to29[] = { }; // GLOBAL: LEGO1 0x100f0b48 +// GLOBAL: BETA10 0x101f5f58 const char* LegoRaceCar::g_srtsl6to10[] = {"srt006sl", "srt007sl", "srt008sl", "srt009sl", "srt010sl"}; // GLOBAL: LEGO1 0x100f0b5c +// GLOBAL: BETA10 0x101f5f6c const char* LegoRaceCar::g_emptySoundKeyList[] = {NULL}; // GLOBAL: LEGO1 0x100f0b60 +// GLOBAL: BETA10 0x101f5f70 const char* LegoRaceCar::g_srtrh[] = {"srt004rh", "srt005rh", "srt006rh"}; // GLOBAL: LEGO1 0x100f0b6c @@ -103,18 +109,23 @@ const char* LegoRaceCar::g_srt001ra = "srt001ra"; const char* LegoRaceCar::g_soundSkel3 = "skel3"; // GLOBAL: LEGO1 0x100f0b74 +// GLOBAL: BETA10 0x101f5f80 MxU32 LegoRaceCar::g_srtsl18to29Index = 0; // GLOBAL: LEGO1 0x100f0b78 +// GLOBAL: BETA10 0x101f5f84 MxU32 LegoRaceCar::g_srtsl6to10Index = 0; // GLOBAL: LEGO1 0x100f0b7c +// GLOBAL: BETA10 0x101f5f88 MxU32 LegoRaceCar::g_emptySoundKeyListIndex = 0; // GLOBAL: LEGO1 0x100f0b80 +// GLOBAL: BETA10 0x101f5f8c MxU32 LegoRaceCar::g_srtrhIndex = 0; // GLOBAL: LEGO1 0x100f0b84 +// GLOBAL: BETA10 0x101f5f90 MxLong LegoRaceCar::g_timeLastSoundPlayed = 0; // GLOBAL: LEGO1 0x100f0b88 @@ -127,18 +138,19 @@ MxBool LegoRaceCar::g_unk0x100f0b8c = TRUE; // Initialized at LEGO1 0x10012db0 // GLOBAL: LEGO1 0x10102af0 +// GLOBAL: BETA10 0x102114c0 Mx3DPointFloat LegoRaceCar::g_unk0x10102af0 = Mx3DPointFloat(0.0f, 2.0f, 0.0f); // FUNCTION: LEGO1 0x10012950 LegoRaceCar::LegoRaceCar() { m_userState = 0; - m_unk0x70 = 0; - m_unk0x74 = 0; + m_skelKick1Anim = 0; + m_skelKick2Anim = 0; m_unk0x5c.Clear(); m_unk0x58 = 0; - m_unk0x78 = 0; - m_unk0x7c = 0; + m_kick1B = 0; + m_kick2B = 0; NotificationManager()->Register(this); } @@ -155,6 +167,7 @@ MxLong LegoRaceCar::Notify(MxParam& p_param) } // FUNCTION: LEGO1 0x10012e60 +// FUNCTION: BETA10 0x100cb191 void LegoRaceCar::SetWorldSpeed(MxFloat p_worldSpeed) { if (!m_userNavFlag) { @@ -164,11 +177,12 @@ void LegoRaceCar::SetWorldSpeed(MxFloat p_worldSpeed) LegoAnimActor::SetWorldSpeed(p_worldSpeed); } else { - m_worldSpeed = p_worldSpeed; + LegoEntity::SetWorldSpeed(p_worldSpeed); } } // FUNCTION: LEGO1 0x10012ea0 +// FUNCTION: BETA10 0x100cb220 void LegoRaceCar::SetMaxLinearVelocity(float p_maxLinearVelocity) { if (p_maxLinearVelocity < 0) { @@ -182,6 +196,7 @@ void LegoRaceCar::SetMaxLinearVelocity(float p_maxLinearVelocity) } // FUNCTION: LEGO1 0x10012ef0 +// FUNCTION: BETA10 0x100cb2aa void LegoRaceCar::ParseAction(char* p_extra) { char buffer[256]; @@ -195,26 +210,36 @@ void LegoRaceCar::ParseAction(char* p_extra) } if (m_userNavFlag) { - for (MxU32 i = 0; i < m_animMaps.size(); i++) { + MxS32 i; + + for (i = 0; i < m_animMaps.size(); i++) { + // It appears that the implementation in BETA10 does not use this variable LegoAnimActorStruct* animMap = m_animMaps[i]; if (animMap->m_unk0x00 == -1.0f) { - m_unk0x70 = animMap; + m_skelKick1Anim = animMap; } else if (animMap->m_unk0x00 == -2.0f) { - m_unk0x74 = animMap; + m_skelKick2Anim = animMap; } } + assert(m_skelKick1Anim && m_skelKick2Anim); + // STRING: LEGO1 0x100f0bc4 const char* edge0344 = "EDG03_44"; - m_unk0x78 = currentWorld->FindPathBoundary(edge0344); + m_kick1B = currentWorld->FindPathBoundary(edge0344); + assert(m_kick1B); + // STRING: LEGO1 0x100f0bb8 const char* edge0354 = "EDG03_54"; - m_unk0x7c = currentWorld->FindPathBoundary(edge0354); + m_kick2B = currentWorld->FindPathBoundary(edge0354); + assert(m_kick2B); - for (MxS32 j = 0; j < sizeOfArray(g_edgeReferences); j++) { - g_edgeReferences[j].m_data = currentWorld->FindPathBoundary(g_edgeReferences[j].m_name); + for (i = 0; i < sizeOfArray(g_skBMap); i++) { + assert(g_skBMap[i].m_name); + g_skBMap[i].m_b = currentWorld->FindPathBoundary(g_skBMap[i].m_name); + assert(g_skBMap[i].m_b); } } } @@ -227,11 +252,11 @@ void LegoRaceCar::FUN_10012ff0(float p_param) float deltaTime; if (m_userState == LEGORACECAR_KICK1) { - a = m_unk0x70; + a = m_skelKick1Anim; } else { assert(m_userState == LEGORACECAR_KICK2); - a = m_unk0x74; + a = m_skelKick2Anim; } assert(a && a->GetAnimTreePtr() && a->GetAnimTreePtr()->GetCamAnim()); @@ -241,14 +266,14 @@ void LegoRaceCar::FUN_10012ff0(float p_param) if (a->GetDuration() <= deltaTime || deltaTime < 0.0) { if (m_userState == LEGORACECAR_KICK1) { - LegoEdge** edges = m_unk0x78->GetEdges(); + LegoEdge** edges = m_kick1B->GetEdges(); m_destEdge = (LegoUnknown100db7f4*) (edges[2]); - m_boundary = m_unk0x78; + m_boundary = m_kick1B; } else { - LegoEdge** edges = m_unk0x78->GetEdges(); + LegoEdge** edges = m_kick1B->GetEdges(); m_destEdge = (LegoUnknown100db7f4*) (edges[1]); - m_boundary = m_unk0x7c; + m_boundary = m_kick2B; } m_userState = LEGORACECAR_UNKNOWN_0; @@ -294,7 +319,7 @@ MxU32 LegoRaceCar::HandleSkeletonKicks(float p_param1) float skeletonCurAnimPhase = skeletonCurAnimPosition / skeletonCurAnimDuration; for (MxS32 i = 0; i < sizeOfArray(g_skeletonKickPhases); i++) { - if (m_boundary == current->m_edgeRef->m_data && current->m_lower <= skeletonCurAnimPhase && + if (m_boundary == current->m_edgeRef->m_b && current->m_lower <= skeletonCurAnimPhase && skeletonCurAnimPhase <= current->m_upper) { m_userState = current->m_userState; } @@ -451,14 +476,45 @@ MxResult LegoRaceCar::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) return SUCCESS; } -// STUB: LEGO1 0x10013600 +// FUNCTION: LEGO1 0x10013600 +// FUNCTION: BETA10 0x100cbe60 MxResult LegoRaceCar::VTable0x9c() { - // TODO - return SUCCESS; + MxResult result; + + if (m_userNavFlag) { + result = LegoCarRaceActor::VTable0x9c(); + + if (m_boundary) { + MxS32 bVar2 = 0; + + for (MxS32 i = 0; i < sizeOfArray(g_skBMap); i++) { + assert(g_skBMap[i].m_b); + if (m_boundary == g_skBMap[i].m_b) { + bVar2 = 1; + break; + } + } + + if (m_userState == LEGORACECAR_UNKNOWN_1) { + if (!bVar2) { + m_userState = LEGORACECAR_UNKNOWN_0; + } + } + else { + m_userState = LEGORACECAR_UNKNOWN_1; + } + } + } + else { + result = LegoCarRaceActor::VTable0x9c(); + } + + return result; } -// STUB: LEGO1 0x10014500 +// FUNCTION: LEGO1 0x10014500 +// FUNCTION: BETA10 0x100cd5e0 MxU32 LegoRaceCar::VTable0x6c( LegoPathBoundary* p_boundary, Vector3& p_v1, @@ -468,12 +524,12 @@ MxU32 LegoRaceCar::VTable0x6c( Vector3& p_v3 ) { - // TODO - return 0; + return LegoCarRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3); } -// STUB: LEGO1 0x10014560 +// FUNCTION: LEGO1 0x10014560 +// FUNCTION: BETA10 0x100cd660 void LegoRaceCar::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) { - // TODO + LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4); }