mirror of
https://github.com/isledecomp/isle.git
synced 2026-01-21 07:11:16 +00:00
Match Helicopter::HandleControl
This commit is contained in:
parent
e18eaedb2a
commit
bebd22359c
@ -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
|
||||||
|
|||||||
@ -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(),
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user