mirror of
https://github.com/isledecomp/isle-portable.git
synced 2024-11-22 07:28:00 -05:00
Implement/match Pizza::FUN_100382b0 and Pizza::StopActions (#1118)
This commit is contained in:
parent
0cb753e523
commit
2b9d8f1fba
5 changed files with 74 additions and 39 deletions
|
@ -1,6 +1,7 @@
|
||||||
#ifndef PIZZA_H
|
#ifndef PIZZA_H
|
||||||
#define PIZZA_H
|
#define PIZZA_H
|
||||||
|
|
||||||
|
#include "actionsfwd.h"
|
||||||
#include "decomp.h"
|
#include "decomp.h"
|
||||||
#include "isleactor.h"
|
#include "isleactor.h"
|
||||||
#include "legostate.h"
|
#include "legostate.h"
|
||||||
|
@ -13,7 +14,7 @@ class SkateBoard;
|
||||||
class PizzaMissionState : public LegoState {
|
class PizzaMissionState : public LegoState {
|
||||||
public:
|
public:
|
||||||
// SIZE 0x20
|
// SIZE 0x20
|
||||||
struct Entry {
|
struct Mission {
|
||||||
public:
|
public:
|
||||||
MxResult WriteToFile(LegoFile* p_file)
|
MxResult WriteToFile(LegoFile* p_file)
|
||||||
{
|
{
|
||||||
|
@ -33,16 +34,16 @@ class PizzaMissionState : public LegoState {
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
undefined2 m_unk0x00; // 0x00
|
MxS16 m_numActions; // 0x00
|
||||||
MxU8 m_id; // 0x02
|
MxU8 m_id; // 0x02
|
||||||
undefined m_unk0x03[3]; // 0x03
|
undefined m_unk0x03[3]; // 0x03
|
||||||
MxS16 m_unk0x06; // 0x06
|
MxS16 m_unk0x06; // 0x06
|
||||||
undefined m_unk0x08[8]; // 0x08
|
undefined m_unk0x08[8]; // 0x08
|
||||||
undefined4 m_unk0x10; // 0x10
|
MxLong m_startTime; // 0x10
|
||||||
MxS16 m_unk0x14; // 0x14
|
MxS16 m_unk0x14; // 0x14
|
||||||
MxS16 m_unk0x16; // 0x16
|
MxS16 m_unk0x16; // 0x16
|
||||||
MxS16 m_score; // 0x18
|
MxS16 m_score; // 0x18
|
||||||
undefined m_unk0x1a[6]; // 0x1a
|
IsleScript::Script* m_actions; // 0x1c
|
||||||
};
|
};
|
||||||
|
|
||||||
PizzaMissionState();
|
PizzaMissionState();
|
||||||
|
@ -67,11 +68,11 @@ class PizzaMissionState : public LegoState {
|
||||||
// SYNTHETIC: LEGO1 0x10039350
|
// SYNTHETIC: LEGO1 0x10039350
|
||||||
// PizzaMissionState::`scalar deleting destructor'
|
// PizzaMissionState::`scalar deleting destructor'
|
||||||
|
|
||||||
Entry* GetState(MxU8 p_id);
|
Mission* GetState(MxU8 p_id);
|
||||||
|
|
||||||
undefined4 m_unk0x08; // 0x08
|
undefined4 m_unk0x08; // 0x08
|
||||||
undefined4 m_unk0x0c; // 0x0c
|
undefined4 m_unk0x0c; // 0x0c
|
||||||
Entry m_state[5]; // 0x10
|
Mission m_state[5]; // 0x10
|
||||||
undefined4 m_unk0xb0; // 0xb0
|
undefined4 m_unk0xb0; // 0xb0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -105,18 +106,18 @@ class Pizza : public IsleActor {
|
||||||
void CreateState();
|
void CreateState();
|
||||||
void FUN_10038220(MxU32 p_objectId);
|
void FUN_10038220(MxU32 p_objectId);
|
||||||
void FUN_100382b0();
|
void FUN_100382b0();
|
||||||
void FUN_10038380();
|
void StopActions();
|
||||||
void FUN_10038fe0(MxU32 p_objectId, MxBool);
|
void FUN_10038fe0(MxU32 p_objectId, MxBool);
|
||||||
|
|
||||||
void SetSkateboard(SkateBoard* p_skateboard) { m_skateboard = p_skateboard; }
|
void SetSkateboard(SkateBoard* p_skateBoard) { m_skateBoard = p_skateBoard; }
|
||||||
|
|
||||||
// SYNTHETIC: LEGO1 0x100380e0
|
// SYNTHETIC: LEGO1 0x100380e0
|
||||||
// Pizza::`scalar deleting destructor'
|
// Pizza::`scalar deleting destructor'
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PizzaMissionState* m_state; // 0x7c
|
PizzaMissionState* m_state; // 0x7c
|
||||||
PizzaMissionState::Entry* m_entry; // 0x80
|
PizzaMissionState::Mission* m_mission; // 0x80
|
||||||
SkateBoard* m_skateboard; // 0x84
|
SkateBoard* m_skateBoard; // 0x84
|
||||||
Act1State* m_act1state; // 0x88
|
Act1State* m_act1state; // 0x88
|
||||||
undefined4 m_unk0x8c; // 0x8c
|
undefined4 m_unk0x8c; // 0x8c
|
||||||
undefined4 m_unk0x90; // 0x90
|
undefined4 m_unk0x90; // 0x90
|
||||||
|
|
|
@ -35,13 +35,12 @@ class SkateBoard : public IslePathActor {
|
||||||
void SetUnknown0x160(MxBool p_unk0x160) { m_unk0x160 = p_unk0x160; }
|
void SetUnknown0x160(MxBool p_unk0x160) { m_unk0x160 = p_unk0x160; }
|
||||||
|
|
||||||
void ActivateSceneActions();
|
void ActivateSceneActions();
|
||||||
|
void EnableScenePresentation(MxBool p_enable);
|
||||||
|
|
||||||
// SYNTHETIC: LEGO1 0x1000ff60
|
// SYNTHETIC: LEGO1 0x1000ff60
|
||||||
// SkateBoard::`scalar deleting destructor'
|
// SkateBoard::`scalar deleting destructor'
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void EnableScenePresentation(MxBool p_enable);
|
|
||||||
|
|
||||||
MxBool m_unk0x160; // 0x160
|
MxBool m_unk0x160; // 0x160
|
||||||
Act1State* m_act1state; // 0x164
|
Act1State* m_act1state; // 0x164
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,14 +4,17 @@
|
||||||
#include "isle_actions.h"
|
#include "isle_actions.h"
|
||||||
#include "legoanimationmanager.h"
|
#include "legoanimationmanager.h"
|
||||||
#include "legogamestate.h"
|
#include "legogamestate.h"
|
||||||
|
#include "legoutils.h"
|
||||||
#include "legoworld.h"
|
#include "legoworld.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
#include "mxbackgroundaudiomanager.h"
|
||||||
#include "mxmisc.h"
|
#include "mxmisc.h"
|
||||||
#include "mxticklemanager.h"
|
#include "mxticklemanager.h"
|
||||||
|
#include "skateboard.h"
|
||||||
|
|
||||||
DECOMP_SIZE_ASSERT(Pizza, 0x9c)
|
DECOMP_SIZE_ASSERT(Pizza, 0x9c)
|
||||||
DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb4)
|
DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb4)
|
||||||
DECOMP_SIZE_ASSERT(PizzaMissionState::Entry, 0x20)
|
DECOMP_SIZE_ASSERT(PizzaMissionState::Mission, 0x20)
|
||||||
|
|
||||||
// Flags used in isle.cpp
|
// Flags used in isle.cpp
|
||||||
extern MxU32 g_isleFlags;
|
extern MxU32 g_isleFlags;
|
||||||
|
@ -20,12 +23,12 @@ extern MxU32 g_isleFlags;
|
||||||
Pizza::Pizza()
|
Pizza::Pizza()
|
||||||
{
|
{
|
||||||
m_state = NULL;
|
m_state = NULL;
|
||||||
m_entry = NULL;
|
m_mission = NULL;
|
||||||
m_skateboard = NULL;
|
m_skateBoard = NULL;
|
||||||
m_act1state = NULL;
|
m_act1state = NULL;
|
||||||
m_unk0x8c = -1;
|
m_unk0x8c = -1;
|
||||||
m_unk0x98 = 0;
|
m_unk0x98 = 0;
|
||||||
m_unk0x90 = 0x80000000;
|
m_unk0x90 = INT_MIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10038100
|
// FUNCTION: LEGO1 0x10038100
|
||||||
|
@ -41,13 +44,14 @@ MxResult Pizza::Create(MxDSAction& p_dsAction)
|
||||||
|
|
||||||
if (result == SUCCESS) {
|
if (result == SUCCESS) {
|
||||||
CreateState();
|
CreateState();
|
||||||
m_skateboard = (SkateBoard*) m_world->Find(m_atomId, IsleScript::c_SkateBoard_Actor);
|
m_skateBoard = (SkateBoard*) m_world->Find(m_atomId, IsleScript::c_SkateBoard_Actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100381b0
|
// FUNCTION: LEGO1 0x100381b0
|
||||||
|
// FUNCTION: BETA10 0x100edaec
|
||||||
void Pizza::CreateState()
|
void Pizza::CreateState()
|
||||||
{
|
{
|
||||||
m_state = (PizzaMissionState*) GameState()->GetState("PizzaMissionState");
|
m_state = (PizzaMissionState*) GameState()->GetState("PizzaMissionState");
|
||||||
|
@ -62,13 +66,14 @@ void Pizza::CreateState()
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10038220
|
// FUNCTION: LEGO1 0x10038220
|
||||||
|
// FUNCTION: BETA10 0x100edb81
|
||||||
void Pizza::FUN_10038220(MxU32 p_objectId)
|
void Pizza::FUN_10038220(MxU32 p_objectId)
|
||||||
{
|
{
|
||||||
AnimationManager()->FUN_10064740(NULL);
|
AnimationManager()->FUN_10064740(NULL);
|
||||||
m_entry = m_state->GetState(GameState()->GetActorId());
|
m_mission = m_state->GetState(GameState()->GetActorId());
|
||||||
m_state->m_unk0x0c = 1;
|
m_state->m_unk0x0c = 1;
|
||||||
m_act1state->m_unk0x018 = 3;
|
m_act1state->m_unk0x018 = 3;
|
||||||
m_entry->m_unk0x10 = 0x80000000;
|
m_mission->m_startTime = INT_MIN;
|
||||||
g_isleFlags &= ~Isle::c_playMusic;
|
g_isleFlags &= ~Isle::c_playMusic;
|
||||||
AnimationManager()->EnableCamAnims(FALSE);
|
AnimationManager()->EnableCamAnims(FALSE);
|
||||||
AnimationManager()->FUN_1005f6d0(FALSE);
|
AnimationManager()->FUN_1005f6d0(FALSE);
|
||||||
|
@ -76,14 +81,44 @@ void Pizza::FUN_10038220(MxU32 p_objectId)
|
||||||
m_unk0x8c = -1;
|
m_unk0x8c = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x100382b0
|
// FUNCTION: LEGO1 0x100382b0
|
||||||
void Pizza::FUN_100382b0()
|
void Pizza::FUN_100382b0()
|
||||||
{
|
{
|
||||||
|
if (m_state->m_unk0x0c != 8) {
|
||||||
|
if (m_unk0x8c != -1) {
|
||||||
|
InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x8c, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10038380
|
m_act1state->m_unk0x018 = 0;
|
||||||
void Pizza::FUN_10038380()
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x100383f0
|
// STUB: LEGO1 0x100383f0
|
||||||
|
@ -146,7 +181,7 @@ MxResult PizzaMissionState::Serialize(LegoFile* p_file)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10039510
|
// FUNCTION: LEGO1 0x10039510
|
||||||
PizzaMissionState::Entry* PizzaMissionState::GetState(MxU8 p_id)
|
PizzaMissionState::Mission* PizzaMissionState::GetState(MxU8 p_id)
|
||||||
{
|
{
|
||||||
for (MxS16 i = 0; i < 5; i++) {
|
for (MxS16 i = 0; i < 5; i++) {
|
||||||
if (m_state[i].m_id == p_id) {
|
if (m_state[i].m_id == p_id) {
|
||||||
|
|
|
@ -58,7 +58,7 @@ void SkateBoard::Exit()
|
||||||
{
|
{
|
||||||
if (m_act1state->m_unk0x018 == 3) {
|
if (m_act1state->m_unk0x018 == 3) {
|
||||||
Pizza* pizza = (Pizza*) CurrentWorld()->Find(*g_isleScript, IsleScript::c_Pizza_Actor);
|
Pizza* pizza = (Pizza*) CurrentWorld()->Find(*g_isleScript, IsleScript::c_Pizza_Actor);
|
||||||
pizza->FUN_10038380();
|
pizza->StopActions();
|
||||||
pizza->FUN_100382b0();
|
pizza->FUN_100382b0();
|
||||||
m_unk0x160 = FALSE;
|
m_unk0x160 = FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1190,7 +1190,7 @@ MxBool Isle::Escape()
|
||||||
switch (m_act1state->m_unk0x018) {
|
switch (m_act1state->m_unk0x018) {
|
||||||
case 3:
|
case 3:
|
||||||
if (UserActor() != NULL) {
|
if (UserActor() != NULL) {
|
||||||
m_pizza->FUN_10038380();
|
m_pizza->StopActions();
|
||||||
m_pizza->FUN_100382b0();
|
m_pizza->FUN_100382b0();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1257,7 +1257,7 @@ void Isle::FUN_10033350()
|
||||||
|
|
||||||
if (m_act1state->m_unk0x018 == 3) {
|
if (m_act1state->m_unk0x018 == 3) {
|
||||||
if (UserActor() != NULL) {
|
if (UserActor() != NULL) {
|
||||||
m_pizza->FUN_10038380();
|
m_pizza->StopActions();
|
||||||
m_pizza->FUN_100382b0();
|
m_pizza->FUN_100382b0();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue