diff --git a/LanternExtractor/EQ/Wld/DataTypes/ParticleMovement.cs b/LanternExtractor/EQ/Wld/DataTypes/ParticleMovement.cs new file mode 100644 index 0000000..13e3b6d --- /dev/null +++ b/LanternExtractor/EQ/Wld/DataTypes/ParticleMovement.cs @@ -0,0 +1,10 @@ +namespace LanternExtractor.EQ.Wld.DataTypes +{ + public enum ParticleMovement + { + Sphere = 1, + Plane = 2, + Stream = 3, + None = 4 + } +} diff --git a/LanternExtractor/EQ/Wld/Exporters/ParticleSystemWriter.cs b/LanternExtractor/EQ/Wld/Exporters/ParticleSystemWriter.cs index 75f30a9..67be92a 100644 --- a/LanternExtractor/EQ/Wld/Exporters/ParticleSystemWriter.cs +++ b/LanternExtractor/EQ/Wld/Exporters/ParticleSystemWriter.cs @@ -1,5 +1,6 @@ -using LanternExtractor.EQ.Wld.Fragments; -using LanternExtractor.EQ.Wld.Helpers; +using System.IO; +using System.Linq; +using LanternExtractor.EQ.Wld.Fragments; namespace LanternExtractor.EQ.Wld.Exporters { @@ -8,16 +9,61 @@ public class ParticleSystemWriter : TextAssetWriter public ParticleSystemWriter() { _export.AppendLine(LanternStrings.ExportHeaderTitle + "Particle System"); + _export.AppendLine(LanternStrings.ExportHeaderFormat + + "Sprite, SpriteAnimationDelayMs, Movement, Flags, SimultaneousParticles, SpawnRadius, SpawnAngle, SpawnLifespan, SpawnVelocity," + + "SpawnNormalX, SpawnNormalY, SpawnNormalZ, SpawnRate, SpawnScale, ColorR, ColorG, ColorB, ColorX"); } - + public override void AddFragmentData(WldFragment data) { - if (!(data is ParticleCloud)) + ParticleCloud particle = data as ParticleCloud; + + if (particle == null) { return; } - _export.AppendLine(FragmentNameCleaner.CleanName(data)); + _export.Append(GetSpriteString(particle.ParticleSprite.BitmapInfoReference.BitmapInfo)); + _export.Append(','); + _export.Append(particle.ParticleSprite.BitmapInfoReference.BitmapInfo.AnimationDelayMs); + _export.Append(','); + _export.Append(particle.ParticleMovement.ToString()); + _export.Append(','); + _export.Append(particle.Flags.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SimultaneousParticles.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnRadius.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnAngle.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnLifespan.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnVelocity.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnNormal.x.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnNormal.y.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnNormal.z.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnRate.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.SpawnScale.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.Color.R.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.Color.G.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.Color.B.ToString(_numberFormat)); + _export.Append(','); + _export.Append(particle.Color.A.ToString(_numberFormat)); + } + + private string GetSpriteString(BitmapInfo bitmapInfo) + { + var filenames = bitmapInfo.BitmapNames.Select(b => Path.ChangeExtension(b.Filename, null)); + return string.Join(':', filenames); } } -} \ No newline at end of file +} diff --git a/LanternExtractor/EQ/Wld/Fragments/ParticleCloud.cs b/LanternExtractor/EQ/Wld/Fragments/ParticleCloud.cs index fc98d53..576d826 100644 --- a/LanternExtractor/EQ/Wld/Fragments/ParticleCloud.cs +++ b/LanternExtractor/EQ/Wld/Fragments/ParticleCloud.cs @@ -1,16 +1,30 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using GlmSharp; +using LanternExtractor.EQ.Wld.DataTypes; using LanternExtractor.Infrastructure.Logger; namespace LanternExtractor.EQ.Wld.Fragments { /// /// ParticleCloud (0x34) - /// Internal name: None + /// Internal name: _PCD /// Defines a particle system. Can be referenced from a skeleton bone. /// public class ParticleCloud : WldFragment { - private ParticleSprite _particleSprite; + public ParticleMovement ParticleMovement { get; private set; } + public int Flags { get; private set; } + public int SimultaneousParticles { get; private set; } + public float SpawnRadius { get; private set; } + public float SpawnAngle { get; private set; } + public int SpawnLifespan { get; private set; } + public float SpawnVelocity { get; private set; } + public vec3 SpawnNormal { get; private set; } + public int SpawnRate { get; private set; } + public float SpawnScale { get; private set; } + public Color Color { get; private set; } + public ParticleSprite ParticleSprite; public override void Initialize(int index, int size, byte[] data, List fragments, Dictionary stringHash, @@ -18,33 +32,33 @@ public override void Initialize(int index, int size, byte[] data, List public class ParticleSprite : WldFragment { - private BitmapInfoReference _bitmapReference; - + public BitmapInfoReference BitmapInfoReference { get; private set; } + public override void Initialize(int index, int size, byte[] data, List fragments, Dictionary stringHash, bool isNewWldFormat, ILogger logger) { @@ -20,7 +20,7 @@ public override void Initialize(int index, int size, byte[] data, List