Implement/match LegoPhonemePresenter::EndAction (#816)

This commit is contained in:
Christian Semmler 2024-04-17 11:03:17 -04:00 committed by GitHub
parent 97b502362d
commit e7aec124a2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 66 additions and 17 deletions

View file

@ -59,6 +59,7 @@ class LegoCharacterManager {
void FUN_100832a0(); void FUN_100832a0();
MxU32 GetRefCount(LegoROI* p_roi); MxU32 GetRefCount(LegoROI* p_roi);
void FUN_10083c30(const char* p_name);
void FUN_10083db0(LegoROI* p_roi); void FUN_10083db0(LegoROI* p_roi);
void FUN_10083f10(LegoROI* p_roi); void FUN_10083f10(LegoROI* p_roi);
MxBool FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_textureInfo); MxBool FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_textureInfo);

View file

@ -239,6 +239,13 @@ MxU32 LegoCharacterManager::GetRefCount(LegoROI* p_roi)
return 0; return 0;
} }
// STUB: LEGO1 0x10083c30
// FUNCTION: BETA10 0x10074701
void LegoCharacterManager::FUN_10083c30(const char* p_name)
{
// TODO
}
// FUNCTION: LEGO1 0x10083db0 // FUNCTION: LEGO1 0x10083db0
void LegoCharacterManager::FUN_10083db0(LegoROI* p_roi) void LegoCharacterManager::FUN_10083db0(LegoROI* p_roi)
{ {

View file

@ -62,7 +62,7 @@ void LegoPhonemePresenter::StartingTickle()
LegoPhonemeListCursor cursor(phonemeList); LegoPhonemeListCursor cursor(phonemeList);
if (!cursor.Find(phoneme)) { if (!cursor.Find(phoneme)) {
LegoTextureInfo* textureInfo = TextureContainer()->AddToList(m_textureInfo); LegoTextureInfo* textureInfo = TextureContainer()->GetCached(m_textureInfo);
CharacterManager()->FUN_100849a0(entityROI, textureInfo); CharacterManager()->FUN_100849a0(entityROI, textureInfo);
@ -117,12 +117,53 @@ void LegoPhonemePresenter::PutFrame()
} }
} }
// STUB: LEGO1 0x1004e870 // FUNCTION: LEGO1 0x1004e870
// FUNCTION: BETA10 0x100c3c24
void LegoPhonemePresenter::EndAction() void LegoPhonemePresenter::EndAction()
{ {
// TODO
if (m_action != NULL) { if (m_action != NULL) {
MxFlcPresenter::EndAction(); MxFlcPresenter::EndAction();
LegoPhonemeList* phonemeList = VideoManager()->GetPhonemeList();
LegoPhoneme* phoneme = new LegoPhoneme(m_roiName.GetData(), 1);
LegoPhonemeListCursor cursor(phonemeList);
if (cursor.Find(phoneme)) {
LegoPhoneme* newPhoneme = phoneme;
cursor.Current(phoneme);
delete newPhoneme;
if (phoneme->VTable0x00() == 1) {
LegoROI* roi;
if (m_unk0x84) {
roi = FindROI(m_roiName.GetData());
}
else {
roi = CharacterManager()->GetROI(m_roiName.GetData(), TRUE);
}
if (roi != NULL) {
CharacterManager()->FUN_100849a0(roi, NULL);
}
if (!m_unk0x84) {
CharacterManager()->FUN_10083c30(m_roiName.GetData());
}
TextureContainer()->EraseCached(phoneme->VTable0x10());
TextureContainer()->EraseCached(phoneme->VTable0x08());
cursor.Destroy();
}
else {
phoneme->VTable0x04(phoneme->VTable0x00() - 1);
cursor.SetValue(phoneme);
}
if (!m_unk0x84) {
CharacterManager()->FUN_10083c30(m_roiName.GetData());
}
}
} }
} }

View file

@ -14,7 +14,7 @@ LegoTextureContainer::~LegoTextureContainer()
} }
// FUNCTION: LEGO1 0x100998e0 // FUNCTION: LEGO1 0x100998e0
LegoTextureInfo* LegoTextureContainer::AddToList(LegoTextureInfo* p_textureInfo) LegoTextureInfo* LegoTextureContainer::GetCached(LegoTextureInfo* p_textureInfo)
{ {
DDSURFACEDESC desc, newDesc; DDSURFACEDESC desc, newDesc;
DWORD width, height; DWORD width, height;
@ -27,7 +27,7 @@ LegoTextureInfo* LegoTextureContainer::AddToList(LegoTextureInfo* p_textureInfo)
p_textureInfo->m_surface->Unlock(desc.lpSurface); p_textureInfo->m_surface->Unlock(desc.lpSurface);
} }
for (LegoTextureList::iterator it = m_list.begin(); it != m_list.end(); it++) { for (LegoCachedTextureList::iterator it = m_cached.begin(); it != m_cached.end(); it++) {
if ((*it).second == FALSE && (*it).first->m_texture->AddRef() != 0 && (*it).first->m_texture->Release() == 1) { if ((*it).second == FALSE && (*it).first->m_texture->AddRef() != 0 && (*it).first->m_texture->Release() == 1) {
if (!strcmp((*it).first->m_name, p_textureInfo->m_name)) { if (!strcmp((*it).first->m_name, p_textureInfo->m_name)) {
LPDIRECTDRAWSURFACE surface = (*it).first->m_surface; LPDIRECTDRAWSURFACE surface = (*it).first->m_surface;
@ -92,7 +92,7 @@ LegoTextureInfo* LegoTextureContainer::AddToList(LegoTextureInfo* p_textureInfo)
} }
else { else {
textureInfo->m_texture->SetAppData((DWORD) textureInfo); textureInfo->m_texture->SetAppData((DWORD) textureInfo);
m_list.push_back(LegoTextureListElement(textureInfo, TRUE)); m_cached.push_back(LegoCachedTexture(textureInfo, TRUE));
textureInfo->m_texture->AddRef(); textureInfo->m_texture->AddRef();
@ -111,24 +111,24 @@ LegoTextureInfo* LegoTextureContainer::AddToList(LegoTextureInfo* p_textureInfo)
} }
// FUNCTION: LEGO1 0x10099cc0 // FUNCTION: LEGO1 0x10099cc0
void LegoTextureContainer::EraseFromList(LegoTextureInfo* p_textureInfo) void LegoTextureContainer::EraseCached(LegoTextureInfo* p_textureInfo)
{ {
if (p_textureInfo == NULL) { if (p_textureInfo == NULL) {
return; return;
} }
#ifdef COMPAT_MODE #ifdef COMPAT_MODE
LegoTextureList::iterator it; LegoCachedTextureList::iterator it;
for (it = m_list.begin(); it != m_list.end(); it++) { for (it = m_cached.begin(); it != m_cached.end(); it++) {
#else #else
for (LegoTextureList::iterator it = m_list.begin(); it != m_list.end(); it++) { for (LegoCachedTextureList::iterator it = m_cached.begin(); it != m_cached.end(); it++) {
#endif #endif
if ((*it).first == p_textureInfo) { if ((*it).first == p_textureInfo) {
(*it).second = FALSE; (*it).second = FALSE;
if (p_textureInfo->m_texture->Release() == TRUE) { if (p_textureInfo->m_texture->Release() == TRUE) {
delete p_textureInfo; delete p_textureInfo;
m_list.erase(it); m_cached.erase(it);
} }
return; return;

View file

@ -98,8 +98,8 @@ class LegoContainer {
// VTABLE: LEGO1 0x100d86d4 // VTABLE: LEGO1 0x100d86d4
// class LegoContainer<LegoTextureInfo> // class LegoContainer<LegoTextureInfo>
typedef pair<LegoTextureInfo*, BOOL> LegoTextureListElement; typedef pair<LegoTextureInfo*, BOOL> LegoCachedTexture;
typedef list<LegoTextureListElement> LegoTextureList; typedef list<LegoCachedTexture> LegoCachedTextureList;
// VTABLE: LEGO1 0x100d86fc // VTABLE: LEGO1 0x100d86fc
// SIZE 0x24 // SIZE 0x24
@ -108,11 +108,11 @@ class LegoTextureContainer : public LegoContainer<LegoTextureInfo> {
LegoTextureContainer() { m_ownership = TRUE; } LegoTextureContainer() { m_ownership = TRUE; }
~LegoTextureContainer() override; ~LegoTextureContainer() override;
LegoTextureInfo* AddToList(LegoTextureInfo* p_textureInfo); LegoTextureInfo* GetCached(LegoTextureInfo* p_textureInfo);
void EraseFromList(LegoTextureInfo* p_textureInfo); void EraseCached(LegoTextureInfo* p_textureInfo);
protected: protected:
LegoTextureList m_list; // 0x18 LegoCachedTextureList m_cached; // 0x18
}; };
// TEMPLATE: LEGO1 0x10059c50 // TEMPLATE: LEGO1 0x10059c50