Implement/match LegoCharacterManager::FUN_10083f10 (#774)

* Implement LegoCharacterManager::FUN_10083f10

* style

* Match

* Fix naming
This commit is contained in:
Christian Semmler 2024-04-06 11:46:40 -04:00 committed by GitHub
parent 75dc04f40a
commit 3bafe2d3a4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 54 additions and 8 deletions

View file

@ -25,8 +25,17 @@ struct LegoCharacter {
m_roi = p_roi;
m_refCount = 1;
}
~LegoCharacter() { delete m_roi; }
inline void AddRef() { m_refCount++; }
inline MxU32 RemoveRef()
{
if (m_refCount != 0) {
m_refCount--;
}
return m_refCount;
}
LegoROI* m_roi; // 0x00
MxU32 m_refCount; // 0x04
@ -65,6 +74,7 @@ class LegoCharacterManager {
private:
LegoROI* CreateROI(const char* p_key);
void RemoveROI(LegoROI* p_roi);
LegoROI* FUN_10084cf0(LegoROI* p_roi, const char* p_name);
MxResult FUN_10085870(LegoROI* p_roi);

View file

@ -71,6 +71,7 @@ class LegoEntity : public MxEntity {
Mx3DPointFloat GetWorldPosition();
inline MxBool GetUnknown0x10IsSet(MxU8 p_flag) { return m_unk0x10 & p_flag; }
inline MxBool GetFlagsIsSet(MxU8 p_flag) { return m_flags & p_flag; }
inline MxU8 GetFlags() { return m_flags; }
inline MxFloat GetWorldSpeed() { return m_worldSpeed; }
inline LegoROI* GetROI() { return m_roi; }

View file

@ -24,9 +24,9 @@ class LegoUnknown100d5778 {
// LegoUnknown100d5778::`scalar deleting destructor'
private:
undefined m_unk0x4[4]; // 0x04
undefined m_unk0x04[4]; // 0x04
LPDIRECTSOUNDBUFFER m_dsBuffer; // 0x08
LegoROI* m_unk0xc; // 0x0c
LegoROI* m_unk0x0c; // 0x0c
undefined4 m_unk0x10; // 0x10
MxBool m_unk0x14; // 0x14
MxBool m_unk0x15; // 0x15

View file

@ -22,7 +22,7 @@ LegoUnknown100d5778::~LegoUnknown100d5778()
void LegoUnknown100d5778::Init()
{
m_dsBuffer = NULL;
m_unk0xc = NULL;
m_unk0x0c = NULL;
m_unk0x10 = 0;
m_unk0x18 = 0;
m_unk0x14 = FALSE;
@ -57,12 +57,12 @@ void LegoUnknown100d5778::Destroy()
m_dsBuffer = NULL;
}
if (m_unk0x14 && m_unk0xc && CharacterManager()) {
if (m_unk0x14 && m_unk0x0c && CharacterManager()) {
if (m_unk0x15) {
CharacterManager()->FUN_10083db0(m_unk0xc);
CharacterManager()->FUN_10083db0(m_unk0x0c);
}
else {
CharacterManager()->FUN_10083f10(m_unk0xc);
CharacterManager()->FUN_10083f10(m_unk0x0c);
}
}

View file

@ -242,10 +242,45 @@ void LegoCharacterManager::FUN_10083db0(LegoROI* p_roi)
// TODO
}
// STUB: LEGO1 0x10083f10
// FUNCTION: LEGO1 0x10083f10
void LegoCharacterManager::FUN_10083f10(LegoROI* p_roi)
{
// TODO
LegoCharacter* character = NULL;
LegoCharacterMap::iterator it;
for (it = m_characters->begin(); it != m_characters->end(); it++) {
character = (*it).second;
if (character->m_roi == p_roi) {
if (character->RemoveRef() == 0) {
LegoEntity* entity = character->m_roi->GetEntity();
if (entity != NULL) {
entity->SetROI(NULL, FALSE, FALSE);
}
RemoveROI(character->m_roi);
delete[] const_cast<char*>((*it).first);
delete (*it).second;
m_characters->erase(it);
if (entity != NULL && entity->GetFlagsIsSet(LegoEntity::c_bit2)) {
entity->ClearFlag(LegoEntity::c_bit2);
delete entity;
}
}
return;
}
}
}
// FUNCTION: LEGO1 0x10084010
void LegoCharacterManager::RemoveROI(LegoROI* p_roi)
{
VideoManager()->Get3DManager()->Remove(*p_roi);
}
// FUNCTION: LEGO1 0x10084030