Match Helicopter::HandleControl

This commit is contained in:
Christian Semmler 2024-12-09 15:27:24 -07:00
parent e18eaedb2a
commit bebd22359c
4 changed files with 86 additions and 58 deletions

View File

@ -135,7 +135,7 @@ class LegoPathActor : public LegoActor {
// FUNCTION: BETA10 0x1001c860 // FUNCTION: BETA10 0x1001c860
MxU32 GetState() { return m_state; } MxU32 GetState() { return m_state; }
LegoPathController* GetController() { return m_controller; } LegoPathController* GetController() { return m_pathController; }
MxBool GetCollideBox() { return m_collideBox; } MxBool GetCollideBox() { return m_collideBox; }
MxFloat GetLastTime() { return m_lastTime; } MxFloat GetLastTime() { return m_lastTime; }
MxFloat GetActorTime() { return m_actorTime; } MxFloat GetActorTime() { return m_actorTime; }
@ -145,7 +145,7 @@ class LegoPathActor : public LegoActor {
// FUNCTION: BETA10 0x10013430 // FUNCTION: BETA10 0x10013430
void SetState(MxU32 p_state) { m_state = p_state; } void SetState(MxU32 p_state) { m_state = p_state; }
void SetController(LegoPathController* p_controller) { m_controller = p_controller; } void SetController(LegoPathController* p_controller) { m_pathController = p_controller; }
void SetLastTime(MxFloat p_lastTime) { m_lastTime = p_lastTime; } void SetLastTime(MxFloat p_lastTime) { m_lastTime = p_lastTime; }
void SetActorTime(MxFloat p_actorTime) { m_actorTime = p_actorTime; } void SetActorTime(MxFloat p_actorTime) { m_actorTime = p_actorTime; }
@ -167,27 +167,27 @@ class LegoPathActor : public LegoActor {
MxS32 p_und MxS32 p_und
); );
MxFloat m_BADuration; // 0x78 MxFloat m_BADuration; // 0x78
MxFloat m_unk0x7c; // 0x7c MxFloat m_unk0x7c; // 0x7c
MxFloat m_actorTime; // 0x80 MxFloat m_actorTime; // 0x80
MxFloat m_lastTime; // 0x84 MxFloat m_lastTime; // 0x84
LegoPathBoundary* m_boundary; // 0x88 LegoPathBoundary* m_boundary; // 0x88
LegoUnknown m_unk0x8c; // 0x8c LegoUnknown m_unk0x8c; // 0x8c
MxU32 m_state; // 0xdc MxU32 m_state; // 0xdc
LegoUnknown100db7f4* m_destEdge; // 0xe0 LegoUnknown100db7f4* m_destEdge; // 0xe0
MxFloat m_unk0xe4; // 0xe4 MxFloat m_unk0xe4; // 0xe4
MxBool m_collideBox; // 0xe8 MxBool m_collideBox; // 0xe8
MxBool m_unk0xe9; // 0xe9 MxBool m_unk0xe9; // 0xe9
MxBool m_userNavFlag; // 0xea MxBool m_userNavFlag; // 0xea
MxMatrix m_unk0xec; // 0xec MxMatrix m_unk0xec; // 0xec
LegoPathEdgeContainer* m_grec; // 0x134 LegoPathEdgeContainer* m_grec; // 0x134
LegoPathController* m_controller; // 0x138 LegoPathController* m_pathController; // 0x138
MxFloat m_maxLinearVel; // 0x13c MxFloat m_maxLinearVel; // 0x13c
MxFloat m_unk0x140; // 0x140 MxFloat m_unk0x140; // 0x140
MxFloat m_unk0x144; // 0x144 MxFloat m_unk0x144; // 0x144
MxU8 m_unk0x148; // 0x148 MxU8 m_unk0x148; // 0x148
MxS32 m_unk0x14c; // 0x14c MxS32 m_unk0x14c; // 0x14c
MxFloat m_unk0x150; // 0x150 MxFloat m_unk0x150; // 0x150
}; };
// TEMPLATE: LEGO1 0x10018b70 // TEMPLATE: LEGO1 0x10018b70

View File

@ -146,9 +146,9 @@ void Act2Actor::FUN_100192a0(undefined4 p_param)
newPosition = g_unk0x100f0db8[p_param].m_position; newPosition = g_unk0x100f0db8[p_param].m_position;
newDirection = g_unk0x100f0db8[p_param].m_direction; newDirection = g_unk0x100f0db8[p_param].m_direction;
LegoPathBoundary* newBoundary = m_controller->GetPathBoundary(g_unk0x100f0db8[p_param].m_boundary); LegoPathBoundary* newBoundary = m_pathController->GetPathBoundary(g_unk0x100f0db8[p_param].m_boundary);
MxResult sts = m_controller->FUN_10048310( MxResult sts = m_pathController->FUN_10048310(
m_grec, m_grec,
m_roi->GetWorldPosition(), m_roi->GetWorldPosition(),
m_roi->GetWorldDirection(), m_roi->GetWorldDirection(),

View File

@ -13,6 +13,7 @@
#include "legoutils.h" #include "legoutils.h"
#include "legoworld.h" #include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxdebug.h"
#include "mxtransitionmanager.h" #include "mxtransitionmanager.h"
#include "scripts.h" #include "scripts.h"
@ -152,9 +153,10 @@ MxLong Helicopter::HandleClick()
} }
// FUNCTION: LEGO1 0x100035e0 // FUNCTION: LEGO1 0x100035e0
// FUNCTION: BETA10 0x1002a587
MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param) MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
{ {
MxU32 ret = 0; MxLong result = 0;
MxAtomId script; MxAtomId script;
switch (GameState()->GetCurrentAct()) { switch (GameState()->GetCurrentAct()) {
@ -169,79 +171,98 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
break; break;
} }
if (p_param.GetUnknown0x28() == 1) { if (p_param.m_unk0x28 == 1) {
switch (p_param.GetClickedObjectId()) { MxU32 isPizza = FALSE;
switch (p_param.m_clickedObjectId) {
case IsleScript::c_HelicopterArms_Ctl: case IsleScript::c_HelicopterArms_Ctl:
if (*g_act3Script == script) { if (*g_act3Script == script) {
((Act3*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain); ((Act3*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
} }
else if (m_state->GetUnkown8() != 0) { else if (m_state->m_unk0x08 != 0) {
break; break;
} }
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_unk66;
ret = 1; result = 1;
break; break;
case IsleScript::c_Helicopter_TakeOff_Ctl: { case IsleScript::c_Helicopter_TakeOff_Ctl: {
if (*g_act3Script == script) { if (*g_act3Script == script) {
break; break;
} }
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* state = (Act1State*) GameState()->GetState("Act1State");
if (m_state->GetUnkown8() == 0) { if (m_state->m_unk0x08 == 0) {
state->SetUnknown18(4); state->m_unk0x018 = 4;
m_state->SetUnknown8(1); m_state->m_unk0x08 = 1;
m_world->RemoveActor(this); m_world->RemoveActor(this);
InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterTakeOff_Anim, NULL); InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterTakeOff_Anim, NULL);
SetState(0); SetState(0);
} }
ret = 1;
result = 1;
break; break;
} }
case IsleScript::c_Helicopter_Land_Ctl: case IsleScript::c_Helicopter_Land_Ctl:
if (*g_act3Script == script) { if (*g_act3Script == script) {
break; break;
} }
if (m_state->GetUnkown8() == 2) {
m_state->SetUnknown8(3); if (m_state->m_unk0x08 == 2) {
m_state->m_unk0x08 = 3;
m_world->RemoveActor(this); m_world->RemoveActor(this);
InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterLand_Anim, NULL); InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterLand_Anim, NULL);
SetState(LegoPathActor::c_bit3); SetState(LegoPathActor::c_bit3);
} }
ret = 1;
result = 1;
break; break;
case Act3Script::c_Helicopter_Pizza_Ctl: case Act3Script::c_Helicopter_Pizza_Ctl:
if (*g_act3Script != script) { if (*g_act3Script != script) {
break; break;
} }
ret = 1;
/* fall through */ isPizza = TRUE;
case Act3Script::c_Helicopter_Donut_Ctl: case Act3Script::c_Helicopter_Donut_Ctl:
if (*g_act3Script != script) { if (*g_act3Script != script) {
break; break;
} }
assert(m_pathController);
if (m_world && m_world->GetCamera()) { if (m_world && m_world->GetCamera()) {
Mx3DPointFloat loc, dir, lookat; Mx3DPointFloat location, direction, lookat;
loc = m_world->GetCamera()->GetWorldLocation();
dir = m_world->GetCamera()->GetWorldDirection(); location = m_world->GetCamera()->GetWorldLocation();
lookat = dir; direction = m_world->GetCamera()->GetWorldDirection();
float scale = 3;
lookat *= scale; lookat = direction;
lookat += loc; lookat *= 3.0f;
Mx3DPointFloat v68, v7c, v90(0, 1, 0), va4; location += lookat;
Mx3DPointFloat v68, va4, up;
Mx3DPointFloat v90(0, 1, 0);
v68 = m_world->GetCamera()->GetWorldUp(); v68 = m_world->GetCamera()->GetWorldUp();
va4.EqualsCross(&v68, &dir); va4.EqualsCross(&v68, &direction);
v7c.EqualsCross(&va4, &v90); up.EqualsCross(&va4, &v90);
if (ret) {
if (((Act3*) m_world)->LaunchPizza(m_controller, loc, dir, v7c)) { if (isPizza) {
if (((Act3*) m_world)->LaunchPizza(m_pathController, location, direction, up) != SUCCESS) {
MxTrace("Shoot pizza failed\n");
break; break;
} }
else if (((Act3*) m_world)->LaunchDonut(m_controller, loc, dir, v7c)) { }
else {
if (((Act3*) m_world)->LaunchDonut(m_pathController, location, direction, up) != SUCCESS) {
MxTrace("Shoot donut failed\n");
break; break;
} }
} }
} }
ret = 1;
result = 1;
break; break;
/* case Act3Script::c_Helicopter_Info_Ctl: */ /* case Act3Script::c_Helicopter_Info_Ctl: */
case IsleScript::c_Helicopter_Info_Ctl: case IsleScript::c_Helicopter_Info_Ctl:
@ -250,14 +271,21 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
Exit(); Exit();
} }
ret = 1; else if (*g_act3Script == script) {
((Act3*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
}
result = 1;
break; break;
// Unknown object ID
case 0x1d: case 0x1d:
ret = 1; result = 1;
break; break;
} }
} }
return ret;
return result;
} }
// FUNCTION: LEGO1 0x10003c20 // FUNCTION: LEGO1 0x10003c20

View File

@ -48,7 +48,7 @@ LegoPathActor::LegoPathActor()
m_userNavFlag = FALSE; m_userNavFlag = FALSE;
m_state = 0; m_state = 0;
m_grec = NULL; m_grec = NULL;
m_controller = NULL; m_pathController = NULL;
m_collideBox = FALSE; m_collideBox = FALSE;
m_unk0x148 = 0; m_unk0x148 = 0;
m_unk0x14c = 0; m_unk0x14c = 0;
@ -608,7 +608,7 @@ MxResult LegoPathActor::VTable0x9c()
local20 = 0; local20 = 0;
Mx3DPointFloat vec; Mx3DPointFloat vec;
switch (m_controller->FUN_1004a240(*m_grec, local34, local48, m_unk0xe4, m_destEdge, m_boundary)) { switch (m_pathController->FUN_1004a240(*m_grec, local34, local48, m_unk0xe4, m_destEdge, m_boundary)) {
case 0: case 0:
case 1: case 1:
break; break;