mirror of
https://github.com/isledecomp/isle-portable.git
synced 2024-11-24 00:18:04 -05:00
c0acf11f9b
* Implement/Match LegoTree * Fix vtable * Fixes --------- Co-authored-by: Christian Semmler <mail@csemmler.com>
110 lines
2.3 KiB
C++
110 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
|
|
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;
|
|
}
|