Clear unknowns in LegoVehicleBuildState (#1684)

This commit is contained in:
Fabian Neundorf
2025-09-08 18:19:49 +02:00
committed by GitHub
parent ef2d438a7d
commit 4460d2a33d
3 changed files with 46 additions and 43 deletions

View File

@@ -20,11 +20,11 @@ class MxActionNotificationParam;
class LegoVehicleBuildState : public LegoState { class LegoVehicleBuildState : public LegoState {
public: public:
enum AnimationState { enum AnimationState {
e_unknown0 = 0, e_none = 0,
e_entering = 1, e_entering = 1,
e_unknown2 = 2, e_settingUpMovie = 2,
e_cutscene = 3, e_cutscene = 3,
e_unknown4 = 4, e_finishedBuild = 4,
e_exiting = 6 e_exiting = 6
}; };
@@ -57,9 +57,9 @@ public:
MxString m_className; // 0x38 MxString m_className; // 0x38
AnimationState m_animationState; // 0x48 AnimationState m_animationState; // 0x48
MxU8 m_unk0x4c; // 0x4c MxU8 m_introductionCounter; // 0x4c
MxBool m_unk0x4d; // 0x4d MxBool m_finishedBuild; // 0x4d
MxBool m_unk0x4e; // 0x4e MxBool m_playedExitScript; // 0x4e
MxU8 m_placedPartCount; // 0x4f MxU8 m_placedPartCount; // 0x4f
}; };

View File

@@ -583,11 +583,11 @@ void IslePathActor::SpawnPlayer(LegoGameState::Area p_area, MxBool p_enter, MxU8
break; break;
} }
if (state != NULL && state->m_unk0x4d && !state->m_unk0x4e) { if (state != NULL && state->m_finishedBuild && !state->m_playedExitScript) {
if (AnimationManager() if (AnimationManager()
->FUN_10060dc0(anim, NULL, TRUE, LegoAnimationManager::e_unk0, NULL, FALSE, TRUE, TRUE, TRUE) == ->FUN_10060dc0(anim, NULL, TRUE, LegoAnimationManager::e_unk0, NULL, FALSE, TRUE, TRUE, TRUE) ==
SUCCESS) { SUCCESS) {
state->m_unk0x4e = TRUE; state->m_playedExitScript = TRUE;
camAnim = FALSE; camAnim = FALSE;
} }
} }

View File

@@ -202,7 +202,7 @@ MxResult LegoCarBuild::Create(MxDSAction& p_dsAction)
} }
m_buildState = buildState; m_buildState = buildState;
m_unk0x174 = m_buildState->m_unk0x4d; m_unk0x174 = m_buildState->m_finishedBuild;
GameState()->StopArea(LegoGameState::e_previousArea); GameState()->StopArea(LegoGameState::e_previousArea);
@@ -512,10 +512,10 @@ void LegoCarBuild::AddSelectedPartToBuild()
FUN_100243a0(); FUN_100243a0();
} }
else { else {
m_buildState->m_unk0x4d = TRUE; m_buildState->m_finishedBuild = TRUE;
InvokeAction(Extra::e_start, m_atomId, m_carId, NULL); InvokeAction(Extra::e_start, m_atomId, m_carId, NULL);
NotificationManager()->Send(this, MxNotificationParam()); NotificationManager()->Send(this, MxNotificationParam());
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown4; m_buildState->m_animationState = LegoVehicleBuildState::e_finishedBuild;
m_buildState->m_placedPartCount = 0; m_buildState->m_placedPartCount = 0;
} }
} }
@@ -671,7 +671,8 @@ MxLong LegoCarBuild::Notify(MxParam& p_param)
((LegoEventNotificationParam&) p_param).GetY() ((LegoEventNotificationParam&) p_param).GetY()
); );
if (result || m_unk0x10a || m_buildState->m_animationState == 4 || m_buildState->m_animationState == 6) { if (result || m_unk0x10a || m_buildState->m_animationState == LegoVehicleBuildState::e_finishedBuild ||
m_buildState->m_animationState == LegoVehicleBuildState::e_exiting) {
m_unk0x109 = 0; m_unk0x109 = 0;
break; break;
} }
@@ -684,9 +685,10 @@ MxLong LegoCarBuild::Notify(MxParam& p_param)
break; break;
case c_notificationButtonDown: case c_notificationButtonDown:
assert(m_buildState); assert(m_buildState);
if (((m_buildState->m_animationState != 4) && (m_buildState->m_animationState != 6)) && if (((m_buildState->m_animationState != LegoVehicleBuildState::e_finishedBuild) &&
(m_buildState->m_animationState != 2)) { (m_buildState->m_animationState != LegoVehicleBuildState::e_exiting)) &&
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown0; (m_buildState->m_animationState != LegoVehicleBuildState::e_settingUpMovie)) {
m_buildState->m_animationState = LegoVehicleBuildState::e_none;
result = SelectPartFromMousePosition( result = SelectPartFromMousePosition(
((LegoEventNotificationParam&) p_param).GetX(), ((LegoEventNotificationParam&) p_param).GetX(),
((LegoEventNotificationParam&) p_param).GetY() ((LegoEventNotificationParam&) p_param).GetY()
@@ -735,7 +737,8 @@ MxLong LegoCarBuild::Notify(MxParam& p_param)
// FUNCTION: BETA10 0x1006cc48 // FUNCTION: BETA10 0x1006cc48
undefined4 LegoCarBuild::FUN_10024250(LegoEventNotificationParam* p_param) undefined4 LegoCarBuild::FUN_10024250(LegoEventNotificationParam* p_param)
{ {
if (p_param->GetKey() == ' ' && m_buildState->m_animationState != 4 && m_buildState->m_animationState != 2) { if (p_param->GetKey() == ' ' && m_buildState->m_animationState != LegoVehicleBuildState::e_finishedBuild &&
m_buildState->m_animationState != LegoVehicleBuildState::e_settingUpMovie) {
if (m_numAnimsRun > 0) { if (m_numAnimsRun > 0) {
DeleteObjects(&m_atomId, 500, 0x1fe); DeleteObjects(&m_atomId, 500, 0x1fe);
BackgroundAudioManager()->RaiseVolume(); BackgroundAudioManager()->RaiseVolume();
@@ -756,7 +759,7 @@ void LegoCarBuild::ReadyWorld()
if (BackgroundAudioManager()->GetEnabled()) { if (BackgroundAudioManager()->GetEnabled()) {
InvokeAction(Extra::ActionType::e_start, *g_jukeboxScript, FUN_10025ee0(m_carId), NULL); InvokeAction(Extra::ActionType::e_start, *g_jukeboxScript, FUN_10025ee0(m_carId), NULL);
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown2; m_buildState->m_animationState = LegoVehicleBuildState::e_settingUpMovie;
NotificationManager()->Send(this, MxNotificationParam()); NotificationManager()->Send(this, MxNotificationParam());
} }
else { else {
@@ -799,12 +802,12 @@ undefined4 LegoCarBuild::FUN_10024480(MxActionNotificationParam* p_param)
MxS32 result = 0; MxS32 result = 0;
switch (m_buildState->m_animationState) { switch (m_buildState->m_animationState) {
case 3: case LegoVehicleBuildState::e_cutscene:
BackgroundAudioManager()->RaiseVolume(); BackgroundAudioManager()->RaiseVolume();
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown0; m_buildState->m_animationState = LegoVehicleBuildState::e_none;
result = 1; result = 1;
break; break;
case 6: case LegoVehicleBuildState::e_exiting:
if (p_param->GetAction()->GetObjectId() == m_unk0x344) { if (p_param->GetAction()->GetObjectId() == m_unk0x344) {
FUN_100243a0(); FUN_100243a0();
result = 1; result = 1;
@@ -957,8 +960,8 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
switch (param->m_clickedObjectId) { switch (param->m_clickedObjectId) {
// The enum values are all identical between CopterScript, DunecarScript, JetskiScript, and RacecarScript // The enum values are all identical between CopterScript, DunecarScript, JetskiScript, and RacecarScript
case CopterScript::c_Info_Ctl: case CopterScript::c_Info_Ctl:
if (m_buildState->m_animationState != LegoVehicleBuildState::e_unknown4 && if (m_buildState->m_animationState != LegoVehicleBuildState::e_finishedBuild &&
m_buildState->m_animationState != LegoVehicleBuildState::e_unknown2 && m_buildState->m_animationState != LegoVehicleBuildState::e_settingUpMovie &&
m_buildState->m_animationState != LegoVehicleBuildState::e_exiting && m_buildState->m_animationState != LegoVehicleBuildState::e_exiting &&
GameState()->GetCurrentAct() != LegoGameState::e_act2) { GameState()->GetCurrentAct() != LegoGameState::e_act2) {
if (m_numAnimsRun > 0) { if (m_numAnimsRun > 0) {
@@ -974,7 +977,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
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_buildState->m_animationState != LegoVehicleBuildState::e_unknown4) { m_buildState->m_animationState != LegoVehicleBuildState::e_finishedBuild) {
if (m_numAnimsRun > 0) { if (m_numAnimsRun > 0) {
DeleteObjects(&m_atomId, 500, 510); DeleteObjects(&m_atomId, 500, 510);
} }
@@ -984,13 +987,13 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
if (GameState()->GetCurrentAct() == LegoGameState::e_act2) { if (GameState()->GetCurrentAct() == LegoGameState::e_act2) {
FUN_100243a0(); FUN_100243a0();
} }
else if (m_animPresenter->AllPartsPlaced() || m_buildState->m_unk0x4d) { else if (m_animPresenter->AllPartsPlaced() || m_buildState->m_finishedBuild) {
m_buildState->m_unk0x4d = TRUE; m_buildState->m_finishedBuild = TRUE;
InvokeAction(Extra::e_start, m_atomId, m_carId, NULL); InvokeAction(Extra::e_start, m_atomId, m_carId, NULL);
NotificationManager()->Send(this, MxNotificationParam()); NotificationManager()->Send(this, MxNotificationParam());
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown4; m_buildState->m_animationState = LegoVehicleBuildState::e_finishedBuild;
} }
else { else {
FUN_10025720(4); FUN_10025720(4);
@@ -1063,8 +1066,8 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
if (m_buildState->m_animationState != LegoVehicleBuildState::e_exiting) { if (m_buildState->m_animationState != LegoVehicleBuildState::e_exiting) {
m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
if (m_animPresenter->AllPartsPlaced() || m_buildState->m_unk0x4d) { if (m_animPresenter->AllPartsPlaced() || m_buildState->m_finishedBuild) {
m_buildState->m_unk0x4d = TRUE; m_buildState->m_finishedBuild = TRUE;
// GameState()->GetCurrentAct() returns an MxS16 in BETA10 // GameState()->GetCurrentAct() returns an MxS16 in BETA10
if (GameState()->GetCurrentAct() == 0) { if (GameState()->GetCurrentAct() == 0) {
@@ -1073,7 +1076,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
NotificationManager()->Send(this, MxNotificationParam()); NotificationManager()->Send(this, MxNotificationParam());
assert(m_buildState); assert(m_buildState);
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown4; m_buildState->m_animationState = LegoVehicleBuildState::e_finishedBuild;
} }
else { else {
@@ -1153,7 +1156,7 @@ undefined4 LegoCarBuild::FUN_10024c20(MxNotificationParam* p_param)
assert(m_buildState); assert(m_buildState);
switch (m_buildState->m_animationState) { switch (m_buildState->m_animationState) {
case 4: case LegoVehicleBuildState::e_finishedBuild:
entity = (LegoEntity*) Find(m_atomId, m_carId); entity = (LegoEntity*) Find(m_atomId, m_carId);
if (entity && entity->GetROI()) { if (entity && entity->GetROI()) {
@@ -1213,7 +1216,7 @@ undefined4 LegoCarBuild::FUN_10024c20(MxNotificationParam* p_param)
NotificationManager()->Send(this, MxNotificationParam()); NotificationManager()->Send(this, MxNotificationParam());
} }
break; break;
case 2: case LegoVehicleBuildState::e_settingUpMovie:
MxU32 jukeboxScript; MxU32 jukeboxScript;
switch (m_carId) { switch (m_carId) {
@@ -1252,7 +1255,7 @@ void LegoCarBuild::FUN_10024ef0()
ResetViewVelocity(); ResetViewVelocity();
m_buildState->m_animationState = LegoVehicleBuildState::e_cutscene; m_buildState->m_animationState = LegoVehicleBuildState::e_cutscene;
FUN_10025720(FUN_10025d70()); FUN_10025720(FUN_10025d70());
m_buildState->m_unk0x4c += 1; m_buildState->m_introductionCounter += 1;
Disable(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen); Disable(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
} }
@@ -1623,7 +1626,7 @@ void LegoCarBuild::FUN_10025d10(MxS32 p_param)
// FUNCTION: LEGO1 0x10025d70 // FUNCTION: LEGO1 0x10025d70
MxS32 LegoCarBuild::FUN_10025d70() MxS32 LegoCarBuild::FUN_10025d70()
{ {
switch (m_buildState->m_unk0x4c % 3) { switch (m_buildState->m_introductionCounter % 3) {
case 1: case 1:
return 1; return 1;
case 2: case 2:
@@ -1676,7 +1679,7 @@ MxBool LegoCarBuild::Escape()
InvokeAction(Extra::ActionType::e_stop, *g_jukeboxScript, targetEntityId, NULL); InvokeAction(Extra::ActionType::e_stop, *g_jukeboxScript, targetEntityId, NULL);
DeleteObjects(&m_atomId, 500, 999); DeleteObjects(&m_atomId, 500, 999);
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown0; m_buildState->m_animationState = LegoVehicleBuildState::e_none;
m_destLocation = LegoGameState::e_infomain; m_destLocation = LegoGameState::e_infomain;
return TRUE; return TRUE;
} }
@@ -1703,9 +1706,9 @@ MxS32 LegoCarBuild::FUN_10025ee0(undefined4 p_param1)
LegoVehicleBuildState::LegoVehicleBuildState(const char* p_classType) LegoVehicleBuildState::LegoVehicleBuildState(const char* p_classType)
{ {
m_className = p_classType; m_className = p_classType;
m_unk0x4c = 0; m_introductionCounter = 0;
m_unk0x4d = FALSE; m_finishedBuild = FALSE;
m_unk0x4e = FALSE; m_playedExitScript = FALSE;
m_placedPartCount = 0; m_placedPartCount = 0;
} }
@@ -1716,17 +1719,17 @@ MxResult LegoVehicleBuildState::Serialize(LegoStorage* p_storage)
LegoState::Serialize(p_storage); LegoState::Serialize(p_storage);
if (p_storage->IsReadMode()) { if (p_storage->IsReadMode()) {
p_storage->ReadU8(m_unk0x4c); p_storage->ReadU8(m_introductionCounter);
p_storage->ReadU8(m_unk0x4d); p_storage->ReadU8(m_finishedBuild);
p_storage->ReadU8(m_unk0x4e); p_storage->ReadU8(m_playedExitScript);
#ifndef BETA10 #ifndef BETA10
p_storage->ReadU8(m_placedPartCount); p_storage->ReadU8(m_placedPartCount);
#endif #endif
} }
else { else {
p_storage->WriteU8(m_unk0x4c); p_storage->WriteU8(m_introductionCounter);
p_storage->WriteU8(m_unk0x4d); p_storage->WriteU8(m_finishedBuild);
p_storage->WriteU8(m_unk0x4e); p_storage->WriteU8(m_playedExitScript);
#ifndef BETA10 #ifndef BETA10
p_storage->WriteU8(m_placedPartCount); p_storage->WriteU8(m_placedPartCount);
#endif #endif