isle/LEGO1/lego/sources/misc/legotree.cpp
jonschz 974cd7ce7c
Implement LegoCarBuildAnimPresenter::FUN_10079160() and others (#1111)
* Implement `LegoCarBuildAnimPresenter::FUN_10079160()` and others

* Address review comments

---------

Co-authored-by: jonschz <jonschz@users.noreply.github.com>
2024-10-11 20:21:33 +02:00

111 lines
2.3 KiB
C++

#include "legotree.h"
#include "decomp.h"
#include "legostorage.h"
DECOMP_SIZE_ASSERT(LegoTreeNodeData, 0x04)
DECOMP_SIZE_ASSERT(LegoTreeNode, 0x010)
DECOMP_SIZE_ASSERT(LegoTree, 0x08)
// FUNCTION: LEGO1 0x10099d60
// FUNCTION: BETA10 0x10187dd0
LegoTreeNode::LegoTreeNode()
{
m_data = NULL;
m_numChildren = 0;
m_children = NULL;
}
// FUNCTION: LEGO1 0x10099da0
LegoTreeNode::~LegoTreeNode()
{
if (m_data) {
delete m_data;
}
if (m_children) {
delete[] m_children;
}
}
// FUNCTION: LEGO1 0x10099dd0
LegoTree::LegoTree()
{
m_root = NULL;
}
// FUNCTION: LEGO1 0x10099e00
LegoTree::~LegoTree()
{
if (m_root) {
Delete(m_root);
}
}
// FUNCTION: LEGO1 0x10099e20
LegoResult LegoTree::Read(LegoStorage* p_storage)
{
return Read(p_storage, m_root);
}
// FUNCTION: LEGO1 0x10099e40
LegoResult LegoTree::Write(LegoStorage* p_storage)
{
return Write(p_storage, m_root);
}
// FUNCTION: LEGO1 0x10099e60
LegoResult LegoTree::Read(LegoStorage* p_storage, LegoTreeNode*& p_node)
{
LegoResult result;
p_node = new LegoTreeNode();
p_node->SetData(CreateData());
if ((result = p_node->GetData()->Read(p_storage)) != SUCCESS) {
return result;
}
LegoU32 numChildren;
if ((result = p_storage->Read(&numChildren, sizeof(numChildren))) != SUCCESS) {
return result;
}
if (numChildren) {
p_node->SetChildren(new LegoTreeNode*[numChildren]);
for (LegoU32 i = 0; i < numChildren; i++) {
LegoTreeNode* node;
if ((result = Read(p_storage, node)) != SUCCESS) {
return result;
}
p_node->SetNumChildren(p_node->GetNumChildren() + 1);
p_node->SetChild(i, node);
}
}
return SUCCESS;
}
// FUNCTION: LEGO1 0x1009a020
LegoResult LegoTree::Write(LegoStorage* p_storage, LegoTreeNode* p_node)
{
LegoResult result;
if (p_node->GetData()) {
if ((result = p_node->GetData()->Write(p_storage)) != SUCCESS) {
return result;
}
}
LegoU32 numChildren = p_node->GetNumChildren();
if ((result = p_storage->Write(&numChildren, sizeof(numChildren))) != SUCCESS) {
return result;
}
for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) {
if ((result = Write(p_storage, p_node->GetChild(i))) != SUCCESS) {
return result;
}
}
return SUCCESS;
}
// FUNCTION: LEGO1 0x1009a0a0
void LegoTree::Delete(LegoTreeNode* p_node)
{
for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) {
Delete(p_node->GetChild(i));
}
delete p_node;
}