Improve order until legomain.cpp (#1350)

* Fix `LegoBackgroundColor` order

* Order

* Improve order in Act3Actors

* Improve order

* Add BETA annotation

* Order more

* More order

* More order

* Order

* Match/order

* Remove blank line

* Modern compiler fix

* vtable annotation
This commit is contained in:
Christian Semmler
2025-01-17 18:33:27 -07:00
committed by GitHub
parent e1ce96c473
commit fc03e7a682
24 changed files with 218 additions and 208 deletions

View File

@@ -340,7 +340,6 @@ function(add_lego_libraries NAME)
LEGO1/lego/legoomni/src/common/legovariables.cpp LEGO1/lego/legoomni/src/common/legovariables.cpp
LEGO1/lego/legoomni/src/actors/pizza.cpp LEGO1/lego/legoomni/src/actors/pizza.cpp
LEGO1/lego/legoomni/src/common/legogamestate.cpp LEGO1/lego/legoomni/src/common/legogamestate.cpp
LEGO1/lego/legoomni/src/actors/act3ammo.cpp
LEGO1/lego/legoomni/src/audio/legocachesoundmanager.cpp LEGO1/lego/legoomni/src/audio/legocachesoundmanager.cpp
LEGO1/lego/legoomni/src/common/legoutils.cpp LEGO1/lego/legoomni/src/common/legoutils.cpp
LEGO1/lego/legoomni/src/actors/act3actors.cpp LEGO1/lego/legoomni/src/actors/act3actors.cpp
@@ -350,7 +349,6 @@ function(add_lego_libraries NAME)
LEGO1/lego/legoomni/src/paths/legopathpresenter.cpp LEGO1/lego/legoomni/src/paths/legopathpresenter.cpp
LEGO1/lego/legoomni/src/common/legophoneme.cpp LEGO1/lego/legoomni/src/common/legophoneme.cpp
LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp
LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp
LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp
LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp
LEGO1/lego/legoomni/src/common/mxtransitionmanager.cpp LEGO1/lego/legoomni/src/common/mxtransitionmanager.cpp
@@ -361,9 +359,11 @@ function(add_lego_libraries NAME)
LEGO1/lego/legoomni/src/worlds/legoact2.cpp LEGO1/lego/legoomni/src/worlds/legoact2.cpp
LEGO1/lego/legoomni/src/main/scripts.cpp LEGO1/lego/legoomni/src/main/scripts.cpp
LEGO1/lego/legoomni/src/entity/legoentitypresenter.cpp LEGO1/lego/legoomni/src/entity/legoentitypresenter.cpp
LEGO1/lego/legoomni/src/actors/act3ammo.cpp
LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp
LEGO1/lego/legoomni/src/paths/legopathboundary.cpp LEGO1/lego/legoomni/src/paths/legopathboundary.cpp
LEGO1/lego/legoomni/src/main/legomain.cpp LEGO1/lego/legoomni/src/main/legomain.cpp
LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp
LEGO1/lego/legoomni/src/input/legoinputmanager.cpp LEGO1/lego/legoomni/src/input/legoinputmanager.cpp
LEGO1/lego/legoomni/src/race/legoracemap.cpp LEGO1/lego/legoomni/src/race/legoracemap.cpp
LEGO1/lego/legoomni/src/worlds/jukebox.cpp LEGO1/lego/legoomni/src/worlds/jukebox.cpp

View File

@@ -10,6 +10,44 @@ struct LegoBuildingInfo;
struct LegoPlantInfo; struct LegoPlantInfo;
class LegoWorld; class LegoWorld;
// VTABLE: LEGO1 0x100d7920 LegoPathActor
// VTABLE: LEGO1 0x100d79f0 LegoAnimActor
// SIZE 0x1a8
class Act3Shark : public LegoAnimActor {
public:
Act3Shark();
void ParseAction(char*) override; // vtable+0x20
void Animate(float p_time) override; // vtable+0x70
// LegoAnimActor vtable
virtual MxResult EatPizza(Act3Ammo* p_ammo); // vtable+0x10
// FUNCTION: LEGO1 0x100430d0
const char* ClassName() const override // vtable+0x0c
{
// Does not exist in BETA10
// STRING: LEGO1 0x100f03a0
return "Act3Shark";
}
MxFloat GetUnknown0x2c() { return m_unk0x2c; }
void SetUnknown0x2c(MxFloat p_unk0x2c) { m_unk0x2c = p_unk0x2c; }
// SYNTHETIC: LEGO1 0x10043030
// Act3Shark::`scalar deleting destructor'
private:
list<Act3Ammo*> m_eatPizzas; // 0x1c
Act3Ammo* m_nextPizza; // 0x28
MxFloat m_unk0x2c; // 0x2c
LegoWorld* m_world; // 0x30
LegoAnimActorStruct* m_unk0x34; // 0x34
LegoROI* m_unk0x38; // 0x38
Mx3DPointFloat m_unk0x3c; // 0x3c
};
// VTABLE: LEGO1 0x100d7668 LegoPathActor // VTABLE: LEGO1 0x100d7668 LegoPathActor
// VTABLE: LEGO1 0x100d7738 LegoAnimActor // VTABLE: LEGO1 0x100d7738 LegoAnimActor
// VTABLE: BETA10 0x101b8a98 LegoPathActor // VTABLE: BETA10 0x101b8a98 LegoPathActor
@@ -17,19 +55,11 @@ class LegoWorld;
// SIZE 0x178 // SIZE 0x178
class Act3Actor : public LegoAnimActor { class Act3Actor : public LegoAnimActor {
public: public:
struct Act3CopDest {
// name verified by BETA10 0x10018776
const char* m_bName; // 0x00
// name verified by BETA10 0x100187cb
LegoPathBoundary* m_boundary; // 0x04
MxFloat m_unk0x08[3]; // 0x08
MxFloat m_unk0x14[3]; // 0x14
};
Act3Actor(); Act3Actor();
MxU32 VTable0x90(float p_time, Matrix4& p_transform) override; // vtable+0x90
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
// FUNCTION: LEGO1 0x100431b0 // FUNCTION: LEGO1 0x100431b0
// FUNCTION: BETA10 0x1001d320 // FUNCTION: BETA10 0x1001d320
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@@ -38,9 +68,6 @@ public:
return "Act3Actor"; return "Act3Actor";
} }
MxU32 VTable0x90(float p_time, Matrix4& p_transform) override; // vtable+0x90
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
MxFloat GetUnknown0x1c() { return m_unk0x1c; } MxFloat GetUnknown0x1c() { return m_unk0x1c; }
void SetUnknown0x1c(MxFloat p_unk0x1c) { m_unk0x1c = p_unk0x1c; } void SetUnknown0x1c(MxFloat p_unk0x1c) { m_unk0x1c = p_unk0x1c; }
@@ -62,6 +89,17 @@ private:
// SIZE 0x188 // SIZE 0x188
class Act3Cop : public Act3Actor { class Act3Cop : public Act3Actor {
public: public:
struct Act3CopDest {
// name verified by BETA10 0x10018776
const char* m_bName; // 0x00
// name verified by BETA10 0x100187cb
LegoPathBoundary* m_boundary; // 0x04
MxFloat m_unk0x08[3]; // 0x08
MxFloat m_unk0x14[3]; // 0x14
};
Act3Cop(); Act3Cop();
void ParseAction(char* p_extra) override; // vtable+0x20 void ParseAction(char* p_extra) override; // vtable+0x20
@@ -137,44 +175,6 @@ private:
MxU8 m_unk0x58; // 0x58 MxU8 m_unk0x58; // 0x58
}; };
// VTABLE: LEGO1 0x100d7920 LegoPathActor
// VTABLE: LEGO1 0x100d79f0 LegoAnimActor
// SIZE 0x1a8
class Act3Shark : public LegoAnimActor {
public:
Act3Shark();
// FUNCTION: LEGO1 0x100430d0
const char* ClassName() const override // vtable+0x0c
{
// Does not exist in BETA10
// STRING: LEGO1 0x100f03a0
return "Act3Shark";
}
void ParseAction(char*) override; // vtable+0x20
void Animate(float p_time) override; // vtable+0x70
// LegoAnimActor vtable
virtual MxResult EatPizza(Act3Ammo* p_ammo); // vtable+0x10
MxFloat GetUnknown0x2c() { return m_unk0x2c; }
void SetUnknown0x2c(MxFloat p_unk0x2c) { m_unk0x2c = p_unk0x2c; }
// SYNTHETIC: LEGO1 0x10043030
// Act3Shark::`scalar deleting destructor'
private:
list<Act3Ammo*> m_eatPizzas; // 0x1c
Act3Ammo* m_nextPizza; // 0x28
MxFloat m_unk0x2c; // 0x2c
LegoWorld* m_world; // 0x30
LegoAnimActorStruct* m_unk0x34; // 0x34
LegoROI* m_unk0x38; // 0x38
Mx3DPointFloat m_unk0x3c; // 0x3c
};
// FUNCTION: LEGO1 0x1003ff10 // FUNCTION: LEGO1 0x1003ff10
// Act3Actor::`vbase destructor' // Act3Actor::`vbase destructor'

View File

@@ -65,7 +65,10 @@ public:
MxResult Tickle() override; // vtable+0x08 MxResult Tickle() override; // vtable+0x08
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
MxBool VTable0x5c() override; // vtable+0x5c
// FUNCTION: LEGO1 0x1004fe10
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
void VTable0x60() override; // vtable+0x60 void VTable0x60() override; // vtable+0x60
MxBool Escape() override; // vtable+0x64 MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68 void Enable(MxBool p_enable) override; // vtable+0x68

View File

@@ -42,6 +42,16 @@ public:
~LegoAnimActor() override; ~LegoAnimActor() override;
void ParseAction(char* p_extra) override; // vtable+0x20
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
void Animate(float p_time) override; // vtable+0x70
void VTable0x74(Matrix4& p_transform) override; // vtable+0x74
virtual MxResult FUN_1001c1f0(float& p_und);
virtual MxResult FUN_1001c360(float, Matrix4& p_transform);
virtual MxResult FUN_1001c450(LegoAnim* p_AnimTreePtr, float p_unk0x00, LegoROI** p_roiMap, MxU32 p_numROIs);
virtual void ClearMaps();
// FUNCTION: LEGO1 0x1000fba0 // FUNCTION: LEGO1 0x1000fba0
// FUNCTION: BETA10 0x10012400 // FUNCTION: BETA10 0x10012400
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@@ -57,16 +67,6 @@ public:
return !strcmp(p_name, LegoAnimActor::ClassName()) || LegoPathActor::IsA(p_name); return !strcmp(p_name, LegoAnimActor::ClassName()) || LegoPathActor::IsA(p_name);
} }
void ParseAction(char* p_extra) override; // vtable+0x20
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
void Animate(float p_time) override; // vtable+0x70
void VTable0x74(Matrix4& p_transform) override; // vtable+0x74
virtual MxResult FUN_1001c1f0(float& p_und);
virtual MxResult FUN_1001c360(float, Matrix4& p_transform);
virtual MxResult FUN_1001c450(LegoAnim* p_AnimTreePtr, float p_unk0x00, LegoROI** p_roiMap, MxU32 p_numROIs);
virtual void ClearMaps();
// SYNTHETIC: LEGO1 0x1000fb60 // SYNTHETIC: LEGO1 0x1000fb60
// LegoAnimActor::`scalar deleting destructor' // LegoAnimActor::`scalar deleting destructor'

View File

@@ -1,6 +1,10 @@
#ifndef LEGOANIMMMPRESENTER_H #ifndef LEGOANIMMMPRESENTER_H
#define LEGOANIMMMPRESENTER_H #define LEGOANIMMMPRESENTER_H
// MxDSActionListCursor needs to be included before std::list
// clang-format off
#include "mxdsmultiaction.h"
// clang-format on
#include "mxcompositepresenter.h" #include "mxcompositepresenter.h"
class LegoAnimPresenter; class LegoAnimPresenter;

View File

@@ -26,6 +26,7 @@ struct ColorStringStruct {
// SIZE 0x30 // SIZE 0x30
class LegoBackgroundColor : public MxVariable { class LegoBackgroundColor : public MxVariable {
public: public:
LegoBackgroundColor();
LegoBackgroundColor(const char* p_key, const char* p_value); LegoBackgroundColor(const char* p_key, const char* p_value);
void SetValue(const char* p_colorString) override; // vtable+0x04 void SetValue(const char* p_colorString) override; // vtable+0x04

View File

@@ -37,20 +37,6 @@ public:
LegoPathActor(); LegoPathActor();
~LegoPathActor() override; ~LegoPathActor() override;
// FUNCTION: LEGO1 0x1000c430
// FUNCTION: BETA10 0x10012790
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0114
return "LegoPathActor";
}
// FUNCTION: LEGO1 0x1000c440
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoPathActor::ClassName()) || LegoActor::IsA(p_name);
}
void ParseAction(char* p_extra) override; // vtable+0x20 void ParseAction(char* p_extra) override; // vtable+0x20
virtual MxS32 VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3); // vtable+0x68 virtual MxS32 VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3); // vtable+0x68
virtual MxU32 VTable0x6c( virtual MxU32 VTable0x6c(
@@ -137,6 +123,20 @@ public:
// FUNCTION: LEGO1 0x10002de0 // FUNCTION: LEGO1 0x10002de0
virtual void VTable0xc8(MxU8 p_unk0x148) { m_unk0x148 = p_unk0x148; } // vtable+0xc8 virtual void VTable0xc8(MxU8 p_unk0x148) { m_unk0x148 = p_unk0x148; } // vtable+0xc8
// FUNCTION: LEGO1 0x1000c430
// FUNCTION: BETA10 0x10012790
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0114
return "LegoPathActor";
}
// FUNCTION: LEGO1 0x1000c440
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoPathActor::ClassName()) || LegoActor::IsA(p_name);
}
// FUNCTION: BETA10 0x1001ca40 // FUNCTION: BETA10 0x1001ca40
LegoPathBoundary* GetBoundary() { return m_boundary; } LegoPathBoundary* GetBoundary() { return m_boundary; }

View File

@@ -5,11 +5,10 @@
#include "geom/legounkown100db7f4.h" #include "geom/legounkown100db7f4.h"
#include "legopathactor.h" #include "legopathactor.h"
#include "legopathboundary.h" #include "legopathboundary.h"
#include "mxcore.h" #include "legopathstruct.h"
#include "mxstl/stlcompat.h" #include "mxstl/stlcompat.h"
class LegoAnimPresenter; class LegoAnimPresenter;
class LegoPathStruct;
class LegoWorld; class LegoWorld;
class MxAtomId; class MxAtomId;
class Vector3; class Vector3;

View File

@@ -15,6 +15,15 @@ public:
MxControlPresenter(); MxControlPresenter();
~MxControlPresenter() override; ~MxControlPresenter() override;
// FUNCTION: LEGO1 0x10043fd0
void RepeatingTickle() override {} // vtable+0x24
// FUNCTION: LEGO1 0x10043fe0
MxBool VTable0x64(undefined4 p_undefined) override { return m_unk0x50; } // vtable+0x64
// FUNCTION: LEGO1 0x10043ff0
virtual void VTable0x68(MxBool p_unk0x50) { m_unk0x50 = p_unk0x50; } // vtable+0x68
// FUNCTION: LEGO1 0x10044000 // FUNCTION: LEGO1 0x10044000
// FUNCTION: BETA10 0x100ebf80 // FUNCTION: BETA10 0x100ebf80
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@@ -30,15 +39,12 @@ public:
} }
void ReadyTickle() override; // vtable+0x18 void ReadyTickle() override; // vtable+0x18
void RepeatingTickle() override; // vtable+0x24
void ParseExtra() override; // vtable+0x30 void ParseExtra() override; // vtable+0x30
MxResult AddToManager() override; // vtable+0x34 MxResult AddToManager() override; // vtable+0x34
MxResult StartAction(MxStreamController*, MxDSAction*) override; // vtable+0x3c MxResult StartAction(MxStreamController*, MxDSAction*) override; // vtable+0x3c
void EndAction() override; // vtable+0x40 void EndAction() override; // vtable+0x40
MxBool HasTickleStatePassed(TickleState p_tickleState) override; // vtable+0x48 MxBool HasTickleStatePassed(TickleState p_tickleState) override; // vtable+0x48
void Enable(MxBool p_enable) override; // vtable+0x54 void Enable(MxBool p_enable) override; // vtable+0x54
MxBool VTable0x64(undefined4 p_undefined) override; // vtable+0x64
virtual void VTable0x68(MxBool p_unk0x50); // vtable+0x68
virtual void VTable0x6c(MxS16 p_unk0x4e); // vtable+0x6c virtual void VTable0x6c(MxS16 p_unk0x4e); // vtable+0x6c
MxBool FUN_10044480(LegoControlManagerNotificationParam* p_param, MxPresenter* p_presenter); MxBool FUN_10044480(LegoControlManagerNotificationParam* p_param, MxPresenter* p_presenter);

View File

@@ -14,6 +14,40 @@ class TowTrackMissionState : public LegoState {
public: public:
TowTrackMissionState(); TowTrackMissionState();
// FUNCTION: LEGO1 0x1004dde0
// FUNCTION: BETA10 0x100f8720
MxResult Serialize(LegoStorage* p_storage) override
{
LegoState::Serialize(p_storage);
if (p_storage->IsReadMode()) {
p_storage->ReadS16(m_peScore);
p_storage->ReadS16(m_maScore);
p_storage->ReadS16(m_paScore);
p_storage->ReadS16(m_niScore);
p_storage->ReadS16(m_laScore);
p_storage->ReadS16(m_peHighScore);
p_storage->ReadS16(m_maHighScore);
p_storage->ReadS16(m_paHighScore);
p_storage->ReadS16(m_niHighScore);
p_storage->ReadS16(m_laHighScore);
}
else if (p_storage->IsWriteMode()) {
p_storage->WriteS16(m_peScore);
p_storage->WriteS16(m_maScore);
p_storage->WriteS16(m_paScore);
p_storage->WriteS16(m_niScore);
p_storage->WriteS16(m_laScore);
p_storage->WriteS16(m_peHighScore);
p_storage->WriteS16(m_maHighScore);
p_storage->WriteS16(m_paHighScore);
p_storage->WriteS16(m_niHighScore);
p_storage->WriteS16(m_laHighScore);
}
return SUCCESS;
} // vtable+0x1c
// FUNCTION: LEGO1 0x1004dfa0 // FUNCTION: LEGO1 0x1004dfa0
// FUNCTION: BETA10 0x100f8920 // FUNCTION: BETA10 0x100f8920
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@@ -28,8 +62,6 @@ public:
return !strcmp(p_name, TowTrackMissionState::ClassName()) || LegoState::IsA(p_name); return !strcmp(p_name, TowTrackMissionState::ClassName()) || LegoState::IsA(p_name);
} }
MxResult Serialize(LegoStorage* p_storage) override; // vtable+0x1c
// FUNCTION: BETA10 0x10088890 // FUNCTION: BETA10 0x10088890
MxS16 GetHighScore(MxU8 p_actorId) MxS16 GetHighScore(MxU8 p_actorId)
{ {

View File

@@ -29,7 +29,7 @@ DECOMP_SIZE_ASSERT(Act3Shark, 0x1a8)
// name verified by BETA10 0x10018776 // name verified by BETA10 0x10018776
// GLOBAL: LEGO1 0x100f4120 // GLOBAL: LEGO1 0x100f4120
// GLOBAL: BETA10 0x101dcdc8 // GLOBAL: BETA10 0x101dcdc8
Act3Actor::Act3CopDest g_copDest[5] = { Act3Cop::Act3CopDest g_copDest[5] = {
{"INT38", NULL, {3.69, -1.31251, -59.231}, {-0.99601698, 0.0, -0.089166}}, {"INT38", NULL, {3.69, -1.31251, -59.231}, {-0.99601698, 0.0, -0.089166}},
{ {
"EDG02_08", "EDG02_08",
@@ -1012,9 +1012,6 @@ MxResult Act3Brickster::FUN_100417c0()
// FUNCTION: BETA10 0x1001b017 // FUNCTION: BETA10 0x1001b017
MxS32 Act3Brickster::FUN_10042300() MxS32 Act3Brickster::FUN_10042300()
{ {
// TODO: Has poor inlining, can be fixed by changing the assignment operator in vector.h
// See extended comment in vector.h for operator=
Act3* a3 = (Act3*) m_world; Act3* a3 = (Act3*) m_world;
assert(a3 && a3->m_cop1 && a3->m_cop2); assert(a3 && a3->m_cop1 && a3->m_cop2);

View File

@@ -607,37 +607,3 @@ TowTrackMissionState::TowTrackMissionState()
m_niHighScore = 0; m_niHighScore = 0;
m_laHighScore = 0; m_laHighScore = 0;
} }
// FUNCTION: LEGO1 0x1004dde0
// FUNCTION: BETA10 0x100f8720
MxResult TowTrackMissionState::Serialize(LegoStorage* p_storage)
{
LegoState::Serialize(p_storage);
if (p_storage->IsReadMode()) {
p_storage->ReadS16(m_peScore);
p_storage->ReadS16(m_maScore);
p_storage->ReadS16(m_paScore);
p_storage->ReadS16(m_niScore);
p_storage->ReadS16(m_laScore);
p_storage->ReadS16(m_peHighScore);
p_storage->ReadS16(m_maHighScore);
p_storage->ReadS16(m_paHighScore);
p_storage->ReadS16(m_niHighScore);
p_storage->ReadS16(m_laHighScore);
}
else if (p_storage->IsWriteMode()) {
p_storage->WriteS16(m_peScore);
p_storage->WriteS16(m_maScore);
p_storage->WriteS16(m_paScore);
p_storage->WriteS16(m_niScore);
p_storage->WriteS16(m_laScore);
p_storage->WriteS16(m_peHighScore);
p_storage->WriteS16(m_maHighScore);
p_storage->WriteS16(m_paHighScore);
p_storage->WriteS16(m_niHighScore);
p_storage->WriteS16(m_laHighScore);
}
return SUCCESS;
}

View File

@@ -20,9 +20,9 @@ LegoCacheSoundManager::~LegoCacheSoundManager()
while (!m_list.empty()) { while (!m_list.empty()) {
sound = (*m_list.begin()).GetSound(); sound = (*m_list.begin()).GetSound();
// TODO: LegoCacheSoundEntry::~LegoCacheSoundEntry should not be inlined here
m_list.erase(m_list.begin()); m_list.erase(m_list.begin());
sound->Stop(); sound->Stop();
// DECOMP: delete should not be inlined here
delete sound; delete sound;
} }
} }

View File

@@ -1084,6 +1084,7 @@ LegoState* LegoGameState::CreateState(const char* p_stateName)
} }
// FUNCTION: LEGO1 0x1003bc30 // FUNCTION: LEGO1 0x1003bc30
// FUNCTION: BETA10 0x1008636e
void LegoGameState::RegisterState(LegoState* p_state) void LegoGameState::RegisterState(LegoState* p_state)
{ {
MxS32 targetIndex; MxS32 targetIndex;
@@ -1164,7 +1165,16 @@ void LegoGameState::Init()
m_unk0x42c = e_undefined; m_unk0x42c = e_undefined;
} }
// FUNCTION: BETA10 0x10086510
LegoBackgroundColor::LegoBackgroundColor()
{
m_h = 0.0f;
m_s = 0.0f;
m_v = 0.0f;
}
// FUNCTION: LEGO1 0x1003bfb0 // FUNCTION: LEGO1 0x1003bfb0
// FUNCTION: BETA10 0x1008659d
LegoBackgroundColor::LegoBackgroundColor(const char* p_key, const char* p_value) LegoBackgroundColor::LegoBackgroundColor(const char* p_key, const char* p_value)
{ {
m_key = p_key; m_key = p_key;
@@ -1173,6 +1183,7 @@ LegoBackgroundColor::LegoBackgroundColor(const char* p_key, const char* p_value)
} }
// FUNCTION: LEGO1 0x1003c070 // FUNCTION: LEGO1 0x1003c070
// FUNCTION: BETA10 0x10086634
void LegoBackgroundColor::SetValue(const char* p_colorString) void LegoBackgroundColor::SetValue(const char* p_colorString)
{ {
m_value = p_colorString; m_value = p_colorString;
@@ -1213,6 +1224,7 @@ void LegoBackgroundColor::SetValue(const char* p_colorString)
} }
// FUNCTION: LEGO1 0x1003c230 // FUNCTION: LEGO1 0x1003c230
// FUNCTION: BETA10 0x100867f9
void LegoBackgroundColor::ToggleDayNight(MxBool p_sun) void LegoBackgroundColor::ToggleDayNight(MxBool p_sun)
{ {
char buffer[30]; char buffer[30];
@@ -1240,6 +1252,7 @@ void LegoBackgroundColor::ToggleDayNight(MxBool p_sun)
} }
// FUNCTION: LEGO1 0x1003c330 // FUNCTION: LEGO1 0x1003c330
// FUNCTION: BETA10 0x100868de
void LegoBackgroundColor::ToggleSkyColor() void LegoBackgroundColor::ToggleSkyColor()
{ {
char buffer[30]; char buffer[30];
@@ -1259,6 +1272,7 @@ void LegoBackgroundColor::ToggleSkyColor()
} }
// FUNCTION: LEGO1 0x1003c400 // FUNCTION: LEGO1 0x1003c400
// FUNCTION: BETA10 0x10086984
void LegoBackgroundColor::SetLightColor(float p_r, float p_g, float p_b) void LegoBackgroundColor::SetLightColor(float p_r, float p_g, float p_b)
{ {
if (!VideoManager()->GetVideoParam().Flags().GetF2bit0()) { if (!VideoManager()->GetVideoParam().Flags().GetF2bit0()) {
@@ -1293,6 +1307,7 @@ void LegoBackgroundColor::SetLightColor()
} }
// FUNCTION: LEGO1 0x1003c500 // FUNCTION: LEGO1 0x1003c500
// FUNCTION: BETA10 0x10086af6
LegoFullScreenMovie::LegoFullScreenMovie(const char* p_key, const char* p_value) LegoFullScreenMovie::LegoFullScreenMovie(const char* p_key, const char* p_value)
{ {
m_key = p_key; m_key = p_key;
@@ -1301,6 +1316,7 @@ LegoFullScreenMovie::LegoFullScreenMovie(const char* p_key, const char* p_value)
} }
// FUNCTION: LEGO1 0x1003c5c0 // FUNCTION: LEGO1 0x1003c5c0
// FUNCTION: BETA10 0x10086b8d
void LegoFullScreenMovie::SetValue(const char* p_option) void LegoFullScreenMovie::SetValue(const char* p_option)
{ {
m_value = p_option; m_value = p_option;
@@ -1310,12 +1326,9 @@ void LegoFullScreenMovie::SetValue(const char* p_option)
if (videomanager) { if (videomanager) {
if (!strcmp(m_value.GetData(), g_strEnable)) { if (!strcmp(m_value.GetData(), g_strEnable)) {
videomanager->EnableFullScreenMovie(TRUE); videomanager->EnableFullScreenMovie(TRUE);
return;
} }
else if (!strcmp(m_value.GetData(), g_strDisable)) {
if (!strcmp(m_value.GetData(), g_strDisable)) {
videomanager->EnableFullScreenMovie(FALSE); videomanager->EnableFullScreenMovie(FALSE);
return;
} }
} }
} }

View File

@@ -14,30 +14,12 @@ DECOMP_SIZE_ASSERT(MxControlPresenter, 0x5c)
// FUNCTION: LEGO1 0x10043f50 // FUNCTION: LEGO1 0x10043f50
MxControlPresenter::MxControlPresenter() MxControlPresenter::MxControlPresenter()
{ {
this->m_unk0x4c = 0; m_unk0x4c = 0;
this->m_unk0x4e = -1; m_unk0x4e = -1;
this->m_unk0x50 = FALSE; m_unk0x50 = FALSE;
this->m_unk0x52 = 0; m_unk0x52 = 0;
this->m_unk0x58 = 0; m_unk0x58 = 0;
this->m_unk0x54 = 0; m_unk0x54 = 0;
}
// FUNCTION: LEGO1 0x10043fd0
void MxControlPresenter::RepeatingTickle()
{
// empty
}
// FUNCTION: LEGO1 0x10043fe0
MxBool MxControlPresenter::VTable0x64(undefined4 p_undefined)
{
return m_unk0x50;
}
// FUNCTION: LEGO1 0x10043ff0
void MxControlPresenter::VTable0x68(MxBool p_unk0x50)
{
m_unk0x50 = p_unk0x50;
} }
// FUNCTION: LEGO1 0x10044110 // FUNCTION: LEGO1 0x10044110
@@ -89,6 +71,7 @@ void MxControlPresenter::EndAction()
} }
// FUNCTION: LEGO1 0x10044270 // FUNCTION: LEGO1 0x10044270
// FUNCTION: BETA10 0x100eae68
MxBool MxControlPresenter::FUN_10044270(MxS32 p_x, MxS32 p_y, MxVideoPresenter* p_presenter) MxBool MxControlPresenter::FUN_10044270(MxS32 p_x, MxS32 p_y, MxVideoPresenter* p_presenter)
{ {
if (m_unk0x4c == 3) { if (m_unk0x4c == 3) {

View File

@@ -21,7 +21,6 @@
#include "mxautolock.h" #include "mxautolock.h"
#include "mxbackgroundaudiomanager.h" #include "mxbackgroundaudiomanager.h"
#include "mxdisplaysurface.h" #include "mxdisplaysurface.h"
#include "mxdsfile.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h" #include "mxnotificationmanager.h"
#include "mxomnicreateflags.h" #include "mxomnicreateflags.h"

View File

@@ -1,7 +1,6 @@
#include "legopathcontroller.h" #include "legopathcontroller.h"
#include "legopathedgecontainer.h" #include "legopathedgecontainer.h"
#include "legopathstruct.h"
#include "misc/legostorage.h" #include "misc/legostorage.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"
@@ -214,12 +213,21 @@ MxResult LegoPathController::PlaceActor(
} }
LegoPathBoundary* pBoundary = GetPathBoundary(p_name); LegoPathBoundary* pBoundary = GetPathBoundary(p_name);
assert(pBoundary);
assert(p_src < pBoundary->GetNumEdges() && p_dest < pBoundary->GetNumEdges());
LegoEdge* pSrcE = pBoundary->GetEdges()[p_src]; LegoEdge* pSrcE = pBoundary->GetEdges()[p_src];
LegoEdge* pDestE = pBoundary->GetEdges()[p_dest]; LegoEdge* pDestE = pBoundary->GetEdges()[p_dest];
float time = Timer()->GetTime();
if (p_actor->VTable0x88(pBoundary, time, *pSrcE, p_srcScale, (LegoUnknown100db7f4&) *pDestE, p_destScale) != assert(pSrcE && pDestE);
SUCCESS) {
float time = Timer()->GetTime();
MxResult result =
p_actor->VTable0x88(pBoundary, time, *pSrcE, p_srcScale, (LegoUnknown100db7f4&) *pDestE, p_destScale);
if (result != SUCCESS) {
assert(0);
return FAILURE; return FAILURE;
} }
@@ -679,7 +687,7 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage)
if (boundary.m_numTriggers > 0) { if (boundary.m_numTriggers > 0) {
boundary.m_unk0x50 = new Mx3DPointFloat; boundary.m_unk0x50 = new Mx3DPointFloat;
boundary.m_pathTrigger = new LegoWEGEdge::PathWithTrigger[boundary.m_numTriggers]; boundary.m_pathTrigger = new PathWithTrigger[boundary.m_numTriggers];
for (j = 0; j < boundary.m_numTriggers; j++) { for (j = 0; j < boundary.m_numTriggers; j++) {
if (p_storage->Read(&s, sizeof(s)) != SUCCESS) { if (p_storage->Read(&s, sizeof(s)) != SUCCESS) {

View File

@@ -92,12 +92,6 @@ LegoAct2::LegoAct2()
NotificationManager()->Register(this); NotificationManager()->Register(this);
} }
// FUNCTION: LEGO1 0x1004fe10
MxBool LegoAct2::VTable0x5c()
{
return TRUE;
}
// FUNCTION: LEGO1 0x1004fe40 // FUNCTION: LEGO1 0x1004fe40
// FUNCTION: BETA10 0x1003a6f0 // FUNCTION: BETA10 0x1003a6f0
LegoAct2::~LegoAct2() LegoAct2::~LegoAct2()

View File

@@ -5,7 +5,7 @@
#include <assert.h> #include <assert.h>
DECOMP_SIZE_ASSERT(LegoWEGEdge, 0x54) DECOMP_SIZE_ASSERT(LegoWEGEdge, 0x54)
DECOMP_SIZE_ASSERT(LegoWEGEdge::PathWithTrigger, 0x0c) DECOMP_SIZE_ASSERT(PathWithTrigger, 0x0c)
// FUNCTION: LEGO1 0x1009a730 // FUNCTION: LEGO1 0x1009a730
// FUNCTION: BETA10 0x101830ec // FUNCTION: BETA10 0x101830ec

View File

@@ -1,27 +1,15 @@
#ifndef __LEGOWEGEDGE_H #ifndef __LEGOWEGEDGE_H
#define __LEGOWEGEDGE_H #define __LEGOWEGEDGE_H
#include "decomp.h"
#include "legoweedge.h"
#include "mxgeometry/mxgeometry3d.h"
#include "mxgeometry/mxgeometry4d.h"
class LegoPathStruct; class LegoPathStruct;
// might be a struct with public members #include "decomp.h"
// VTABLE: LEGO1 0x100db7f8 #include "legoweedge.h"
// SIZE 0x54
class LegoWEGEdge : public LegoWEEdge {
public:
enum {
c_bit1 = 0x01,
c_bit2 = 0x02,
c_bit3 = 0x04,
c_bit5 = 0x10
};
// SIZE 0x0c // This struct might have been defined elsewhere (legopathstruct.h?).
struct PathWithTrigger { // Must be defined before the inclusion of Mx4DPointFloat for correct order
// SIZE 0x0c
struct PathWithTrigger {
// FUNCTION: LEGO1 0x10048280 // FUNCTION: LEGO1 0x10048280
// FUNCTION: BETA10 0x100bd450 // FUNCTION: BETA10 0x100bd450
PathWithTrigger() PathWithTrigger()
@@ -34,6 +22,21 @@ public:
LegoPathStruct* m_pathStruct; // 0x00 LegoPathStruct* m_pathStruct; // 0x00
unsigned int m_data; // 0x04 unsigned int m_data; // 0x04
float m_unk0x08; // 0x08 float m_unk0x08; // 0x08
};
#include "mxgeometry/mxgeometry3d.h"
#include "mxgeometry/mxgeometry4d.h"
// might be a struct with public members
// VTABLE: LEGO1 0x100db7f8
// SIZE 0x54
class LegoWEGEdge : public LegoWEEdge {
public:
enum {
c_bit1 = 0x01,
c_bit2 = 0x02,
c_bit3 = 0x04,
c_bit5 = 0x10
}; };
LegoWEGEdge(); LegoWEGEdge();

View File

@@ -27,6 +27,8 @@ class LegoContainerInfo : public map<const char*, T*, LegoContainerInfoComparato
template <class T> template <class T>
class LegoContainer { class LegoContainer {
public: public:
LegoContainer() { m_ownership = TRUE; }
virtual ~LegoContainer() virtual ~LegoContainer()
{ {
#ifdef COMPAT_MODE #ifdef COMPAT_MODE
@@ -115,7 +117,6 @@ typedef list<LegoCachedTexture> LegoCachedTextureList;
// SIZE 0x24 // SIZE 0x24
class LegoTextureContainer : public LegoContainer<LegoTextureInfo> { class LegoTextureContainer : public LegoContainer<LegoTextureInfo> {
public: public:
LegoTextureContainer() { m_ownership = TRUE; }
~LegoTextureContainer() override; ~LegoTextureContainer() override;
LegoTextureInfo* GetCached(LegoTextureInfo* p_textureInfo); LegoTextureInfo* GetCached(LegoTextureInfo* p_textureInfo);

View File

@@ -40,15 +40,15 @@ public:
MxBitmap(); MxBitmap();
~MxBitmap() override; // vtable+00 ~MxBitmap() override; // vtable+00
virtual MxResult ImportBitmap(MxBitmap* p_bitmap); // vtable+14 virtual MxResult ImportBitmap(MxBitmap* p_bitmap); // vtable+0x14
virtual MxResult ImportBitmapInfo(MxBITMAPINFO* p_info); // vtable+18 virtual MxResult ImportBitmapInfo(MxBITMAPINFO* p_info); // vtable+0x18
virtual MxResult SetSize(MxS32 p_width, MxS32 p_height, MxPalette* p_palette, MxBool); // vtable+1c virtual MxResult SetSize(MxS32 p_width, MxS32 p_height, MxPalette* p_palette, MxBool); // vtable+0x1c
virtual MxResult LoadFile(HANDLE p_handle); // vtable+20 virtual MxResult LoadFile(HANDLE p_handle); // vtable+0x20
virtual MxLong Read(const char* p_filename); // vtable+24 virtual MxLong Read(const char* p_filename); // vtable+0x24
// FUNCTION: LEGO1 0x1004e0d0 // FUNCTION: LEGO1 0x1004e0d0
// FUNCTION: BETA10 0x10060fc0 // FUNCTION: BETA10 0x10060fc0
virtual int VTable0x28(int) { return -1; } // vtable+28 virtual MxS32 VTable0x28(MxS32) { return -1; } // vtable+0x28
virtual void BitBlt( virtual void BitBlt(
MxBitmap* p_src, MxBitmap* p_src,
@@ -58,7 +58,7 @@ public:
MxS32 p_bottom, MxS32 p_bottom,
MxS32 p_width, MxS32 p_width,
MxS32 p_height MxS32 p_height
); // vtable+2c ); // vtable+0x2c
virtual void BitBltTransparent( virtual void BitBltTransparent(
MxBitmap* p_src, MxBitmap* p_src,
MxS32 p_left, MxS32 p_left,
@@ -67,10 +67,10 @@ public:
MxS32 p_bottom, MxS32 p_bottom,
MxS32 p_width, MxS32 p_width,
MxS32 p_height MxS32 p_height
); // vtable+30 ); // vtable+0x30
virtual MxPalette* CreatePalette(); // vtable+34 virtual MxPalette* CreatePalette(); // vtable+0x34
virtual void ImportPalette(MxPalette* p_palette); // vtable+38 virtual void ImportPalette(MxPalette* p_palette); // vtable+0x38
virtual MxResult SetBitDepth(MxBool); // vtable+3c virtual MxResult SetBitDepth(MxBool); // vtable+0x3c
virtual MxResult StretchBits( virtual MxResult StretchBits(
HDC p_hdc, HDC p_hdc,
MxS32 p_xSrc, MxS32 p_xSrc,
@@ -79,7 +79,7 @@ public:
MxS32 p_yDest, MxS32 p_yDest,
MxS32 p_destWidth, MxS32 p_destWidth,
MxS32 p_destHeight MxS32 p_destHeight
); // vtable+40 ); // vtable+0x40
// Bit mask trick to round up to the nearest multiple of four. // Bit mask trick to round up to the nearest multiple of four.
// Pixel data may be stored with padding. // Pixel data may be stored with padding.

View File

@@ -13,6 +13,9 @@ public:
// FUNCTION: LEGO1 0x10043550 // FUNCTION: LEGO1 0x10043550
~MxStillPresenter() override { Destroy(TRUE); } // vtable+0x00 ~MxStillPresenter() override { Destroy(TRUE); } // vtable+0x00
// FUNCTION: LEGO1 0x100435b0
void Destroy() override { Destroy(FALSE); } // vtable+0x38
// FUNCTION: BETA10 0x100980c0 // FUNCTION: BETA10 0x100980c0
static const char* HandlerClassName() static const char* HandlerClassName()
{ {
@@ -37,10 +40,6 @@ public:
void StreamingTickle() override; // vtable+0x20 void StreamingTickle() override; // vtable+0x20
void RepeatingTickle() override; // vtable+0x24 void RepeatingTickle() override; // vtable+0x24
void ParseExtra() override; // vtable+0x30 void ParseExtra() override; // vtable+0x30
// FUNCTION: LEGO1 0x100435b0
void Destroy() override { Destroy(FALSE); } // vtable+0x38
void Enable(MxBool p_enable) override; // vtable+0x54 void Enable(MxBool p_enable) override; // vtable+0x54
void LoadHeader(MxStreamChunk* p_chunk) override; // vtable+0x5c void LoadHeader(MxStreamChunk* p_chunk) override; // vtable+0x5c
void CreateBitmap() override; // vtable+0x60 void CreateBitmap() override; // vtable+0x60

View File

@@ -49,6 +49,8 @@ public:
inline void Swap(int p_d1, int p_d2); inline void Swap(int p_d1, int p_d2);
float* operator[](int idx) { return m_data[idx]; } float* operator[](int idx) { return m_data[idx]; }
// FUNCTION: BETA10 0x10017780
const float* operator[](int idx) const { return m_data[idx]; } const float* operator[](int idx) const { return m_data[idx]; }
}; };