Match LegoOmni::Create(), other BETA10 matches (#1651)

* Match `LegoOmni::Create()`, other BETA10 matches

---------

Co-authored-by: jonschz <jonschz@users.noreply.github.com>
This commit is contained in:
jonschz
2025-07-25 17:13:34 +02:00
committed by GitHub
parent 2451b041f6
commit 03adac0c58
23 changed files with 187 additions and 42 deletions

View File

@@ -58,7 +58,8 @@ public:
// FUNCTION: LEGO1 0x1002f930 // FUNCTION: LEGO1 0x1002f930
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
{ {
// not in BETA10 // While this class exists in BETA10, it didn't have a ClassName().
// The constructor suggests that it did not inherit from MxCore back then and did not have a VTABLE.
// STRING: LEGO1 0x100f37d0 // STRING: LEGO1 0x100f37d0
return "LegoBuildingManager"; return "LegoBuildingManager";
} }

View File

@@ -109,6 +109,7 @@ public:
} }
// FUNCTION: LEGO1 0x10058ab0 // FUNCTION: LEGO1 0x10058ab0
// FUNCTION: BETA10 0x1008f860
MxBool IsA(const char* p_name) const override // vtable+0x10 MxBool IsA(const char* p_name) const override // vtable+0x10
{ {
return !strcmp(p_name, LegoOmni::ClassName()) || MxOmni::IsA(p_name); return !strcmp(p_name, LegoOmni::ClassName()) || MxOmni::IsA(p_name);
@@ -148,9 +149,14 @@ public:
// FUNCTION: BETA10 0x1009e7a0 // FUNCTION: BETA10 0x1009e7a0
LegoInputManager* GetInputManager() { return m_inputManager; } LegoInputManager* GetInputManager() { return m_inputManager; }
// FUNCTION: BETA10 0x100e5400
LegoTextureContainer* GetTextureContainer() { return m_textureContainer; } LegoTextureContainer* GetTextureContainer() { return m_textureContainer; }
ViewLODListManager* GetViewLODListManager() { return m_viewLODListManager; } ViewLODListManager* GetViewLODListManager() { return m_viewLODListManager; }
// FUNCTION: BETA10 0x100969b0
LegoWorld* GetCurrentWorld() { return m_currentWorld; } LegoWorld* GetCurrentWorld() { return m_currentWorld; }
LegoNavController* GetNavController() { return m_navController; } LegoNavController* GetNavController() { return m_navController; }
LegoPathActor* GetUserActor() { return m_userActor; } LegoPathActor* GetUserActor() { return m_userActor; }
@@ -186,6 +192,7 @@ public:
void CloseMainWindow() { PostMessage(m_windowHandle, WM_CLOSE, 0, 0); } void CloseMainWindow() { PostMessage(m_windowHandle, WM_CLOSE, 0, 0); }
// SYNTHETIC: LEGO1 0x10058b30 // SYNTHETIC: LEGO1 0x10058b30
// SYNTHETIC: BETA10 0x1008f8d0
// LegoOmni::`scalar deleting destructor' // LegoOmni::`scalar deleting destructor'
private: private:

View File

@@ -32,7 +32,7 @@ public:
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
{ {
// While this class exists in BETA10, it didn't have a ClassName(). // While this class exists in BETA10, it didn't have a ClassName().
// I suppose it did not inherit from MxCore back then and likely did not have a VTABLE. // The constructor suggests that it did not inherit from MxCore back then and did not have a VTABLE.
// STRING: LEGO1 0x100f318c // STRING: LEGO1 0x100f318c
return "LegoPlantManager"; return "LegoPlantManager";
} }

View File

@@ -20,6 +20,7 @@ class Renderer;
} }
// VTABLE: LEGO1 0x100d9c88 // VTABLE: LEGO1 0x100d9c88
// VTABLE: BETA10 0x101bef08
// SIZE 0x590 // SIZE 0x590
class LegoVideoManager : public MxVideoManager { class LegoVideoManager : public MxVideoManager {
public: public:
@@ -41,6 +42,7 @@ public:
virtual MxPresenter* GetPresenterAt(MxS32 p_x, MxS32 p_y); // vtable+0x38 virtual MxPresenter* GetPresenterAt(MxS32 p_x, MxS32 p_y); // vtable+0x38
// FUNCTION: LEGO1 0x1007ab10 // FUNCTION: LEGO1 0x1007ab10
// FUNCTION: BETA10 0x100d8010
virtual LegoPhonemeList* GetPhonemeList() { return m_phonemeRefList; } // vtable+0x3c virtual LegoPhonemeList* GetPhonemeList() { return m_phonemeRefList; } // vtable+0x3c
void SetSkyColor(float p_red, float p_green, float p_blue); void SetSkyColor(float p_red, float p_green, float p_blue);
@@ -67,6 +69,10 @@ public:
void SetUnk0x554(MxBool p_unk0x554) { m_unk0x554 = p_unk0x554; } void SetUnk0x554(MxBool p_unk0x554) { m_unk0x554 = p_unk0x554; }
// SYNTHETIC: LEGO1 0x1007ab20
// SYNTHETIC: BETA10 0x100d8040
// LegoVideoManager::`scalar deleting destructor'
private: private:
MxResult CreateDirect3D(); MxResult CreateDirect3D();
MxResult ConfigureD3DRM(); MxResult ConfigureD3DRM();
@@ -122,7 +128,4 @@ private:
DWORD m_bufferCount; // 0x58c DWORD m_bufferCount; // 0x58c
}; };
// SYNTHETIC: LEGO1 0x1007ab20
// LegoVideoManager::`scalar deleting destructor'
#endif // LEGOVIDEOMANAGER_H #endif // LEGOVIDEOMANAGER_H

View File

@@ -16,12 +16,15 @@ class LegoWorld;
// class MxPtrList<LegoWorld> // class MxPtrList<LegoWorld>
// VTABLE: LEGO1 0x100d8680 // VTABLE: LEGO1 0x100d8680
// VTABLE: BETA10 0x101bc900
// SIZE 0x18 // SIZE 0x18
class LegoWorldList : public MxPtrList<LegoWorld> { class LegoWorldList : public MxPtrList<LegoWorld> {
public: public:
// FUNCTION: BETA10 0x10092ce0
LegoWorldList(MxBool p_ownership = FALSE) : MxPtrList<LegoWorld>(p_ownership) {} LegoWorldList(MxBool p_ownership = FALSE) : MxPtrList<LegoWorld>(p_ownership) {}
// FUNCTION: LEGO1 0x100598d0 // FUNCTION: LEGO1 0x100598d0
// FUNCTION: BETA10 0x10092d80
MxS8 Compare(LegoWorld* p_a, LegoWorld* p_b) override { return p_a == p_b ? 0 : p_a < p_b ? -1 : 1; } // vtable+0x14 MxS8 Compare(LegoWorld* p_a, LegoWorld* p_b) override { return p_a == p_b ? 0 : p_a < p_b ? -1 : 1; } // vtable+0x14
// SYNTHETIC: LEGO1 0x10059a00 // SYNTHETIC: LEGO1 0x10059a00

View File

@@ -15,6 +15,7 @@
DECOMP_SIZE_ASSERT(MxBackgroundAudioManager, 0x150) DECOMP_SIZE_ASSERT(MxBackgroundAudioManager, 0x150)
// FUNCTION: LEGO1 0x1007ea90 // FUNCTION: LEGO1 0x1007ea90
// FUNCTION: BETA10 0x100e8530
MxBackgroundAudioManager::MxBackgroundAudioManager() MxBackgroundAudioManager::MxBackgroundAudioManager()
{ {
NotificationManager()->Register(this); NotificationManager()->Register(this);

View File

@@ -47,6 +47,7 @@ MxU8 g_buildingInfoDownshift[16] = {
}; };
// GLOBAL: LEGO1 0x100f3478 // GLOBAL: LEGO1 0x100f3478
// GLOBAL: BETA10 0x101e4d78
LegoBuildingInfo g_buildingInfoInit[16] = { LegoBuildingInfo g_buildingInfoInit[16] = {
{ {
NULL, "infocen", NULL, "infocen",
@@ -236,8 +237,11 @@ void LegoBuildingManager::configureLegoBuildingManager(MxS32 p_buildingManagerCo
} }
// FUNCTION: LEGO1 0x1002f8c0 // FUNCTION: LEGO1 0x1002f8c0
// FUNCTION: BETA10 0x10063a30
LegoBuildingManager::LegoBuildingManager() LegoBuildingManager::LegoBuildingManager()
{ {
// Note that Init() is inlined in BETA10 and the class did not inherit from MxCore,
// so the BETA10 match is much better on Init().
Init(); Init();
} }
@@ -247,6 +251,7 @@ LegoBuildingManager::~LegoBuildingManager()
delete[] g_customizeAnimFile; delete[] g_customizeAnimFile;
} }
// // FUNCTION: BETA10 0x10063a30 -- see the constructor
// FUNCTION: LEGO1 0x1002f9d0 // FUNCTION: LEGO1 0x1002f9d0
void LegoBuildingManager::Init() void LegoBuildingManager::Init()
{ {

View File

@@ -60,8 +60,11 @@ char* LegoPlantManager::g_customizeAnimFile = NULL;
LegoPlantInfo g_plantInfo[81]; LegoPlantInfo g_plantInfo[81];
// FUNCTION: LEGO1 0x10026220 // FUNCTION: LEGO1 0x10026220
// FUNCTION: BETA10 0x100c4f90
LegoPlantManager::LegoPlantManager() LegoPlantManager::LegoPlantManager()
{ {
// Note that Init() is inlined in BETA10 and the class did not inherit from MxCore,
// so the BETA10 match is much better on Init().
Init(); Init();
} }
@@ -72,12 +75,10 @@ LegoPlantManager::~LegoPlantManager()
delete[] g_customizeAnimFile; delete[] g_customizeAnimFile;
} }
// // FUNCTION: BETA10 0x100c4f90 -- see the constructor
// FUNCTION: LEGO1 0x10026330 // FUNCTION: LEGO1 0x10026330
// FUNCTION: BETA10 0x100c4f90
void LegoPlantManager::Init() void LegoPlantManager::Init()
{ {
// In BETA10 this appears to be LegoPlantManager::LegoPlantManager()
for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) {
g_plantInfo[i] = g_plantInfoInit[i]; g_plantInfo[i] = g_plantInfoInit[i];
} }

View File

@@ -127,8 +127,10 @@ LegoBuildingManager* BuildingManager()
} }
// FUNCTION: LEGO1 0x10015800 // FUNCTION: LEGO1 0x10015800
// FUNCTION: BETA10 0x100e4bb7
LegoTextureContainer* TextureContainer() LegoTextureContainer* TextureContainer()
{ {
assert(LegoOmni::GetInstance());
return LegoOmni::GetInstance()->GetTextureContainer(); return LegoOmni::GetInstance()->GetTextureContainer();
} }

View File

@@ -18,6 +18,7 @@ DECOMP_SIZE_ASSERT(MxTransitionManager, 0x900)
RECT g_fullScreenRect = {0, 0, 640, 480}; RECT g_fullScreenRect = {0, 0, 640, 480};
// FUNCTION: LEGO1 0x1004b8d0 // FUNCTION: LEGO1 0x1004b8d0
// FUNCTION: BETA10 0x100ec2c0
MxTransitionManager::MxTransitionManager() MxTransitionManager::MxTransitionManager()
{ {
m_animationTimer = 0; m_animationTimer = 0;

View File

@@ -14,6 +14,7 @@ DECOMP_SIZE_ASSERT(LegoControlManagerNotificationParam, 0x2c)
DECOMP_SIZE_ASSERT(LegoEventNotificationParam, 0x20) DECOMP_SIZE_ASSERT(LegoEventNotificationParam, 0x20)
// FUNCTION: LEGO1 0x10028520 // FUNCTION: LEGO1 0x10028520
// STUB: BETA10 0x1008ae50
LegoControlManager::LegoControlManager() LegoControlManager::LegoControlManager()
{ {
m_presenterList = NULL; m_presenterList = NULL;

View File

@@ -26,6 +26,7 @@ const char* g_clickedAtom = NULL;
MxBool g_unk0x100f67b8 = TRUE; MxBool g_unk0x100f67b8 = TRUE;
// FUNCTION: LEGO1 0x1005b790 // FUNCTION: LEGO1 0x1005b790
// STUB: BETA10 0x10088a8e
LegoInputManager::LegoInputManager() LegoInputManager::LegoInputManager()
{ {
m_keyboardNotifyList = NULL; m_keyboardNotifyList = NULL;
@@ -59,11 +60,13 @@ LegoInputManager::~LegoInputManager()
} }
// FUNCTION: LEGO1 0x1005b960 // FUNCTION: LEGO1 0x1005b960
// STUB: BETA10 0x10088c9c
MxResult LegoInputManager::Create(HWND p_hwnd) MxResult LegoInputManager::Create(HWND p_hwnd)
{ {
MxResult result = SUCCESS; MxResult result = SUCCESS;
m_controlManager = new LegoControlManager; m_controlManager = new LegoControlManager;
assert(m_controlManager);
if (!m_keyboardNotifyList) { if (!m_keyboardNotifyList) {
m_keyboardNotifyList = new LegoNotifyList; m_keyboardNotifyList = new LegoNotifyList;

View File

@@ -38,6 +38,7 @@ DECOMP_SIZE_ASSERT(LegoWorldList, 0x18)
DECOMP_SIZE_ASSERT(LegoWorldListCursor, 0x10) DECOMP_SIZE_ASSERT(LegoWorldListCursor, 0x10)
// GLOBAL: LEGO1 0x100f6718 // GLOBAL: LEGO1 0x100f6718
// GLOBAL: BETA10 0x101ee748
// STRING: LEGO1 0x100f6710 // STRING: LEGO1 0x100f6710
const char* g_current = "current"; const char* g_current = "current";
@@ -48,12 +49,14 @@ LegoOmni::LegoOmni()
} }
// FUNCTION: LEGO1 0x10058b50 // FUNCTION: LEGO1 0x10058b50
// FUNCTION: BETA10 0x1008d128
LegoOmni::~LegoOmni() LegoOmni::~LegoOmni()
{ {
Destroy(); Destroy();
} }
// FUNCTION: LEGO1 0x10058bd0 // FUNCTION: LEGO1 0x10058bd0
// FUNCTION: BETA10 0x1008d1b4
void LegoOmni::Init() void LegoOmni::Init()
{ {
MxOmni::Init(); MxOmni::Init();
@@ -76,6 +79,7 @@ void LegoOmni::Init()
} }
// FUNCTION: LEGO1 0x10058c30 // FUNCTION: LEGO1 0x10058c30
// STUB: BETA10 0x1008d299
void LegoOmni::Destroy() void LegoOmni::Destroy()
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
@@ -151,6 +155,13 @@ void LegoOmni::Destroy()
MxOmni::Destroy(); MxOmni::Destroy();
} }
#ifdef BETA10
// FUNCTION: BETA10 0x100d4e5e
void EmptyFunction(int p_unknown)
{
}
#endif
// FUNCTION: LEGO1 0x10058e70 // FUNCTION: LEGO1 0x10058e70
// FUNCTION: BETA10 0x1008d6bf // FUNCTION: BETA10 0x1008d6bf
MxResult LegoOmni::Create(MxOmniCreateParam& p_param) MxResult LegoOmni::Create(MxOmniCreateParam& p_param)
@@ -170,40 +181,67 @@ MxResult LegoOmni::Create(MxOmniCreateParam& p_param)
if (MxOmni::Create(p_param) != SUCCESS) { if (MxOmni::Create(p_param) != SUCCESS) {
goto done; goto done;
} }
// LINE: BETA10 0x1008d7fa
if (!(m_objectFactory = new LegoObjectFactory())) { if (!(m_objectFactory = new LegoObjectFactory())) {
goto done; goto done;
} }
// LINE: BETA10 0x1008d882
if (!(m_soundManager = new LegoSoundManager()) || m_soundManager->Create(10, 0) != SUCCESS) { if (!(m_soundManager = new LegoSoundManager()) || m_soundManager->Create(10, 0) != SUCCESS) {
delete m_soundManager; delete m_soundManager;
m_soundManager = NULL; m_soundManager = NULL;
goto done; goto done;
} }
// LINE: BETA10 0x1008d990
if (!(m_videoManager = new LegoVideoManager()) || if (!(m_videoManager = new LegoVideoManager()) ||
m_videoManager->Create(p_param.GetVideoParam(), 100, 0) != SUCCESS) { m_videoManager->Create(p_param.GetVideoParam(), 100, 0) != SUCCESS) {
delete m_videoManager; delete m_videoManager;
m_videoManager = NULL; m_videoManager = NULL;
goto done; goto done;
} }
// LINE: BETA10 0x1008daa7
if (!(m_inputManager = new LegoInputManager()) || m_inputManager->Create(p_param.GetWindowHandle()) != SUCCESS) { if (!(m_inputManager = new LegoInputManager()) || m_inputManager->Create(p_param.GetWindowHandle()) != SUCCESS) {
delete m_inputManager; delete m_inputManager;
m_inputManager = NULL; m_inputManager = NULL;
goto done; goto done;
} }
// LINE: BETA10 0x1008dbdb
m_viewLODListManager = new ViewLODListManager(); m_viewLODListManager = new ViewLODListManager();
// LINE: BETA10 0x1008dc32
m_textureContainer = new LegoTextureContainer(); m_textureContainer = new LegoTextureContainer();
#ifndef BETA10
m_textureContainer->SetOwnership(FALSE); m_textureContainer->SetOwnership(FALSE);
#else
// One more class is instantiated here in BETA10 that we don't find in LEGO1.
// Based on `LegoOmni::getTextureContainer()` we know that `LegoTextureContainer` is at LegoOmni's offset 0x230,
// so the first instantiation is `LegoTextureContainer` and the second one is the unknown one.
// We repeat the initialisation of LegoTextureContainer for the sake of a structural match,
// even though it is wrong semantically.
// LINE: BETA10 0x1008dc89
m_textureContainer = new LegoTextureContainer();
// Something else happens here starting at BETA10 0x1008dcdd that has not been decompiled.
// It involves external calls, bit manipulation, and two globals.
// Those appear to involve classes that are either not present in LEGO1 or we have the wrong names for them
// (like LegoMaterialCache).
#endif
// LINE: BETA10 0x1008dd17
LegoPathController::Init(); LegoPathController::Init();
m_characterManager = new LegoCharacterManager(); m_characterManager = new LegoCharacterManager();
m_plantManager = new LegoPlantManager(); m_plantManager = new LegoPlantManager();
// LINE: BETA10 0x1008ddca
m_animationManager = new LegoAnimationManager(); m_animationManager = new LegoAnimationManager();
m_buildingManager = new LegoBuildingManager(); m_buildingManager = new LegoBuildingManager();
// LINE: BETA10 0x1008de7b
m_gameState = new LegoGameState(); m_gameState = new LegoGameState();
// LINE: BETA10 0x1008ded5
m_worldList = new LegoWorldList(TRUE); m_worldList = new LegoWorldList(TRUE);
if (!m_viewLODListManager || !m_textureContainer || !m_worldList || !m_characterManager || !m_plantManager || if (!m_viewLODListManager || !m_textureContainer || !m_worldList || !m_characterManager || !m_plantManager ||
@@ -211,56 +249,83 @@ MxResult LegoOmni::Create(MxOmniCreateParam& p_param)
goto done; goto done;
} }
MxVariable* variable; MxVariable *visibilityVar, *cameraLocationVar, *cursorVar, *whoAmIVar, *debugVar;
// LINE: BETA10 0x1008dfbd
if (!(variable = new VisibilityVariable())) { visibilityVar = new VisibilityVariable();
if (!visibilityVar) {
goto done; goto done;
} }
m_variableTable->SetVariable(variable); m_variableTable->SetVariable(visibilityVar);
if (!(variable = new CameraLocationVariable())) { // LINE: BETA10 0x1008e031
cameraLocationVar = new CameraLocationVariable();
if (!cameraLocationVar) {
goto done; goto done;
} }
m_variableTable->SetVariable(variable); m_variableTable->SetVariable(cameraLocationVar);
if (!(variable = new CursorVariable())) { // LINE: BETA10 0x1008e0a5
cursorVar = new CursorVariable();
if (!cursorVar) {
goto done; goto done;
} }
m_variableTable->SetVariable(variable); m_variableTable->SetVariable(cursorVar);
if (!(variable = new WhoAmIVariable())) { // LINE: BETA10 0x1008e119
whoAmIVar = new WhoAmIVariable();
if (!whoAmIVar) {
goto done; goto done;
} }
m_variableTable->SetVariable(variable); m_variableTable->SetVariable(whoAmIVar);
#ifdef BETA10
debugVar = new DebugVariable();
if (!debugVar) {
goto done;
}
m_variableTable->SetVariable(debugVar);
#endif
// LINE: BETA10 0x1008e201
CreateScripts(); CreateScripts();
#ifndef BETA10
IslePathActor::RegisterSpawnLocations(); IslePathActor::RegisterSpawnLocations();
result = RegisterWorlds(); result = RegisterWorlds();
if (result != SUCCESS) { if (result != SUCCESS) {
goto done; goto done;
} }
#endif
if (!(m_bkgAudioManager = new MxBackgroundAudioManager())) { // LINE: BETA10 0x1008e206
m_bkgAudioManager = new MxBackgroundAudioManager();
if (!m_bkgAudioManager) {
goto done; goto done;
} }
if (!(m_transitionManager = new MxTransitionManager())) { // LINE: BETA10 0x1008e27d
goto done; m_transitionManager = new MxTransitionManager();
if (m_transitionManager) {
if (m_transitionManager->GetDDrawSurfaceFromVideoManager() != SUCCESS) {
goto done;
}
#ifdef BETA10
NotificationManager()->Register(this);
EmptyFunction(0);
#else
m_notificationManager->Register(this);
SetAppCursor(e_cursorBusy);
m_gameState->SetCurrentAct(LegoGameState::e_act1);
#endif
result = SUCCESS;
} }
if (m_transitionManager->GetDDrawSurfaceFromVideoManager() != SUCCESS) {
goto done;
}
m_notificationManager->Register(this);
SetAppCursor(e_cursorBusy);
m_gameState->SetCurrentAct(LegoGameState::e_act1);
result = SUCCESS;
done: done:
return result; return result;
// LINE: BETA10 0x1008e35d
} }
// FUNCTION: LEGO1 0x1005a5f0 // FUNCTION: LEGO1 0x1005a5f0
@@ -375,6 +440,7 @@ LegoWorld* LegoOmni::FindWorld(const MxAtomId& p_atom, MxS32 p_entityid)
} }
// FUNCTION: LEGO1 0x1005b1d0 // FUNCTION: LEGO1 0x1005b1d0
// STUB: BETA10 0x1008e93e
void LegoOmni::DeleteObject(MxDSAction& p_dsAction) void LegoOmni::DeleteObject(MxDSAction& p_dsAction)
{ {
if (p_dsAction.GetAtomId().GetInternal() != NULL) { if (p_dsAction.GetAtomId().GetInternal() != NULL) {
@@ -427,15 +493,16 @@ LegoROI* LegoOmni::FindROI(const char* p_name)
} }
// FUNCTION: LEGO1 0x1005b2f0 // FUNCTION: LEGO1 0x1005b2f0
// FUNCTION: BETA10 0x1008eb66
MxEntity* LegoOmni::AddToWorld(const char* p_id, MxS32 p_entityId, MxPresenter* p_presenter) MxEntity* LegoOmni::AddToWorld(const char* p_id, MxS32 p_entityId, MxPresenter* p_presenter)
{ {
LegoWorld* world = NULL; LegoWorld* world;
if (strcmpi(p_id, g_current)) { if (strcmpi(p_id, g_current)) {
world = FindWorld(MxAtomId(p_id, e_lowerCase2), p_entityId); world = FindWorld(MxAtomId(p_id, e_lowerCase2), p_entityId);
} }
else { else {
world = this->m_currentWorld; world = GetCurrentWorld();
} }
if (world != NULL) { if (world != NULL) {
@@ -446,14 +513,17 @@ MxEntity* LegoOmni::AddToWorld(const char* p_id, MxS32 p_entityId, MxPresenter*
} }
// FUNCTION: LEGO1 0x1005b3a0 // FUNCTION: LEGO1 0x1005b3a0
// FUNCTION: BETA10 0x1008ec27
void LegoOmni::NotifyCurrentEntity(const MxNotificationParam& p_param) void LegoOmni::NotifyCurrentEntity(const MxNotificationParam& p_param)
{ {
if (m_currentWorld) { LegoWorld* currentWorld = GetCurrentWorld();
NotificationManager()->Send(m_currentWorld, p_param); if (currentWorld) {
NotificationManager()->Send(currentWorld, p_param);
} }
} }
// FUNCTION: LEGO1 0x1005b3c0 // FUNCTION: LEGO1 0x1005b3c0
// FUNCTION: BETA10 0x1008ec72
MxBool LegoOmni::DoesEntityExist(MxDSAction& p_dsAction) MxBool LegoOmni::DoesEntityExist(MxDSAction& p_dsAction)
{ {
if (MxOmni::DoesEntityExist(p_dsAction)) { if (MxOmni::DoesEntityExist(p_dsAction)) {
@@ -559,12 +629,19 @@ void LegoOmni::CreateBackgroundAudio()
} }
// FUNCTION: LEGO1 0x1005b580 // FUNCTION: LEGO1 0x1005b580
// FUNCTION: BETA10 0x1008f7e0
MxResult LegoOmni::Start(MxDSAction* p_dsAction) MxResult LegoOmni::Start(MxDSAction* p_dsAction)
{ {
MxResult result = MxOmni::Start(p_dsAction); MxResult result = MxOmni::Start(p_dsAction);
#ifdef BETA10
this->m_action = *p_dsAction;
#else
// TODO: This is likely an inlined `MxDsAction::operator=`, see the BETA10 code.
// As of this commit, the operator is not inlined automatically.
this->m_action.SetAtomId(p_dsAction->GetAtomId()); this->m_action.SetAtomId(p_dsAction->GetAtomId());
this->m_action.SetObjectId(p_dsAction->GetObjectId()); this->m_action.SetObjectId(p_dsAction->GetObjectId());
this->m_action.SetUnknown24(p_dsAction->GetUnknown24()); this->m_action.SetUnknown24(p_dsAction->GetUnknown24());
#endif
return result; return result;
} }

View File

@@ -91,6 +91,7 @@ MxAtomId* g_creditsScript = NULL;
MxAtomId* g_nocdSourceName = NULL; MxAtomId* g_nocdSourceName = NULL;
// FUNCTION: LEGO1 0x100528e0 // FUNCTION: LEGO1 0x100528e0
// STUB: BETA10 0x100f6133
void CreateScripts() void CreateScripts()
{ {
g_copterScript = new MxAtomId("\\lego\\scripts\\build\\copter", e_lowerCase2); g_copterScript = new MxAtomId("\\lego\\scripts\\build\\copter", e_lowerCase2);

View File

@@ -4,6 +4,8 @@
#include "misc/legocontainer.h" #include "misc/legocontainer.h"
#include "mxdsaction.h" #include "mxdsaction.h"
#include <assert.h>
DECOMP_SIZE_ASSERT(LegoFlcTexturePresenter, 0x70) DECOMP_SIZE_ASSERT(LegoFlcTexturePresenter, 0x70)
// FUNCTION: LEGO1 0x1005de80 // FUNCTION: LEGO1 0x1005de80
@@ -27,11 +29,14 @@ void LegoFlcTexturePresenter::StartingTickle()
char* pp; char* pp;
char extraCopy[128]; char extraCopy[128];
m_action->GetExtra(extraLength, pp); m_action->GetExtra(extraLength, pp);
assert(pp);
if (pp != NULL) { if (pp != NULL) {
strcpy(extraCopy, pp); strcpy(extraCopy, pp);
strcat(extraCopy, ".gif"); strcat(extraCopy, ".gif");
m_texture = TextureContainer()->Get(extraCopy); LegoTextureContainer* textureContainer = TextureContainer();
assert(textureContainer);
m_texture = textureContainer->Get(extraCopy);
} }
MxFlcPresenter::StartingTickle(); MxFlcPresenter::StartingTickle();

View File

@@ -26,6 +26,7 @@ DECOMP_SIZE_ASSERT(MxStopWatch, 0x18)
DECOMP_SIZE_ASSERT(MxFrequencyMeter, 0x20) DECOMP_SIZE_ASSERT(MxFrequencyMeter, 0x20)
// FUNCTION: LEGO1 0x1007aa20 // FUNCTION: LEGO1 0x1007aa20
// FUNCTION: BETA10 0x100d5a00
LegoVideoManager::LegoVideoManager() LegoVideoManager::LegoVideoManager()
{ {
m_renderer = NULL; m_renderer = NULL;
@@ -286,12 +287,15 @@ void LegoVideoManager::ToggleFPS(MxBool p_visible)
} }
// FUNCTION: LEGO1 0x1007b770 // FUNCTION: LEGO1 0x1007b770
// STUB: BETA10 0x100d69cc
MxResult LegoVideoManager::Tickle() MxResult LegoVideoManager::Tickle()
{ {
#ifndef BETA10
if (m_unk0x554 && !m_videoParam.Flags().GetFlipSurfaces() && if (m_unk0x554 && !m_videoParam.Flags().GetFlipSurfaces() &&
TransitionManager()->GetTransitionType() == MxTransitionManager::e_idle) { TransitionManager()->GetTransitionType() == MxTransitionManager::e_idle) {
Sleep(30); Sleep(30);
} }
#endif
m_stopWatch->Stop(); m_stopWatch->Stop();
m_elapsedSeconds = m_stopWatch->ElapsedSeconds(); m_elapsedSeconds = m_stopWatch->ElapsedSeconds();
@@ -514,6 +518,7 @@ void LegoVideoManager::DrawFPS()
} }
// FUNCTION: LEGO1 0x1007c080 // FUNCTION: LEGO1 0x1007c080
// FUNCTION: BETA10 0x100d6d28
MxPresenter* LegoVideoManager::GetPresenterAt(MxS32 p_x, MxS32 p_y) MxPresenter* LegoVideoManager::GetPresenterAt(MxS32 p_x, MxS32 p_y)
{ {
MxPresenterListCursor cursor(m_presenters); MxPresenterListCursor cursor(m_presenters);
@@ -551,6 +556,7 @@ MxPresenter* LegoVideoManager::GetPresenterByActionObjectName(const char* p_acti
} }
// FUNCTION: LEGO1 0x1007c290 // FUNCTION: LEGO1 0x1007c290
// FUNCTION: BETA10 0x100d731e
MxResult LegoVideoManager::RealizePalette(MxPalette* p_pallete) MxResult LegoVideoManager::RealizePalette(MxPalette* p_pallete)
{ {
if (p_pallete && m_videoParam.GetPalette()) { if (p_pallete && m_videoParam.GetPalette()) {
@@ -652,6 +658,7 @@ void LegoVideoManager::OverrideSkyColor(MxBool p_shouldOverride)
} }
// FUNCTION: LEGO1 0x1007c4d0 // FUNCTION: LEGO1 0x1007c4d0
// FUNCTION: BETA10 0x100d77d3
void LegoVideoManager::UpdateView(MxU32 p_x, MxU32 p_y, MxU32 p_width, MxU32 p_height) void LegoVideoManager::UpdateView(MxU32 p_x, MxU32 p_y, MxU32 p_width, MxU32 p_height)
{ {
if (p_width == 0) { if (p_width == 0) {

View File

@@ -122,6 +122,10 @@ public:
LegoTextureInfo* GetCached(LegoTextureInfo* p_textureInfo); LegoTextureInfo* GetCached(LegoTextureInfo* p_textureInfo);
void EraseCached(LegoTextureInfo* p_textureInfo); void EraseCached(LegoTextureInfo* p_textureInfo);
// Verified by LegoOmni::Create(), even though there have been significant changes.
// SYNTHETIC: BETA10 0x10093ea0
// LegoTextureContainer::LegoTextureContainer
protected: protected:
LegoCachedTextureList m_cached; // 0x18 LegoCachedTextureList m_cached; // 0x18
}; };

View File

@@ -780,6 +780,9 @@
// LIBRARY: BETA10 0x100fa200 // LIBRARY: BETA10 0x100fa200
// strcpy // strcpy
// LIBRARY: BETA10 0x100fa210
// strcat
// LIBRARY: BETA10 0x100f8a88 // LIBRARY: BETA10 0x100f8a88
// ??2@YAPAXI@Z // ??2@YAPAXI@Z

View File

@@ -24,6 +24,7 @@ class MxVariableTable;
class MxVideoManager; class MxVideoManager;
// VTABLE: LEGO1 0x100dc168 // VTABLE: LEGO1 0x100dc168
// VTABLE: BETA10 0x101c1c40
// SIZE 0x68 // SIZE 0x68
class MxOmni : public MxCore { class MxOmni : public MxCore {
public: public:
@@ -96,6 +97,7 @@ public:
MxLong HandleEndAction(MxParam& p_param); MxLong HandleEndAction(MxParam& p_param);
// SYNTHETIC: LEGO1 0x100aefd0 // SYNTHETIC: LEGO1 0x100aefd0
// SYNTHETIC: BETA10 0x10130c90
// MxOmni::`scalar deleting destructor' // MxOmni::`scalar deleting destructor'
protected: protected:

View File

@@ -23,8 +23,13 @@ public:
MxOmniCreateFlags& CreateFlags() { return this->m_createFlags; } MxOmniCreateFlags& CreateFlags() { return this->m_createFlags; }
const MxString& GetMediaPath() const { return m_mediaPath; } const MxString& GetMediaPath() const { return m_mediaPath; }
// FUNCTION: BETA10 0x10092c50
const HWND GetWindowHandle() const { return m_windowHandle; } const HWND GetWindowHandle() const { return m_windowHandle; }
// FUNCTION: BETA10 0x10092c80
MxVideoParam& GetVideoParam() { return m_videoParam; } MxVideoParam& GetVideoParam() { return m_videoParam; }
const MxVideoParam& GetVideoParam() const { return m_videoParam; } const MxVideoParam& GetVideoParam() const { return m_videoParam; }
// SYNTHETIC: LEGO1 0x100b0a70 // SYNTHETIC: LEGO1 0x100b0a70

View File

@@ -37,23 +37,27 @@ MxOmni::MxOmni()
} }
// FUNCTION: LEGO1 0x100aefb0 // FUNCTION: LEGO1 0x100aefb0
// FUNCTION: BETA10 0x10130c50
MxEntity* MxOmni::AddToWorld(const char*, MxS32, MxPresenter*) MxEntity* MxOmni::AddToWorld(const char*, MxS32, MxPresenter*)
{ {
return NULL; return NULL;
} }
// FUNCTION: LEGO1 0x100aefc0 // FUNCTION: LEGO1 0x100aefc0
// FUNCTION: BETA10 0x10130c70
void MxOmni::NotifyCurrentEntity(const MxNotificationParam& p_param) void MxOmni::NotifyCurrentEntity(const MxNotificationParam& p_param)
{ {
} }
// FUNCTION: LEGO1 0x100aeff0 // FUNCTION: LEGO1 0x100aeff0
// STUB: BETA10 0x1012f2b7
MxOmni::~MxOmni() MxOmni::~MxOmni()
{ {
Destroy(); Destroy();
} }
// FUNCTION: LEGO1 0x100af080 // FUNCTION: LEGO1 0x100af080
// FUNCTION: BETA10 0x1012f359
void MxOmni::Init() void MxOmni::Init()
{ {
m_windowHandle = NULL; m_windowHandle = NULL;
@@ -81,6 +85,8 @@ void MxOmni::SetInstance(MxOmni* p_instance)
// FUNCTION: BETA10 0x1012f3ff // FUNCTION: BETA10 0x1012f3ff
MxResult MxOmni::Create(MxOmniCreateParam& p_param) MxResult MxOmni::Create(MxOmniCreateParam& p_param)
{ {
// TODO: File name is MxMain.cpp according to BETA10
MxResult result = FAILURE; MxResult result = FAILURE;
if (!(m_atomSet = new MxAtomSet())) { if (!(m_atomSet = new MxAtomSet())) {
@@ -223,6 +229,7 @@ void MxOmni::Destroy()
} }
// FUNCTION: LEGO1 0x100b0090 // FUNCTION: LEGO1 0x100b0090
// STUB: BETA10 0x101303ce
MxResult MxOmni::Start(MxDSAction* p_dsAction) MxResult MxOmni::Start(MxDSAction* p_dsAction)
{ {
MxResult result = FAILURE; MxResult result = FAILURE;
@@ -234,6 +241,7 @@ MxResult MxOmni::Start(MxDSAction* p_dsAction)
} }
// FUNCTION: LEGO1 0x100b00c0 // FUNCTION: LEGO1 0x100b00c0
// FUNCTION: BETA10 0x101304aa
void MxOmni::DeleteObject(MxDSAction& p_dsAction) void MxOmni::DeleteObject(MxDSAction& p_dsAction)
{ {
if (m_streamer != NULL) { if (m_streamer != NULL) {
@@ -242,6 +250,7 @@ void MxOmni::DeleteObject(MxDSAction& p_dsAction)
} }
// FUNCTION: LEGO1 0x100b00e0 // FUNCTION: LEGO1 0x100b00e0
// FUNCTION: BETA10 0x101304de
MxResult MxOmni::CreatePresenter(MxStreamController* p_controller, MxDSAction& p_action) MxResult MxOmni::CreatePresenter(MxStreamController* p_controller, MxDSAction& p_action)
{ {
MxResult result = FAILURE; MxResult result = FAILURE;
@@ -322,6 +331,7 @@ MxBool MxOmni::ActionSourceEquals(MxDSAction* p_action, const char* p_name)
} }
// FUNCTION: LEGO1 0x100b07f0 // FUNCTION: LEGO1 0x100b07f0
// STUB: BETA10 0x1013082b
MxLong MxOmni::Notify(MxParam& p_param) MxLong MxOmni::Notify(MxParam& p_param)
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
@@ -396,6 +406,7 @@ void MxOmni::SetSound3D(MxBool p_use3dSound)
} }
// FUNCTION: LEGO1 0x100b09a0 // FUNCTION: LEGO1 0x100b09a0
// FUNCTION: BETA10 0x101309f5
MxBool MxOmni::DoesEntityExist(MxDSAction& p_dsAction) MxBool MxOmni::DoesEntityExist(MxDSAction& p_dsAction)
{ {
if (m_streamer->FUN_100b9b30(p_dsAction)) { if (m_streamer->FUN_100b9b30(p_dsAction)) {

View File

@@ -165,6 +165,7 @@ void MxNotificationManager::FlushPending(MxCore* p_listener)
} }
// FUNCTION: LEGO1 0x100acd20 // FUNCTION: LEGO1 0x100acd20
// STUB: BETA10 0x1012666a
void MxNotificationManager::Register(MxCore* p_listener) void MxNotificationManager::Register(MxCore* p_listener)
{ {
AUTOLOCK(m_lock); AUTOLOCK(m_lock);

View File

@@ -13,6 +13,7 @@
DECOMP_SIZE_ASSERT(MxVideoManager, 0x64) DECOMP_SIZE_ASSERT(MxVideoManager, 0x64)
// FUNCTION: LEGO1 0x100be1f0 // FUNCTION: LEGO1 0x100be1f0
// STUB: BETA10 0x1012ca40
MxVideoManager::MxVideoManager() MxVideoManager::MxVideoManager()
{ {
Init(); Init();