Implement/match LegoAct2::HandlePathStruct (#1187)

* Implement/match `LegoAct2::HandlePathStruct`

* Add Act2Brick::FUN_1007a670

* Add Act2Brick::Create

* Name variable

* Add stdio.h
This commit is contained in:
Christian Semmler 2024-12-03 13:31:24 -07:00 committed by GitHub
parent 3c624ff14c
commit 5693b1a266
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 149 additions and 9 deletions

View file

@ -29,6 +29,7 @@ class Act2Actor : public LegoAnimActor {
void FUN_10018980(); void FUN_10018980();
void FUN_10019520(); void FUN_10019520();
void FUN_10019560();
void FUN_100192a0(undefined4 p_param); void FUN_100192a0(undefined4 p_param);
// SYNTHETIC: LEGO1 0x1001a0a0 // SYNTHETIC: LEGO1 0x1001a0a0

View file

@ -31,12 +31,15 @@ class Act2Brick : public LegoPathActor {
// SYNTHETIC: LEGO1 0x1007a450 // SYNTHETIC: LEGO1 0x1007a450
// Act2Brick::`scalar deleting destructor' // Act2Brick::`scalar deleting destructor'
MxResult Create(MxS32 p_index);
void Remove(); void Remove();
void FUN_1007a670(MxMatrix& p_param1, MxMatrix& p_param2, LegoPathBoundary* p_boundary);
void PlayWhistleSound(); void PlayWhistleSound();
void StopWhistleSound(); void StopWhistleSound();
void Mute(MxBool p_muted); void Mute(MxBool p_muted);
private: private:
static LegoChar* g_lodNames[];
static MxLong g_lastHitActorTime; static MxLong g_lastHitActorTime;
LegoCacheSound* m_whistleSound; // 0x154 LegoCacheSound* m_whistleSound; // 0x154

View file

@ -81,6 +81,8 @@ class LegoAct2 : public LegoWorld {
void InitBricks(); void InitBricks();
void UninitBricks(); void UninitBricks();
void FUN_10051ac0(); void FUN_10051ac0();
void FUN_10051fa0(MxS32 p_param1);
void FUN_100521f0(MxS32 p_param1);
MxResult FUN_10052560( MxResult FUN_10052560(
Act2mainScript::Script p_objectId, Act2mainScript::Script p_objectId,
MxBool p_param2, MxBool p_param2,
@ -92,7 +94,7 @@ class LegoAct2 : public LegoWorld {
MxResult FUN_10052800(); MxResult FUN_10052800();
Act2Brick m_bricks[10]; // 0x00f8 Act2Brick m_bricks[10]; // 0x00f8
undefined m_unk0x10c0; // 0x10c0 undefined m_nextBrick; // 0x10c0
undefined m_unk0x10c1; // 0x10c1 undefined m_unk0x10c1; // 0x10c1
MxBool m_ready; // 0x10c2 MxBool m_ready; // 0x10c2
undefined4 m_unk0x10c4; // 0x10c4 undefined4 m_unk0x10c4; // 0x10c4

View file

@ -177,6 +177,14 @@ void Act2Actor::FUN_10019520()
FUN_100192a0(10); FUN_100192a0(10);
} }
// FUNCTION: LEGO1 0x10019560
void Act2Actor::FUN_10019560()
{
m_unk0x1e = 5;
SetWorldSpeed(m_unk0x28 + 5);
FUN_100192a0(9);
}
// FUNCTION: LEGO1 0x100195a0 // FUNCTION: LEGO1 0x100195a0
// FUNCTION: BETA10 0x1000d7d3 // FUNCTION: BETA10 0x1000d7d3
MxS32 Act2Actor::VTable0xa0() MxS32 Act2Actor::VTable0xa0()

View file

@ -12,10 +12,15 @@
#include "mxtimer.h" #include "mxtimer.h"
#include "roi/legoroi.h" #include "roi/legoroi.h"
#include <stdio.h>
#include <vec.h> #include <vec.h>
DECOMP_SIZE_ASSERT(Act2Brick, 0x194) DECOMP_SIZE_ASSERT(Act2Brick, 0x194)
// GLOBAL: LEGO1 0x100f7a38
LegoChar* Act2Brick::g_lodNames[] =
{"xchbase1", "xchblad1", "xchseat1", "xchtail1", "xhback1", "xhljet1", "xhmidl1", "xhmotr1", "xhsidl1", "xhsidr1"};
// GLOBAL: LEGO1 0x100f7a60 // GLOBAL: LEGO1 0x100f7a60
MxLong Act2Brick::g_lastHitActorTime = 0; MxLong Act2Brick::g_lastHitActorTime = 0;
@ -33,6 +38,36 @@ Act2Brick::~Act2Brick()
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
} }
// FUNCTION: LEGO1 0x1007a4e0
// FUNCTION: BETA10 0x10012ad5
MxResult Act2Brick::Create(MxS32 p_index)
{
if (m_roi != NULL) {
return FAILURE;
}
char name[12];
sprintf(name, "chbrick%d", p_index);
m_roi = CharacterManager()->CreateAutoROI(name, g_lodNames[p_index], FALSE);
BoundingSphere sphere = m_roi->GetBoundingSphere();
sphere.Center()[1] -= 0.3;
if (p_index < 6) {
sphere.Radius() = m_roi->GetBoundingSphere().Radius() * 0.5f;
}
else {
sphere.Radius() = m_roi->GetBoundingSphere().Radius() * 2.0f;
}
m_roi->SetBoundingSphere(sphere);
m_roi->SetEntity(this);
CurrentWorld()->Add(this);
m_unk0x164 = 1;
return SUCCESS;
}
// FUNCTION: LEGO1 0x1007a620 // FUNCTION: LEGO1 0x1007a620
// FUNCTION: BETA10 0x10012ba2 // FUNCTION: BETA10 0x10012ba2
void Act2Brick::Remove() void Act2Brick::Remove()
@ -48,6 +83,28 @@ void Act2Brick::Remove()
m_unk0x164 = 0; m_unk0x164 = 0;
} }
// FUNCTION: LEGO1 0x1007a670
// FUNCTION: BETA10 0x10012c04
void Act2Brick::FUN_1007a670(MxMatrix& p_param1, MxMatrix& p_param2, LegoPathBoundary* p_boundary)
{
m_unk0x17c = p_param2[3];
m_unk0x168 = p_param2[3];
((Vector3&) m_unk0x168).Sub(p_param1[3]);
((Vector3&) m_unk0x168).Div(8.0f);
m_unk0x190 = 0;
TickleManager()->RegisterClient(this, 20);
m_unk0x164 = 2;
CurrentWorld()->PlaceActor(this);
p_boundary->AddActor(this);
SetState(LegoPathActor::c_bit3);
m_roi->FUN_100a58f0(p_param1);
m_roi->VTable0x14();
m_roi->SetVisibility(TRUE);
}
// FUNCTION: LEGO1 0x1007a750 // FUNCTION: LEGO1 0x1007a750
MxResult Act2Brick::VTable0x94(LegoPathActor* p_actor, MxBool) MxResult Act2Brick::VTable0x94(LegoPathActor* p_actor, MxBool)
{ {

View file

@ -80,7 +80,7 @@ LegoAct2::LegoAct2()
m_ambulance = NULL; m_ambulance = NULL;
m_ready = FALSE; m_ready = FALSE;
m_unk0x1130 = 0; m_unk0x1130 = 0;
m_unk0x10c0 = 0; m_nextBrick = 0;
m_unk0x10c1 = 0; m_unk0x10c1 = 0;
m_unk0x1138 = NULL; m_unk0x1138 = NULL;
m_unk0x1140 = (Act2mainScript::Script) 0; m_unk0x1140 = (Act2mainScript::Script) 0;
@ -246,7 +246,7 @@ MxResult LegoAct2::Tickle()
m_unk0x10d0 += 50; m_unk0x10d0 += 50;
if (m_unk0x10d0 >= 200) { if (m_unk0x10d0 >= 200) {
if (m_unk0x10c0 < 5) { if (m_nextBrick < 5) {
m_unk0x10c4 = 7; m_unk0x10c4 = 7;
} }
else { else {
@ -412,7 +412,7 @@ MxLong LegoAct2::HandleEndAction(MxEndActionNotificationParam& p_param)
break; break;
} }
case 11: case 11:
m_bricks[m_unk0x10c0 - 1].Mute(TRUE); m_bricks[m_nextBrick - 1].Mute(TRUE);
m_unk0x10c4 = 12; m_unk0x10c4 = 12;
m_unk0x10d0 = 0; m_unk0x10d0 = 0;
@ -446,7 +446,7 @@ MxLong LegoAct2::HandleEndAction(MxEndActionNotificationParam& p_param)
roi->SetVisibility(FALSE); roi->SetVisibility(FALSE);
} }
m_bricks[m_unk0x10c0 - 1].Mute(FALSE); m_bricks[m_nextBrick - 1].Mute(FALSE);
m_unk0x10c4 = 13; m_unk0x10c4 = 13;
FUN_10051ac0(); FUN_10051ac0();
PlayMusic(JukeboxScript::c_BrickHunt); PlayMusic(JukeboxScript::c_BrickHunt);
@ -552,7 +552,7 @@ void LegoAct2::Enable(MxBool p_enable)
PlayMusic(m_music); PlayMusic(m_music);
} }
if (m_unk0x10c4 == 10 && m_unk0x10c0 == 6 && m_bricks[5].GetROI() != NULL) { if (m_unk0x10c4 == 10 && m_nextBrick == 6 && m_bricks[5].GetROI() != NULL) {
m_bricks[5].PlayWhistleSound(); m_bricks[5].PlayWhistleSound();
} }
else if (m_unk0x10c4 == 13) { else if (m_unk0x10c4 == 13) {
@ -596,11 +596,66 @@ void LegoAct2::Enable(MxBool p_enable)
} }
} }
// STUB: LEGO1 0x10051460 // FUNCTION: LEGO1 0x10051460
// STUB: BETA10 0x1003bb72 // FUNCTION: BETA10 0x1003bb72
MxLong LegoAct2::HandlePathStruct(LegoPathStructNotificationParam& p_param) MxLong LegoAct2::HandlePathStruct(LegoPathStructNotificationParam& p_param)
{ {
// TODO if (m_unk0x10c4 == 5 && p_param.GetData() == 0x32) {
LegoPathActor* actor = (LegoPathActor*) m_pepper->GetEntity();
actor->SetState(LegoPathActor::c_bit3);
actor->SetWorldSpeed(0.0f);
FUN_10051900();
if (m_unk0x10d0 < 90000) {
FUN_10052560(Act2mainScript::c_tra031ni_RunAnim, TRUE, TRUE, NULL, NULL, NULL);
}
else {
FUN_10052560(Act2mainScript::c_tra032ni_RunAnim, TRUE, TRUE, NULL, NULL, NULL);
}
m_unk0x112c = 50;
m_unk0x10c4 = 6;
m_unk0x10d0 = 0;
}
else if (m_unk0x10c4 == 5 && p_param.GetData() == 0x2a) {
if (m_unk0x1144 == (Act2mainScript::Script) 0) {
FUN_10052560(Act2mainScript::c_Avo907In_PlayWav, FALSE, FALSE, NULL, NULL, NULL);
m_unk0x1144 = Act2mainScript::c_Avo907In_PlayWav;
}
}
else if (m_unk0x10c4 == 5) {
FUN_100521f0(p_param.GetData());
}
else if (m_unk0x10c4 == 7) {
FUN_10051fa0(p_param.GetData());
}
else if (m_unk0x10c4 == 10 && p_param.GetData() == 0x165) {
((LegoPathActor*) m_pepper->GetEntity())->SetState(LegoPathActor::c_bit3);
if (FUN_10052560(Act2mainScript::c_VOhide_PlayWav, FALSE, TRUE, NULL, NULL, NULL) == SUCCESS) {
m_unk0x1140 = Act2mainScript::c_VOhide_PlayWav;
}
m_unk0x1138->FUN_10019560();
m_unk0x10c4 = 11;
m_unk0x10d0 = 0;
if (m_nextBrick < 6) {
m_bricks[m_nextBrick].Create(m_nextBrick);
m_nextBrick++;
}
MxMatrix local2world = m_ambulance->GetLocal2World();
MxMatrix local2world2 = local2world;
LegoPathBoundary* boundary = m_unk0x1138->GetBoundary();
local2world[3][1] += 1.5;
local2world2[3][1] -= 0.1;
m_bricks[m_nextBrick - 1].FUN_1007a670(local2world, local2world2, boundary);
}
return 0; return 0;
} }
@ -707,6 +762,20 @@ void LegoAct2::FUN_10051ac0()
// TODO // TODO
} }
// STUB: LEGO1 0x10051fa0
// STUB: BETA10 0x10013fd3
void LegoAct2::FUN_10051fa0(MxS32 p_param1)
{
// TODO
}
// STUB: LEGO1 0x100521f0
// STUB: BETA10 0x100142f1
void LegoAct2::FUN_100521f0(MxS32 p_param1)
{
// TODO
}
// FUNCTION: LEGO1 0x10052560 // FUNCTION: LEGO1 0x10052560
// FUNCTION: BETA10 0x100145c6 // FUNCTION: BETA10 0x100145c6
MxResult LegoAct2::FUN_10052560( MxResult LegoAct2::FUN_10052560(