mirror of
https://github.com/isledecomp/isle.git
synced 2026-01-30 11:41:16 +00:00
Implement Infocenter::HandleEndAction
This commit is contained in:
parent
787553dbbc
commit
85a8c8fd31
@ -44,7 +44,6 @@ class Infocenter : public LegoWorld {
|
|||||||
virtual void VTable0x68(MxBool p_add) override; // vtable+0x68
|
virtual void VTable0x68(MxBool p_add) override; // vtable+0x68
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void PlayCutScene(MxU32 p_entityId, MxBool p_scale);
|
|
||||||
void InitializeBitmaps();
|
void InitializeBitmaps();
|
||||||
|
|
||||||
// notifications
|
// notifications
|
||||||
@ -55,9 +54,12 @@ class Infocenter : public LegoWorld {
|
|||||||
MxLong HandleEndAction(MxParam&);
|
MxLong HandleEndAction(MxParam&);
|
||||||
MxLong HandleNotification0(MxParam&);
|
MxLong HandleNotification0(MxParam&);
|
||||||
|
|
||||||
|
void FUN_10070dc0(MxBool);
|
||||||
void FUN_10070e90();
|
void FUN_10070e90();
|
||||||
|
|
||||||
// utility functions
|
// utility functions
|
||||||
|
void PlayCutScene(MxU32 p_entityId, MxBool p_scale);
|
||||||
|
void StopCutScene();
|
||||||
void StartCredits();
|
void StartCredits();
|
||||||
static void DeleteCredits();
|
static void DeleteCredits();
|
||||||
void PlayDialogue(MxS32 p_objectId);
|
void PlayDialogue(MxS32 p_objectId);
|
||||||
|
|||||||
@ -28,6 +28,7 @@ class LegoControlManager : public MxCore {
|
|||||||
void FUN_10028df0(MxPresenterList* p_presenterList);
|
void FUN_10028df0(MxPresenterList* p_presenterList);
|
||||||
void Register(MxCore* p_listener);
|
void Register(MxCore* p_listener);
|
||||||
void Unregister(MxCore* p_listener);
|
void Unregister(MxCore* p_listener);
|
||||||
|
void FUN_100293c0(undefined4, const MxAtomId&, undefined2);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // LEGOCONTROLMANAGER_H
|
#endif // LEGOCONTROLMANAGER_H
|
||||||
|
|||||||
@ -43,6 +43,7 @@ class LegoGameState {
|
|||||||
|
|
||||||
void SetSomeEnumState(undefined4 p_state);
|
void SetSomeEnumState(undefined4 p_state);
|
||||||
void FUN_1003ceb0();
|
void FUN_1003ceb0();
|
||||||
|
void FUN_10039780(MxU8);
|
||||||
|
|
||||||
struct ScoreStruct {
|
struct ScoreStruct {
|
||||||
void WriteScoreHistory();
|
void WriteScoreHistory();
|
||||||
|
|||||||
@ -163,6 +163,7 @@ LegoWorld* GetCurrentWorld();
|
|||||||
LegoUnkSaveDataWriter* GetUnkSaveDataWriter();
|
LegoUnkSaveDataWriter* GetUnkSaveDataWriter();
|
||||||
GifManager* GetGifManager();
|
GifManager* GetGifManager();
|
||||||
void FUN_10015820(MxU32, MxU32);
|
void FUN_10015820(MxU32, MxU32);
|
||||||
|
void FUN_10015860(const char*, MxU8);
|
||||||
LegoEntity* FindEntityByAtomIdOrEntityId(const MxAtomId& p_atom, MxS32 p_entityid);
|
LegoEntity* FindEntityByAtomIdOrEntityId(const MxAtomId& p_atom, MxS32 p_entityid);
|
||||||
MxDSAction& GetCurrentAction();
|
MxDSAction& GetCurrentAction();
|
||||||
|
|
||||||
|
|||||||
@ -89,6 +89,12 @@ LegoGameState::~LegoGameState()
|
|||||||
delete[] m_savePath;
|
delete[] m_savePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// STUB: LEGO1 0x10039780
|
||||||
|
void LegoGameState::FUN_10039780(MxU8)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10039980
|
// FUNCTION: LEGO1 0x10039980
|
||||||
MxResult LegoGameState::Save(MxULong p_slot)
|
MxResult LegoGameState::Save(MxULong p_slot)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -30,6 +30,11 @@ void LegoControlManager::Unregister(MxCore* p_listener)
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// STUB: LEGO1 0x100293c0
|
||||||
|
void LegoControlManager::FUN_100293c0(undefined4, const MxAtomId&, undefined2)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10029600
|
// STUB: LEGO1 0x10029600
|
||||||
MxResult LegoControlManager::Tickle()
|
MxResult LegoControlManager::Tickle()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -11,6 +11,13 @@
|
|||||||
#include "mxbackgroundaudiomanager.h"
|
#include "mxbackgroundaudiomanager.h"
|
||||||
#include "mxnotificationmanager.h"
|
#include "mxnotificationmanager.h"
|
||||||
#include "mxstillpresenter.h"
|
#include "mxstillpresenter.h"
|
||||||
|
#include "mxtransitionmanager.h"
|
||||||
|
|
||||||
|
// GLOBAL: LEGO1 0x100f7698
|
||||||
|
const char* g_2x4red = "2x4red";
|
||||||
|
|
||||||
|
// GLOBAL: LEGO1 0x100f76a4
|
||||||
|
const char* g_2x4grn = "2x4grn";
|
||||||
|
|
||||||
DECOMP_SIZE_ASSERT(Infocenter, 0x1d8)
|
DECOMP_SIZE_ASSERT(Infocenter, 0x1d8)
|
||||||
|
|
||||||
@ -111,16 +118,156 @@ MxLong Infocenter::Notify(MxParam& p_param)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x1006f080
|
// FUNCTION: LEGO1 0x1006f080
|
||||||
MxLong Infocenter::HandleEndAction(MxParam& p_param)
|
MxLong Infocenter::HandleEndAction(MxParam& p_param)
|
||||||
{
|
{
|
||||||
MxDSAction* endedAction = ((MxEndActionNotificationParam&) p_param).GetAction();
|
MxDSAction* endedAction = ((MxEndActionNotificationParam&) p_param).GetAction();
|
||||||
if (endedAction->GetAtomId() == *g_creditsScript && endedAction->GetObjectId() == 499) {
|
if (endedAction->GetAtomId() == *g_creditsScript && endedAction->GetObjectId() == 499) {
|
||||||
Lego()->CloseMainWindow();
|
Lego()->CloseMainWindow();
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
switch (endedAction->GetObjectId()) {
|
||||||
return 1;
|
case 40:
|
||||||
|
case 41:
|
||||||
|
case 42:
|
||||||
|
case 43:
|
||||||
|
case 44:
|
||||||
|
if (m_unk0x1d4) {
|
||||||
|
m_unk0x1d4--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_unk0x1d4)
|
||||||
|
break;
|
||||||
|
|
||||||
|
PlayMusic(11);
|
||||||
|
GameState()->FUN_10039780(m_unk0xfc);
|
||||||
|
|
||||||
|
// Play dialogue when player selects character
|
||||||
|
switch (m_unk0xfc) {
|
||||||
|
case 1:
|
||||||
|
PlayDialogue(541); // pepper
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
PlayDialogue(542); // mama brickolinea
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
PlayDialogue(543); // papa brickolinea
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
PlayDialogue(544); // officer nick brick
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
PlayDialogue(545); // lora brick
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
FUN_10070dc0(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
MxLong result = m_radio.Notify(p_param);
|
||||||
|
if (result == 0) {
|
||||||
|
if (endedAction->GetAtomId() == m_atom || endedAction->GetAtomId() == *g_introScript) {
|
||||||
|
// 514: if you want to get back ...
|
||||||
|
if (endedAction->GetObjectId() == 514) {
|
||||||
|
ControlManager()->FUN_100293c0(0x10, endedAction->GetAtomId(), 0);
|
||||||
|
m_unk0x1d6 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (m_infocenterState->GetUnknown0x74()) {
|
||||||
|
case 0:
|
||||||
|
switch (m_currentCutScene) {
|
||||||
|
case 0:
|
||||||
|
PlayCutScene(1, FALSE); // Mindscape animation
|
||||||
|
return 1;
|
||||||
|
case 1:
|
||||||
|
PlayCutScene(2, TRUE); // Lego Island animation
|
||||||
|
return 1;
|
||||||
|
case 4:
|
||||||
|
StopCutScene();
|
||||||
|
// play bad ending dialogue after bad ending cutscene
|
||||||
|
PlayDialogue(540);
|
||||||
|
m_currentCutScene = -1;
|
||||||
|
return 1;
|
||||||
|
case 5:
|
||||||
|
StopCutScene();
|
||||||
|
|
||||||
|
// play good ending dialogue after good ending cutscene
|
||||||
|
PlayDialogue(539);
|
||||||
|
m_currentCutScene = -1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// default / 2nd case probably?
|
||||||
|
StopCutScene();
|
||||||
|
m_infocenterState->SetUnknown0x74(11);
|
||||||
|
PlayDialogue(500); // play welcome dialogue
|
||||||
|
m_currentCutScene = -1;
|
||||||
|
if (m_infocenterState->GetInfocenterBufferElement(0) == 0) {
|
||||||
|
m_unk0x1d2 = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
m_infocenterState->SetUnknown0x74(11);
|
||||||
|
MxU32 val;
|
||||||
|
switch (m_currentCutScene) {
|
||||||
|
case 4:
|
||||||
|
val = 540; // bad ending dialogue
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
val = 539; // good ending dialogue
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
val = 500; // welcome dialogue
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayDialogue(val);
|
||||||
|
m_currentCutScene = -1;
|
||||||
|
return 1;
|
||||||
|
case 2:
|
||||||
|
FUN_10015860(g_2x4red, 0);
|
||||||
|
FUN_10015860(g_2x4grn, 0);
|
||||||
|
BackgroundAudioManager()->RaiseVolume();
|
||||||
|
return 1;
|
||||||
|
case 4:
|
||||||
|
if (endedAction->GetObjectId() == 70 || endedAction->GetObjectId() == 71) {
|
||||||
|
TransitionManager()->StartTransition(MxTransitionManager::PIXELATION, 50, FALSE, FALSE);
|
||||||
|
m_infocenterState->SetUnknown0x74(14);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if (m_unk0xf8 == endedAction->GetObjectId()) {
|
||||||
|
if (GameState()->GetUnknown10() != 2 && m_unk0xfc != 0) {
|
||||||
|
GameState()->FUN_10039780(m_unk0xfc);
|
||||||
|
}
|
||||||
|
TransitionManager()->StartTransition(MxTransitionManager::PIXELATION, 50, FALSE, FALSE);
|
||||||
|
m_infocenterState->SetUnknown0x74(14);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
if (m_infocenterState->GetInfocenterBufferElement(0) == 0 && m_unk0xf8 != 28 && m_unk0xf8 != 29 &&
|
||||||
|
m_unk0xf8 != 42 && m_unk0xf8 != 43 && m_unk0xf8 != 44) {
|
||||||
|
m_unk0x1d0 = 1;
|
||||||
|
PlayMusic(11);
|
||||||
|
}
|
||||||
|
m_infocenterState->SetUnknown0x74(2);
|
||||||
|
FUN_10015860("infoman", 1);
|
||||||
|
return 1;
|
||||||
|
case 12:
|
||||||
|
if (m_unk0xf8 == endedAction->GetObjectId()) {
|
||||||
|
TransitionManager()->StartTransition(MxTransitionManager::PIXELATION, 50, FALSE, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x1006f4e0
|
// FUNCTION: LEGO1 0x1006f4e0
|
||||||
@ -191,12 +338,6 @@ void Infocenter::InitializeBitmaps()
|
|||||||
// TODO: Infocenter class size is wrong
|
// TODO: Infocenter class size is wrong
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10070aa0
|
|
||||||
void Infocenter::VTable0x68(MxBool p_add)
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
// STUB: LEGO1 0x1006fd00
|
// STUB: LEGO1 0x1006fd00
|
||||||
MxLong Infocenter::HandleMouseMove(MxS32 p_x, MxS32 p_y)
|
MxLong Infocenter::HandleMouseMove(MxS32 p_x, MxS32 p_y)
|
||||||
{
|
{
|
||||||
@ -227,6 +368,22 @@ MxLong Infocenter::HandleNotification0(MxParam&)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FUNCTION: LEGO1 0x10070aa0
|
||||||
|
void Infocenter::VTable0x68(MxBool p_add)
|
||||||
|
{
|
||||||
|
LegoWorld::VTable0x68(p_add);
|
||||||
|
|
||||||
|
if (p_add) {
|
||||||
|
InputManager()->SetWorld(this);
|
||||||
|
SetIsWorldActive(FALSE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (InputManager()->GetWorld() == this) {
|
||||||
|
InputManager()->ClearWorld();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10070af0
|
// STUB: LEGO1 0x10070af0
|
||||||
MxResult Infocenter::Tickle()
|
MxResult Infocenter::Tickle()
|
||||||
{
|
{
|
||||||
@ -253,12 +410,29 @@ void Infocenter::PlayCutScene(MxU32 p_entityId, MxBool p_scale)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FUNCTION: LEGO1 0x10070cb0
|
||||||
|
void Infocenter::StopCutScene()
|
||||||
|
{
|
||||||
|
if (m_currentCutScene != -1) {
|
||||||
|
InvokeAction(ExtraActionType_close, *g_introScript, m_currentCutScene, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
VideoManager()->EnableFullScreenMovie(FALSE);
|
||||||
|
InputManager()->SetUnknown335(FALSE);
|
||||||
|
FUN_10015820(0, 7);
|
||||||
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10070d00
|
// FUNCTION: LEGO1 0x10070d00
|
||||||
MxBool Infocenter::VTable0x5c()
|
MxBool Infocenter::VTable0x5c()
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// STUB: LEGO1 0x10070dc0
|
||||||
|
void Infocenter::FUN_10070dc0(MxBool)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10070e90
|
// STUB: LEGO1 0x10070e90
|
||||||
void Infocenter::FUN_10070e90()
|
void Infocenter::FUN_10070e90()
|
||||||
{
|
{
|
||||||
@ -273,6 +447,7 @@ MxBool Infocenter::VTable0x64()
|
|||||||
// STUB: LEGO1 0x10071030
|
// STUB: LEGO1 0x10071030
|
||||||
void Infocenter::StartCredits()
|
void Infocenter::StartCredits()
|
||||||
{
|
{
|
||||||
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10071250
|
// FUNCTION: LEGO1 0x10071250
|
||||||
|
|||||||
@ -6,6 +6,7 @@ DECOMP_SIZE_ASSERT(InfocenterState, 0x94);
|
|||||||
InfocenterState::InfocenterState()
|
InfocenterState::InfocenterState()
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
|
memset(m_buffer, 0, sizeof(m_buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10071920
|
// STUB: LEGO1 0x10071920
|
||||||
|
|||||||
@ -211,6 +211,12 @@ void FUN_10015820(MxU32, MxU32)
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// STUB: LEGO1 0x10015860
|
||||||
|
void FUN_10015860(const char*, MxU8)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100158c0
|
// FUNCTION: LEGO1 0x100158c0
|
||||||
LegoEntity* FindEntityByAtomIdOrEntityId(const MxAtomId& p_atom, MxS32 p_entityid)
|
LegoEntity* FindEntityByAtomIdOrEntityId(const MxAtomId& p_atom, MxS32 p_entityid)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user