Implement/match Act1State::RemoveActors (#1132)

* Implement/match Act1State::RemoveActors

* Fix annotation
This commit is contained in:
Christian Semmler
2024-11-03 11:06:09 -07:00
committed by GitHub
parent 040c97d92a
commit d8412a4697
16 changed files with 163 additions and 99 deletions

View File

@@ -1,6 +1,7 @@
#include "bumpbouy.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legogamestate.h"
#include "legovideomanager.h"
@@ -44,7 +45,7 @@ MxLong BumpBouy::Notify(MxParam& p_param)
assert(isleState);
isleState->m_unk0x018 = 5;
Isle* isle = (Isle*) FindWorld(*g_isleScript, 0);
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
assert(isle);
isle->SetDestLocation(LegoGameState::e_jetrace);

View File

@@ -41,7 +41,7 @@ MxLong JukeBoxEntity::Notify(MxParam& p_param)
((IslePathActor*) UserActor())->Exit();
}
((Isle*) FindWorld(*g_isleScript, 0))->SetDestLocation(LegoGameState::e_jukeboxw);
((Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle))->SetDestLocation(LegoGameState::e_jukeboxw);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
return 1;
}

View File

@@ -4,6 +4,7 @@
#include "dunebuggy.h"
#include "dunecar_actions.h"
#include "helicopter.h"
#include "isle_actions.h"
#include "jetski.h"
#include "jetski_actions.h"
#include "jukebox_actions.h"
@@ -1014,7 +1015,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
// This function was changed between BETA10 and LEGO1.
// These lines looks like a relic from older code.
LegoWorld* destWorld = NULL;
destWorld = FindWorld(*g_isleScript, 0);
destWorld = FindWorld(*g_isleScript, IsleScript::c__Isle);
Act1State* gameState = (Act1State*) GameState()->GetState("Act1State");
@@ -1025,7 +1026,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
gameState->m_helicopter = (Helicopter*) entity;
gameState->m_unk0x108.SetName("");
gameState->m_helicopterPlane.SetName("");
break;
case LegoGameState::e_dunecarbuild:
if (gameState->m_dunebuggy) {
@@ -1033,7 +1034,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
gameState->m_dunebuggy = (DuneBuggy*) entity;
gameState->m_unk0x1bc.SetName("");
gameState->m_dunebuggyPlane.SetName("");
break;
case LegoGameState::e_jetskibuild:
if (gameState->m_jetski) {
@@ -1041,7 +1042,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
gameState->m_jetski = (Jetski*) entity;
gameState->m_unk0x164.SetName("");
gameState->m_jetskiPlane.SetName("");
break;
case LegoGameState::e_racecarbuild:
if (gameState->m_racecar) {
@@ -1049,7 +1050,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
gameState->m_racecar = (RaceCar*) entity;
gameState->m_unk0x210.SetName("");
gameState->m_racecarPlane.SetName("");
break;
}

View File

@@ -383,7 +383,7 @@ void LegoAnimationManager::Reset(MxBool p_und)
m_unk0x402 = FALSE;
if (p_und && m_animState != NULL) {
m_animState->SetFlag();
m_animState->Reset();
}
MxBool suspended = m_suspended;
@@ -2951,7 +2951,7 @@ MxResult AnimState::Serialize(LegoFile* p_file)
}
// FUNCTION: LEGO1 0x100654f0
MxBool AnimState::SetFlag()
MxBool AnimState::Reset()
{
if (m_unk0x10 != NULL) {
m_extraCharacterId = 0;

View File

@@ -302,7 +302,7 @@ MxResult LegoGameState::DeleteState()
m_stateArray = NULL;
for (MxS32 count = 0; count < stateCount; count++) {
if (!stateArray[count]->SetFlag() && stateArray[count]->IsSerializable()) {
if (!stateArray[count]->Reset() && stateArray[count]->IsSerializable()) {
delete stateArray[count];
}
else {
@@ -780,7 +780,7 @@ void LegoGameState::StopArea(Area p_area)
inline void LoadIsle()
{
LegoWorld* world = FindWorld(*g_isleScript, 0);
LegoWorld* world = FindWorld(*g_isleScript, IsleScript::c__Isle);
if (world != NULL) {
if (!world->GetUnknown0xd0Empty()) {
NotificationManager()->Send(world, MxNotificationParam(c_notificationType20, NULL));
@@ -957,7 +957,7 @@ void LegoGameState::SwitchArea(Area p_area)
InvokeAction(Extra::ActionType::e_opendisk, *g_racecarScript, RacecarScript::c__StartUp, NULL);
break;
case e_act2main: {
LegoWorld* act2main = FindWorld(*g_act2mainScript, 0);
LegoWorld* act2main = FindWorld(*g_act2mainScript, Act2mainScript::c__Act2Main);
if (act2main == NULL) {
InvokeAction(Extra::ActionType::e_opendisk, *g_act2mainScript, Act2mainScript::c__Act2Main, NULL);
@@ -969,7 +969,7 @@ void LegoGameState::SwitchArea(Area p_area)
break;
}
case e_act3script: {
LegoWorld* act3 = FindWorld(*g_act3Script, 0);
LegoWorld* act3 = FindWorld(*g_act3Script, Act3Script::c__Act3);
if (act3 == NULL) {
InvokeAction(Extra::ActionType::e_opendisk, *g_act3Script, Act3Script::c__Act3, NULL);
@@ -1105,7 +1105,7 @@ void LegoGameState::Init()
SetCurrentAct(e_act1);
if (m_loadedAct == e_act1) {
Isle* isle = (Isle*) FindWorld(*g_isleScript, 0);
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
Helicopter* copter = (Helicopter*) isle->Find(*g_copterScript, CopterScript::c_Helicopter_Actor);
if (copter) {
@@ -1215,13 +1215,13 @@ void LegoGameState::SetCurrentAct(Act p_currentAct)
// FUNCTION: LEGO1 0x1003ceb0
void LegoGameState::FindLoadedAct()
{
if (FindWorld(*g_isleScript, 0)) {
if (FindWorld(*g_isleScript, IsleScript::c__Isle)) {
m_loadedAct = e_act1;
}
else if (FindWorld(*g_act2mainScript, 0)) {
else if (FindWorld(*g_act2mainScript, Act2mainScript::c__Act2Main)) {
m_loadedAct = e_act2;
}
else if (FindWorld(*g_act3Script, 0)) {
else if (FindWorld(*g_act3Script, Act3Script::c__Act3)) {
m_loadedAct = e_act3;
}
else {

View File

@@ -3,6 +3,7 @@
#include "3dmanager/lego3dmanager.h"
#include "anim/legoanim.h"
#include "isle.h"
#include "isle_actions.h"
#include "islepathactor.h"
#include "legoanimationmanager.h"
#include "legoanimpresenter.h"
@@ -333,7 +334,7 @@ void NotifyEntity(const char* p_filename, MxS32 p_entityId, LegoEntity* p_sender
// FUNCTION: LEGO1 0x1003eab0
void SetCameraControllerFromIsle()
{
InputManager()->SetCamera(FindWorld(*g_isleScript, 0)->GetCamera());
InputManager()->SetCamera(FindWorld(*g_isleScript, IsleScript::c__Isle)->GetCamera());
}
// FUNCTION: LEGO1 0x1003eae0

View File

@@ -718,3 +718,9 @@ void LegoPathActor::VTable0xa8()
FUN_10010c30();
}
}
// STUB: LEGO1 0x1002f770
void LegoPathActor::UpdatePlane(LegoNamedPlane& p_namedPlane)
{
// TODO
}

View File

@@ -1404,7 +1404,7 @@ void Infocenter::Reset()
HelicopterState* state = (HelicopterState*) GameState()->GetState("HelicopterState");
if (state) {
state->SetFlag();
state->Reset();
}
}

View File

@@ -39,7 +39,7 @@
#include "towtrack.h"
DECOMP_SIZE_ASSERT(Act1State, 0x26c)
DECOMP_SIZE_ASSERT(Act1State::NamedPlane, 0x4c)
DECOMP_SIZE_ASSERT(LegoNamedPlane, 0x4c)
DECOMP_SIZE_ASSERT(Isle, 0x140)
// GLOBAL: LEGO1 0x100f1198
@@ -851,7 +851,7 @@ void Isle::Enable(MxBool p_enable)
InputManager()->ClearWorld();
}
m_act1state->FUN_10034b60();
m_act1state->RemoveActors();
}
}
@@ -1306,24 +1306,25 @@ Act1State::Act1State()
m_unk0x260 = NULL;
m_unk0x264 = NULL;
m_racecar = NULL;
SetFlag();
Reset();
}
// FUNCTION: LEGO1 0x10033ac0
// FUNCTION: BETA10 0x1003524f
MxResult Act1State::Serialize(LegoFile* p_file)
{
LegoState::Serialize(p_file);
m_unk0x024.Serialize(p_file);
m_unk0x070.Serialize(p_file);
m_unk0x0bc.Serialize(p_file);
m_unk0x108.Serialize(p_file);
m_unk0x164.Serialize(p_file);
m_unk0x1bc.Serialize(p_file);
m_unk0x210.Serialize(p_file);
m_motocyclePlane.Serialize(p_file);
m_bikePlane.Serialize(p_file);
m_skateboardPlane.Serialize(p_file);
m_helicopterPlane.Serialize(p_file);
m_jetskiPlane.Serialize(p_file);
m_dunebuggyPlane.Serialize(p_file);
m_racecarPlane.Serialize(p_file);
if (p_file->IsWriteMode()) {
if (m_unk0x108.GetName()->Compare("") != 0) {
if (m_helicopterPlane.GetName()->Compare("") != 0) {
if (m_unk0x154) {
WriteNamedTexture(p_file, m_unk0x154);
}
@@ -1343,7 +1344,7 @@ MxResult Act1State::Serialize(LegoFile* p_file)
FUN_1003f540(p_file, "chjetr.gif");
}
}
if (m_unk0x164.GetName()->Compare("") != 0) {
if (m_jetskiPlane.GetName()->Compare("") != 0) {
if (m_unk0x1b0) {
WriteNamedTexture(p_file, m_unk0x1b0);
}
@@ -1357,7 +1358,7 @@ MxResult Act1State::Serialize(LegoFile* p_file)
FUN_1003f540(p_file, "jswnsh.gif");
}
}
if (m_unk0x1bc.GetName()->Compare("") != 0) {
if (m_dunebuggyPlane.GetName()->Compare("") != 0) {
if (m_unk0x208) {
WriteNamedTexture(p_file, m_unk0x208);
}
@@ -1365,7 +1366,7 @@ MxResult Act1State::Serialize(LegoFile* p_file)
FUN_1003f540(p_file, "dbfrfn.gif");
}
}
if (m_unk0x210.GetName()->Compare("") != 0) {
if (m_racecarPlane.GetName()->Compare("") != 0) {
if (m_unk0x25c) {
WriteNamedTexture(p_file, m_unk0x25c);
}
@@ -1390,7 +1391,7 @@ MxResult Act1State::Serialize(LegoFile* p_file)
Write(p_file, m_unk0x022);
}
else if (p_file->IsReadMode()) {
if (m_unk0x108.GetName()->Compare("") != 0) {
if (m_helicopterPlane.GetName()->Compare("") != 0) {
m_unk0x154 = ReadNamedTexture(p_file);
if (m_unk0x154 == NULL) {
return FAILURE;
@@ -1406,7 +1407,7 @@ MxResult Act1State::Serialize(LegoFile* p_file)
return FAILURE;
}
}
if (m_unk0x164.GetName()->Compare("") != 0) {
if (m_jetskiPlane.GetName()->Compare("") != 0) {
m_unk0x1b0 = ReadNamedTexture(p_file);
if (m_unk0x1b0 == NULL) {
return FAILURE;
@@ -1417,13 +1418,13 @@ MxResult Act1State::Serialize(LegoFile* p_file)
return FAILURE;
}
}
if (m_unk0x1bc.GetName()->Compare("") != 0) {
if (m_dunebuggyPlane.GetName()->Compare("") != 0) {
m_unk0x208 = ReadNamedTexture(p_file);
if (m_unk0x208 == NULL) {
return FAILURE;
}
}
if (m_unk0x210.GetName()->Compare("") != 0) {
if (m_racecarPlane.GetName()->Compare("") != 0) {
m_unk0x25c = ReadNamedTexture(p_file);
if (m_unk0x25c == NULL) {
return FAILURE;
@@ -1470,13 +1471,13 @@ void Act1State::StopCptClickDialogue()
}
// FUNCTION: LEGO1 0x100346d0
MxBool Act1State::SetFlag()
MxBool Act1State::Reset()
{
m_unk0x024.SetName("");
m_unk0x070.SetName("");
m_unk0x0bc.SetName("");
m_motocyclePlane.SetName("");
m_bikePlane.SetName("");
m_skateboardPlane.SetName("");
m_unk0x022 = FALSE;
m_unk0x108.SetName("");
m_helicopterPlane.SetName("");
if (m_unk0x154) {
delete m_unk0x154;
@@ -1498,7 +1499,7 @@ MxBool Act1State::SetFlag()
m_helicopter = NULL;
}
m_unk0x164.SetName("");
m_jetskiPlane.SetName("");
if (m_unk0x1b0) {
delete m_unk0x1b0;
@@ -1515,7 +1516,7 @@ MxBool Act1State::SetFlag()
m_jetski = NULL;
}
m_unk0x1bc.SetName("");
m_dunebuggyPlane.SetName("");
if (m_unk0x208) {
delete m_unk0x208;
@@ -1527,7 +1528,7 @@ MxBool Act1State::SetFlag()
m_dunebuggy = NULL;
}
m_unk0x210.SetName("");
m_racecarPlane.SetName("");
if (m_unk0x25c) {
delete m_unk0x25c;
@@ -1552,10 +1553,50 @@ MxBool Act1State::SetFlag()
return TRUE;
}
// STUB: LEGO1 0x10034b60
void Act1State::FUN_10034b60()
// FUNCTION: LEGO1 0x10034b60
void Act1State::RemoveActors()
{
// TODO
Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
isle->m_motocycle->UpdatePlane(m_motocyclePlane);
isle->m_bike->UpdatePlane(m_bikePlane);
isle->m_skateboard->UpdatePlane(m_skateboardPlane);
if (isle->m_helicopter != NULL) {
isle->m_helicopter->UpdatePlane(m_helicopterPlane);
m_helicopter = isle->m_helicopter;
isle->RemoveActor(m_helicopter);
isle->VTable0x6c(m_helicopter);
m_helicopter->SetBoundary(NULL);
m_helicopter->SetController(NULL);
}
if (isle->m_jetski != NULL) {
isle->m_jetski->UpdatePlane(m_jetskiPlane);
m_jetski = isle->m_jetski;
isle->RemoveActor(m_jetski);
isle->VTable0x6c(m_jetski);
m_jetski->SetBoundary(NULL);
m_jetski->SetController(NULL);
}
if (isle->m_dunebuggy != NULL) {
isle->m_dunebuggy->UpdatePlane(m_dunebuggyPlane);
m_dunebuggy = isle->m_dunebuggy;
isle->RemoveActor(m_dunebuggy);
isle->VTable0x6c(m_dunebuggy);
m_dunebuggy->SetBoundary(NULL);
m_dunebuggy->SetController(NULL);
}
if (isle->m_racecar != NULL) {
isle->m_racecar->UpdatePlane(m_racecarPlane);
m_racecar = isle->m_racecar;
isle->RemoveActor(m_racecar);
isle->VTable0x6c(m_racecar);
m_racecar->SetBoundary(NULL);
m_racecar->SetController(NULL);
}
}
// STUB: LEGO1 0x10034d00