From 1132fd541fdad21b44a3f7a1882e7dbf39c47617 Mon Sep 17 00:00:00 2001 From: Fabian Neundorf Date: Fri, 13 Mar 2026 22:42:12 +0100 Subject: [PATCH] Clear unknowns in `LegoAct2` (#1746) --- LEGO1/lego/legoomni/include/legoact2.h | 16 +-- LEGO1/lego/legoomni/src/actors/act2actor.cpp | 4 +- .../legoomni/src/common/legoobjectfactory.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/legoact2.cpp | 102 +++++++++--------- 4 files changed, 62 insertions(+), 62 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoact2.h b/LEGO1/lego/legoomni/include/legoact2.h index d27f92d8..ae360f5a 100644 --- a/LEGO1/lego/legoomni/include/legoact2.h +++ b/LEGO1/lego/legoomni/include/legoact2.h @@ -77,19 +77,19 @@ class LegoAct2 : public LegoWorld { MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 - void SetUnknown0x1138(Act2Actor* p_unk0x1138) { m_unk0x1138 = p_unk0x1138; } + void SetAmbulanceActor(Act2Actor* p_ambulanceActor) { m_ambulanceActor = p_ambulanceActor; } void SetDestLocation(LegoGameState::Area p_destLocation) { m_destLocation = p_destLocation; } - MxResult CreateBrick(); - void FUN_100517b0(); + MxResult CreateDroppingBrick(); + void CreateBrick(); MxResult BadEnding(); MxResult StartAction( Act2mainScript::Script p_objectId, - MxBool p_param2, - MxBool p_param3, + MxBool p_isAnimation, + MxBool p_ignoreCurrentAction, Mx3DPointFloat* p_location, Mx3DPointFloat* p_direction, - Mx3DPointFloat* p_param6 + Mx3DPointFloat* p_up ); // SYNTHETIC: LEGO1 0x1004fe20 @@ -117,7 +117,7 @@ class LegoAct2 : public LegoWorld { MxLong HandleTransitionEnd(); MxLong HandlePathStruct(LegoPathStructNotificationParam& p_param); void PlayMusic(JukeboxScript::Script p_objectId); - void FUN_10051900(); + void DisableAnimations(); void HideMaPaInfo(); void InitBricks(); void UninitBricks(); @@ -145,7 +145,7 @@ class LegoAct2 : public LegoWorld { undefined4 m_unk0x112c; // 0x112c undefined4 m_unk0x1130; // 0x1130 undefined4 m_unk0x1134; // 0x1134 - Act2Actor* m_unk0x1138; // 0x1138 + Act2Actor* m_ambulanceActor; // 0x1138 undefined m_unk0x113c; // 0x113c Act2mainScript::Script m_currentAction; // 0x1140 Act2mainScript::Script m_infomanDirecting; // 0x1144 diff --git a/LEGO1/lego/legoomni/src/actors/act2actor.cpp b/LEGO1/lego/legoomni/src/actors/act2actor.cpp index 320b918b..721c4099 100644 --- a/LEGO1/lego/legoomni/src/actors/act2actor.cpp +++ b/LEGO1/lego/legoomni/src/actors/act2actor.cpp @@ -287,7 +287,7 @@ void Act2Actor::Animate(float p_time) } SetWorldSpeed(0.0f); - ((LegoAct2*) CurrentWorld())->FUN_100517b0(); + ((LegoAct2*) CurrentWorld())->CreateBrick(); return; } #endif @@ -355,7 +355,7 @@ void Act2Actor::Animate(float p_time) m_state = e_createdBrick; m_createBrickTime = p_time; - if (((LegoAct2*) CurrentWorld())->CreateBrick() == SUCCESS) { + if (((LegoAct2*) CurrentWorld())->CreateDroppingBrick() == SUCCESS) { PlayNextVoiceOver(VoiceOver::e_behind); } #ifndef BETA10 diff --git a/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp b/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp index b8514020..4f854b96 100644 --- a/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp +++ b/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp @@ -389,7 +389,7 @@ MxCore* LegoObjectFactory::Create(const char* p_name) } else if (m_idAct2Actor == atom) { Act2Actor* actor = new Act2Actor(); - ((LegoAct2*) CurrentWorld())->SetUnknown0x1138(actor); + ((LegoAct2*) CurrentWorld())->SetAmbulanceActor(actor); object = actor; } else if (m_idAct2Brick == atom) { diff --git a/LEGO1/lego/legoomni/src/worlds/legoact2.cpp b/LEGO1/lego/legoomni/src/worlds/legoact2.cpp index 3fe704c6..a3ea80e7 100644 --- a/LEGO1/lego/legoomni/src/worlds/legoact2.cpp +++ b/LEGO1/lego/legoomni/src/worlds/legoact2.cpp @@ -52,7 +52,7 @@ MxS32 g_animationsBricksterIsLoose[] = { const LegoChar* g_charactersBricksterIsLoose[] = {"bd", "pg", "rd", "sy", "ro", "cl"}; // GLOBAL: LEGO1 0x100f4428 -MxS32 g_unk0x100f4428[] = { +MxS32 g_animationsAfterChase[] = { Act2mainScript::c_snsx07pa_RunAnim, Act2mainScript::c_snsx12ni_RunAnim, Act2mainScript::c_snsx15la_RunAnim, @@ -68,7 +68,7 @@ MxS32 g_unk0x100f4428[] = { }; // GLOBAL: LEGO1 0x100f4458 -const LegoChar* g_unk0x100f4458[] = {"papa", "nick", "laura", "cl", "pg", "rd", "sy"}; +const LegoChar* g_charactersAfterChase[] = {"papa", "nick", "laura", "cl", "pg", "rd", "sy"}; // FUNCTION: LEGO1 0x1004fce0 // FUNCTION: BETA10 0x1003a5a0 @@ -82,7 +82,7 @@ LegoAct2::LegoAct2() m_unk0x1130 = 0; m_nextBrick = 0; m_removedBricks = 0; - m_unk0x1138 = NULL; + m_ambulanceActor = NULL; m_currentAction = (Act2mainScript::Script) 0; m_infomanDirecting = (Act2mainScript::Script) 0; m_destLocation = LegoGameState::e_undefined; @@ -100,7 +100,7 @@ LegoAct2::~LegoAct2() TickleManager()->UnregisterClient(this); } - FUN_10051900(); + DisableAnimations(); InputManager()->UnRegister(this); if (UserActor()) { Remove(UserActor()); @@ -246,7 +246,7 @@ MxResult LegoAct2::Tickle() else { m_state = LegoAct2::e_goingToHide; m_timeSinceLastStage = 0; - m_unk0x1138->GoingToHide(); + m_ambulanceActor->GoingToHide(); } } @@ -303,30 +303,30 @@ MxLong LegoAct2::Notify(MxParam& p_param) LegoEntity* entity = (LegoEntity*) param.GetSender(); - Mx3DPointFloat local20(entity->GetROI()->GetWorldPosition()); - Mx3DPointFloat locale8(m_pepper->GetWorldPosition()); - Mx3DPointFloat locala4(locale8); + Mx3DPointFloat pepperToBrick(entity->GetROI()->GetWorldPosition()); + Mx3DPointFloat pepperPosition(m_pepper->GetWorldPosition()); + Mx3DPointFloat position(pepperPosition); - local20 -= locale8; + pepperToBrick -= pepperPosition; MxMatrix local2world(m_pepper->GetLocal2World()); - Vector3 local30(local2world[0]); - Vector3 localac(local2world[1]); - Vector3 local28(local2world[2]); + Vector3 right(local2world[0]); + Vector3 up(local2world[1]); + Vector3 dir(local2world[2]); - local28 = local20; - local28.Unitize(); + dir = pepperToBrick; + dir.Unitize(); - Mx3DPointFloat local90(local28); - local90 *= 1.25f; - locala4 += local90; - locala4[1] += 0.25; - local30.EqualsCross(localac, local28); - local30.Unitize(); + Mx3DPointFloat positionOffset(dir); + positionOffset *= 1.25f; + position += positionOffset; + position[1] += 0.25; + right.EqualsCross(up, dir); + right.Unitize(); - Mx3DPointFloat locald4(local2world[2]); + Mx3DPointFloat direction(local2world[2]); Mx3DPointFloat localc0(local2world[1]); - StartAction(Act2mainScript::c_tns051in_RunAnim, TRUE, TRUE, &locala4, &locald4, NULL); + StartAction(Act2mainScript::c_tns051in_RunAnim, TRUE, TRUE, &position, &direction, NULL); m_state = LegoAct2::e_allPiecesCollected; m_timeSinceLastStage = 0; @@ -414,8 +414,8 @@ MxLong LegoAct2::HandleEndAction(MxEndActionNotificationParam& p_param) ((LegoPathActor*) m_pepper->GetEntity())->SetActorState(LegoPathActor::c_disabled); AnimationManager()->EnableCamAnims(TRUE); AnimationManager()->FUN_1005f6d0(TRUE); - AnimationManager()->FUN_100604f0(g_unk0x100f4428, sizeOfArray(g_unk0x100f4428)); - AnimationManager()->FUN_10060480(g_unk0x100f4458, sizeOfArray(g_unk0x100f4458)); + AnimationManager()->FUN_100604f0(g_animationsAfterChase, sizeOfArray(g_animationsAfterChase)); + AnimationManager()->FUN_10060480(g_charactersAfterChase, sizeOfArray(g_charactersAfterChase)); break; case LegoAct2::e_distributeRemainingBricks: { LegoROI* roi; @@ -452,7 +452,7 @@ MxLong LegoAct2::HandleEndAction(MxEndActionNotificationParam& p_param) m_bricks[i].Remove(); } - FUN_10051900(); + DisableAnimations(); m_destLocation = LegoGameState::e_copterbuild; TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); break; @@ -513,7 +513,7 @@ void LegoAct2::ReadyWorld() PlaceActor(actor, "EDG00_149", 0, 0.5f, 2, 0.5f); PlayMusic(JukeboxScript::c_Jail_Music); - FUN_10051900(); + DisableAnimations(); VideoManager()->Get3DManager()->SetFrustrum(90.0f, 0.1f, 250.f); m_gameState->m_enabled = TRUE; } @@ -573,7 +573,7 @@ void LegoAct2::Enable(MxBool p_enable) m_transformOnDisable = m_pepper->GetLocal2World(); m_boundaryOnDisable = ((LegoPathActor*) m_pepper->GetEntity())->GetBoundary(); - FUN_10051900(); + DisableAnimations(); BackgroundAudioManager()->Stop(); UninitBricks(); DeleteObjects(&m_atomId, Act2mainScript::c_VOhead0_PlayWav, Act2mainScript::c_VOhide_PlayWav); @@ -599,7 +599,7 @@ MxLong LegoAct2::HandlePathStruct(LegoPathStructNotificationParam& p_param) LegoPathActor* actor = (LegoPathActor*) m_pepper->GetEntity(); actor->SetActorState(LegoPathActor::c_disabled); actor->SetWorldSpeed(0.0f); - FUN_10051900(); + DisableAnimations(); if (m_timeSinceLastStage < 90000) { StartAction(Act2mainScript::c_tra031ni_RunAnim, TRUE, TRUE, NULL, NULL, NULL); @@ -631,7 +631,7 @@ MxLong LegoAct2::HandlePathStruct(LegoPathStructNotificationParam& p_param) m_currentAction = Act2mainScript::c_VOhide_PlayWav; } - m_unk0x1138->Hide(); + m_ambulanceActor->Hide(); m_state = LegoAct2::e_hidden; m_timeSinceLastStage = 0; @@ -644,7 +644,7 @@ MxLong LegoAct2::HandlePathStruct(LegoPathStructNotificationParam& p_param) MxMatrix local2world = m_ambulance->GetLocal2World(); MxMatrix local2world2 = local2world; - LegoPathBoundary* boundary = m_unk0x1138->GetBoundary(); + LegoPathBoundary* boundary = m_ambulanceActor->GetBoundary(); local2world[3][1] += 1.5; local2world2[3][1] -= 0.1; @@ -656,7 +656,7 @@ MxLong LegoAct2::HandlePathStruct(LegoPathStructNotificationParam& p_param) // FUNCTION: LEGO1 0x100516b0 // FUNCTION: BETA10 0x1003bcbc -MxResult LegoAct2::CreateBrick() +MxResult LegoAct2::CreateDroppingBrick() { if (m_nextBrick > 4) { return FAILURE; @@ -668,7 +668,7 @@ MxResult LegoAct2::CreateBrick() MxMatrix local2world = m_ambulance->GetLocal2World(); MxMatrix local2world2 = local2world; - LegoPathBoundary* boundary = m_unk0x1138->GetBoundary(); + LegoPathBoundary* boundary = m_ambulanceActor->GetBoundary(); local2world[3][1] += 1.3; local2world2[3][1] -= 0.1; @@ -680,7 +680,7 @@ MxResult LegoAct2::CreateBrick() } // FUNCTION: LEGO1 0x100517b0 -void LegoAct2::FUN_100517b0() +void LegoAct2::CreateBrick() { Act2Brick& brick = m_bricks[m_nextBrick]; brick.Create(m_nextBrick); @@ -708,7 +708,7 @@ void LegoAct2::PlayMusic(JukeboxScript::Script p_objectId) // FUNCTION: LEGO1 0x10051900 // FUNCTION: BETA10 0x1003bed1 -void LegoAct2::FUN_10051900() +void LegoAct2::DisableAnimations() { if (AnimationManager()) { AnimationManager()->Suspend(); @@ -931,7 +931,7 @@ MxResult LegoAct2::BadEnding() m_bricks[i].Remove(); } - LegoPathActor* actor = m_unk0x1138; + LegoPathActor* actor = m_ambulanceActor; actor->SetActorState(LegoPathActor::c_disabled); m_gameState->SetState(LegoAct2State::c_badEnding); @@ -1095,7 +1095,7 @@ MxResult LegoAct2::StartAction( MxBool p_ignoreCurrentAction, Mx3DPointFloat* p_location, Mx3DPointFloat* p_direction, - Mx3DPointFloat* p_param6 + Mx3DPointFloat* p_up ) { if (m_currentAction == (Act2mainScript::Script) 0 || p_ignoreCurrentAction) { @@ -1139,19 +1139,19 @@ MxResult LegoAct2::StartAction( oneVectorNotNull = TRUE; } - if (p_param6) { - matrix[1][0] = (*p_param6)[0]; - matrix[1][1] = (*p_param6)[1]; - matrix[1][2] = (*p_param6)[2]; + if (p_up) { + matrix[1][0] = (*p_up)[0]; + matrix[1][1] = (*p_up)[1]; + matrix[1][2] = (*p_up)[2]; oneVectorNotNull = TRUE; } - Vector3 firstColumn(matrix[0]); - Vector3 secondColumn(matrix[1]); - Vector3 thirdColumn(matrix[2]); + Vector3 right(matrix[0]); + Vector3 up(matrix[1]); + Vector3 dir(matrix[2]); - firstColumn.EqualsCross(secondColumn, thirdColumn); - firstColumn.Unitize(); + right.EqualsCross(up, dir); + right.Unitize(); MxMatrix* pmatrix = NULL; @@ -1201,28 +1201,28 @@ MxResult LegoAct2::StartAction( // FUNCTION: BETA10 0x10014aa8 MxResult LegoAct2::InitializeShooting() { - LegoPathActor* actor = m_unk0x1138; + LegoPathActor* actor = m_ambulanceActor; LegoLocomotionAnimPresenter* ap; PlaceActor(actor, "EDG01_27", 2, 0.5f, 0, 0.5f); ap = (LegoLocomotionAnimPresenter*) Find("LegoAnimPresenter", "Ambul_Anim0"); assert(ap); - ap->CreateROIAndBuildMap(m_unk0x1138, 0.0f); + ap->CreateROIAndBuildMap(m_ambulanceActor, 0.0f); ap = (LegoLocomotionAnimPresenter*) Find("LegoAnimPresenter", "Ambul_Anim2"); assert(ap); - ap->CreateROIAndBuildMap(m_unk0x1138, 6.0f); + ap->CreateROIAndBuildMap(m_ambulanceActor, 6.0f); ap = (LegoLocomotionAnimPresenter*) Find("LegoAnimPresenter", "Ambul_Anim3"); assert(ap); - ap->CreateROIAndBuildMap(m_unk0x1138, 3.0f); + ap->CreateROIAndBuildMap(m_ambulanceActor, 3.0f); ap = (LegoLocomotionAnimPresenter*) Find("LegoAnimPresenter", "BrShoot"); assert(ap); - ap->CreateROIAndBuildMap(m_unk0x1138, -1.0f); + ap->CreateROIAndBuildMap(m_ambulanceActor, -1.0f); actor->SetWorldSpeed(0.0f); - m_unk0x1138->InitializeNextShot(); + m_ambulanceActor->InitializeNextShot(); return SUCCESS; }