This commit is contained in:
Christian Semmler 2024-03-03 14:01:53 -05:00
parent 7306c453a2
commit a4932b9e7f
6 changed files with 108 additions and 2 deletions

View File

@ -8,6 +8,8 @@
class LegoPartPresenter : public MxMediaPresenter {
public:
LegoPartPresenter() { Reset(); }
// FUNCTION: LEGO1 0x10067300
~LegoPartPresenter() override { Destroy(TRUE); }
// FUNCTION: LEGO1 0x1000cf70

View File

@ -3,7 +3,11 @@
#include "legoentitypresenter.h"
#include <stdio.h>
class LegoWorld;
struct ModelDbPart;
struct ModelDbModel;
// VTABLE: LEGO1 0x100d8ee0
// SIZE 0x54
@ -33,6 +37,8 @@ class LegoWorldPresenter : public LegoEntityPresenter {
MxResult StartAction(MxStreamController* p_controller, MxDSAction* p_action) override; // vtable+0x3c
void VTable0x60(MxPresenter* p_presenter) override; // vtable+0x60
MxResult FUN_10067360(ModelDbPart& p_part, FILE* p_wdbFile);
MxResult FUN_100674b0(ModelDbModel& p_model, FILE* p_wdbFile, LegoWorld* p_world);
MxResult LoadWorld(char* p_worldName, LegoWorld* p_world);
// SYNTHETIC: LEGO1 0x10066750

View File

@ -187,7 +187,7 @@ MxResult LegoWorldPresenter::LoadWorld(char* p_worldName, LegoWorld* p_world)
}
}
ModelDbWorld* worlds;
ModelDbWorld* worlds = NULL;
MxS32 numWorlds;
FILE* wdbFile = fopen(wdbPath, "rb");
@ -235,6 +235,7 @@ MxResult LegoWorldPresenter::LoadWorld(char* p_worldName, LegoWorld* p_world)
return FAILURE;
}
buff = new MxU8[size];
if (fread(&buff, size, 1, wdbFile) != 1) {
return FAILURE;
}
@ -257,6 +258,78 @@ MxResult LegoWorldPresenter::LoadWorld(char* p_worldName, LegoWorld* p_world)
}
}
ModelDbPartListCursor cursor(worlds[i].m_partList);
ModelDbPart* part;
while (cursor.Next(part)) {
if (GetViewLODListManager()->Lookup(part->m_name.GetData()) == NULL &&
FUN_10067360(*part, wdbFile) != SUCCESS) {
return FAILURE;
}
}
for (MxS32 j = 0; j < worlds[i].m_numModels; j++) {
if (!strnicmp(worlds[i].m_models[j].m_modelName, "isle", 4)) {
switch (g_legoWorldPresenterQuality) {
case 0:
if (strcmpi(worlds[i].m_models[j].m_modelName, "isle_lo")) {
continue;
}
break;
case 1:
if (strcmpi(worlds[i].m_models[j].m_modelName, "isle")) {
continue;
}
break;
case 2:
if (strcmpi(worlds[i].m_models[j].m_modelName, "isle_hi")) {
continue;
}
break;
}
if (FUN_100674b0(worlds[i].m_models[j], wdbFile, p_world) != SUCCESS) {
return FAILURE;
}
}
else {
if (g_legoWorldPresenterQuality < 1 && !strcmpi(worlds[i].m_models[j].m_modelName, "haus")) {
if (FUN_100674b0(worlds[i].m_models[j], wdbFile, p_world) != SUCCESS) {
return FAILURE;
}
}
else {
if (worlds[i].m_models[j].m_modelName[4] == '3') {
if (FUN_100674b0(worlds[i].m_models[j], wdbFile, p_world) != SUCCESS) {
return FAILURE;
}
if (FUN_100674b0(worlds[i].m_models[j - 2], wdbFile, p_world) != SUCCESS) {
return FAILURE;
}
if (FUN_100674b0(worlds[i].m_models[j - 1], wdbFile, p_world) != SUCCESS) {
return FAILURE;
}
}
}
}
}
return SUCCESS;
}
// STUB: LEGO1 0x10067360
MxResult LegoWorldPresenter::FUN_10067360(ModelDbPart& p_part, FILE* p_wdbFile)
{
// TODO
return SUCCESS;
}
// STUB: LEGO1 0x100674b0
MxResult LegoWorldPresenter::FUN_100674b0(ModelDbModel& p_model, FILE* p_wdbFile, LegoWorld* p_world)
{
// TODO
return SUCCESS;
}

View File

@ -78,6 +78,9 @@
// LIBRARY: LEGO1 0x1008c410
// _strlwr
// LIBRARY: LEGO1 0x1008c570
// _access
// LIBRARY: LEGO1 0x1008c5c0
// _fseek

View File

@ -3,6 +3,8 @@
DECOMP_SIZE_ASSERT(ModelDbWorld, 0x18)
DECOMP_SIZE_ASSERT(ModelDbPart, 0x18)
DECOMP_SIZE_ASSERT(ModelDbModel, 0x38)
DECOMP_SIZE_ASSERT(ModelDbPartList, 0x1c)
DECOMP_SIZE_ASSERT(ModelDbPartListCursor, 0x10)
// STUB: LEGO1 0x100276b0
MxResult ModelDbModel::Read(FILE* p_file)

View File

@ -49,6 +49,16 @@ class ModelDbPartList : public MxList<ModelDbPart*> {
undefined m_unk0x18;
};
// VTABLE: LEGO1 0x100d68d0
// class MxListCursor<ModelDbPart *>
// VTABLE: LEGO1 0x100d68e8
// SIZE 0x10
class ModelDbPartListCursor : public MxListCursor<ModelDbPart*> {
public:
ModelDbPartListCursor(ModelDbPartList* p_list) : MxListCursor<ModelDbPart*>(p_list) {}
};
// TEMPLATE: LEGO1 0x10027c70
// MxCollection<ModelDbPart *>::Compare
@ -67,11 +77,21 @@ class ModelDbPartList : public MxList<ModelDbPart*> {
// SYNTHETIC: LEGO1 0x10027e50
// MxList<ModelDbPart *>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x10027f00
// ModelDbPartListCursor::`scalar deleting destructor'
// TEMPLATE: LEGO1 0x10027f70
// MxListCursor<ModelDbPart *>::~MxListCursor<ModelDbPart *>
// SYNTHETIC: LEGO1 0x10027fc0
// MxListCursor<ModelDbPart *>::`scalar deleting destructor'
// SIZE 0x38
struct ModelDbModel {
MxResult Read(FILE* p_file);
undefined m_unk0x00[0x38]; // 0x00
char* m_modelName; // 0x00
undefined m_unk0x04[0x34]; // 0x04
};
// SIZE 0x18