2023-06-29 04:10:08 -04:00
|
|
|
#include "legoworld.h"
|
2023-10-24 19:38:27 -04:00
|
|
|
|
2024-01-26 16:00:02 -05:00
|
|
|
#include "legoanimpresenter.h"
|
2024-01-13 15:00:11 -05:00
|
|
|
#include "legocontrolmanager.h"
|
2023-10-23 07:16:21 -04:00
|
|
|
#include "legoinputmanager.h"
|
2023-10-24 19:38:27 -04:00
|
|
|
#include "legoomni.h"
|
2023-12-29 13:04:18 -05:00
|
|
|
#include "legoutil.h"
|
2024-01-13 15:00:11 -05:00
|
|
|
#include "legovideomanager.h"
|
2023-10-25 16:51:59 -04:00
|
|
|
#include "mxactionnotificationparam.h"
|
2023-12-29 13:04:18 -05:00
|
|
|
#include "mxnotificationmanager.h"
|
2023-10-25 16:51:59 -04:00
|
|
|
#include "mxnotificationparam.h"
|
|
|
|
#include "mxomni.h"
|
2023-10-23 07:16:21 -04:00
|
|
|
#include "mxticklemanager.h"
|
|
|
|
|
2024-01-15 15:59:57 -05:00
|
|
|
DECOMP_SIZE_ASSERT(LegoWorld, 0xf8)
|
|
|
|
DECOMP_SIZE_ASSERT(LegoEntityList, 0x18)
|
|
|
|
DECOMP_SIZE_ASSERT(LegoEntityListCursor, 0x10)
|
2024-01-26 17:52:03 -05:00
|
|
|
DECOMP_SIZE_ASSERT(LegoCacheSoundList, 0x18)
|
|
|
|
DECOMP_SIZE_ASSERT(LegoCacheSoundListCursor, 0x10)
|
2023-10-23 07:16:21 -04:00
|
|
|
|
2024-01-22 10:18:46 -05:00
|
|
|
// FUNCTION: LEGO1 0x1001ca40
|
2023-12-20 20:09:05 -05:00
|
|
|
LegoWorld::LegoWorld() : m_list0x68(TRUE)
|
2023-06-29 04:10:08 -04:00
|
|
|
{
|
2023-12-29 13:04:18 -05:00
|
|
|
m_unk0xf4 = 4;
|
2024-01-22 10:18:46 -05:00
|
|
|
m_cameraController = NULL;
|
|
|
|
m_entityList = NULL;
|
2024-01-26 17:52:03 -05:00
|
|
|
m_cacheSoundList = NULL;
|
2024-01-22 10:18:46 -05:00
|
|
|
m_unk0xa4 = 0; // MxBool?
|
2024-01-26 17:52:03 -05:00
|
|
|
m_hideAnimPresenter = NULL;
|
2024-01-22 10:18:46 -05:00
|
|
|
m_worldStarted = FALSE;
|
|
|
|
|
2023-12-29 13:04:18 -05:00
|
|
|
NotificationManager()->Register(this);
|
2023-06-29 04:10:08 -04:00
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1001d670
|
2023-11-21 03:44:45 -05:00
|
|
|
MxBool LegoWorld::VTable0x5c()
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1001d680
|
2023-11-21 03:44:45 -05:00
|
|
|
MxBool LegoWorld::VTable0x64()
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// STUB: LEGO1 0x1001dfa0
|
2023-06-29 04:10:08 -04:00
|
|
|
LegoWorld::~LegoWorld()
|
|
|
|
{
|
2023-10-24 19:38:27 -04:00
|
|
|
// TODO
|
2023-06-29 04:10:08 -04:00
|
|
|
}
|
2023-10-23 07:16:21 -04:00
|
|
|
|
2024-01-15 15:44:04 -05:00
|
|
|
// FUNCTION: LEGO1 0x1001e0b0
|
2024-01-13 15:00:11 -05:00
|
|
|
MxResult LegoWorld::Create(MxDSAction& p_dsAction)
|
2023-10-23 07:16:21 -04:00
|
|
|
{
|
2024-01-13 15:00:11 -05:00
|
|
|
MxEntity::Create(p_dsAction);
|
|
|
|
|
2024-01-15 15:44:04 -05:00
|
|
|
m_entityList = new LegoEntityList(TRUE);
|
2024-01-13 15:00:11 -05:00
|
|
|
|
2024-01-15 15:44:04 -05:00
|
|
|
if (!m_entityList)
|
|
|
|
return FAILURE;
|
2024-01-13 15:00:11 -05:00
|
|
|
|
2024-01-26 17:52:03 -05:00
|
|
|
m_cacheSoundList = new LegoCacheSoundList(TRUE);
|
2024-01-15 15:44:04 -05:00
|
|
|
|
2024-01-26 17:52:03 -05:00
|
|
|
if (!m_cacheSoundList)
|
2024-01-15 15:44:04 -05:00
|
|
|
return FAILURE;
|
|
|
|
|
|
|
|
if (!VTable0x54())
|
|
|
|
return FAILURE;
|
2024-01-13 15:00:11 -05:00
|
|
|
|
2024-01-17 11:53:53 -05:00
|
|
|
if (p_dsAction.GetFlags() & MxDSAction::c_enabled) {
|
2024-01-15 15:44:04 -05:00
|
|
|
if (GetCurrentWorld()) {
|
|
|
|
GetCurrentWorld()->VTable0x68(0);
|
|
|
|
}
|
2024-01-13 15:00:11 -05:00
|
|
|
|
2024-01-15 15:44:04 -05:00
|
|
|
SetCurrentWorld(this);
|
2024-01-26 16:00:02 -05:00
|
|
|
ControlManager()->FUN_10028df0(&m_controlPresenters);
|
2024-01-13 15:00:11 -05:00
|
|
|
}
|
2024-01-15 15:44:04 -05:00
|
|
|
|
|
|
|
SetIsWorldActive(TRUE);
|
|
|
|
m_unk0xec = -1;
|
|
|
|
|
|
|
|
return SUCCESS;
|
2023-10-23 07:16:21 -04:00
|
|
|
}
|
|
|
|
|
2024-01-18 20:24:15 -05:00
|
|
|
// STUB: LEGO1 0x1001e9d0
|
|
|
|
void LegoWorld::Destroy(MxBool p_fromDestructor)
|
|
|
|
{
|
|
|
|
// TODO
|
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1001f5e0
|
2023-10-25 16:51:59 -04:00
|
|
|
MxLong LegoWorld::Notify(MxParam& p_param)
|
|
|
|
{
|
|
|
|
MxLong ret = 0;
|
|
|
|
switch (((MxNotificationParam&) p_param).GetNotification()) {
|
|
|
|
case c_notificationEndAction: {
|
|
|
|
MxPresenter* presenter = (MxPresenter*) ((MxEndActionNotificationParam&) p_param).GetSender();
|
2024-01-26 16:00:02 -05:00
|
|
|
Remove(presenter);
|
2023-10-25 16:51:59 -04:00
|
|
|
ret = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case c_notificationNewPresenter:
|
|
|
|
TickleManager()->RegisterClient(this, 100);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2024-01-13 15:00:11 -05:00
|
|
|
// FUNCTION: LEGO1 0x1001f630
|
|
|
|
LegoCameraController* LegoWorld::VTable0x54()
|
2023-10-23 07:16:21 -04:00
|
|
|
{
|
2024-01-13 15:00:11 -05:00
|
|
|
MxBool success = FALSE;
|
|
|
|
|
|
|
|
if (!VideoManager()) {
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
if (!(m_cameraController = new LegoCameraController())) {
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
if (m_cameraController->Create() != SUCCESS) {
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_cameraController->OnViewSize(
|
|
|
|
VideoManager()->GetVideoParam().GetRect().GetWidth(),
|
|
|
|
VideoManager()->GetVideoParam().GetRect().GetHeight()
|
|
|
|
);
|
|
|
|
|
|
|
|
success = TRUE;
|
|
|
|
|
|
|
|
done:
|
|
|
|
if (!success) {
|
|
|
|
if (m_cameraController) {
|
|
|
|
delete m_cameraController;
|
|
|
|
m_cameraController = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return m_cameraController;
|
2023-10-23 07:16:21 -04:00
|
|
|
}
|
|
|
|
|
2023-12-14 11:50:29 -05:00
|
|
|
// STUB: LEGO1 0x1001fc80
|
|
|
|
void LegoWorld::FUN_1001fc80(IslePathActor* p_actor)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2023-12-16 13:14:01 -05:00
|
|
|
// STUB: LEGO1 0x10020120
|
|
|
|
MxS32 LegoWorld::GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value)
|
|
|
|
{
|
|
|
|
// TODO
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2024-01-26 17:52:03 -05:00
|
|
|
// FUNCTION: LEGO1 0x10020220
|
2024-01-26 16:00:02 -05:00
|
|
|
void LegoWorld::Add(MxCore* p_object)
|
2023-10-23 07:16:21 -04:00
|
|
|
{
|
2024-01-26 17:52:03 -05:00
|
|
|
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);
|
|
|
|
|
|
|
|
if (cursor.Find((MxPresenter*) p_object))
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_controlPresenters.Append((MxPresenter*) p_object);
|
|
|
|
}
|
|
|
|
else if (p_object->IsA("MxEntity")) {
|
|
|
|
LegoEntityListCursor cursor(m_entityList);
|
|
|
|
|
|
|
|
if (cursor.Find((LegoEntity*) p_object))
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_entityList->Append((LegoEntity*) p_object);
|
|
|
|
}
|
|
|
|
else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") || p_object->IsA("LegoLoopingAnimPresenter")) {
|
|
|
|
MxPresenterListCursor cursor(&m_animPresenters);
|
|
|
|
|
|
|
|
if (cursor.Find((MxPresenter*) p_object))
|
|
|
|
return;
|
|
|
|
|
|
|
|
((MxPresenter*) p_object)->SendToCompositePresenter(Lego());
|
|
|
|
m_animPresenters.Append(((MxPresenter*) p_object));
|
|
|
|
|
|
|
|
if (p_object->IsA("LegoHideAnimPresenter"))
|
|
|
|
m_hideAnimPresenter = (LegoHideAnimPresenter*) p_object;
|
|
|
|
}
|
|
|
|
else if (p_object->IsA("LegoCacheSound")) {
|
|
|
|
LegoCacheSoundListCursor cursor(m_cacheSoundList);
|
|
|
|
|
|
|
|
if (cursor.Find((LegoCacheSound*) p_object))
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_cacheSoundList->Append((LegoCacheSound*) p_object);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (m_set0xa8.find(p_object) == m_set0xa8.end())
|
|
|
|
m_set0xa8.insert(p_object);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!m_set0xd0.empty() && p_object->IsA("MxPresenter")) {
|
|
|
|
if (((MxPresenter*) p_object)->IsEnabled()) {
|
|
|
|
((MxPresenter*) p_object)->Enable(FALSE);
|
|
|
|
m_set0xd0.insert(p_object);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-10-23 07:16:21 -04:00
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// STUB: LEGO1 0x10020f10
|
2024-01-26 16:00:02 -05:00
|
|
|
void LegoWorld::Remove(MxCore* p_object)
|
2023-10-23 07:16:21 -04:00
|
|
|
{
|
2024-01-26 16:00:02 -05:00
|
|
|
// TODO
|
2023-10-23 07:16:21 -04:00
|
|
|
}
|
|
|
|
|
2024-01-26 16:00:02 -05:00
|
|
|
// FUNCTION: LEGO1 0x100213a0
|
|
|
|
MxCore* LegoWorld::Find(const char* p_class, const char* p_name)
|
2024-01-17 11:53:53 -05:00
|
|
|
{
|
2024-01-26 16:00:02 -05:00
|
|
|
if (!strcmp(p_class, "MxControlPresenter")) {
|
|
|
|
MxPresenterListCursor cursor(&m_controlPresenters);
|
|
|
|
MxPresenter* presenter;
|
|
|
|
|
|
|
|
while (cursor.Next(presenter)) {
|
|
|
|
MxDSAction* action = presenter->GetAction();
|
|
|
|
if (!strcmp(action->GetObjectName(), p_name))
|
|
|
|
return presenter;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
else if (!strcmp(p_class, "MxEntity")) {
|
|
|
|
LegoEntityListCursor cursor(m_entityList);
|
|
|
|
LegoEntity* entity;
|
|
|
|
|
|
|
|
while (cursor.Next(entity)) {
|
|
|
|
if (!p_name)
|
|
|
|
return entity;
|
|
|
|
|
|
|
|
LegoROI* roi = entity->GetROI();
|
|
|
|
if (roi && !strcmpi(roi->GetUnknown0xe4(), p_name))
|
|
|
|
return entity;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
else if (!strcmp(p_class, "LegoAnimPresenter")) {
|
|
|
|
MxPresenterListCursor cursor(&m_animPresenters);
|
|
|
|
MxPresenter* presenter;
|
|
|
|
|
|
|
|
while (cursor.Next(presenter)) {
|
|
|
|
if (!strcmpi(((LegoAnimPresenter*) presenter)->GetActionObjectName(), p_name))
|
|
|
|
return presenter;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
else {
|
2024-01-26 17:52:03 -05:00
|
|
|
for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) {
|
2024-01-26 16:00:02 -05:00
|
|
|
if ((*it)->IsA(p_class) && (*it)->IsA("MxPresenter")) {
|
|
|
|
MxPresenter* presenter = (MxPresenter*) *it;
|
|
|
|
MxDSAction* action = presenter->GetAction();
|
|
|
|
|
|
|
|
if (!strcmp(action->GetObjectName(), p_name))
|
|
|
|
return *it;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
2024-01-17 11:53:53 -05:00
|
|
|
}
|
|
|
|
|
2024-01-26 12:03:29 -05:00
|
|
|
// FUNCTION: LEGO1 0x10021790
|
2024-01-26 16:00:02 -05:00
|
|
|
MxCore* LegoWorld::Find(const MxAtomId& p_atom, MxS32 p_entityId)
|
2024-01-21 12:38:22 -05:00
|
|
|
{
|
2024-01-26 12:03:29 -05:00
|
|
|
LegoEntityListCursor entityCursor(m_entityList);
|
|
|
|
LegoEntity* entity;
|
|
|
|
|
|
|
|
while (entityCursor.Next(entity)) {
|
|
|
|
if (entity->GetAtom() == p_atom && entity->GetEntityId() == p_entityId)
|
|
|
|
return entity;
|
|
|
|
}
|
|
|
|
|
2024-01-26 16:00:02 -05:00
|
|
|
MxPresenterListCursor controlPresenterCursor(&m_controlPresenters);
|
2024-01-26 12:03:29 -05:00
|
|
|
MxPresenter* presenter;
|
|
|
|
|
2024-01-26 16:00:02 -05:00
|
|
|
while (controlPresenterCursor.Next(presenter)) {
|
2024-01-26 12:03:29 -05:00
|
|
|
MxDSAction* action = presenter->GetAction();
|
|
|
|
|
|
|
|
if (action->GetAtomId() == p_atom && action->GetObjectId() == p_entityId)
|
|
|
|
return presenter;
|
|
|
|
}
|
|
|
|
|
2024-01-26 16:00:02 -05:00
|
|
|
MxPresenterListCursor animPresenterCursor(&m_animPresenters);
|
2024-01-26 12:03:29 -05:00
|
|
|
|
2024-01-26 16:00:02 -05:00
|
|
|
while (animPresenterCursor.Next(presenter)) {
|
2024-01-26 12:03:29 -05:00
|
|
|
MxDSAction* action = presenter->GetAction();
|
|
|
|
|
|
|
|
if (action && action->GetAtomId() == p_atom && action->GetObjectId() == p_entityId)
|
|
|
|
return presenter;
|
|
|
|
}
|
|
|
|
|
2024-01-26 17:52:03 -05:00
|
|
|
for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) {
|
2024-01-26 12:03:29 -05:00
|
|
|
MxCore* core = *it;
|
|
|
|
|
|
|
|
if (core->IsA("MxPresenter")) {
|
|
|
|
MxPresenter* presenter = (MxPresenter*) *it;
|
|
|
|
MxDSAction* action = presenter->GetAction();
|
|
|
|
|
|
|
|
if (action->GetAtomId() == p_atom && action->GetObjectId() == p_entityId)
|
|
|
|
return *it;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-01-21 12:38:22 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// STUB: LEGO1 0x10021a70
|
2023-10-24 19:38:27 -04:00
|
|
|
void LegoWorld::VTable0x68(MxBool p_add)
|
2023-10-23 07:16:21 -04:00
|
|
|
{
|
2023-10-24 19:38:27 -04:00
|
|
|
// TODO
|
2023-10-23 07:16:21 -04:00
|
|
|
}
|
|
|
|
|
2023-12-29 13:04:18 -05:00
|
|
|
// FUNCTION: LEGO1 0x10022080
|
2023-12-14 11:50:29 -05:00
|
|
|
MxResult LegoWorld::Tickle()
|
|
|
|
{
|
2024-01-12 17:27:07 -05:00
|
|
|
if (!m_worldStarted) {
|
2023-12-29 13:04:18 -05:00
|
|
|
switch (m_unk0xf4) {
|
|
|
|
case 0:
|
2024-01-12 17:27:07 -05:00
|
|
|
m_worldStarted = TRUE;
|
2023-12-29 13:04:18 -05:00
|
|
|
SetAppCursor(0);
|
2024-01-12 17:27:07 -05:00
|
|
|
VTable0x50();
|
2023-12-29 13:04:18 -05:00
|
|
|
return TRUE;
|
|
|
|
case 2:
|
|
|
|
if (FUN_100220e0() == 1)
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
m_unk0xf4--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// STUB: LEGO1 0x100220e0
|
|
|
|
undefined LegoWorld::FUN_100220e0()
|
|
|
|
{
|
2024-01-12 17:27:07 -05:00
|
|
|
return 0;
|
2023-12-14 11:50:29 -05:00
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x10022340
|
2024-01-12 17:27:07 -05:00
|
|
|
void LegoWorld::VTable0x50()
|
2023-10-23 07:16:21 -04:00
|
|
|
{
|
2023-11-21 03:44:45 -05:00
|
|
|
TickleManager()->UnregisterClient(this);
|
2023-10-25 14:51:59 -04:00
|
|
|
}
|
2023-12-14 11:50:29 -05:00
|
|
|
|
|
|
|
// STUB: LEGO1 0x100727e0
|
2024-01-12 19:34:38 -05:00
|
|
|
MxBool LegoWorld::FUN_100727e0(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up)
|
2023-12-14 11:50:29 -05:00
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// STUB: LEGO1 0x10072980
|
2024-01-12 19:34:38 -05:00
|
|
|
MxBool LegoWorld::FUN_10072980(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up)
|
2023-12-14 11:50:29 -05:00
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// STUB: LEGO1 0x10073400
|
|
|
|
void LegoWorld::FUN_10073400()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2023-12-17 17:45:33 -05:00
|
|
|
// STUB: LEGO1 0x10073430
|
2023-12-14 11:50:29 -05:00
|
|
|
void LegoWorld::FUN_10073430()
|
|
|
|
{
|
|
|
|
}
|