diff --git a/LEGO1/lego/legoomni/include/act2brick.h b/LEGO1/lego/legoomni/include/act2brick.h index 74b50d46..18d03d4e 100644 --- a/LEGO1/lego/legoomni/include/act2brick.h +++ b/LEGO1/lego/legoomni/include/act2brick.h @@ -26,7 +26,7 @@ class Act2Brick : public LegoPathActor { return !strcmp(p_name, Act2Brick::ClassName()) || LegoEntity::IsA(p_name); } - MxS32 VTable0x94() override; // vtable+0x94 + MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 // SYNTHETIC: LEGO1 0x1007a450 // Act2Brick::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/doors.h b/LEGO1/lego/legoomni/include/doors.h index 5a4a808a..be61fd15 100644 --- a/LEGO1/lego/legoomni/include/doors.h +++ b/LEGO1/lego/legoomni/include/doors.h @@ -20,9 +20,9 @@ class Doors : public LegoPathActor { return !strcmp(p_name, Doors::ClassName()) || LegoPathActor::IsA(p_name); } - void ParseAction(char*) override; // vtable+0x20 - void VTable0x70(float p_float) override; // vtable+0x70 - MxS32 VTable0x94() override; // vtable+0x94 + void ParseAction(char*) override; // vtable+0x20 + void VTable0x70(float p_float) override; // vtable+0x70 + MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 // SYNTHETIC: LEGO1 0x1000e580 // Doors::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoanimactor.h b/LEGO1/lego/legoomni/include/legoanimactor.h index 4b52397e..91eafd11 100644 --- a/LEGO1/lego/legoomni/include/legoanimactor.h +++ b/LEGO1/lego/legoomni/include/legoanimactor.h @@ -12,6 +12,8 @@ struct LegoAnimActorStruct { float GetDuration(); + inline float GetUnknown0x00() { return m_unk0x00; } + float m_unk0x00; // 0x00 LegoAnim* m_AnimTreePtr; // 0x04 LegoROI** m_roiMap; // 0x08 diff --git a/LEGO1/lego/legoomni/include/legocachsound.h b/LEGO1/lego/legoomni/include/legocachsound.h index 941f6cdc..fc0bb5f5 100644 --- a/LEGO1/lego/legoomni/include/legocachsound.h +++ b/LEGO1/lego/legoomni/include/legocachsound.h @@ -34,7 +34,7 @@ class LegoCacheSound : public MxCore { inline const undefined GetUnk0x58() const { return m_unk0x58; } LegoCacheSound* FUN_10006960(); - MxResult FUN_10006a30(char* p_str, MxBool); + MxResult FUN_10006a30(const char* p_str, MxBool); void FUN_10006b80(); void FUN_10006be0(); diff --git a/LEGO1/lego/legoomni/include/legocarraceactor.h b/LEGO1/lego/legoomni/include/legocarraceactor.h index 78080c96..29ff1797 100644 --- a/LEGO1/lego/legoomni/include/legocarraceactor.h +++ b/LEGO1/lego/legoomni/include/legocarraceactor.h @@ -27,12 +27,12 @@ class LegoCarRaceActor : public virtual LegoRaceActor { return !strcmp(p_name, LegoCarRaceActor::ClassName()) || LegoRaceActor::IsA(p_name); } - void VTable0x6c() override; // vtable+0x6c - void VTable0x70(float p_float) override; // vtable+0x70 - MxU32 VTable0x90(float, Matrix4&) override; // vtable+0x90 - MxS32 VTable0x94() override; // vtable+0x94 - void VTable0x98() override; // vtable+0x98 - void VTable0x9c() override; // vtable+0x9c + void VTable0x6c() override; // vtable+0x6c + void VTable0x70(float p_float) override; // vtable+0x70 + MxU32 VTable0x90(float, Matrix4&) override; // vtable+0x90 + MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 + void VTable0x98() override; // vtable+0x98 + void VTable0x9c() override; // vtable+0x9c virtual void FUN_10080590(); diff --git a/LEGO1/lego/legoomni/include/legoextraactor.h b/LEGO1/lego/legoomni/include/legoextraactor.h index be929f92..80da50f3 100644 --- a/LEGO1/lego/legoomni/include/legoextraactor.h +++ b/LEGO1/lego/legoomni/include/legoextraactor.h @@ -2,6 +2,7 @@ #define LEGOEXTRAACTOR_H #include "legoanimactor.h" +#include "legoanimpresenter.h" // VTABLE: LEGO1 0x100d6c00 LegoAnimActor // VTABLE: LEGO1 0x100d6c10 LegoPathActor @@ -34,17 +35,18 @@ class LegoExtraActor : public virtual LegoAnimActor { void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 void VTable0x68(Mx3DPointFloat& p_point1, Mx3DPointFloat& p_point2, Mx3DPointFloat& p_point3) - override; // vtable+0x68 - void VTable0x6c() override; // vtable+0x6c - void VTable0x70(float) override; // vtable+0x70 - void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 - MxU32 VTable0x90(float p_float, Matrix4& p_matrix) override; // vtable+0x90 - MxS32 VTable0x94() override; // vtable+0x94 - void VTable0x9c() override; // vtable+0x9c - void VTable0xa4(MxU8& p_und1, MxS32& p_und2) override; // vtable+0xa4 - void VTable0xc4() override; // vtable+0xc4 + override; // vtable+0x68 + void VTable0x6c() override; // vtable+0x6c + void VTable0x70(float) override; // vtable+0x70 + void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 + MxU32 VTable0x90(float p_float, Matrix4& p_matrix) override; // vtable+0x90 + MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 + void VTable0x9c() override; // vtable+0x9c + void VTable0xa4(MxU8& p_und1, MxS32& p_und2) override; // vtable+0xa4 + void VTable0xc4() override; // vtable+0xc4 virtual MxResult FUN_1002aae0(); + inline void FUN_1002ad8a(); // SYNTHETIC: LEGO1 0x1002b760 // LegoExtraActor::`scalar deleting destructor' @@ -54,12 +56,12 @@ class LegoExtraActor : public virtual LegoAnimActor { undefined m_unk0x0c; // 0x0c MxU8 m_axis; // 0x0d undefined m_unk0x0e; // 0x0e - undefined4 m_unk0x10; // 0x10 + MxFloat m_unk0x10; // 0x10 MxU8 m_unk0x14; // 0x14 MxU8 m_unk0x15; // 0x15 MxMatrix m_unk0x18; // 0x18 - LegoAnimActorStruct* m_unk0x60; // 0x60 - LegoAnimActorStruct* m_unk0x64; // 0x64 + LegoAnimActorStruct* m_assAnim; // 0x60 + LegoAnimActorStruct* m_disAnim; // 0x64 }; // GLOBAL: LEGO1 0x100d6be8 @@ -68,4 +70,13 @@ class LegoExtraActor : public virtual LegoAnimActor { // GLOBAL: LEGO1 0x100d6bf0 // LegoExtraActor::`vbtable'{for `LegoExtraActor'} +// TEMPLATE: LEGO1 0x1002b200 +// vector >::vector > + +// TEMPLATE: LEGO1 0x1002b270 +// vector >::size + +// TEMPLATE: LEGO1 0x1002b720 +// uninitialized_copy + #endif // LEGOEXTRAACTOR_H diff --git a/LEGO1/lego/legoomni/include/legojetski.h b/LEGO1/lego/legoomni/include/legojetski.h index c2e6d813..a153d607 100644 --- a/LEGO1/lego/legoomni/include/legojetski.h +++ b/LEGO1/lego/legoomni/include/legojetski.h @@ -31,13 +31,13 @@ class LegoJetski : public LegoJetskiRaceActor, public LegoRaceMap { return !strcmp(p_name, LegoJetski::ClassName()) || LegoJetskiRaceActor::IsA(p_name); } - void ParseAction(char*) override; // vtable+0x20 - void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 - void VTable0x6c() override; // vtable+0x6c - void VTable0x70(float p_float) override; // vtable+0x70 - MxS32 VTable0x94() override; // vtable+0x94 - void VTable0x98() override; // vtable+0x98 - void VTable0x9c() override; // vtable+0x9c + void ParseAction(char*) override; // vtable+0x20 + void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 + void VTable0x6c() override; // vtable+0x6c + void VTable0x70(float p_float) override; // vtable+0x70 + MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 + void VTable0x98() override; // vtable+0x98 + void VTable0x9c() override; // vtable+0x9c virtual void FUN_100136f0(float p_worldSpeed); diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 2c22df81..3a9bea76 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -49,7 +49,7 @@ class LegoPathActor : public LegoActor { virtual MxU32 VTable0x90(float, Matrix4&) { return FALSE; } // vtable+0x90 // FUNCTION: LEGO1 0x10002d50 - virtual MxS32 VTable0x94() { return 0; } // vtable+0x94 + virtual MxResult VTable0x94(LegoPathActor*, MxBool) { return 0; } // vtable+0x94 virtual void VTable0x98(); // vtable+0x98 virtual void VTable0x9c(); // vtable+0x9c @@ -85,10 +85,11 @@ class LegoPathActor : public LegoActor { virtual void VTable0xc8(MxU8 p_unk0x148) { m_unk0x148 = p_unk0x148; } // vtable+0xc8 inline LegoPathBoundary* GetBoundary() { return m_boundary; } + inline MxU32 GetState() { return m_state; } inline LegoPathController* GetController() { return m_controller; } inline void SetBoundary(LegoPathBoundary* p_boundary) { m_boundary = p_boundary; } - inline void SetUnknownDC(MxU32 p_unk0xdc) { m_unk0xdc = p_unk0xdc; } + inline void SetState(MxU32 p_state) { m_state = p_state; } inline void ClearController() { m_controller = NULL; } // SYNTHETIC: LEGO1 0x1002d800 @@ -103,7 +104,7 @@ class LegoPathActor : public LegoActor { undefined m_unk0x8c[0x14]; // 0x8c MxFloat m_unk0xa0; // 0xa0 undefined m_unk0xa4[0x38]; // 0xa4 - MxU32 m_unk0xdc; // 0xdc + MxU32 m_state; // 0xdc Edge* m_destEdge; // 0xe0 undefined4 m_unk0xe4; // 0xe4 undefined2 m_unk0xe8; // 0xe8 diff --git a/LEGO1/lego/legoomni/include/legoraceactor.h b/LEGO1/lego/legoomni/include/legoraceactor.h index 0f535fa6..afb0255c 100644 --- a/LEGO1/lego/legoomni/include/legoraceactor.h +++ b/LEGO1/lego/legoomni/include/legoraceactor.h @@ -32,7 +32,7 @@ class LegoRaceActor : public virtual LegoAnimActor { void VTable0x70(float p_float) override; // vtable+0x70 void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 MxU32 VTable0x90(float, Matrix4&) override; // vtable+0x90 - MxS32 VTable0x94() override; // vtable+0x94 + MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 // FUNCTION: LEGO1 0x10014aa0 virtual MxResult FUN_10014aa0() { return SUCCESS; } diff --git a/LEGO1/lego/legoomni/include/legoracecar.h b/LEGO1/lego/legoomni/include/legoracecar.h index 331f11f7..58098a94 100644 --- a/LEGO1/lego/legoomni/include/legoracecar.h +++ b/LEGO1/lego/legoomni/include/legoracecar.h @@ -31,13 +31,13 @@ class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap { return !strcmp(p_name, LegoCarRaceActor::ClassName()) || LegoCarRaceActor::IsA(p_name); } - void ParseAction(char*) override; // vtable+0x20 - void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 - void VTable0x6c() override; // vtable+0x6c - void VTable0x70(float p_float) override; // vtable+0x70 - MxS32 VTable0x94() override; // vtable+0x94 - void VTable0x98() override; // vtable+0x98 - void VTable0x9c() override; // vtable+0x9c + void ParseAction(char*) override; // vtable+0x20 + void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 + void VTable0x6c() override; // vtable+0x6c + void VTable0x70(float p_float) override; // vtable+0x70 + MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 + void VTable0x98() override; // vtable+0x98 + void VTable0x9c() override; // vtable+0x9c virtual void FUN_10012ea0(float p_worldSpeed); virtual void FUN_10012ff0(float); diff --git a/LEGO1/lego/legoomni/include/legounknown100d6b4c.h b/LEGO1/lego/legoomni/include/legounknown100d6b4c.h index 139aae96..7d62a987 100644 --- a/LEGO1/lego/legoomni/include/legounknown100d6b4c.h +++ b/LEGO1/lego/legoomni/include/legounknown100d6b4c.h @@ -54,8 +54,8 @@ class LegoUnknown100d6b4c { LegoCacheSound* FUN_1003d170(const char* p_key); LegoCacheSound* FUN_1003d290(LegoCacheSound* p_sound); - void FUN_1003dae0(char* p_one, char* p_two, MxBool p_three); - LegoCacheSound* FUN_1003db10(LegoCacheSound* p_one, char* p_two, MxBool p_three); + void FUN_1003dae0(const char* p_one, const char* p_two, MxBool p_three); + LegoCacheSound* FUN_1003db10(LegoCacheSound* p_one, const char* p_two, MxBool p_three); void FUN_1003dc40(LegoCacheSound** p_und); private: diff --git a/LEGO1/lego/legoomni/src/actors/doors.cpp b/LEGO1/lego/legoomni/src/actors/doors.cpp index 9799b870..d4aedd7c 100644 --- a/LEGO1/lego/legoomni/src/actors/doors.cpp +++ b/LEGO1/lego/legoomni/src/actors/doors.cpp @@ -3,7 +3,7 @@ DECOMP_SIZE_ASSERT(Doors, 0x1f8) // STUB: LEGO1 0x10066100 -MxS32 Doors::VTable0x94() +MxResult Doors::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index ded0b705..dacb7f82 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -120,7 +120,7 @@ MxU32 Helicopter::VTable0xcc() ((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_copter); FUN_10015820(TRUE, 0); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, TRUE); - SetUnknownDC(4); + SetState(4); PlayMusic(JukeboxScript::c_Jail_Music); break; case LegoGameState::e_act2: @@ -180,7 +180,7 @@ MxU32 Helicopter::VTable0xd4(LegoControlManagerEvent& p_param) m_state->SetUnknown8(1); m_world->FUN_1001fc80(this); InvokeAction(Extra::ActionType::e_start, script, 0x20, NULL); - SetUnknownDC(0); + SetState(0); } ret = 1; break; @@ -193,7 +193,7 @@ MxU32 Helicopter::VTable0xd4(LegoControlManagerEvent& p_param) m_state->SetUnknown8(3); m_world->FUN_1001fc80(this); InvokeAction(Extra::ActionType::e_start, script, 0x21, NULL); - SetUnknownDC(4); + SetState(4); } ret = 1; break; @@ -366,7 +366,7 @@ void Helicopter::VTable0x70(float p_float) else { ((Act3*) m_world)->FUN_10073430(); } - m_unk0xdc = 4; + LegoPathActor::m_state = 4; } } } diff --git a/LEGO1/lego/legoomni/src/audio/legocachsound.cpp b/LEGO1/lego/legoomni/src/audio/legocachsound.cpp index d43012c8..8689491a 100644 --- a/LEGO1/lego/legoomni/src/audio/legocachsound.cpp +++ b/LEGO1/lego/legoomni/src/audio/legocachsound.cpp @@ -76,7 +76,7 @@ LegoCacheSound* LegoCacheSound::FUN_10006960() } // STUB: LEGO1 0x10006a30 -MxResult LegoCacheSound::FUN_10006a30(char* p_str, MxBool) +MxResult LegoCacheSound::FUN_10006a30(const char* p_str, MxBool) { // TODO // gets param2 from FUN_1003db10 diff --git a/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp b/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp index 101d4176..5dbcf2e0 100644 --- a/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp +++ b/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp @@ -104,14 +104,14 @@ LegoCacheSound* LegoUnknown100d6b4c::FUN_1003d290(LegoCacheSound* p_sound) } // FUNCTION: LEGO1 0x1003dae0 -void LegoUnknown100d6b4c::FUN_1003dae0(char* p_one, char* p_two, MxBool p_three) +void LegoUnknown100d6b4c::FUN_1003dae0(const char* p_one, const char* p_two, MxBool p_three) { // DECOMP: Second parameter is 0xe4 member of LegoPathActor subclass FUN_1003db10(FUN_1003d170(p_one), p_two, p_three); } // FUNCTION: LEGO1 0x1003db10 -LegoCacheSound* LegoUnknown100d6b4c::FUN_1003db10(LegoCacheSound* p_one, char* p_two, MxBool p_three) +LegoCacheSound* LegoUnknown100d6b4c::FUN_1003db10(LegoCacheSound* p_one, const char* p_two, MxBool p_three) { if (!p_one) { return NULL; diff --git a/LEGO1/lego/legoomni/src/entity/act2brick.cpp b/LEGO1/lego/legoomni/src/entity/act2brick.cpp index 97992d0b..fa1408aa 100644 --- a/LEGO1/lego/legoomni/src/entity/act2brick.cpp +++ b/LEGO1/lego/legoomni/src/entity/act2brick.cpp @@ -15,7 +15,7 @@ Act2Brick::~Act2Brick() } // STUB: LEGO1 0x1007a750 -MxS32 Act2Brick::VTable0x94() +MxResult Act2Brick::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp b/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp index 5adc760b..e28ebc46 100644 --- a/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp +++ b/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp @@ -17,7 +17,7 @@ MxU32 LegoCarRaceActor::VTable0x90(float, Matrix4&) } // STUB: LEGO1 0x1005d650 -MxS32 LegoCarRaceActor::VTable0x94() +MxResult LegoCarRaceActor::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/entity/legojetski.cpp b/LEGO1/lego/legoomni/src/entity/legojetski.cpp index c8b41efe..75cf5cff 100644 --- a/LEGO1/lego/legoomni/src/entity/legojetski.cpp +++ b/LEGO1/lego/legoomni/src/entity/legojetski.cpp @@ -56,7 +56,7 @@ void LegoJetski::VTable0x70(float p_float) } // STUB: LEGO1 0x100141b0 -MxS32 LegoJetski::VTable0x94() +MxResult LegoJetski::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/paths/legoanimactor.cpp b/LEGO1/lego/legoomni/src/paths/legoanimactor.cpp index 27c110f7..d35578de 100644 --- a/LEGO1/lego/legoomni/src/paths/legoanimactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legoanimactor.cpp @@ -69,7 +69,7 @@ void LegoAnimActor::VTable0x70(float p_float) m_lastTime = p_float - 1.0f; } - if (m_unk0xdc == 0 && !m_userNavFlag && m_worldSpeed <= 0) { + if (m_state == 0 && !m_userNavFlag && m_worldSpeed <= 0) { if (m_curAnim >= 0) { MxMatrix matrix(m_unk0xec); float f; diff --git a/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp b/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp index 3243cb8f..6e6577dd 100644 --- a/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp @@ -1,7 +1,24 @@ #include "legoextraactor.h" +#include "legosoundmanager.h" +#include "misc.h" +#include "mxmisc.h" +#include "mxtimer.h" + DECOMP_SIZE_ASSERT(LegoExtraActor, 0x1dc) +// GLOBAL: LEGO1 0x100f31d0 +LegoWorld* g_unk0x100f31d0 = NULL; + +// GLOBAL: LEGO1 0x100f31d4 +LegoAnimPresenter* m_assAnimP = NULL; + +// GLOBAL: LEGO1 0x100f31d8 +LegoAnimPresenter* m_disAnimP = NULL; + +// GLOBAL: LEGO1 0x100f31dc +MxS32 g_unk0x100f31dc = 0; + // GLOBAL: LEGO1 0x10104c18 Mx3DPointFloat g_unk0x10104c18 = Mx3DPointFloat(0.0f, 2.5f, 0.0f); @@ -13,28 +30,28 @@ LegoExtraActor::LegoExtraActor() m_unk0x0c = 0; m_unk0x0e = 0; m_unk0x14 = 0; - m_unk0x60 = NULL; - m_unk0x64 = NULL; + m_assAnim = NULL; + m_disAnim = NULL; m_unk0x15 = 0; } // FUNCTION: LEGO1 0x1002a6b0 LegoExtraActor::~LegoExtraActor() { - delete m_unk0x60; - delete m_unk0x64; + delete m_assAnim; + delete m_disAnim; } // FUNCTION: LEGO1 0x1002a720 MxU32 LegoExtraActor::VTable0x90(float p_time, Matrix4& p_transform) { - switch (m_unk0xdc & 0xff) { + switch (m_state & 0xff) { case 0: case 1: return TRUE; case 2: m_scheduledTime = p_time + 2000.0f; - m_unk0xdc = 3; + m_state = 3; m_actorTime += (p_time - m_lastTime) * m_worldSpeed; m_lastTime = p_time; return FALSE; @@ -73,7 +90,7 @@ MxU32 LegoExtraActor::VTable0x90(float p_time, Matrix4& p_transform) return FALSE; } else { - m_unk0xdc = 0; + m_state = 0; m_scheduledTime = 0.0f; ((Vector3&) positionRef).Sub(&g_unk0x10104c18); // TODO: Fix call m_roi->FUN_100a58f0(p_transform); @@ -132,10 +149,128 @@ MxResult LegoExtraActor::FUN_1002aae0() return SUCCESS; } -// STUB: LEGO1 0x1002aba0 -MxS32 LegoExtraActor::VTable0x94() +inline void LegoExtraActor::FUN_1002ad8a() { - return 0; + LegoWorld* w = CurrentWorld(); + + if (g_unk0x100f31d0 != w) { + g_unk0x100f31d0 = w; + m_assAnimP = (LegoAnimPresenter*) w->Find("LegoAnimPresenter", "BNsAss01"); + m_disAnimP = (LegoAnimPresenter*) w->Find("LegoAnimPresenter", "BNsDis01"); + } + + if (!m_assAnim) { + MxS32 index = 0; + m_assAnimP->FUN_1006d680(this, -20.0f); + + for (MxS32 i = 0; i < m_animMaps.size(); i++) { + if (m_animMaps[i]->GetUnknown0x00() == -20.0f) { + m_assAnim = new LegoAnimActorStruct(*m_animMaps[i]); + break; + } + } + } + + if (!m_disAnim) { + MxS32 index = 0; + m_disAnimP->FUN_1006d680(this, -21.0f); + + for (MxS32 i = 0; i < m_animMaps.size(); i++) { + if (m_animMaps[i]->GetUnknown0x00() == -21.0f) { + m_disAnim = new LegoAnimActorStruct(*m_animMaps[i]); + break; + } + } + } +} + +// FUNCTION: LEGO1 0x1002aba0 +MxResult LegoExtraActor::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) +{ + if (p_actor->GetState() != 0 || m_state != 0) { + return FAILURE; + } + + if (p_bool) { + if (m_unk0x15 != 0) { + return FAILURE; + } + + m_unk0x15 = 100; + FUN_1002aae0(); + } + else { + MxU32 b = FALSE; + + if (++g_unk0x100f31dc % 2 == 0) { + MxMatrix matrix(p_actor->GetROI()->GetLocal2World()); + MxMatrix matrix2(m_roi->GetLocal2World()); + + m_unk0x18 = matrix2; + Vector3 positionRef(matrix2[3]); + Mx3DPointFloat dir(matrix[2]); + + // TODO: Fix calls + ((Mx3DPointFloat&) dir).Mul(2.0f); + ((Vector3&) positionRef).Add(&dir); + + for (MxS32 i = 0; i < m_boundary->GetNumEdges(); i++) { + Mx4DPointFloat* normal = m_boundary->GetEdgeNormal(i); + + if (positionRef.Dot(normal, &positionRef) + (*normal)[3] < -0.001) { + b = TRUE; + break; + } + } + + if (!b) { + m_roi->FUN_100a58f0(matrix2); + m_roi->VTable0x14(); + FUN_1002ad8a(); + SoundManager()->GetUnknown0x40()->FUN_1003dae0("crash5", m_roi->GetName(), FALSE); + m_scheduledTime = Timer()->GetTime() + m_disAnim->GetDuration(); + m_unk0x10 = m_worldSpeed; + VTable0xc4(); + SetWorldSpeed(0); + m_unk0x14 = 1; + m_state = 0x101; + } + } + + if (b) { + LegoROI* roi = m_roi; + SoundManager()->GetUnknown0x40()->FUN_1003dae0("crash5", m_roi->GetName(), FALSE); + VTable0xc4(); + m_state = 0x102; + Mx3DPointFloat dir = p_actor->GetWorldDirection(); + MxMatrix matrix3 = MxMatrix(roi->GetLocal2World()); + Vector3 positionRef(matrix3[3]); + ((Vector3&) positionRef).Add(&g_unk0x10104c18); + roi->FUN_100a58f0(matrix3); + +#ifdef COMPAT_MODE + float dot, dot2; + { + Mx3DPointFloat tmp(1.0f, 0, 0); + dot = dir.Dot(&dir, &tmp); + Mx3DPointFloat tmp2(1.0f, 0, 0); + dot2 = dir.Dot(&dir, &tmp2); + } +#else + float dot = dir.Dot(&dir, &Mx3DPointFloat(1.0f, 0, 0)); + float dot2 = dir.Dot(&dir, &Mx3DPointFloat(0, 0, 1.0f)); +#endif + + if (abs(dot2) < abs(dot)) { + m_axis = dot > 0.0 ? e_posz : e_negz; + } + else { + m_axis = dot2 > 0.0 ? e_posx : e_negx; + } + } + } + + return SUCCESS; } // STUB: LEGO1 0x1002b290 diff --git a/LEGO1/lego/legoomni/src/race/legoraceactor.cpp b/LEGO1/lego/legoomni/src/race/legoraceactor.cpp index 21d9e130..6df9d840 100644 --- a/LEGO1/lego/legoomni/src/race/legoraceactor.cpp +++ b/LEGO1/lego/legoomni/src/race/legoraceactor.cpp @@ -41,7 +41,7 @@ MxU32 LegoRaceActor::VTable0x90(float, Matrix4&) } // STUB: LEGO1 0x10014cf0 -MxS32 LegoRaceActor::VTable0x94() +MxResult LegoRaceActor::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/race/legoracecar.cpp b/LEGO1/lego/legoomni/src/race/legoracecar.cpp index 4f2a82bf..b7fc1ee3 100644 --- a/LEGO1/lego/legoomni/src/race/legoracecar.cpp +++ b/LEGO1/lego/legoomni/src/race/legoracecar.cpp @@ -76,7 +76,7 @@ void LegoRaceCar::VTable0x70(float p_float) } // STUB: LEGO1 0x10014540 -MxS32 LegoRaceCar::VTable0x94() +MxResult LegoRaceCar::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 2a6f900c..e3545dfe 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -502,7 +502,7 @@ void Isle::Enable(MxBool p_enable) if (CurrentActor() != NULL && CurrentActor()->IsA("Jetski")) { IslePathActor* actor = CurrentActor(); actor->VTable0xe8(LegoGameState::e_unk45, FALSE, 7); - actor->SetUnknownDC(0); + actor->SetState(0); } else { FUN_10032620(); diff --git a/LEGO1/lego/sources/geom/legoweedge.h b/LEGO1/lego/sources/geom/legoweedge.h index 0dd672b9..ce947f83 100644 --- a/LEGO1/lego/sources/geom/legoweedge.h +++ b/LEGO1/lego/sources/geom/legoweedge.h @@ -28,6 +28,8 @@ class LegoWEEdge { virtual LegoResult VTable0x04(); // vtable+0x04 + inline LegoU8 GetNumEdges() { return m_numEdges; } + // SYNTHETIC: LEGO1 0x1009a570 // LegoWEEdge::`scalar deleting destructor' diff --git a/LEGO1/lego/sources/geom/legowegedge.h b/LEGO1/lego/sources/geom/legowegedge.h index d4f931a6..c2838123 100644 --- a/LEGO1/lego/sources/geom/legowegedge.h +++ b/LEGO1/lego/sources/geom/legowegedge.h @@ -15,6 +15,7 @@ class LegoWEGEdge : public LegoWEEdge { LegoResult VTable0x04() override; // vtable+0x04 inline LegoU32 GetFlag0x10() { return m_unk0x0c & 0x10 ? FALSE : TRUE; } + inline Mx4DPointFloat* GetEdgeNormal(int index) { return &m_edgeNormals[index]; } // SYNTHETIC: LEGO1 0x1009a7e0 // LegoWEGEdge::`scalar deleting destructor' diff --git a/tools/ncc/skip.yml b/tools/ncc/skip.yml index 0c9a6441..cf3ed584 100644 --- a/tools/ncc/skip.yml +++ b/tools/ncc/skip.yml @@ -23,4 +23,6 @@ new_pos: "Allow original naming from 1996" new_dir: "Allow original naming from 1996" p_AnimTreePtr: "Allow original naming from beta" m_AnimTreePtr: "Allow original naming from beta" -m_BADuration: "Allow original naming from beta" \ No newline at end of file +m_BADuration: "Allow original naming from beta" +m_assAnimP: "Allow original naming from beta" +m_disAnimP: "Allow original naming from beta"