#include "CParticleElectricDataFactory.hpp" #include "CElectricDescription.hpp" #include "CSimplePool.hpp" #include "CRandom16.hpp" namespace Retro { using CPF = CParticleDataFactory; CElectricDescription* CParticleElectricDataFactory::GetGeneratorDesc(CInputStream &in, CSimplePool *resPool) { return CreateElectricDescription(in, resPool); } CElectricDescription* CParticleElectricDataFactory::CreateElectricDescription(CInputStream &in, CSimplePool *resPool) { FourCC cid = CParticleDataFactory::GetClassID(in); if (cid == FOURCC('ELSM')) { CElectricDescription* ret = new CElectricDescription; CreateELSM(desc, in, resPool); LoadELSMTokens(ret); return ret; } return nullptr; } bool CParticleElectricDataFactory::CreateELSM(CElectricDescription *desc, CInputStream &in, CSimplePool *resPool) { CRandom16 rand; FourCC clsId = CPF::GetClassID(in); while (clsId != SBIG('_END')) { CGlobalRandom gr(rand); switch(clsId) { case SBIG(''): desc->x0_LIFE.reset(CPF::GetIntElement(in)); break; case SBIG('SLIF'): desc->x4_SLIF.reset(CPF::GetIntElement(in)); break; case SBIG('GRAT'): desc->x8_GRAT.reset(CPF::GetRealElement(in)); break; case SBIG('SCNT'): desc->xc_SCNT.reset(CPF::GetIntElement(in)); break; case SBIG('SSEG'): desc->x10_SSEG.reset(CPF::GetIntElement(in)); break; case SBIG('COLR'): desc->x14_COLR.reset(CPF::GetColorElement(in)); break; case SBIG('IEMT'): desc->x18_IEMT = CPF::GetBool(in); break; case SBIG('FEMT'): desc->x1c_FEMT = CPF::GetBool(in); break; case SBIG('AMPL'): desc->x20_AMPL = CPF::GetBool(in); break; case SBIG('AMPD'): desc->x24_AMPD = CPF::GetBool(in); break; case SBIG('LWD1'): desc->x28_LWD1 = CPF::GetBool(in); break; case SBIG('LWD2'): desc->x2c_LWD2 = CPF::GetBool(in); break; case SBIG('LWD3'): desc->x30_LWD3 = CPF::GetBool(in); break; case SBIG('LCL1'): desc->x34_LCL1.reset(CPF::GetColorElement(in)); break; case SBIG('LCL2'): desc->x38_LCL2.reset(CPF::GetColorElement(in)); break; case SBIG('LCL3'): desc->x3c_LCL3.reset(CPF::GetColorElement(in)); break; case SBIG('SSWH'): desc->x40_SSWH = CPF::GetSwooshGeneratorDesc(in, resPool); break; case SBIG('GPSM'): { std::vector tracker; tracker.reserve(8); desc->x50_GPSM = CPF::GetChildGeneratorDesc(in, resPool, tracker); break; } case SBIG('EPSM'): { std::vector tracker; tracker.reserve(8); desc->x60_EPSM = CPF::GetChildGeneratorDesc(in, resPool, tracker); break; } case SBIG('ZERY'): desc->x70_ZERY = CPF::GetBool(in); break; } } return false; } std::unique_ptr FParticleElecrticFactory(const Retro::SObjectTag &tag, Retro::CInputStream &in, const Retro::CVParamTransfer &vparms) { CSimplePool* sp = static_cast(static_cast*>(vparms.GetObj())->GetParam()); return TToken::GetIObjObjectFor(std::unique_ptr(CParticleElectricDataFactory::GetGeneratorDesc(in, sp))); } }