From 65e3c3dd055050272d78132519a7efa13e322e63 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Tue, 2 Jul 2024 13:04:05 -0700 Subject: [PATCH] Implement/match FreeModelDbWorlds (#1056) --- LEGO1/modeldb/modeldb.cpp | 36 ++++++++++++++++++++++++++++++++++-- LEGO1/modeldb/modeldb.h | 1 + 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/LEGO1/modeldb/modeldb.cpp b/LEGO1/modeldb/modeldb.cpp index b0489b8c..2ac3f978 100644 --- a/LEGO1/modeldb/modeldb.cpp +++ b/LEGO1/modeldb/modeldb.cpp @@ -6,6 +6,14 @@ DECOMP_SIZE_ASSERT(ModelDbModel, 0x38) DECOMP_SIZE_ASSERT(ModelDbPartList, 0x1c) DECOMP_SIZE_ASSERT(ModelDbPartListCursor, 0x10) +// FUNCTION: LEGO1 0x10027690 +// FUNCTION: BETA10 0x100e5620 +void ModelDbModel::Free() +{ + delete[] m_modelName; + delete[] m_presenterName; +} + // FUNCTION: LEGO1 0x100276b0 MxResult ModelDbModel::Read(FILE* p_file) { @@ -130,8 +138,32 @@ MxResult ReadModelDbWorlds(FILE* p_file, ModelDbWorld*& p_worlds, MxS32& p_numWo return SUCCESS; } -// STUB: LEGO1 0x10028080 +// FUNCTION: LEGO1 0x10028080 +// FUNCTION: BETA10 0x100e6431 void FreeModelDbWorlds(ModelDbWorld*& p_worlds, MxS32 p_numWorlds) { - // TODO + ModelDbWorld* worlds = p_worlds; + + for (MxS32 i = 0; i < p_numWorlds; i++) { + delete[] worlds[i].m_worldName; + + ModelDbPartListCursor cursor(worlds[i].m_partList); + ModelDbPart* part; + + while (cursor.Next(part)) { + delete part; + } + + delete worlds[i].m_partList; + + ModelDbModel* models = worlds[i].m_models; + for (MxS32 j = 0; j < worlds[i].m_numModels; j++) { + models[j].Free(); + } + + delete[] worlds[i].m_models; + } + + delete[] p_worlds; + p_worlds = NULL; } diff --git a/LEGO1/modeldb/modeldb.h b/LEGO1/modeldb/modeldb.h index 943927ef..911832e5 100644 --- a/LEGO1/modeldb/modeldb.h +++ b/LEGO1/modeldb/modeldb.h @@ -91,6 +91,7 @@ public: // SIZE 0x38 struct ModelDbModel { + void Free(); MxResult Read(FILE* p_file); char* m_modelName; // 0x00