LegoWorld::Add

This commit is contained in:
Christian Semmler 2024-01-26 15:04:53 -05:00
parent b6aac26269
commit b7e155b81f
7 changed files with 187 additions and 119 deletions

View File

@ -40,6 +40,8 @@ class LegoAnimPresenter : public MxVideoPresenter {
virtual void PutFrame() override; // vtable+0x6c
virtual MxResult VTable0x88(MxStreamChunk* p_chunk); // vtable+0x88
inline LegoAnimClass* GetUnknown0x64() { return m_unk0x64; }
const char* GetActionObjectName();
protected:
@ -101,6 +103,9 @@ class LegoAnimClass : public LegoAnimClassBase {
virtual void VTable0xc() override; // vtable+0x0c
virtual MxResult VTable0x10(LegoMemory* p_stream, MxS32); // vtable+0x10
inline MxLong GetUnknown0x8() { return m_unk0x8; }
// private:
MxLong m_unk0x8; // 0x08
undefined4 m_unk0xc; // 0x0c
undefined4 m_unk0x10; // 0x10

View File

@ -0,0 +1,95 @@
#ifndef MXCORELIST_H
#define MXCORELIST_H
#include "mxlist.h"
#include "mxtypes.h"
class LegoCacheSound;
// VTABLE: LEGO1 0x100d63b0
// class MxCollection<LegoCacheSound *>
// VTABLE: LEGO1 0x100d63c8
// class MxList<LegoCacheSound *>
// VTABLE: LEGO1 0x100d63e0
// class MxPtrList<LegoCacheSound>
// VTABLE: LEGO1 0x100d63f8
// SIZE 0x18
class LegoCacheSoundList : public MxPtrList<LegoCacheSound> {
public:
LegoCacheSoundList(MxBool p_ownership = FALSE) : MxPtrList<LegoCacheSound>(p_ownership) {}
// FUNCTION: LEGO1 0x1001e650
virtual MxS8 Compare(LegoCacheSound* p_a, LegoCacheSound* p_b) override
{
return p_a == p_b ? 0 : p_a < p_b ? -1 : 1;
}; // vtable+0x14
};
// VTABLE: LEGO1 0x100d64a0
// class MxListCursor<LegoCacheSound *>
// VTABLE: LEGO1 0x100d6500
// class MxPtrListCursor<LegoCacheSound>
// VTABLE: LEGO1 0x100d6518
// SIZE 0x10
class LegoCacheSoundListCursor : public MxPtrListCursor<LegoCacheSound> {
public:
LegoCacheSoundListCursor(LegoCacheSoundList* p_list) : MxPtrListCursor<LegoCacheSound>(p_list){};
};
// TEMPLATE: LEGO1 0x1001e670
// MxCollection<LegoCacheSound *>::Compare
// TEMPLATE: LEGO1 0x1001e680
// MxCollection<LegoCacheSound *>::~MxCollection<LegoCacheSound *>
// TEMPLATE: LEGO1 0x1001e6d0
// MxCollection<LegoCacheSound *>::Destroy
// TEMPLATE: LEGO1 0x1001e6e0
// MxList<LegoCacheSound *>::~MxList<LegoCacheSound *>
// TEMPLATE: LEGO1 0x1001e770
// MxPtrList<LegoCacheSound>::Destroy
// SYNTHETIC: LEGO1 0x1001e780
// LegoCacheSoundList::`scalar deleting destructor'
// TEMPLATE: LEGO1 0x1001e7f0
// MxPtrList<LegoCacheSound>::~MxPtrList<LegoCacheSound>
// SYNTHETIC: LEGO1 0x1001e840
// MxCollection<LegoCacheSound *>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1001e8b0
// MxList<LegoCacheSound *>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1001e960
// MxPtrList<LegoCacheSound>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1001f350
// LegoCacheSoundListCursor::`scalar deleting destructor'
// FUNCTION: LEGO1 0x1001f3c0
// MxPtrListCursor<LegoCacheSound>::~MxPtrListCursor<LegoCacheSound>
// SYNTHETIC: LEGO1 0x1001f410
// MxListCursor<LegoCacheSound *>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1001f480
// MxPtrListCursor<LegoCacheSound>::`scalar deleting destructor'
// FUNCTION: LEGO1 0x1001f4f0
// MxListCursor<LegoCacheSound *>::~MxListCursor<LegoCacheSound *>
// FUNCTION: LEGO1 0x1001f540
// LegoCacheSoundListCursor::~LegoCacheSoundListCursor
// TEMPLATE: LEGO1 0x10020840
// MxListCursor<LegoCacheSound *>::MxListCursor<LegoCacheSound *>
#endif // MXCORELIST_H

View File

@ -9,7 +9,9 @@
class MxAtomId;
class LegoEntity;
class LegoAnimPresenter;
void FUN_1003e050(LegoAnimPresenter* p_presenter);
Extra::ActionType MatchActionString(const char*);
void InvokeAction(Extra::ActionType p_actionId, MxAtomId& p_pAtom, int p_targetEntityId, LegoEntity* p_sender);
void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut);

View File

@ -1,16 +1,18 @@
#ifndef LEGOWORLD_H
#define LEGOWORLD_H
#include "legocachesound.h"
#include "legocachesoundlist.h"
#include "legocameracontroller.h"
#include "legoentity.h"
#include "legoentitylist.h"
#include "legopathcontrollerlist.h"
#include "mxcorelist.h"
#include "mxpresenter.h"
#include "mxpresenterlist.h"
class IslePathActor;
class LegoPathBoundary;
class LegoHideAnimPresenter;
struct PresenterSetCompare {
MxS32 operator()(MxPresenter* const& p_a, MxPresenter* const& p_b) const { return p_a > p_b; }
@ -72,21 +74,21 @@ class LegoWorld : public LegoEntity {
// LegoWorld::`scalar deleting destructor'
protected:
LegoPathControllerList m_list0x68; // 0x68
MxPresenterList m_animPresenters; // 0x80
LegoCameraController* m_cameraController; // 0x98
LegoEntityList* m_entityList; // 0x9c
MxCoreList* m_coreList; // 0xa0
undefined m_unk0xa4; // 0xa4
MxPresenterSet m_set0xa8; // 0xa8
MxPresenterList m_controlPresenters; // 0xb8
MxPresenterSet m_set0xd0; // 0xd0
list<AutoROI*> m_list0xe0; // 0xe0
undefined4 m_unk0xec; // 0xec
undefined4 m_unk0xf0; // 0xf0
MxS16 m_unk0xf4; // 0xf4
MxBool m_worldStarted; // 0xf6
undefined m_unk0xf7; // 0xf7
LegoPathControllerList m_list0x68; // 0x68
MxPresenterList m_animPresenters; // 0x80
LegoCameraController* m_cameraController; // 0x98
LegoEntityList* m_entityList; // 0x9c
LegoCacheSoundList* m_cacheSoundList; // 0xa0
undefined m_unk0xa4; // 0xa4
MxPresenterSet m_set0xa8; // 0xa8
MxPresenterList m_controlPresenters; // 0xb8
MxPresenterSet m_set0xd0; // 0xd0
list<AutoROI*> m_list0xe0; // 0xe0
undefined4 m_unk0xec; // 0xec
LegoHideAnimPresenter* m_hideAnimPresenter; // 0xf0
MxS16 m_unk0xf4; // 0xf4
MxBool m_worldStarted; // 0xf6
undefined m_unk0xf7; // 0xf7
};
// clang-format off

View File

@ -10,6 +10,11 @@
#include <process.h>
#include <string.h>
// FUNCTION: LEGO1 0x1003e050
void FUN_1003e050(LegoAnimPresenter* p_presenter)
{
}
// FUNCTION: LEGO1 0x1003e300
Extra::ActionType MatchActionString(const char* p_str)
{

View File

@ -15,8 +15,8 @@
DECOMP_SIZE_ASSERT(LegoWorld, 0xf8)
DECOMP_SIZE_ASSERT(LegoEntityList, 0x18)
DECOMP_SIZE_ASSERT(LegoEntityListCursor, 0x10)
DECOMP_SIZE_ASSERT(MxCoreList, 0x18)
DECOMP_SIZE_ASSERT(MxCoreListCursor, 0x10)
DECOMP_SIZE_ASSERT(LegoCacheSoundList, 0x18)
DECOMP_SIZE_ASSERT(LegoCacheSoundListCursor, 0x10)
// FUNCTION: LEGO1 0x1001ca40
LegoWorld::LegoWorld() : m_list0x68(TRUE)
@ -24,9 +24,9 @@ LegoWorld::LegoWorld() : m_list0x68(TRUE)
m_unk0xf4 = 4;
m_cameraController = NULL;
m_entityList = NULL;
m_coreList = NULL;
m_cacheSoundList = NULL;
m_unk0xa4 = 0; // MxBool?
m_unk0xf0 = 0;
m_hideAnimPresenter = NULL;
m_worldStarted = FALSE;
NotificationManager()->Register(this);
@ -60,9 +60,9 @@ MxResult LegoWorld::Create(MxDSAction& p_dsAction)
if (!m_entityList)
return FAILURE;
m_coreList = new MxCoreList(TRUE);
m_cacheSoundList = new LegoCacheSoundList(TRUE);
if (!m_coreList)
if (!m_cacheSoundList)
return FAILURE;
if (!VTable0x54())
@ -152,10 +152,64 @@ MxS32 LegoWorld::GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value)
return 0;
}
// STUB: LEGO1 0x10020220
// FUNCTION: LEGO1 0x10020220
void LegoWorld::Add(MxCore* p_object)
{
// TODO
if (p_object && !p_object->IsA("LegoWorld") && !p_object->IsA("LegoWorldPresenter")) {
if (p_object->IsA("LegoAnimPresenter")) {
LegoAnimPresenter* animPresenter = (LegoAnimPresenter*) p_object;
if (!strcmpi(animPresenter->GetAction()->GetObjectName(), "ConfigAnimation")) {
FUN_1003e050(animPresenter);
animPresenter->GetAction()->SetDuration(animPresenter->GetUnknown0x64()->GetUnknown0x8());
}
}
if (p_object->IsA("MxControlPresenter")) {
MxPresenterListCursor cursor(&m_controlPresenters);
MxPresenter* presenter = (MxPresenter*) p_object;
if (!cursor.Find(presenter))
m_controlPresenters.Append(presenter);
}
else if (p_object->IsA("MxEntity")) {
LegoEntityListCursor cursor(m_entityList);
LegoEntity* entity = (LegoEntity*) p_object;
if (!cursor.Find(entity))
m_entityList->Append(entity);
}
else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") || p_object->IsA("LegoLoopingAnimPresenter")) {
MxPresenterListCursor cursor(&m_animPresenters);
MxPresenter* presenter = (MxPresenter*) p_object;
if (!cursor.Find(presenter)) {
presenter->SendToCompositePresenter(Lego());
m_animPresenters.Append(presenter);
if (p_object->IsA("LegoHideAnimPresenter"))
m_hideAnimPresenter = (LegoHideAnimPresenter*) presenter;
}
}
else if (p_object->IsA("LegoCacheSound")) {
LegoCacheSoundListCursor cursor(m_cacheSoundList);
LegoCacheSound* sound = (LegoCacheSound*) p_object;
if (!cursor.Find(sound))
m_cacheSoundList->Append(sound);
}
else {
m_set0xa8.insert((MxPresenter*) p_object);
}
if (!m_set0xd0.empty() && p_object->IsA("MxPresenter")) {
MxPresenter* presenter = (MxPresenter*) p_object;
if (presenter->IsEnabled()) {
presenter->Enable(FALSE);
m_set0xd0.erase(presenter);
}
}
}
}
// STUB: LEGO1 0x10020f10

View File

@ -1,95 +0,0 @@
#ifndef MXCORELIST_H
#define MXCORELIST_H
#include "mxlist.h"
#include "mxtypes.h"
class MxCore;
// VTABLE: LEGO1 0x100d63b0
// class MxCollection<MxCore *>
// VTABLE: LEGO1 0x100d63c8
// class MxList<MxCore *>
// VTABLE: LEGO1 0x100d63e0
// class MxPtrList<MxCore>
// VTABLE: LEGO1 0x100d63f8
// SIZE 0x18
class MxCoreList : public MxPtrList<MxCore> {
public:
MxCoreList(MxBool p_ownership = FALSE) : MxPtrList<MxCore>(p_ownership) {}
// FUNCTION: LEGO1 0x1001e650
virtual MxS8 Compare(MxCore* p_a, MxCore* p_b) override
{
return p_a == p_b ? 0 : p_a < p_b ? -1 : 1;
}; // vtable+0x14
};
// VTABLE: LEGO1 0x100d64a0
// class MxListCursor<MxCore *>
// VTABLE: LEGO1 0x100d6500
// class MxPtrListCursor<MxCore>
// VTABLE: LEGO1 0x100d6518
// SIZE 0x10
class MxCoreListCursor : public MxPtrListCursor<MxCore> {
public:
MxCoreListCursor(MxCoreList* p_list) : MxPtrListCursor<MxCore>(p_list){};
};
// TEMPLATE: LEGO1 0x1001e670
// MxCollection<MxCore *>::Compare
// TEMPLATE: LEGO1 0x1001e680
// MxCollection<MxCore *>::~MxCollection<MxCore *>
// TEMPLATE: LEGO1 0x1001e6d0
// MxCollection<MxCore *>::Destroy
// TEMPLATE: LEGO1 0x1001e6e0
// MxList<MxCore *>::~MxList<MxCore *>
// TEMPLATE: LEGO1 0x1001e770
// MxPtrList<MxCore>::Destroy
// SYNTHETIC: LEGO1 0x1001e780
// MxCoreList::`scalar deleting destructor'
// TEMPLATE: LEGO1 0x1001e7f0
// MxPtrList<MxCore>::~MxPtrList<MxCore>
// SYNTHETIC: LEGO1 0x1001e840
// MxCollection<MxCore *>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1001e8b0
// MxList<MxCore *>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1001e960
// MxPtrList<MxCore>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1001f350
// MxCoreListCursor::`scalar deleting destructor'
// FUNCTION: LEGO1 0x1001f3c0
// MxPtrListCursor<MxCore>::~MxPtrListCursor<MxCore>
// SYNTHETIC: LEGO1 0x1001f410
// MxListCursor<MxCore *>::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1001f480
// MxPtrListCursor<MxCore>::`scalar deleting destructor'
// FUNCTION: LEGO1 0x1001f4f0
// MxListCursor<MxCore *>::~MxListCursor<MxCore *>
// FUNCTION: LEGO1 0x1001f540
// MxCoreListCursor::~MxCoreListCursor
// TEMPLATE: LEGO1 0x10020840
// MxListCursor<MxCore *>::MxListCursor<MxCore *>
#endif // MXCORELIST_H