diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h index b25b2510..1ad249ea 100644 --- a/LEGO1/lego/legoomni/include/legoanimationmanager.h +++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h @@ -108,7 +108,7 @@ public: void FUN_10062770(); void PurgeExtra(MxBool p_und); void AddExtra(MxS32 p_location, MxBool p_und); - void FUN_10063270(LegoROIList*, LegoAnimPresenter*); + void FUN_10063270(LegoROIList* p_list, LegoAnimPresenter* p_presenter); void FUN_10063780(LegoROIList* p_list); MxResult FUN_10064670(Vector3* p_position); MxResult FUN_10064740(Vector3* p_position); @@ -151,9 +151,12 @@ private: void FUN_10062580(AnimInfo& p_info); MxBool FUN_10062650(Vector3& p_position, float p_und, LegoROI* p_roi); MxBool FUN_10062710(AnimInfo& p_info); + MxBool FUN_10062e20(LegoROI* p_roi, LegoAnimPresenter* p_presenter); + void FUN_10063950(LegoROI* p_roi); void FUN_10063aa0(); MxBool FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_actor, MxU8 p_mood, MxU32 p_characterId); void FUN_10063d10(); + void FUN_10063e40(LegoAnimPresenter* p_presenter); MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world); MxBool FUN_10064010(LegoPathBoundary* p_boundary, LegoUnknown100db7f4* p_edge, float p_destScale); MxBool FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool p_bool1, MxBool p_bool2); diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp index 2d780d0a..60545c39 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp @@ -1396,7 +1396,6 @@ MxLong LegoAnimationManager::Notify(MxParam& p_param) if (roi != NULL) { LegoExtraActor* actor = CharacterManager()->GetActor(roi->GetName()); - if (actor != NULL) { actor->Restart(); } @@ -2030,10 +2029,92 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und) } } -// STUB: LEGO1 0x10063270 -void LegoAnimationManager::FUN_10063270(LegoROIList*, LegoAnimPresenter*) +// STUB: LEGO1 0x10062e20 +// FUNCTION: BETA10 0x100444cb +MxBool LegoAnimationManager::FUN_10062e20(LegoROI* p_roi, LegoAnimPresenter* p_presenter) { - // TODO + return FALSE; +} + +// FUNCTION: LEGO1 0x10063270 +// FUNCTION: BETA10 0x10044b9a +void LegoAnimationManager::FUN_10063270(LegoROIList* p_list, LegoAnimPresenter* p_presenter) +{ + if (p_list != NULL) { + LegoWorld* world = CurrentWorld(); + LegoROI* roi; + MxU32 i; + + for (i = 0; i < sizeOfArray(g_vehicles); i++) { + roi = Lego()->FindROI(g_vehicles[i].m_name); + + if (roi != NULL) { + if (!g_vehicles[i].m_unk0x05 && roi->GetVisibility()) { + g_vehicles[i].m_unk0x04 = TRUE; + } + else { + g_vehicles[i].m_unk0x04 = FALSE; + } + } + } + + LegoROIListCursor cursor(p_list); + + while (cursor.Next(roi)) { + if (roi->GetVisibility() && FUN_10062e20(roi, p_presenter)) { + cursor.Detach(); + FUN_10063950(roi); + } + else { + LegoExtraActor* actor = CharacterManager()->GetActor(roi->GetName()); + + if (actor != NULL) { + for (MxS32 i = 0; i < (MxS32) sizeOfArray(m_extras); i++) { + if (m_extras[i].m_roi == roi) { + if (actor->GetController() != NULL) { + actor->GetController()->RemoveActor(actor); + actor->SetController(NULL); + } + + if (m_extras[i].m_unk0x14) { + m_extras[i].m_unk0x14 = FALSE; + + MxS32 vehicleId = g_characters[m_extras[i].m_characterId].m_vehicleId; + if (vehicleId >= 0) { + g_vehicles[vehicleId].m_unk0x05 = FALSE; + + LegoROI* roi = Lego()->FindROI(g_vehicles[vehicleId].m_name); + if (roi != NULL) { + roi->SetVisibility(FALSE); + } + } + } + + m_extras[i].m_roi = NULL; + g_characters[m_extras[i].m_characterId].m_unk0x04 = FALSE; + g_characters[m_extras[i].m_characterId].m_unk0x07 = FALSE; + m_extras[i].m_characterId = -1; + m_extras[i].m_unk0x0d = FALSE; + m_unk0x414--; + break; + } + } + } + } + } + + FUN_10063e40(p_presenter); + + for (i = 0; i < sizeOfArray(g_vehicles); i++) { + if (!g_vehicles[i].m_unk0x05) { + roi = Lego()->FindROI(g_vehicles[i].m_name); + + if (roi != NULL) { + roi->SetVisibility(FALSE); + } + } + } + } } // FUNCTION: LEGO1 0x10063780 @@ -2054,6 +2135,19 @@ void LegoAnimationManager::FUN_10063780(LegoROIList* p_list) } } +// FUNCTION: LEGO1 0x10063950 +void LegoAnimationManager::FUN_10063950(LegoROI* p_roi) +{ + if (m_unk0x424 != NULL) { + LegoROIListCursor cursor(m_unk0x424); + + if (cursor.Find(p_roi)) { + CharacterManager()->FUN_10083db0(p_roi); + cursor.Detach(); + } + } +} + // FUNCTION: LEGO1 0x10063aa0 void LegoAnimationManager::FUN_10063aa0() { @@ -2171,6 +2265,23 @@ void LegoAnimationManager::FUN_10063d10() } } +// FUNCTION: LEGO1 0x10063e40 +void LegoAnimationManager::FUN_10063e40(LegoAnimPresenter* p_presenter) +{ + if (m_unk0x424 != NULL) { + LegoROIListCursor cursor(m_unk0x424); + LegoROI* roi; + + while (cursor.Next(roi)) { + if (!FUN_10062e20(roi, p_presenter)) { + CharacterManager()->FUN_10083db0(roi); + } + + cursor.Detach(); + } + } +} + // FUNCTION: LEGO1 0x10063fb0 // FUNCTION: BETA10 0x100452a7 MxBool LegoAnimationManager::FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world)