mirror of
https://github.com/isledecomp/isle.git
synced 2024-12-18 12:02:54 -05:00
Implement/match Act3Brickster::Animate
(#1237)
* Implement/match `Act3Brickster::Animate` * Improve loop
This commit is contained in:
parent
9c951c4974
commit
66e3c9a2e1
4 changed files with 196 additions and 10 deletions
|
@ -130,6 +130,7 @@ class Act3 : public LegoWorld {
|
||||||
void FUN_10073400();
|
void FUN_10073400();
|
||||||
void FUN_10073430();
|
void FUN_10073430();
|
||||||
void GoodEnding(const Matrix4& p_destination);
|
void GoodEnding(const Matrix4& p_destination);
|
||||||
|
void FUN_10073a60();
|
||||||
|
|
||||||
// BETA indicates that the following classes access certain members directly.
|
// BETA indicates that the following classes access certain members directly.
|
||||||
friend class Act3Ammo;
|
friend class Act3Ammo;
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
// File name verified by multiple assertions, e.g. BETA10 0x10018391
|
// File name verified by multiple assertions, e.g. BETA10 0x10018391
|
||||||
|
|
||||||
class Act3Ammo;
|
class Act3Ammo;
|
||||||
|
struct LegoBuildingInfo;
|
||||||
|
struct LegoPlantInfo;
|
||||||
class LegoWorld;
|
class LegoWorld;
|
||||||
|
|
||||||
// VTABLE: LEGO1 0x100d7668 LegoPathActor
|
// VTABLE: LEGO1 0x100d7668 LegoPathActor
|
||||||
|
@ -118,17 +120,19 @@ class Act3Brickster : public Act3Actor {
|
||||||
// Act3Brickster::`scalar deleting destructor'
|
// Act3Brickster::`scalar deleting destructor'
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
MxS32 FUN_10042300();
|
||||||
|
|
||||||
MxFloat m_unk0x20; // 0x20
|
MxFloat m_unk0x20; // 0x20
|
||||||
MxFloat m_unk0x24; // 0x24
|
MxFloat m_unk0x24; // 0x24
|
||||||
LegoWorld* m_world; // 0x28
|
LegoWorld* m_world; // 0x28
|
||||||
undefined4 m_unk0x2c; // 0x2c
|
LegoPlantInfo* m_pInfo; // 0x2c
|
||||||
undefined4 m_unk0x30; // 0x30
|
LegoBuildingInfo* m_bInfo; // 0x30
|
||||||
LegoAnimActorStruct* m_shootAnim; // 0x34
|
LegoAnimActorStruct* m_shootAnim; // 0x34
|
||||||
undefined4 m_unk0x38; // 0x38
|
undefined4 m_unk0x38; // 0x38
|
||||||
Mx3DPointFloat m_unk0x3c; // 0x3c
|
Mx3DPointFloat m_unk0x3c; // 0x3c
|
||||||
MxFloat m_unk0x50; // 0x50
|
MxFloat m_unk0x50; // 0x50
|
||||||
undefined4 m_unk0x54; // 0x54
|
MxFloat m_unk0x54; // 0x54
|
||||||
undefined m_unk0x58; // 0x58
|
MxU8 m_unk0x58; // 0x58
|
||||||
};
|
};
|
||||||
|
|
||||||
// VTABLE: LEGO1 0x100d7920 LegoPathActor
|
// VTABLE: LEGO1 0x100d7920 LegoPathActor
|
||||||
|
|
|
@ -4,9 +4,12 @@
|
||||||
#include "act3ammo.h"
|
#include "act3ammo.h"
|
||||||
#include "anim/legoanim.h"
|
#include "anim/legoanim.h"
|
||||||
#include "define.h"
|
#include "define.h"
|
||||||
|
#include "legobuildingmanager.h"
|
||||||
#include "legocachesoundmanager.h"
|
#include "legocachesoundmanager.h"
|
||||||
#include "legolocomotionanimpresenter.h"
|
#include "legolocomotionanimpresenter.h"
|
||||||
#include "legopathedgecontainer.h"
|
#include "legopathedgecontainer.h"
|
||||||
|
#include "legoplantmanager.h"
|
||||||
|
#include "legoplants.h"
|
||||||
#include "legosoundmanager.h"
|
#include "legosoundmanager.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "mxdebug.h"
|
#include "mxdebug.h"
|
||||||
|
@ -345,13 +348,13 @@ MxResult Act3Cop::VTable0x9c()
|
||||||
Act3Brickster::Act3Brickster()
|
Act3Brickster::Act3Brickster()
|
||||||
{
|
{
|
||||||
m_world = NULL;
|
m_world = NULL;
|
||||||
m_unk0x2c = 0;
|
m_pInfo = NULL;
|
||||||
m_unk0x30 = 0;
|
m_bInfo = NULL;
|
||||||
m_shootAnim = NULL;
|
m_shootAnim = NULL;
|
||||||
m_unk0x38 = 0;
|
m_unk0x38 = 0;
|
||||||
m_unk0x20 = 0.0f;
|
m_unk0x20 = 0.0f;
|
||||||
m_unk0x24 = 0.0f;
|
m_unk0x24 = 0.0f;
|
||||||
m_unk0x54 = 0;
|
m_unk0x54 = 0.0f;
|
||||||
|
|
||||||
SetActorState(c_disabled);
|
SetActorState(c_disabled);
|
||||||
m_unk0x58 = 0;
|
m_unk0x58 = 0;
|
||||||
|
@ -385,11 +388,174 @@ void Act3Brickster::ParseAction(char* p_extra)
|
||||||
assert(m_shootAnim);
|
assert(m_shootAnim);
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10041050
|
// FUNCTION: LEGO1 0x10041050
|
||||||
// STUB: BETA10 0x100197d7
|
// FUNCTION: BETA10 0x100197d7
|
||||||
void Act3Brickster::Animate(float p_time)
|
void Act3Brickster::Animate(float p_time)
|
||||||
{
|
{
|
||||||
// TODO
|
if (m_lastTime <= m_unk0x20 && m_unk0x20 <= p_time) {
|
||||||
|
SetWorldSpeed(5.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_unk0x38 != 3 && m_unk0x38 != 4) {
|
||||||
|
Act3Actor::Animate(p_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_unk0x54 < p_time) {
|
||||||
|
((Act3*) m_world)->FUN_10072ad0(5);
|
||||||
|
m_unk0x54 = p_time + 15000.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (m_unk0x38) {
|
||||||
|
case 1:
|
||||||
|
FUN_100417c0();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
m_unk0x58++;
|
||||||
|
m_unk0x20 = p_time + 2000.0f;
|
||||||
|
SetWorldSpeed(3.0f);
|
||||||
|
|
||||||
|
assert(SoundManager()->GetCacheSoundManager());
|
||||||
|
|
||||||
|
if (m_unk0x58 >= 8) {
|
||||||
|
((Act3*) m_world)->FUN_10072ad0(6);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SoundManager()->GetCacheSoundManager()->Play("eatpz", NULL, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
FUN_100417c0();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
assert(m_shootAnim && m_pInfo);
|
||||||
|
|
||||||
|
if (m_unk0x50 < p_time) {
|
||||||
|
while (m_pInfo->m_unk0x16) {
|
||||||
|
PlantManager()->FUN_10026c50(m_pInfo->m_entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(SoundManager()->GetCacheSoundManager());
|
||||||
|
SoundManager()->GetCacheSoundManager()->Play("thpt", NULL, FALSE);
|
||||||
|
m_unk0x58 = 0;
|
||||||
|
FUN_100417c0();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MxMatrix local70;
|
||||||
|
local70 = m_unk0xec;
|
||||||
|
|
||||||
|
Vector3 local14(local70[0]);
|
||||||
|
Vector3 local28(local70[1]);
|
||||||
|
Vector3 localc(local70[2]);
|
||||||
|
Vector3 local20(local70[3]);
|
||||||
|
|
||||||
|
localc = local20;
|
||||||
|
localc -= m_pInfo->m_position;
|
||||||
|
localc.Unitize();
|
||||||
|
local14.EqualsCross(&local28, &localc);
|
||||||
|
local14.Unitize();
|
||||||
|
local28.EqualsCross(&localc, &local14);
|
||||||
|
|
||||||
|
assert(!m_cameraFlag);
|
||||||
|
|
||||||
|
LegoTreeNode* root = m_shootAnim->GetAnimTreePtr()->GetRoot();
|
||||||
|
float time = p_time - (m_unk0x50 - m_shootAnim->GetDuration());
|
||||||
|
|
||||||
|
for (MxS32 i = 0; i < root->GetNumChildren(); i++) {
|
||||||
|
LegoROI::FUN_100a8e80(root->GetChild(i), local70, time, m_shootAnim->GetROIMap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_lastTime = p_time;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
assert(m_shootAnim && m_bInfo);
|
||||||
|
|
||||||
|
if (m_unk0x50 < p_time) {
|
||||||
|
((Act3*) m_world)->FUN_10073a60();
|
||||||
|
m_unk0x58 = 0;
|
||||||
|
assert(SoundManager()->GetCacheSoundManager());
|
||||||
|
SoundManager()->GetCacheSoundManager()->Play("thpt", NULL, FALSE);
|
||||||
|
|
||||||
|
while (m_bInfo->m_unk0x11 > 0 || m_bInfo->m_unk0x11 == -1) {
|
||||||
|
if (!BuildingManager()->FUN_10030110(m_bInfo)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FUN_100417c0();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MxMatrix locale4;
|
||||||
|
locale4 = m_unk0xec;
|
||||||
|
|
||||||
|
Vector3 local88(locale4[0]);
|
||||||
|
Vector3 local9c(locale4[1]);
|
||||||
|
Vector3 local80(locale4[2]);
|
||||||
|
Vector3 local94(locale4[3]);
|
||||||
|
|
||||||
|
local80 = local94;
|
||||||
|
assert(m_bInfo->m_entity && m_bInfo->m_entity->GetROI());
|
||||||
|
|
||||||
|
local80 -= m_unk0x3c;
|
||||||
|
local80.Unitize();
|
||||||
|
local88.EqualsCross(&local9c, &local80);
|
||||||
|
local88.Unitize();
|
||||||
|
local9c.EqualsCross(&local80, &local88);
|
||||||
|
|
||||||
|
assert(!m_cameraFlag);
|
||||||
|
|
||||||
|
LegoTreeNode* root = m_shootAnim->GetAnimTreePtr()->GetRoot();
|
||||||
|
float time = p_time - (m_unk0x50 - m_shootAnim->GetDuration());
|
||||||
|
|
||||||
|
for (MxS32 i = 0; i < root->GetNumChildren(); i++) {
|
||||||
|
LegoROI::FUN_100a8e80(root->GetChild(i), locale4, time, m_shootAnim->GetROIMap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_lastTime = p_time;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if (m_grec == NULL) {
|
||||||
|
assert(m_shootAnim && m_pInfo);
|
||||||
|
m_unk0x38 = 3;
|
||||||
|
m_unk0x50 = p_time + m_shootAnim->GetDuration();
|
||||||
|
assert(SoundManager()->GetCacheSoundManager());
|
||||||
|
SoundManager()->GetCacheSoundManager()->Play("xarrow", NULL, FALSE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
FUN_10042300();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if (m_grec == NULL) {
|
||||||
|
assert(m_shootAnim && m_bInfo);
|
||||||
|
m_unk0x38 = 4;
|
||||||
|
m_unk0x50 = p_time + m_shootAnim->GetDuration();
|
||||||
|
assert(SoundManager()->GetCacheSoundManager());
|
||||||
|
SoundManager()->GetCacheSoundManager()->Play("xarrow", NULL, FALSE);
|
||||||
|
BuildingManager()->ScheduleAnimation(m_bInfo->m_entity, 0, FALSE, TRUE);
|
||||||
|
m_unk0x3c = m_bInfo->m_entity->GetROI()->GetLocal2World()[3];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
FUN_10042300();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
default:
|
||||||
|
FUN_10042300();
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
m_unk0x24 = p_time + 10000.0f;
|
||||||
|
m_unk0x38 = 9;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
if (m_unk0x24 < p_time) {
|
||||||
|
FUN_100417c0();
|
||||||
|
}
|
||||||
|
else if (m_unk0x24 - 9000.0f < p_time) {
|
||||||
|
FUN_10042300();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100416b0
|
// FUNCTION: LEGO1 0x100416b0
|
||||||
|
@ -447,6 +613,14 @@ MxResult Act3Brickster::FUN_100417c0()
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// STUB: LEGO1 0x10042300
|
||||||
|
// STUB: BETA10 0x1001b017
|
||||||
|
MxS32 Act3Brickster::FUN_10042300()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10042990
|
// FUNCTION: LEGO1 0x10042990
|
||||||
// FUNCTION: BETA10 0x1001b6e2
|
// FUNCTION: BETA10 0x1001b6e2
|
||||||
void Act3Brickster::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
|
void Act3Brickster::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
|
||||||
|
|
|
@ -844,6 +844,13 @@ void Act3::DebugCopter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FUNCTION: LEGO1 0x10073a60
|
||||||
|
void Act3::FUN_10073a60()
|
||||||
|
{
|
||||||
|
m_unk0x421e--;
|
||||||
|
m_helicopterDots[m_unk0x421e]->Enable(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10073a90
|
// FUNCTION: LEGO1 0x10073a90
|
||||||
void Act3::Enable(MxBool p_enable)
|
void Act3::Enable(MxBool p_enable)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue