Merge remote-tracking branch 'isle/master'

This commit is contained in:
Christian Semmler 2025-06-12 14:35:18 -07:00
commit 6d99683f1d
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C
17 changed files with 247 additions and 218 deletions

View File

@ -163,7 +163,7 @@ public:
MxS32 FUN_10025ee0(undefined4 p_param1); MxS32 FUN_10025ee0(undefined4 p_param1);
// FUNCTION: BETA10 0x100735b0 // FUNCTION: BETA10 0x100735b0
void SetUnknown0x258(LegoCarBuildAnimPresenter* p_unk0x258) { m_unk0x258 = p_unk0x258; } void SetCarBuildAnimPresenter(LegoCarBuildAnimPresenter* p_animPresenter) { m_animPresenter = p_animPresenter; }
// SYNTHETIC: LEGO1 0x10022a60 // SYNTHETIC: LEGO1 0x10022a60
// LegoCarBuild::`scalar deleting destructor' // LegoCarBuild::`scalar deleting destructor'
@ -195,8 +195,8 @@ private:
// This is likely a location in pixel space // This is likely a location in pixel space
MxS32 m_unk0x250[2]; // 0x250 MxS32 m_unk0x250[2]; // 0x250
LegoCarBuildAnimPresenter* m_unk0x258; // 0x258 LegoCarBuildAnimPresenter* m_animPresenter; // 0x258
MxQuaternionTransformer m_unk0x25c; // 0x25c MxQuaternionTransformer m_unk0x25c; // 0x25c
// These two are likely locations in pixel space // These two are likely locations in pixel space
MxS32 m_unk0x290[2]; // 0x290 MxS32 m_unk0x290[2]; // 0x290

View File

@ -13,6 +13,13 @@ public:
c_bit1 = 0x01 c_bit1 = 0x01
}; };
enum ShelfState {
e_undefined = -1,
e_selected = 0,
e_stopped = 1,
e_moving = 2
};
// SIZE 0x0c // SIZE 0x0c
struct UnknownListEntry { struct UnknownListEntry {
// FUNCTION: LEGO1 0x100795c0 // FUNCTION: LEGO1 0x100795c0
@ -69,7 +76,7 @@ public:
void FUN_10079050(MxS16 p_index); void FUN_10079050(MxS16 p_index);
void SwapNodesByName(LegoChar* p_param1, LegoChar* p_param2); void SwapNodesByName(LegoChar* p_param1, LegoChar* p_param2);
void FUN_10079160(); void InitBuildPlatform();
void FUN_100795d0(LegoChar* p_param); void FUN_100795d0(LegoChar* p_param);
void FUN_10079680(LegoChar* p_param); void FUN_10079680(LegoChar* p_param);
LegoAnimNodeData* FindNodeDataByName(LegoTreeNode* p_treeNode, const LegoChar* p_name); LegoAnimNodeData* FindNodeDataByName(LegoTreeNode* p_treeNode, const LegoChar* p_name);
@ -78,7 +85,7 @@ public:
void RotateAroundYAxis(MxFloat p_angle); void RotateAroundYAxis(MxFloat p_angle);
MxBool FUN_10079c30(const LegoChar* p_name); MxBool FUN_10079c30(const LegoChar* p_name);
MxBool PartIsPlaced(const LegoChar* p_name); MxBool PartIsPlaced(const LegoChar* p_name);
void FUN_10079a90(); void MoveShelfForward();
MxBool StringEqualsPlatform(const LegoChar* p_string); MxBool StringEqualsPlatform(const LegoChar* p_string);
MxBool StringEqualsShelf(const LegoChar* p_string); MxBool StringEqualsShelf(const LegoChar* p_string);
MxBool StringEndsOnY(const LegoChar* p_string); MxBool StringEndsOnY(const LegoChar* p_string);
@ -87,10 +94,10 @@ public:
void SetPartObjectIdByName(const LegoChar* p_name, MxS16 p_objectId); void SetPartObjectIdByName(const LegoChar* p_name, MxS16 p_objectId);
// FUNCTION: BETA10 0x10070180 // FUNCTION: BETA10 0x10070180
void SetUnknown0xbc(undefined2 p_unk0xbc) { m_unk0xbc = p_unk0xbc; } void SetShelfState(MxU16 p_shelfState) { m_shelfState = p_shelfState; }
// FUNCTION: BETA10 0x100703b0 // FUNCTION: BETA10 0x100703b0
Matrix4& GetUnknown0xe0() { return m_unk0xe0; } Matrix4& GetBuildViewMatrix() { return m_buildViewMatrix; }
MxBool StringEndsOnW(LegoChar* p_param); MxBool StringEndsOnW(LegoChar* p_param);
MxBool StringEndsOnYOrN(const LegoChar* p_string); MxBool StringEndsOnYOrN(const LegoChar* p_string);
@ -116,7 +123,7 @@ public:
private: private:
void Beta10Inline0x100733d0(); void Beta10Inline0x100733d0();
MxU16 m_unk0xbc; // 0xbc MxU16 m_shelfState; // 0xbc
// variable name verified by BETA10 0x1007184f // variable name verified by BETA10 0x1007184f
MxS16 m_numberOfParts; // 0xbe MxS16 m_numberOfParts; // 0xbe
@ -124,21 +131,21 @@ private:
// name derived from LegoVehicleBuildState, field 0x4f // name derived from LegoVehicleBuildState, field 0x4f
MxS16 m_placedPartCount; // 0xc0 MxS16 m_placedPartCount; // 0xc0
LegoAnimNodeData* m_unk0xc4; // 0xc4 LegoAnimNodeData* m_platformAnimNodeData; // 0xc4
LegoAnim m_unk0xc8; // 0xc8 LegoAnim m_platformAnim; // 0xc8
MxMatrix m_unk0xe0; // 0xe0 MxMatrix m_buildViewMatrix; // 0xe0
// variable name verified by BETA10 0x100719f0 // variable name verified by BETA10 0x100719f0
UnknownListEntry* m_parts; // 0x128 UnknownListEntry* m_parts; // 0x128
MxFloat m_unk0x12c; // 0x12c MxFloat m_shelfFrameBuffer; // 0x12c
MxFloat m_unk0x130; // 0x130 MxFloat m_shelfFrame; // 0x130
MxFloat m_unk0x134; // 0x134 MxFloat m_shelfFrameMax; // 0x134
MxFloat m_unk0x138; // 0x138 MxFloat m_shelfFrameInterval; // 0x138
MxULong m_unk0x13c; // 0x13c MxULong m_unk0x13c; // 0x13c
LegoEntity* m_unk0x140; // 0x140 LegoEntity* m_carBuildEntity; // 0x140
MxS32 m_unk0x144; // 0x144 MxS32 m_unk0x144; // 0x144
MxS32 m_unk0x148; // 0x148 MxS32 m_unk0x148; // 0x148
// name verified by BETA10 0x10070d63 // name verified by BETA10 0x10070d63
LegoChar* m_mainSourceId; // 0x14c LegoChar* m_mainSourceId; // 0x14c

View File

@ -10,32 +10,32 @@ class LegoTextureInfo;
// SIZE 0x20 // SIZE 0x20
class LegoPhoneme { class LegoPhoneme {
public: public:
LegoPhoneme(const char* p_name, undefined4 p_unk0x14) LegoPhoneme(const char* p_name, MxU32 p_count)
{ {
m_name = p_name; m_name = p_name;
m_name.ToUpperCase(); m_name.ToUpperCase();
Init(); Init();
m_unk0x14 = p_unk0x14; m_count = p_count;
} }
~LegoPhoneme(); ~LegoPhoneme();
virtual undefined4 VTable0x00(); // vtable+0x00 virtual MxU32 GetCount(); // vtable+0x00
virtual void VTable0x04(undefined4 p_unk0x14); // vtable+0x04 virtual void SetCount(MxU32 p_count); // vtable+0x04
virtual LegoTextureInfo* VTable0x08(); // vtable+0x08 virtual LegoTextureInfo* GetTextureInfo(); // vtable+0x08
virtual void VTable0x0c(LegoTextureInfo* p_unk0x18); // vtable+0x0c virtual void SetTextureInfo(LegoTextureInfo* p_textureInfo); // vtable+0x0c
virtual LegoTextureInfo* VTable0x10(); // vtable+0x10 virtual LegoTextureInfo* GetCachedTextureInfo(); // vtable+0x10
virtual void VTable0x14(LegoTextureInfo* p_unk0x1c); // vtable+0x14 virtual void SetCachedTextureInfo(LegoTextureInfo* p_cachedTextureInfo); // vtable+0x14
virtual void VTable0x18(); // vtable+0x18 virtual void VTable0x18(); // vtable+0x18
virtual void Init(); // vtable+0x1c virtual void Init(); // vtable+0x1c
virtual void VTable0x20(undefined4); // vtable+0x20 virtual void VTable0x20(undefined4); // vtable+0x20
MxString& GetName() { return m_name; } MxString& GetName() { return m_name; }
private: private:
MxString m_name; // 0x04 MxString m_name; // 0x04
undefined4 m_unk0x14; // 0x14 MxU32 m_count; // 0x14
LegoTextureInfo* m_unk0x18; // 0x18 LegoTextureInfo* m_textureInfo; // 0x18
LegoTextureInfo* m_unk0x1c; // 0x1c LegoTextureInfo* m_cachedTextureInfo; // 0x1c
}; };
#endif // LEGOPHONEME_H #endif // LEGOPHONEME_H

View File

@ -52,11 +52,11 @@ public:
MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state); MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state);
LegoPlantInfo* GetInfoArray(MxS32& p_length); LegoPlantInfo* GetInfoArray(MxS32& p_length);
LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, LegoOmni::World p_worldId); LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, LegoOmni::World p_worldId);
MxBool FUN_10026c50(LegoEntity* p_entity); MxBool DecrementCounter(LegoEntity* p_entity);
void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length); void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length);
MxResult FUN_10026410(); MxResult FUN_10026410();
void FUN_10027120(); void ClearCounters();
void FUN_10027200(); void SetInitialCounters();
static void SetCustomizeAnimFile(const char* p_value); static void SetCustomizeAnimFile(const char* p_value);
@ -68,10 +68,10 @@ public:
private: private:
void RemovePlant(MxS32 p_index, LegoOmni::World p_worldId); void RemovePlant(MxS32 p_index, LegoOmni::World p_worldId);
void FUN_10026860(MxS32 p_index); void AdjustHeight(MxS32 p_index);
LegoPlantInfo* GetInfo(LegoEntity* p_entity); LegoPlantInfo* GetInfo(LegoEntity* p_entity);
MxBool FUN_10026c80(MxS32 p_index); MxBool DecrementCounter(MxS32 p_index);
void FUN_100271b0(LegoEntity* p_entity, MxS32 p_adjust); void AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust);
static char* g_customizeAnimFile; static char* g_customizeAnimFile;
static MxS32 g_maxMove[4]; static MxS32 g_maxMove[4];

View File

@ -41,8 +41,8 @@ struct LegoPlantInfo {
MxU32 m_move; // 0x10 MxU32 m_move; // 0x10
MxU8 m_mood; // 0x14 MxU8 m_mood; // 0x14
MxU8 m_color; // 0x15 - see enum for possible values MxU8 m_color; // 0x15 - see enum for possible values
MxS8 m_unk0x16; // 0x16 MxS8 m_counter; // 0x16
MxS8 m_initialUnk0x16; // 0x17 - initial value loaded to m_unk0x16 MxS8 m_initialCounter; // 0x17 - initial value loaded to m_counter
const char* m_name; // 0x18 const char* m_name; // 0x18
undefined4 m_unk0x1c; // 0x1c undefined4 m_unk0x1c; // 0x1c
float m_x; // 0x20 float m_x; // 0x20

View File

@ -728,7 +728,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
else { else {
for (i = 0; g_unk0x100f0f30[i] != -1; i++) { for (i = 0; g_unk0x100f0f30[i] != -1; i++) {
if (plantInfo[g_unk0x100f0f30[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0f30[i]].m_counter) {
result = plantInfo[g_unk0x100f0f30[i]].m_entity; result = plantInfo[g_unk0x100f0f30[i]].m_entity;
break; break;
} }
@ -742,7 +742,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
else { else {
for (i = 0; g_unk0x100f0f50[i] != -1; i++) { for (i = 0; g_unk0x100f0f50[i] != -1; i++) {
if (plantInfo[g_unk0x100f0f50[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0f50[i]].m_counter) {
result = plantInfo[g_unk0x100f0f50[i]].m_entity; result = plantInfo[g_unk0x100f0f50[i]].m_entity;
break; break;
} }
@ -760,7 +760,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
else { else {
for (i = 0; g_unk0x100f0f90[i] != -1; i++) { for (i = 0; g_unk0x100f0f90[i] != -1; i++) {
if (plantInfo[g_unk0x100f0f90[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0f90[i]].m_counter) {
result = plantInfo[g_unk0x100f0f90[i]].m_entity; result = plantInfo[g_unk0x100f0f90[i]].m_entity;
break; break;
} }
@ -782,7 +782,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
else { else {
for (i = 0; g_unk0x100f0fa8[i] != -1; i++) { for (i = 0; g_unk0x100f0fa8[i] != -1; i++) {
if (plantInfo[g_unk0x100f0fa8[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0fa8[i]].m_counter) {
result = plantInfo[g_unk0x100f0fa8[i]].m_entity; result = plantInfo[g_unk0x100f0fa8[i]].m_entity;
break; break;
} }
@ -800,7 +800,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
else { else {
for (i = 0; g_unk0x100f0fb8[i] != -1; i++) { for (i = 0; g_unk0x100f0fb8[i] != -1; i++) {
if (plantInfo[g_unk0x100f0fb8[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0fb8[i]].m_counter) {
result = plantInfo[g_unk0x100f0fb8[i]].m_entity; result = plantInfo[g_unk0x100f0fb8[i]].m_entity;
break; break;
} }
@ -814,7 +814,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
else { else {
for (i = 0; g_unk0x100f0fe8[i] != -1; i++) { for (i = 0; g_unk0x100f0fe8[i] != -1; i++) {
if (plantInfo[g_unk0x100f0fe8[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0fe8[i]].m_counter) {
result = plantInfo[g_unk0x100f0fe8[i]].m_entity; result = plantInfo[g_unk0x100f0fe8[i]].m_entity;
break; break;
} }
@ -828,7 +828,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
else { else {
for (i = 0; g_unk0x100f1000[i] != -1; i++) { for (i = 0; g_unk0x100f1000[i] != -1; i++) {
if (plantInfo[g_unk0x100f1000[i]].m_unk0x16) { if (plantInfo[g_unk0x100f1000[i]].m_counter) {
result = plantInfo[g_unk0x100f1000[i]].m_entity; result = plantInfo[g_unk0x100f1000[i]].m_entity;
break; break;
} }
@ -842,7 +842,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
else { else {
for (i = 0; g_unk0x100f1018[i] != -1; i++) { for (i = 0; g_unk0x100f1018[i] != -1; i++) {
if (plantInfo[g_unk0x100f1018[i]].m_unk0x16) { if (plantInfo[g_unk0x100f1018[i]].m_counter) {
result = plantInfo[g_unk0x100f1018[i]].m_entity; result = plantInfo[g_unk0x100f1018[i]].m_entity;
break; break;
} }
@ -851,7 +851,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
break; break;
case 8: case 8:
for (i = 0; g_unk0x100f1030[i] != -1; i++) { for (i = 0; g_unk0x100f1030[i] != -1; i++) {
if (plantInfo[g_unk0x100f1030[i]].m_unk0x16) { if (plantInfo[g_unk0x100f1030[i]].m_counter) {
result = plantInfo[g_unk0x100f1030[i]].m_entity; result = plantInfo[g_unk0x100f1030[i]].m_entity;
break; break;
} }

View File

@ -608,8 +608,8 @@ void Act3Brickster::Animate(float p_time)
assert(m_shootAnim && m_pInfo); assert(m_shootAnim && m_pInfo);
if (m_unk0x50 < p_time) { if (m_unk0x50 < p_time) {
while (m_pInfo->m_unk0x16) { while (m_pInfo->m_counter) {
PlantManager()->FUN_10026c50(m_pInfo->m_entity); PlantManager()->DecrementCounter(m_pInfo->m_entity);
} }
assert(SoundManager()->GetCacheSoundManager()); assert(SoundManager()->GetCacheSoundManager());

View File

@ -99,7 +99,7 @@ LegoCarBuild::LegoCarBuild()
m_unk0x110 = 0; m_unk0x110 = 0;
m_unk0xf8 = c_unknownminusone; m_unk0xf8 = c_unknownminusone;
m_unk0x2d4 = FALSE; m_unk0x2d4 = FALSE;
m_unk0x258 = 0; m_animPresenter = NULL;
m_ColorBook_Bitmap = NULL; m_ColorBook_Bitmap = NULL;
m_Yellow_Ctl = NULL; m_Yellow_Ctl = NULL;
m_Red_Ctl = NULL; m_Red_Ctl = NULL;
@ -140,10 +140,10 @@ LegoCarBuild::~LegoCarBuild()
m_unk0x100 = 0; m_unk0x100 = 0;
m_unk0x110 = NULL; m_unk0x110 = NULL;
if (m_unk0x258) { if (m_animPresenter) {
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
m_unk0x258->SetTickleState(MxPresenter::e_idle); m_animPresenter->SetTickleState(MxPresenter::e_idle);
m_unk0x258 = NULL; m_animPresenter = NULL;
} }
ControlManager()->Unregister(this); ControlManager()->Unregister(this);
@ -293,7 +293,7 @@ void LegoCarBuild::FUN_10022f00()
{ {
if (m_unk0x110) { if (m_unk0x110) {
VTable0x6c(); VTable0x6c();
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
m_unk0x100 = 5; m_unk0x100 = 5;
} }
} }
@ -306,13 +306,13 @@ void LegoCarBuild::FUN_10022f30()
FUN_10024f70(FALSE); FUN_10024f70(FALSE);
FUN_100250e0(FALSE); FUN_100250e0(FALSE);
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) {
m_PlaceBrick_Sound->Enable(FALSE); m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE); m_PlaceBrick_Sound->Enable(TRUE);
} }
m_unk0x258->SetUnknown0xbc(1); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped);
m_unk0x258->PutFrame(); m_animPresenter->PutFrame();
m_unk0x110 = NULL; m_unk0x110 = NULL;
m_unk0x100 = 0; m_unk0x100 = 0;
} }
@ -483,12 +483,12 @@ void LegoCarBuild::FUN_100236d0()
FUN_10024f70(FALSE); FUN_10024f70(FALSE);
FUN_100250e0(FALSE); FUN_100250e0(FALSE);
m_unk0x258->FUN_10079790(m_unk0x110->GetName()); m_animPresenter->FUN_10079790(m_unk0x110->GetName());
m_unk0x258->SetUnknown0xbc(1); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped);
m_unk0x110 = NULL; m_unk0x110 = NULL;
m_unk0x100 = 0; m_unk0x100 = 0;
if (m_unk0x258->AllPartsPlaced()) { if (m_animPresenter->AllPartsPlaced()) {
// Note the code duplication with LEGO1 0x10025ee0 // Note the code duplication with LEGO1 0x10025ee0
switch (m_carId) { switch (m_carId) {
case 1: case 1:
@ -545,7 +545,7 @@ MxResult LegoCarBuild::Tickle()
} }
if (m_unk0x110) { if (m_unk0x110) {
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) {
FUN_10022f30(); FUN_10022f30();
} }
} }
@ -827,7 +827,7 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y)
LegoROI* roi = PickROI(p_x, p_y); LegoROI* roi = PickROI(p_x, p_y);
if (!roi || !m_unk0x258->StringEndsOnYOrN(roi->GetName())) { if (!roi || !m_animPresenter->StringEndsOnYOrN(roi->GetName())) {
return 0; return 0;
} }
@ -838,7 +838,7 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y)
FUN_100250e0(TRUE); FUN_100250e0(TRUE);
} }
if (m_unk0x100 == 5 && m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_unk0x100 == 5 && m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) {
m_unk0x2d4 = TRUE; m_unk0x2d4 = TRUE;
} }
else { else {
@ -847,7 +847,7 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y)
FUN_10025450(); FUN_10025450();
VTable0x70(); VTable0x70();
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) {
if (m_unk0x100 != 5) { if (m_unk0x100 != 5) {
m_unk0x250[0] += m_unk0x290[0] - m_unk0x298[0]; m_unk0x250[0] += m_unk0x290[0] - m_unk0x298[0];
m_unk0x250[1] += m_unk0x290[1] - m_unk0x298[1]; m_unk0x250[1] += m_unk0x290[1] - m_unk0x298[1];
@ -858,8 +858,8 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y)
} }
} }
else { else {
if (m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) { if (m_animPresenter->FUN_10079c30(m_unk0x110->GetName())) {
m_unk0x114 = m_unk0x258->FUN_10079e20(); m_unk0x114 = m_animPresenter->FUN_10079e20();
} }
} }
@ -875,7 +875,7 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y)
m_GetBrick_Sound->Enable(FALSE); m_GetBrick_Sound->Enable(FALSE);
m_GetBrick_Sound->Enable(TRUE); m_GetBrick_Sound->Enable(TRUE);
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
return 1; return 1;
} }
@ -895,7 +895,7 @@ undefined4 LegoCarBuild::FUN_100246e0(MxLong p_x, MxLong p_y)
result = 1; result = 1;
break; break;
case 6: case 6:
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName()) && if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName()) &&
SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) { SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) {
FUN_10024f70(FALSE); FUN_10024f70(FALSE);
FUN_100250e0(FALSE); FUN_100250e0(FALSE);
@ -903,9 +903,9 @@ undefined4 LegoCarBuild::FUN_100246e0(MxLong p_x, MxLong p_y)
m_unk0x110 = NULL; m_unk0x110 = NULL;
m_PlaceBrick_Sound->Enable(FALSE); m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE); m_PlaceBrick_Sound->Enable(TRUE);
m_unk0x258->SetUnknown0xbc(1); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped);
} }
else if (m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) { else if (m_animPresenter->FUN_10079c30(m_unk0x110->GetName())) {
if (SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) { if (SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) {
m_PlaceBrick_Sound->Enable(FALSE); m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE); m_PlaceBrick_Sound->Enable(TRUE);
@ -968,7 +968,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
DeleteObjects(&m_atomId, 500, 510); DeleteObjects(&m_atomId, 500, 510);
} }
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
m_destLocation = LegoGameState::e_infomain; m_destLocation = LegoGameState::e_infomain;
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
result = 1; result = 1;
@ -982,12 +982,12 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
DeleteObjects(&m_atomId, 500, 510); DeleteObjects(&m_atomId, 500, 510);
} }
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
if (GameState()->GetCurrentAct() == LegoGameState::e_act2) { if (GameState()->GetCurrentAct() == LegoGameState::e_act2) {
FUN_100243a0(); FUN_100243a0();
} }
else if (m_unk0x258->AllPartsPlaced() || m_buildState->m_unk0x4d) { else if (m_animPresenter->AllPartsPlaced() || m_buildState->m_unk0x4d) {
m_buildState->m_unk0x4d = TRUE; m_buildState->m_unk0x4d = TRUE;
InvokeAction(Extra::e_start, m_atomId, m_carId, NULL); InvokeAction(Extra::e_start, m_atomId, m_carId, NULL);
@ -1024,7 +1024,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
(m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) ||
(m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) ||
(m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) { (m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) {
m_unk0x258->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId); m_animPresenter->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId);
m_Decal_Sound->Enable(FALSE); m_Decal_Sound->Enable(FALSE);
m_Decal_Sound->Enable(TRUE); m_Decal_Sound->Enable(TRUE);
} }
@ -1057,16 +1057,16 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
if (param->m_unk0x28) { if (param->m_unk0x28) {
switch (param->m_clickedObjectId) { switch (param->m_clickedObjectId) {
case CopterScript::c_Info_Ctl: case CopterScript::c_Info_Ctl:
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
m_destLocation = LegoGameState::e_infomain; m_destLocation = LegoGameState::e_infomain;
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
result = 1; result = 1;
break; break;
case CopterScript::c_Exit_Ctl: case CopterScript::c_Exit_Ctl:
if (m_buildState->m_animationState != LegoVehicleBuildState::e_exiting) { if (m_buildState->m_animationState != LegoVehicleBuildState::e_exiting) {
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
if (m_unk0x258->AllPartsPlaced() || m_buildState->m_unk0x4d) { if (m_animPresenter->AllPartsPlaced() || m_buildState->m_unk0x4d) {
m_buildState->m_unk0x4d = TRUE; m_buildState->m_unk0x4d = TRUE;
// GameState()->GetCurrentAct() returns an MxS16 in BETA10 // GameState()->GetCurrentAct() returns an MxS16 in BETA10
@ -1128,7 +1128,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
(m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) ||
(m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) ||
(m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) { (m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) {
m_unk0x258->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId); m_animPresenter->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId);
m_Decal_Sound->Enable(FALSE); m_Decal_Sound->Enable(FALSE);
m_Decal_Sound->Enable(TRUE); m_Decal_Sound->Enable(TRUE);
} }
@ -1205,7 +1205,7 @@ undefined4 LegoCarBuild::FUN_10024c20(MxNotificationParam* p_param)
assert(destWorld); assert(destWorld);
m_buildState->m_animationState = LegoVehicleBuildState::e_exiting; m_buildState->m_animationState = LegoVehicleBuildState::e_exiting;
if (!m_unk0x258->AllPartsPlaced()) { if (!m_animPresenter->AllPartsPlaced()) {
FUN_100243a0(); FUN_100243a0();
} }
else { else {
@ -1264,7 +1264,7 @@ void LegoCarBuild::FUN_10024ef0()
void LegoCarBuild::FUN_10024f30() void LegoCarBuild::FUN_10024f30()
{ {
FUN_10022f30(); FUN_10022f30();
m_unk0x258->SetUnknown0xbc(2); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_moving);
} }
// FUNCTION: LEGO1 0x10024f50 // FUNCTION: LEGO1 0x10024f50
@ -1272,14 +1272,14 @@ void LegoCarBuild::FUN_10024f30()
void LegoCarBuild::FUN_10024f50() void LegoCarBuild::FUN_10024f50()
{ {
m_unk0x2d4 = FALSE; m_unk0x2d4 = FALSE;
m_unk0x258->RotateAroundYAxis(g_rotationAngleStepYAxis); m_animPresenter->RotateAroundYAxis(g_rotationAngleStepYAxis);
} }
// FUNCTION: LEGO1 0x10024f70 // FUNCTION: LEGO1 0x10024f70
// FUNCTION: BETA10 0x1006e002 // FUNCTION: BETA10 0x1006e002
void LegoCarBuild::FUN_10024f70(MxBool p_enabled) void LegoCarBuild::FUN_10024f70(MxBool p_enabled)
{ {
if (m_unk0x258->StringEndsOnY(m_unk0x110->GetName())) { if (m_animPresenter->StringEndsOnY(m_unk0x110->GetName())) {
SetPresentersEnabled(p_enabled); SetPresentersEnabled(p_enabled);
} }
} }
@ -1314,7 +1314,7 @@ void LegoCarBuild::TogglePresentersEnabled()
// FUNCTION: BETA10 0x1006e124 // FUNCTION: BETA10 0x1006e124
void LegoCarBuild::FUN_100250e0(MxBool p_enabled) void LegoCarBuild::FUN_100250e0(MxBool p_enabled)
{ {
if (m_unk0x258->StringDoesNotEndOnZero(m_unk0x110->GetName()) && m_Decals_Ctl) { if (m_animPresenter->StringDoesNotEndOnZero(m_unk0x110->GetName()) && m_Decals_Ctl) {
if (SDL_strncasecmp(m_unk0x110->GetName(), "JSFRNT", strlen("JSFRNT")) == 0) { if (SDL_strncasecmp(m_unk0x110->GetName(), "JSFRNT", strlen("JSFRNT")) == 0) {
m_Decal_Bitmap->Enable(p_enabled); m_Decal_Bitmap->Enable(p_enabled);
m_Decals_Ctl->Enable(p_enabled); m_Decals_Ctl->Enable(p_enabled);
@ -1395,7 +1395,7 @@ void LegoCarBuild::FUN_10025450()
m_unk0x1c0 = m_unk0x12c; m_unk0x1c0 = m_unk0x12c;
Vector3 lastColumnOfUnk0x1c0(m_unk0x1c0[3]); Vector3 lastColumnOfUnk0x1c0(m_unk0x1c0[3]);
lastColumnOfUnk0x1c0 = Vector3(m_unk0x258->GetUnknown0xe0()[3]); lastColumnOfUnk0x1c0 = Vector3(m_animPresenter->GetBuildViewMatrix()[3]);
// This looks odd, but it improves the LEGO1 match while breaking the BETA10 match. // This looks odd, but it improves the LEGO1 match while breaking the BETA10 match.
// I don't know whether this is due to compiler entropy. // I don't know whether this is due to compiler entropy.
@ -1404,7 +1404,7 @@ void LegoCarBuild::FUN_10025450()
MxMatrix* unk0x178 = &m_unk0x178; MxMatrix* unk0x178 = &m_unk0x178;
*unk0x178 = m_unk0x12c; *unk0x178 = m_unk0x12c;
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_unk0x110->GetName())) {
m_unk0x2a4 = Vector4(m_unk0x110->GetWorldPosition()); m_unk0x2a4 = Vector4(m_unk0x110->GetWorldPosition());
if (!m_unk0x2d4) { if (!m_unk0x2d4) {
@ -1421,11 +1421,11 @@ void LegoCarBuild::FUN_10025450()
else { else {
const LegoChar* wiredName; const LegoChar* wiredName;
if (!m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) { if (!m_animPresenter->FUN_10079c30(m_unk0x110->GetName())) {
wiredName = m_unk0x258->GetWiredNameByPartName(m_unk0x110->GetName()); wiredName = m_animPresenter->GetWiredNameByPartName(m_unk0x110->GetName());
} }
else { else {
wiredName = m_unk0x258->GetWiredNameOfLastPlacedPart(); wiredName = m_animPresenter->GetWiredNameOfLastPlacedPart();
} }
LegoROI* parentROI = (LegoROI*) m_unk0x110->GetParentROI(); LegoROI* parentROI = (LegoROI*) m_unk0x110->GetParentROI();

View File

@ -25,17 +25,17 @@ DECOMP_SIZE_ASSERT(LegoCarBuildAnimPresenter, 0x150)
// FUNCTION: BETA10 0x100707c0 // FUNCTION: BETA10 0x100707c0
LegoCarBuildAnimPresenter::LegoCarBuildAnimPresenter() LegoCarBuildAnimPresenter::LegoCarBuildAnimPresenter()
{ {
m_unk0xbc = 0; m_shelfState = e_selected;
m_numberOfParts = 0; m_numberOfParts = 0;
m_placedPartCount = 0; m_placedPartCount = 0;
m_parts = NULL; m_parts = NULL;
m_unk0xc4 = NULL; m_platformAnimNodeData = NULL;
m_unk0x130 = 0; m_shelfFrame = 0;
m_unk0x12c = 0; m_shelfFrameBuffer = 0;
m_unk0x134 = 0; m_shelfFrameMax = 0;
m_unk0x138 = 0; m_shelfFrameInterval = 0;
m_unk0x13c = 0; m_unk0x13c = 0;
m_unk0x140 = NULL; m_carBuildEntity = NULL;
m_unk0x144 = -1; m_unk0x144 = -1;
m_unk0x148 = -1; m_unk0x148 = -1;
m_mainSourceId = NULL; m_mainSourceId = NULL;
@ -53,8 +53,8 @@ LegoCarBuildAnimPresenter::~LegoCarBuildAnimPresenter()
delete[] m_parts; delete[] m_parts;
} }
m_unk0xc8.GetRoot()->SetNumChildren(0); m_platformAnim.GetRoot()->SetNumChildren(0);
*m_unk0xc8.GetRoot()->GetChildren() = NULL; *m_platformAnim.GetRoot()->GetChildren() = NULL;
if (m_mainSourceId) { if (m_mainSourceId) {
delete[] m_mainSourceId; delete[] m_mainSourceId;
@ -116,14 +116,14 @@ inline void LegoCarBuildAnimPresenter::Beta10Inline0x100733d0()
// FUNCTION: BETA10 0x10070ab1 // FUNCTION: BETA10 0x10070ab1
void LegoCarBuildAnimPresenter::PutFrame() void LegoCarBuildAnimPresenter::PutFrame()
{ {
switch (m_unk0xbc) { switch (m_shelfState) {
case 0: case e_selected:
break; break;
case 2: case e_moving:
FUN_10079a90(); MoveShelfForward();
case 1: case e_stopped:
if (m_unk0x140->GetROI()) { if (m_carBuildEntity->GetROI()) {
FUN_1006b9a0(m_anim, m_unk0x12c, NULL); FUN_1006b9a0(m_anim, m_shelfFrameBuffer, NULL);
} }
default: default:
break; break;
@ -152,24 +152,24 @@ void LegoCarBuildAnimPresenter::ReadyTickle()
#endif #endif
} }
m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Dunebld"); m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Dunebld");
if (!m_unk0x140) { if (!m_carBuildEntity) {
m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Chptrbld"); m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Chptrbld");
} }
if (!m_unk0x140) { if (!m_carBuildEntity) {
m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Jetbld"); m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Jetbld");
} }
if (!m_unk0x140) { if (!m_carBuildEntity) {
m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "bldrace"); m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "bldrace");
} }
if (m_unk0x140) { if (m_carBuildEntity) {
((LegoCarBuild*) m_currentWorld)->SetUnknown0x258(this); ((LegoCarBuild*) m_currentWorld)->SetCarBuildAnimPresenter(this);
m_placedPartCount = ((LegoCarBuild*) m_currentWorld)->GetPlacedPartCount(); m_placedPartCount = ((LegoCarBuild*) m_currentWorld)->GetPlacedPartCount();
SetUnknown0xbc(1); SetShelfState(e_stopped);
m_previousTickleStates |= 1 << m_currentTickleState; m_previousTickleStates |= 1 << m_currentTickleState;
m_currentTickleState = e_starting; m_currentTickleState = e_starting;
m_compositePresenter->SendToCompositePresenter(Lego()); m_compositePresenter->SendToCompositePresenter(Lego());
@ -184,7 +184,7 @@ void LegoCarBuildAnimPresenter::ReadyTickle()
// FUNCTION: BETA10 0x10070cdd // FUNCTION: BETA10 0x10070cdd
void LegoCarBuildAnimPresenter::StreamingTickle() void LegoCarBuildAnimPresenter::StreamingTickle()
{ {
if (!m_unk0x140->GetROI()) { if (!m_carBuildEntity->GetROI()) {
return; return;
} }
@ -194,7 +194,7 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
strcpy(m_mainSourceId, m_action->GetAtomId().GetInternal()); strcpy(m_mainSourceId, m_action->GetAtomId().GetInternal());
m_mainSourceId[strlen(m_mainSourceId) - 1] = 'M'; m_mainSourceId[strlen(m_mainSourceId) - 1] = 'M';
FUN_10079160(); InitBuildPlatform();
if (GameState()->GetCurrentAct() == LegoGameState::e_act2) { if (GameState()->GetCurrentAct() == LegoGameState::e_act2) {
m_placedPartCount = 10; m_placedPartCount = 10;
@ -234,7 +234,7 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
Lego3DView* lego3dview = videoManager->Get3DManager()->GetLego3DView(); Lego3DView* lego3dview = videoManager->Get3DManager()->GetLego3DView();
LegoROI* videoManagerROI = videoManager->GetViewROI(); LegoROI* videoManagerROI = videoManager->GetViewROI();
LegoROI* local60 = m_unk0x140->GetROI(); LegoROI* local60 = m_carBuildEntity->GetROI();
LegoROI* camera = NULL; LegoROI* camera = NULL;
MxFloat fov; MxFloat fov;
@ -273,7 +273,7 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
lego3dview->Moved(*videoManagerROI); lego3dview->Moved(*videoManagerROI);
videoManager->Get3DManager()->SetFrustrum(fov, 0.1, 250.0); videoManager->Get3DManager()->SetFrustrum(fov, 0.1, 250.0);
m_unk0xe0 = local60->FindChildROI("VIEW", local60)->GetLocal2World(); m_buildViewMatrix = local60->FindChildROI("VIEW", local60)->GetLocal2World();
m_previousTickleStates |= 1 << m_currentTickleState; m_previousTickleStates |= 1 << m_currentTickleState;
m_currentTickleState = e_repeating; m_currentTickleState = e_repeating;
@ -286,7 +286,7 @@ void LegoCarBuildAnimPresenter::EndAction()
if (m_action) { if (m_action) {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
MxVideoPresenter::EndAction(); MxVideoPresenter::EndAction();
m_unk0xbc = 0; m_shelfState = e_selected;
} }
} }
@ -296,7 +296,7 @@ MxResult LegoCarBuildAnimPresenter::Serialize(LegoStorage* p_storage)
{ {
if (p_storage->IsReadMode()) { if (p_storage->IsReadMode()) {
p_storage->ReadS16(m_placedPartCount); p_storage->ReadS16(m_placedPartCount);
p_storage->ReadFloat(m_unk0x130); p_storage->ReadFloat(m_shelfFrame);
for (MxS16 i = 0; i < m_numberOfParts; i++) { for (MxS16 i = 0; i < m_numberOfParts; i++) {
p_storage->ReadString(m_parts[i].m_name); p_storage->ReadString(m_parts[i].m_name);
p_storage->ReadString(m_parts[i].m_wiredName); p_storage->ReadString(m_parts[i].m_wiredName);
@ -305,7 +305,7 @@ MxResult LegoCarBuildAnimPresenter::Serialize(LegoStorage* p_storage)
} }
else if (p_storage->IsWriteMode()) { else if (p_storage->IsWriteMode()) {
p_storage->WriteS16(m_placedPartCount); p_storage->WriteS16(m_placedPartCount);
p_storage->WriteFloat(m_unk0x130); p_storage->WriteFloat(m_shelfFrame);
for (MxS16 i = 0; i < m_numberOfParts; i++) { for (MxS16 i = 0; i < m_numberOfParts; i++) {
p_storage->WriteString(m_parts[i].m_name); p_storage->WriteString(m_parts[i].m_name);
p_storage->WriteString(m_parts[i].m_wiredName); p_storage->WriteString(m_parts[i].m_wiredName);
@ -346,7 +346,7 @@ void LegoCarBuildAnimPresenter::SwapNodesByName(LegoChar* p_name1, LegoChar* p_n
// FUNCTION: LEGO1 0x10079160 // FUNCTION: LEGO1 0x10079160
// FUNCTION: BETA10 0x1007165d // FUNCTION: BETA10 0x1007165d
void LegoCarBuildAnimPresenter::FUN_10079160() void LegoCarBuildAnimPresenter::InitBuildPlatform()
{ {
LegoTreeNode* root; LegoTreeNode* root;
LegoAnimNodeData* data2; LegoAnimNodeData* data2;
@ -357,16 +357,17 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
LegoAnimNodeData* destData; LegoAnimNodeData* destData;
LegoTreeNode** children; LegoTreeNode** children;
// Get Platform data, Shelf Frame data, and number of build parts
for (i = 0; i < totalNodes; i++) { for (i = 0; i < totalNodes; i++) {
LegoAnimNodeData* data = (LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData(); LegoAnimNodeData* data = (LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData();
name = data->GetName(); name = data->GetName();
if (StringEqualsPlatform(name)) { if (StringEqualsPlatform(name)) {
m_unk0xc4 = data; m_platformAnimNodeData = data;
if (m_unk0xc4->GetNumRotationKeys() == 0) { if (m_platformAnimNodeData->GetNumRotationKeys() == 0) {
LegoRotationKey* key = new LegoRotationKey[1]; LegoRotationKey* key = new LegoRotationKey[1];
m_unk0xc4->SetNumRotationKeys(1); m_platformAnimNodeData->SetNumRotationKeys(1);
m_unk0xc4->SetRotationKeys(key); m_platformAnimNodeData->SetRotationKeys(key);
} }
} }
else { else {
@ -374,9 +375,9 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
m_numberOfParts++; m_numberOfParts++;
} }
else { else {
if (m_unk0x134 == 0.0f && StringEqualsShelf(name)) { if (m_shelfFrameMax == 0.0f && StringEqualsShelf(name)) {
m_unk0x134 = m_anim->GetDuration(); m_shelfFrameMax = m_anim->GetDuration();
m_unk0x138 = m_unk0x134 / (data->GetNumTranslationKeys() - 1); m_shelfFrameInterval = m_shelfFrameMax / (data->GetNumTranslationKeys() - 1);
} }
} }
} }
@ -386,6 +387,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
m_parts = new UnknownListEntry[m_numberOfParts]; m_parts = new UnknownListEntry[m_numberOfParts];
assert(m_parts); assert(m_parts);
// Go through and add the wired name of each part
for (i = 0; i < totalNodes; i++) { for (i = 0; i < totalNodes; i++) {
name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName(); name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName();
@ -404,6 +406,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
MxS16 counter = 0; MxS16 counter = 0;
// Go through and add the normal name of each part
for (i = 0; i < totalNodes; i++) { for (i = 0; i < totalNodes; i++) {
name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName(); name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName();
if (StringEndsOnYOrN(name)) { if (StringEndsOnYOrN(name)) {
@ -422,6 +425,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
} }
} }
// Set Platform root node
destNode = new LegoTreeNode(); destNode = new LegoTreeNode();
assert(destNode); assert(destNode);
destData = new LegoAnimNodeData(); destData = new LegoAnimNodeData();
@ -438,7 +442,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
*children = FindNodeByName(m_anim->GetRoot(), "PLATFORM"); *children = FindNodeByName(m_anim->GetRoot(), "PLATFORM");
destNode->SetChildren(children); destNode->SetChildren(children);
m_unk0xc8.SetRoot(destNode); m_platformAnim.SetRoot(destNode);
} }
// FUNCTION: LEGO1 0x100795d0 // FUNCTION: LEGO1 0x100795d0
@ -563,8 +567,8 @@ void LegoCarBuildAnimPresenter::FUN_10079790(const LegoChar* p_name)
// FUNCTION: BETA10 0x1007225d // FUNCTION: BETA10 0x1007225d
void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle) void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle)
{ {
if (m_unk0xc4) { if (m_platformAnimNodeData) {
LegoRotationKey* rotationKey = m_unk0xc4->GetRotationKey(0); LegoRotationKey* rotationKey = m_platformAnimNodeData->GetRotationKey(0);
Mx4DPointFloat Mx4DPointFloat
currentRotation(rotationKey->GetX(), rotationKey->GetY(), rotationKey->GetZ(), rotationKey->GetAngle()); currentRotation(rotationKey->GetX(), rotationKey->GetY(), rotationKey->GetZ(), rotationKey->GetAngle());
@ -581,33 +585,33 @@ void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle)
rotationKey->FUN_100739a0(FALSE); rotationKey->FUN_100739a0(FALSE);
} }
m_unk0xc4->GetRotationKey(0)->SetX(newRotation[0]); m_platformAnimNodeData->GetRotationKey(0)->SetX(newRotation[0]);
m_unk0xc4->GetRotationKey(0)->SetY(newRotation[1]); m_platformAnimNodeData->GetRotationKey(0)->SetY(newRotation[1]);
m_unk0xc4->GetRotationKey(0)->SetZ(newRotation[2]); m_platformAnimNodeData->GetRotationKey(0)->SetZ(newRotation[2]);
m_unk0xc4->GetRotationKey(0)->SetAngle(newRotation[3]); m_platformAnimNodeData->GetRotationKey(0)->SetAngle(newRotation[3]);
if (m_unk0x140->GetROI()) { if (m_carBuildEntity->GetROI()) {
FUN_1006b9a0(&m_unk0xc8, m_unk0x12c, NULL); FUN_1006b9a0(&m_platformAnim, m_shelfFrameBuffer, NULL);
} }
} }
} }
// FUNCTION: LEGO1 0x10079a90 // FUNCTION: LEGO1 0x10079a90
// FUNCTION: BETA10 0x10072412 // FUNCTION: BETA10 0x10072412
void LegoCarBuildAnimPresenter::FUN_10079a90() void LegoCarBuildAnimPresenter::MoveShelfForward()
{ {
if (m_unk0x12c >= m_unk0x134) { if (m_shelfFrameBuffer >= m_shelfFrameMax) {
m_unk0x130 = 0.0; m_shelfFrame = 0.0;
m_unk0x12c = m_unk0x130; m_shelfFrameBuffer = m_shelfFrame;
m_unk0xbc = 1; m_shelfState = e_stopped;
} }
else if (m_unk0x12c >= m_unk0x138 + m_unk0x130) { else if (m_shelfFrameBuffer >= m_shelfFrameInterval + m_shelfFrame) {
m_unk0x130 = m_unk0x138 + m_unk0x130; m_shelfFrame = m_shelfFrameInterval + m_shelfFrame;
m_unk0x12c = m_unk0x130; m_shelfFrameBuffer = m_shelfFrame;
m_unk0xbc = 1; m_shelfState = e_stopped;
} }
else { else {
m_unk0x12c = m_unk0x138 / 10.0f + m_unk0x12c; m_shelfFrameBuffer = m_shelfFrameInterval / 10.0f + m_shelfFrameBuffer;
} }
} }
@ -708,6 +712,6 @@ void LegoCarBuildAnimPresenter::SetPartObjectIdByName(const LegoChar* p_name, Mx
// FUNCTION: BETA10 0x10072959 // FUNCTION: BETA10 0x10072959
const BoundingSphere& LegoCarBuildAnimPresenter::FUN_10079e20() const BoundingSphere& LegoCarBuildAnimPresenter::FUN_10079e20()
{ {
LegoROI* roi = m_unk0x140->GetROI(); LegoROI* roi = m_carBuildEntity->GetROI();
return roi->FindChildROI(m_parts[m_placedPartCount].m_wiredName, roi)->GetWorldBoundingSphere(); return roi->FindChildROI(m_parts[m_placedPartCount].m_wiredName, roi)->GetWorldBoundingSphere();
} }

View File

@ -8,39 +8,39 @@ LegoPhoneme::~LegoPhoneme()
} }
// FUNCTION: LEGO1 0x10044eb0 // FUNCTION: LEGO1 0x10044eb0
undefined4 LegoPhoneme::VTable0x00() MxU32 LegoPhoneme::GetCount()
{ {
return m_unk0x14; return m_count;
} }
// FUNCTION: LEGO1 0x10044ec0 // FUNCTION: LEGO1 0x10044ec0
void LegoPhoneme::VTable0x04(undefined4 p_unk0x14) void LegoPhoneme::SetCount(MxU32 p_count)
{ {
m_unk0x14 = p_unk0x14; m_count = p_count;
} }
// FUNCTION: LEGO1 0x10044ed0 // FUNCTION: LEGO1 0x10044ed0
LegoTextureInfo* LegoPhoneme::VTable0x08() LegoTextureInfo* LegoPhoneme::GetTextureInfo()
{ {
return m_unk0x18; return m_textureInfo;
} }
// FUNCTION: LEGO1 0x10044ee0 // FUNCTION: LEGO1 0x10044ee0
void LegoPhoneme::VTable0x0c(LegoTextureInfo* p_unk0x18) void LegoPhoneme::SetTextureInfo(LegoTextureInfo* p_textureInfo)
{ {
m_unk0x18 = p_unk0x18; m_textureInfo = p_textureInfo;
} }
// FUNCTION: LEGO1 0x10044ef0 // FUNCTION: LEGO1 0x10044ef0
LegoTextureInfo* LegoPhoneme::VTable0x10() LegoTextureInfo* LegoPhoneme::GetCachedTextureInfo()
{ {
return m_unk0x1c; return m_cachedTextureInfo;
} }
// FUNCTION: LEGO1 0x10044f00 // FUNCTION: LEGO1 0x10044f00
void LegoPhoneme::VTable0x14(LegoTextureInfo* p_unk0x1c) void LegoPhoneme::SetCachedTextureInfo(LegoTextureInfo* p_cachedTextureInfo)
{ {
m_unk0x1c = p_unk0x1c; m_cachedTextureInfo = p_cachedTextureInfo;
} }
// FUNCTION: LEGO1 0x10044f10 // FUNCTION: LEGO1 0x10044f10
@ -51,9 +51,9 @@ void LegoPhoneme::VTable0x18()
// FUNCTION: LEGO1 0x10044f20 // FUNCTION: LEGO1 0x10044f20
void LegoPhoneme::Init() void LegoPhoneme::Init()
{ {
m_unk0x14 = 0; m_count = 0;
m_unk0x18 = NULL; m_textureInfo = NULL;
m_unk0x1c = NULL; m_cachedTextureInfo = NULL;
} }
// FUNCTION: LEGO1 0x10044f30 // FUNCTION: LEGO1 0x10044f30

View File

@ -31,10 +31,10 @@ const char* g_plantLodNames[4][5] = {
}; };
// GLOBAL: LEGO1 0x100f16b0 // GLOBAL: LEGO1 0x100f16b0
float g_unk0x100f16b0[] = {0.1f, 0.7f, 0.5f, 0.9f}; float g_heightPerCount[] = {0.1f, 0.7f, 0.5f, 0.9f};
// GLOBAL: LEGO1 0x100f16c0 // GLOBAL: LEGO1 0x100f16c0
MxU8 g_unk0x100f16c0[] = {1, 2, 2, 3}; MxU8 g_counters[] = {1, 2, 2, 3};
// GLOBAL: LEGO1 0x100f315c // GLOBAL: LEGO1 0x100f315c
MxU32 LegoPlantManager::g_maxSound = 8; MxU32 LegoPlantManager::g_maxSound = 8;
@ -217,7 +217,7 @@ LegoEntity* LegoPlantManager::CreatePlant(MxS32 p_index, LegoWorld* p_world, Leg
if (p_index < sizeOfArray(g_plantInfo)) { if (p_index < sizeOfArray(g_plantInfo)) {
MxU32 world = 1 << (MxU8) p_worldId; MxU32 world = 1 << (MxU8) p_worldId;
if (g_plantInfo[p_index].m_worlds & world && g_plantInfo[p_index].m_unk0x16 != 0) { if (g_plantInfo[p_index].m_worlds & world && g_plantInfo[p_index].m_counter != 0) {
if (g_plantInfo[p_index].m_entity == NULL) { if (g_plantInfo[p_index].m_entity == NULL) {
char name[256]; char name[256];
char lodName[256]; char lodName[256];
@ -286,7 +286,7 @@ MxResult LegoPlantManager::Write(LegoStorage* p_storage)
if (p_storage->Write(&info->m_color, sizeof(info->m_color)) != SUCCESS) { if (p_storage->Write(&info->m_color, sizeof(info->m_color)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_initialUnk0x16, sizeof(info->m_initialUnk0x16)) != SUCCESS) { if (p_storage->Write(&info->m_initialCounter, sizeof(info->m_initialCounter)) != SUCCESS) {
goto done; goto done;
} }
} }
@ -321,12 +321,12 @@ MxResult LegoPlantManager::Read(LegoStorage* p_storage)
if (p_storage->Read(&info->m_color, sizeof(MxU8)) != SUCCESS) { if (p_storage->Read(&info->m_color, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_unk0x16, sizeof(MxS8)) != SUCCESS) { if (p_storage->Read(&info->m_counter, sizeof(MxS8)) != SUCCESS) {
goto done; goto done;
} }
info->m_initialUnk0x16 = info->m_unk0x16; info->m_initialCounter = info->m_counter;
FUN_10026860(i); AdjustHeight(i);
} }
result = SUCCESS; result = SUCCESS;
@ -337,13 +337,13 @@ done:
// FUNCTION: LEGO1 0x10026860 // FUNCTION: LEGO1 0x10026860
// FUNCTION: BETA10 0x100c5be0 // FUNCTION: BETA10 0x100c5be0
void LegoPlantManager::FUN_10026860(MxS32 p_index) void LegoPlantManager::AdjustHeight(MxS32 p_index)
{ {
MxU8 variant = g_plantInfo[p_index].m_variant; MxU8 variant = g_plantInfo[p_index].m_variant;
if (g_plantInfo[p_index].m_unk0x16 >= 0) { if (g_plantInfo[p_index].m_counter >= 0) {
float value = g_unk0x100f16c0[variant] - g_plantInfo[p_index].m_unk0x16; float value = g_counters[variant] - g_plantInfo[p_index].m_counter;
g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1] - value * g_unk0x100f16b0[variant]; g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1] - value * g_heightPerCount[variant];
} }
else { else {
g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1]; g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1];
@ -411,7 +411,7 @@ MxBool LegoPlantManager::SwitchVariant(LegoEntity* p_entity)
{ {
LegoPlantInfo* info = GetInfo(p_entity); LegoPlantInfo* info = GetInfo(p_entity);
if (info == NULL || info->m_unk0x16 != -1) { if (info == NULL || info->m_counter != -1) {
return FALSE; return FALSE;
} }
@ -551,7 +551,7 @@ void LegoPlantManager::SetCustomizeAnimFile(const char* p_value)
// FUNCTION: LEGO1 0x10026c50 // FUNCTION: LEGO1 0x10026c50
// FUNCTION: BETA10 0x100c6349 // FUNCTION: BETA10 0x100c6349
MxBool LegoPlantManager::FUN_10026c50(LegoEntity* p_entity) MxBool LegoPlantManager::DecrementCounter(LegoEntity* p_entity)
{ {
LegoPlantInfo* info = GetInfo(p_entity); LegoPlantInfo* info = GetInfo(p_entity);
@ -559,12 +559,12 @@ MxBool LegoPlantManager::FUN_10026c50(LegoEntity* p_entity)
return FALSE; return FALSE;
} }
return FUN_10026c80(info - g_plantInfo); return DecrementCounter(info - g_plantInfo);
} }
// FUNCTION: LEGO1 0x10026c80 // FUNCTION: LEGO1 0x10026c80
// FUNCTION: BETA10 0x100c63eb // FUNCTION: BETA10 0x100c63eb
MxBool LegoPlantManager::FUN_10026c80(MxS32 p_index) MxBool LegoPlantManager::DecrementCounter(MxS32 p_index)
{ {
if (p_index >= sizeOfArray(g_plantInfo)) { if (p_index >= sizeOfArray(g_plantInfo)) {
return FALSE; return FALSE;
@ -578,23 +578,23 @@ MxBool LegoPlantManager::FUN_10026c80(MxS32 p_index)
MxBool result = TRUE; MxBool result = TRUE;
if (info->m_unk0x16 < 0) { if (info->m_counter < 0) {
info->m_unk0x16 = g_unk0x100f16c0[info->m_variant]; info->m_counter = g_counters[info->m_variant];
} }
if (info->m_unk0x16 > 0) { if (info->m_counter > 0) {
LegoROI* roi = info->m_entity->GetROI(); LegoROI* roi = info->m_entity->GetROI();
info->m_unk0x16--; info->m_counter--;
if (info->m_unk0x16 == 1) { if (info->m_counter == 1) {
info->m_unk0x16 = 0; info->m_counter = 0;
} }
if (info->m_unk0x16 == 0) { if (info->m_counter == 0) {
roi->SetVisibility(FALSE); roi->SetVisibility(FALSE);
} }
else { else {
FUN_10026860(info - g_plantInfo); AdjustHeight(info - g_plantInfo);
info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE); info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE);
} }
} }
@ -624,7 +624,7 @@ void LegoPlantManager::ScheduleAnimation(LegoEntity* p_entity, MxLong p_length)
time += p_length; time += p_length;
entry->m_time = time + 1000; entry->m_time = time + 1000;
FUN_100271b0(p_entity, -1); AdjustCounter(p_entity, -1);
} }
// FUNCTION: LEGO1 0x10026e00 // FUNCTION: LEGO1 0x10026e00
@ -673,11 +673,11 @@ MxResult LegoPlantManager::Tickle()
if (entry->m_time < time) { if (entry->m_time < time) {
LegoPlantInfo* info = GetInfo(entry->m_entity); LegoPlantInfo* info = GetInfo(entry->m_entity);
if (info->m_unk0x16 == 0) { if (info->m_counter == 0) {
entry->m_roi->SetVisibility(FALSE); entry->m_roi->SetVisibility(FALSE);
} }
else { else {
FUN_10026860(info - g_plantInfo); AdjustHeight(info - g_plantInfo);
info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE); info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE);
} }
@ -700,14 +700,14 @@ MxResult LegoPlantManager::Tickle()
} }
// FUNCTION: LEGO1 0x10027120 // FUNCTION: LEGO1 0x10027120
void LegoPlantManager::FUN_10027120() void LegoPlantManager::ClearCounters()
{ {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) {
g_plantInfo[i].m_unk0x16 = -1; g_plantInfo[i].m_counter = -1;
g_plantInfo[i].m_initialUnk0x16 = -1; g_plantInfo[i].m_initialCounter = -1;
FUN_10026860(i); AdjustHeight(i);
if (g_plantInfo[i].m_entity != NULL) { if (g_plantInfo[i].m_entity != NULL) {
g_plantInfo[i].m_entity->SetLocation( g_plantInfo[i].m_entity->SetLocation(
@ -721,28 +721,28 @@ void LegoPlantManager::FUN_10027120()
} }
// FUNCTION: LEGO1 0x100271b0 // FUNCTION: LEGO1 0x100271b0
void LegoPlantManager::FUN_100271b0(LegoEntity* p_entity, MxS32 p_adjust) void LegoPlantManager::AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust)
{ {
LegoPlantInfo* info = GetInfo(p_entity); LegoPlantInfo* info = GetInfo(p_entity);
if (info != NULL) { if (info != NULL) {
if (info->m_unk0x16 < 0) { if (info->m_counter < 0) {
info->m_unk0x16 = g_unk0x100f16c0[info->m_variant]; info->m_counter = g_counters[info->m_variant];
} }
if (info->m_unk0x16 > 0) { if (info->m_counter > 0) {
info->m_unk0x16 += p_adjust; info->m_counter += p_adjust;
if (info->m_unk0x16 <= 1 && p_adjust < 0) { if (info->m_counter <= 1 && p_adjust < 0) {
info->m_unk0x16 = 0; info->m_counter = 0;
} }
} }
} }
} }
// FUNCTION: LEGO1 0x10027200 // FUNCTION: LEGO1 0x10027200
void LegoPlantManager::FUN_10027200() void LegoPlantManager::SetInitialCounters()
{ {
for (MxU32 i = 0; i < sizeOfArray(g_plantInfo); i++) { for (MxU32 i = 0; i < sizeOfArray(g_plantInfo); i++) {
g_plantInfo[i].m_initialUnk0x16 = g_plantInfo[i].m_unk0x16; g_plantInfo[i].m_initialCounter = g_plantInfo[i].m_counter;
} }
} }

View File

@ -503,7 +503,7 @@ MxLong LegoEntity::Notify(MxParam& p_param)
case e_unk1: case e_unk1:
break; break;
case e_plant: case e_plant:
PlantManager()->FUN_10026c50(this); PlantManager()->DecrementCounter(this);
break; break;
case e_building: case e_building:
BuildingManager()->FUN_10030000(this); BuildingManager()->FUN_10030000(this);

View File

@ -566,27 +566,32 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage)
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
assert(s < m_numN);
edge.m_pointA = &m_nodes[s]; edge.m_pointA = &m_nodes[s];
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
assert(s < m_numN);
edge.m_pointB = &m_nodes[s]; edge.m_pointB = &m_nodes[s];
if (edge.m_flags & LegoOrientedEdge::c_hasFaceA) { if (edge.m_flags & LegoOrientedEdge::c_hasFaceA) {
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
assert(s < m_numL);
edge.m_faceA = &m_boundaries[s]; edge.m_faceA = &m_boundaries[s];
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
assert(s < m_numE);
edge.m_ccwA = &m_edges[s]; edge.m_ccwA = &m_edges[s];
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
assert(s < m_numE);
edge.m_cwA = &m_edges[s]; edge.m_cwA = &m_edges[s];
} }
@ -594,16 +599,19 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage)
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
assert(s < m_numL);
edge.m_faceB = &m_boundaries[s]; edge.m_faceB = &m_boundaries[s];
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
assert(s < m_numE);
edge.m_ccwB = &m_edges[s]; edge.m_ccwB = &m_edges[s];
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
assert(s < m_numE);
edge.m_cwB = &m_edges[s]; edge.m_cwB = &m_edges[s];
} }
@ -624,6 +632,9 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage)
MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage) MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage)
{ {
for (MxS32 i = 0; i < m_numL; i++) { for (MxS32 i = 0; i < m_numL; i++) {
#ifdef BETA10
Mx4DPointFloat unused;
#endif
LegoPathBoundary& boundary = m_boundaries[i]; LegoPathBoundary& boundary = m_boundaries[i];
MxU8 numE; MxU8 numE;
MxU16 s; MxU16 s;
@ -633,6 +644,8 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage)
return FAILURE; return FAILURE;
} }
assert(numE > 2);
boundary.m_edgeNormals = new Mx4DPointFloat[numE]; boundary.m_edgeNormals = new Mx4DPointFloat[numE];
LegoOrientedEdge** edges = new LegoOrientedEdge*[numE]; LegoOrientedEdge** edges = new LegoOrientedEdge*[numE];
@ -643,6 +656,8 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage)
return FAILURE; return FAILURE;
} }
assert(s < m_numE);
edges[j] = &m_edges[s]; edges[j] = &m_edges[s];
} }
@ -700,6 +715,8 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage)
return FAILURE; return FAILURE;
} }
assert(s < m_numT);
boundary.m_pathTrigger[j].m_pathStruct = &m_structs[s]; boundary.m_pathTrigger[j].m_pathStruct = &m_structs[s];
if (p_storage->Read(&boundary.m_pathTrigger[j].m_data, sizeof(boundary.m_pathTrigger[j].m_data)) != if (p_storage->Read(&boundary.m_pathTrigger[j].m_data, sizeof(boundary.m_pathTrigger[j].m_data)) !=

View File

@ -68,8 +68,8 @@ void LegoPhonemePresenter::StartingTickle()
CharacterManager()->SetHeadTexture(entityROI, textureInfo); CharacterManager()->SetHeadTexture(entityROI, textureInfo);
phoneme->VTable0x0c(m_textureInfo); phoneme->SetTextureInfo(m_textureInfo);
phoneme->VTable0x14(textureInfo); phoneme->SetCachedTextureInfo(textureInfo);
phonemeList->Append(phoneme); phonemeList->Append(phoneme);
m_textureInfo = textureInfo; m_textureInfo = textureInfo;
} }
@ -78,7 +78,7 @@ void LegoPhonemePresenter::StartingTickle()
cursor.Current(phoneme); cursor.Current(phoneme);
delete newPhoneme; delete newPhoneme;
phoneme->VTable0x04(phoneme->VTable0x00() + 1); phoneme->SetCount(phoneme->GetCount() + 1);
cursor.SetValue(phoneme); cursor.SetValue(phoneme);
m_unk0x70 = TRUE; m_unk0x70 = TRUE;
@ -136,7 +136,7 @@ void LegoPhonemePresenter::EndAction()
cursor.Current(phoneme); cursor.Current(phoneme);
delete newPhoneme; delete newPhoneme;
if (phoneme->VTable0x00() == 1) { if (phoneme->GetCount() == 1) {
LegoROI* roi; LegoROI* roi;
if (m_unk0x84) { if (m_unk0x84) {
@ -154,12 +154,12 @@ void LegoPhonemePresenter::EndAction()
CharacterManager()->ReleaseActor(m_roiName.GetData()); CharacterManager()->ReleaseActor(m_roiName.GetData());
} }
TextureContainer()->EraseCached(phoneme->VTable0x10()); TextureContainer()->EraseCached(phoneme->GetCachedTextureInfo());
TextureContainer()->EraseCached(phoneme->VTable0x08()); TextureContainer()->EraseCached(phoneme->GetTextureInfo());
cursor.Destroy(); cursor.Destroy();
} }
else { else {
phoneme->VTable0x04(phoneme->VTable0x00() - 1); phoneme->SetCount(phoneme->GetCount() - 1);
cursor.SetValue(phoneme); cursor.SetValue(phoneme);
} }

View File

@ -665,7 +665,7 @@ MxLong Act3::HandleTransitionEnd()
// FUNCTION: LEGO1 0x10073270 // FUNCTION: LEGO1 0x10073270
void Act3::ReadyWorld() void Act3::ReadyWorld()
{ {
PlantManager()->FUN_10027200(); PlantManager()->SetInitialCounters();
BuildingManager()->FUN_10030800(); BuildingManager()->FUN_10030800();
AnimationManager()->FUN_1005f6d0(FALSE); AnimationManager()->FUN_1005f6d0(FALSE);
VideoManager()->Get3DManager()->SetFrustrum(90.0f, 0.1f, 125.0f); VideoManager()->Get3DManager()->SetFrustrum(90.0f, 0.1f, 125.0f);

View File

@ -1389,7 +1389,7 @@ void Infocenter::Reset()
break; break;
} }
PlantManager()->FUN_10027120(); PlantManager()->ClearCounters();
BuildingManager()->FUN_10030590(); BuildingManager()->FUN_10030590();
AnimationManager()->Reset(FALSE); AnimationManager()->Reset(FALSE);
CharacterManager()->ReleaseAllActors(); CharacterManager()->ReleaseAllActors();

View File

@ -25,6 +25,7 @@ public:
// FUNCTION: BETA10 0x100373f0 // FUNCTION: BETA10 0x100373f0
LegoU32 IsEqual(LegoWEEdge* p_other) { return this == p_other; } LegoU32 IsEqual(LegoWEEdge* p_other) { return this == p_other; }
// FUNCTION: BETA10 0x100bd410
void SetEdges(LegoOrientedEdge** p_edges, LegoU8 p_numEdges) void SetEdges(LegoOrientedEdge** p_edges, LegoU8 p_numEdges)
{ {
m_edges = p_edges; m_edges = p_edges;