implement RemoveFromWorld

This commit is contained in:
Misha 2024-01-30 19:43:05 -05:00
parent cdf76754f7
commit cc468ec3a1
No known key found for this signature in database
GPG Key ID: 8441D12AEF33FED8
9 changed files with 196 additions and 11 deletions

View File

@ -32,7 +32,7 @@ class LegoGameState {
LegoState* CreateState(const char* p_stateName);
void GetFileSavePath(MxString* p_outPath, MxULong p_slotn);
void FUN_1003a720(MxU32);
void StopPreviousAction(MxU32);
void HandleAction(MxU32);
inline MxU8 GetUnknownC() { return m_unk0x0c; }

View File

@ -19,5 +19,6 @@ MxBool FUN_1003ee00(MxAtomId& p_atomId, MxS32 p_id);
void FUN_1003ef00(MxBool);
void SetAppCursor(WPARAM p_wparam);
MxBool FUN_1003ef60();
MxBool RemoveFromWorld(MxAtomId& p_atomId1, MxS32 p_id1, MxAtomId& p_atomId2, MxS32 p_id2);
#endif // LEGOUTIL_H

View File

@ -256,10 +256,168 @@ void LegoGameState::SerializePlayersInfo(MxS16)
// TODO
}
// STUB: LEGO1 0x1003a720
void LegoGameState::FUN_1003a720(MxU32)
// FUNCTION: LEGO1 0x1003a720
void LegoGameState::StopPreviousAction(MxU32 p_area)
{
// TODO
if (p_area == 0) {
p_area = m_prevArea;
}
switch (p_area) {
case 1:
InvokeAction(Extra::e_stop, *g_isleScript, 0, NULL);
InvokeAction(Extra::e_close, *g_isleScript, 0, NULL);
InvokeAction(Extra::e_close, *g_sndAnimScript, 0, NULL);
break;
case 2:
InvokeAction(Extra::e_stop, *g_infomainScript, 0, NULL);
InvokeAction(Extra::e_close, *g_infomainScript, 0, NULL);
break;
case 3:
InvokeAction(Extra::e_stop, *g_infodoorScript, 0, NULL);
InvokeAction(Extra::e_close, *g_infodoorScript, 0, NULL);
break;
case 5:
InvokeAction(Extra::e_stop, *g_elevbottScript, 0, NULL);
InvokeAction(Extra::e_close, *g_elevbottScript, 0, NULL);
break;
case 6:
case 7:
RemoveFromWorld(*g_isleScript, 0x41b, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 1052, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x41d, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x41e, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x420, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x422, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x424, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x426, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x428, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x42a, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x42b, *g_isleScript, 0);
break;
case 8:
RemoveFromWorld(*g_isleScript, 0x45b, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x45c, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x45d, *g_isleScript, 0);
break;
case 9:
RemoveFromWorld(*g_isleScript, 0x475, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x476, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x477, *g_isleScript, 0);
break;
case 10:
RemoveFromWorld(*g_isleScript, 0x45f, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x460, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x461, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x462, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x463, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x464, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x465, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x466, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x467, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x469, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x468, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x46a, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x46b, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x46c, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x46d, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x46e, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x46f, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x471, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x472, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x12, *g_isleScript, 0);
break;
case 0xb:
RemoveFromWorld(*g_isleScript, 0x47a, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x47b, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x47c, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x47d, *g_isleScript, 0);
break;
case 0xc:
InvokeAction(Extra::e_stop, *g_regbookScript, 0, NULL);
InvokeAction(Extra::e_close, *g_regbookScript, 0, NULL);
break;
case 0xd:
InvokeAction(Extra::e_stop, *g_infoscorScript, 0, NULL);
InvokeAction(Extra::e_close, *g_infoscorScript, 0, NULL);
break;
case 0xe:
InvokeAction(Extra::e_stop, *g_jetraceScript, 0, NULL);
InvokeAction(Extra::e_close, *g_jetraceScript, 0, NULL);
InvokeAction(Extra::e_close, *g_jetracerScript, 0, NULL);
break;
case 0x12:
InvokeAction(Extra::e_stop, *g_carraceScript, 0, NULL);
InvokeAction(Extra::e_close, *g_carraceScript, 0, NULL);
InvokeAction(Extra::e_close, *g_carracerScript, 0, NULL);
break;
case 0x1a:
Lego()->RemoveWorld(*g_garageScript, 0);
InvokeAction(Extra::e_stop, *g_garageScript, 0, NULL);
InvokeAction(Extra::e_close, *g_garageScript, 0, NULL);
break;
case 0x1b:
RemoveFromWorld(*g_isleScript, 0x489, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x48a, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x48b, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x48c, *g_isleScript, 0);
break;
case 0x1e:
InvokeAction(Extra::e_stop, *g_hospitalScript, 0, NULL);
InvokeAction(Extra::e_close, *g_hospitalScript, 0, NULL);
break;
case 0x22:
InvokeAction(Extra::e_stop, *g_policeScript, 0, NULL);
InvokeAction(Extra::e_close, *g_policeScript, 0, NULL);
break;
case 0x23:
RemoveFromWorld(*g_isleScript, 0x47f, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x480, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x481, *g_isleScript, 0);
RemoveFromWorld(*g_isleScript, 0x482, *g_isleScript, 0);
break;
case 0x24:
InvokeAction(Extra::e_stop, *g_jukeboxScript, 0x2f, NULL);
InvokeAction(Extra::e_stop, *g_copterScript, 0, NULL);
InvokeAction(Extra::e_close, *g_copterScript, 0, NULL);
break;
case 0x25:
InvokeAction(Extra::e_stop, *g_jukeboxScript, 0x31, NULL);
InvokeAction(Extra::e_stop, *g_dunecarScript, 0, NULL);
InvokeAction(Extra::e_close, *g_dunecarScript, 0, NULL);
break;
case 0x26:
InvokeAction(Extra::e_stop, *g_jukeboxScript, 0x33, NULL);
InvokeAction(Extra::e_stop, *g_jetskiScript, 0, NULL);
InvokeAction(Extra::e_close, *g_jetskiScript, 0, NULL);
break;
case 0x27:
InvokeAction(Extra::e_stop, *g_jukeboxScript, 0x35, NULL);
InvokeAction(Extra::e_stop, *g_racecarScript, 0, NULL);
InvokeAction(Extra::e_close, *g_racecarScript, 0, NULL);
break;
case 0x2e:
if (m_unk0x424 != 2) {
InvokeAction(Extra::e_stop, *g_act2mainScript, 0, NULL);
InvokeAction(Extra::e_close, *g_act2mainScript, 0, NULL);
}
break;
case 0x2f:
if (m_unk0x424 != 2) {
InvokeAction(Extra::e_stop, *g_act3Script, 0, NULL);
InvokeAction(Extra::e_close, *g_act3Script, 0, NULL);
}
break;
case 0x35:
InvokeAction(Extra::e_stop, *g_jukeboxwScript, 0, NULL);
InvokeAction(Extra::e_close, *g_jukeboxwScript, 0, NULL);
break;
case 0x38:
InvokeAction(Extra::e_disable, *g_histbookScript, 0, NULL);
InvokeAction(Extra::e_stop, *g_histbookScript, 0, NULL);
InvokeAction(Extra::e_close, *g_histbookScript, 0, NULL);
break;
}
}
// STUB: LEGO1 0x1003b060

View File

@ -195,6 +195,32 @@ MxBool FUN_1003ee00(MxAtomId& p_atomId, MxS32 p_id)
return TRUE;
}
// FUNCTION: LEGO1 0x1003ee80
MxBool RemoveFromWorld(MxAtomId& p_entityAtom, MxS32 p_entityId, MxAtomId& p_worldAtom, MxS32 p_worldEntityId)
{
LegoWorld* world = FindWorld(p_worldAtom, p_worldEntityId);
if (world) {
MxCore* object = world->Find(p_entityAtom, p_entityId);
if (object) {
world->Remove(object);
if (!object->IsA("MxPresenter")) {
delete object;
}
else {
if (((MxPresenter*) object)->GetAction()) {
FUN_100b7220(((MxPresenter*) object)->GetAction(), MxDSAction::c_world, FALSE);
}
((MxPresenter*) object)->EndAction();
}
return TRUE;
}
}
return FALSE;
}
// STUB: LEGO1 0x1003ef00
void FUN_1003ef00(MxBool)
{

View File

@ -39,7 +39,7 @@ MxResult ElevatorBottom::Create(MxDSAction& p_dsAction)
SetIsWorldActive(FALSE);
GameState()->SetUnknown424(5);
GameState()->FUN_1003a720(0);
GameState()->StopPreviousAction(0);
return result;
}

View File

@ -40,7 +40,7 @@ MxResult InfocenterDoor::Create(MxDSAction& p_dsAction)
SetIsWorldActive(FALSE);
GameState()->SetUnknown424(3);
GameState()->FUN_1003a720(0);
GameState()->StopPreviousAction(0);
return result;
}

View File

@ -53,7 +53,7 @@ MxResult Score::Create(MxDSAction& p_dsAction)
ScoreState* state = (ScoreState*) gs->GetState("ScoreState");
m_state = state ? state : (ScoreState*) gs->CreateState("ScoreState");
GameState()->SetUnknown424(0xd);
GameState()->FUN_1003a720(0);
GameState()->StopPreviousAction(0);
}
return result;

View File

@ -62,14 +62,14 @@ MxResult Isle::Create(MxDSAction& p_dsAction)
if (result == SUCCESS) {
ControlManager()->Register(this);
InputManager()->SetWorld(this);
GameState()->FUN_1003a720(0);
GameState()->StopPreviousAction(0);
switch (GameState()->GetCurrentAct()) {
case 1:
GameState()->FUN_1003a720(0x2e);
GameState()->StopPreviousAction(0x2e);
break;
case 2:
GameState()->FUN_1003a720(0x2e);
GameState()->StopPreviousAction(0x2e);
break;
case -1:
m_unk0x13c = 2;

View File

@ -56,7 +56,7 @@ MxResult Police::Create(MxDSAction& p_dsAction)
m_policeState = policeState;
GameState()->SetUnknown424(0x22);
GameState()->FUN_1003a720(0);
GameState()->StopPreviousAction(0);
return ret;
}