mirror of https://github.com/AxioDL/metaforce.git
238 lines
6.3 KiB
C++
238 lines
6.3 KiB
C++
#include "CActor.hpp"
|
|
#include "CActorParameters.hpp"
|
|
#include "CStateManager.hpp"
|
|
#include "Collision/CMaterialList.hpp"
|
|
#include "Audio/CSfxManager.hpp"
|
|
|
|
namespace urde
|
|
{
|
|
static CMaterialList MakeActorMaterialList(const CMaterialList& materialList, const CActorParameters& params)
|
|
{
|
|
CMaterialList ret = materialList;
|
|
if (params.GetVisorParameters().x0_28_b3)
|
|
ret.Add(EMaterialTypes::Fourteen);
|
|
if (params.GetVisorParameters().x0_29_b4)
|
|
ret.Add(EMaterialTypes::Fifteen);
|
|
return ret;
|
|
}
|
|
|
|
CActor::CActor(TUniqueId uid, bool active, const std::string& name, const CEntityInfo& info,
|
|
const zeus::CTransform&, CModelData&& mData, const CMaterialList& list,
|
|
const CActorParameters& params, TUniqueId otherUid)
|
|
: CEntity(uid, info, active, name),
|
|
x68_material(MakeActorMaterialList(list, params)),
|
|
x70_(CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Nineteen}, {EMaterialTypes::Zero})),
|
|
xc6_(otherUid)
|
|
{
|
|
if (mData.x10_animData || mData.x1c_normalModel)
|
|
x64_modelData = std::make_unique<CModelData>(std::move(mData));
|
|
}
|
|
|
|
void CActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr)
|
|
{
|
|
switch(msg)
|
|
{
|
|
case EScriptObjectMessage::Activate:
|
|
{
|
|
if (!x30_24_active)
|
|
xbc_time = CGraphics::GetSecondsMod900();
|
|
}
|
|
break;
|
|
case EScriptObjectMessage::Decrement:
|
|
RemoveEmitter();
|
|
break;
|
|
case EScriptObjectMessage::InternalMessage11: // 33
|
|
{
|
|
/*
|
|
if (x94_simpleShadow)
|
|
AddMaterial(EMaterialTypes::ThirtyNine, mgr);
|
|
else
|
|
RemoveMaterial(EMaterialTypes::ThirtyNine, mgr);
|
|
*/
|
|
|
|
|
|
if (HasModelData() && x64_modelData->AnimationData())
|
|
{
|
|
TAreaId aid = GetAreaId();
|
|
//x64_modelData->AnimationData()->sub_8002AE6C(mgr, aid, x64_modelData->x0_particleScale);
|
|
}
|
|
}
|
|
break;
|
|
case EScriptObjectMessage::InternalMessage12: // 34
|
|
{
|
|
RemoveEmitter();
|
|
/* TODO: Not sure about this
|
|
if (HasModelData() && x64_modelData->AnimationData() && x64_modelData->x28_)
|
|
x64_modelData->AnimationData().GetParticleDB().GetActiveParticleLightIds(mgr);
|
|
*/
|
|
}
|
|
break;
|
|
case EScriptObjectMessage::InternalMessage13: // 35
|
|
{
|
|
for (const SConnection& conn : x20_conns)
|
|
{
|
|
if (conn.x0_state != EScriptObjectState::DFST)
|
|
continue;
|
|
|
|
const CActor* act = dynamic_cast<const CActor*>(mgr.GetObjectById(mgr.GetIdForScript(conn.x8_objId)));
|
|
if (act && xc6_ == kInvalidUniqueId)
|
|
xc6_ = act->GetUniqueId();
|
|
}
|
|
}
|
|
break;
|
|
case EScriptObjectMessage::InternalMessage15: // 37
|
|
SetInFluid(true, uid);
|
|
break;
|
|
case EScriptObjectMessage::InternalMessage17: // 39
|
|
SetInFluid(false, kInvalidUniqueId);
|
|
break;
|
|
default:break;
|
|
}
|
|
CEntity::AcceptScriptMsg(msg, uid, mgr);
|
|
}
|
|
|
|
zeus::CVector3f CActor::GetOrbitPosition(const CStateManager&)
|
|
{
|
|
return x34_transform.origin;
|
|
}
|
|
|
|
void CActor::RemoveEmitter()
|
|
{
|
|
if (x8c_sfxHandle)
|
|
{
|
|
CSfxManager::RemoveEmitter(*x8c_sfxHandle.get());
|
|
x88_sfxId = -1;
|
|
x8c_sfxHandle.reset();
|
|
}
|
|
}
|
|
|
|
EWeaponCollisionResponseTypes CActor::GetCollisionResponseType(const zeus::CVector3f&,
|
|
const zeus::CVector3f&, CWeaponMode&, int)
|
|
{
|
|
return EWeaponCollisionResponseTypes::Unknown13;
|
|
}
|
|
|
|
void CActor::RemoveMaterial(EMaterialTypes t1, EMaterialTypes t2, EMaterialTypes t3, EMaterialTypes t4, CStateManager& mgr)
|
|
{
|
|
x68_material.Remove(t1);
|
|
RemoveMaterial(t2, t3, t4, mgr);
|
|
}
|
|
|
|
void CActor::RemoveMaterial(EMaterialTypes t1, EMaterialTypes t2, EMaterialTypes t3, CStateManager & mgr)
|
|
{
|
|
x68_material.Remove(t1);
|
|
RemoveMaterial(t2, t3, mgr);
|
|
}
|
|
|
|
void CActor::RemoveMaterial(EMaterialTypes t1, EMaterialTypes t2, CStateManager& mgr)
|
|
{
|
|
x68_material.Remove(t1);
|
|
}
|
|
|
|
void CActor::RemoveMaterial(EMaterialTypes t, CStateManager& mgr)
|
|
{
|
|
x68_material.Remove(t);
|
|
mgr.UpdateObjectInLists(*this);
|
|
}
|
|
|
|
void CActor::AddMaterial(EMaterialTypes t1, EMaterialTypes t2, EMaterialTypes t3, EMaterialTypes t4, EMaterialTypes t5, CStateManager& mgr)
|
|
{
|
|
x68_material.Add(t1);
|
|
AddMaterial(t2, t3, t4, t5, mgr);
|
|
}
|
|
|
|
void CActor::AddMaterial(EMaterialTypes t1, EMaterialTypes t2, EMaterialTypes t3, EMaterialTypes t4, CStateManager& mgr)
|
|
{
|
|
x68_material.Add(t1);
|
|
AddMaterial(t2, t3, t4, mgr);
|
|
}
|
|
|
|
void CActor::AddMaterial(EMaterialTypes t1, EMaterialTypes t2, EMaterialTypes t3, CStateManager& mgr)
|
|
{
|
|
x68_material.Add(t1);
|
|
AddMaterial(t2, t3, mgr);
|
|
}
|
|
|
|
void CActor::AddMaterial(EMaterialTypes t1, EMaterialTypes t2, CStateManager& mgr)
|
|
{
|
|
x68_material.Add(t1);
|
|
AddMaterial(t2, mgr);
|
|
}
|
|
|
|
void CActor::AddMaterial(EMaterialTypes type, CStateManager& mgr)
|
|
{
|
|
x68_material.Add(type);
|
|
mgr.UpdateObjectInLists(*this);
|
|
}
|
|
|
|
void CActor::SetCallTouch(bool callTouch)
|
|
{
|
|
xe5_28_callTouch = callTouch;
|
|
}
|
|
|
|
bool CActor::GetCallTouch() const
|
|
{
|
|
return xe5_28_callTouch;
|
|
}
|
|
|
|
void CActor::SetUseInSortedList(bool use)
|
|
{
|
|
xe5_27_useInSortedLists = use;
|
|
}
|
|
|
|
bool CActor::GetUseInSortedLists() const
|
|
{
|
|
return xe5_27_useInSortedLists;
|
|
}
|
|
|
|
void CActor::SetInFluid(bool in, TUniqueId uid)
|
|
{
|
|
if (in)
|
|
{
|
|
xe6_26_inFluid = false;
|
|
xc4_fluidId = uid;
|
|
}
|
|
else
|
|
{
|
|
if (!xe6_26_inFluid)
|
|
return;
|
|
|
|
xe6_26_inFluid = true;
|
|
if (xe6_26_inFluid == 0)
|
|
xc4_fluidId = kInvalidUniqueId;
|
|
}
|
|
}
|
|
|
|
bool CActor::HasModelData() const
|
|
{
|
|
return bool(x64_modelData);
|
|
}
|
|
|
|
const CSfxHandle* CActor::GetSfxHandle() const
|
|
{
|
|
return x8c_sfxHandle.get();
|
|
}
|
|
|
|
void CActor::SetSfxPitchBend(s32 val)
|
|
{
|
|
xe6_30_enablePitchBend = true;
|
|
xc0_ = val;
|
|
if (x8c_sfxHandle == 0)
|
|
return;
|
|
|
|
CSfxManager::PitchBend(*x8c_sfxHandle.get(), val);
|
|
}
|
|
|
|
void CActor::OnScanStateChanged(EScanState state, CStateManager& mgr)
|
|
{
|
|
if (state == EScanState::Zero)
|
|
SendScriptMsgs(EScriptObjectState::UNKS7, mgr, EScriptObjectMessage::None);
|
|
else if (state == EScanState::One)
|
|
SendScriptMsgs(EScriptObjectState::UNKS8, mgr, EScriptObjectMessage::None);
|
|
else if (state == EScanState::Two)
|
|
SendScriptMsgs(EScriptObjectState::ScanDone, mgr, EScriptObjectMessage::None);
|
|
|
|
}
|
|
|
|
}
|