mirror of
https://github.com/isledecomp/isle-portable.git
synced 2024-12-19 04:12:26 -05:00
a2b2b5d734
* Implement/match Act3Ammo::FUN_10053b40 * Add Act3Ammo::Remove
198 lines
4.2 KiB
C++
198 lines
4.2 KiB
C++
#include "act3ammo.h"
|
|
|
|
#include "legocachesoundmanager.h"
|
|
#include "legocharactermanager.h"
|
|
#include "legopathboundary.h"
|
|
#include "legopathcontroller.h"
|
|
#include "legosoundmanager.h"
|
|
#include "misc.h"
|
|
#include "roi/legoroi.h"
|
|
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
|
|
DECOMP_SIZE_ASSERT(Act3Ammo, 0x1a0)
|
|
|
|
// FUNCTION: LEGO1 0x100537f0
|
|
// FUNCTION: BETA10 0x1001d648
|
|
Act3Ammo::Act3Ammo()
|
|
{
|
|
m_ammoFlag = 0;
|
|
m_a3 = NULL;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100538a0
|
|
// FUNCTION: BETA10 0x1001d6e7
|
|
Act3Ammo::~Act3Ammo()
|
|
{
|
|
Destroy(TRUE);
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10053900
|
|
// FUNCTION: BETA10 0x1001d759
|
|
void Act3Ammo::Destroy(MxBool p_fromDestructor)
|
|
{
|
|
if (!p_fromDestructor) {
|
|
assert(0);
|
|
}
|
|
else if (m_roi != NULL) {
|
|
CharacterManager()->ReleaseActor(m_roi->GetName());
|
|
m_roi = NULL;
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10053930
|
|
// FUNCTION: BETA10 0x1001d7d0
|
|
MxResult Act3Ammo::Remove()
|
|
{
|
|
assert(IsValid());
|
|
assert(m_roi && m_pathController);
|
|
|
|
CharacterManager()->ReleaseActor(m_roi->GetName());
|
|
m_roi = NULL;
|
|
|
|
if (m_boundary != NULL) {
|
|
m_boundary->RemoveActor(this);
|
|
}
|
|
|
|
m_pathController->RemoveActor(this);
|
|
m_ammoFlag = 0;
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10053980
|
|
// FUNCTION: BETA10 0x1001d8b3
|
|
MxResult Act3Ammo::Create(Act3* p_a3, MxU32 p_isPizza, MxS32 p_index)
|
|
{
|
|
assert(m_ammoFlag);
|
|
char name[12];
|
|
|
|
if (p_isPizza) {
|
|
sprintf(name, "pammo%d", p_index);
|
|
m_roi = CharacterManager()->CreateAutoROI(name, "pizpie", FALSE);
|
|
m_roi->SetVisibility(TRUE);
|
|
|
|
BoundingSphere sphere;
|
|
|
|
sphere.Center()[0] = sphere.Center()[1] = sphere.Center()[2] = 0.0f;
|
|
sphere.Radius() = m_roi->GetBoundingSphere().Radius() * 2.0f;
|
|
m_roi->SetBoundingSphere(sphere);
|
|
|
|
m_ammoFlag = c_pizza;
|
|
assert(m_roi);
|
|
}
|
|
else {
|
|
sprintf(name, "dammo%d", p_index);
|
|
m_roi = CharacterManager()->CreateAutoROI(name, "donut", FALSE);
|
|
m_roi->SetVisibility(TRUE);
|
|
|
|
BoundingSphere sphere;
|
|
|
|
sphere.Center()[0] = sphere.Center()[1] = sphere.Center()[2] = 0.0f;
|
|
sphere.Radius() = m_roi->GetBoundingSphere().Radius() * 5.0f;
|
|
m_roi->SetBoundingSphere(sphere);
|
|
|
|
m_ammoFlag = c_donut;
|
|
assert(m_roi);
|
|
}
|
|
|
|
m_a3 = p_a3;
|
|
SetValid(TRUE);
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10053b40
|
|
// FUNCTION: BETA10 0x1001db2a
|
|
MxResult Act3Ammo::FUN_10053b40(Vector3& p_srcLoc, Vector3& p_srcDir, Vector3& p_srcUp)
|
|
{
|
|
assert(p_srcDir[1] != 0);
|
|
|
|
MxFloat local1c = -(p_srcLoc[1] / p_srcDir[1]);
|
|
Mx3DPointFloat local18(p_srcDir);
|
|
Mx3DPointFloat local34;
|
|
|
|
local18 *= local1c;
|
|
local18 += p_srcLoc;
|
|
|
|
local34[0] = local34[2] = 0.0f;
|
|
local34[1] = -1.0f;
|
|
|
|
m_eq[1] = p_srcUp;
|
|
m_eq[2] = p_srcLoc;
|
|
|
|
Mx3DPointFloat local48(local34);
|
|
local48 -= m_eq[1];
|
|
|
|
for (MxS32 i = 0; i < 3; i++) {
|
|
if (local18[0] == p_srcLoc[0]) {
|
|
return FAILURE;
|
|
}
|
|
|
|
m_eq[0][i] = (local48[i] * local48[i] + local48[i] * m_eq[1][i] * 2.0f) / ((local18[i] - p_srcLoc[i]) * 4.0f);
|
|
}
|
|
|
|
assert(m_eq[0][0] > 0.000001 || m_eq[0][0] < -0.000001);
|
|
|
|
m_unk0x19c = local48[0] / (m_eq[0][0] * 2.0f);
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10053cb0
|
|
// FUNCTION: BETA10 0x1001ddf4
|
|
MxResult Act3Ammo::FUN_10053cb0(LegoPathController* p_p, LegoPathBoundary* p_boundary, MxFloat p_unk0x19c)
|
|
{
|
|
assert(p_p);
|
|
assert(IsValid());
|
|
|
|
if (IsPizza()) {
|
|
assert(SoundManager()->GetCacheSoundManager());
|
|
SoundManager()->GetCacheSoundManager()->Play("shootpz", NULL, FALSE);
|
|
}
|
|
else {
|
|
assert(SoundManager()->GetCacheSoundManager());
|
|
SoundManager()->GetCacheSoundManager()->Play("shootdn", NULL, FALSE);
|
|
}
|
|
|
|
m_pathController = p_p;
|
|
m_boundary = p_boundary;
|
|
m_BADuration = 10000.0f;
|
|
m_unk0x19c = p_unk0x19c;
|
|
m_unk0x7c = 0.0f;
|
|
m_lastTime = -1.0f;
|
|
m_state = 1;
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10053d30
|
|
// FUNCTION: BETA10 0x1001df73
|
|
MxResult Act3Ammo::FUN_10053d30(LegoPathController* p_p, MxFloat p_unk0x19c)
|
|
{
|
|
assert(p_p);
|
|
assert(IsValid());
|
|
|
|
SetBit4(TRUE);
|
|
|
|
if (IsPizza()) {
|
|
assert(SoundManager()->GetCacheSoundManager());
|
|
SoundManager()->GetCacheSoundManager()->Play("shootpz", NULL, FALSE);
|
|
}
|
|
else {
|
|
assert(SoundManager()->GetCacheSoundManager());
|
|
SoundManager()->GetCacheSoundManager()->Play("shootdn", NULL, FALSE);
|
|
}
|
|
|
|
m_pathController = p_p;
|
|
m_BADuration = 10000.0f;
|
|
m_unk0x19c = p_unk0x19c;
|
|
m_unk0x7c = 0.0f;
|
|
m_lastTime = -1.0f;
|
|
m_state = 1;
|
|
return SUCCESS;
|
|
}
|
|
|
|
// STUB: LEGO1 0x10054050
|
|
// STUB: BETA10 0x1001e362
|
|
void Act3Ammo::VTable0x70(float p_time)
|
|
{
|
|
// TODO
|
|
}
|