Merge branch 'master' into mxregion

This commit is contained in:
Christian Semmler
2023-10-25 16:55:26 -04:00
committed by GitHub
70 changed files with 257 additions and 186 deletions

View File

@@ -19,6 +19,7 @@ ContinuationIndentWidth: 4
IncludeBlocks: Regroup IncludeBlocks: Regroup
IndentAccessModifiers: false IndentAccessModifiers: false
IndentWidth: 4 IndentWidth: 4
InsertNewlineAtEOF: true
PointerAlignment: Left PointerAlignment: Left
SpaceAfterCStyleCast: true SpaceAfterCStyleCast: true
TabWidth: 4 TabWidth: 4

9
.gitignore vendored
View File

@@ -3,6 +3,15 @@ Release/
*.ncb *.ncb
/.vs /.vs
/.vscode /.vscode
/.idea
.env
.venv
env/
venv/
ENV/
VENV/
env.bak/
venv.bak/
ISLE.EXE ISLE.EXE
LEGO1.DLL LEGO1.DLL
build/ build/

View File

@@ -65,6 +65,7 @@ add_library(lego1 SHARED
LEGO1/legocontrolmanager.cpp LEGO1/legocontrolmanager.cpp
LEGO1/legoentity.cpp LEGO1/legoentity.cpp
LEGO1/legoentitypresenter.cpp LEGO1/legoentitypresenter.cpp
LEGO1/legoeventnotificationparam.cpp
LEGO1/legoflctexturepresenter.cpp LEGO1/legoflctexturepresenter.cpp
LEGO1/legofullscreenmovie.cpp LEGO1/legofullscreenmovie.cpp
LEGO1/legogamestate.cpp LEGO1/legogamestate.cpp
@@ -99,7 +100,6 @@ add_library(lego1 SHARED
LEGO1/legoworldpresenter.cpp LEGO1/legoworldpresenter.cpp
LEGO1/motorcycle.cpp LEGO1/motorcycle.cpp
LEGO1/mxactionnotificationparam.cpp LEGO1/mxactionnotificationparam.cpp
LEGO1/mxappnotificationparam.cpp
LEGO1/mxatomid.cpp LEGO1/mxatomid.cpp
LEGO1/mxatomidcounter.cpp LEGO1/mxatomidcounter.cpp
LEGO1/mxaudiomanager.cpp LEGO1/mxaudiomanager.cpp

View File

@@ -25,7 +25,12 @@ This repository currently has only one goal: accuracy to the original executable
In general, we're not exhaustively strict about coding style, but there are some preferable guidelines to follow that have been adopted from what we know about the original codebase: In general, we're not exhaustively strict about coding style, but there are some preferable guidelines to follow that have been adopted from what we know about the original codebase:
- Indent: 2 spaces ### Formatting
We are currently using [clang-format](https://clang.llvm.org/docs/ClangFormat.html) with a configuration file that aims to replicate the code formatting employed by the original developers. There are [integrations](https://clang.llvm.org/docs/ClangFormat.html#vim-integration) available for most editors and IDEs. The required `clang-format` version is `17.x`.
### Naming conventions
- `PascalCase` for classes, function names, and enumerations. - `PascalCase` for classes, function names, and enumerations.
- `m_camelCase` for member variables. - `m_camelCase` for member variables.
- `g_camelCase` for global variables. - `g_camelCase` for global variables.

View File

@@ -18,4 +18,4 @@ Ambulance::Ambulance()
this->m_unk172 = 0; this->m_unk172 = 0;
this->m_unk13c = 40.0; this->m_unk13c = 40.0;
this->m_unk17c = 1.0; this->m_unk17c = 1.0;
} }

View File

@@ -4,4 +4,4 @@
CarRace::CarRace() CarRace::CarRace()
{ {
// TODO // TODO
} }

View File

@@ -5,4 +5,4 @@ extern const char* g_parseExtraTokens;
extern const char* g_strWORLD; extern const char* g_strWORLD;
extern const char* g_strACTION; extern const char* g_strACTION;
#endif // DEFINE_H #endif // DEFINE_H

View File

@@ -9,4 +9,4 @@ DuneBuggy::DuneBuggy()
{ {
this->m_unk13c = 25.0; this->m_unk13c = 25.0;
this->m_unk164 = 1.0; this->m_unk164 = 1.0;
} }

View File

@@ -22,4 +22,4 @@ GifMapEntry* GifMap::FindNode(const char*& string)
current = current->m_left; current = current->m_left;
} }
return ret; return ret;
} }

View File

@@ -66,4 +66,4 @@ protected:
undefined m_unk[0x1c]; undefined m_unk[0x1c];
}; };
#endif // GIFMANAGER_H #endif // GIFMANAGER_H

View File

@@ -8,4 +8,4 @@ Jetski::Jetski()
this->m_unk13c = 25.0; this->m_unk13c = 25.0;
this->m_unk150 = 2.0; this->m_unk150 = 2.0;
this->m_unk148 = 1; this->m_unk148 = 1;
} }

View File

@@ -4,4 +4,4 @@
JukeBox::JukeBox() JukeBox::JukeBox()
{ {
// TODO // TODO
} }

View File

@@ -12,22 +12,14 @@ LegoEntity::~LegoEntity()
Destroy(TRUE); Destroy(TRUE);
} }
// OFFSET: LEGO1 0x100114f0 STUB
MxLong LegoEntity::Notify(MxParam& p)
{
// TODO
return 0;
}
// OFFSET: LEGO1 0x100105f0 // OFFSET: LEGO1 0x100105f0
void LegoEntity::Reset() void LegoEntity::Init()
{ {
m_vec1.Fill(0); m_worldLocation.Fill(0);
m_vec2.Fill(0); m_worldDirection.Fill(0);
m_unk50 = 0; m_worldSpeed = 0;
m_unk54 = 0; m_roi = NULL;
m_unk58 = 0; m_cameraFlag = 0;
m_actionArgString = NULL; m_actionArgString = NULL;
m_unk10 = 0; m_unk10 = 0;
m_unk11 = 0; m_unk11 = 0;
@@ -36,35 +28,53 @@ void LegoEntity::Reset()
m_unk59 = 4; m_unk59 = 4;
} }
// OFFSET: LEGO1 0x10010650 STUB
void LegoEntity::ResetWorldTransform(MxBool p_inVehicle)
{
// TODO
}
// OFFSET: LEGO1 0x10010790 STUB
void LegoEntity::SetWorldTransform(MxVector3& p_loc, MxVector3& p_dir, MxVector3& p_up)
{
// TODO
}
// OFFSET: LEGO1 0x100107e0 // OFFSET: LEGO1 0x100107e0
MxResult LegoEntity::InitFromMxDSObject(MxDSObject& p_dsObject) MxResult LegoEntity::InitFromMxDSObject(MxDSObject& p_dsObject)
{ {
m_mxEntityId = p_dsObject.GetObjectId(); m_mxEntityId = p_dsObject.GetObjectId();
m_atom = p_dsObject.GetAtomId(); m_atom = p_dsObject.GetAtomId();
AddToCurrentWorld(); Init();
return SUCCESS; return SUCCESS;
} }
// OFFSET: LEGO1 0x10010810 STUB // OFFSET: LEGO1 0x10010810 STUB
void LegoEntity::Destroy(MxBool p_fromDestructor) void LegoEntity::Destroy(MxBool p_fromDestructor)
{ {
if (m_unk54) { if (m_roi) {
// TODO // TODO
} }
delete[] m_actionArgString; delete[] m_actionArgString;
Reset(); Init();
} }
// OFFSET: LEGO1 0x10010880 STUB // OFFSET: LEGO1 0x10010880 STUB
void LegoEntity::AddToCurrentWorld() void LegoEntity::SetWorld()
{ {
LegoWorld* world = GetCurrentWorld(); LegoWorld* world = GetCurrentWorld();
if (world != NULL && world != (LegoWorld*) this) { if (world != NULL && world != (LegoWorld*) this) {
// TODO: world->vtable58(this); // TODO: world->AddEntity(this);
} }
} }
// OFFSET: LEGO1 0x100108a0 STUB
void LegoEntity::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2)
{
// TODO
}
// OFFSET: LEGO1 0x10010e10 // OFFSET: LEGO1 0x10010e10
void LegoEntity::ParseAction(char* p_extra) void LegoEntity::ParseAction(char* p_extra)
{ {
@@ -88,24 +98,6 @@ void LegoEntity::ParseAction(char* p_extra)
} }
} }
// OFFSET: LEGO1 0x100108a0 STUB
void LegoEntity::VTable0x24()
{
// TODO
}
// OFFSET: LEGO1 0x10010790 STUB
void LegoEntity::VTable0x28()
{
// TODO
}
// OFFSET: LEGO1 0x10010650 STUB
void LegoEntity::VTable0x2c()
{
// TODO
}
// OFFSET: LEGO1 0x10010f10 STUB // OFFSET: LEGO1 0x10010f10 STUB
void LegoEntity::VTable0x34() void LegoEntity::VTable0x34()
{ {
@@ -146,4 +138,12 @@ void LegoEntity::VTable0x48()
void LegoEntity::VTable0x4c() void LegoEntity::VTable0x4c()
{ {
// TODO // TODO
} }
// OFFSET: LEGO1 0x100114f0 STUB
MxLong LegoEntity::Notify(MxParam& p)
{
// TODO
return 0;
}

View File

@@ -3,6 +3,7 @@
#include "decomp.h" #include "decomp.h"
#include "extra.h" #include "extra.h"
#include "legoroi.h"
#include "mxdsobject.h" #include "mxdsobject.h"
#include "mxentity.h" #include "mxentity.h"
#include "mxvector.h" #include "mxvector.h"
@@ -34,34 +35,34 @@ public:
return !strcmp(name, LegoEntity::ClassName()) || MxEntity::IsA(name); return !strcmp(name, LegoEntity::ClassName()) || MxEntity::IsA(name);
} }
virtual MxResult InitFromMxDSObject(MxDSObject& p_dsObject); // vtable+0x18 virtual MxResult InitFromMxDSObject(MxDSObject& p_dsObject); // vtable+0x18
virtual void Destroy(MxBool p_fromDestructor); // vtable+0x1c virtual void Destroy(MxBool p_fromDestructor); // vtable+0x1c
virtual void ParseAction(char*); // vtable+0x20 virtual void ParseAction(char*); // vtable+0x20
virtual void VTable0x24(); // vtable+0x24 virtual void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2); // vtable+0x24
virtual void VTable0x28(); // vtable+0x28 virtual void SetWorldTransform(MxVector3& p_loc, MxVector3& p_dir, MxVector3& p_up); // vtable+0x28
virtual void VTable0x2c(); // vtable+0x2c virtual void ResetWorldTransform(MxBool p_inVehicle); // vtable+0x2c
// OFFSET: LEGO1 0x10001090 // OFFSET: LEGO1 0x10001090
virtual void VTable0x30(undefined4 p_unk50) { m_unk50 = p_unk50; } // vtable+0x30 virtual void SetWorldSpeed(MxFloat p_worldSpeed) { m_worldSpeed = p_worldSpeed; } // vtable+0x30
virtual void VTable0x34(); // vtable+0x34 virtual void VTable0x34(); // vtable+0x34
virtual void VTable0x38(); // vtable+0x38 virtual void VTable0x38(); // vtable+0x38
virtual void VTable0x3c(); // vtable+0x3c virtual void VTable0x3c(); // vtable+0x3c
virtual void VTable0x40(); // vtable+0x40 virtual void VTable0x40(); // vtable+0x40
virtual void VTable0x44(); // vtable+0x44 virtual void VTable0x44(); // vtable+0x44
virtual void VTable0x48(); // vtable+0x48 virtual void VTable0x48(); // vtable+0x48
virtual void VTable0x4c(); // vtable+0x4c virtual void VTable0x4c(); // vtable+0x4c
protected: protected:
void Reset(); void Init();
void AddToCurrentWorld(); void SetWorld();
undefined m_unk10; undefined m_unk10;
undefined m_unk11; undefined m_unk11;
MxVector3Data m_vec1; // 0x14 MxVector3Data m_worldLocation; // 0x14
MxVector3Data m_vec2; // 0x28 MxVector3Data m_worldDirection; // 0x28
MxVector3Data m_vec3; // 0x3c MxVector3Data m_worldUp; // 0x3c
undefined4 m_unk50; MxFloat m_worldSpeed; // 0x50
undefined4 m_unk54; LegoROI* m_roi; // 0x54
undefined m_unk58; MxBool m_cameraFlag; // 0x58
undefined m_unk59; undefined m_unk59;
// For tokens from the extra string that look like this: // For tokens from the extra string that look like this:
// "Action:openram;\lego\scripts\Race\CarRaceR;0" // "Action:openram;\lego\scripts\Race\CarRaceR;0"

View File

@@ -0,0 +1,5 @@
#include "legoeventnotificationparam.h"
#include "decomp.h"
DECOMP_SIZE_ASSERT(LegoEventNotificationParam, 0x1c);

View File

@@ -0,0 +1,22 @@
#ifndef LEGOEVENTNOTIFICATIONPARAM_H
#define LEGOEVENTNOTIFICATIONPARAM_H
#include "mxnotificationparam.h"
#include "mxtypes.h"
// VTABLE 0x100d6aa0
class LegoEventNotificationParam : public MxNotificationParam {
public:
inline LegoEventNotificationParam() : MxNotificationParam((MxParamType) 0, NULL) {}
virtual ~LegoEventNotificationParam() override {} // vtable+0x0 (scalar deleting destructor)
inline MxU8 GetKey() { return m_key; }
protected:
MxU8 m_modifier; // 0x0c
MxS32 m_x; // 0x10
MxS32 m_y; // 0x14
MxU8 m_key; // 0x18
};
#endif // LEGOEVENTNOTIFICATIONPARAM_H

View File

@@ -4,4 +4,4 @@
LegoFlcTexturePresenter::LegoFlcTexturePresenter() LegoFlcTexturePresenter::LegoFlcTexturePresenter()
{ {
// TODO // TODO
} }

View File

@@ -9,7 +9,7 @@ DECOMP_SIZE_ASSERT(LegoInputManager, 0x338);
// OFFSET: LEGO1 0x1005b790 // OFFSET: LEGO1 0x1005b790
LegoInputManager::LegoInputManager() LegoInputManager::LegoInputManager()
{ {
m_unk0x5c = NULL; m_eventQueue = NULL;
m_world = NULL; m_world = NULL;
m_camera = NULL; m_camera = NULL;
m_unk0x68 = NULL; m_unk0x68 = NULL;
@@ -51,9 +51,9 @@ void LegoInputManager::Destroy()
{ {
ReleaseDX(); ReleaseDX();
if (m_unk0x5c) if (m_eventQueue)
delete m_unk0x5c; delete m_eventQueue;
m_unk0x5c = NULL; m_eventQueue = NULL;
if (m_unk0x68) if (m_unk0x68)
delete m_unk0x68; delete m_unk0x68;
@@ -236,4 +236,4 @@ void LegoInputManager::KillTimer()
LegoOmni* omni = LegoOmni::GetInstance(); LegoOmni* omni = LegoOmni::GetInstance();
::KillTimer(omni->GetWindowHandle(), m_timer); ::KillTimer(omni->GetWindowHandle(), m_timer);
} }
} }

View File

@@ -2,6 +2,7 @@
#define LEGOINPUTMANAGER_H #define LEGOINPUTMANAGER_H
#include "decomp.h" #include "decomp.h"
#include "legoeventnotificationparam.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxlist.h" #include "mxlist.h"
#include "mxpresenter.h" #include "mxpresenter.h"
@@ -18,6 +19,8 @@ enum NotificationId {
}; };
class LegoControlManager; class LegoControlManager;
// TODO Really a MxQueue, but we don't have one of those
class LegoEventQueue : public MxList<LegoEventNotificationParam> {};
// VTABLE 0x100d8760 // VTABLE 0x100d8760
// SIZE 0x338 // SIZE 0x338
@@ -52,7 +55,7 @@ public:
// private: // private:
MxCriticalSection m_criticalSection; MxCriticalSection m_criticalSection;
MxList<undefined4>* m_unk0x5c; // list or hash table LegoEventQueue* m_eventQueue; // list or hash table
LegoCameraController* m_camera; LegoCameraController* m_camera;
LegoWorld* m_world; LegoWorld* m_world;
MxList<undefined4>* m_unk0x68; // list or hash table MxList<undefined4>* m_unk0x68; // list or hash table

View File

@@ -3,4 +3,4 @@
#include "decomp.h" #include "decomp.h"
// Uncomment when member class variables are fleshed out. // Uncomment when member class variables are fleshed out.
// DECOMP_SIZE_ASSERT(LegoMeterPresenter, 0x94); // 0x1000a163 // DECOMP_SIZE_ASSERT(LegoMeterPresenter, 0x94); // 0x1000a163

View File

@@ -224,4 +224,4 @@ float LegoNavController::CalculateNewVel(float p_targetVel, float p_currentVel,
} }
return newVel; return newVel;
} }

View File

@@ -164,4 +164,4 @@ void LegoPathActor::VTable0xa4()
void LegoPathActor::VTable0xa8() void LegoPathActor::VTable0xa8()
{ {
// TODO // TODO
} }

View File

@@ -39,4 +39,4 @@ LegoFileStream* LegoFileStream::FUN_10006030(MxString p_str)
Write(data, (MxS16) fullLength); Write(data, (MxS16) fullLength);
return this; return this;
} }

View File

@@ -2,12 +2,20 @@
#include "legoinputmanager.h" #include "legoinputmanager.h"
#include "legoomni.h" #include "legoomni.h"
#include "mxactionnotificationparam.h"
#include "mxnotificationparam.h"
#include "mxomni.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"
DECOMP_SIZE_ASSERT(LegoWorld, 0xf8); DECOMP_SIZE_ASSERT(LegoWorld, 0xf8);
MxBool g_isWorldActive; MxBool g_isWorldActive;
// OFFSET: LEGO1 0x100010a0
void LegoWorld::VTable0x60()
{
}
// OFFSET: LEGO1 0x1001ca40 STUB // OFFSET: LEGO1 0x1001ca40 STUB
LegoWorld::LegoWorld() LegoWorld::LegoWorld()
{ {
@@ -26,12 +34,35 @@ void LegoWorld::Stop()
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
} }
// OFFSET: LEGO1 0x1001f5e0
MxLong LegoWorld::Notify(MxParam& p_param)
{
MxLong ret = 0;
switch (((MxNotificationParam&) p_param).GetNotification()) {
case c_notificationEndAction: {
MxPresenter* presenter = (MxPresenter*) ((MxEndActionNotificationParam&) p_param).GetSender();
EndAction(presenter);
ret = 1;
break;
}
case c_notificationNewPresenter:
TickleManager()->RegisterClient(this, 100);
break;
}
return ret;
}
// OFFSET: LEGO1 0x1001f630 STUB // OFFSET: LEGO1 0x1001f630 STUB
void LegoWorld::VTable0x54() void LegoWorld::VTable0x54()
{ {
// TODO // TODO
} }
// OFFSET: LEGO1 0x10020f10 STUB
void LegoWorld::EndAction(MxPresenter* p_presenter)
{
}
// OFFSET: LEGO1 0x10020220 STUB // OFFSET: LEGO1 0x10020220 STUB
void LegoWorld::VTable0x58(MxCore* p_object) void LegoWorld::VTable0x58(MxCore* p_object)
{ {
@@ -44,11 +75,6 @@ MxBool LegoWorld::VTable0x5c()
return FALSE; return FALSE;
} }
// OFFSET: LEGO1 0x100010a0
void LegoWorld::VTable0x60()
{
}
// OFFSET: LEGO1 0x1001d680 // OFFSET: LEGO1 0x1001d680
MxBool LegoWorld::VTable0x64() MxBool LegoWorld::VTable0x64()
{ {
@@ -86,4 +112,4 @@ void SetIsWorldActive(MxBool p_isWorldActive)
if (!p_isWorldActive) if (!p_isWorldActive)
LegoOmni::GetInstance()->GetInputManager()->SetCamera(NULL); LegoOmni::GetInstance()->GetInputManager()->SetCamera(NULL);
g_isWorldActive = p_isWorldActive; g_isWorldActive = p_isWorldActive;
} }

View File

@@ -3,6 +3,7 @@
#include "legocameracontroller.h" #include "legocameracontroller.h"
#include "legoentity.h" #include "legoentity.h"
#include "mxpresenter.h"
// VTABLE 0x100d6280 // VTABLE 0x100d6280
// SIZE 0xf8 // SIZE 0xf8
@@ -11,6 +12,8 @@ public:
__declspec(dllexport) LegoWorld(); __declspec(dllexport) LegoWorld();
__declspec(dllexport) virtual ~LegoWorld(); // vtable+0x0 __declspec(dllexport) virtual ~LegoWorld(); // vtable+0x0
virtual MxLong Notify(MxParam& p) override; // vtable+0x4
// OFFSET: LEGO1 0x1001d690 // OFFSET: LEGO1 0x1001d690
inline virtual const char* ClassName() const override // vtable+0x0c inline virtual const char* ClassName() const override // vtable+0x0c
{ {
@@ -33,6 +36,7 @@ public:
virtual void VTable0x68(MxBool p_add); // vtable+68 virtual void VTable0x68(MxBool p_add); // vtable+68
MxResult SetAsCurrentWorld(MxDSObject& p_dsObject); MxResult SetAsCurrentWorld(MxDSObject& p_dsObject);
void EndAction(MxPresenter* p_presenter);
protected: protected:
undefined m_unk68[0x30]; undefined m_unk68[0x30];

View File

@@ -12,5 +12,5 @@ MxNotificationParam* MxActionNotificationParam::Clone()
// OFFSET: LEGO1 0x10051270 // OFFSET: LEGO1 0x10051270
MxNotificationParam* MxEndActionNotificationParam::Clone() MxNotificationParam* MxEndActionNotificationParam::Clone()
{ {
return new MxEndActionNotificationParam(MXSTREAMER_UNKNOWN, this->m_sender, this->m_action, this->m_realloc); return new MxEndActionNotificationParam(c_notificationEndAction, this->m_sender, this->m_action, this->m_realloc);
} }

View File

@@ -1,3 +0,0 @@
#include "mxappnotificationparam.h"
DECOMP_SIZE_ASSERT(MxAppNotificationParam, 0x1c)

View File

@@ -1,20 +0,0 @@
#ifndef MXAPPNOTIFICATIONPARAM_H
#define MXAPPNOTIFICATIONPARAM_H
#include "decomp.h"
#include "mxnotificationparam.h"
// VTABLE 0x100d6aa0
class MxAppNotificationParam : public MxNotificationParam {
public:
inline MxAppNotificationParam() : MxNotificationParam((MxParamType) 0, NULL) {}
virtual ~MxAppNotificationParam() override {} // vtable+0x0 (scalar deleting destructor)
inline MxU8 GetUnknown18() { return m_unk18; }
protected:
undefined m_unkc[0xc];
MxU8 m_unk18;
};
#endif // MXAPPNOTIFICATIONPARAM_H

View File

@@ -43,4 +43,4 @@ struct MxAtomIdCounterCompare {
class MxAtomIdCounterSet : public set<MxAtomIdCounter*, MxAtomIdCounterCompare> {}; class MxAtomIdCounterSet : public set<MxAtomIdCounter*, MxAtomIdCounterCompare> {};
#endif // MXATOMIDCOUNTER_H #endif // MXATOMIDCOUNTER_H

View File

@@ -75,4 +75,4 @@ MxResult MxAudioManager::InitPresenters()
void MxAudioManager::Destroy() void MxAudioManager::Destroy()
{ {
Destroy(FALSE); Destroy(FALSE);
} }

View File

@@ -105,4 +105,4 @@ void MxBackgroundAudioManager::DestroyMusic()
Streamer()->Close(m_script.GetInternal()); Streamer()->Close(m_script.GetInternal());
m_musicEnabled = FALSE; m_musicEnabled = FALSE;
} }
} }

View File

@@ -4,4 +4,4 @@
MxCompositeMediaPresenter::MxCompositeMediaPresenter() MxCompositeMediaPresenter::MxCompositeMediaPresenter()
{ {
// TODO // TODO
} }

View File

@@ -11,4 +11,4 @@ MxControlPresenter::MxControlPresenter()
this->m_unk52 = 0; this->m_unk52 = 0;
this->m_unk58 = 0; this->m_unk58 = 0;
this->m_unk54 = 0; this->m_unk54 = 0;
} }

View File

@@ -20,4 +20,4 @@ void MxDSActionList::Destroy(MxDSAction* p_action)
{ {
if (p_action) if (p_action)
delete p_action; delete p_action;
} }

View File

@@ -38,4 +38,4 @@ MxDSAction* MxDSAnim::Clone()
*clone = *this; *clone = *this;
return clone; return clone;
} }

View File

@@ -38,4 +38,4 @@ MxDSAction* MxDSEvent::Clone()
*clone = *this; *clone = *this;
return clone; return clone;
} }

View File

@@ -91,4 +91,4 @@ void MxDSMediaAction::CopyMediaSrcPath(const char* p_mediaSrcPath)
} }
else else
this->m_mediaSrcPath = NULL; this->m_mediaSrcPath = NULL;
} }

View File

@@ -151,4 +151,4 @@ void MxDSMultiAction::SetAtomId(MxAtomId p_atomId)
MxDSAction* action; MxDSAction* action;
while (cursor.Next(action)) while (cursor.Next(action))
action->SetAtomId(p_atomId); action->SetAtomId(p_atomId);
} }

View File

@@ -191,4 +191,4 @@ MxDSObject* DeserializeDSObjectDispatch(char** p_source, MxS16 p_flags)
} }
return obj; return obj;
} }

View File

@@ -84,4 +84,4 @@ MxLong MxDSParallelAction::GetDuration()
this->m_duration *= this->m_loopCount; this->m_duration *= this->m_loopCount;
return this->m_duration; return this->m_duration;
} }

View File

@@ -129,4 +129,4 @@ void MxDSSelectAction::Deserialize(char** p_source, MxS16 p_unk24)
} }
*p_source += extraFlag; *p_source += extraFlag;
} }

View File

@@ -78,4 +78,4 @@ MxLong MxDSSerialAction::GetDuration()
} }
return this->m_duration; return this->m_duration;
} }

View File

@@ -60,4 +60,4 @@ MxDSAction* MxDSSound::Clone()
*clone = *this; *clone = *this;
return clone; return clone;
} }

View File

@@ -38,4 +38,4 @@ MxDSAction* MxDSStill::Clone()
*clone = *this; *clone = *this;
return clone; return clone;
} }

View File

@@ -89,4 +89,4 @@ void MxDSStreamingAction::FUN_100CD2D0()
this->m_duration -= duration; this->m_duration -= duration;
this->m_unka8 += duration; this->m_unka8 += duration;
} }

View File

@@ -42,10 +42,8 @@ public:
m_customDestructor = Destroy; m_customDestructor = Destroy;
} }
// OFFSET: LEGO1 0x100afd30
static void Destroy(T*){}; static void Destroy(T*){};
// OFFSET: LEGO1 0x100afcd0
virtual MxS8 Compare(T*, T*) = 0; virtual MxS8 Compare(T*, T*) = 0;
protected: protected:
@@ -72,7 +70,6 @@ public:
virtual MxS8 Compare(T*, T*) = 0; virtual MxS8 Compare(T*, T*) = 0;
// OFFSET: LEGO1 0x100afdc0
virtual MxU32 Hash(T*) = 0; virtual MxU32 Hash(T*) = 0;
// FIXME: use of friend here? // FIXME: use of friend here?
@@ -154,7 +151,6 @@ private:
}; };
template <class T> template <class T>
// OFFSET: LEGO1 0x100b0bd0
MxHashTable<T>::~MxHashTable() MxHashTable<T>::~MxHashTable()
{ {
for (int i = 0; i < m_numSlots; i++) { for (int i = 0; i < m_numSlots; i++) {
@@ -175,7 +171,6 @@ MxHashTable<T>::~MxHashTable()
} }
template <class T> template <class T>
// OFFSET: LEGO1 0x100b7ab0
inline void MxHashTable<T>::Resize() inline void MxHashTable<T>::Resize()
{ {
// Save a reference to the current table // Save a reference to the current table
@@ -185,10 +180,10 @@ inline void MxHashTable<T>::Resize()
switch (m_resizeOption) { switch (m_resizeOption) {
case HASH_TABLE_OPT_EXPAND_ADD: case HASH_TABLE_OPT_EXPAND_ADD:
m_numSlots = old_size + m_increaseAmount; m_numSlots += m_increaseAmount;
break; break;
case HASH_TABLE_OPT_EXPAND_MULTIPLY: case HASH_TABLE_OPT_EXPAND_MULTIPLY:
m_numSlots = old_size * m_increaseFactor; m_numSlots *= m_increaseFactor;
break; break;
} }
@@ -212,7 +207,6 @@ inline void MxHashTable<T>::Resize()
} }
template <class T> template <class T>
// OFFSET: LEGO1 0x100b7b80
inline void MxHashTable<T>::_NodeInsert(MxHashTableNode<T>* p_node) inline void MxHashTable<T>::_NodeInsert(MxHashTableNode<T>* p_node)
{ {
int bucket = p_node->m_hash % m_numSlots; int bucket = p_node->m_hash % m_numSlots;

View File

@@ -65,4 +65,4 @@ public:
}; };
}; };
#endif // MXMATRIX_H #endif // MXMATRIX_H

View File

@@ -99,4 +99,4 @@ void MxMediaManager::StopPresenters()
while (cursor.Next(presenter)) while (cursor.Next(presenter))
presenter->EndAction(); presenter->EndAction();
} }

View File

@@ -36,4 +36,4 @@ void MxMIDIPresenter::DoneTickle()
if (!MusicManager()->GetMIDIInitialized()) { if (!MusicManager()->GetMIDIInitialized()) {
this->EndAction(); this->EndAction();
} }
} }

View File

@@ -143,4 +143,4 @@ done:
m_criticalSection.Leave(); m_criticalSection.Leave();
return status; return status;
} }

View File

@@ -40,4 +40,4 @@ protected:
void InitData(); void InitData();
}; };
#endif // MXMUSICMANAGER_H #endif // MXMUSICMANAGER_H

View File

@@ -54,7 +54,10 @@ MxResult MxNotificationManager::Tickle()
else { else {
{ {
MxAutoLocker lock(&m_lock); MxAutoLocker lock(&m_lock);
swap(m_queue, m_sendList); MxNotificationPtrList* temp1 = m_queue;
MxNotificationPtrList* temp2 = m_sendList;
m_queue = temp2;
m_sendList = temp1;
} }
while (m_sendList->size() != 0) { while (m_sendList->size() != 0) {
@@ -183,4 +186,4 @@ MxResult MxNotificationManager::Send(MxCore* p_listener, MxNotificationParam* p_
} }
return FAILURE; return FAILURE;
} }

View File

@@ -46,6 +46,7 @@ public:
MxResult Send(MxCore* p_listener, MxNotificationParam* p_param); MxResult Send(MxCore* p_listener, MxNotificationParam* p_param);
inline MxNotificationPtrList* GetQueue() { return m_queue; } inline MxNotificationPtrList* GetQueue() { return m_queue; }
inline void SetActive(MxBool p_active) { m_active = p_active; }
private: private:
void FlushPending(MxCore* p_listener); void FlushPending(MxCore* p_listener);

View File

@@ -9,22 +9,25 @@ class MxCore;
enum MxParamType { enum MxParamType {
PARAM_NONE = 0, PARAM_NONE = 0,
PAINT = 1, // 100dc210:100d8350 PAINT = 1, // 100dc210:100d8350
MXSTREAMER_UNKNOWN = 2, // 100d8358:100d8350 c_notificationEndAction = 2, // 100d8358:100d8350
TYPE4 = 4, // 100dc208:100d8350 TYPE4 = 4, // 100dc208:100d8350
MXPRESENTER_NOTIFICATION = 5, MXPRESENTER_NOTIFICATION = 5,
MXSTREAMER_DELETE_NOTIFY = 6, // 100dc760 MXSTREAMER_DELETE_NOTIFY = 6, // 100dc760
APP_MESSAGE = 7, // 100d6aa0 c_notificationKeyPress = 7, // 100d6aa0
MOUSE_RELEASE = 8, // 100d6aa0 c_notificationButtonUp = 8, // 100d6aa0
MOUSE_PRESS = 9, // 100d6aa0 c_notificationButtonDown = 9, // 100d6aa0
MOUSE_MOVE = 10, // 100d6aa0 c_notificationMouseMove = 10, // 100d6aa0
TYPE11 = 11, // 100d6aa0 TYPE11 = 11, // 100d6aa0
PARAM_TIMER = 15, // 100d6aa0 c_notificationDragEnd = 12,
c_notificationDragStart = 13,
c_notificationDrag = 14,
c_notificationTimer = 15, // 100d6aa0
TYPE17 = 17, TYPE17 = 17,
TYPE18 = 18, // 100d7e80 TYPE18 = 18, // 100d7e80
TYPE19 = 19, // 100d6230 TYPE19 = 19, // 100d6230
TYPE20 = 20, TYPE20 = 20,
TYPE21 = 21, c_notificationNewPresenter = 21,
TYPE22 = 22, TYPE22 = 22,
TYPE23 = 23, TYPE23 = 23,
MXTRANSITIONMANAGER_TRANSITIONENDED = 24 MXTRANSITIONMANAGER_TRANSITIONENDED = 24
@@ -38,7 +41,7 @@ public:
virtual ~MxNotificationParam() override {} // vtable+0x0 (scalar deleting destructor) virtual ~MxNotificationParam() override {} // vtable+0x0 (scalar deleting destructor)
virtual MxNotificationParam* Clone(); // vtable+0x4 virtual MxNotificationParam* Clone(); // vtable+0x4
inline MxParamType GetType() const { return m_type; } inline MxParamType GetNotification() const { return m_type; }
inline MxCore* GetSender() const { return m_sender; } inline MxCore* GetSender() const { return m_sender; }
protected: protected:

View File

@@ -278,18 +278,23 @@ done:
// OFFSET: LEGO1 0x100afe90 // OFFSET: LEGO1 0x100afe90
void MxOmni::Destroy() void MxOmni::Destroy()
{ {
// FIXME: Stub {
MxDSAction action;
/* action.SetObjectId(-1);
// TODO: private members action.SetUnknown24(-2);
if (m_notificationManager) { DeleteObject(action);
while (m_notificationManager->m_queue->size()) {
m_notificationManager->Tickle();
}
} }
m_notificationManager->m_active = 0; // TODO: private members
*/ if (m_notificationManager) {
while (m_notificationManager->GetQueue()) {
if (m_notificationManager->GetQueue()->size() == 0)
break;
m_notificationManager->Tickle();
}
m_notificationManager->SetActive(FALSE);
}
delete m_eventManager; delete m_eventManager;
delete m_soundManager; delete m_soundManager;
@@ -313,6 +318,7 @@ void MxOmni::Destroy()
} }
delete m_atomIdCounterSet; delete m_atomIdCounterSet;
} }
Init();
} }
// OFFSET: LEGO1 0x100b07f0 // OFFSET: LEGO1 0x100b07f0
@@ -320,7 +326,7 @@ MxLong MxOmni::Notify(MxParam& p)
{ {
MxAutoLocker lock(&this->m_criticalsection); MxAutoLocker lock(&this->m_criticalsection);
if (((MxNotificationParam&) p).GetType() != MXSTREAMER_UNKNOWN) if (((MxNotificationParam&) p).GetNotification() != c_notificationEndAction)
return 0; return 0;
return HandleNotificationType2(p); return HandleNotificationType2(p);

View File

@@ -69,7 +69,7 @@ protected:
static MxOmni* g_instance; static MxOmni* g_instance;
MxString m_mediaPath; // 0x8 MxString m_mediaPath; // 0x8
HWND m_windowHandle; // 0x18; HWND m_windowHandle; // 0x18
MxObjectFactory* m_objectFactory; // 0x1C MxObjectFactory* m_objectFactory; // 0x1C
MxVariableTable* m_variableTable; // 0x20 MxVariableTable* m_variableTable; // 0x20
MxTickleManager* m_tickleManager; // 0x24 MxTickleManager* m_tickleManager; // 0x24
@@ -96,7 +96,6 @@ __declspec(dllexport) MxMusicManager* MusicManager();
__declspec(dllexport) MxEventManager* EventManager(); __declspec(dllexport) MxEventManager* EventManager();
__declspec(dllexport) MxNotificationManager* NotificationManager(); __declspec(dllexport) MxNotificationManager* NotificationManager();
MxResult DeleteObject(MxDSAction& p_dsAction);
MxVideoManager* MVideoManager(); MxVideoManager* MVideoManager();
MxAtomIdCounterSet* AtomIdCounterSet(); MxAtomIdCounterSet* AtomIdCounterSet();
MxObjectFactory* ObjectFactory(); MxObjectFactory* ObjectFactory();

View File

@@ -30,11 +30,11 @@ void MxPresenter::Init()
void MxPresenter::ParseExtra() void MxPresenter::ParseExtra()
{ {
MxAutoLocker lock(&m_criticalSection); MxAutoLocker lock(&m_criticalSection);
MxU32 len = m_action->GetExtraLength(); MxU16 len = m_action->GetExtraLength();
char* extraData = m_action->GetExtraData(); char* extraData = m_action->GetExtraData();
if (len) { if (len) {
len &= MAXWORD; // len &= MAXWORD;
char extraCopy[512]; char extraCopy[512];
memcpy(extraCopy, extraData, len); memcpy(extraCopy, extraData, len);
extraCopy[len] = '\0'; extraCopy[len] = '\0';
@@ -141,7 +141,7 @@ void MxPresenter::EndAction()
MxAutoLocker lock(&this->m_criticalSection); MxAutoLocker lock(&this->m_criticalSection);
if (!this->m_unkPresenter) { if (!this->m_unkPresenter) {
MxOmni::GetInstance()->NotifyCurrentEntity( MxOmni::GetInstance()->NotifyCurrentEntity(
&MxEndActionNotificationParam(MXSTREAMER_UNKNOWN, NULL, this->m_action, TRUE) &MxEndActionNotificationParam(c_notificationEndAction, NULL, this->m_action, TRUE)
); );
} }

View File

@@ -26,4 +26,4 @@ void MxSemaphore::Wait(MxU32 p_timeoutMS)
void MxSemaphore::Release(MxU32 p_releaseCount) void MxSemaphore::Release(MxU32 p_releaseCount)
{ {
ReleaseSemaphore(m_hSemaphore, p_releaseCount, NULL); ReleaseSemaphore(m_hSemaphore, p_releaseCount, NULL);
} }

View File

@@ -21,4 +21,4 @@ private:
HANDLE m_hSemaphore; HANDLE m_hSemaphore;
}; };
#endif // MX_SEMAPHORE_H #endif // MX_SEMAPHORE_H

View File

@@ -156,7 +156,7 @@ MxBool MxStreamer::FUN_100b9b30(MxDSObject& p_dsObject)
// OFFSET: LEGO1 0x100b9b60 // OFFSET: LEGO1 0x100b9b60
MxLong MxStreamer::Notify(MxParam& p) MxLong MxStreamer::Notify(MxParam& p)
{ {
if (((MxNotificationParam&) p).GetType() == MXSTREAMER_DELETE_NOTIFY) { if (((MxNotificationParam&) p).GetNotification() == MXSTREAMER_DELETE_NOTIFY) {
MxDSAction ds; MxDSAction ds;
ds.SetUnknown24(-2); ds.SetUnknown24(-2);
@@ -184,4 +184,4 @@ MxStreamerSubClass1::MxStreamerSubClass1(undefined4 size)
for (int i = 0; i >= 0; i--) { for (int i = 0; i >= 0; i--) {
ptr[i] = 0; ptr[i] = 0;
} }
} }

View File

@@ -96,4 +96,4 @@ MxResult MxTickleThread::Run()
Sleep(timeRemainingMS); Sleep(timeRemainingMS);
} }
return MxThread::Run(); return MxThread::Run();
} }

View File

@@ -1,3 +1,3 @@
#include "mxtype17notificationparam.h" #include "mxtype17notificationparam.h"
DECOMP_SIZE_ASSERT(MxType17NotificationParam, 0x2c) DECOMP_SIZE_ASSERT(MxType17NotificationParam, 0x2c)

View File

@@ -17,4 +17,4 @@ protected:
MxU16 m_unk28; MxU16 m_unk28;
}; };
#endif // MXTYPE17NOTIFICATIONPARAM_H #endif // MXTYPE17NOTIFICATIONPARAM_H

View File

@@ -35,4 +35,4 @@ public:
MxU32 m_count; MxU32 m_count;
}; };
#endif // MXUNKLIST_H #endif // MXUNKLIST_H

View File

@@ -21,4 +21,13 @@ public:
virtual MxU32 Hash(MxVariable*); // +0x18 virtual MxU32 Hash(MxVariable*); // +0x18
}; };
// OFFSET: LEGO1 0x100b0bd0 TEMPLATE
// MxHashTable<MxVariable>::~MxHashTable<MxVariable>
// OFFSET: LEGO1 0x100b7ab0 TEMPLATE
// MxHashTable<MxVariable>::Resize
// OFFSET: LEGO1 0x100b7b80 TEMPLATE
// MxHashTable<MxVariable>::_NodeInsert
#endif // MXVARIABLETABLE_H #endif // MXVARIABLETABLE_H

View File

@@ -10,4 +10,4 @@ PizzaMissionStateEntry* PizzaMissionState::GetState(MxU8 id)
if (m_state[i].m_id == id) if (m_state[i].m_id == id)
return m_state + i; return m_state + i;
return NULL; return NULL;
} }

View File

@@ -20,4 +20,4 @@ RaceStateEntry* RaceState::GetState(MxU8 id)
if (m_state[i].m_id == id) if (m_state[i].m_id == id)
return m_state + i; return m_state + i;
} }
} }

View File

@@ -4,4 +4,4 @@
Radio::~Radio() Radio::~Radio()
{ {
// TODO // TODO
} }

View File

@@ -40,16 +40,16 @@ MxLong Score::Notify(MxParam& p)
MxLong ret = 0; MxLong ret = 0;
LegoWorld::Notify(p); LegoWorld::Notify(p);
if (m_unkf6) { if (m_unkf6) {
switch (((MxNotificationParam&) p).GetType()) { switch (((MxNotificationParam&) p).GetNotification()) {
case PAINT: case PAINT:
ret = 1; ret = 1;
Paint(); Paint();
break; break;
case MXSTREAMER_UNKNOWN: case c_notificationEndAction:
ret = FUN_10001510((MxEndActionNotificationParam&) p); ret = FUN_10001510((MxEndActionNotificationParam&) p);
break; break;
case APP_MESSAGE: case c_notificationKeyPress:
if (((MxAppNotificationParam&) p).GetUnknown18() == 0x20) if (((LegoEventNotificationParam&) p).GetKey() == 0x20)
DeleteScript(); // Shutting down DeleteScript(); // Shutting down
ret = 1; ret = 1;
break; break;
@@ -324,4 +324,4 @@ MxBool Score::VTable0x64()
DeleteScript(); DeleteScript();
m_unkf8 = 2; m_unkf8 = 2;
return TRUE; return TRUE;
} }

View File

@@ -1,9 +1,9 @@
#ifndef SCORE_H #ifndef SCORE_H
#define SCORE_H #define SCORE_H
#include "legoeventnotificationparam.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxactionnotificationparam.h" #include "mxactionnotificationparam.h"
#include "mxappnotificationparam.h"
#include "mxtype17notificationparam.h" #include "mxtype17notificationparam.h"
#include "scorestate.h" #include "scorestate.h"
@@ -28,6 +28,9 @@ public:
return !strcmp(name, Score::ClassName()) || LegoWorld::IsA(name); return !strcmp(name, Score::ClassName()) || LegoWorld::IsA(name);
} }
// OFFSET: LEGO1 0x100011e0 TEMPLATE
// Helicopter::`scalar deleting destructor'
virtual MxResult InitFromMxDSObject(MxDSObject& p_dsObject) override; // vtable+18 virtual MxResult InitFromMxDSObject(MxDSObject& p_dsObject) override; // vtable+18
virtual void Stop() override; // vtable+50 virtual void Stop() override; // vtable+50
virtual MxBool VTable0x5c() override; // vtable+5c virtual MxBool VTable0x5c() override; // vtable+5c