metaforce/Runtime/Weapon/CNewFlameThrower.cpp

109 lines
4.1 KiB
C++

#include "CNewFlameThrower.hpp"
#include "GameGlobalObjects.hpp"
#include "CSimplePool.hpp"
#include "CStateManager.hpp"
#include "World/CGameLight.hpp"
namespace urde
{
CNewFlameThrower::CNewFlameThrower(const TToken<CWeaponDescription>& desc, const std::string& name, EWeaponType wType,
const CAssetId resInfo[8], const zeus::CTransform& xf, EMaterialTypes matType,
const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, TUniqueId owner,
EProjectileAttrib attribs)
: CGameProjectile(false, desc, name, wType, xf, matType, dInfo, uid, aid, owner, kInvalidUniqueId, attribs, false,
zeus::CVector3f::skOne, {}, -1, false),
x304_mainFire(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[0]})),
x310_mainSmoke(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[1]})),
x31c_secondarySmoke(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[4]})),
x328_secondaryFire(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[5]})),
x334_secondarySparks(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[6]})),
x340_swooshCenter(g_SimplePool->GetObj(SObjectTag{FOURCC('SWHC'), resInfo[2]})),
x34c_swooshFire(g_SimplePool->GetObj(SObjectTag{FOURCC('SWHC'), resInfo[3]}))
{
x304_mainFire.GetObj();
x310_mainSmoke.GetObj();
x31c_secondarySmoke.GetObj();
x328_secondaryFire.GetObj();
x334_secondarySparks.GetObj();
x340_swooshCenter.GetObj();
x34c_swooshFire.GetObj();
x37c_24_renderAuxEffects = false;
x37c_25_firing = false;
x37c_26_ = false;
x37c_27_ = true;
x37c_28_ = false;
x380_.resize(3);
}
void CNewFlameThrower::DeleteLightObjects(CStateManager& mgr)
{
for (TUniqueId id : x3b8_lightIds)
mgr.FreeScriptObject(id);
x3b8_lightIds.clear();
}
void CNewFlameThrower::CreateLightObjects(CStateManager& mgr)
{
DeleteLightObjects(mgr);
for (int i=0 ; i<4 ; ++i)
{
TUniqueId uid = mgr.AllocateUniqueId();
CLight lObj = x358_mainFireGen->GetLight();
CGameLight* light = new CGameLight(uid, GetAreaId(), false, "FlamethrowerLight", zeus::CTransform::Identity(),
x8_uid, lObj, u32(reinterpret_cast<uintptr_t>(this) + (i & 0x1)), 0, 0.f);
mgr.AddObject(light);
x3b8_lightIds.push_back(uid);
}
}
void CNewFlameThrower::EnableFx(CStateManager& mgr)
{
DeleteProjectileLight(mgr);
x358_mainFireGen = std::make_unique<CElementGen>(x304_mainFire);
x35c_mainSmokeGen = std::make_unique<CElementGen>(x310_mainSmoke);
x360_secondarySmokeGen = std::make_unique<CElementGen>(x31c_secondarySmoke);
x364_secondaryFireGen = std::make_unique<CElementGen>(x328_secondaryFire);
x368_secondarySparksGen = std::make_unique<CElementGen>(x334_secondarySparks);
x36c_swooshCenterGen = std::make_unique<CParticleSwoosh>(x340_swooshCenter, 0);
x36c_swooshCenterGen->SetRenderGaps(true);
x370_swooshFireGen = std::make_unique<CParticleSwoosh>(x34c_swooshFire, 0);
x370_swooshFireGen->SetRenderGaps(true);
if (x358_mainFireGen && x358_mainFireGen->SystemHasLight() && x3b8_lightIds.empty())
CreateLightObjects(mgr);
}
void CNewFlameThrower::StartFiring(const zeus::CTransform& xf, CStateManager& mgr)
{
SetActive(true);
x37c_25_firing = true;
x37c_24_renderAuxEffects = true;
x374_ = 1;
EnableFx(mgr);
}
bool CNewFlameThrower::AreEffectsFinished() const
{
if (x358_mainFireGen && x358_mainFireGen->GetParticleCount() != 0)
return false;
if (x35c_mainSmokeGen && x35c_mainSmokeGen->GetParticleCount() != 0)
return false;
if (x360_secondarySmokeGen && x360_secondarySmokeGen->GetParticleCount() != 0)
return false;
if (x364_secondaryFireGen && x364_secondaryFireGen->GetParticleCount() != 0)
return false;
return !(x368_secondarySparksGen && x368_secondarySparksGen->GetParticleCount() != 0);
}
void CNewFlameThrower::UpdateFx(const zeus::CTransform& xf, float dt, CStateManager& mgr)
{
}
void CNewFlameThrower::Reset(CStateManager& mgr, bool deactivate)
{
}
}