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