From 3b3fe276c4c48fb051678e8b3968b45896501328 Mon Sep 17 00:00:00 2001 From: Fabian Neundorf Date: Wed, 11 Jun 2025 23:29:23 +0200 Subject: [PATCH 1/4] Clear unknowns in `LegoPhoneme` (#1556) --- LEGO1/lego/legoomni/include/legophoneme.h | 30 +++++++++---------- .../lego/legoomni/src/common/legophoneme.cpp | 30 +++++++++---------- .../src/video/legophonemepresenter.cpp | 14 ++++----- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legophoneme.h b/LEGO1/lego/legoomni/include/legophoneme.h index f88595d9..88f85e01 100644 --- a/LEGO1/lego/legoomni/include/legophoneme.h +++ b/LEGO1/lego/legoomni/include/legophoneme.h @@ -10,32 +10,32 @@ class LegoTextureInfo; // SIZE 0x20 class LegoPhoneme { public: - LegoPhoneme(const char* p_name, undefined4 p_unk0x14) + LegoPhoneme(const char* p_name, MxU32 p_count) { m_name = p_name; m_name.ToUpperCase(); Init(); - m_unk0x14 = p_unk0x14; + m_count = p_count; } ~LegoPhoneme(); - virtual undefined4 VTable0x00(); // vtable+0x00 - virtual void VTable0x04(undefined4 p_unk0x14); // vtable+0x04 - virtual LegoTextureInfo* VTable0x08(); // vtable+0x08 - virtual void VTable0x0c(LegoTextureInfo* p_unk0x18); // vtable+0x0c - virtual LegoTextureInfo* VTable0x10(); // vtable+0x10 - virtual void VTable0x14(LegoTextureInfo* p_unk0x1c); // vtable+0x14 - virtual void VTable0x18(); // vtable+0x18 - virtual void Init(); // vtable+0x1c - virtual void VTable0x20(undefined4); // vtable+0x20 + virtual MxU32 GetCount(); // vtable+0x00 + virtual void SetCount(MxU32 p_count); // vtable+0x04 + virtual LegoTextureInfo* GetTextureInfo(); // vtable+0x08 + virtual void SetTextureInfo(LegoTextureInfo* p_textureInfo); // vtable+0x0c + virtual LegoTextureInfo* GetCachedTextureInfo(); // vtable+0x10 + virtual void SetCachedTextureInfo(LegoTextureInfo* p_cachedTextureInfo); // vtable+0x14 + virtual void VTable0x18(); // vtable+0x18 + virtual void Init(); // vtable+0x1c + virtual void VTable0x20(undefined4); // vtable+0x20 MxString& GetName() { return m_name; } private: - MxString m_name; // 0x04 - undefined4 m_unk0x14; // 0x14 - LegoTextureInfo* m_unk0x18; // 0x18 - LegoTextureInfo* m_unk0x1c; // 0x1c + MxString m_name; // 0x04 + MxU32 m_count; // 0x14 + LegoTextureInfo* m_textureInfo; // 0x18 + LegoTextureInfo* m_cachedTextureInfo; // 0x1c }; #endif // LEGOPHONEME_H diff --git a/LEGO1/lego/legoomni/src/common/legophoneme.cpp b/LEGO1/lego/legoomni/src/common/legophoneme.cpp index 55da20c9..9f64e043 100644 --- a/LEGO1/lego/legoomni/src/common/legophoneme.cpp +++ b/LEGO1/lego/legoomni/src/common/legophoneme.cpp @@ -8,39 +8,39 @@ LegoPhoneme::~LegoPhoneme() } // FUNCTION: LEGO1 0x10044eb0 -undefined4 LegoPhoneme::VTable0x00() +MxU32 LegoPhoneme::GetCount() { - return m_unk0x14; + return m_count; } // FUNCTION: LEGO1 0x10044ec0 -void LegoPhoneme::VTable0x04(undefined4 p_unk0x14) +void LegoPhoneme::SetCount(MxU32 p_count) { - m_unk0x14 = p_unk0x14; + m_count = p_count; } // FUNCTION: LEGO1 0x10044ed0 -LegoTextureInfo* LegoPhoneme::VTable0x08() +LegoTextureInfo* LegoPhoneme::GetTextureInfo() { - return m_unk0x18; + return m_textureInfo; } // FUNCTION: LEGO1 0x10044ee0 -void LegoPhoneme::VTable0x0c(LegoTextureInfo* p_unk0x18) +void LegoPhoneme::SetTextureInfo(LegoTextureInfo* p_textureInfo) { - m_unk0x18 = p_unk0x18; + m_textureInfo = p_textureInfo; } // FUNCTION: LEGO1 0x10044ef0 -LegoTextureInfo* LegoPhoneme::VTable0x10() +LegoTextureInfo* LegoPhoneme::GetCachedTextureInfo() { - return m_unk0x1c; + return m_cachedTextureInfo; } // FUNCTION: LEGO1 0x10044f00 -void LegoPhoneme::VTable0x14(LegoTextureInfo* p_unk0x1c) +void LegoPhoneme::SetCachedTextureInfo(LegoTextureInfo* p_cachedTextureInfo) { - m_unk0x1c = p_unk0x1c; + m_cachedTextureInfo = p_cachedTextureInfo; } // FUNCTION: LEGO1 0x10044f10 @@ -51,9 +51,9 @@ void LegoPhoneme::VTable0x18() // FUNCTION: LEGO1 0x10044f20 void LegoPhoneme::Init() { - m_unk0x14 = 0; - m_unk0x18 = NULL; - m_unk0x1c = NULL; + m_count = 0; + m_textureInfo = NULL; + m_cachedTextureInfo = NULL; } // FUNCTION: LEGO1 0x10044f30 diff --git a/LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp b/LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp index 1a015344..3e931ce6 100644 --- a/LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp @@ -68,8 +68,8 @@ void LegoPhonemePresenter::StartingTickle() CharacterManager()->SetHeadTexture(entityROI, textureInfo); - phoneme->VTable0x0c(m_textureInfo); - phoneme->VTable0x14(textureInfo); + phoneme->SetTextureInfo(m_textureInfo); + phoneme->SetCachedTextureInfo(textureInfo); phonemeList->Append(phoneme); m_textureInfo = textureInfo; } @@ -78,7 +78,7 @@ void LegoPhonemePresenter::StartingTickle() cursor.Current(phoneme); delete newPhoneme; - phoneme->VTable0x04(phoneme->VTable0x00() + 1); + phoneme->SetCount(phoneme->GetCount() + 1); cursor.SetValue(phoneme); m_unk0x70 = TRUE; @@ -136,7 +136,7 @@ void LegoPhonemePresenter::EndAction() cursor.Current(phoneme); delete newPhoneme; - if (phoneme->VTable0x00() == 1) { + if (phoneme->GetCount() == 1) { LegoROI* roi; if (m_unk0x84) { @@ -154,12 +154,12 @@ void LegoPhonemePresenter::EndAction() CharacterManager()->ReleaseActor(m_roiName.GetData()); } - TextureContainer()->EraseCached(phoneme->VTable0x10()); - TextureContainer()->EraseCached(phoneme->VTable0x08()); + TextureContainer()->EraseCached(phoneme->GetCachedTextureInfo()); + TextureContainer()->EraseCached(phoneme->GetTextureInfo()); cursor.Destroy(); } else { - phoneme->VTable0x04(phoneme->VTable0x00() - 1); + phoneme->SetCount(phoneme->GetCount() - 1); cursor.SetValue(phoneme); } From 9aa8dbfc467d65b953315776788a61073bcc1b4e Mon Sep 17 00:00:00 2001 From: MasterTimeThief Date: Wed, 11 Jun 2025 17:37:50 -0400 Subject: [PATCH 2/4] Clear unknowns in 'LegoCarBuild' and 'LegoCarBuildPresenter' (#1542) * Renamed variables and functions related to the Car Build sections * Car Build variable renaming - fixed issues and added enum `ShelfState` * Fixed some spacing in `legocarbuildpresenter.h` * Fixed tab spacing * Changed `m_shelfState` back to `MxU16` * Cleared up `InitBuildPlatform` * Fixed comments --- LEGO1/lego/legoomni/include/legocarbuild.h | 6 +- .../legoomni/include/legocarbuildpresenter.h | 39 +++--- .../lego/legoomni/src/build/legocarbuild.cpp | 80 +++++------ .../src/build/legocarbuildpresenter.cpp | 126 +++++++++--------- 4 files changed, 131 insertions(+), 120 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocarbuild.h b/LEGO1/lego/legoomni/include/legocarbuild.h index bf2a0a76..f13f0450 100644 --- a/LEGO1/lego/legoomni/include/legocarbuild.h +++ b/LEGO1/lego/legoomni/include/legocarbuild.h @@ -161,7 +161,7 @@ public: MxS32 FUN_10025ee0(undefined4 p_param1); // FUNCTION: BETA10 0x100735b0 - void SetUnknown0x258(LegoCarBuildAnimPresenter* p_unk0x258) { m_unk0x258 = p_unk0x258; } + void SetCarBuildAnimPresenter(LegoCarBuildAnimPresenter* p_animPresenter) { m_animPresenter = p_animPresenter; } // SYNTHETIC: LEGO1 0x10022a60 // LegoCarBuild::`scalar deleting destructor' @@ -193,8 +193,8 @@ private: // This is likely a location in pixel space MxS32 m_unk0x250[2]; // 0x250 - LegoCarBuildAnimPresenter* m_unk0x258; // 0x258 - MxQuaternionTransformer m_unk0x25c; // 0x25c + LegoCarBuildAnimPresenter* m_animPresenter; // 0x258 + MxQuaternionTransformer m_unk0x25c; // 0x25c // These two are likely locations in pixel space MxS32 m_unk0x290[2]; // 0x290 diff --git a/LEGO1/lego/legoomni/include/legocarbuildpresenter.h b/LEGO1/lego/legoomni/include/legocarbuildpresenter.h index f09515bf..a13c1adf 100644 --- a/LEGO1/lego/legoomni/include/legocarbuildpresenter.h +++ b/LEGO1/lego/legoomni/include/legocarbuildpresenter.h @@ -13,6 +13,13 @@ public: c_bit1 = 0x01 }; + enum ShelfState { + e_undefined = -1, + e_selected = 0, + e_stopped = 1, + e_moving = 2 + }; + // SIZE 0x0c struct UnknownListEntry { // FUNCTION: LEGO1 0x100795c0 @@ -69,7 +76,7 @@ public: void FUN_10079050(MxS16 p_index); void SwapNodesByName(LegoChar* p_param1, LegoChar* p_param2); - void FUN_10079160(); + void InitBuildPlatform(); void FUN_100795d0(LegoChar* p_param); void FUN_10079680(LegoChar* p_param); LegoAnimNodeData* FindNodeDataByName(LegoTreeNode* p_treeNode, const LegoChar* p_name); @@ -78,7 +85,7 @@ public: void RotateAroundYAxis(MxFloat p_angle); MxBool FUN_10079c30(const LegoChar* p_name); MxBool PartIsPlaced(const LegoChar* p_name); - void FUN_10079a90(); + void MoveShelfForward(); MxBool StringEqualsPlatform(const LegoChar* p_string); MxBool StringEqualsShelf(const LegoChar* p_string); MxBool StringEndsOnY(const LegoChar* p_string); @@ -87,10 +94,10 @@ public: void SetPartObjectIdByName(const LegoChar* p_name, MxS16 p_objectId); // FUNCTION: BETA10 0x10070180 - void SetUnknown0xbc(undefined2 p_unk0xbc) { m_unk0xbc = p_unk0xbc; } + void SetShelfState(MxU16 p_shelfState) { m_shelfState = p_shelfState; } // FUNCTION: BETA10 0x100703b0 - Matrix4& GetUnknown0xe0() { return m_unk0xe0; } + Matrix4& GetBuildViewMatrix() { return m_buildViewMatrix; } MxBool StringEndsOnW(LegoChar* p_param); MxBool StringEndsOnYOrN(const LegoChar* p_string); @@ -116,7 +123,7 @@ public: private: void Beta10Inline0x100733d0(); - MxU16 m_unk0xbc; // 0xbc + MxU16 m_shelfState; // 0xbc // variable name verified by BETA10 0x1007184f MxS16 m_numberOfParts; // 0xbe @@ -124,21 +131,21 @@ private: // name derived from LegoVehicleBuildState, field 0x4f MxS16 m_placedPartCount; // 0xc0 - LegoAnimNodeData* m_unk0xc4; // 0xc4 - LegoAnim m_unk0xc8; // 0xc8 - MxMatrix m_unk0xe0; // 0xe0 + LegoAnimNodeData* m_platformAnimNodeData; // 0xc4 + LegoAnim m_platformAnim; // 0xc8 + MxMatrix m_buildViewMatrix; // 0xe0 // variable name verified by BETA10 0x100719f0 UnknownListEntry* m_parts; // 0x128 - MxFloat m_unk0x12c; // 0x12c - MxFloat m_unk0x130; // 0x130 - MxFloat m_unk0x134; // 0x134 - MxFloat m_unk0x138; // 0x138 - MxULong m_unk0x13c; // 0x13c - LegoEntity* m_unk0x140; // 0x140 - MxS32 m_unk0x144; // 0x144 - MxS32 m_unk0x148; // 0x148 + MxFloat m_shelfFrameBuffer; // 0x12c + MxFloat m_shelfFrame; // 0x130 + MxFloat m_shelfFrameMax; // 0x134 + MxFloat m_shelfFrameInterval; // 0x138 + MxULong m_unk0x13c; // 0x13c + LegoEntity* m_carBuildEntity; // 0x140 + MxS32 m_unk0x144; // 0x144 + MxS32 m_unk0x148; // 0x148 // name verified by BETA10 0x10070d63 LegoChar* m_mainSourceId; // 0x14c diff --git a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp index 11a7ef0a..c56914dc 100644 --- a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp +++ b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp @@ -96,7 +96,7 @@ LegoCarBuild::LegoCarBuild() m_unk0x110 = 0; m_unk0xf8 = c_unknownminusone; m_unk0x2d4 = FALSE; - m_unk0x258 = 0; + m_animPresenter = NULL; m_ColorBook_Bitmap = NULL; m_Yellow_Ctl = NULL; m_Red_Ctl = NULL; @@ -137,10 +137,10 @@ LegoCarBuild::~LegoCarBuild() m_unk0x100 = 0; m_unk0x110 = NULL; - if (m_unk0x258) { - m_unk0x258->SetUnknown0xbc(0); - m_unk0x258->SetTickleState(MxPresenter::e_idle); - m_unk0x258 = NULL; + if (m_animPresenter) { + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected); + m_animPresenter->SetTickleState(MxPresenter::e_idle); + m_animPresenter = NULL; } ControlManager()->Unregister(this); @@ -290,7 +290,7 @@ void LegoCarBuild::FUN_10022f00() { if (m_unk0x110) { VTable0x6c(); - m_unk0x258->SetUnknown0xbc(0); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected); m_unk0x100 = 5; } } @@ -303,13 +303,13 @@ void LegoCarBuild::FUN_10022f30() FUN_10024f70(FALSE); FUN_100250e0(FALSE); - if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { + if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) { m_PlaceBrick_Sound->Enable(FALSE); m_PlaceBrick_Sound->Enable(TRUE); } - m_unk0x258->SetUnknown0xbc(1); - m_unk0x258->PutFrame(); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped); + m_animPresenter->PutFrame(); m_unk0x110 = NULL; m_unk0x100 = 0; } @@ -480,12 +480,12 @@ void LegoCarBuild::FUN_100236d0() FUN_10024f70(FALSE); FUN_100250e0(FALSE); - m_unk0x258->FUN_10079790(m_unk0x110->GetName()); - m_unk0x258->SetUnknown0xbc(1); + m_animPresenter->FUN_10079790(m_unk0x110->GetName()); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped); m_unk0x110 = NULL; m_unk0x100 = 0; - if (m_unk0x258->AllPartsPlaced()) { + if (m_animPresenter->AllPartsPlaced()) { // Note the code duplication with LEGO1 0x10025ee0 switch (m_carId) { case 1: @@ -542,7 +542,7 @@ MxResult LegoCarBuild::Tickle() } if (m_unk0x110) { - if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { + if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) { FUN_10022f30(); } } @@ -824,7 +824,7 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y) LegoROI* roi = PickROI(p_x, p_y); - if (!roi || !m_unk0x258->StringEndsOnYOrN(roi->GetName())) { + if (!roi || !m_animPresenter->StringEndsOnYOrN(roi->GetName())) { return 0; } @@ -835,7 +835,7 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y) FUN_100250e0(TRUE); } - if (m_unk0x100 == 5 && m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { + if (m_unk0x100 == 5 && m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) { m_unk0x2d4 = TRUE; } else { @@ -844,7 +844,7 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y) FUN_10025450(); VTable0x70(); - if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { + if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) { if (m_unk0x100 != 5) { m_unk0x250[0] += m_unk0x290[0] - m_unk0x298[0]; m_unk0x250[1] += m_unk0x290[1] - m_unk0x298[1]; @@ -855,8 +855,8 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y) } } else { - if (m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) { - m_unk0x114 = m_unk0x258->FUN_10079e20(); + if (m_animPresenter->FUN_10079c30(m_unk0x110->GetName())) { + m_unk0x114 = m_animPresenter->FUN_10079e20(); } } @@ -872,7 +872,7 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y) m_GetBrick_Sound->Enable(FALSE); m_GetBrick_Sound->Enable(TRUE); - m_unk0x258->SetUnknown0xbc(0); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected); return 1; } @@ -892,7 +892,7 @@ undefined4 LegoCarBuild::FUN_100246e0(MxLong p_x, MxLong p_y) result = 1; break; case 6: - if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName()) && + if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName()) && SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) { FUN_10024f70(FALSE); FUN_100250e0(FALSE); @@ -900,9 +900,9 @@ undefined4 LegoCarBuild::FUN_100246e0(MxLong p_x, MxLong p_y) m_unk0x110 = NULL; m_PlaceBrick_Sound->Enable(FALSE); m_PlaceBrick_Sound->Enable(TRUE); - m_unk0x258->SetUnknown0xbc(1); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped); } - else if (m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) { + else if (m_animPresenter->FUN_10079c30(m_unk0x110->GetName())) { if (SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) { m_PlaceBrick_Sound->Enable(FALSE); m_PlaceBrick_Sound->Enable(TRUE); @@ -965,7 +965,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param) DeleteObjects(&m_atomId, 500, 510); } - m_unk0x258->SetUnknown0xbc(0); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected); m_destLocation = LegoGameState::e_infomain; TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); result = 1; @@ -979,12 +979,12 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param) DeleteObjects(&m_atomId, 500, 510); } - m_unk0x258->SetUnknown0xbc(0); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected); if (GameState()->GetCurrentAct() == LegoGameState::e_act2) { FUN_100243a0(); } - else if (m_unk0x258->AllPartsPlaced() || m_buildState->m_unk0x4d) { + else if (m_animPresenter->AllPartsPlaced() || m_buildState->m_unk0x4d) { m_buildState->m_unk0x4d = TRUE; InvokeAction(Extra::e_start, m_atomId, m_carId, NULL); @@ -1021,7 +1021,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param) (m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) { - m_unk0x258->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId); + m_animPresenter->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId); m_Decal_Sound->Enable(FALSE); m_Decal_Sound->Enable(TRUE); } @@ -1054,16 +1054,16 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param) if (param->m_unk0x28) { switch (param->m_clickedObjectId) { case CopterScript::c_Info_Ctl: - m_unk0x258->SetUnknown0xbc(0); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected); m_destLocation = LegoGameState::e_infomain; TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); result = 1; break; case CopterScript::c_Exit_Ctl: if (m_buildState->m_animationState != LegoVehicleBuildState::e_exiting) { - m_unk0x258->SetUnknown0xbc(0); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected); - if (m_unk0x258->AllPartsPlaced() || m_buildState->m_unk0x4d) { + if (m_animPresenter->AllPartsPlaced() || m_buildState->m_unk0x4d) { m_buildState->m_unk0x4d = TRUE; // GameState()->GetCurrentAct() returns an MxS16 in BETA10 @@ -1125,7 +1125,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param) (m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) { - m_unk0x258->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId); + m_animPresenter->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId); m_Decal_Sound->Enable(FALSE); m_Decal_Sound->Enable(TRUE); } @@ -1202,7 +1202,7 @@ undefined4 LegoCarBuild::FUN_10024c20(MxNotificationParam* p_param) assert(destWorld); m_buildState->m_animationState = LegoVehicleBuildState::e_exiting; - if (!m_unk0x258->AllPartsPlaced()) { + if (!m_animPresenter->AllPartsPlaced()) { FUN_100243a0(); } else { @@ -1261,7 +1261,7 @@ void LegoCarBuild::FUN_10024ef0() void LegoCarBuild::FUN_10024f30() { FUN_10022f30(); - m_unk0x258->SetUnknown0xbc(2); + m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_moving); } // FUNCTION: LEGO1 0x10024f50 @@ -1269,14 +1269,14 @@ void LegoCarBuild::FUN_10024f30() void LegoCarBuild::FUN_10024f50() { m_unk0x2d4 = FALSE; - m_unk0x258->RotateAroundYAxis(g_rotationAngleStepYAxis); + m_animPresenter->RotateAroundYAxis(g_rotationAngleStepYAxis); } // FUNCTION: LEGO1 0x10024f70 // FUNCTION: BETA10 0x1006e002 void LegoCarBuild::FUN_10024f70(MxBool p_enabled) { - if (m_unk0x258->StringEndsOnY(m_unk0x110->GetName())) { + if (m_animPresenter->StringEndsOnY(m_unk0x110->GetName())) { SetPresentersEnabled(p_enabled); } } @@ -1311,7 +1311,7 @@ void LegoCarBuild::TogglePresentersEnabled() // FUNCTION: BETA10 0x1006e124 void LegoCarBuild::FUN_100250e0(MxBool p_enabled) { - if (m_unk0x258->StringDoesNotEndOnZero(m_unk0x110->GetName()) && m_Decals_Ctl) { + if (m_animPresenter->StringDoesNotEndOnZero(m_unk0x110->GetName()) && m_Decals_Ctl) { if (strnicmp(m_unk0x110->GetName(), "JSFRNT", strlen("JSFRNT")) == 0) { m_Decal_Bitmap->Enable(p_enabled); m_Decals_Ctl->Enable(p_enabled); @@ -1392,7 +1392,7 @@ void LegoCarBuild::FUN_10025450() m_unk0x1c0 = m_unk0x12c; Vector3 lastColumnOfUnk0x1c0(m_unk0x1c0[3]); - lastColumnOfUnk0x1c0 = Vector3(m_unk0x258->GetUnknown0xe0()[3]); + lastColumnOfUnk0x1c0 = Vector3(m_animPresenter->GetBuildViewMatrix()[3]); // This looks odd, but it improves the LEGO1 match while breaking the BETA10 match. // I don't know whether this is due to compiler entropy. @@ -1401,7 +1401,7 @@ void LegoCarBuild::FUN_10025450() MxMatrix* unk0x178 = &m_unk0x178; *unk0x178 = m_unk0x12c; - if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { + if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) { m_unk0x2a4 = Vector4(m_unk0x110->GetWorldPosition()); if (!m_unk0x2d4) { @@ -1418,11 +1418,11 @@ void LegoCarBuild::FUN_10025450() else { const LegoChar* wiredName; - if (!m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) { - wiredName = m_unk0x258->GetWiredNameByPartName(m_unk0x110->GetName()); + if (!m_animPresenter->FUN_10079c30(m_unk0x110->GetName())) { + wiredName = m_animPresenter->GetWiredNameByPartName(m_unk0x110->GetName()); } else { - wiredName = m_unk0x258->GetWiredNameOfLastPlacedPart(); + wiredName = m_animPresenter->GetWiredNameOfLastPlacedPart(); } LegoROI* parentROI = (LegoROI*) m_unk0x110->GetParentROI(); diff --git a/LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp b/LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp index 4a559c2c..2dd76641 100644 --- a/LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp +++ b/LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp @@ -23,17 +23,17 @@ DECOMP_SIZE_ASSERT(LegoCarBuildAnimPresenter, 0x150) // FUNCTION: BETA10 0x100707c0 LegoCarBuildAnimPresenter::LegoCarBuildAnimPresenter() { - m_unk0xbc = 0; + m_shelfState = e_selected; m_numberOfParts = 0; m_placedPartCount = 0; m_parts = NULL; - m_unk0xc4 = NULL; - m_unk0x130 = 0; - m_unk0x12c = 0; - m_unk0x134 = 0; - m_unk0x138 = 0; + m_platformAnimNodeData = NULL; + m_shelfFrame = 0; + m_shelfFrameBuffer = 0; + m_shelfFrameMax = 0; + m_shelfFrameInterval = 0; m_unk0x13c = 0; - m_unk0x140 = NULL; + m_carBuildEntity = NULL; m_unk0x144 = -1; m_unk0x148 = -1; m_mainSourceId = NULL; @@ -51,8 +51,8 @@ LegoCarBuildAnimPresenter::~LegoCarBuildAnimPresenter() delete[] m_parts; } - m_unk0xc8.GetRoot()->SetNumChildren(0); - *m_unk0xc8.GetRoot()->GetChildren() = NULL; + m_platformAnim.GetRoot()->SetNumChildren(0); + *m_platformAnim.GetRoot()->GetChildren() = NULL; if (m_mainSourceId) { delete[] m_mainSourceId; @@ -114,14 +114,14 @@ inline void LegoCarBuildAnimPresenter::Beta10Inline0x100733d0() // FUNCTION: BETA10 0x10070ab1 void LegoCarBuildAnimPresenter::PutFrame() { - switch (m_unk0xbc) { - case 0: + switch (m_shelfState) { + case e_selected: break; - case 2: - FUN_10079a90(); - case 1: - if (m_unk0x140->GetROI()) { - FUN_1006b9a0(m_anim, m_unk0x12c, NULL); + case e_moving: + MoveShelfForward(); + case e_stopped: + if (m_carBuildEntity->GetROI()) { + FUN_1006b9a0(m_anim, m_shelfFrameBuffer, NULL); } default: break; @@ -150,24 +150,24 @@ void LegoCarBuildAnimPresenter::ReadyTickle() #endif } - m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Dunebld"); + m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Dunebld"); - if (!m_unk0x140) { - m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Chptrbld"); + if (!m_carBuildEntity) { + m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Chptrbld"); } - if (!m_unk0x140) { - m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Jetbld"); + if (!m_carBuildEntity) { + m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Jetbld"); } - if (!m_unk0x140) { - m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "bldrace"); + if (!m_carBuildEntity) { + m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "bldrace"); } - if (m_unk0x140) { - ((LegoCarBuild*) m_currentWorld)->SetUnknown0x258(this); + if (m_carBuildEntity) { + ((LegoCarBuild*) m_currentWorld)->SetCarBuildAnimPresenter(this); m_placedPartCount = ((LegoCarBuild*) m_currentWorld)->GetPlacedPartCount(); - SetUnknown0xbc(1); + SetShelfState(e_stopped); m_previousTickleStates |= 1 << m_currentTickleState; m_currentTickleState = e_starting; m_compositePresenter->SendToCompositePresenter(Lego()); @@ -182,7 +182,7 @@ void LegoCarBuildAnimPresenter::ReadyTickle() // FUNCTION: BETA10 0x10070cdd void LegoCarBuildAnimPresenter::StreamingTickle() { - if (!m_unk0x140->GetROI()) { + if (!m_carBuildEntity->GetROI()) { return; } @@ -192,7 +192,7 @@ void LegoCarBuildAnimPresenter::StreamingTickle() strcpy(m_mainSourceId, m_action->GetAtomId().GetInternal()); m_mainSourceId[strlen(m_mainSourceId) - 1] = 'M'; - FUN_10079160(); + InitBuildPlatform(); if (GameState()->GetCurrentAct() == LegoGameState::e_act2) { m_placedPartCount = 10; @@ -232,7 +232,7 @@ void LegoCarBuildAnimPresenter::StreamingTickle() Lego3DView* lego3dview = videoManager->Get3DManager()->GetLego3DView(); LegoROI* videoManagerROI = videoManager->GetViewROI(); - LegoROI* local60 = m_unk0x140->GetROI(); + LegoROI* local60 = m_carBuildEntity->GetROI(); LegoROI* camera = NULL; MxFloat fov; @@ -271,7 +271,7 @@ void LegoCarBuildAnimPresenter::StreamingTickle() lego3dview->Moved(*videoManagerROI); videoManager->Get3DManager()->SetFrustrum(fov, 0.1, 250.0); - m_unk0xe0 = local60->FindChildROI("VIEW", local60)->GetLocal2World(); + m_buildViewMatrix = local60->FindChildROI("VIEW", local60)->GetLocal2World(); m_previousTickleStates |= 1 << m_currentTickleState; m_currentTickleState = e_repeating; @@ -284,7 +284,7 @@ void LegoCarBuildAnimPresenter::EndAction() if (m_action) { AUTOLOCK(m_criticalSection); MxVideoPresenter::EndAction(); - m_unk0xbc = 0; + m_shelfState = e_selected; } } @@ -294,7 +294,7 @@ MxResult LegoCarBuildAnimPresenter::Serialize(LegoStorage* p_storage) { if (p_storage->IsReadMode()) { p_storage->ReadS16(m_placedPartCount); - p_storage->ReadFloat(m_unk0x130); + p_storage->ReadFloat(m_shelfFrame); for (MxS16 i = 0; i < m_numberOfParts; i++) { p_storage->ReadString(m_parts[i].m_name); p_storage->ReadString(m_parts[i].m_wiredName); @@ -303,7 +303,7 @@ MxResult LegoCarBuildAnimPresenter::Serialize(LegoStorage* p_storage) } else if (p_storage->IsWriteMode()) { p_storage->WriteS16(m_placedPartCount); - p_storage->WriteFloat(m_unk0x130); + p_storage->WriteFloat(m_shelfFrame); for (MxS16 i = 0; i < m_numberOfParts; i++) { p_storage->WriteString(m_parts[i].m_name); p_storage->WriteString(m_parts[i].m_wiredName); @@ -344,7 +344,7 @@ void LegoCarBuildAnimPresenter::SwapNodesByName(LegoChar* p_name1, LegoChar* p_n // FUNCTION: LEGO1 0x10079160 // FUNCTION: BETA10 0x1007165d -void LegoCarBuildAnimPresenter::FUN_10079160() +void LegoCarBuildAnimPresenter::InitBuildPlatform() { LegoTreeNode* root; LegoAnimNodeData* data2; @@ -355,16 +355,17 @@ void LegoCarBuildAnimPresenter::FUN_10079160() LegoAnimNodeData* destData; LegoTreeNode** children; + // Get Platform data, Shelf Frame data, and number of build parts for (i = 0; i < totalNodes; i++) { LegoAnimNodeData* data = (LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData(); name = data->GetName(); if (StringEqualsPlatform(name)) { - m_unk0xc4 = data; - if (m_unk0xc4->GetNumRotationKeys() == 0) { + m_platformAnimNodeData = data; + if (m_platformAnimNodeData->GetNumRotationKeys() == 0) { LegoRotationKey* key = new LegoRotationKey(); - m_unk0xc4->SetNumRotationKeys(1); - m_unk0xc4->SetRotationKeys(key); + m_platformAnimNodeData->SetNumRotationKeys(1); + m_platformAnimNodeData->SetRotationKeys(key); } } else { @@ -372,9 +373,9 @@ void LegoCarBuildAnimPresenter::FUN_10079160() m_numberOfParts++; } else { - if (m_unk0x134 == 0.0f && StringEqualsShelf(name)) { - m_unk0x134 = m_anim->GetDuration(); - m_unk0x138 = m_unk0x134 / (data->GetNumTranslationKeys() - 1); + if (m_shelfFrameMax == 0.0f && StringEqualsShelf(name)) { + m_shelfFrameMax = m_anim->GetDuration(); + m_shelfFrameInterval = m_shelfFrameMax / (data->GetNumTranslationKeys() - 1); } } } @@ -384,6 +385,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160() m_parts = new UnknownListEntry[m_numberOfParts]; assert(m_parts); + // Go through and add the wired name of each part for (i = 0; i < totalNodes; i++) { name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName(); @@ -402,6 +404,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160() MxS16 counter = 0; + // Go through and add the normal name of each part for (i = 0; i < totalNodes; i++) { name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName(); if (StringEndsOnYOrN(name)) { @@ -420,6 +423,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160() } } + // Set Platform root node destNode = new LegoTreeNode(); assert(destNode); destData = new LegoAnimNodeData(); @@ -436,7 +440,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160() *children = FindNodeByName(m_anim->GetRoot(), "PLATFORM"); destNode->SetChildren(children); - m_unk0xc8.SetRoot(destNode); + m_platformAnim.SetRoot(destNode); } // FUNCTION: LEGO1 0x100795d0 @@ -561,8 +565,8 @@ void LegoCarBuildAnimPresenter::FUN_10079790(const LegoChar* p_name) // FUNCTION: BETA10 0x1007225d void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle) { - if (m_unk0xc4) { - LegoRotationKey* rotationKey = m_unk0xc4->GetRotationKey(0); + if (m_platformAnimNodeData) { + LegoRotationKey* rotationKey = m_platformAnimNodeData->GetRotationKey(0); Mx4DPointFloat currentRotation(rotationKey->GetX(), rotationKey->GetY(), rotationKey->GetZ(), rotationKey->GetAngle()); @@ -579,33 +583,33 @@ void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle) rotationKey->FUN_100739a0(FALSE); } - m_unk0xc4->GetRotationKey(0)->SetX(newRotation[0]); - m_unk0xc4->GetRotationKey(0)->SetY(newRotation[1]); - m_unk0xc4->GetRotationKey(0)->SetZ(newRotation[2]); - m_unk0xc4->GetRotationKey(0)->SetAngle(newRotation[3]); + m_platformAnimNodeData->GetRotationKey(0)->SetX(newRotation[0]); + m_platformAnimNodeData->GetRotationKey(0)->SetY(newRotation[1]); + m_platformAnimNodeData->GetRotationKey(0)->SetZ(newRotation[2]); + m_platformAnimNodeData->GetRotationKey(0)->SetAngle(newRotation[3]); - if (m_unk0x140->GetROI()) { - FUN_1006b9a0(&m_unk0xc8, m_unk0x12c, NULL); + if (m_carBuildEntity->GetROI()) { + FUN_1006b9a0(&m_platformAnim, m_shelfFrameBuffer, NULL); } } } // FUNCTION: LEGO1 0x10079a90 // FUNCTION: BETA10 0x10072412 -void LegoCarBuildAnimPresenter::FUN_10079a90() +void LegoCarBuildAnimPresenter::MoveShelfForward() { - if (m_unk0x12c >= m_unk0x134) { - m_unk0x130 = 0.0; - m_unk0x12c = m_unk0x130; - m_unk0xbc = 1; + if (m_shelfFrameBuffer >= m_shelfFrameMax) { + m_shelfFrame = 0.0; + m_shelfFrameBuffer = m_shelfFrame; + m_shelfState = e_stopped; } - else if (m_unk0x12c >= m_unk0x138 + m_unk0x130) { - m_unk0x130 = m_unk0x138 + m_unk0x130; - m_unk0x12c = m_unk0x130; - m_unk0xbc = 1; + else if (m_shelfFrameBuffer >= m_shelfFrameInterval + m_shelfFrame) { + m_shelfFrame = m_shelfFrameInterval + m_shelfFrame; + m_shelfFrameBuffer = m_shelfFrame; + m_shelfState = e_stopped; } else { - m_unk0x12c = m_unk0x138 / 10.0f + m_unk0x12c; + m_shelfFrameBuffer = m_shelfFrameInterval / 10.0f + m_shelfFrameBuffer; } } @@ -706,6 +710,6 @@ void LegoCarBuildAnimPresenter::SetPartObjectIdByName(const LegoChar* p_name, Mx // FUNCTION: BETA10 0x10072959 const BoundingSphere& LegoCarBuildAnimPresenter::FUN_10079e20() { - LegoROI* roi = m_unk0x140->GetROI(); + LegoROI* roi = m_carBuildEntity->GetROI(); return roi->FindChildROI(m_parts[m_placedPartCount].m_wiredName, roi)->GetWorldBoundingSphere(); } From 596ebde9d3224b67d184338d2bf730e20740a7eb Mon Sep 17 00:00:00 2001 From: jonschz <17198703+jonschz@users.noreply.github.com> Date: Thu, 12 Jun 2025 08:52:56 +0200 Subject: [PATCH 3/4] Add BETA10 assertions in LegoPathController (#1555) * Add BETA10 assertions in LegoPathController * formatting --------- Co-authored-by: jonschz --- .../legoomni/src/paths/legopathcontroller.cpp | 17 +++++++++++++++++ LEGO1/lego/sources/geom/legoweedge.h | 1 + 2 files changed, 18 insertions(+) diff --git a/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp b/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp index 93cf0216..abf16351 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp @@ -559,27 +559,32 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage) if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { return FAILURE; } + assert(s < m_numN); edge.m_pointA = &m_nodes[s]; if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { return FAILURE; } + assert(s < m_numN); edge.m_pointB = &m_nodes[s]; if (edge.m_flags & LegoOrientedEdge::c_hasFaceA) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { return FAILURE; } + assert(s < m_numL); edge.m_faceA = &m_boundaries[s]; if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { return FAILURE; } + assert(s < m_numE); edge.m_ccwA = &m_edges[s]; if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { return FAILURE; } + assert(s < m_numE); edge.m_cwA = &m_edges[s]; } @@ -587,16 +592,19 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage) if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { return FAILURE; } + assert(s < m_numL); edge.m_faceB = &m_boundaries[s]; if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { return FAILURE; } + assert(s < m_numE); edge.m_ccwB = &m_edges[s]; if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { return FAILURE; } + assert(s < m_numE); edge.m_cwB = &m_edges[s]; } @@ -617,6 +625,9 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage) MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage) { for (MxS32 i = 0; i < m_numL; i++) { +#ifdef BETA10 + Mx4DPointFloat unused; +#endif LegoPathBoundary& boundary = m_boundaries[i]; MxU8 numE; MxU16 s; @@ -626,6 +637,8 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage) return FAILURE; } + assert(numE > 2); + boundary.m_edgeNormals = new Mx4DPointFloat[numE]; LegoOrientedEdge** edges = new LegoOrientedEdge*[numE]; @@ -636,6 +649,8 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage) return FAILURE; } + assert(s < m_numE); + edges[j] = &m_edges[s]; } @@ -693,6 +708,8 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage) return FAILURE; } + assert(s < m_numT); + boundary.m_pathTrigger[j].m_pathStruct = &m_structs[s]; if (p_storage->Read(&boundary.m_pathTrigger[j].m_data, sizeof(boundary.m_pathTrigger[j].m_data)) != diff --git a/LEGO1/lego/sources/geom/legoweedge.h b/LEGO1/lego/sources/geom/legoweedge.h index 4516f938..7e0e9bae 100644 --- a/LEGO1/lego/sources/geom/legoweedge.h +++ b/LEGO1/lego/sources/geom/legoweedge.h @@ -25,6 +25,7 @@ public: // FUNCTION: BETA10 0x100373f0 LegoU32 IsEqual(LegoWEEdge* p_other) { return this == p_other; } + // FUNCTION: BETA10 0x100bd410 void SetEdges(LegoOrientedEdge** p_edges, LegoU8 p_numEdges) { m_edges = p_edges; From 7b619d5544389eabbd70ddff20a25fe479b7deb8 Mon Sep 17 00:00:00 2001 From: Fabian Neundorf Date: Thu, 12 Jun 2025 18:33:32 +0200 Subject: [PATCH 4/4] Clear unknowns in `LegoPlantManager` (#1557) --- .../lego/legoomni/include/legoplantmanager.h | 12 +-- LEGO1/lego/legoomni/include/legoplants.h | 4 +- LEGO1/lego/legoomni/src/actors/act2actor.cpp | 18 ++--- LEGO1/lego/legoomni/src/actors/act3actors.cpp | 4 +- .../legoomni/src/common/legoplantmanager.cpp | 78 +++++++++---------- LEGO1/lego/legoomni/src/entity/legoentity.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/act3.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/infocenter.cpp | 2 +- 8 files changed, 61 insertions(+), 61 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoplantmanager.h b/LEGO1/lego/legoomni/include/legoplantmanager.h index a7a821d1..8a8c7902 100644 --- a/LEGO1/lego/legoomni/include/legoplantmanager.h +++ b/LEGO1/lego/legoomni/include/legoplantmanager.h @@ -52,11 +52,11 @@ public: MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state); LegoPlantInfo* GetInfoArray(MxS32& p_length); LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, LegoOmni::World p_worldId); - MxBool FUN_10026c50(LegoEntity* p_entity); + MxBool DecrementCounter(LegoEntity* p_entity); void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length); MxResult FUN_10026410(); - void FUN_10027120(); - void FUN_10027200(); + void ClearCounters(); + void SetInitialCounters(); static void SetCustomizeAnimFile(const char* p_value); @@ -68,10 +68,10 @@ public: private: void RemovePlant(MxS32 p_index, LegoOmni::World p_worldId); - void FUN_10026860(MxS32 p_index); + void AdjustHeight(MxS32 p_index); LegoPlantInfo* GetInfo(LegoEntity* p_entity); - MxBool FUN_10026c80(MxS32 p_index); - void FUN_100271b0(LegoEntity* p_entity, MxS32 p_adjust); + MxBool DecrementCounter(MxS32 p_index); + void AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust); static char* g_customizeAnimFile; static MxS32 g_maxMove[4]; diff --git a/LEGO1/lego/legoomni/include/legoplants.h b/LEGO1/lego/legoomni/include/legoplants.h index 1b26b0e8..9d20d1a9 100644 --- a/LEGO1/lego/legoomni/include/legoplants.h +++ b/LEGO1/lego/legoomni/include/legoplants.h @@ -41,8 +41,8 @@ struct LegoPlantInfo { MxU32 m_move; // 0x10 MxU8 m_mood; // 0x14 MxU8 m_color; // 0x15 - see enum for possible values - MxS8 m_unk0x16; // 0x16 - MxS8 m_initialUnk0x16; // 0x17 - initial value loaded to m_unk0x16 + MxS8 m_counter; // 0x16 + MxS8 m_initialCounter; // 0x17 - initial value loaded to m_counter const char* m_name; // 0x18 undefined4 m_unk0x1c; // 0x1c float m_x; // 0x20 diff --git a/LEGO1/lego/legoomni/src/actors/act2actor.cpp b/LEGO1/lego/legoomni/src/actors/act2actor.cpp index d6af311e..91e6cc29 100644 --- a/LEGO1/lego/legoomni/src/actors/act2actor.cpp +++ b/LEGO1/lego/legoomni/src/actors/act2actor.cpp @@ -728,7 +728,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) } else { for (i = 0; g_unk0x100f0f30[i] != -1; i++) { - if (plantInfo[g_unk0x100f0f30[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f0f30[i]].m_counter) { result = plantInfo[g_unk0x100f0f30[i]].m_entity; break; } @@ -742,7 +742,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) } else { for (i = 0; g_unk0x100f0f50[i] != -1; i++) { - if (plantInfo[g_unk0x100f0f50[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f0f50[i]].m_counter) { result = plantInfo[g_unk0x100f0f50[i]].m_entity; break; } @@ -760,7 +760,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) } else { for (i = 0; g_unk0x100f0f90[i] != -1; i++) { - if (plantInfo[g_unk0x100f0f90[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f0f90[i]].m_counter) { result = plantInfo[g_unk0x100f0f90[i]].m_entity; break; } @@ -782,7 +782,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) } else { for (i = 0; g_unk0x100f0fa8[i] != -1; i++) { - if (plantInfo[g_unk0x100f0fa8[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f0fa8[i]].m_counter) { result = plantInfo[g_unk0x100f0fa8[i]].m_entity; break; } @@ -800,7 +800,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) } else { for (i = 0; g_unk0x100f0fb8[i] != -1; i++) { - if (plantInfo[g_unk0x100f0fb8[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f0fb8[i]].m_counter) { result = plantInfo[g_unk0x100f0fb8[i]].m_entity; break; } @@ -814,7 +814,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) } else { for (i = 0; g_unk0x100f0fe8[i] != -1; i++) { - if (plantInfo[g_unk0x100f0fe8[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f0fe8[i]].m_counter) { result = plantInfo[g_unk0x100f0fe8[i]].m_entity; break; } @@ -828,7 +828,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) } else { for (i = 0; g_unk0x100f1000[i] != -1; i++) { - if (plantInfo[g_unk0x100f1000[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f1000[i]].m_counter) { result = plantInfo[g_unk0x100f1000[i]].m_entity; break; } @@ -842,7 +842,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) } else { for (i = 0; g_unk0x100f1018[i] != -1; i++) { - if (plantInfo[g_unk0x100f1018[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f1018[i]].m_counter) { result = plantInfo[g_unk0x100f1018[i]].m_entity; break; } @@ -851,7 +851,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param) break; case 8: for (i = 0; g_unk0x100f1030[i] != -1; i++) { - if (plantInfo[g_unk0x100f1030[i]].m_unk0x16) { + if (plantInfo[g_unk0x100f1030[i]].m_counter) { result = plantInfo[g_unk0x100f1030[i]].m_entity; break; } diff --git a/LEGO1/lego/legoomni/src/actors/act3actors.cpp b/LEGO1/lego/legoomni/src/actors/act3actors.cpp index 6ffffb7b..b4836be1 100644 --- a/LEGO1/lego/legoomni/src/actors/act3actors.cpp +++ b/LEGO1/lego/legoomni/src/actors/act3actors.cpp @@ -607,8 +607,8 @@ void Act3Brickster::Animate(float p_time) assert(m_shootAnim && m_pInfo); if (m_unk0x50 < p_time) { - while (m_pInfo->m_unk0x16) { - PlantManager()->FUN_10026c50(m_pInfo->m_entity); + while (m_pInfo->m_counter) { + PlantManager()->DecrementCounter(m_pInfo->m_entity); } assert(SoundManager()->GetCacheSoundManager()); diff --git a/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp b/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp index 56e6916e..ca587de2 100644 --- a/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp @@ -31,10 +31,10 @@ const char* g_plantLodNames[4][5] = { }; // GLOBAL: LEGO1 0x100f16b0 -float g_unk0x100f16b0[] = {0.1f, 0.7f, 0.5f, 0.9f}; +float g_heightPerCount[] = {0.1f, 0.7f, 0.5f, 0.9f}; // GLOBAL: LEGO1 0x100f16c0 -MxU8 g_unk0x100f16c0[] = {1, 2, 2, 3}; +MxU8 g_counters[] = {1, 2, 2, 3}; // GLOBAL: LEGO1 0x100f315c MxU32 LegoPlantManager::g_maxSound = 8; @@ -217,7 +217,7 @@ LegoEntity* LegoPlantManager::CreatePlant(MxS32 p_index, LegoWorld* p_world, Leg if (p_index < sizeOfArray(g_plantInfo)) { MxU32 world = 1 << (MxU8) p_worldId; - if (g_plantInfo[p_index].m_worlds & world && g_plantInfo[p_index].m_unk0x16 != 0) { + if (g_plantInfo[p_index].m_worlds & world && g_plantInfo[p_index].m_counter != 0) { if (g_plantInfo[p_index].m_entity == NULL) { char name[256]; char lodName[256]; @@ -285,7 +285,7 @@ MxResult LegoPlantManager::Write(LegoStorage* p_storage) if (p_storage->Write(&info->m_color, sizeof(info->m_color)) != SUCCESS) { goto done; } - if (p_storage->Write(&info->m_initialUnk0x16, sizeof(info->m_initialUnk0x16)) != SUCCESS) { + if (p_storage->Write(&info->m_initialCounter, sizeof(info->m_initialCounter)) != SUCCESS) { goto done; } } @@ -320,12 +320,12 @@ MxResult LegoPlantManager::Read(LegoStorage* p_storage) if (p_storage->Read(&info->m_color, sizeof(MxU8)) != SUCCESS) { goto done; } - if (p_storage->Read(&info->m_unk0x16, sizeof(MxS8)) != SUCCESS) { + if (p_storage->Read(&info->m_counter, sizeof(MxS8)) != SUCCESS) { goto done; } - info->m_initialUnk0x16 = info->m_unk0x16; - FUN_10026860(i); + info->m_initialCounter = info->m_counter; + AdjustHeight(i); } result = SUCCESS; @@ -336,13 +336,13 @@ done: // FUNCTION: LEGO1 0x10026860 // FUNCTION: BETA10 0x100c5be0 -void LegoPlantManager::FUN_10026860(MxS32 p_index) +void LegoPlantManager::AdjustHeight(MxS32 p_index) { MxU8 variant = g_plantInfo[p_index].m_variant; - if (g_plantInfo[p_index].m_unk0x16 >= 0) { - float value = g_unk0x100f16c0[variant] - g_plantInfo[p_index].m_unk0x16; - g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1] - value * g_unk0x100f16b0[variant]; + if (g_plantInfo[p_index].m_counter >= 0) { + float value = g_counters[variant] - g_plantInfo[p_index].m_counter; + g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1] - value * g_heightPerCount[variant]; } else { g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1]; @@ -410,7 +410,7 @@ MxBool LegoPlantManager::SwitchVariant(LegoEntity* p_entity) { LegoPlantInfo* info = GetInfo(p_entity); - if (info == NULL || info->m_unk0x16 != -1) { + if (info == NULL || info->m_counter != -1) { return FALSE; } @@ -550,7 +550,7 @@ void LegoPlantManager::SetCustomizeAnimFile(const char* p_value) // FUNCTION: LEGO1 0x10026c50 // FUNCTION: BETA10 0x100c6349 -MxBool LegoPlantManager::FUN_10026c50(LegoEntity* p_entity) +MxBool LegoPlantManager::DecrementCounter(LegoEntity* p_entity) { LegoPlantInfo* info = GetInfo(p_entity); @@ -558,12 +558,12 @@ MxBool LegoPlantManager::FUN_10026c50(LegoEntity* p_entity) return FALSE; } - return FUN_10026c80(info - g_plantInfo); + return DecrementCounter(info - g_plantInfo); } // FUNCTION: LEGO1 0x10026c80 // FUNCTION: BETA10 0x100c63eb -MxBool LegoPlantManager::FUN_10026c80(MxS32 p_index) +MxBool LegoPlantManager::DecrementCounter(MxS32 p_index) { if (p_index >= sizeOfArray(g_plantInfo)) { return FALSE; @@ -577,23 +577,23 @@ MxBool LegoPlantManager::FUN_10026c80(MxS32 p_index) MxBool result = TRUE; - if (info->m_unk0x16 < 0) { - info->m_unk0x16 = g_unk0x100f16c0[info->m_variant]; + if (info->m_counter < 0) { + info->m_counter = g_counters[info->m_variant]; } - if (info->m_unk0x16 > 0) { + if (info->m_counter > 0) { LegoROI* roi = info->m_entity->GetROI(); - info->m_unk0x16--; + info->m_counter--; - if (info->m_unk0x16 == 1) { - info->m_unk0x16 = 0; + if (info->m_counter == 1) { + info->m_counter = 0; } - if (info->m_unk0x16 == 0) { + if (info->m_counter == 0) { roi->SetVisibility(FALSE); } else { - FUN_10026860(info - g_plantInfo); + AdjustHeight(info - g_plantInfo); info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE); } } @@ -623,7 +623,7 @@ void LegoPlantManager::ScheduleAnimation(LegoEntity* p_entity, MxLong p_length) time += p_length; entry->m_time = time + 1000; - FUN_100271b0(p_entity, -1); + AdjustCounter(p_entity, -1); } // FUNCTION: LEGO1 0x10026e00 @@ -672,11 +672,11 @@ MxResult LegoPlantManager::Tickle() if (entry->m_time < time) { LegoPlantInfo* info = GetInfo(entry->m_entity); - if (info->m_unk0x16 == 0) { + if (info->m_counter == 0) { entry->m_roi->SetVisibility(FALSE); } else { - FUN_10026860(info - g_plantInfo); + AdjustHeight(info - g_plantInfo); info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE); } @@ -699,14 +699,14 @@ MxResult LegoPlantManager::Tickle() } // FUNCTION: LEGO1 0x10027120 -void LegoPlantManager::FUN_10027120() +void LegoPlantManager::ClearCounters() { LegoWorld* world = CurrentWorld(); for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) { - g_plantInfo[i].m_unk0x16 = -1; - g_plantInfo[i].m_initialUnk0x16 = -1; - FUN_10026860(i); + g_plantInfo[i].m_counter = -1; + g_plantInfo[i].m_initialCounter = -1; + AdjustHeight(i); if (g_plantInfo[i].m_entity != NULL) { g_plantInfo[i].m_entity->SetLocation( @@ -720,28 +720,28 @@ void LegoPlantManager::FUN_10027120() } // FUNCTION: LEGO1 0x100271b0 -void LegoPlantManager::FUN_100271b0(LegoEntity* p_entity, MxS32 p_adjust) +void LegoPlantManager::AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust) { LegoPlantInfo* info = GetInfo(p_entity); if (info != NULL) { - if (info->m_unk0x16 < 0) { - info->m_unk0x16 = g_unk0x100f16c0[info->m_variant]; + if (info->m_counter < 0) { + info->m_counter = g_counters[info->m_variant]; } - if (info->m_unk0x16 > 0) { - info->m_unk0x16 += p_adjust; - if (info->m_unk0x16 <= 1 && p_adjust < 0) { - info->m_unk0x16 = 0; + if (info->m_counter > 0) { + info->m_counter += p_adjust; + if (info->m_counter <= 1 && p_adjust < 0) { + info->m_counter = 0; } } } } // FUNCTION: LEGO1 0x10027200 -void LegoPlantManager::FUN_10027200() +void LegoPlantManager::SetInitialCounters() { for (MxU32 i = 0; i < sizeOfArray(g_plantInfo); i++) { - g_plantInfo[i].m_initialUnk0x16 = g_plantInfo[i].m_unk0x16; + g_plantInfo[i].m_initialCounter = g_plantInfo[i].m_counter; } } diff --git a/LEGO1/lego/legoomni/src/entity/legoentity.cpp b/LEGO1/lego/legoomni/src/entity/legoentity.cpp index d697907e..34192c72 100644 --- a/LEGO1/lego/legoomni/src/entity/legoentity.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoentity.cpp @@ -500,7 +500,7 @@ MxLong LegoEntity::Notify(MxParam& p_param) case e_unk1: break; case e_plant: - PlantManager()->FUN_10026c50(this); + PlantManager()->DecrementCounter(this); break; case e_building: BuildingManager()->FUN_10030000(this); diff --git a/LEGO1/lego/legoomni/src/worlds/act3.cpp b/LEGO1/lego/legoomni/src/worlds/act3.cpp index daee3b2d..cc6b08e8 100644 --- a/LEGO1/lego/legoomni/src/worlds/act3.cpp +++ b/LEGO1/lego/legoomni/src/worlds/act3.cpp @@ -664,7 +664,7 @@ MxLong Act3::HandleTransitionEnd() // FUNCTION: LEGO1 0x10073270 void Act3::ReadyWorld() { - PlantManager()->FUN_10027200(); + PlantManager()->SetInitialCounters(); BuildingManager()->FUN_10030800(); AnimationManager()->FUN_1005f6d0(FALSE); VideoManager()->Get3DManager()->SetFrustrum(90.0f, 0.1f, 125.0f); diff --git a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp index 5cc9138c..9daa9550 100644 --- a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp +++ b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp @@ -1385,7 +1385,7 @@ void Infocenter::Reset() break; } - PlantManager()->FUN_10027120(); + PlantManager()->ClearCounters(); BuildingManager()->FUN_10030590(); AnimationManager()->Reset(FALSE); CharacterManager()->ReleaseAllActors();