diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 3de87194..51be475a 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -135,7 +135,7 @@ class LegoPathActor : public LegoActor { // FUNCTION: BETA10 0x1001c860 MxU32 GetState() { return m_state; } - LegoPathController* GetController() { return m_controller; } + LegoPathController* GetController() { return m_pathController; } MxBool GetCollideBox() { return m_collideBox; } MxFloat GetLastTime() { return m_lastTime; } MxFloat GetActorTime() { return m_actorTime; } @@ -145,7 +145,7 @@ class LegoPathActor : public LegoActor { // FUNCTION: BETA10 0x10013430 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 SetActorTime(MxFloat p_actorTime) { m_actorTime = p_actorTime; } @@ -167,27 +167,27 @@ class LegoPathActor : public LegoActor { MxS32 p_und ); - MxFloat m_BADuration; // 0x78 - MxFloat m_unk0x7c; // 0x7c - MxFloat m_actorTime; // 0x80 - MxFloat m_lastTime; // 0x84 - LegoPathBoundary* m_boundary; // 0x88 - LegoUnknown m_unk0x8c; // 0x8c - MxU32 m_state; // 0xdc - LegoUnknown100db7f4* m_destEdge; // 0xe0 - MxFloat m_unk0xe4; // 0xe4 - MxBool m_collideBox; // 0xe8 - MxBool m_unk0xe9; // 0xe9 - MxBool m_userNavFlag; // 0xea - MxMatrix m_unk0xec; // 0xec - LegoPathEdgeContainer* m_grec; // 0x134 - LegoPathController* m_controller; // 0x138 - MxFloat m_maxLinearVel; // 0x13c - MxFloat m_unk0x140; // 0x140 - MxFloat m_unk0x144; // 0x144 - MxU8 m_unk0x148; // 0x148 - MxS32 m_unk0x14c; // 0x14c - MxFloat m_unk0x150; // 0x150 + MxFloat m_BADuration; // 0x78 + MxFloat m_unk0x7c; // 0x7c + MxFloat m_actorTime; // 0x80 + MxFloat m_lastTime; // 0x84 + LegoPathBoundary* m_boundary; // 0x88 + LegoUnknown m_unk0x8c; // 0x8c + MxU32 m_state; // 0xdc + LegoUnknown100db7f4* m_destEdge; // 0xe0 + MxFloat m_unk0xe4; // 0xe4 + MxBool m_collideBox; // 0xe8 + MxBool m_unk0xe9; // 0xe9 + MxBool m_userNavFlag; // 0xea + MxMatrix m_unk0xec; // 0xec + LegoPathEdgeContainer* m_grec; // 0x134 + LegoPathController* m_pathController; // 0x138 + MxFloat m_maxLinearVel; // 0x13c + MxFloat m_unk0x140; // 0x140 + MxFloat m_unk0x144; // 0x144 + MxU8 m_unk0x148; // 0x148 + MxS32 m_unk0x14c; // 0x14c + MxFloat m_unk0x150; // 0x150 }; // TEMPLATE: LEGO1 0x10018b70 diff --git a/LEGO1/lego/legoomni/src/actors/act2actor.cpp b/LEGO1/lego/legoomni/src/actors/act2actor.cpp index 1d29f18b..8f608af7 100644 --- a/LEGO1/lego/legoomni/src/actors/act2actor.cpp +++ b/LEGO1/lego/legoomni/src/actors/act2actor.cpp @@ -146,9 +146,9 @@ void Act2Actor::FUN_100192a0(undefined4 p_param) newPosition = g_unk0x100f0db8[p_param].m_position; 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_roi->GetWorldPosition(), m_roi->GetWorldDirection(), diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index e6385bf6..88c42f1b 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -13,6 +13,7 @@ #include "legoutils.h" #include "legoworld.h" #include "misc.h" +#include "mxdebug.h" #include "mxtransitionmanager.h" #include "scripts.h" @@ -152,9 +153,10 @@ MxLong Helicopter::HandleClick() } // FUNCTION: LEGO1 0x100035e0 +// FUNCTION: BETA10 0x1002a587 MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param) { - MxU32 ret = 0; + MxLong result = 0; MxAtomId script; switch (GameState()->GetCurrentAct()) { @@ -169,79 +171,98 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param) break; } - if (p_param.GetUnknown0x28() == 1) { - switch (p_param.GetClickedObjectId()) { + if (p_param.m_unk0x28 == 1) { + MxU32 isPizza = FALSE; + + switch (p_param.m_clickedObjectId) { case IsleScript::c_HelicopterArms_Ctl: if (*g_act3Script == script) { ((Act3*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); } - else if (m_state->GetUnkown8() != 0) { + else if (m_state->m_unk0x08 != 0) { break; } + Exit(); GameState()->m_currentArea = LegoGameState::e_unk66; - ret = 1; + result = 1; break; case IsleScript::c_Helicopter_TakeOff_Ctl: { if (*g_act3Script == script) { break; } + Act1State* state = (Act1State*) GameState()->GetState("Act1State"); - if (m_state->GetUnkown8() == 0) { - state->SetUnknown18(4); - m_state->SetUnknown8(1); + if (m_state->m_unk0x08 == 0) { + state->m_unk0x018 = 4; + m_state->m_unk0x08 = 1; m_world->RemoveActor(this); InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterTakeOff_Anim, NULL); SetState(0); } - ret = 1; + + result = 1; break; } case IsleScript::c_Helicopter_Land_Ctl: if (*g_act3Script == script) { 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); InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterLand_Anim, NULL); SetState(LegoPathActor::c_bit3); } - ret = 1; + + result = 1; break; case Act3Script::c_Helicopter_Pizza_Ctl: if (*g_act3Script != script) { break; } - ret = 1; - /* fall through */ + + isPizza = TRUE; case Act3Script::c_Helicopter_Donut_Ctl: if (*g_act3Script != script) { break; } + + assert(m_pathController); + if (m_world && m_world->GetCamera()) { - Mx3DPointFloat loc, dir, lookat; - loc = m_world->GetCamera()->GetWorldLocation(); - dir = m_world->GetCamera()->GetWorldDirection(); - lookat = dir; - float scale = 3; - lookat *= scale; - lookat += loc; - Mx3DPointFloat v68, v7c, v90(0, 1, 0), va4; + Mx3DPointFloat location, direction, lookat; + + location = m_world->GetCamera()->GetWorldLocation(); + direction = m_world->GetCamera()->GetWorldDirection(); + + lookat = direction; + lookat *= 3.0f; + location += lookat; + + Mx3DPointFloat v68, va4, up; + Mx3DPointFloat v90(0, 1, 0); v68 = m_world->GetCamera()->GetWorldUp(); - va4.EqualsCross(&v68, &dir); - v7c.EqualsCross(&va4, &v90); - if (ret) { - if (((Act3*) m_world)->LaunchPizza(m_controller, loc, dir, v7c)) { + va4.EqualsCross(&v68, &direction); + up.EqualsCross(&va4, &v90); + + if (isPizza) { + if (((Act3*) m_world)->LaunchPizza(m_pathController, location, direction, up) != SUCCESS) { + MxTrace("Shoot pizza failed\n"); 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; } } } - ret = 1; + + result = 1; break; /* case Act3Script::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); 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; + // Unknown object ID case 0x1d: - ret = 1; + result = 1; break; } } - return ret; + + return result; } // FUNCTION: LEGO1 0x10003c20 diff --git a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp index 1d5bb959..cd9e562f 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp @@ -48,7 +48,7 @@ LegoPathActor::LegoPathActor() m_userNavFlag = FALSE; m_state = 0; m_grec = NULL; - m_controller = NULL; + m_pathController = NULL; m_collideBox = FALSE; m_unk0x148 = 0; m_unk0x14c = 0; @@ -608,7 +608,7 @@ MxResult LegoPathActor::VTable0x9c() local20 = 0; 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 1: break;