isle-portable/LEGO1/lego/legoomni/src/actors/pizza.cpp
2024-10-26 19:34:16 +02:00

235 lines
5.1 KiB
C++

#include "pizza.h"
#include "isle.h"
#include "isle_actions.h"
#include "jukebox_actions.h"
#include "legoanimationmanager.h"
#include "legogamestate.h"
#include "legoutils.h"
#include "legoworld.h"
#include "misc.h"
#include "mxbackgroundaudiomanager.h"
#include "mxmisc.h"
#include "mxticklemanager.h"
#include "mxtimer.h"
#include "pizzeria.h"
#include "skateboard.h"
DECOMP_SIZE_ASSERT(Pizza, 0x9c)
DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb4)
DECOMP_SIZE_ASSERT(PizzaMissionState::Mission, 0x20)
// Flags used in isle.cpp
extern MxU32 g_isleFlags;
// FUNCTION: LEGO1 0x10037ef0
Pizza::Pizza()
{
m_state = NULL;
m_mission = NULL;
m_skateBoard = NULL;
m_act1state = NULL;
m_unk0x8c = -1;
m_unk0x98 = 0;
m_unk0x90 = INT_MIN;
}
// FUNCTION: LEGO1 0x10038100
Pizza::~Pizza()
{
TickleManager()->UnregisterClient(this);
}
// FUNCTION: LEGO1 0x10038170
MxResult Pizza::Create(MxDSAction& p_dsAction)
{
MxResult result = IsleActor::Create(p_dsAction);
if (result == SUCCESS) {
CreateState();
m_skateBoard = (SkateBoard*) m_world->Find(m_atomId, IsleScript::c_SkateBoard_Actor);
}
return result;
}
// FUNCTION: LEGO1 0x100381b0
// FUNCTION: BETA10 0x100edaec
void Pizza::CreateState()
{
m_state = (PizzaMissionState*) GameState()->GetState("PizzaMissionState");
if (m_state == NULL) {
m_state = (PizzaMissionState*) GameState()->CreateState("PizzaMissionState");
}
m_act1state = (Act1State*) GameState()->GetState("Act1State");
if (m_act1state == NULL) {
m_act1state = (Act1State*) GameState()->CreateState("Act1State");
}
}
// FUNCTION: LEGO1 0x10038220
// FUNCTION: BETA10 0x100edb81
void Pizza::FUN_10038220(MxU32 p_objectId)
{
AnimationManager()->FUN_10064740(NULL);
m_mission = m_state->GetState(GameState()->GetActorId());
m_state->m_unk0x0c = 1;
m_act1state->m_unk0x018 = 3;
m_mission->m_startTime = INT_MIN;
g_isleFlags &= ~Isle::c_playMusic;
AnimationManager()->EnableCamAnims(FALSE);
AnimationManager()->FUN_1005f6d0(FALSE);
FUN_10038fe0(p_objectId, FALSE);
m_unk0x8c = -1;
}
// FUNCTION: LEGO1 0x100382b0
void Pizza::FUN_100382b0()
{
if (m_state->m_unk0x0c != 8) {
if (m_unk0x8c != -1) {
InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x8c, NULL);
}
m_act1state->m_unk0x018 = 0;
m_state->m_unk0x0c = 0;
UserActor()->SetState(0);
g_isleFlags |= Isle::c_playMusic;
AnimationManager()->EnableCamAnims(TRUE);
AnimationManager()->FUN_1005f6d0(TRUE);
m_mission->m_startTime = INT_MIN;
m_mission = NULL;
m_unk0x98 = 0;
m_unk0x8c = -1;
BackgroundAudioManager()->RaiseVolume();
TickleManager()->UnregisterClient(this);
m_unk0x90 = INT_MIN;
m_skateBoard->EnableScenePresentation(FALSE);
m_skateBoard->SetUnknown0x160(FALSE);
}
}
// FUNCTION: LEGO1 0x10038380
void Pizza::StopActions()
{
InvokeAction(Extra::e_stop, *g_isleScript, IsleScript::c_pns050p1_RunAnim, NULL);
InvokeAction(Extra::e_stop, *g_isleScript, IsleScript::c_wns050p1_RunAnim, NULL);
PizzaMissionState::Mission* mission = m_mission;
if (mission != NULL) {
for (MxS32 i = 0; i < mission->m_numActions; i++) {
InvokeAction(Extra::e_stop, *g_isleScript, mission->m_actions[i], NULL);
}
}
}
// FUNCTION: LEGO1 0x100383f0
MxLong Pizza::HandleClick()
{
if (m_state->m_unk0x0c == 1) {
m_state->m_unk0x0c = 2;
m_mission->m_startTime = Timer()->GetTime();
TickleManager()->RegisterClient(this, 200);
AnimationManager()->FUN_10061010(FALSE);
}
if (m_state->m_unk0x0c == 2) {
m_act1state->m_unk0x018 = 3;
if (m_skateBoard == NULL) {
m_skateBoard = (SkateBoard*) m_world->Find(m_atomId, IsleScript::c_SkateBoard_Actor);
}
IsleScript::Script action;
switch (m_state->FUN_10039540()) {
case 0:
action = m_mission->m_actions[m_mission->m_numActions + 3];
break;
case 1:
action = m_mission->m_actions[m_mission->m_numActions + 4];
break;
default:
action = m_mission->m_actions[m_mission->m_numActions + 5];
}
FUN_10038fe0(action, TRUE);
m_state->m_unk0x0c = 3;
PlayMusic(JukeboxScript::c_PizzaMission_Music);
return 1;
}
return 0;
}
// STUB: LEGO1 0x100384f0
MxLong Pizza::HandlePathStruct(LegoPathStructNotificationParam&)
{
// TODO
return 0;
}
// STUB: LEGO1 0x100388a0
MxResult Pizza::Tickle()
{
// TODO
return SUCCESS;
}
// STUB: LEGO1 0x10038b10
MxLong Pizza::HandleEndAction(MxEndActionNotificationParam&)
{
// TODO
return 0;
}
// STUB: LEGO1 0x10038fe0
void Pizza::FUN_10038fe0(MxU32 p_objectId, MxBool)
{
// TODO
}
// STUB: LEGO1 0x10039030
PizzaMissionState::PizzaMissionState()
{
// TODO
}
// FUNCTION: LEGO1 0x100393c0
MxResult PizzaMissionState::Serialize(LegoFile* p_file)
{
LegoState::Serialize(p_file);
if (p_file->IsReadMode()) {
for (MxS16 i = 0; i < 5; i++) {
m_state[i].ReadFromFile(p_file);
}
}
else if (p_file->IsWriteMode()) {
for (MxS16 i = 0; i < 5; i++) {
m_state[i].WriteToFile(p_file);
}
}
return SUCCESS;
}
// FUNCTION: LEGO1 0x10039510
PizzaMissionState::Mission* PizzaMissionState::GetState(MxU8 p_id)
{
for (MxS16 i = 0; i < 5; i++) {
if (m_state[i].m_id == p_id) {
return m_state + i;
}
}
return NULL;
}
// FUNCTION: LEGO1 0x10039540
MxS16 PizzaMissionState::FUN_10039540()
{
return m_pizzeriaState->FUN_10017d50();
}