mirror of
				https://github.com/AxioDL/metaforce.git
				synced 2025-10-27 15:30:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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, std::string_view 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)
 | |
| {
 | |
| 
 | |
| }
 | |
| 
 | |
| }
 |