mirror of
https://github.com/isledecomp/isle.git
synced 2024-11-28 18:46:03 -05:00
Implement/match LegoAnimationManager::FUN_10064380 (#928)
* Implement/match LegoAnimationManager::FUN_10064380 * Fix naming * Revert
This commit is contained in:
parent
ed782980ec
commit
710f07e632
4 changed files with 317 additions and 10 deletions
|
@ -36,7 +36,7 @@ class LegoAnimationManager : public MxCore {
|
||||||
MxS32 m_unk0x10; // 0x10
|
MxS32 m_unk0x10; // 0x10
|
||||||
MxBool m_active; // 0x14
|
MxBool m_active; // 0x14
|
||||||
MxU8 m_unk0x15; // 0x15
|
MxU8 m_unk0x15; // 0x15
|
||||||
MxU8 m_unk0x16; // 0x16
|
MxS8 m_unk0x16; // 0x16
|
||||||
};
|
};
|
||||||
|
|
||||||
// SIZE 0x08
|
// SIZE 0x08
|
||||||
|
@ -53,7 +53,7 @@ class LegoAnimationManager : public MxCore {
|
||||||
MxLong m_unk0x08; // 0x08
|
MxLong m_unk0x08; // 0x08
|
||||||
MxBool m_unk0x0c; // 0x0c
|
MxBool m_unk0x0c; // 0x0c
|
||||||
MxBool m_unk0x0d; // 0x0d
|
MxBool m_unk0x0d; // 0x0d
|
||||||
float m_unk0x10; // 0x10
|
float m_speed; // 0x10
|
||||||
MxBool m_unk0x14; // 0x14
|
MxBool m_unk0x14; // 0x14
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -150,6 +150,19 @@ class LegoAnimationManager : public MxCore {
|
||||||
void FUN_10063d10();
|
void FUN_10063d10();
|
||||||
MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world);
|
MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world);
|
||||||
MxBool FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool, MxBool);
|
MxBool FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool, MxBool);
|
||||||
|
MxResult FUN_10064380(
|
||||||
|
const char* p_name,
|
||||||
|
const char* p_boundaryName,
|
||||||
|
MxS32 p_src,
|
||||||
|
float p_srcScale,
|
||||||
|
MxS32 p_dest,
|
||||||
|
float p_destScale,
|
||||||
|
MxU32 p_undIdx1,
|
||||||
|
MxS32 p_unk0x0c,
|
||||||
|
MxU32 p_undIdx2,
|
||||||
|
MxS32 p_unk0x10,
|
||||||
|
float p_speed
|
||||||
|
);
|
||||||
void FUN_100648f0(LegoTranInfo*, MxLong);
|
void FUN_100648f0(LegoTranInfo*, MxLong);
|
||||||
void FUN_10064b50(MxLong p_time);
|
void FUN_10064b50(MxLong p_time);
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,8 @@ class LegoExtraActor : public virtual LegoAnimActor {
|
||||||
MxResult WaitForAnimation() override; // vtable+0x9c
|
MxResult WaitForAnimation() override; // vtable+0x9c
|
||||||
void VTable0xa4(MxU8& p_und1, MxS32& p_und2) override; // vtable+0xa4
|
void VTable0xa4(MxU8& p_und1, MxS32& p_und2) override; // vtable+0xa4
|
||||||
void VTable0xc4() override; // vtable+0xc4
|
void VTable0xc4() override; // vtable+0xc4
|
||||||
virtual MxResult VTable0xc8(); // vtable+0xc8
|
|
||||||
|
virtual MxResult FUN_1002aae0();
|
||||||
|
|
||||||
void Restart();
|
void Restart();
|
||||||
inline void FUN_1002ad8a();
|
inline void FUN_1002ad8a();
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "legoendanimnotificationparam.h"
|
#include "legoendanimnotificationparam.h"
|
||||||
#include "legoextraactor.h"
|
#include "legoextraactor.h"
|
||||||
#include "legogamestate.h"
|
#include "legogamestate.h"
|
||||||
|
#include "legolocomotionanimpresenter.h"
|
||||||
#include "legomain.h"
|
#include "legomain.h"
|
||||||
#include "legonavcontroller.h"
|
#include "legonavcontroller.h"
|
||||||
#include "legoroilist.h"
|
#include "legoroilist.h"
|
||||||
|
@ -49,6 +50,197 @@ LegoAnimationManager::Vehicle g_vehicles[] = {
|
||||||
{"board", 0, FALSE}
|
{"board", 0, FALSE}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// GLOBAL: LEGO1 0x100f6d58
|
||||||
|
const char* g_unk0x100f6d58[11][17] = {
|
||||||
|
{"CNs001xx",
|
||||||
|
"CNs002xx",
|
||||||
|
"CNs003xx",
|
||||||
|
"CNs004xx",
|
||||||
|
"CNs005xx",
|
||||||
|
"CNs007xx",
|
||||||
|
"CNs006xx",
|
||||||
|
"CNs008xx",
|
||||||
|
"CNs009xx",
|
||||||
|
"CNs010xx",
|
||||||
|
"CNs011xx",
|
||||||
|
"CNs012xx",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL},
|
||||||
|
{"CNs001Pe",
|
||||||
|
"CNs002Pe",
|
||||||
|
"CNs003Pe",
|
||||||
|
"CNs004Pe",
|
||||||
|
"CNs005Pe",
|
||||||
|
"CNs007Pe",
|
||||||
|
"CNs006Pe",
|
||||||
|
"CNs008Pe",
|
||||||
|
"CNs009Pe",
|
||||||
|
"CNs010Pe",
|
||||||
|
"CNs001sk",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL},
|
||||||
|
{"CNs001Ma",
|
||||||
|
"CNs002Ma",
|
||||||
|
"CNs003Ma",
|
||||||
|
"CNs004Ma",
|
||||||
|
"CNs005Ma",
|
||||||
|
"CNs007Ma",
|
||||||
|
"CNs006Ma",
|
||||||
|
"CNs008Ma",
|
||||||
|
"CNs009Ma",
|
||||||
|
"CNs010Ma",
|
||||||
|
"CNs0x4Ma",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"CNs011Ma",
|
||||||
|
"CNs012Ma",
|
||||||
|
"CNs013Ma",
|
||||||
|
NULL},
|
||||||
|
{"CNs001Pa",
|
||||||
|
"CNs002Pa",
|
||||||
|
"CNs003Pa",
|
||||||
|
"CNs004Pa",
|
||||||
|
"CNs005Pa",
|
||||||
|
"CNs007Pa",
|
||||||
|
"CNs006Pa",
|
||||||
|
"CNs008Pa",
|
||||||
|
"CNs009Pa",
|
||||||
|
"CNs010Pa",
|
||||||
|
"CNs0x4Pa",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"CNs011Pa",
|
||||||
|
"CNs012Pa",
|
||||||
|
"CNs013Pa",
|
||||||
|
NULL},
|
||||||
|
{"CNs001Ni",
|
||||||
|
"CNs002Ni",
|
||||||
|
"CNs003Ni",
|
||||||
|
"CNs004Ni",
|
||||||
|
"CNs005Ni",
|
||||||
|
"CNs007Ni",
|
||||||
|
"CNs006Ni",
|
||||||
|
"CNs008Ni",
|
||||||
|
"CNs009Ni",
|
||||||
|
"CNs010Ni",
|
||||||
|
"CNs011Ni",
|
||||||
|
"CNsx11Ni",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL},
|
||||||
|
{"CNs001La",
|
||||||
|
"CNs002La",
|
||||||
|
"CNs003La",
|
||||||
|
"CNs004La",
|
||||||
|
"CNs005La",
|
||||||
|
"CNs007La",
|
||||||
|
"CNs006La",
|
||||||
|
"CNs008La",
|
||||||
|
"CNs009La",
|
||||||
|
"CNs010La",
|
||||||
|
"CNs011La",
|
||||||
|
"CNsx11La",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL},
|
||||||
|
{"CNs001Br",
|
||||||
|
"CNs002Br",
|
||||||
|
"CNs003Br",
|
||||||
|
"CNs004Br",
|
||||||
|
"CNs005Br",
|
||||||
|
"CNs007Br",
|
||||||
|
"CNs006Br",
|
||||||
|
"CNs008Br",
|
||||||
|
"CNs009Br",
|
||||||
|
"CNs010Br",
|
||||||
|
"CNs011Br",
|
||||||
|
"CNs900Br",
|
||||||
|
"CNs901Br",
|
||||||
|
"CNs011Br",
|
||||||
|
"CNs012Br",
|
||||||
|
"CNs013Br",
|
||||||
|
"CNs014Br"},
|
||||||
|
{"CNs001xx",
|
||||||
|
"CNs002xx",
|
||||||
|
"CNs003xx",
|
||||||
|
"CNs004xx",
|
||||||
|
"CNs005xx",
|
||||||
|
"CNs007xx",
|
||||||
|
"CNs006xx",
|
||||||
|
"CNs008xx",
|
||||||
|
"CNs009xx",
|
||||||
|
"CNs010xx",
|
||||||
|
"CNs001Bd",
|
||||||
|
"CNs012xx",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL},
|
||||||
|
{"CNs001xx",
|
||||||
|
"CNs002xx",
|
||||||
|
"CNs003xx",
|
||||||
|
"CNs004xx",
|
||||||
|
"CNs005xx",
|
||||||
|
"CNs007xx",
|
||||||
|
"CNs006xx",
|
||||||
|
"CNs008xx",
|
||||||
|
"CNs009xx",
|
||||||
|
"CNs010xx",
|
||||||
|
"CNs001Pg",
|
||||||
|
"CNs012xx",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL},
|
||||||
|
{"CNs001xx",
|
||||||
|
"CNs002xx",
|
||||||
|
"CNs003xx",
|
||||||
|
"CNs004xx",
|
||||||
|
"CNs005xx",
|
||||||
|
"CNs007xx",
|
||||||
|
"CNs006xx",
|
||||||
|
"CNs008xx",
|
||||||
|
"CNs009xx",
|
||||||
|
"CNs010xx",
|
||||||
|
"CNs001Rd",
|
||||||
|
"CNs012xx",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL},
|
||||||
|
{"CNs001xx",
|
||||||
|
"CNs002xx",
|
||||||
|
"CNs003xx",
|
||||||
|
"CNs004xx",
|
||||||
|
"CNs005xx",
|
||||||
|
"CNs007xx",
|
||||||
|
"CNs006xx",
|
||||||
|
"CNs008xx",
|
||||||
|
"CNs009xx",
|
||||||
|
"CNs010xx",
|
||||||
|
"CNs001Sy",
|
||||||
|
"CNs012xx",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL}
|
||||||
|
};
|
||||||
|
|
||||||
// GLOBAL: LEGO1 0x100f7048
|
// GLOBAL: LEGO1 0x100f7048
|
||||||
LegoAnimationManager::Character g_characters[47] = {
|
LegoAnimationManager::Character g_characters[47] = {
|
||||||
{"pepper", FALSE, 6, 0, FALSE, FALSE, TRUE, 1500, 20000, FALSE, 50, 1},
|
{"pepper", FALSE, 6, 0, FALSE, FALSE, TRUE, 1500, 20000, FALSE, 50, 1},
|
||||||
|
@ -263,7 +455,7 @@ void LegoAnimationManager::Suspend()
|
||||||
|
|
||||||
m_extras[i].m_roi = NULL;
|
m_extras[i].m_roi = NULL;
|
||||||
m_extras[i].m_characterId = -1;
|
m_extras[i].m_characterId = -1;
|
||||||
m_extras[i].m_unk0x10 = -1.0f;
|
m_extras[i].m_speed = -1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_unk0x18 = 0;
|
m_unk0x18 = 0;
|
||||||
|
@ -316,7 +508,7 @@ void LegoAnimationManager::Init()
|
||||||
for (i = 0; i < (MxS32) sizeOfArray(m_extras); i++) {
|
for (i = 0; i < (MxS32) sizeOfArray(m_extras); i++) {
|
||||||
m_extras[i].m_roi = NULL;
|
m_extras[i].m_roi = NULL;
|
||||||
m_extras[i].m_characterId = -1;
|
m_extras[i].m_characterId = -1;
|
||||||
m_extras[i].m_unk0x10 = -1.0f;
|
m_extras[i].m_speed = -1.0f;
|
||||||
m_extras[i].m_unk0x14 = FALSE;
|
m_extras[i].m_unk0x14 = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1743,7 +1935,7 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und)
|
||||||
m_extras[i].m_characterId = m_lastExtraCharacterId;
|
m_extras[i].m_characterId = m_lastExtraCharacterId;
|
||||||
g_characters[m_lastExtraCharacterId].m_unk0x04 = TRUE;
|
g_characters[m_lastExtraCharacterId].m_unk0x04 = TRUE;
|
||||||
m_extras[i].m_unk0x08 = Timer()->GetTime();
|
m_extras[i].m_unk0x08 = Timer()->GetTime();
|
||||||
m_extras[i].m_unk0x10 = -1;
|
m_extras[i].m_speed = -1;
|
||||||
m_extras[i].m_unk0x0d = FALSE;
|
m_extras[i].m_unk0x0d = FALSE;
|
||||||
m_unk0x414++;
|
m_unk0x414++;
|
||||||
return;
|
return;
|
||||||
|
@ -1842,7 +2034,7 @@ void LegoAnimationManager::FUN_10063d10()
|
||||||
|
|
||||||
LegoExtraActor* actor = CharacterManager()->GetActor(roi->GetName());
|
LegoExtraActor* actor = CharacterManager()->GetActor(roi->GetName());
|
||||||
if (actor != NULL) {
|
if (actor != NULL) {
|
||||||
float speed = m_extras[i].m_unk0x10;
|
float speed = m_extras[i].m_speed;
|
||||||
|
|
||||||
if (speed < 0.0f) {
|
if (speed < 0.0f) {
|
||||||
if (m_extras[i].m_unk0x14) {
|
if (m_extras[i].m_unk0x14) {
|
||||||
|
@ -1883,6 +2075,108 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FUNCTION: LEGO1 0x10064380
|
||||||
|
// FUNCTION: BETA10 0x1004583a
|
||||||
|
MxResult LegoAnimationManager::FUN_10064380(
|
||||||
|
const char* p_name,
|
||||||
|
const char* p_boundaryName,
|
||||||
|
MxS32 p_src,
|
||||||
|
float p_srcScale,
|
||||||
|
MxS32 p_dest,
|
||||||
|
float p_destScale,
|
||||||
|
MxU32 p_undIdx1,
|
||||||
|
MxS32 p_unk0x0c,
|
||||||
|
MxU32 p_undIdx2,
|
||||||
|
MxS32 p_unk0x10,
|
||||||
|
float p_speed
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LegoWorld* world = CurrentWorld();
|
||||||
|
MxS32 extraIndex = -1;
|
||||||
|
LegoExtraActor* actor = NULL;
|
||||||
|
MxS32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < (MxS32) sizeOfArray(m_extras); i++) {
|
||||||
|
LegoROI* roi = m_extras[i].m_roi;
|
||||||
|
|
||||||
|
if (roi == NULL && extraIndex == -1) {
|
||||||
|
extraIndex = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (roi != NULL && !strcmpi(roi->GetName(), p_name)) {
|
||||||
|
actor = CharacterManager()->GetActor(p_name);
|
||||||
|
|
||||||
|
if (actor != NULL && actor->GetController() != NULL) {
|
||||||
|
actor->GetController()->RemoveActor(actor);
|
||||||
|
actor->SetController(NULL);
|
||||||
|
actor->ClearMaps();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actor == NULL && extraIndex != -1) {
|
||||||
|
i = extraIndex;
|
||||||
|
|
||||||
|
MxS32 characterId;
|
||||||
|
for (characterId = 0; characterId < (MxS32) sizeOfArray(g_characters); characterId++) {
|
||||||
|
if (!strcmpi(g_characters[characterId].m_name, p_name)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (characterId > sizeOfArray(g_characters)) {
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_extras[extraIndex].m_roi = CharacterManager()->GetROI(p_name, TRUE);
|
||||||
|
m_extras[extraIndex].m_characterId = characterId;
|
||||||
|
m_extras[extraIndex].m_speed = p_speed;
|
||||||
|
|
||||||
|
actor = CharacterManager()->GetActor(p_name);
|
||||||
|
m_unk0x414++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actor != NULL) {
|
||||||
|
MxU8 unk0x0c = rand() % 2 != 0 ? 1 : 2;
|
||||||
|
actor->SetUnknown0x0c(unk0x0c);
|
||||||
|
actor->SetWorldSpeed(0.0f);
|
||||||
|
|
||||||
|
if (world->PlaceActor(actor, p_boundaryName, p_src, p_srcScale, p_dest, p_destScale) != SUCCESS) {
|
||||||
|
CharacterManager()->FUN_10083db0(m_extras[i].m_roi);
|
||||||
|
m_extras[i].m_roi = NULL;
|
||||||
|
m_unk0x414--;
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
MxS32 characterId = m_extras[i].m_characterId;
|
||||||
|
const char** unk0x100f6d58 = g_unk0x100f6d58[g_characters[characterId].m_unk0x16];
|
||||||
|
|
||||||
|
LegoLocomotionAnimPresenter* presenter =
|
||||||
|
(LegoLocomotionAnimPresenter*) world->Find("LegoAnimPresenter", unk0x100f6d58[p_undIdx1]);
|
||||||
|
if (presenter != NULL) {
|
||||||
|
presenter->FUN_1006d680(actor, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
presenter = (LegoLocomotionAnimPresenter*) world->Find("LegoAnimPresenter", unk0x100f6d58[p_undIdx2]);
|
||||||
|
if (presenter != NULL) {
|
||||||
|
presenter->FUN_1006d680(actor, 4.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_extras[i].m_unk0x08 = Timer()->GetTime();
|
||||||
|
m_extras[i].m_unk0x0c = TRUE;
|
||||||
|
m_extras[i].m_speed = p_speed;
|
||||||
|
|
||||||
|
g_characters[characterId].m_unk0x0c = p_unk0x0c;
|
||||||
|
g_characters[characterId].m_unk0x10 = p_unk0x10;
|
||||||
|
g_characters[characterId].m_unk0x04 = TRUE;
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10064670
|
// STUB: LEGO1 0x10064670
|
||||||
void LegoAnimationManager::FUN_10064670(Vector3*)
|
void LegoAnimationManager::FUN_10064670(Vector3*)
|
||||||
{
|
{
|
||||||
|
@ -1892,7 +2186,6 @@ void LegoAnimationManager::FUN_10064670(Vector3*)
|
||||||
// STUB: LEGO1 0x10064740
|
// STUB: LEGO1 0x10064740
|
||||||
void LegoAnimationManager::FUN_10064740(Vector3*)
|
void LegoAnimationManager::FUN_10064740(Vector3*)
|
||||||
{
|
{
|
||||||
// TODO
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x100648f0
|
// STUB: LEGO1 0x100648f0
|
||||||
|
|
|
@ -128,7 +128,7 @@ void LegoExtraActor::VTable0xa4(MxU8& p_und1, MxS32& p_und2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x1002aae0
|
// FUNCTION: LEGO1 0x1002aae0
|
||||||
MxResult LegoExtraActor::VTable0xc8()
|
MxResult LegoExtraActor::FUN_1002aae0()
|
||||||
{
|
{
|
||||||
LegoPathBoundary* oldEdge = m_boundary;
|
LegoPathBoundary* oldEdge = m_boundary;
|
||||||
Vector3 rightRef(m_unk0xec[0]);
|
Vector3 rightRef(m_unk0xec[0]);
|
||||||
|
@ -203,7 +203,7 @@ MxResult LegoExtraActor::VTable0x94(LegoPathActor* p_actor, MxBool p_bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
m_unk0x15 = 100;
|
m_unk0x15 = 100;
|
||||||
VTable0xc8();
|
FUN_1002aae0();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
MxU32 b = FALSE;
|
MxU32 b = FALSE;
|
||||||
|
|
Loading…
Reference in a new issue