Add names to LegoActorInfo.Part (#1538)

Each part consists of two "blocks" where every block has a list of
indices which reference into a list of names and the actual index used
for the list of indices.

By doing that, it is possible to reuse the list of name for every actor
and instead have a "sublist" through the indices list.
This commit is contained in:
Fabian Neundorf 2025-06-04 03:11:01 +02:00 committed by GitHub
parent b4fb9f3a15
commit d7d3a47cd2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 741 additions and 733 deletions

View File

@ -11,12 +11,12 @@ class LegoROI;
struct LegoActorInfo { struct LegoActorInfo {
// SIZE 0x18 // SIZE 0x18
struct Part { struct Part {
MxU8* m_unk0x00; // 0x00 MxU8* m_partNameIndices; // 0x00
const char** m_unk0x04; // 0x04 const char** m_partName; // 0x04
MxU8 m_unk0x08; // 0x08 MxU8 m_partNameIndex; // 0x08
MxU8* m_unk0x0c; // 0x0c MxU8* m_nameIndices; // 0x0c
const char** m_unk0x10; // 0x10 const char** m_names; // 0x10
MxU8 m_unk0x14; // 0x14 MxU8 m_nameIndex; // 0x14
}; };
const char* m_name; // 0x00 const char* m_name; // 0x00

File diff suppressed because it is too large Load Diff

View File

@ -132,33 +132,41 @@ MxResult LegoCharacterManager::Write(LegoStorage* p_storage)
if (p_storage->Write(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) { if (p_storage->Write(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_parts[c_infohatPart].m_unk0x08, sizeof(info->m_parts[c_infohatPart].m_unk0x08)) != if (p_storage->Write(
SUCCESS) { &info->m_parts[c_infohatPart].m_partNameIndex,
sizeof(info->m_parts[c_infohatPart].m_partNameIndex)
) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_parts[c_infohatPart].m_unk0x14, sizeof(info->m_parts[c_infohatPart].m_unk0x14)) != if (p_storage->Write(
&info->m_parts[c_infohatPart].m_nameIndex,
sizeof(info->m_parts[c_infohatPart].m_nameIndex)
) != SUCCESS) {
goto done;
}
if (p_storage->Write(
&info->m_parts[c_infogronPart].m_nameIndex,
sizeof(info->m_parts[c_infogronPart].m_nameIndex)
) != SUCCESS) {
goto done;
}
if (p_storage->Write(
&info->m_parts[c_armlftPart].m_nameIndex,
sizeof(info->m_parts[c_armlftPart].m_nameIndex)
) != SUCCESS) {
goto done;
}
if (p_storage->Write(&info->m_parts[c_armrtPart].m_nameIndex, sizeof(info->m_parts[c_armrtPart].m_nameIndex)) !=
SUCCESS) { SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write( if (p_storage->Write(
&info->m_parts[c_infogronPart].m_unk0x14, &info->m_parts[c_leglftPart].m_nameIndex,
sizeof(info->m_parts[c_infogronPart].m_unk0x14) sizeof(info->m_parts[c_leglftPart].m_nameIndex)
) != SUCCESS) { ) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_parts[c_armlftPart].m_unk0x14, sizeof(info->m_parts[c_armlftPart].m_unk0x14)) != if (p_storage->Write(&info->m_parts[c_legrtPart].m_nameIndex, sizeof(info->m_parts[c_legrtPart].m_nameIndex)) !=
SUCCESS) {
goto done;
}
if (p_storage->Write(&info->m_parts[c_armrtPart].m_unk0x14, sizeof(info->m_parts[c_armrtPart].m_unk0x14)) !=
SUCCESS) {
goto done;
}
if (p_storage->Write(&info->m_parts[c_leglftPart].m_unk0x14, sizeof(info->m_parts[c_leglftPart].m_unk0x14)) !=
SUCCESS) {
goto done;
}
if (p_storage->Write(&info->m_parts[c_legrtPart].m_unk0x14, sizeof(info->m_parts[c_legrtPart].m_unk0x14)) !=
SUCCESS) { SUCCESS) {
goto done; goto done;
} }
@ -187,25 +195,25 @@ MxResult LegoCharacterManager::Read(LegoStorage* p_storage)
if (p_storage->Read(&info->m_mood, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_mood, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_infohatPart].m_unk0x08, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_infohatPart].m_partNameIndex, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_infohatPart].m_unk0x14, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_infohatPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_infogronPart].m_unk0x14, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_infogronPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_armlftPart].m_unk0x14, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_armlftPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_armrtPart].m_unk0x14, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_armrtPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_leglftPart].m_unk0x14, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_leglftPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_legrtPart].m_unk0x14, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_parts[c_legrtPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
} }
@ -503,7 +511,7 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
const char* parentName; const char* parentName;
if (i == 0 || i == 1) { if (i == 0 || i == 1) {
parentName = part.m_unk0x04[part.m_unk0x00[part.m_unk0x08]]; parentName = part.m_partName[part.m_partNameIndices[part.m_partNameIndex]];
} }
else { else {
parentName = g_actorLODs[i + 1].m_parentName; parentName = g_actorLODs[i + 1].m_parentName;
@ -554,18 +562,18 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
childROI->WrappedSetLocal2WorldWithWorldDataUpdate(mat); childROI->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_useTexture && if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_useTexture &&
(i != 0 || part.m_unk0x00[part.m_unk0x08] != 0)) { (i != 0 || part.m_partNameIndices[part.m_partNameIndex] != 0)) {
LegoTextureInfo* textureInfo = textureContainer->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]); LegoTextureInfo* textureInfo = textureContainer->Get(part.m_names[part.m_nameIndices[part.m_nameIndex]]);
if (textureInfo != NULL) { if (textureInfo != NULL) {
childROI->SetTextureInfo(textureInfo); childROI->SetTextureInfo(textureInfo);
childROI->SetLodColor(1.0F, 1.0F, 1.0F, 0.0F); childROI->SetLodColor(1.0F, 1.0F, 1.0F, 0.0F);
} }
} }
else if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_useColor || (i == 0 && part.m_unk0x00[part.m_unk0x08] == 0)) { else if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_useColor || (i == 0 && part.m_partNameIndices[part.m_partNameIndex] == 0)) {
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
childROI->GetRGBAColor(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); childROI->GetRGBAColor(part.m_names[part.m_nameIndices[part.m_nameIndex]], red, green, blue, alpha);
childROI->SetLodColor(red, green, blue, alpha); childROI->SetLodColor(red, green, blue, alpha);
} }
@ -617,7 +625,7 @@ MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_tex
assert(info); assert(info);
LegoActorInfo::Part& part = info->m_parts[c_headPart]; LegoActorInfo::Part& part = info->m_parts[c_headPart];
p_texture = TextureContainer()->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]); p_texture = TextureContainer()->Get(part.m_names[part.m_nameIndices[part.m_nameIndex]]);
assert(p_texture); assert(p_texture);
} }
@ -782,13 +790,13 @@ MxBool LegoCharacterManager::SwitchColor(LegoROI* p_roi, LegoROI* p_targetROI)
LegoActorInfo::Part& part = info->m_parts[partIndex]; LegoActorInfo::Part& part = info->m_parts[partIndex];
part.m_unk0x14++; part.m_nameIndex++;
if (part.m_unk0x0c[part.m_unk0x14] == 0xff) { if (part.m_nameIndices[part.m_nameIndex] == 0xff) {
part.m_unk0x14 = 0; part.m_nameIndex = 0;
} }
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
LegoROI::GetRGBAColor(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); LegoROI::GetRGBAColor(part.m_names[part.m_nameIndices[part.m_nameIndex]], red, green, blue, alpha);
p_targetROI->SetLodColor(red, green, blue, alpha); p_targetROI->SetLodColor(red, green, blue, alpha);
return TRUE; return TRUE;
} }
@ -804,12 +812,12 @@ MxBool LegoCharacterManager::SwitchVariant(LegoROI* p_roi)
LegoActorInfo::Part& part = info->m_parts[c_infohatPart]; LegoActorInfo::Part& part = info->m_parts[c_infohatPart];
part.m_unk0x08++; part.m_partNameIndex++;
MxU8 unk0x00 = part.m_unk0x00[part.m_unk0x08]; MxU8 unk0x00 = part.m_partNameIndices[part.m_partNameIndex];
if (unk0x00 == 0xff) { if (unk0x00 == 0xff) {
part.m_unk0x08 = 0; part.m_partNameIndex = 0;
unk0x00 = part.m_unk0x00[part.m_unk0x08]; unk0x00 = part.m_partNameIndices[part.m_partNameIndex];
} }
LegoROI* childROI = FindChildROI(p_roi, g_actorLODs[c_infohatLOD].m_name); LegoROI* childROI = FindChildROI(p_roi, g_actorLODs[c_infohatLOD].m_name);
@ -817,14 +825,14 @@ MxBool LegoCharacterManager::SwitchVariant(LegoROI* p_roi)
if (childROI != NULL) { if (childROI != NULL) {
char lodName[256]; char lodName[256];
ViewLODList* lodList = GetViewLODListManager()->Lookup(part.m_unk0x04[unk0x00]); ViewLODList* lodList = GetViewLODListManager()->Lookup(part.m_partName[unk0x00]);
MxS32 lodSize = lodList->Size(); MxS32 lodSize = lodList->Size();
sprintf(lodName, "%s%d", p_roi->GetName(), g_unk0x100fc4ec++); sprintf(lodName, "%s%d", p_roi->GetName(), g_unk0x100fc4ec++);
ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize); ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize);
Tgl::Renderer* renderer = VideoManager()->GetRenderer(); Tgl::Renderer* renderer = VideoManager()->GetRenderer();
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
LegoROI::GetRGBAColor(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); LegoROI::GetRGBAColor(part.m_names[part.m_nameIndices[part.m_nameIndex]], red, green, blue, alpha);
for (MxS32 i = 0; i < lodSize; i++) { for (MxS32 i = 0; i < lodSize; i++) {
LegoLOD* lod = (LegoLOD*) (*lodList)[i]; LegoLOD* lod = (LegoLOD*) (*lodList)[i];