feat(04-00): minimal chain_spark particle assets for codec spike

- Author chain_spark.particlesystem (Spawners[1] -> SpawnerId=chain_spark)
- Author chain_spark.particlespawner (required co-asset, Sphere/BlendAdd, embedded Particle with Animation[0,100])
- Bundle 4x4 placeholder chain_spark.png in Particles/ to satisfy CommonAssetValidator.TEXTURE_PARTICLES
- ShadowJar packages all three at exact case-sensitive path Server/Particles/

Deviation from plan: research assumed only one .particlesystem file needed. Decompiled codec
shows ParticleSpawner is a SEPARATE asset (.particlespawner) referenced by SpawnerId, plus
Particle.Texture is validated against CommonAssetRegistry (must exist as Particles/<name>.png).
Both required for the spike to validate end-to-end. Documented in SPIKE-FINDINGS.
This commit is contained in:
2026-04-27 13:01:40 +02:00
parent 6f8efa94c5
commit a4427d91a7
3 changed files with 42 additions and 0 deletions
@@ -0,0 +1,32 @@
{
"Shape": "Sphere",
"ParticleRotationInfluence": "Billboard",
"RenderMode": "BlendAdd",
"TotalParticles": { "Min": 1, "Max": 1 },
"LifeSpan": 0.5,
"MaxConcurrentParticles": 16,
"ParticleLifeSpan": { "Min": 0.3, "Max": 0.5 },
"SpawnRate": { "Min": 50.0, "Max": 50.0 },
"Particle": {
"Texture": "Particles/chain_spark.png",
"FrameSize": { "Width": 4, "Height": 4 },
"SoftParticles": "Enable",
"SoftParticlesFadeFactor": 1.0,
"UVOption": "None",
"ScaleRatioConstraint": "OneToOne",
"Animation": {
"0": {
"FrameIndex": { "Min": 0, "Max": 0 },
"Scale": { "X": { "Min": 0.3, "Max": 0.3 }, "Y": { "Min": 0.3, "Max": 0.3 } },
"Color": "#B0DCFF",
"Opacity": 1.0
},
"100": {
"FrameIndex": { "Min": 0, "Max": 0 },
"Scale": { "X": { "Min": 0.0, "Max": 0.0 }, "Y": { "Min": 0.0, "Max": 0.0 } },
"Color": "#B0DCFF",
"Opacity": 0.0
}
}
}
}
@@ -0,0 +1,10 @@
{
"LifeSpan": 0.5,
"CullDistance": 64.0,
"BoundingRadius": 1.0,
"Spawners": [
{
"SpawnerId": "chain_spark"
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B