diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 06d895be..7683b56b 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -14,6 +14,8 @@ #include "mxomnicreateparam.h" #include "mxticklemanager.h" +const char* g_current = "current"; + // 0x100f4588 MxAtomId* g_nocdSourceName = NULL; @@ -48,6 +50,13 @@ void LegoOmni::RemoveWorld(const MxAtomId& p1, MxLong p2) // TODO } +// OFFSET: LEGO1 0x1005b0c0 +LegoEntity* LegoOmni::FindByEntityIdOrAtomId(MxAtomId& p_atom, int p_entityid) +{ + // TODO + return NULL; +} + // OFFSET: LEGO1 0x1005b400 STUB int LegoOmni::GetCurrPathInfo(LegoPathBoundary**, int&) { @@ -383,18 +392,33 @@ MxResult LegoOmni::DeleteObject(MxDSAction& ds) return FAILURE; } -// OFFSET: LEGO1 0x1005b3c0 STUB +// OFFSET: LEGO1 0x1005b3c0 MxBool LegoOmni::DoesEntityExist(MxDSAction& ds) { - // TODO - return TRUE; + if (MxOmni::DoesEntityExist(ds)) { + if (FindByEntityIdOrAtomId(ds.GetAtomId(), ds.GetObjectId()) == NULL) { + return TRUE; + } + } + return FALSE; } -// OFFSET: LEGO1 0x1005b2f0 STUB -int LegoOmni::Vtable0x30(char*, int, MxCore*) +// OFFSET: LEGO1 0x1005b2f0 +LegoWorld* LegoOmni::Vtable0x30(const char* p_id, int p_entityId, MxCore* p_presenter) { - // TODO - return 0; + LegoWorld* foundEntity = NULL; + if (strcmpi(p_id, g_current)) { + foundEntity = (LegoWorld*) FindByEntityIdOrAtomId(MxAtomId(p_id, LookupMode_LowerCase2), p_entityId); + } + else { + foundEntity = this->m_currentWorld; + } + + if (foundEntity != NULL) { + foundEntity->VTable0x58(p_presenter); + } + + return foundEntity; } // OFFSET: LEGO1 0x1005b3a0 diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index b8b9c1d5..8e95c1b0 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -60,11 +60,13 @@ class LegoOmni : public MxOmni { virtual MxResult Start(MxDSAction* action) override; // vtable+20 virtual MxResult DeleteObject(MxDSAction& ds) override; // vtable+24 virtual MxBool DoesEntityExist(MxDSAction& ds) override; // vtable+28 - virtual int Vtable0x30(char*, int, MxCore*) override; // vtable+30 + virtual LegoWorld* Vtable0x30(const char* p_id, int p_entityId, MxCore* p_presenter) override; // vtable+30 virtual void NotifyCurrentEntity(MxNotificationParam* p_param) override; // vtable+34 virtual void StartTimer() override; // vtable+38 virtual void StopTimer() override; // vtable+3c + LegoEntity* FindByEntityIdOrAtomId(MxAtomId& p_atom, int p_entityid); + LegoVideoManager* GetVideoManager() { return (LegoVideoManager*) m_videoManager; } LegoSoundManager* GetSoundManager() { return (LegoSoundManager*) m_soundManager; } diff --git a/LEGO1/mxdiskstreamprovider.cpp b/LEGO1/mxdiskstreamprovider.cpp index b5dabe4a..0c422b99 100644 --- a/LEGO1/mxdiskstreamprovider.cpp +++ b/LEGO1/mxdiskstreamprovider.cpp @@ -81,7 +81,7 @@ MxResult MxDiskStreamProvider::WaitForWorkToComplete() return SUCCESS; } -// OFFSET: LEGO1 0x100d1760 STUB +// OFFSET: LEGO1 0x100d18f0 STUB void MxDiskStreamProvider::PerformWork() { // TODO